From 47d3c50863006fa7145cdc254b24683bc2b63d2c Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 2 Apr 2022 14:13:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=97=E8=A1=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/lang/en-us.json | 3 + src/lang/zh-cn.json | 3 + src/lang/zh-tw.json | 3 + src/renderer/core/share/list.js | 5 + src/renderer/core/useApp/index.js | 3 + src/renderer/core/useApp/useDataInit.js | 3 +- src/renderer/core/useApp/useListAutoUpdate.js | 26 +++ src/renderer/store/modules/list.js | 3 +- .../utils/compositions/useSyncSourceList.js | 34 +++ src/renderer/utils/data.js | 37 +++ .../views/list/components/ListUpdateModal.vue | 221 ++++++++++++++++++ .../views/list/components/MyLists.vue | 84 +++---- 13 files changed, 384 insertions(+), 42 deletions(-) create mode 100644 src/renderer/core/useApp/useListAutoUpdate.js create mode 100644 src/renderer/utils/compositions/useSyncSourceList.js create mode 100644 src/renderer/views/list/components/ListUpdateModal.vue diff --git a/publish/changeLog.md b/publish/changeLog.md index ac2286c3..3578b3fc 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -6,6 +6,7 @@ - 新增歌词偏移设置,可以在播放详情页歌词右键菜单中使用 - 新增设置-播放设置-播放错误时自动切换歌曲设置,默认开启(原来的行为),若你不想在遇到音频加载失败、url获取失败等错误时自动切歌可以关闭此设置 - 新增设置-桌面歌词设置-自动刷新歌词置顶(当歌词置顶后仍被某些程序遮挡时可尝试启用此设置) +- 新增列表更新管理,可以在鼠标移入“我的列表”标题时出现的按钮中进入,这可以用来设置启动软件时需要自动从原平台更新的列表 ### 优化 diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 4a44cca0..267a1bfd 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -105,6 +105,9 @@ "list_sort_modal_by_type": "Sort categories", "list_sort_modal_by_up": "Ascending", "list_sort_modal_tip_confirm": "Are you sure you want to do this?", + "list_update_modal__auto_update": "auto update", + "list_update_modal__title": "List update management", + "list_update_modal__update": "Sync", "lists__duplicate": "Duplicate song", "lists__export": "Export", "lists__export_part_desc": "Choose where to save the list file", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 26fe4b7b..7744419a 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -105,6 +105,9 @@ "list_sort_modal_by_type": "排序类别", "list_sort_modal_by_up": "升序", "list_sort_modal_tip_confirm": "你确定要这么做吗?", + "list_update_modal__auto_update": "自动更新", + "list_update_modal__title": "列表更新管理", + "list_update_modal__update": "立即更新", "lists__duplicate": "重复歌曲", "lists__export": "导出", "lists__export_part_desc": "选择列表文件保存位置", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 68a459de..af2ea56c 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -105,6 +105,9 @@ "list_sort_modal_by_type": "排序類別", "list_sort_modal_by_up": "升序", "list_sort_modal_tip_confirm": "你確定要這麼做嗎?", + "list_update_modal__auto_update": "自動更新", + "list_update_modal__title": "列表更新管理", + "list_update_modal__update": "立即更新", "lists__duplicate": "重複歌曲", "lists__export": "導出", "lists__export_part_desc": "選擇列表文件保存位置", diff --git a/src/renderer/core/share/list.js b/src/renderer/core/share/list.js index 07f4d983..a44f75bd 100644 --- a/src/renderer/core/share/list.js +++ b/src/renderer/core/share/list.js @@ -121,3 +121,8 @@ export const removeUserList = id => { export const getList = id => { return allList[id] ?? [] } + +export const fetchingListStatus = reactive({}) +export const setFetchingListStatus = (id, status) => { + fetchingListStatus[id] = status +} diff --git a/src/renderer/core/useApp/index.js b/src/renderer/core/useApp/index.js index 89eb5f69..01f055e3 100644 --- a/src/renderer/core/useApp/index.js +++ b/src/renderer/core/useApp/index.js @@ -11,6 +11,7 @@ import useHandleEnvParams from './useHandleEnvParams' import useEventListener from './useEventListener' import useDeepLink from './useDeepLink' import usePlayer from './usePlayer' +import useListAutoUpdate from './useListAutoUpdate' export default () => { @@ -46,6 +47,7 @@ export default () => { setting, }) const initDeepLink = useDeepLink() + const handleListAutoUpdate = useListAutoUpdate() getEnvParams().then(envParams => { @@ -63,6 +65,7 @@ export default () => { initPlayer() handleEnvParams(envParams) // 处理传入的启动参数 initDeepLink(envParams) + handleListAutoUpdate() }) }) } diff --git a/src/renderer/core/useApp/useDataInit.js b/src/renderer/core/useApp/useDataInit.js index 5f3d8d2b..67a0e524 100644 --- a/src/renderer/core/useApp/useDataInit.js +++ b/src/renderer/core/useApp/useDataInit.js @@ -1,7 +1,7 @@ import { useCommit, useRefGetter } from '@renderer/utils/vueTools' import { getPlayList } from '@renderer/utils' import { getPlayInfo, getSearchHistoryList } from '@renderer/utils/tools' -import { initListPosition, initListPrevSelectId } from '@renderer/utils/data' +import { initListPosition, initListPrevSelectId, initListUpdateInfo } from '@renderer/utils/data' import music from '@renderer/utils/music' import { log } from '@common/utils' import { @@ -152,6 +152,7 @@ export default ({ await Promise.all([ initListPosition(), // 列表位置记录 initListPrevSelectId(), // 上次选中的列表记录 + initListUpdateInfo(), // 列表更新设置 initUserApi(), // 自定义API ]).catch(err => log.error(err)) music.init() // 初始化音乐sdk diff --git a/src/renderer/core/useApp/useListAutoUpdate.js b/src/renderer/core/useApp/useListAutoUpdate.js new file mode 100644 index 00000000..3c7ae263 --- /dev/null +++ b/src/renderer/core/useApp/useListAutoUpdate.js @@ -0,0 +1,26 @@ +import { getListUpdateInfo } from '@renderer/utils/data' +import useSyncSourceList from '@renderer/utils/compositions/useSyncSourceList' +import { userLists } from '@renderer/core/share/list' + +export default () => { + const syncSourceList = useSyncSourceList() + + + const handleSyncSourceList = async(waitUpdateLists) => { + if (!waitUpdateLists.length) return + const targetListInfo = waitUpdateLists.shift() + // console.log(targetListInfo) + await syncSourceList(targetListInfo) + handleSyncSourceList(waitUpdateLists) + } + + return () => { + const waitUpdateLists = Object.entries(getListUpdateInfo()) + .filter(([id, info]) => info.isAutoUpdate) + .map(([id]) => userLists.find(l => l.id === id)) + .filter(_ => _) + for (let i = 2; i > 0; i--) { + handleSyncSourceList(waitUpdateLists) + } + } +} diff --git a/src/renderer/store/modules/list.js b/src/renderer/store/modules/list.js index c18fb63a..c5c5c340 100644 --- a/src/renderer/store/modules/list.js +++ b/src/renderer/store/modules/list.js @@ -1,7 +1,7 @@ import musicSdk from '../../utils/music' import { clearLyric, clearMusicUrl } from '../../utils' import { sync as eventSyncName, list as eventListNames } from '@renderer/event/names' -import { removeListPosition, setListPrevSelectId } from '@renderer/utils/data' +import { removeListPosition, setListPrevSelectId, removeListUpdateInfo } from '@renderer/utils/data' import { markRawList, toRaw, markRaw } from '@renderer/utils/vueTools' import { allList, allListInit, setInited, removeUserList, addUserList, updateList, defaultList, loveList, userLists } from '@renderer/core/share/list' @@ -337,6 +337,7 @@ const mutations = { if (index < 0) return removeUserList(id) removeListPosition(id) + removeListUpdateInfo(id) window.eventHub.emit(eventListNames.listChange, [id]) }, setUserListName(state, { id, name, isSync }) { diff --git a/src/renderer/utils/compositions/useSyncSourceList.js b/src/renderer/utils/compositions/useSyncSourceList.js new file mode 100644 index 00000000..32793a12 --- /dev/null +++ b/src/renderer/utils/compositions/useSyncSourceList.js @@ -0,0 +1,34 @@ +import { setListUpdateTime } from '@renderer/utils/data' +import { setFetchingListStatus } from '@renderer/core/share/list' +import { useAction, useCommit } from '@renderer/utils/vueTools' + +export default () => { + const getBoardListAll = useAction('leaderboard', 'getListAll') + const getListDetailAll = useAction('songList', 'getListDetailAll') + const setList = useCommit('list', 'setList') + + const fetchList = (id, source, sourceListId) => { + setFetchingListStatus(id, true) + + let promise + if (/board__/.test(sourceListId)) { + const id = sourceListId.replace(/board__/, '') + promise = getBoardListAll({ id, isRefresh: true }) + } else { + promise = getListDetailAll({ source, id: sourceListId, isRefresh: true }) + } + return promise.finally(() => { + setFetchingListStatus(id, false) + }) + } + + return async targetListInfo => { + const list = await fetchList(targetListInfo.id, targetListInfo.source, targetListInfo.sourceListId) + // console.log(targetListInfo.list.length, list.length) + setList({ + ...targetListInfo, + list, + }) + setListUpdateTime(targetListInfo.id, Date.now()) + } +} diff --git a/src/renderer/utils/data.js b/src/renderer/utils/data.js index 8637ca7a..ee3720ca 100644 --- a/src/renderer/utils/data.js +++ b/src/renderer/utils/data.js @@ -3,6 +3,7 @@ import { throttle } from './index' let listPosition = {} let listPrevSelectId +let listUpdateInfo = {} const saveListPosition = throttle(() => { rendererSend(NAMES.mainWindow.save_data, { @@ -43,3 +44,39 @@ export const setListPrevSelectId = id => { listPrevSelectId = id saveListPrevSelectId() } + +export const initListUpdateInfo = () => { + return rendererInvoke(NAMES.mainWindow.get_data, 'listUpdateInfo').then(data => { + if (!data) data = {} + // console.log(data) + listUpdateInfo = data + }) +} +const saveListUpdateInfo = throttle(() => { + rendererSend(NAMES.mainWindow.save_data, { + path: 'listUpdateInfo', + data: listUpdateInfo, + }) +}, 1000) + +export const getListUpdateInfo = () => listUpdateInfo +export const setListAutoUpdate = (id, enable) => { + const targetInfo = listUpdateInfo[id] ?? { updateTime: '', isAutoUpdate: false } + targetInfo.isAutoUpdate = enable + listUpdateInfo[id] = targetInfo + saveListUpdateInfo() +} +export const setListUpdateTime = (id, time) => { + const targetInfo = listUpdateInfo[id] ?? { updateTime: '', isAutoUpdate: false } + targetInfo.updateTime = time + listUpdateInfo[id] = targetInfo + saveListUpdateInfo() +} +// export const setListUpdateInfo = (id, { updateTime, isAutoUpdate }) => { +// listUpdateInfo[id] = { updateTime, isAutoUpdate } +// saveListUpdateInfo() +// } +export const removeListUpdateInfo = id => { + delete listUpdateInfo[id] + saveListUpdateInfo() +} diff --git a/src/renderer/views/list/components/ListUpdateModal.vue b/src/renderer/views/list/components/ListUpdateModal.vue new file mode 100644 index 00000000..c02d3710 --- /dev/null +++ b/src/renderer/views/list/components/ListUpdateModal.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/src/renderer/views/list/components/MyLists.vue b/src/renderer/views/list/components/MyLists.vue index c1bea281..36ec149f 100644 --- a/src/renderer/views/list/components/MyLists.vue +++ b/src/renderer/views/list/components/MyLists.vue @@ -2,11 +2,18 @@

{{$t('my_list')}}

- +
+ + +