From 1efd56f48b0db14b88191a50b7adf04c36ecb043 Mon Sep 17 00:00:00 2001 From: lyswhut <lyswhut@qq.com> Date: Mon, 6 Jul 2020 18:15:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BD=93=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8D=9F=E5=9D=8F=E6=97=B6=E5=AF=B9=E6=8D=9F?= =?UTF-8?q?=E5=9D=8F=E6=96=87=E4=BB=B6=E7=9A=84=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/common/ipcNames.js | 2 ++ src/common/utils.js | 25 ++++++++++++++++++--- src/main/rendererEvents/getDataPath.js | 5 +++++ src/main/rendererEvents/index.js | 2 ++ src/main/rendererEvents/showDialog.js | 12 ++++++++++ src/renderer/lang/en-us/store/state.json | 5 ++++- src/renderer/lang/zh-cn/store/state.json | 5 ++++- src/renderer/lang/zh-tw/store/state.json | 5 ++++- src/renderer/store/state.js | 28 ++++++++++++++++++++---- 10 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 src/main/rendererEvents/getDataPath.js create mode 100644 src/main/rendererEvents/showDialog.js diff --git a/publish/changeLog.md b/publish/changeLog.md index 0da9dc35..ab022682 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -17,6 +17,7 @@ - 新增托盘图标样式设置,可到设置-其他切换 - 新增开关下载功能控制,默认关闭,可到设置-下载设置开启 - 新增将歌词嵌入音频文件中,默认关闭,可到设置-下载设置开启 +- 新增当列表文件损坏时对损坏文件的备份,若出现该情况可打开`%HOMEPATH%\AppData\Roaming\lx-music-desktop`找到`playList.json.bak`尝试手动修复列表文件,列表文件以`JSON`格式存储 ### 优化 diff --git a/src/common/ipcNames.js b/src/common/ipcNames.js index 910c5baa..f461a435 100644 --- a/src/common/ipcNames.js +++ b/src/common/ipcNames.js @@ -41,6 +41,8 @@ const names = { quit: 'quit', min_toggle: 'min_toggle', hide_toggle: 'hide_toggle', + get_data_path: 'get_data_path', + show_dialog: 'show_dialog', }, winLyric: { close: 'close', diff --git a/src/common/utils.js b/src/common/utils.js index 1fc3ab6e..c7dafcf6 100644 --- a/src/common/utils.js +++ b/src/common/utils.js @@ -3,6 +3,9 @@ const Store = require('electron-store') const { defaultSetting, overwriteSetting } = require('./defaultSetting') const apiSource = require('../renderer/utils/music/api-source-info') const defaultHotKey = require('./defaultHotKey') +const { dialog, app } = require('electron') +const path = require('path') +const fs = require('fs') exports.isLinux = process.platform == 'linux' exports.isWin = process.platform == 'win32' @@ -125,9 +128,25 @@ exports.mergeSetting = (setting, version) => { * @param {*} setting */ exports.initSetting = () => { - const electronStore_list = new Store({ - name: 'playList', - }) + let electronStore_list + try { + electronStore_list = new Store({ + name: 'playList', + clearInvalidConfig: false, + }) + } catch (error) { + log.error(error) + const backPath = path.join(app.getPath('userData'), 'playList.json.bak') + fs.copyFileSync(path.join(app.getPath('userData'), 'playList.json'), backPath) + dialog.showMessageBoxSync({ + type: 'error', + message: 'Playlist data loading error', + detail: `We have helped you back up the old list file to ${backPath}\nYou can try to repair and restore it manually\n\nError detail: ${error.message}`, + }) + electronStore_list = new Store({ + name: 'playList', + }) + } const electronStore_config = new Store({ name: 'config', }) diff --git a/src/main/rendererEvents/getDataPath.js b/src/main/rendererEvents/getDataPath.js new file mode 100644 index 00000000..2348d642 --- /dev/null +++ b/src/main/rendererEvents/getDataPath.js @@ -0,0 +1,5 @@ +const { mainHandle, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc') +const { app } = require('electron') + +mainHandle(ipcMainWindowNames.get_data_path, async() => app.getPath('userData')) + diff --git a/src/main/rendererEvents/index.js b/src/main/rendererEvents/index.js index d61ebd07..93f71df8 100644 --- a/src/main/rendererEvents/index.js +++ b/src/main/rendererEvents/index.js @@ -14,6 +14,8 @@ require('./getEnvParams') require('./setAppSetting') require('./setLyricInfo') require('./hotKey') +require('./getDataPath') +require('./showDialog') require('./xm_verify') diff --git a/src/main/rendererEvents/showDialog.js b/src/main/rendererEvents/showDialog.js new file mode 100644 index 00000000..00ed66ea --- /dev/null +++ b/src/main/rendererEvents/showDialog.js @@ -0,0 +1,12 @@ +const { mainOn, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc') +const { dialog } = require('electron') + + +mainOn(ipcMainWindowNames.show_dialog, (event, { type, message, detail }) => { + if (!global.modules.mainWindow) throw new Error('mainWindow is undefined') + dialog.showMessageBoxSync(global.modules.mainWindow, { + type, + message, + detail, + }) +}) diff --git a/src/renderer/lang/en-us/store/state.json b/src/renderer/lang/en-us/store/state.json index 2a32fc26..77575e71 100644 --- a/src/renderer/lang/en-us/store/state.json +++ b/src/renderer/lang/en-us/store/state.json @@ -30,5 +30,8 @@ "source_alias_xm": "XM Music", "source_alias_bd": "BD Music", - "source_alias_all": "Aggregated" + "source_alias_all": "Aggregated", + + "load_list_file_error_title": "Error loading playlist data", + "load_list_file_error_detail": "We have helped you back up the old list file to {path}\nIt is stored in JSON format, you can try to repair and restore it manually\n\nError details: {detail}" } diff --git a/src/renderer/lang/zh-cn/store/state.json b/src/renderer/lang/zh-cn/store/state.json index fb7cff29..3bba8d17 100644 --- a/src/renderer/lang/zh-cn/store/state.json +++ b/src/renderer/lang/zh-cn/store/state.json @@ -31,5 +31,8 @@ "source_alias_xm": "小霞音乐", "source_alias_bd": "小杜音乐", - "source_alias_all": "聚合大会" + "source_alias_all": "聚合大会", + + "load_list_file_error_title": "播放列表数据加载错误", + "load_list_file_error_detail": "我们已经帮你把旧的列表文件备份到{path}\n它以 JSON 格式存储,你可以尝试手动修复并恢复它\n\n错误详情:{detail}" } diff --git a/src/renderer/lang/zh-tw/store/state.json b/src/renderer/lang/zh-tw/store/state.json index 12ae2f9a..4457519a 100644 --- a/src/renderer/lang/zh-tw/store/state.json +++ b/src/renderer/lang/zh-tw/store/state.json @@ -27,5 +27,8 @@ "source_alias_mg": "小蜜音樂", "source_alias_bd": "小杜音樂", "source_alias_xm": "小霞音樂", - "source_alias_all": "聚合大會" + "source_alias_all": "聚合大會", + + "load_list_file_error_title": "播放列表數據加載錯誤", + "load_list_file_error_detail": "我們已經幫你把舊的列表文件備份到{path}\n它以 JSON 格式存儲,你可以嘗試手動修復並恢復它\n\n錯誤詳情:{detail}" } diff --git a/src/renderer/store/state.js b/src/renderer/store/state.js index b02421d3..44e9a8e6 100644 --- a/src/renderer/store/state.js +++ b/src/renderer/store/state.js @@ -3,12 +3,11 @@ import Store from 'electron-store' import { windowSizeList } from '../../common/config' import { version } from '../../../package.json' -import { rendererSend, NAMES } from '../../common/ipc' +import { rendererSend, rendererInvoke, NAMES } from '../../common/ipc' import languageList from '@/lang/languages.json' +import path from 'path' + -window.electronStore_list = new Store({ - name: 'playList', -}) const electronStore_config = window.electronStore_config = new Store({ name: 'config', }) @@ -40,6 +39,27 @@ if (!window.i18n.availableLocales.includes(setting.langId)) { window.i18n.locale = setting.langId +try { + window.electronStore_list = new Store({ + name: 'playList', + clearInvalidConfig: false, + }) +} catch (error) { + rendererInvoke(NAMES.mainWindow.get_data_path).then(dataPath => { + rendererSend(NAMES.mainWindow.show_dialog, { + type: 'error', + message: window.i18n.t('store.state.load_list_file_error_title'), + detail: window.i18n.t('store.state.load_list_file_error_detail', { + path: path.join(dataPath, 'playList.json.bak'), + detail: error.message, + }), + }) + }) + window.electronStore_list = new Store({ + name: 'playList', + }) +} + export default { themes: [