更新electron到 10.1.0

pull/389/head
lyswhut 2020-08-29 14:44:37 +08:00
parent b453a8934f
commit 86478c0268
21 changed files with 228 additions and 157 deletions

View File

@ -36,7 +36,7 @@
所用技术栈:
- Electron 9
- Electron 10
- Vue 2
已支持的平台:

53
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
"version": "1.0.1",
"version": "1.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -5301,9 +5301,9 @@
},
"dependencies": {
"caniuse-lite": {
"version": "1.0.30001112",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz",
"integrity": "sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q==",
"version": "1.0.30001119",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001119.tgz",
"integrity": "sha512-Hpwa4obv7EGP+TjkCh/wVvbtNJewxmtg4yVJBLFnxo35vbPapBr138bUWENkb5j5L9JZJ9RXLn4OrXRG/cecPQ==",
"dev": true
}
}
@ -5954,12 +5954,6 @@
}
}
},
"clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
"dev": true
},
"clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@ -7543,9 +7537,9 @@
}
},
"electron": {
"version": "9.2.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-9.2.1.tgz",
"integrity": "sha512-ZsetaQjXB8+9/EFW1FnfK4ukpkwXCxMEaiKiUZhZ0ZLFlLnFCpe0Bg4vdDf7e4boWGcnlgN1jAJpBw7w0eXuqA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-10.1.0.tgz",
"integrity": "sha512-DyS6WhQ59+ZXQsI1EkpsYkOXFt0Xbp+mbxPTJS9A7O21r3JDzaTC+1Jxz7g6J+Sbi9Y7UFdRs0tn/vqhHJx2gA==",
"dev": true,
"requires": {
"@electron/get": "^1.0.1",
@ -7733,9 +7727,9 @@
}
},
"electron-to-chromium": {
"version": "1.3.526",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.526.tgz",
"integrity": "sha512-HiroW5ZbGwgT8kCnoEO8qnGjoTPzJxduvV/Vv/wH63eo2N6Zj3xT5fmmaSPAPUM05iN9/5fIEkIg3owTtV6QZg==",
"version": "1.3.554",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.554.tgz",
"integrity": "sha512-Vtz2dVH5nMtKK4brahmgScwFS8PBnpA4VObYXtlsqN8ZpT9IFelv0Rpflc1+NIILjGVaj6vEiXQbhrs3Pl8O7g==",
"dev": true
},
"electron-updater": {
@ -11525,6 +11519,12 @@
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
"klona": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/klona/-/klona-2.0.3.tgz",
"integrity": "sha512-CgPOT3ZadDpXxKcfV56lEQ9OQSZ42Mk26gnozI+uN/k39vzD8toUhRQoqsX0m9Q3eMPEfsLWmtyUpK/yqST4yg==",
"dev": true
},
"last-call-webpack-plugin": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
@ -11614,21 +11614,20 @@
}
},
"less-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.2.0.tgz",
"integrity": "sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg==",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.0.0.tgz",
"integrity": "sha512-fAgAaZHQJdX/woSMyNhvJt6bQUhpOtKODfuhk5AqgVPo6FVD3PezwHIZEtNPr4aumYoNQ1KBLnhynGX2XE/Lrg==",
"dev": true,
"requires": {
"clone": "^2.1.2",
"less": "^3.11.3",
"klona": "^2.0.3",
"loader-utils": "^2.0.0",
"schema-utils": "^2.7.0"
},
"dependencies": {
"ajv": {
"version": "6.12.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
"integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
"version": "6.12.4",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
"integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@ -12054,9 +12053,9 @@
"dev": true
},
"mini-css-extract-plugin": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz",
"integrity": "sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A==",
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.0.tgz",
"integrity": "sha512-dVWGuWJlQw2lZxsxBI3hOsoxg1k3DruLR0foHQLSkQMfk+qLJbv9dUk8fjmjWQKN9ef2n54ehA2FjClAsQhrWQ==",
"dev": true,
"requires": {
"loader-utils": "^1.1.0",

View File

@ -60,7 +60,7 @@
"lint:fix": "eslint --ext .js,.vue -f ./node_modules/eslint-formatter-friendly --fix src"
},
"browserslist": [
"Electron 9.2.1"
"Electron 10.0.1"
],
"engines": {
"node": ">= 12"
@ -169,7 +169,6 @@
"babel-loader": "^8.1.0",
"babel-minify-webpack-plugin": "^0.3.1",
"babel-preset-minify": "^0.5.1",
"browserslist": "^4.14.0",
"cfonts": "^2.8.6",
"chalk": "^4.1.0",
"changelog-parser": "^2.8.0",
@ -178,7 +177,7 @@
"cross-env": "^7.0.2",
"css-loader": "^3.6.0",
"del": "^5.1.0",
"electron": "^9.2.1",
"electron": "^10.1.0",
"electron-builder": "^22.8.0",
"electron-debug": "^3.1.0",
"electron-devtools-installer": "^3.1.1",
@ -195,9 +194,9 @@
"friendly-errors-webpack-plugin": "^1.7.0",
"html-webpack-plugin": "^4.3.0",
"less": "^3.12.2",
"less-loader": "^6.2.0",
"less-loader": "^7.0.0",
"markdown-it": "^11.0.0",
"mini-css-extract-plugin": "^0.10.0",
"mini-css-extract-plugin": "^0.11.0",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"postcss-loader": "^3.0.0",
"postcss-pxtorem": "^5.1.1",

View File

@ -23,4 +23,4 @@
### 其他
- 更新electron到 9.2.1
- 更新electron到 10.1.0

View File

@ -43,6 +43,14 @@ const names = {
hide_toggle: 'hide_toggle',
get_data_path: 'get_data_path',
show_dialog: 'show_dialog',
get_setting: 'get_setting',
get_playlist: 'get_playlist',
save_playlist: 'save_playlist',
get_data: 'get_data',
set_data: 'set_data',
save_data: 'save_data',
get_hot_key: 'get_hot_key',
},
winLyric: {
close: 'close',

View File

@ -188,7 +188,7 @@ exports.initSetting = () => {
// newSetting.controlBtnPosition = 'right'
electronStore_config.set('version', settingVersion)
electronStore_config.set('setting', newSetting)
return newSetting
return { version: settingVersion, setting: newSetting }
}
/**

View File

@ -35,7 +35,7 @@ app.commandLine.appendSwitch('wm-window-animations-disabled')
// https://github.com/electron/electron/issues/18397
// 开发模式下为true时 多次引入native模块会导致渲染进程卡死
// https://github.com/electron/electron/issues/22791
app.allowRendererProcessReuse = !isDev
// app.allowRendererProcessReuse = !isDev
app.on('web-contents-created', (event, contents) => {
@ -124,7 +124,9 @@ global.appHotKey = {
}
function init() {
global.appSetting = initSetting()
const info = initSetting()
global.appSetting = info.setting
global.appSettingVersion = info.version
global.appHotKey.config = initHotKey()
global.lx_event.common.initSetting()
global.lx_event.hotKey.init()

View File

@ -1,7 +1,9 @@
const { mainWindow: MAIN_WINDOW_EVENT_NAME } = require('../events/_name')
const { mainOn, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc')
const { mainOn, NAMES: { mainWindow: ipcMainWindowNames }, mainHandle } = require('../../common/ipc')
mainOn(ipcMainWindowNames.set_app_setting, (event, config) => {
if (!config) return
global.lx_event.common.setAppConfig(config, MAIN_WINDOW_EVENT_NAME.name)
})
mainHandle(ipcMainWindowNames.get_setting, async() => ({ setting: global.appSetting, version: global.appSettingVersion }))

View File

@ -1,7 +1,11 @@
const { mainHandle, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc')
mainHandle(ipcMainWindowNames.clear_cache, async(event, options) => {
if (!global.modules.mainWindow) throw new Error('mainWindow is undefined')
return global.modules.mainWindow.webContents.session.clearCache()
})
mainHandle(ipcMainWindowNames.get_cache_size, async(event, options) => {
if (!global.modules.mainWindow) throw new Error('mainWindow is undefined')
return global.modules.mainWindow.webContents.session.getCacheSize()
})

View File

@ -1,8 +0,0 @@
const { mainHandle, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc')
mainHandle(ipcMainWindowNames.clear_cache, async(event, options) => {
if (!global.modules.mainWindow) throw new Error('mainWindow is undefined')
return global.modules.mainWindow.webContents.session.clearCache()
})

View File

@ -0,0 +1,12 @@
const Store = require('electron-store')
const { mainOn, NAMES: { mainWindow: ipcMainWindowNames }, mainHandle } = require('../../common/ipc')
const electronStore_data = new Store({
name: 'data',
})
mainHandle(ipcMainWindowNames.get_data, async(event, path) => electronStore_data.get(path))
mainOn(ipcMainWindowNames.save_data, (event, { path, data }) => electronStore_data.get(path, data))

View File

@ -1,5 +1,10 @@
const { mainSend, NAMES: { mainWindow: ipcMainWindowNames }, mainOn } = require('../../common/ipc')
const Store = require('electron-store')
const { mainSend, NAMES: { mainWindow: ipcMainWindowNames }, mainOn, mainHandle } = require('../../common/ipc')
const { mainWindow: MAIN_WINDOW_EVENT_NAME, hotKey: HOT_KEY_EVENT_NAME } = require('../events/_name')
const electronStore_hotKey = new Store({
name: 'hotKey',
})
// const { registerHotkey, unRegisterHotkey } = require('../modules/hotKey/utils')
// mainHandle(ipcMainWindowNames.set_hot_key_config, async(event, { action, data }) => {
@ -14,6 +19,11 @@ const { mainWindow: MAIN_WINDOW_EVENT_NAME, hotKey: HOT_KEY_EVENT_NAME } = requi
// }
// })
mainHandle(ipcMainWindowNames.get_hot_key, async() => ({
local: electronStore_hotKey.get('local'),
global: electronStore_hotKey.get('global'),
}))
mainOn(ipcMainWindowNames.quit, () => global.lx_event.mainWindow.quit())
mainOn(ipcMainWindowNames.min_toggle, () => global.lx_event.mainWindow.toggleMinimize())
mainOn(ipcMainWindowNames.hide_toggle, () => global.lx_event.mainWindow.toggleHide())

View File

@ -7,15 +7,16 @@ require('./musicMeta')
require('./selectDir')
require('./setWindowSize')
require('./showSaveDialog')
require('./clearCache')
require('./getCacheSize')
require('./cache')
require('./setIgnoreMouseEvent')
require('./getEnvParams')
require('./setAppSetting')
require('./appSetting')
require('./setLyricInfo')
require('./hotKey')
require('./getDataPath')
require('./showDialog')
require('./playList')
require('./data')
require('./xm_verify')

View File

@ -0,0 +1,23 @@
const Store = require('electron-store')
const { mainOn, NAMES: { mainWindow: ipcMainWindowNames }, mainHandle } = require('../../common/ipc')
const electronStore_list = new Store({
name: 'playList',
})
mainHandle(ipcMainWindowNames.get_playlist, async(event, isIgnoredError = false) => {
let electronStore_list = new Store({
name: 'playList',
clearInvalidConfig: !isIgnoredError,
})
return {
defaultList: electronStore_list.get('defaultList'),
loveList: electronStore_list.get('loveList'),
userList: electronStore_list.get('userList'),
downloadList: electronStore_list.get('downloadList'),
}
})
mainOn(ipcMainWindowNames.save_playlist, (event, { type, data }) => electronStore_list.set(type, data))

View File

@ -27,7 +27,7 @@ import { mapMutations, mapGetters, mapActions } from 'vuex'
import { rendererOn, rendererSend, rendererInvoke, NAMES } from '../common/ipc'
import { isLinux } from '../common/utils'
import music from './utils/music'
import { throttle, openUrl, compareVer } from './utils'
import { throttle, openUrl, compareVer, getPlayList } from './utils'
import { base as eventBaseName } from './event/names'
window.ELECTRON_DISABLE_SECURITY_WARNINGS = process.env.ELECTRON_DISABLE_SECURITY_WARNINGS
@ -70,19 +70,34 @@ export default {
},
created() {
this.saveDefaultList = throttle(n => {
window.electronStore_list.set('defaultList', n)
rendererSend(NAMES.mainWindow.save_playlist, {
type: 'defaultList',
data: n,
})
}, 500)
this.saveLoveList = throttle(n => {
window.electronStore_list.set('loveList', n)
rendererSend(NAMES.mainWindow.save_playlist, {
type: 'loveList',
data: n,
})
}, 500)
this.saveUserList = throttle(n => {
window.electronStore_list.set('userList', n)
rendererSend(NAMES.mainWindow.save_playlist, {
type: 'userList',
data: n,
})
}, 500)
this.saveDownloadList = throttle(n => {
window.electronStore_list.set('downloadList', n)
rendererSend(NAMES.mainWindow.save_playlist, {
type: 'downloadList',
data: n,
})
}, 1000)
this.saveSearchHistoryList = throttle(n => {
window.electronStore_data.set('searchHistoryList', n)
rendererSend(NAMES.mainWindow.set_data, {
path: 'searchHistoryList',
data: n,
})
}, 500)
},
mounted() {
@ -155,6 +170,9 @@ export default {
...mapMutations(['setNewVersion', 'setVersionModalVisible', 'setDownloadProgress', 'setSetting', 'setDesktopLyricConfig']),
...mapMutations('list', ['initList']),
...mapMutations('download', ['updateDownloadList']),
...mapMutations('search', {
setSearchHistoryList: 'setHistory',
}),
init() {
document.documentElement.style.fontSize = this.windowSizeActive.fontSize
@ -243,19 +261,23 @@ export default {
},
initData() { //
this.initPlayList() //
this.initDownloadList() //
this.initLocalList() //
// this.initDownloadList() //
this.initSearchHistoryList() //
},
initPlayList() {
let defaultList = window.electronStore_list.get('defaultList') || this.defaultList
let loveList = window.electronStore_list.get('loveList') || this.loveList
let userList = window.electronStore_list.get('userList') || this.userList
if (!defaultList.list) defaultList.list = []
if (!loveList.list) loveList.list = []
this.initList({ defaultList, loveList, userList })
initLocalList() {
getPlayList().then(({ defaultList, loveList, userList, downloadList }) => {
if (!defaultList) defaultList = this.defaultList
if (!loveList) loveList = this.loveList
if (!userList) userList = this.userList
if (!defaultList.list) defaultList.list = []
if (!loveList.list) loveList.list = []
this.initList({ defaultList, loveList, userList })
this.initDownloadList(downloadList) //
})
},
initDownloadList() {
let downloadList = window.electronStore_list.get('downloadList')
initDownloadList(downloadList) {
if (downloadList) {
downloadList.forEach(item => {
if (item.status == this.downloadStatus.RUN || item.status == this.downloadStatus.WAITING) {
@ -266,6 +288,16 @@ export default {
this.updateDownloadList(downloadList)
}
},
initSearchHistoryList() {
rendererInvoke(NAMES.mainWindow.get_data, 'searchHistoryList').then(historyList => {
if (historyList == null) {
historyList = []
rendererInvoke(NAMES.mainWindow.set_data, { path: 'searchHistoryList', data: historyList })
} else {
this.setSearchHistoryList(historyList)
}
})
},
showUpdateModal() {
(this.version.newVersion && this.version.newVersion.history
? Promise.resolve(this.version.newVersion)

View File

@ -1,21 +1,22 @@
import Vue from 'vue'
import keyBind from '../utils/keyBind'
import { rendererOn, rendererSend, NAMES } from '../../common/ipc'
import { rendererOn, rendererSend, NAMES, rendererInvoke } from '../../common/ipc'
import { base as baseName } from './names'
import Store from 'electron-store'
import { common as hotKeyNamesCommon } from '../../common/hotKey'
const eventHub = window.eventHub = new Vue()
const electronStore_hotKey = window.electronStore_hotKey = new Store({
name: 'hotKey',
})
window.isEditingHotKey = false
const appHotKeyConfig = window.appHotKeyConfig = {
local: electronStore_hotKey.get('local'),
global: electronStore_hotKey.get('global'),
let appHotKeyConfig = {
local: {},
global: {},
}
rendererInvoke(NAMES.mainWindow.get_hot_key).then(({ local, global }) => {
appHotKeyConfig = window.appHotKeyConfig = {
local,
global,
}
})
eventHub.$on(baseName.bindKey, () => {
keyBind.bindKey((key, type, event, keys) => {

View File

@ -16,14 +16,45 @@ import store from './store'
import '../common/error'
import { getSetting } from './utils'
import languageList from '@/lang/languages.json'
import { rendererSend, NAMES } from '../common/ipc'
sync(store, router)
Vue.config.productionTip = false
new Vue({
router,
store,
i18n,
el: '#root',
render: h => h(App),
getSetting().then(({ setting, version }) => {
// Set language automatically
if (!window.i18n.availableLocales.includes(setting.langId)) {
let langId = null
let locale = window.navigator.language.toLocaleLowerCase()
if (window.i18n.availableLocales.includes(locale)) {
langId = locale
} else {
for (const lang of languageList) {
if (lang.alternate == locale) {
langId = lang.locale
break
}
}
if (langId == null) langId = 'en-us'
}
setting.langId = langId
rendererSend(NAMES.mainWindow.set_app_setting, setting)
console.log('Set lang', setting.langId)
}
window.i18n.locale = setting.langId
store.commit('setSetting', setting)
store.commit('setSettingVersion', version)
new Vue({
router,
store,
i18n,
el: '#root',
render: h => h(App),
})
})

View File

@ -1,15 +1,5 @@
import Store from 'electron-store'
import music from '../../utils/music'
const electronStore_data = window.electronStore_data = new Store({
name: 'data',
})
let historyList = electronStore_data.get('searchHistoryList')
if (historyList == null) {
historyList = []
electronStore_data.set('searchHistoryList', historyList)
}
const sources = []
const sourceList = {}
const sourceMaxPage = {}
@ -103,7 +93,7 @@ const state = {
allPage: 1,
total: 0,
sourceMaxPage,
historyList,
historyList: [],
}
// getters
@ -211,6 +201,9 @@ const mutations = {
clearHistory(state) {
state.historyList = []
},
setHistory(state, list) {
state.historyList = list
},
}
export default {

View File

@ -9,12 +9,12 @@ export default {
setSetting(state, val) {
state.setting = val
},
setAgreePact(state) {
state.setting.isAgreePact = true
},
setSettingVersion(state, val) {
state.settingVersion = val
},
setAgreePact(state) {
state.setting.isAgreePact = true
},
setLeaderboard(state, { tabId, source }) {
if (tabId != null) state.setting.leaderboard.tabId = tabId
if (source != null) state.setting.leaderboard.source = source

View File

@ -1,67 +1,9 @@
// const isDev = process.env.NODE_ENV === 'development'
import Store from 'electron-store'
import { windowSizeList } from '../../common/config'
import { version } from '../../../package.json'
import { rendererSend, rendererInvoke, NAMES } from '../../common/ipc'
import languageList from '@/lang/languages.json'
import path from 'path'
import { openDirInExplorer } from '../utils'
const electronStore_config = window.electronStore_config = new Store({
name: 'config',
})
let setting = electronStore_config.get('setting')
let settingVersion = electronStore_config.get('version')
process.versions.app = version
// Set language automatically
if (!window.i18n.availableLocales.includes(setting.langId)) {
let langId = null
let locale = window.navigator.language.toLocaleLowerCase()
if (window.i18n.availableLocales.includes(locale)) {
langId = locale
} else {
for (const lang of languageList) {
if (lang.alternate == locale) {
langId = lang.locale
break
}
}
if (langId == null) langId = 'en-us'
}
setting.langId = langId
electronStore_config.set('setting', setting)
rendererSend(NAMES.mainWindow.set_app_setting, setting)
console.log('Set lang', 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 => {
let filePath = path.join(dataPath, 'playList.json.bak')
rendererInvoke(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: filePath,
detail: error.message,
}),
}).then(() => openDirInExplorer(filePath))
})
window.electronStore_list = new Store({
name: 'playList',
})
}
export default {
themes: [
@ -144,8 +86,8 @@ export default {
downloadProgress: null,
},
userInfo: null,
setting,
settingVersion,
setting: null,
settingVersion: null,
windowSizeList,
}

View File

@ -1,4 +1,5 @@
import fs from 'fs'
import path from 'path'
import { shell, clipboard } from 'electron'
import crypto from 'crypto'
import { rendererSend, rendererInvoke, NAMES } from '../../common/ipc'
@ -341,3 +342,22 @@ export const getProxyInfo = () => window.globalObj.proxy.enable
export const assertApiSupport = source => window.globalObj.qualityList[source] != undefined
export const getSetting = () => rendererInvoke(NAMES.mainWindow.get_setting)
export const saveSetting = () => rendererInvoke(NAMES.mainWindow.set_app_setting)
export const getPlayList = () => rendererInvoke(NAMES.mainWindow.get_playlist).catch(error => {
rendererInvoke(NAMES.mainWindow.get_data_path).then(dataPath => {
let filePath = path.join(dataPath, 'playList.json.bak')
rendererInvoke(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: filePath,
detail: error.message,
}),
}).then(() => openDirInExplorer(filePath))
})
return rendererInvoke(NAMES.mainWindow.get_playlist, true)
})