新增同步功能对“不喜欢歌曲”列表的同步
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<material-modal :show="sync.isShowSyncMode" :bg-close="false" :close-btn="false" @close="handleClose(false)">
|
||||
<main :class="$style.main">
|
||||
<h2>{{ $t('sync__title', { name: sync.deviceName }) }}</h2>
|
||||
<main v-if="sync.type == 'list'" :class="$style.main">
|
||||
<h2>{{ $t('sync__list_title', { name: sync.deviceName }) }}</h2>
|
||||
<div class="scroll" :class="$style.content">
|
||||
<dl :class="$style.btnGroup">
|
||||
<dt :class="$style.label">{{ $t('sync__merge_label') }}</dt>
|
||||
@@ -31,15 +31,57 @@
|
||||
<dd>
|
||||
<section :class="$style.tipGroup">
|
||||
<h3 :class="$style.title">{{ $t('sync__merge_tip') }}</h3>
|
||||
<p :class="$style.tip">{{ $t('sync__merge_tip_desc') }}</p>
|
||||
<p :class="$style.tip">{{ $t('sync__list_merge_tip_desc') }}</p>
|
||||
</section>
|
||||
<section :class="$style.tipGroup">
|
||||
<h3 :class="$style.title">{{ $t('sync__overwrite_tip') }}</h3>
|
||||
<p :class="$style.tip">{{ $t('sync__overwrite_tip_desc') }}</p>
|
||||
<p :class="$style.tip">{{ $t('sync__list_overwrite_tip_desc') }}</p>
|
||||
</section>
|
||||
<section :class="$style.tipGroup">
|
||||
<h3 :class="$style.title">{{ $t('sync__other_tip') }}</h3>
|
||||
<p :class="$style.tip">{{ $t('sync__other_tip_desc') }}</p>
|
||||
<p :class="$style.tip">{{ $t('sync__list_other_tip_desc') }}</p>
|
||||
</section>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</main>
|
||||
<main v-else-if="sync.type == 'dislike'" :class="$style.main">
|
||||
<h2>{{ $t('sync__dislike_title', { name: sync.deviceName }) }}</h2>
|
||||
<div class="scroll" :class="$style.content">
|
||||
<dl :class="$style.btnGroup">
|
||||
<dt :class="$style.label">{{ $t('sync__merge_label') }}</dt>
|
||||
<dd :class="$style.btns">
|
||||
<base-btn :class="$style.btn" @click="handleSelectMode('merge_local_remote')">{{ $t('sync__merge_btn_local_remote') }}</base-btn>
|
||||
<base-btn :class="$style.btn" @click="handleSelectMode('merge_remote_local')">{{ $t('sync__merge_btn_remote_local') }}</base-btn>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl :class="$style.btnGroup">
|
||||
<dt :class="$style.label">{{ $t('sync__overwrite_label') }}</dt>
|
||||
<dd :class="$style.btns">
|
||||
<base-btn :class="$style.btn" @click="handleSelectMode('overwrite_local_remote')">{{ $t('sync__overwrite_btn_local_remote') }}</base-btn>
|
||||
<base-btn :class="$style.btn" @click="handleSelectMode('overwrite_remote_local')">{{ $t('sync__overwrite_btn_remote_local') }}</base-btn>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl :class="$style.btnGroup">
|
||||
<dt :class="$style.label">{{ $t('sync__other_label') }}</dt>
|
||||
<dd :class="$style.btns">
|
||||
<!-- <base-btn :class="$style.btn" @click="handleSelectMode('none')">{{ $t('sync__overwrite_btn_none') }}</base-btn> -->
|
||||
<base-btn :class="$style.btn" @click="handleSelectMode('cancel')">{{ $t('sync__overwrite_btn_cancel') }}</base-btn>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl :class="$style.btnGroup">
|
||||
<dd>
|
||||
<section :class="$style.tipGroup">
|
||||
<h3 :class="$style.title">{{ $t('sync__merge_tip') }}</h3>
|
||||
<p :class="$style.tip">{{ $t('sync__dislike_merge_tip_desc') }}</p>
|
||||
</section>
|
||||
<section :class="$style.tipGroup">
|
||||
<h3 :class="$style.title">{{ $t('sync__overwrite_tip') }}</h3>
|
||||
<p :class="$style.tip">{{ $t('sync__dislike_overwrite_tip_desc') }}</p>
|
||||
</section>
|
||||
<section :class="$style.tipGroup">
|
||||
<h3 :class="$style.title">{{ $t('sync__other_tip') }}</h3>
|
||||
<p :class="$style.tip">{{ $t('sync__dislike_other_tip_desc') }}</p>
|
||||
</section>
|
||||
</dd>
|
||||
</dl>
|
||||
@@ -60,8 +102,10 @@ export default {
|
||||
sync.isShowSyncMode = false
|
||||
}
|
||||
const handleSelectMode = (mode) => {
|
||||
if (mode.startsWith('overwrite') && isOverwrite.value) mode += '_full'
|
||||
void sendSyncAction({ action: 'select_mode', data: mode })
|
||||
if (sync.type == 'list') {
|
||||
if (mode.startsWith('overwrite') && isOverwrite.value) mode += '_full'
|
||||
}
|
||||
void sendSyncAction({ action: 'select_mode', data: { type: sync.type, mode } })
|
||||
handleClose()
|
||||
}
|
||||
return {
|
||||
|
||||
@@ -1,48 +1,51 @@
|
||||
// import { toRaw } from '@common/utils/vueTools'
|
||||
import { DISLIKE_EVENT_NAME } from '@common/ipcNames'
|
||||
import { rendererInvoke, rendererOff, rendererOn } from '@common/rendererIpc'
|
||||
import { action } from '@renderer/store/dislikeList'
|
||||
import {
|
||||
getDislikeListInfo,
|
||||
addDislikeInfo as addDislikeInfoRemote,
|
||||
overwirteDislikeInfo as overwirteDislikeInfoRemote,
|
||||
// updateDislikeInfo as updateDislikeInfoRemote,
|
||||
// removeDislikeInfo as removeDislikeInfoRemote,
|
||||
// clearDislikeInfo as clearDislikeInfoRemote,
|
||||
} from '@renderer/utils/ipc'
|
||||
|
||||
|
||||
export const initDislikeInfo = async() => {
|
||||
action.initDislikeInfo(await getDislikeListInfo())
|
||||
action.initDislikeInfo(await rendererInvoke<LX.Dislike.DislikeInfo>(DISLIKE_EVENT_NAME.get_dislike_music_infos))
|
||||
}
|
||||
|
||||
export const addDislikeInfo = async(infos: LX.Dislike.DislikeMusicInfo[]) => {
|
||||
await addDislikeInfoRemote(infos)
|
||||
return action.addDislikeInfo(infos)
|
||||
}
|
||||
|
||||
export const overwirteDislikeInfo = async(rules: string) => {
|
||||
await overwirteDislikeInfoRemote(rules)
|
||||
return action.overwirteDislikeInfo(rules)
|
||||
}
|
||||
|
||||
// export const updateDislikeInfo = async(info: LX.Dislike.ListItem) => {
|
||||
// await updateDislikeInfoRemote([toRaw(info)])
|
||||
// action.updateDislikeInfo(info)
|
||||
// }
|
||||
|
||||
// export const removeDislikeInfo = async(ids: string[]) => {
|
||||
// await removeDislikeInfoRemote(toRaw(ids))
|
||||
// action.removeDislikeInfo(ids)
|
||||
// }
|
||||
|
||||
|
||||
// export const clearDislikeInfo = async() => {
|
||||
// await clearDislikeInfoRemote()
|
||||
// action.clearDislikeInfo()
|
||||
// }
|
||||
|
||||
|
||||
export const hasDislike = (info: LX.Music.MusicInfo | LX.Download.ListItem | null) => {
|
||||
if (!info) return false
|
||||
return action.hasDislike(info)
|
||||
}
|
||||
|
||||
export const addDislikeInfo = async(infos: LX.Dislike.DislikeMusicInfo[]) => {
|
||||
await rendererInvoke<LX.Dislike.DislikeMusicInfo[]>(DISLIKE_EVENT_NAME.add_dislike_music_infos, infos)
|
||||
}
|
||||
|
||||
export const overwirteDislikeInfo = async(rules: string) => {
|
||||
await rendererInvoke<string>(DISLIKE_EVENT_NAME.overwrite_dislike_music_infos, rules)
|
||||
}
|
||||
|
||||
export const clearDislikeInfo = async() => {
|
||||
await rendererInvoke(DISLIKE_EVENT_NAME.clear_dislike_music_infos)
|
||||
}
|
||||
|
||||
|
||||
const noop = () => {}
|
||||
|
||||
export const registerRemoteDislikeAction = (onListChanged: (listIds: string[]) => void = noop) => {
|
||||
const add_dislike_music_infos = ({ params: datas }: LX.IpcRendererEventParams<LX.Dislike.DislikeMusicInfo[]>) => {
|
||||
action.addDislikeInfo(datas)
|
||||
}
|
||||
const overwrite_dislike_music_infos = ({ params: datas }: LX.IpcRendererEventParams<LX.Dislike.DislikeRules>) => {
|
||||
action.overwirteDislikeInfo(datas)
|
||||
}
|
||||
const clear_dislike_music_infos = () => {
|
||||
return action.clearDislikeInfo()
|
||||
}
|
||||
|
||||
rendererOn(DISLIKE_EVENT_NAME.add_dislike_music_infos, add_dislike_music_infos)
|
||||
rendererOn(DISLIKE_EVENT_NAME.overwrite_dislike_music_infos, overwrite_dislike_music_infos)
|
||||
rendererOn(DISLIKE_EVENT_NAME.clear_dislike_music_infos, clear_dislike_music_infos)
|
||||
|
||||
return () => {
|
||||
rendererOff(DISLIKE_EVENT_NAME.add_dislike_music_infos, add_dislike_music_infos)
|
||||
rendererOff(DISLIKE_EVENT_NAME.overwrite_dislike_music_infos, overwrite_dislike_music_infos)
|
||||
rendererOff(DISLIKE_EVENT_NAME.clear_dislike_music_infos, clear_dislike_music_infos)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import { play, playList } from '@renderer/core/player'
|
||||
import { onBeforeUnmount } from '@common/utils/vueTools'
|
||||
import { appSetting } from '@renderer/store/setting'
|
||||
import { playMusicInfo } from '@renderer/store/player/state'
|
||||
import { initDislikeInfo } from '@renderer/core/dislikeList'
|
||||
import { initDislikeInfo, registerRemoteDislikeAction } from '@renderer/core/dislikeList'
|
||||
|
||||
const initPrevPlayInfo = async() => {
|
||||
const info = await getPlayInfo()
|
||||
@@ -33,9 +33,11 @@ export default () => {
|
||||
const initUserApi = useInitUserApi()
|
||||
|
||||
let unregister: null | (() => void) = null
|
||||
let unregisterDislikeEvent: null | (() => void) = null
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
if (unregister) unregister()
|
||||
if (unregisterDislikeEvent) unregisterDislikeEvent()
|
||||
})
|
||||
|
||||
return async() => {
|
||||
@@ -49,6 +51,7 @@ export default () => {
|
||||
window.app_event.myListUpdate(ids)
|
||||
})
|
||||
window.lxData.userLists = await getUserLists() // 获取用户列表
|
||||
unregisterDislikeEvent = registerRemoteDislikeAction()
|
||||
await initDislikeInfo() // 获取不喜欢列表
|
||||
await initPrevPlayInfo().catch(err => {
|
||||
log.error(err)
|
||||
|
||||
@@ -9,7 +9,8 @@ export default () => {
|
||||
// console.log(event)
|
||||
switch (event.action) {
|
||||
case 'select_mode':
|
||||
sync.deviceName = event.data
|
||||
sync.deviceName = event.data.deviceName
|
||||
sync.type = event.data.type
|
||||
sync.isShowSyncMode = true
|
||||
break
|
||||
case 'close_select_mode':
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { markRaw } from '@common/utils/vueTools'
|
||||
|
||||
|
||||
import { dislikeInfo } from './state'
|
||||
import { dislikeInfo, dislikeRuleCount } from './state'
|
||||
import { SPLIT_CHAR } from '@common/constants'
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ export const initDislikeInfo = ({ musicNames, rules, names, singerNames }: LX.Di
|
||||
dislikeInfo.singerNames = markRaw(singerNames)
|
||||
dislikeInfo.musicNames = markRaw(musicNames)
|
||||
dislikeInfo.rules = rules
|
||||
dislikeRuleCount.value = dislikeInfo.musicNames.size + dislikeInfo.singerNames.size + dislikeInfo.names.size
|
||||
}
|
||||
|
||||
const initNameSet = () => {
|
||||
@@ -46,7 +47,8 @@ const initNameSet = () => {
|
||||
list.push(`${SPLIT_CHAR.DISLIKE_NAME}${singer}`)
|
||||
}
|
||||
}
|
||||
dislikeInfo.rules = Array.from(new Set(list)).join('\n') + '\n'
|
||||
dislikeInfo.rules = Array.from(new Set(list)).join('\n')
|
||||
dislikeRuleCount.value = dislikeInfo.musicNames.size + dislikeInfo.singerNames.size + dislikeInfo.names.size
|
||||
}
|
||||
|
||||
export const addDislikeInfo = (infos: LX.Dislike.DislikeMusicInfo[]) => {
|
||||
@@ -61,6 +63,12 @@ export const overwirteDislikeInfo = (rules: string) => {
|
||||
return dislikeInfo.rules
|
||||
}
|
||||
|
||||
export const clearDislikeInfo = () => {
|
||||
dislikeInfo.rules = ''
|
||||
initNameSet()
|
||||
return dislikeInfo.rules
|
||||
}
|
||||
|
||||
|
||||
// export const updateDislikeInfo = (info: LX.Dislike.ListItem) => {
|
||||
// const targetInfo = dislikeInfo.list.find(i => i.id == info.id)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { markRaw } from '@common/utils/vueTools'
|
||||
import { markRaw, ref } from '@common/utils/vueTools'
|
||||
|
||||
// import { deduplicationList } from '@common/utils/renderer'
|
||||
|
||||
@@ -9,3 +9,5 @@ export const dislikeInfo: LX.Dislike.DislikeInfo = markRaw({
|
||||
singerNames: markRaw(new Set()),
|
||||
rules: '',
|
||||
})
|
||||
|
||||
export const dislikeRuleCount = ref(0)
|
||||
|
||||
@@ -31,6 +31,7 @@ export const sync: {
|
||||
isShowSyncMode: boolean
|
||||
isShowAuthCodeModal: boolean
|
||||
deviceName: string
|
||||
type: keyof LX.Sync.ModeTypes
|
||||
server: {
|
||||
port: string
|
||||
status: {
|
||||
@@ -55,6 +56,7 @@ export const sync: {
|
||||
isShowSyncMode: false,
|
||||
isShowAuthCodeModal: false,
|
||||
deviceName: '',
|
||||
type: 'list',
|
||||
server: {
|
||||
port: '',
|
||||
status: {
|
||||
|
||||
@@ -40,15 +40,6 @@ export const getOtherSourceCount = async() => {
|
||||
return rendererInvoke<number>(WIN_MAIN_RENDERER_EVENT_NAME.get_other_source_count)
|
||||
}
|
||||
|
||||
export const getDislikeListInfo = async(): Promise<LX.Dislike.DislikeInfo> => {
|
||||
return rendererInvoke<LX.Dislike.DislikeInfo>(WIN_MAIN_RENDERER_EVENT_NAME.get_dislike_music_infos)
|
||||
}
|
||||
export const addDislikeInfo = async(dislikeInfo: LX.Dislike.DislikeMusicInfo[]) => {
|
||||
return rendererInvoke<LX.Dislike.DislikeMusicInfo[]>(WIN_MAIN_RENDERER_EVENT_NAME.add_dislike_music_infos, dislikeInfo)
|
||||
}
|
||||
export const overwirteDislikeInfo = async(dislikeInfo: string) => {
|
||||
return rendererInvoke<string>(WIN_MAIN_RENDERER_EVENT_NAME.overwrite_dislike_music_infos, dislikeInfo)
|
||||
}
|
||||
// export const updateDislikeInfo = async(dislikeInfo: LX.Dislike.ListItem[]) => {
|
||||
// await rendererInvoke<LX.Dislike.ListItem[]>(WIN_MAIN_RENDERER_EVENT_NAME.update_dislike_music_infos, dislikeInfo)
|
||||
// }
|
||||
|
||||
@@ -3,7 +3,7 @@ material-modal(:show="modelValue" teleport="#view" height="80%" width="80%" @clo
|
||||
main(:class="$style.main")
|
||||
h2 {{ $t('setting__dislike_list_title') }}
|
||||
div(:class="$style.content")
|
||||
textarea(v-model="rules" :class="$style.textarea")
|
||||
textarea(v-model="rules" :class="$style.textarea" :placeholder="$t('setting__dislike_list_input_tip')")
|
||||
div(:class="$style.footer")
|
||||
div(:class="$style.tips") {{ $t('setting__dislike_list_tips') }}
|
||||
base-btn(:class="$style.btn" @click="handleSave") {{ $t('setting__dislike_list_save_btn') }}
|
||||
@@ -21,21 +21,20 @@ export default {
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
emits: ['update:modelValue', 'onRuleUpdate'],
|
||||
emits: ['update:modelValue'],
|
||||
setup(props, { emit }) {
|
||||
const rules = ref('')
|
||||
|
||||
const handleSave = async() => {
|
||||
if (rules.value.trim() != dislikeInfo.rules.trim()) {
|
||||
await overwirteDislikeInfo(rules.value)
|
||||
emit('onRuleUpdate')
|
||||
}
|
||||
emit('update:modelValue', false)
|
||||
}
|
||||
|
||||
watch(() => props.modelValue, (visible) => {
|
||||
if (!visible) return
|
||||
rules.value = dislikeInfo.rules
|
||||
rules.value = dislikeInfo.rules.length ? dislikeInfo.rules + '\n' : dislikeInfo.rules
|
||||
})
|
||||
|
||||
return {
|
||||
@@ -84,6 +83,7 @@ export default {
|
||||
border: none;
|
||||
outline: none;
|
||||
border-radius: 4px;
|
||||
padding: 5px;
|
||||
background-color: var(--color-primary-light-200-alpha-900);
|
||||
box-sizing: border-box;
|
||||
font-family: inherit;
|
||||
|
||||
@@ -42,7 +42,7 @@ dd
|
||||
span.auto-hidden {{ dislikeRuleCount }}
|
||||
.p
|
||||
base-btn.btn(min @click="isShowDislikeList = true") {{ $t('setting__other_dislike_list_show_btn') }}
|
||||
DislikeListModal(v-model="isShowDislikeList" @on-rule-update="handleCountRules")
|
||||
DislikeListModal(v-model="isShowDislikeList")
|
||||
|
||||
dd
|
||||
h3#other_lyric_edited {{ $t('setting__other_lyric_edited_cache') }}
|
||||
@@ -75,7 +75,7 @@ import { dialog } from '@renderer/plugins/Dialog'
|
||||
import { useI18n } from '@renderer/plugins/i18n'
|
||||
import { appSetting, updateSetting } from '@renderer/store/setting'
|
||||
import { overwriteListFull } from '@renderer/store/list/listManage'
|
||||
import { dislikeInfo } from '@renderer/store/dislikeList'
|
||||
import { dislikeRuleCount } from '@renderer/store/dislikeList'
|
||||
import DislikeListModal from './DislikeListModal.vue'
|
||||
|
||||
export default {
|
||||
@@ -150,11 +150,7 @@ export default {
|
||||
}
|
||||
refreshMusicUrlCount()
|
||||
|
||||
const dislikeRuleCount = ref(dislikeInfo.musicNames.size + dislikeInfo.singerNames.size + dislikeInfo.names.size)
|
||||
const isShowDislikeList = ref(false)
|
||||
const handleCountRules = () => {
|
||||
dislikeRuleCount.value = dislikeInfo.musicNames.size + dislikeInfo.singerNames.size + dislikeInfo.names.size
|
||||
}
|
||||
|
||||
const lyricRawCount = ref(0)
|
||||
const isDisabledLyricRawCacheClear = ref(false)
|
||||
@@ -226,7 +222,6 @@ export default {
|
||||
|
||||
dislikeRuleCount,
|
||||
isShowDislikeList,
|
||||
handleCountRules,
|
||||
|
||||
lyricRawCount,
|
||||
isDisabledLyricRawCacheClear,
|
||||
|
||||
Reference in New Issue
Block a user