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: [