diff --git a/src/main/modules/tray.js b/src/main/modules/tray.js index 924182c0..c6589ed7 100644 --- a/src/main/modules/tray.js +++ b/src/main/modules/tray.js @@ -10,7 +10,7 @@ global.lx_event.tray.on(TRAY_EVENT_NAME.destroy, () => { }) let tray -function createTray() { +const createTray = () => { if ((tray && !tray.isDestroyed()) || !global.appSetting.tray || !global.appSetting.tray.isShow) return const iconPath = path.join(global.__static, 'images/tray', isWin ? 'trayTemplate.ico' : 'trayTemplate.png') @@ -18,6 +18,25 @@ function createTray() { // 托盘 tray = new Tray(iconPath) + tray.setToolTip('洛雪音乐助手') + if (isWin) createMenu(tray) + tray.setIgnoreDoubleClickEvents(true) + tray.on('click', () => { + const mainWindow = global.mainWindow + if (!mainWindow) return + mainWindow.isVisible() + ? mainWindow.focus() + : mainWindow.show() + }) +} + +const destroyTray = () => { + if (!tray) return + tray.destroy() + tray = null +} + +const createMenu = tray => { const contextMenu = Menu.buildFromTemplate([ { label: '退出', @@ -27,26 +46,6 @@ function createTray() { }, }, ]) - tray.setToolTip('洛雪音乐助手') tray.setContextMenu(contextMenu) - tray.on('click', () => { - const mainWindow = global.mainWindow - if (!mainWindow) return - mainWindow.isVisible() - ? mainWindow.focus() - : mainWindow.show() - }) - tray.on('double-click', () => { - const mainWindow = global.mainWindow - if (!mainWindow) return - mainWindow.isVisible() - ? mainWindow.focus() - : mainWindow.show() - }) } -function destroyTray() { - if (!tray) return - tray.destroy() - tray = null -} diff --git a/src/main/rendererEvents/xm_verify/index.js b/src/main/rendererEvents/xm_verify/index.js new file mode 100644 index 00000000..c702a972 --- /dev/null +++ b/src/main/rendererEvents/xm_verify/index.js @@ -0,0 +1,4 @@ +const { isMac } = require('../../../common/utils') + +// mac下的 BrowserView 无法拖动验证栏,改用 BrowserWindow +require(isMac ? './xm_verify_win' : './xm_verify_view') diff --git a/src/main/rendererEvents/xm_verify/xm_verify.js b/src/main/rendererEvents/xm_verify/xm_verify.js new file mode 100644 index 00000000..c702a972 --- /dev/null +++ b/src/main/rendererEvents/xm_verify/xm_verify.js @@ -0,0 +1,4 @@ +const { isMac } = require('../../../common/utils') + +// mac下的 BrowserView 无法拖动验证栏,改用 BrowserWindow +require(isMac ? './xm_verify_win' : './xm_verify_view') diff --git a/src/main/rendererEvents/xm_verify.js b/src/main/rendererEvents/xm_verify/xm_verify_view.js similarity index 68% rename from src/main/rendererEvents/xm_verify.js rename to src/main/rendererEvents/xm_verify/xm_verify_view.js index 7b70e899..48dabd6f 100644 --- a/src/main/rendererEvents/xm_verify.js +++ b/src/main/rendererEvents/xm_verify/xm_verify_view.js @@ -1,9 +1,10 @@ const { BrowserView } = require('electron') -const { mainHandle } = require('../../common/ipc') -const { getWindowSizeInfo } = require('../utils') -const { isMac } = require('../../common/utils') +const { mainHandle } = require('../../../common/ipc') +const { getWindowSizeInfo } = require('../../utils') let view +let isActioned = false +let rejectFn const closeView = async() => { if (!view) return @@ -21,44 +22,45 @@ mainHandle('xm_verify_open', (event, url) => new Promise((resolve, reject) => { view.destroy() } - let firstLoad = true + rejectFn = reject + + isActioned = false view = new BrowserView({ webPreferences: { enableRemoteModule: false, disableHtmlFullscreenWindowResize: true, }, - movable: false, }) view.webContents.on('did-finish-load', () => { - if (/punish\?/.test(view.webContents.getURL())) { - if (isMac) { // 解决 MAC 首次加载页面无法拖动滑块的问题 - if (firstLoad) view.webContents.reload() - firstLoad = false - } - return - } + if (/punish\?/.test(view.webContents.getURL())) return let ses = view.webContents.session ses.cookies.get({ name: 'x5sec' }) .then(async([x5sec]) => { + isActioned = true await closeView() if (!x5sec) return reject(new Error('get x5sec failed')) resolve(x5sec.value) }).catch(async err => { + isActioned = true await closeView() reject(err) }) }) + global.mainWindow.setBrowserView(view) const windowSizeInfo = getWindowSizeInfo(global.appSetting) - view.setBounds({ x: (windowSizeInfo.width - 360) / 2, y: ((windowSizeInfo.height - 320 + 52) / 2), width: 360, height: 320 }) + view.setBounds({ x: (windowSizeInfo.width - 380) / 2, y: ((windowSizeInfo.height - 320 + 52) / 2), width: 380, height: 320 }) view.webContents.loadURL(url, { httpReferrer: 'https://www.xiami.com/', }) - view.webContents.openDevTools({ mode: 'undocked' }) + // view.webContents.openDevTools() })) mainHandle('xm_verify_close', async() => { await closeView() + if (!rejectFn) return + if (!isActioned) rejectFn(new Error('canceled verify')) + rejectFn = null }) diff --git a/src/main/rendererEvents/xm_verify/xm_verify_win.js b/src/main/rendererEvents/xm_verify/xm_verify_win.js new file mode 100644 index 00000000..cb3da147 --- /dev/null +++ b/src/main/rendererEvents/xm_verify/xm_verify_win.js @@ -0,0 +1,77 @@ +const { BrowserWindow } = require('electron') +const { mainHandle } = require('../../../common/ipc') +const { getWindowSizeInfo } = require('../../utils') + +let win + +const closeWin = async() => { + if (!win) return + // await win.webContents.session.clearCache() + // if (global.mainWindow) global.mainWindow.removeBrowserView(win) + if (win.isDestroyed()) { + win = null + return + } + await win.webContents.session.clearStorageData() + win.destroy() + win = null +} + +mainHandle('xm_verify_open', (event, url) => new Promise((resolve, reject) => { + if (!global.mainWindow) return reject(new Error('mainwindow is undefined')) + if (win) win.destroy() + + let isActioned = false + + const mainWindowSizeInfo = global.mainWindow.getBounds() + const windowSizeInfo = getWindowSizeInfo(global.appSetting) + win = new BrowserWindow({ + parent: global.mainWindow, + width: 460, + height: 370, + resizable: false, + // transparent: true, + x: mainWindowSizeInfo.x + (windowSizeInfo.width - 460) / 2, + y: mainWindowSizeInfo.y + (windowSizeInfo.height - 320 + 52) / 2, + minimizable: false, + maximizable: false, + // movable: false, + // frame: false, + // modal: true, + webPreferences: { + enableRemoteModule: false, + disableHtmlFullscreenWindowResize: true, + }, + }) + win.webContents.on('did-finish-load', () => { + if (/punish\?/.test(win.webContents.getURL())) return + let ses = win.webContents.session + ses.cookies.get({ name: 'x5sec' }) + .then(async([x5sec]) => { + isActioned = true + await closeWin() + if (!x5sec) return reject(new Error('get x5sec failed')) + resolve(x5sec.value) + }).catch(async err => { + isActioned = true + await closeWin() + reject(err) + }) + }) + + win.webContents.loadURL(url, { + httpReferrer: 'https://www.xiami.com/', + }) + + win.on('closed', async() => { + await closeWin() + if (isActioned) return + reject(new Error('canceled verify')) + }) + + // win.webContents.openDevTools() +})) + +mainHandle('xm_verify_close', async() => { + await closeWin() +}) diff --git a/src/renderer/utils/music/xm/musicSearch.js b/src/renderer/utils/music/xm/musicSearch.js index 33311d58..e276bff7 100644 --- a/src/renderer/utils/music/xm/musicSearch.js +++ b/src/renderer/utils/music/xm/musicSearch.js @@ -90,7 +90,6 @@ export default { if (limit != null) this.limit = limit // http://newlyric.kuwo.cn/newlyric.lrc?62355680 return this.musicSearch(str, page).then(result => { - // console.log(result) if (!result) return this.search(str, page, { limit }, retryNum) if (result.code !== 'SUCCESS') return this.search(str, page, { limit }, retryNum) // const songResultData = result.data || { songs: [], total: 0 } @@ -109,6 +108,6 @@ export default { total: this.total, source: 'xm', }) - }).catch(() => this.search(str, page, { limit }, retryNum)) + }).catch(err => err.message.includes('canceled verify') ? Promise.reject(err) : this.search(str, page, { limit }, retryNum)) }, } diff --git a/src/renderer/utils/music/xm/util.js b/src/renderer/utils/music/xm/util.js index d6fe066b..ee447801 100644 --- a/src/renderer/utils/music/xm/util.js +++ b/src/renderer/utils/music/xm/util.js @@ -98,9 +98,12 @@ export const xmRequest = (path, params = '') => { return wait(300).then(() => { return rendererInvoke('xm_verify_open', 'https:' + resp.body.url).then(x5sec => { handleSaveToken({ cookies: { x5sec } }) - // console.log(x5sec) + console.log(x5sec) window.globalObj.xm.isShowVerify = false - return Promise.reject(new Error('获取失败')) + return Promise.reject(new Error('获取成功')) + }).catch(err => { + window.globalObj.xm.isShowVerify = false + return Promise.reject(err) }) }) } @@ -114,6 +117,7 @@ export const xmRequest = (path, params = '') => { export const closeVerifyModal = async() => { if (!window.globalObj.xm.isShowVerify) return + console.log('object') await rendererInvoke('xm_verify_close') window.globalObj.xm.isShowVerify = false }