From aa56dafd5f9d962e30bf846691836b3026a36444 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 24 May 2022 08:57:04 +0800 Subject: [PATCH 01/32] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=BE=E7=BD=AE-?= =?UTF-8?q?=E4=BB=A5=E5=85=A8=E5=B1=8F=E6=A8=A1=E5=BC=8F=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 22 +------------------ src/common/defaultSetting.js | 3 ++- src/lang/en-us.json | 1 + src/lang/zh-cn.json | 1 + src/lang/zh-tw.json | 1 + src/main/index.js | 9 ++++++-- src/renderer/core/useApp/index.js | 3 ++- .../views/setting/components/SettingBasic.vue | 2 ++ src/renderer/views/setting/setting.js | 1 + 9 files changed, 18 insertions(+), 25 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 180c012b..ec9bc710 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,23 +1,3 @@ ### 新增 -- 新增设置-播放设置-显示歌词罗马音,默认关闭,注:目前只有网易源能获取到罗马音歌词(得益于 Binaryify/NeteaseCloudMusicApi/pull/1523),如果你知道其他源的歌词罗马音获取方式,欢迎PR或开issue交流! - -### 优化 - -- 同时删除一首歌以上时将需要二次确认删除 -- 禁用透明窗口时右侧不再偏移5px距离(在win7、Ubuntu等系统上测试发现不偏移也不影响滚动条的拖动了) -- 删除未下载完成的任务时,只同时尝试删除已有下载进度的本地文件 -- 在全屏状态下使用`Esc`键可以退出全屏(#827) - -### 修复 - -- 修复某些情况下歌曲播放出错时不会自动切歌的问题 -- 修复关闭“显示切换动画”设置后,在应用启动时该设置没有被应用的问题 -- 修复原始歌词存在偏移时,歌词偏移设置的重置未按预期工作的问题 -- 修复长度大于一行的歌词在使用歌词调整播放进度时的时间不准问题 -- 修复潜在歌单更新失败的问题 - -### 文档 - -- 将歌曲添加“稍后播放”后,它们会被放在一个优先级最高的特殊队列中,点击“下一曲”时会消耗该队列中的歌曲,并且无法通过“上一曲”功能播放该队列的上一首歌曲 -- 在切歌时若不是通过“上一曲”、“下一曲”功能切歌(例如直接点击“排行榜列表”、“我的列表”中的歌曲切歌),“稍后播放”队列将会被清空 +- 新增设置-以全屏模式启动设置 diff --git a/src/common/defaultSetting.js b/src/common/defaultSetting.js index e2928c12..8904b1d9 100644 --- a/src/common/defaultSetting.js +++ b/src/common/defaultSetting.js @@ -2,7 +2,7 @@ const path = require('path') const os = require('os') const defaultSetting = { - version: '1.0.57', + version: '1.0.58', player: { togglePlayMethod: 'listLoop', highQuality: false, @@ -108,6 +108,7 @@ const defaultSetting = { port: '23332', }, windowSizeId: 2, + startInFullscreen: false, theme: { id: 0, lightId: 0, diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 3da048dd..a44f3cc2 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -246,6 +246,7 @@ "setting__basic_sourcename_alias": "Aliases", "setting__basic_sourcename_real": "Original", "setting__basic_sourcename_title": "Select the name of music source", + "setting__basic_start_in_fullscreen": "Start in fullscreen mode", "setting__basic_theme": "Theme", "setting__basic_theme_auto_tip": "This is a dynamic theme, you can preset a light theme and a dark theme, and then it will automatically switch to the corresponding theme you preset according to the system's light and dark theme colors.\nNote: Right-click this theme item to open the light and dark theme setting window.", "setting__basic_to_tray": "Do not exit the software when closing the software and minimize it to the system tray", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 75a91179..a6eded57 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -246,6 +246,7 @@ "setting__basic_sourcename_alias": "别名", "setting__basic_sourcename_real": "原名", "setting__basic_sourcename_title": "选择音源名字类型", + "setting__basic_start_in_fullscreen": "以全屏模式启动", "setting__basic_theme": "主题颜色", "setting__basic_theme_auto_tip": "此乃动态主题,你可以预先设置一个亮色主题及暗色主题,此后将根据系统的亮、暗主题色自动切换为你预先设置的相应主题。\n注:鼠标 右击 此主题项即可打开亮、暗色主题设置窗口。", "setting__basic_to_tray": "关闭软件时不退出软件将其最小化到系统托盘", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index b2c2a0f0..dff22825 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -246,6 +246,7 @@ "setting__basic_sourcename_alias": "別名", "setting__basic_sourcename_real": "原名", "setting__basic_sourcename_title": "選擇音源名字類型", + "setting__basic_start_in_fullscreen": "以全屏模式啟動", "setting__basic_theme": "主題顏色", "setting__basic_theme_auto_tip": "此乃動態主題,你可以預先設置一個亮色主題及暗色主題,此後將根據系統的亮、暗主題色自動切換為你預先設置的相應主題。\n注:鼠標 右擊 此主題項即可打開亮、暗色主題設置窗口。", "setting__basic_to_tray": "關閉軟件時不退出軟件將其最小化到系統托盤", diff --git a/src/main/index.js b/src/main/index.js index 2bc5bff5..3fb0de7d 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -160,7 +160,7 @@ function createWindow() { /** * Initial window options */ - global.modules.mainWindow = new BrowserWindow({ + const options = { height: windowSizeInfo.height, useContentSize: true, width: windowSizeInfo.width, @@ -178,7 +178,12 @@ function createWindow() { nodeIntegration: true, spellcheck: false, // 禁用拼写检查器 }, - }) + } + if (global.appSetting.startInFullscreen) { + options.fullscreen = true + if (isLinux) options.resizable = true + } + global.modules.mainWindow = new BrowserWindow(options) const shouldUseDarkColors = nativeTheme.shouldUseDarkColors const themeId = global.appSetting.theme.id == 'auto' diff --git a/src/renderer/core/useApp/index.js b/src/renderer/core/useApp/index.js index 01f055e3..194dfc0c 100644 --- a/src/renderer/core/useApp/index.js +++ b/src/renderer/core/useApp/index.js @@ -2,7 +2,7 @@ import { isLinux } from '@common/utils' import { getEnvParams, setIgnoreMouseEvents } from '@renderer/utils/tools' import { useRefGetter } from '@renderer/utils/vueTools' -import { sync, apiSource, proxy } from '@renderer/core/share' +import { sync, apiSource, proxy, isFullscreen } from '@renderer/core/share' import useSync from './useSync' import useUpdate from './useUpdate' @@ -22,6 +22,7 @@ export default () => { sync.enable = setting.value.sync.enable apiSource.value = setting.value.apiSource Object.assign(proxy, setting.value.network.proxy) + isFullscreen.value = setting.value.startInFullscreen const dieableIgnoreMouseEvents = () => { if (window.dt) return diff --git a/src/renderer/views/setting/components/SettingBasic.vue b/src/renderer/views/setting/components/SettingBasic.vue index 617dacad..8d9c8eba 100644 --- a/src/renderer/views/setting/components/SettingBasic.vue +++ b/src/renderer/views/setting/components/SettingBasic.vue @@ -20,6 +20,8 @@ dd base-checkbox(id="setting_show_animate" v-model="currentStting.isShowAnimation" :label="$t('setting__basic_show_animation')") .gap-top base-checkbox(id="setting_animate" v-model="currentStting.randomAnimate" :label="$t('setting__basic_animation')") + .gap-top + base-checkbox(id="setting_start_in_fullscreen" v-model="currentStting.startInFullscreen" :label="$t('setting__basic_start_in_fullscreen')") .gap-top base-checkbox(id="setting_to_tray" v-model="currentStting.tray.isShow" :label="$t('setting__basic_to_tray')") p.gap-top diff --git a/src/renderer/views/setting/setting.js b/src/renderer/views/setting/setting.js index a6ed1489..fe548a42 100644 --- a/src/renderer/views/setting/setting.js +++ b/src/renderer/views/setting/setting.js @@ -87,6 +87,7 @@ export const currentStting = ref({ port: '23332', }, windowSizeId: 1, + startInFullscreen: false, langId: 'cns', theme: { id: 0, From ff41fa982997577a8ee4049d4dde205a51a2aa6a Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 26 May 2022 12:03:40 +0800 Subject: [PATCH 02/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dkuwo=E6=AD=8C=E8=AF=8D?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/store/modules/player.js | 4 ++-- src/renderer/utils/music/kw/lyric.js | 4 +++- src/renderer/utils/music/kw/util.js | 34 ++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/renderer/store/modules/player.js b/src/renderer/store/modules/player.js index d0a7ab1e..9da84e1f 100644 --- a/src/renderer/store/modules/player.js +++ b/src/renderer/store/modules/player.js @@ -222,8 +222,8 @@ const actions = { }) }, async getLrc({ commit, state }, musicInfo) { - const lrcInfo = await getStoreLyric(musicInfo) - // let lrcInfo = {} + let lrcInfo = await getStoreLyric(musicInfo) + // lrcInfo = {} // if (lrcRequest && lrcRequest.cancelHttp) lrcRequest.cancelHttp() if (existTimeExp.test(lrcInfo.lyric) && lrcInfo.tlyric != null) { // if (musicInfo.lrc.startsWith('\ufeff[id:$00000000]')) { diff --git a/src/renderer/utils/music/kw/lyric.js b/src/renderer/utils/music/kw/lyric.js index d7fe41c9..6e94db26 100644 --- a/src/renderer/utils/music/kw/lyric.js +++ b/src/renderer/utils/music/kw/lyric.js @@ -192,8 +192,10 @@ export default { let result = timeExp.exec(line) if (result) { const text = line.replace(timeExp, '').trim() + let time = RegExp.$1 + if (/\.\d\d$/.test(time)) time += '0' lrcArr.push({ - time: RegExp.$1, + time, text, }) } else if (lrcTools.rxps.tagLine.test(line)) { diff --git a/src/renderer/utils/music/kw/util.js b/src/renderer/utils/music/kw/util.js index ef8b0e5c..1d04a054 100644 --- a/src/renderer/utils/music/kw/util.js +++ b/src/renderer/utils/music/kw/util.js @@ -89,14 +89,26 @@ export const lrcTools = { isOK: false, lines: [], tags: [], - getWordInfo(str, str2) { + getWordInfo(str, str2, prevWord) { const offset = parseInt(str) const offset2 = parseInt(str2) - const startTime = Math.floor((offset + offset2) / (this.offset * 2)) - const timeLength = Math.floor((offset - offset2) / (this.offset2 * 2)) + let startTime = Math.abs((offset + offset2) / (this.offset * 2)) + let endTime = Math.abs((offset - offset2) / (this.offset2 * 2)) + startTime + if (prevWord) { + if (startTime < prevWord.endTime) { + prevWord.endTime = startTime + if (prevWord.startTime > prevWord.endTime) { + prevWord.startTime = prevWord.endTime + } + + prevWord.newTimeStr = `<${prevWord.startTime},${prevWord.endTime - prevWord.startTime}>` + // console.log(prevWord) + } + } return { startTime, - timeLength, + endTime, + timeStr: `<${startTime},${endTime - startTime}>`, } }, parseLine(line) { @@ -111,10 +123,13 @@ export const lrcTools = { const wordTimes = words.match(this.rxps.wordTimeAll) if (!wordTimes) return // console.log(wordTimes) + let preTimeInfo for (const timeStr of wordTimes) { const result = this.rxps.wordTime.exec(timeStr) - const wordInfo = this.getWordInfo(result[1], result[2]) - words = words.replace(timeStr, `<${wordInfo.startTime},${wordInfo.timeLength}>`) + const wordInfo = this.getWordInfo(result[1], result[2], preTimeInfo) + words = words.replace(timeStr, wordInfo.timeStr) + if (preTimeInfo?.newTimeStr) words = words.replace(preTimeInfo.timeStr, preTimeInfo.newTimeStr) + preTimeInfo = wordInfo } this.lines.push(time + words) return @@ -127,8 +142,8 @@ export const lrcTools = { content = content.substring(0, content.indexOf('][')) } const valueOf = parseInt(content, 8) - this.offset = Math.floor(valueOf / 10) - this.offset2 = Math.floor(valueOf % 10) + this.offset = Math.trunc(valueOf / 10) + this.offset2 = Math.trunc(valueOf % 10) if (this.offset == 0 || Number.isNaN(this.offset) || this.offset2 == 0 || Number.isNaN(this.offset2)) { this.isOK = false } @@ -147,12 +162,13 @@ export const lrcTools = { tools.tags = [] for (const line of lines) { - if (!tools.isOK) return '' + if (!tools.isOK) throw new Error('failed') tools.parseLine(line) } if (!tools.lines.length) return '' let lrcs = tools.lines.join('\n') if (tools.tags.length) lrcs = `${tools.tags.join('\n')}\n${lrcs}` + // console.log(lrcs) return lrcs }, } From 4783c9be8de933e598fcb088a16a297526da25bb Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 26 May 2022 13:02:52 +0800 Subject: [PATCH 03/32] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 534 +++++++++++++++++++++++----------------------- package.json | 16 +- 2 files changed, 272 insertions(+), 278 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84542562..e2050fbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "lx-music-desktop", - "version": "1.21.0-beta2", + "version": "1.21.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "lx-music-desktop", - "version": "1.21.0-beta2", + "version": "1.21.0", "license": "Apache-2.0", "dependencies": { "bufferutil": "^4.0.6", @@ -27,36 +27,36 @@ "sortablejs": "^1.15.0", "tunnel": "^0.0.6", "utf-8-validate": "^5.0.9", - "vue": "^3.2.35", + "vue": "^3.2.36", "vue-i18n": "^9.2.0-beta.35", "vue-router": "^4.1.0-aabe509", "vuex": "^4.0.2" }, "devDependencies": { - "@babel/core": "^7.18.0", - "@babel/eslint-parser": "^7.17.0", + "@babel/core": "^7.18.2", + "@babel/eslint-parser": "^7.18.2", "@babel/plugin-proposal-class-properties": "^7.17.12", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-modules-umd": "^7.18.0", - "@babel/plugin-transform-runtime": "^7.18.0", + "@babel/plugin-transform-runtime": "^7.18.2", "@babel/polyfill": "^7.12.1", - "@babel/preset-env": "^7.18.0", + "@babel/preset-env": "^7.18.2", "babel-loader": "^8.2.5", "babel-preset-minify": "^0.5.2", "browserslist": "^4.20.3", "chalk": "^4.1.2", "changelog-parser": "^2.8.1", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.22.5", + "core-js": "^3.22.7", "cross-env": "^7.0.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "del": "^6.1.0", + "del": "^6.1.1", "electron": "^13.6.9", "electron-builder": "^23.0.9", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.137", + "electron-to-chromium": "^1.4.139", "electron-updater": "^5.0.4", "eslint": "^8.16.0", "eslint-config-standard": "^17.0.0", @@ -131,21 +131,21 @@ } }, "node_modules/@babel/core": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", - "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.0", + "@babel/helpers": "^7.18.2", "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -201,9 +201,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", - "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz", + "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==", "dev": true, "dependencies": { "eslint-scope": "^5.1.1", @@ -228,12 +228,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", - "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" }, @@ -267,9 +267,9 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.10", @@ -341,13 +341,10 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, "engines": { "node": ">=6.9.0" } @@ -484,12 +481,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.2" }, "engines": { "node": ">=6.9.0" @@ -553,14 +550,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", - "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" }, "engines": { "node": ">=6.9.0" @@ -1236,9 +1233,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.17.12.tgz", - "integrity": "sha512-76lTwYaCxw8ldT7tNmye4LLwSoKDbRCBzu6n/DcK/P3FOR29+38CIIaVIZfwol9By8W/QHORYEnYSLuvcQKrsg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.17.12" @@ -1315,14 +1312,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", - "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-simple-access": "^7.18.2", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -1476,9 +1473,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.0.tgz", - "integrity": "sha512-7kM/jJ3DD/y1hDPn0jov12DoUIFsxLiItprhNydUSibxaywaxNqKwq+ODk72J9ePn4LWobIc5ik6TAJhVl8IkQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", + "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.16.7", @@ -1542,9 +1539,9 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz", - "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.17.12" @@ -1622,13 +1619,13 @@ "hasInstallScript": true }, "node_modules/@babel/preset-env": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.0.tgz", - "integrity": "sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", @@ -1673,12 +1670,12 @@ "@babel/plugin-transform-dotall-regex": "^7.16.7", "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.17.12", + "@babel/plugin-transform-for-of": "^7.18.1", "@babel/plugin-transform-function-name": "^7.16.7", "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", "@babel/plugin-transform-modules-systemjs": "^7.18.0", "@babel/plugin-transform-modules-umd": "^7.18.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", @@ -1691,12 +1688,12 @@ "@babel/plugin-transform-shorthand-properties": "^7.16.7", "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.17.12", + "@babel/plugin-transform-template-literals": "^7.18.2", "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", @@ -1793,19 +1790,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", - "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-environment-visitor": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1854,9 +1851,9 @@ } }, "node_modules/@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz", + "integrity": "sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2604,12 +2601,12 @@ "dev": true }, "node_modules/@vue/compiler-core": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.35.tgz", - "integrity": "sha512-1Mtmh8ceVUoUsn/PME5oM+Dus648rCeV/fBaZ4ERLFbTHBJXj6QmDPrSn9mfEyPDXE0RYIwyJNn884NdWK+Yiw==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.36.tgz", + "integrity": "sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.35", + "@vue/shared": "3.2.36", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } @@ -2623,25 +2620,25 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.35.tgz", - "integrity": "sha512-I4bXB9MkRSTJ3gVXRQ4iaYJgABZGew+K/CCBoAh9fdLaeY7A7uUlS5nWGOlICSVfOH0/xk4QlcXeGZYCJkEleA==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.36.tgz", + "integrity": "sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==", "dependencies": { - "@vue/compiler-core": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/compiler-core": "3.2.36", + "@vue/shared": "3.2.36" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.35.tgz", - "integrity": "sha512-2wKQtnuHfwBFc7uV2Cmtms3Cc7u/u6kKJI3F+i0A+9xnuahK39cCMNJKHzI9x93Xai+uft64fDc5JSh8zDQBQA==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.36.tgz", + "integrity": "sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.35", - "@vue/compiler-dom": "3.2.35", - "@vue/compiler-ssr": "3.2.35", - "@vue/reactivity-transform": "3.2.35", - "@vue/shared": "3.2.35", + "@vue/compiler-core": "3.2.36", + "@vue/compiler-dom": "3.2.36", + "@vue/compiler-ssr": "3.2.36", + "@vue/reactivity-transform": "3.2.36", + "@vue/shared": "3.2.36", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -2657,12 +2654,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.35.tgz", - "integrity": "sha512-dJyqB8fZbvVQEnWl5VGxkWHTqx0ERnZXXqInFzyOX8FpTEidmQbUSmDrXidea7bZTdeg6ly94kZFGPYXT29mgQ==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.36.tgz", + "integrity": "sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==", "dependencies": { - "@vue/compiler-dom": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/compiler-dom": "3.2.36", + "@vue/shared": "3.2.36" } }, "node_modules/@vue/devtools-api": { @@ -2671,60 +2668,60 @@ "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" }, "node_modules/@vue/reactivity": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.35.tgz", - "integrity": "sha512-6j9N9R1SwHVcJas4YqAzwdRS/cgmj3Z9aUert5Mv1jk5B9H9ivN/zot/fgMUbseWXigkkmX60OsfRbz49o8kCw==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.36.tgz", + "integrity": "sha512-c2qvopo0crh9A4GXi2/2kfGYMxsJW4tVILrqRPydVGZHhq0fnzy6qmclWOhBFckEhmyxmpHpdJtIRYGeKcuhnA==", "dependencies": { - "@vue/shared": "3.2.35" + "@vue/shared": "3.2.36" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.35.tgz", - "integrity": "sha512-VjdQU4nIrgsh1iPqAdYZufWgFqdH9fIl6ttO2PCFlLsrQl7b8BcuawM6moSBLF8damBzSNcqvbvQDBhsI3fyVQ==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.36.tgz", + "integrity": "sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.35", - "@vue/shared": "3.2.35", + "@vue/compiler-core": "3.2.36", + "@vue/shared": "3.2.36", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.35.tgz", - "integrity": "sha512-P8AeGPRGyIiYdOdvLc/7KR8VSdbUGG8Jxdx6Xlj5okEjyV9IYxeHRIQIoye85K0lZXBH4zuh1syD1mX+oZ0KqQ==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.36.tgz", + "integrity": "sha512-PTWBD+Lub+1U3/KhbCExrfxyS14hstLX+cBboxVHaz+kXoiDLNDEYAovPtxeTutbqtClIXtft+wcGdC+FUQ9qQ==", "dependencies": { - "@vue/reactivity": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/reactivity": "3.2.36", + "@vue/shared": "3.2.36" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.35.tgz", - "integrity": "sha512-M5xrVJ/b0KqssjPQMdpwLp3KwzG1Tn2w/IrOptVqGY5c9fEBluIbm18AeO4Fr3YxfeyaPWm1rY8POrEso0UE3w==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.36.tgz", + "integrity": "sha512-gYPYblm7QXHVuBohqNRRT7Wez0f2Mx2D40rb4fleehrJU9CnkjG0phhcGEZFfGwCmHZRqBCRgbFWE98bPULqkg==", "dependencies": { - "@vue/runtime-core": "3.2.35", - "@vue/shared": "3.2.35", + "@vue/runtime-core": "3.2.36", + "@vue/shared": "3.2.36", "csstype": "^2.6.8" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.35.tgz", - "integrity": "sha512-ZMF8V+bZ0EIjSB7yzPEmDlxRDOIXj04iqG4Rw/H5rIuBCf0b7rNTleiOldlX5haG++zUq6uiL2AVp/A9uyz+cw==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.36.tgz", + "integrity": "sha512-uZE0+jfye6yYXWvAQYeHZv+f50sRryvy16uiqzk3jn8hEY8zTjI+rzlmZSGoE915k+W/Ol9XSw6vxOUD8dGkUg==", "dependencies": { - "@vue/compiler-ssr": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/compiler-ssr": "3.2.36", + "@vue/shared": "3.2.36" }, "peerDependencies": { - "vue": "3.2.35" + "vue": "3.2.36" } }, "node_modules/@vue/shared": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.35.tgz", - "integrity": "sha512-/sxDqMcy0MsfQ3LQixKYDxIinDYNy1dXTsF2Am0pv0toImWabymFQ8cFmPJnPt+gh5ElKwwn7KzQcDbLHar60A==" + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz", + "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==" }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", @@ -5523,9 +5520,9 @@ } }, "node_modules/core-js": { - "version": "3.22.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz", - "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==", + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", + "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", "dev": true, "hasInstallScript": true, "funding": { @@ -6109,9 +6106,9 @@ } }, "node_modules/del": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.0.tgz", - "integrity": "sha512-OpcRktOt7G7HBfyxP0srBH4Djg4824EQORX8E1qvIhIzthNNArxxhrB/Mm7dRMiLi1nvFyUpDhzD2cTtbBhV8A==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "dependencies": { "globby": "^11.0.1", @@ -6762,9 +6759,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==", + "version": "1.4.139", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.139.tgz", + "integrity": "sha512-lYxzcUCjWxxVug+A7UxBCUiVr13TCjfZFYJS9Lq1VpU/ErwV4a6zUQo9dfojuGpw/L/x9REGuBl6ICQPGgbs3g==", "dev": true }, "node_modules/electron-updater": { @@ -16545,15 +16542,15 @@ } }, "node_modules/vue": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.35.tgz", - "integrity": "sha512-mc/15B0Wjd/4JMMGOcXUQAeXfjyg8MImA2EVZucNdyDPJe1nXhMNbYXOEVPEGfk/mCeyszCzl44dSAhHhQVH8g==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.36.tgz", + "integrity": "sha512-5yTXmrE6gW8IQgttzHW5bfBiFA6mx35ZXHjGLDmKYzW6MMmYvCwuKybANRepwkMYeXw2v1buGg3/lPICY5YlZw==", "dependencies": { - "@vue/compiler-dom": "3.2.35", - "@vue/compiler-sfc": "3.2.35", - "@vue/runtime-dom": "3.2.35", - "@vue/server-renderer": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/compiler-dom": "3.2.36", + "@vue/compiler-sfc": "3.2.36", + "@vue/runtime-dom": "3.2.36", + "@vue/server-renderer": "3.2.36", + "@vue/shared": "3.2.36" } }, "node_modules/vue-i18n": { @@ -17347,21 +17344,21 @@ "dev": true }, "@babel/core": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.0.tgz", - "integrity": "sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.0", + "@babel/helpers": "^7.18.2", "@babel/parser": "^7.18.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -17403,9 +17400,9 @@ } }, "@babel/eslint-parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", - "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz", + "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==", "dev": true, "requires": { "eslint-scope": "^5.1.1", @@ -17422,12 +17419,12 @@ } }, "@babel/generator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.0.tgz", - "integrity": "sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "dev": true, "requires": { - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "@jridgewell/gen-mapping": "^0.3.0", "jsesc": "^2.5.1" } @@ -17452,9 +17449,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "dev": true, "requires": { "@babel/compat-data": "^7.17.10", @@ -17505,13 +17502,10 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "dev": true }, "@babel/helper-explode-assignable-expression": { "version": "7.16.7", @@ -17615,12 +17609,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "dev": true, "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -17666,14 +17660,14 @@ } }, "@babel/helpers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.0.tgz", - "integrity": "sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/highlight": { @@ -18120,9 +18114,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.17.12.tgz", - "integrity": "sha512-76lTwYaCxw8ldT7tNmye4LLwSoKDbRCBzu6n/DcK/P3FOR29+38CIIaVIZfwol9By8W/QHORYEnYSLuvcQKrsg==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.17.12" @@ -18169,14 +18163,14 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz", - "integrity": "sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.0", "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-simple-access": "^7.18.2", "babel-plugin-dynamic-import-node": "^2.3.3" } }, @@ -18270,9 +18264,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.0.tgz", - "integrity": "sha512-7kM/jJ3DD/y1hDPn0jov12DoUIFsxLiItprhNydUSibxaywaxNqKwq+ODk72J9ePn4LWobIc5ik6TAJhVl8IkQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", + "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.16.7", @@ -18312,9 +18306,9 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz", - "integrity": "sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.17.12" @@ -18367,13 +18361,13 @@ } }, "@babel/preset-env": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.0.tgz", - "integrity": "sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", "dev": true, "requires": { "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", "@babel/helper-plugin-utils": "^7.17.12", "@babel/helper-validator-option": "^7.16.7", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", @@ -18418,12 +18412,12 @@ "@babel/plugin-transform-dotall-regex": "^7.16.7", "@babel/plugin-transform-duplicate-keys": "^7.17.12", "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.17.12", + "@babel/plugin-transform-for-of": "^7.18.1", "@babel/plugin-transform-function-name": "^7.16.7", "@babel/plugin-transform-literals": "^7.17.12", "@babel/plugin-transform-member-expression-literals": "^7.16.7", "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", "@babel/plugin-transform-modules-systemjs": "^7.18.0", "@babel/plugin-transform-modules-umd": "^7.18.0", "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", @@ -18436,12 +18430,12 @@ "@babel/plugin-transform-shorthand-properties": "^7.16.7", "@babel/plugin-transform-spread": "^7.17.12", "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.17.12", + "@babel/plugin-transform-template-literals": "^7.18.2", "@babel/plugin-transform-typeof-symbol": "^7.17.12", "@babel/plugin-transform-unicode-escapes": "^7.16.7", "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "babel-plugin-polyfill-corejs2": "^0.3.0", "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", @@ -18516,19 +18510,19 @@ } }, "@babel/traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.0.tgz", - "integrity": "sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.0", - "@babel/helper-environment-visitor": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", "@babel/helper-function-name": "^7.17.9", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -18567,9 +18561,9 @@ } }, "@babel/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.0.tgz", - "integrity": "sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz", + "integrity": "sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -19197,12 +19191,12 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.35.tgz", - "integrity": "sha512-1Mtmh8ceVUoUsn/PME5oM+Dus648rCeV/fBaZ4ERLFbTHBJXj6QmDPrSn9mfEyPDXE0RYIwyJNn884NdWK+Yiw==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.36.tgz", + "integrity": "sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.35", + "@vue/shared": "3.2.36", "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, @@ -19215,25 +19209,25 @@ } }, "@vue/compiler-dom": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.35.tgz", - "integrity": "sha512-I4bXB9MkRSTJ3gVXRQ4iaYJgABZGew+K/CCBoAh9fdLaeY7A7uUlS5nWGOlICSVfOH0/xk4QlcXeGZYCJkEleA==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.36.tgz", + "integrity": "sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==", "requires": { - "@vue/compiler-core": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/compiler-core": "3.2.36", + "@vue/shared": "3.2.36" } }, "@vue/compiler-sfc": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.35.tgz", - "integrity": "sha512-2wKQtnuHfwBFc7uV2Cmtms3Cc7u/u6kKJI3F+i0A+9xnuahK39cCMNJKHzI9x93Xai+uft64fDc5JSh8zDQBQA==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.36.tgz", + "integrity": "sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.35", - "@vue/compiler-dom": "3.2.35", - "@vue/compiler-ssr": "3.2.35", - "@vue/reactivity-transform": "3.2.35", - "@vue/shared": "3.2.35", + "@vue/compiler-core": "3.2.36", + "@vue/compiler-dom": "3.2.36", + "@vue/compiler-ssr": "3.2.36", + "@vue/reactivity-transform": "3.2.36", + "@vue/shared": "3.2.36", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -19248,12 +19242,12 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.35.tgz", - "integrity": "sha512-dJyqB8fZbvVQEnWl5VGxkWHTqx0ERnZXXqInFzyOX8FpTEidmQbUSmDrXidea7bZTdeg6ly94kZFGPYXT29mgQ==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.36.tgz", + "integrity": "sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==", "requires": { - "@vue/compiler-dom": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/compiler-dom": "3.2.36", + "@vue/shared": "3.2.36" } }, "@vue/devtools-api": { @@ -19262,57 +19256,57 @@ "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" }, "@vue/reactivity": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.35.tgz", - "integrity": "sha512-6j9N9R1SwHVcJas4YqAzwdRS/cgmj3Z9aUert5Mv1jk5B9H9ivN/zot/fgMUbseWXigkkmX60OsfRbz49o8kCw==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.36.tgz", + "integrity": "sha512-c2qvopo0crh9A4GXi2/2kfGYMxsJW4tVILrqRPydVGZHhq0fnzy6qmclWOhBFckEhmyxmpHpdJtIRYGeKcuhnA==", "requires": { - "@vue/shared": "3.2.35" + "@vue/shared": "3.2.36" } }, "@vue/reactivity-transform": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.35.tgz", - "integrity": "sha512-VjdQU4nIrgsh1iPqAdYZufWgFqdH9fIl6ttO2PCFlLsrQl7b8BcuawM6moSBLF8damBzSNcqvbvQDBhsI3fyVQ==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.36.tgz", + "integrity": "sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.35", - "@vue/shared": "3.2.35", + "@vue/compiler-core": "3.2.36", + "@vue/shared": "3.2.36", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.35.tgz", - "integrity": "sha512-P8AeGPRGyIiYdOdvLc/7KR8VSdbUGG8Jxdx6Xlj5okEjyV9IYxeHRIQIoye85K0lZXBH4zuh1syD1mX+oZ0KqQ==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.36.tgz", + "integrity": "sha512-PTWBD+Lub+1U3/KhbCExrfxyS14hstLX+cBboxVHaz+kXoiDLNDEYAovPtxeTutbqtClIXtft+wcGdC+FUQ9qQ==", "requires": { - "@vue/reactivity": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/reactivity": "3.2.36", + "@vue/shared": "3.2.36" } }, "@vue/runtime-dom": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.35.tgz", - "integrity": "sha512-M5xrVJ/b0KqssjPQMdpwLp3KwzG1Tn2w/IrOptVqGY5c9fEBluIbm18AeO4Fr3YxfeyaPWm1rY8POrEso0UE3w==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.36.tgz", + "integrity": "sha512-gYPYblm7QXHVuBohqNRRT7Wez0f2Mx2D40rb4fleehrJU9CnkjG0phhcGEZFfGwCmHZRqBCRgbFWE98bPULqkg==", "requires": { - "@vue/runtime-core": "3.2.35", - "@vue/shared": "3.2.35", + "@vue/runtime-core": "3.2.36", + "@vue/shared": "3.2.36", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.35.tgz", - "integrity": "sha512-ZMF8V+bZ0EIjSB7yzPEmDlxRDOIXj04iqG4Rw/H5rIuBCf0b7rNTleiOldlX5haG++zUq6uiL2AVp/A9uyz+cw==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.36.tgz", + "integrity": "sha512-uZE0+jfye6yYXWvAQYeHZv+f50sRryvy16uiqzk3jn8hEY8zTjI+rzlmZSGoE915k+W/Ol9XSw6vxOUD8dGkUg==", "requires": { - "@vue/compiler-ssr": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/compiler-ssr": "3.2.36", + "@vue/shared": "3.2.36" } }, "@vue/shared": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.35.tgz", - "integrity": "sha512-/sxDqMcy0MsfQ3LQixKYDxIinDYNy1dXTsF2Am0pv0toImWabymFQ8cFmPJnPt+gh5ElKwwn7KzQcDbLHar60A==" + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz", + "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==" }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -21582,9 +21576,9 @@ } }, "core-js": { - "version": "3.22.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.5.tgz", - "integrity": "sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==", + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", + "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", "dev": true }, "core-js-compat": { @@ -21994,9 +21988,9 @@ } }, "del": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.0.tgz", - "integrity": "sha512-OpcRktOt7G7HBfyxP0srBH4Djg4824EQORX8E1qvIhIzthNNArxxhrB/Mm7dRMiLi1nvFyUpDhzD2cTtbBhV8A==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "requires": { "globby": "^11.0.1", @@ -22522,9 +22516,9 @@ } }, "electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==", + "version": "1.4.139", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.139.tgz", + "integrity": "sha512-lYxzcUCjWxxVug+A7UxBCUiVr13TCjfZFYJS9Lq1VpU/ErwV4a6zUQo9dfojuGpw/L/x9REGuBl6ICQPGgbs3g==", "dev": true }, "electron-updater": { @@ -30058,15 +30052,15 @@ "dev": true }, "vue": { - "version": "3.2.35", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.35.tgz", - "integrity": "sha512-mc/15B0Wjd/4JMMGOcXUQAeXfjyg8MImA2EVZucNdyDPJe1nXhMNbYXOEVPEGfk/mCeyszCzl44dSAhHhQVH8g==", + "version": "3.2.36", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.36.tgz", + "integrity": "sha512-5yTXmrE6gW8IQgttzHW5bfBiFA6mx35ZXHjGLDmKYzW6MMmYvCwuKybANRepwkMYeXw2v1buGg3/lPICY5YlZw==", "requires": { - "@vue/compiler-dom": "3.2.35", - "@vue/compiler-sfc": "3.2.35", - "@vue/runtime-dom": "3.2.35", - "@vue/server-renderer": "3.2.35", - "@vue/shared": "3.2.35" + "@vue/compiler-dom": "3.2.36", + "@vue/compiler-sfc": "3.2.36", + "@vue/runtime-dom": "3.2.36", + "@vue/server-renderer": "3.2.36", + "@vue/shared": "3.2.36" } }, "vue-i18n": { diff --git a/package.json b/package.json index 4c85022b..bfafb9ec 100644 --- a/package.json +++ b/package.json @@ -178,30 +178,30 @@ }, "homepage": "https://github.com/lyswhut/lx-music-desktop#readme", "devDependencies": { - "@babel/core": "^7.18.0", - "@babel/eslint-parser": "^7.17.0", + "@babel/core": "^7.18.2", + "@babel/eslint-parser": "^7.18.2", "@babel/plugin-proposal-class-properties": "^7.17.12", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-modules-umd": "^7.18.0", - "@babel/plugin-transform-runtime": "^7.18.0", + "@babel/plugin-transform-runtime": "^7.18.2", "@babel/polyfill": "^7.12.1", - "@babel/preset-env": "^7.18.0", + "@babel/preset-env": "^7.18.2", "babel-loader": "^8.2.5", "babel-preset-minify": "^0.5.2", "browserslist": "^4.20.3", "chalk": "^4.1.2", "changelog-parser": "^2.8.1", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.22.5", + "core-js": "^3.22.7", "cross-env": "^7.0.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "del": "^6.1.0", + "del": "^6.1.1", "electron": "^13.6.9", "electron-builder": "^23.0.9", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.137", + "electron-to-chromium": "^1.4.139", "electron-updater": "^5.0.4", "eslint": "^8.16.0", "eslint-config-standard": "^17.0.0", @@ -259,7 +259,7 @@ "sortablejs": "^1.15.0", "tunnel": "^0.0.6", "utf-8-validate": "^5.0.9", - "vue": "^3.2.35", + "vue": "^3.2.36", "vue-i18n": "^9.2.0-beta.35", "vue-router": "^4.1.0-aabe509", "vuex": "^4.0.2" From ae18db45a430fa63ef9ce564a327dd678d25eb44 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 29 May 2022 10:39:14 +0800 Subject: [PATCH 04/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=8B=A5=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BA=86`http=5Fproxy`=E7=8E=AF=E5=A2=83=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E6=97=B6=EF=BC=8C=E4=BC=9A=E6=84=8F=E5=A4=96=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=AD=A4=E4=BB=A3=E7=90=86=E9=85=8D=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAQ.md | 2 +- publish/changeLog.md | 4 ++++ src/renderer/core/useApp/index.js | 4 ++++ src/renderer/core/useApp/useListAutoUpdate.js | 3 +-- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/FAQ.md b/FAQ.md index 452ac61a..3b3a9d91 100644 --- a/FAQ.md +++ b/FAQ.md @@ -114,7 +114,7 @@ 这些浏览器打开此窗口时界面可能是中文也可能是英文,英文的话按括号里的来 -1. 点击窗口顶部`应用程序(application)` +1. 点击窗口顶部`应用程序(application)`(若找不到此选项,则可能是被折叠起来了,看看顶部菜单的`>>`) 2. 展开左侧 `Cookies` 3. 点击 `https://music.163.com` 4. 在右侧窗口找到 `名称(Name)` 为 `MUSIC_U` 的这行,这行的第二列(`值(Value)`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制 diff --git a/publish/changeLog.md b/publish/changeLog.md index ec9bc710..ac01cffa 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,3 +1,7 @@ ### 新增 - 新增设置-以全屏模式启动设置 + +### 修复 + +- 修复若配置了`http_proxy`环境变量时,会意外使用此代理配置的问题 diff --git a/src/renderer/core/useApp/index.js b/src/renderer/core/useApp/index.js index 194dfc0c..68671fe9 100644 --- a/src/renderer/core/useApp/index.js +++ b/src/renderer/core/useApp/index.js @@ -52,6 +52,10 @@ export default () => { getEnvParams().then(envParams => { + // 移除代理相关的环境变量设置,防止请求库自动应用它们 + for (const key of Object.keys(process.env)) { + if (/^(?:http_proxy|https_proxy|NO_PROXY)$/i.test(key)) delete process.env[key] + } const envProxy = envParams.cmdParams['proxy-server'] if (envProxy && typeof envProxy == 'string') { const [host, port = ''] = envProxy.split(':') diff --git a/src/renderer/core/useApp/useListAutoUpdate.js b/src/renderer/core/useApp/useListAutoUpdate.js index 2d65efce..1e96a41f 100644 --- a/src/renderer/core/useApp/useListAutoUpdate.js +++ b/src/renderer/core/useApp/useListAutoUpdate.js @@ -18,8 +18,7 @@ export default () => { return () => { const waitUpdateLists = Object.entries(getListUpdateInfo()) - .filter(([id, info]) => info.isAutoUpdate) - .map(([id]) => userLists.find(l => l.id === id)) + .map(([id, info]) => info.isAutoUpdate && userLists.find(l => l.id === id)) .filter(_ => _) for (let i = 2; i > 0; i--) { handleSyncSourceList(waitUpdateLists) From 90ea0dc857462a6d60ceccd9ecb805f69e67e410 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 29 May 2022 10:48:05 +0800 Subject: [PATCH 05/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E8=A2=AB=E6=9B=BF=E6=8D=A2=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-config/renderer/webpack.config.dev.js | 1 + build-config/renderer/webpack.config.prod.js | 1 + src/renderer/core/useApp/index.js | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/build-config/renderer/webpack.config.dev.js b/build-config/renderer/webpack.config.dev.js index fba6e3fa..70d39f8d 100644 --- a/build-config/renderer/webpack.config.dev.js +++ b/build-config/renderer/webpack.config.dev.js @@ -14,6 +14,7 @@ module.exports = merge(baseConfig, { NODE_ENV: '"development"', ELECTRON_DISABLE_SECURITY_WARNINGS: 'true', }, + ENVIRONMENT: 'process.env', __VUE_OPTIONS_API__: 'true', __VUE_PROD_DEVTOOLS__: 'false', __static: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`, diff --git a/build-config/renderer/webpack.config.prod.js b/build-config/renderer/webpack.config.prod.js index 9ee5ebb8..6eb3a534 100644 --- a/build-config/renderer/webpack.config.prod.js +++ b/build-config/renderer/webpack.config.prod.js @@ -31,6 +31,7 @@ module.exports = merge(baseConfig, { 'process.env': { NODE_ENV: '"production"', }, + ENVIRONMENT: 'process.env', __VUE_OPTIONS_API__: 'true', __VUE_PROD_DEVTOOLS__: 'false', }), diff --git a/src/renderer/core/useApp/index.js b/src/renderer/core/useApp/index.js index 68671fe9..a486748d 100644 --- a/src/renderer/core/useApp/index.js +++ b/src/renderer/core/useApp/index.js @@ -53,7 +53,8 @@ export default () => { getEnvParams().then(envParams => { // 移除代理相关的环境变量设置,防止请求库自动应用它们 - for (const key of Object.keys(process.env)) { + // eslint-disable-next-line no-undef + for (const key of Object.keys(ENVIRONMENT)) { if (/^(?:http_proxy|https_proxy|NO_PROXY)$/i.test(key)) delete process.env[key] } const envProxy = envParams.cmdParams['proxy-server'] From 359514a83cbcb7b16081c1a64e8fe5cfef18038a Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 29 May 2022 10:58:04 +0800 Subject: [PATCH 06/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/core/useApp/index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/renderer/core/useApp/index.js b/src/renderer/core/useApp/index.js index a486748d..1bbf13b7 100644 --- a/src/renderer/core/useApp/index.js +++ b/src/renderer/core/useApp/index.js @@ -54,8 +54,9 @@ export default () => { getEnvParams().then(envParams => { // 移除代理相关的环境变量设置,防止请求库自动应用它们 // eslint-disable-next-line no-undef - for (const key of Object.keys(ENVIRONMENT)) { - if (/^(?:http_proxy|https_proxy|NO_PROXY)$/i.test(key)) delete process.env[key] + const processEnv = ENVIRONMENT + for (const key of Object.keys(processEnv)) { + if (/^(?:http_proxy|https_proxy|NO_PROXY)$/i.test(key)) delete processEnv[key] } const envProxy = envParams.cmdParams['proxy-server'] if (envProxy && typeof envProxy == 'string') { From 19dccffddecb429028bd4b8c857e3ce9c092208f Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 31 May 2022 09:13:59 +0800 Subject: [PATCH 07/32] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8D=A2=E6=BA=90?= =?UTF-8?q?=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/utils/music/index.js | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/renderer/utils/music/index.js b/src/renderer/utils/music/index.js index a591ab26..6e65e39c 100644 --- a/src/renderer/utils/music/index.js +++ b/src/renderer/utils/music/index.js @@ -68,6 +68,8 @@ export default { const item = arr[i] if (callback(item)) { delete item.sortedSinger + delete item.lowerCaseName + delete item.lowerCaseAlbumName tempResult.push(item) arr.splice(i, 1) } @@ -80,10 +82,11 @@ export default { const musicName = trimStr(musicInfo.name) const lowerCaseName = String(musicName).toLowerCase() const lowerCaseAlbumName = String(musicInfo.albumName).toLowerCase() + const excludeSource = ['xm'] for (const source of sources.sources) { - if (!sources[source.id].musicSearch || source.id === musicInfo.source || source.id === 'xm') continue + if (!sources[source.id].musicSearch || source.id === musicInfo.source || excludeSource.includes(source.id)) continue - tasks.push(sources[source.id].musicSearch.search(`${musicName} ${musicInfo.singer || ''}`.trim(), 1, { limit: 10 }).then(res => { + tasks.push(sources[source.id].musicSearch.search(`${musicName} ${musicInfo.singer || ''}`.trim(), 1, { limit: 25 }).then(res => { for (const item of res.list) { item.sortedSinger = String(sortSingle(item.singer)).toLowerCase() item.name = trimStr(item.name) @@ -110,18 +113,6 @@ export default { return item } } - for (const item of res.list) { - item.sortedSinger = String(sortSingle(item.singer)).toLowerCase() - item.name = trimStr(item.name) - item.lowerCaseName = String(item.name).toLowerCase() - item.lowerCaseAlbumName = String(item.albumName).toLowerCase() - // console.log(lowerCaseName, item.lowerCaseName) - if ( - item.sortedSinger === sortedSinger && item.interval === musicInfo.interval - ) { - return item - } - } return null }).catch(_ => null)) } @@ -135,6 +126,7 @@ export default { for (const item of result) { delete item.sortedSinger delete item.lowerCaseName + delete item.lowerCaseAlbumName } newResult.push(...result) } From 85e4c7555af110e7a307755ad10d2b115f34214e Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 4 Jun 2022 12:43:15 +0800 Subject: [PATCH 08/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E9=80=89?= =?UTF-8?q?=E5=90=8E=E5=88=87=E6=8D=A2=E5=88=97=E8=A1=A8=E5=90=8E=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E6=B8=85=E7=A9=BA=E5=A4=9A=E9=80=89=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/views/list/components/MusicList/useList.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index ac01cffa..6d1c85f0 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -5,3 +5,4 @@ ### 修复 - 修复若配置了`http_proxy`环境变量时,会意外使用此代理配置的问题 +- 修复多选后切换列表后不会清空多选内容的问题 diff --git a/src/renderer/views/list/components/MusicList/useList.js b/src/renderer/views/list/components/MusicList/useList.js index b342c9dc..73cd7d60 100644 --- a/src/renderer/views/list/components/MusicList/useList.js +++ b/src/renderer/views/list/components/MusicList/useList.js @@ -94,7 +94,7 @@ export default ({ list, setting }) => { } } - watch(() => list, removeAllSelect) + watch(list, removeAllSelect) return { selectedList, From fcfba8b12c70795e56012e6a6574b9a5cfa0fa04 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 4 Jun 2022 12:48:26 +0800 Subject: [PATCH 09/32] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=AD=8C=E6=9B=B2=E5=88=B0=E2=80=9C=E6=88=91=E7=9A=84=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E2=80=9D=E6=97=B6=EF=BC=8C=E8=8B=A5=E6=8C=89=E4=BD=8F?= =?UTF-8?q?`ctrl`=E9=94=AE=EF=BC=8C=E5=88=99=E4=B8=8D=E4=BC=9A=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=85=B3=E9=97=AD=E6=B7=BB=E5=8A=A0=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 4 ++ .../components/common/ListAddModal.vue | 6 +++ .../common/ListAddMultipleModal.vue | 6 +++ src/renderer/utils/compositions/useKeyDown.js | 38 +++++++++++++++++++ .../views/list/components/MusicList/index.vue | 2 +- 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/renderer/utils/compositions/useKeyDown.js diff --git a/publish/changeLog.md b/publish/changeLog.md index 6d1c85f0..a1369f92 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -2,6 +2,10 @@ - 新增设置-以全屏模式启动设置 +### 优化 + +- 添加歌曲到“我的列表”时,若按住`ctrl`键(Mac对应`Command`),则不会自动关闭添加窗口,这对想要将同一首(一批)歌曲添加到多个列表时会很有用 + ### 修复 - 修复若配置了`http_proxy`环境变量时,会意外使用此代理配置的问题 diff --git a/src/renderer/components/common/ListAddModal.vue b/src/renderer/components/common/ListAddModal.vue index 42f2007b..a9537a71 100644 --- a/src/renderer/components/common/ListAddModal.vue +++ b/src/renderer/components/common/ListAddModal.vue @@ -21,6 +21,7 @@ import { mapMutations } from 'vuex' import { computed } from '@renderer/utils/vueTools' import { defaultList, loveList, userLists } from '@renderer/core/share/list' import { getList } from '@renderer/core/share/utils' +import useKeyDown from '@renderer/utils/compositions/useKeyDown' export default { props: { @@ -57,6 +58,8 @@ export default { }, emits: ['update:show'], setup(props) { + const keyModDown = useKeyDown('mod') + const lists = computed(() => { if (!props.musicInfo) return [] const targetMid = props.musicInfo.songmid @@ -67,6 +70,7 @@ export default { ].filter(l => !props.excludeListId.includes(l.id)).map(l => ({ ...l, isExist: getList(l.id).some(s => s.songmid == targetMid) })) }) return { + keyModDown, lists, } }, @@ -103,6 +107,8 @@ export default { this.isMove ? this.listMove({ fromId: this.fromListId, toId: this.lists[index].id, musicInfo: this.musicInfo }) : this.listAdd({ id: this.lists[index].id, musicInfo: this.musicInfo }) + + if (this.keyModDown && !this.isMove) return this.$nextTick(() => { this.handleClose() }) diff --git a/src/renderer/components/common/ListAddMultipleModal.vue b/src/renderer/components/common/ListAddMultipleModal.vue index 8cc11cfe..9232ba7b 100644 --- a/src/renderer/components/common/ListAddMultipleModal.vue +++ b/src/renderer/components/common/ListAddMultipleModal.vue @@ -20,6 +20,7 @@ import { mapMutations } from 'vuex' import { computed } from '@renderer/utils/vueTools' import { defaultList, loveList, userLists } from '@renderer/core/share/list' +import useKeyDown from '@renderer/utils/compositions/useKeyDown' export default { props: { @@ -59,6 +60,8 @@ export default { }, emits: ['update:show', 'confirm'], setup(props) { + const keyModDown = useKeyDown('mod') + const lists = computed(() => { return [ defaultList, @@ -67,6 +70,7 @@ export default { ].filter(l => !props.excludeListId.includes(l.id)) }) return { + keyModDown, lists, } }, @@ -104,6 +108,8 @@ export default { this.isMove ? this.listMoveMultiple({ fromId: this.fromListId, toId: this.lists[index].id, list: this.musicList }) : this.listAddMultiple({ id: this.lists[index].id, list: this.musicList }) + + if (this.keyModDown && !this.isMove) return this.$nextTick(() => { this.handleClose() this.$emit('confirm') diff --git a/src/renderer/utils/compositions/useKeyDown.js b/src/renderer/utils/compositions/useKeyDown.js new file mode 100644 index 00000000..c536799d --- /dev/null +++ b/src/renderer/utils/compositions/useKeyDown.js @@ -0,0 +1,38 @@ +import { onMounted, onBeforeUnmount, ref } from '@renderer/utils/vueTools' + +export default name => { + const keyDown = ref(false) + const down = `key_${name}_down` + const up = `key_${name}_up` + + const handle_key_down = event => { + if (!keyDown.value) { + // console.log(event) + switch (event.event.target.tagName) { + case 'INPUT': + case 'SELECT': + case 'TEXTAREA': + return + default: if (event.event.target.isContentEditable) return + } + + keyDown.value = true + } + } + + const handle_key_up = () => { + if (keyDown.value) keyDown.value = false + } + + onMounted(() => { + window.eventHub.on(down, handle_key_down) + window.eventHub.on(up, handle_key_up) + }) + + onBeforeUnmount(() => { + window.eventHub.off(down, handle_key_down) + window.eventHub.off(up, handle_key_up) + }) + + return keyDown +} diff --git a/src/renderer/views/list/components/MusicList/index.vue b/src/renderer/views/list/components/MusicList/index.vue index 175c14fc..38a58ecd 100644 --- a/src/renderer/views/list/components/MusicList/index.vue +++ b/src/renderer/views/list/components/MusicList/index.vue @@ -90,7 +90,7 @@ export default { listItemHeight, handleSelectData, removeAllSelect, - } = useList({ list, setting, emit }) + } = useList({ list, setting }) const { handlePlayMusic, From 211f584bf82045fac953cd25462f6209c692f2ad Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 4 Jun 2022 13:03:20 +0800 Subject: [PATCH 10/32] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAQ.md | 533 +------------------------------------------ README.md | 8 +- publish/changeLog.md | 5 + 3 files changed, 10 insertions(+), 536 deletions(-) diff --git a/FAQ.md b/FAQ.md index 3b3a9d91..2b741077 100644 --- a/FAQ.md +++ b/FAQ.md @@ -1,535 +1,4 @@ # lx-music-desktop 常见问题 -在阅读本常见问题后,仍然无法解决你的问题,请提交issue或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题! +本文档已迁移到: -## ~~软件为什么没有桌面歌词与自定义列表功能~~ - -洛雪音乐的最初定位不是作为播放器开发的,它主要用于**查找歌曲**,软件的播放功能仅用于试听,不建议用作为常用播放器使用。 - -## 音乐播放列表机制 - -1. 默认情况下,播放搜索列表、歌单列表、排行榜列表的歌曲时会自动将该歌曲添加到“我的列表”的试听列表后再播放,这与手动将歌曲添加到试听列表,再去试听列表找到这首歌点播放是等价的 -2. 如果你想要播放多首歌曲,需要使用多选功能(若不知道如何多选请看常见问题)多选后,将这些歌曲添加到“我的列表”播放,或使用稍后播放功能播放 -3. 第2条适用于搜索列表、歌单列表、排行榜列表、我的列表中的歌曲 -4. 对于歌单详情列表,除了可以使用第2条的方式播放外,你可以点击详情页上面的播放按钮临时播放当前歌单,或点击收藏将当前歌单收藏到“我的列表”后再去播放 -5. 对于排行榜详情列表,除了可以使用第2条的方式播放外,你可以在右击排行榜名字后弹出的菜单中,播放或收藏整个排行榜,这与第四条的歌单中的播放、与收藏按钮功能一致 -6. v1.18.0及之后新增了“双击列表里的歌曲时自动切换到当前列表播放”设置,默认关闭,此功能仅对歌单、排行榜有效 -7. 将歌曲添加“稍后播放”后,它们会被放在一个优先级最高的特殊队列中,点击“下一曲”时会消耗该队列中的歌曲,并且无法通过“上一曲”功能播放该队列的上一首歌曲 -8. 在切歌时若不是通过“上一曲”、“下一曲”功能切歌(例如直接点击“排行榜列表”、“我的列表”中的歌曲切歌),“稍后播放”队列将会被清空 - -## 可用的鼠标、键盘快捷操作 - -- 鼠标右击播放栏的歌曲图片封面可以定位当前播放的歌曲 -- 鼠标右击播放栏进度条上的`LRC`按钮可以锁定/解锁桌面歌词 -- 歌曲搜索框、歌单链接输入框内鼠标右击可以将当前剪贴板上的文字粘贴到输入框内 -- 鼠标右击搜索界面中的单条搜索历史可以将其移除 -- 歌曲列表内的文字在选中后,鼠标右击可以复制已选中的文字,此功能只对搜索、歌单、排行榜、我的列表中的列表有效 -- 鼠标在播放详情页内右键双击可以关闭播放详情页 -- 鼠标左击播放栏上的歌曲名字可以将它复制 -- 鼠标右击设置-主题设置的“道法自然(英文Auto)”主题可以打开亮、暗主题设置窗口 -- 歌曲搜索框的候选内容可以用键盘上下方向键选择,按回车键搜索已选内容 -- 在歌单详情页按退格键可以返回歌单列表 -- 歌曲列表中可以使用`Ctrl`、`Shift`键进行多选,这类似Windows下的文件选择,详情看常见问题列表多选部分 -- 在我的列表内可以使用`Ctrl + f`键打开搜索框进行列表内歌曲搜索,搜索框按`Esc`键可以关闭搜索框,搜索框内按上下方向键可以选择歌曲,按`回车`键跳转到已选歌曲,按`Ctrl + 回车`可以跳转并播放已选歌曲 -- 在我的列表按住`Ctrl`键可以进入列表拖动模式,此时可以用鼠标拖动列表调整列表的位置 -- 编辑列表名时按`Esc`键可以取消编辑 -- 按`F11`可以进入、退出全屏状态(v1.19.0新增) - -注:在macOS上`Ctrl`键对应`Command`键 - -## 歌曲无法试听与下载 - -### 所有歌曲都提示 `请求异常😮,可以多试几次,若还是不行就换一首吧。。。` - -尝试更换网络,如切换到移动网络,若移动网络还是不行则尝试开关下手机的飞行模式后再试,
-若使用家庭网络的话,可尝试将光猫断电5分钟左右再通电联网后播放。 - -### 提示 `getaddrinfo EAI_AGAIN ...` 或 `无法连接到服务器` - -尝试在在浏览器打开这个地址`http://ts.tempmusic.tk`,浏览器显示404是正常的,如果不是404那就证明所在网络无法访问接口服务器。 -若网页无法打开或打开来不是404,则可能是DNS的问题,可以尝试以下办法: - -1. 将DNS改成自动获取试试(注:改完可能需要清理下系统DNS缓存才生效) -2. 手动把DNS改一下,不要用360的DNS,可以把DNS改成`223.6.6.6`、`8.8.8.8`(注:改完可能需要清理下系统DNS缓存才生效) - -改完DNS后可能需要重启软件才生效 - -### 通用解决方法 - -尝试按以下顺序解决: - -1. 尝试更新到最新版本 -2. 尝试切换其他歌曲(或直接搜索该歌曲),若全部歌曲都无法试听与下载则进行下一步 -3. 尝试到 设置-音乐来源 切换到其他接口 -4. 尝试切换网络,比如用手机开热点(所有歌曲都提示请求异常时可通过此方法解决,或等一两天后再试) -5. 若还不行请到这个链接查看详情: -6. 若没有在第5条链接中的第一条评论中看到接口无法使用的说明,则应该是你网络无法访问接口服务器的问题,如果接口有问题我会在那里说明。 - -想要知道是不是自己网络的问题可以看看`http://ts.tempmusic.tk`能不能在浏览器打开,浏览器显示404是正常的,如果不是404那就证明所在网络无法访问接口服务器。 -若网页无法打开或打来不是404,则应该是DNS的问题,可以尝试以下办法: - -1. 将DNS改成自动获取试试 -2. 手动把DNS改一下,不要用360的DNS,可以把DNS改成`223.6.6.6`、`8.8.8.8` - -## 列表多选 - -从v0.18.0起,列表多选需要键盘配合,想要多选前需按下`Shift`或`Ctrl`键然后再鼠标点击想要选中的内容即可触发多选机制,其中`Shift`键用于连续选择,`Ctrl`键用于不连续选择,`Ctrl+a`用于快速全选。 - -- 例子一:想要选中1-5项,则先按下`Shift`键后,鼠标点击第一项,再点击第五项即可完成选择; -- 例子二:想要选中1项与第3项,则先按下`Ctrl`键后,鼠标点击第一项,再点击第三项即可完成选择; -- 例子三:想要选中当前列表的全部内容,键盘先按下`Ctrl`键不放,然后按`a`键,即可完成选择。 - -用`Shift`或`Ctrl`选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按`Shift`或`Alt`键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S:`Ctrl`键对应Mac OS上的`Command`键) - -注:选完后可用鼠标右击弹出右键菜单操作已选的内容 - -## 播放整个歌单或排行榜 - -播放在线列表内的歌曲需要将它们都添加到我的列表才能播放,你可以全选列表内的歌曲然后添加到现有列表或者新创建的列表,然后去播放该列表内的歌曲。 - -从v1.10.0起,你可以右击排行榜名字的弹出菜单中直接播放或收藏整个排行榜的歌曲。 - -## 无法打开外部歌单 - -不支持跨源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);
-对于分享出来的歌单,若打开失败,可尝试先在浏览器中打开后,再从浏览器地址栏复制URL地址到软件打开;
-或者如果你知道歌单 id 也可以直接输入歌单 id 打开。
- -注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开 - -### 打开网易源“我喜欢”歌单 - -由于网易源的“我喜欢”歌单需要登录才能打开,从v1.13.0起提供了可以以注入token的方式打开网易源“我喜欢”歌单的功能,现若想要打开此类歌单,需要在歌单链接或id后面拼上 `###` 再加上有效的token,拼接格式:`[id|url]###token`,例子(最后面的xxxxxx替换成你的token): -- `https://music.163.com/#/playlist?id=11332&userid=123456###xxxxxx` -- `11332###xxxxxx` - -即:将 `歌单链接或者歌单ID`、`###`、`token` 这三者拼到一起。 - -#### `token`的获取方法 - -**注:`token`是你账号的临时身份令牌,不要随便泄露给他人**
-在浏览器打开登录网易云音乐并**登录**后,按`F12`,此时将会打开开发者窗口,然后按你使用的浏览器操作: - -##### Chrome、360、QQ等浏览器 - -这些浏览器打开此窗口时界面可能是中文也可能是英文,英文的话按括号里的来 - -1. 点击窗口顶部`应用程序(application)`(若找不到此选项,则可能是被折叠起来了,看看顶部菜单的`>>`) -2. 展开左侧 `Cookies` -3. 点击 `https://music.163.com` -4. 在右侧窗口找到 `名称(Name)` 为 `MUSIC_U` 的这行,这行的第二列(`值(Value)`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制 - -##### 火狐浏览器 - -1. 点击窗口顶部`存储` -2. 展开左侧 `Cookie` -3. 点击 `https://music.163.com` -4. 在右侧窗口找到 `名称` 为 `MUSIC_U` 的这行,这行的最后一列(`值`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制 - -## 更新已收藏的在线歌单 - -该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“更新”使用该功能, - -需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。 - -## 调整我的列表的列表顺序 - -按住Ctrl键(Mac上对应Command键)的时候将进入“拖动模式”,此时可以拖动列表的位置来调整顺序。 - -## 同步功能的使用(实验性,首次使用前建议先备份一次列表) - -**注意:由于同步传输时的数据是明文传输,请在受信任的网络下使用此功能!**
-此功能需要配合移动端使用,PC端与移动端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用方法: - -1. 在PC端的设置-数据同步开启同步功能(这时如果出现安全软件、防火墙等提示网络连接弹窗时需要点击允许) -2. 在移动端的设置-同步-同步服务器地址输入PC端显示的同步服务器地址(如果显示可以多个,则输入与**移动端上显示的本机地址**最相似的那个),端口号与PC端的同步端口一致(**输入完毕后需要按一下键盘上的回车键使输入的内容生效**) -3. 输入完这两项后点击“启动同步” -4. 若连接成功,对于首次同步时,若两边的设备的列表不为空,则PC端会弹出选择列表同步方式的弹窗,同步方式的说明弹窗下面有介绍 - -#### 关于同步弹窗的说明 - -对于首次同步时,若两边的设备的列表不为空,则PC端会弹出选择列表同步方式的弹窗,此弹窗内的同步方式仅针对**首次同步**,
-第一次同步成功后,以后再同步时将会自动根据两边设备的列表内容合并同步,不信你可以在同步完成后断开两边的连接,然后在两边增删一些歌曲或列表后再同步试试看~😉 - -#### 连接同步服务失败的可能原因 - -- 此功能需要PC端与移动端都连接在同一个路由器下的网络才能使用 -- 检查防火墙是否拦截了PC端的服务端口 -- 路由器若开启了AP隔离,则此功能无法使用 - -#### 连接同步服务失败的检查 - -1. 确保PC端的同步服务已启用成功(若连接码、同步服务地址没有内容,则证明服务启动失败,此时看启用同步功能复选框后面的错误信息自行解决,另外若你不知道端口号是什么意思就不要乱改,或不要改得太大与太小) -2. 在手机浏览器地址栏输入`http://x.x.x.x:23332/hello` **(注:将`x.x.x.x`换成PC端显示的同步服务地址,`23332`为PC端的端口号)** 后回车,若此地址可以打开并显示 `Hello~::^-^::`则证明移动端与PC端网络已互通, -3. 若移动端无法打开第2步的地址,则在PC端的浏览器地址栏输入并打开该地址,若可以打开,则要么是被LX Music PC端被电脑防火墙拦截,要么PC端与移动端不在同一个网络下,或者路由器开启了AP隔离(一般在公共网络下会出现这种情况) - -## 界面异常(界面显示不完整) - -### Windows 7 下界面异常 - -由于软件默认使用了透明窗口,根据Electron官方文档的[说明](https://www.electronjs.org/docs/latest/tutorial/window-customization#limitations): -> 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。 - -因此,当 win7 没有使用**Aero**主题时界面将会显示异常,开启AERO的方法请自行百度:`win7开启Aero效果`(开启后可看到任务栏变透明)。
-从`0.14.0`版本起不再强制要求开启透明效果,若你实在不想开启(若非电脑配置太低,墙裂建议开启!),可通过添加运行参数`-dt`来运行程序即可,例如:`.\lx-music-desktop.exe -dt`,添加方法可自行百度“给快捷方式加参数”,该参数的作用是用来控制程序是否使用非透明窗口运行。 - -注:启用**Aero**主题后,若软件出现黑边框,则重启软件即可恢复正常。 - -对于一些完全无法正常显示界面、开启了AERO后问题仍未解决的情况,请阅读下面的 **Window 7 下软件启动后,界面无法显示** 解决。 - -### Linux 下界面异常 - -根据Electron里issue的[解决方案](https://github.com/electron/electron/issues/2170#issuecomment-736223269),
-若你遇到透明问题可尝试添加启动参数 `-dha` 来禁用硬件加速,例如:`.\lx-music-desktop.exe -dha`。 - -注:v1.6.0及之后的版本才支持`-dha`参数 - -## Windows 7 下软件启动后,界面无法显示 - -对于软件启动后,可以在任务栏看到软件,但软件界面在桌面上无任何显示,或者整个界面偶尔闪烁的情况。
-原始问题看:
-解决办法:下载`.NET Framework 4.7.1`或**更高**版本安装即可(建议安装最新版,若安装过程中遇到问题可尝试自行百度解决)。
-微软官方下载地址:
-下载`Runtime(运行时)`版即可,安装完成后可能需要重启才生效,**若出现闪烁的情况**,可阅读下面的**Windows 7 下整个界面闪烁**解决。 - -## Windows 7 下整个界面闪烁(消失又出现) - -可尝试在关掉软件后,在桌面空白处鼠标右击,在弹出的菜单中选择**个性化**,在弹出的窗口中**切换到系统内置的Aero主题**,然后再启动软件看是否解决。 - -## Windows 7 下桌面歌词字体列表为空 - -Windows 7 系统系统需要安装 Powershell 5.1及以上版本才可正常获取系统字体列表。 - -想要查看当前 Powershell 版本可以在 Powershell 窗口输入命令:`Get-Host` - -最新 Powershell 安装包可以去官方 [Github releases](https://github.com/PowerShell/PowerShell/releases) 页下载,安装过程中若出现错误,请自行按照提示或者百度/Google解决。 - -## 安装版安装失败,提示安装程序并未成功地运行完成 - -对于部分电脑出现安装失败的问题,可以做出以下尝试: - -- 若你之前可以安装成功,但现在安装失败,就去**控制面板-程序和功能**或用第三方卸载工具看下有没有之前的版本残留,若同时在不同路径下安装了多个版本就可能会出现该问题,这种情况卸载掉所有版本重新安装即可 -- 清理安装路径下的残留文件 -- 清理注册表(建议用清理工具清理) - -## 软件无法联网 - -软件的排行榜、歌单、搜索列表**都**无法加载: - -- 检查是否在设置界面开启了代理(当代理乱设置时软件将无法联网) -- 检查软件是否被第三方软件/防火墙阻止联网 - -## 桌面歌词显示异常 - -### Windows 7 系统桌面歌词显示异常 - -Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看上面的 **Windows 7 下界面异常** 方法解决。 - -### MAC OS 系统、桌面歌词有残留阴影 - -此问题似乎是Electron的Bug,翻阅electron的issue列表发现该Bug以存在很久了,遗憾的是没有一直都没有修复,由于我没有装MAC平台的电脑,没法重现,就没再去electron提issue,更多信息看: - -- -- - -### Linux 系统下桌面歌词窗口异常 - -`v1.2.1`以前的版本在 Ubuntu 18.10 下第一次开启桌面歌词时歌词窗口会变白,需要关闭后再开启, -`v1.2.1`及之后的版本已修复该问题。 - -其他 Linux 系统未测试,如有异常也是意料之中,目前不打算去处理 Linux 平台的桌面歌词问题,但你可以尝试按照`Linux 下界面异常`的解决方案去解决。 - -## 歌曲下载失败,提示 `ENOENT: no such file or directory, mkdir` - -更换下载歌曲目录即可解决(一般是设置的歌曲下载目录没有读写权限导致的)。 - -## 使用软件时导致耳机意外关机 - -据反馈,漫步者部分型号的耳机与本软件一起使用时将会导致耳机意外关机, -详情看:, -若出现该问题可尝试添加`-dhmkh`启动参数解决,启动参数添加方法请自行百度“windows给快捷方式添加启动参数”。 - -## 软件安装包说明 - -软件发布页及网盘中有多个类型的安装文件,以下是对这些类型文件的说明: - -文件名带 `win_` 的是在Windows系统上运行的版本,
-其中安装版(Setup)可自动更新软件,
-绿色版(green)为免安装版,自动更新功能不可用; - -以 **`.dmg`** 结尾的文件为 MAC 版本; - -以 **`.AppImage`**、**`.deb`**、**`.rpm`**、**`.pacman`** 结尾的为 Linux 版本。 - -带有`x64`的为64位的系统版本,带`x86`的为32位的系统版本;若两个都带有的则为集合版,安装时会自动根据系统位数选择对应的版本安装;带有`arm`的为arm架构系统的版本。 - -## 软件更新 - -软件启动时若发现新版本时会自动从本仓库下载安装包,下载完毕会弹窗提示更新。
-若下载未完成时软件被关闭,下次启动软件会再次自动下载。
-若还是**更新失败**,可能是无法访问GitHub导致的,这时需要手动更新,即下载最新安装包直接覆盖安装即可。
-注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!
-注意:**Mac版**、**Linux**版不支持自动更新! - -### Windows 安装版在升级后,卸载了旧版本,但没有安装新版本 - -出现这个问题的原因一般是你当初在安装本软件的时候是以管理员身份安装的,运行软件的时候没有以管理员身份运行,所以卸载后无法再装上。 - -安装本软件时建议选择 `为当前用户安装`,并安装在当前用户目录或者安装在不需要管理员权限的目录(即其他分区下),不要选`为所有用户安装`。 - -## 缺少`xxx.dll` - -这个是电脑缺少某些dll导致的,正常的系统是没有这个问题的,可以尝试如下几个解决办法: - -- 以管理员权限打开`cmd`,输入`sfc /scannow`回车等待检查完成重启电脑 -- 若上面的方法**修复、重启**电脑后仍然不行,就自行百度弹出的**错误信息**看下别人是怎么解决的 - -## MAC OS无法启动软件,提示 lx-music-desktop 已损坏 - -这是因为软件没有签名,被系统阻止运行,
-在终端里输入 `sudo xattr -rd com.apple.quarantine /Applications/lx-music-desktop.app`,然后输入你的电脑密码即可 - -还可以参考: - -- -- - -## 数据存储路径 - -默认情况下,软件的数据存储在: - -- Windows:`%APPDATA%/lx-music-desktop` -- Linux:`$XDG_CONFIG_HOME/lx-music-desktop` 或 `~/.config/lx-music-desktop` -- macOS:`~/Library/Application/lx-music-desktop` - -在Windows平台下,若程序目录下存在`portable`目录,则自动使用此目录作为数据存储目录(v1.17.0新增)。 - -## 杀毒软件提示有病毒或恶意行为 - -本人只能保证我写的代码不包含任何**恶意代码**、**收集用户信息**的行为,并且软件代码已开源,请自行查阅,软件安装包也是由CI拉取源代码构建,构建日志:[GitHub Actions](https://github.com/lyswhut/lx-music-desktop/actions)
-尽管如此,但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时([供应链攻击](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/intelligence/supply-chain-malware)),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。
-当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。 - -从`v0.17.0`起,由于加入了音频输出设备切换功能,该功能调用了 [MediaDevices.enumerateDevices()](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/enumerateDevices),可能导致安全软件提示洛雪要访问摄像头(目前发现卡巴斯基会提示),但实际上没有用到摄像头,并且摄像头的提示灯也不会亮,你可以选择阻止访问。 - -最后,若出现杀毒软件报毒、存在恶意行为,请自行判断选择是否继续使用本软件! - -## 启动参数 - -目前软件已支持的启动参数如下: - -- `-search` 启动软件时自动在搜索框搜索指定的内容,例如:`-search="突然的自我 - 伍佰"` -- `-dha` 禁用硬件加速启动(Disable Hardware Acceleration),窗口显示有问题时可以尝试添加此参数启动(v1.6.0起新增) -- `-dt` 以非透明模式启动(Disable Transparent),对于未开启AERO效果的win7系统可加此参数启动以确保界面正常显示(注:该参数对桌面歌词无效),原来的`-nt`参数已重命名为`-dt`(v1.6.0起重命名) -- `-dhmkh` 禁用硬件媒体密钥处理(Disable Hardware Media Key Handling),此选项将禁用Chromium的Hardware Media Key Handling特性(v1.9.0起新增) -- `-proxy-server` 设置代理服务器,代理应用的所有流量,例:`-proxy-server="127.0.0.1:1081"`(不支持设置账号密码,v1.17.0起新增)。注:应用内“设置-网络-代理设置”仅代理接口请求的流量,优先级更高 -- `-proxy-bypass-list` 以分号分隔的主机列表绕过代理服务器,例:`-proxy-bypass-list=";*.google.com;*foo.com;1.2.3.4:5678"`(与`-proxy-server`一起使用才有效,v1.17.0起新增)。注:此设置对应用内接口请求无效 -- `-play` 启动时播放指定列表的音乐,参数说明: - - `type`:播放类型,目前固定为`songList` - - `source`:播放源,可用值为`kw/kg/tx/wy/mg/myList`,其中`kw/kg/tx/wy/mg`对应各源的在线列表,`myList`为本地列表 - - `link`:要播放的在线列表歌单链接、或ID,source为`kw/kg/tx/wy/mg`之一(在线列表)时必传,举例:`./lx-music-desktop -play="type=songList&source=kw&link=歌单URL or ID"`,注意:如果传入URL时必须对URL进行编码后再传入 - - `name`:要播放的本地列表歌单名字,source为`myList`时必传,举例:`./lx-music-desktop -play="type=songList&source=myList&name=默认列表"` - - `index`:从列表的哪个位置开始播放,选传,若不传默认播放第一首歌曲,举例:`./lx-music-desktop -play="type=songList&source=myList&name=默认列表&index=2"` - -## Scheme URL支持 - -从v1.17.0起支持 Scheme URL,可以使用此功能从浏览器等场景下调用LX Music,我们开发了一个[油猴脚本](https://github.com/lyswhut/lx-music-script#readme)配套使用
-脚本安装地址:
-以下是目前可用的Scheme URL调用方式: - -- URL统一以`lxmusic://`开头 -- 若无特别说明,源的可用值为:`kw/kg/tx/wy/mg` -- 若无特别说明,音质的可用值为:`128k/320k/flac/flac32bit` - -目前支持两种传参方式: - -- 通过`data`传参,以经过URL编码的JSON数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据,支持复杂的参数调用 -- 通过`URL`传参,适用于简单传参的调用,不需要转成JSON格式,例:`lxmusic://music/search/xxxx`,但仍然需要对数据进行URL编码,只适应于简单参数调用(v1.18.0新增) - -### `data`方式传参 - -以经过URL编码的JSON数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据,JSON数据内容取决于下表的参数部分 - -| 描述 | URL | 参数 -| --- | --- | --- -| 打开歌单 | `songlist/open` | `source`(源,必须)
`id`(歌单ID,可选)
`url`(歌单URL,可选)其中ID与URL必需传一个 -| 播放歌单 | `songlist/play` | `source`(源,必须)
`id`(歌单ID,可选)
`url`(歌单URL,可选)其中`id`与`url`必需传一个
`index`(播放第几首歌,可选,从0开始) -| 搜索歌曲 | `music/search` | `keywords`(要搜索的内容,必须)
`source`(源,可选) -| 播放歌曲 | `music/play` | `name`(歌曲名,必传)
`singer`(艺术家名,必传)
`source`(源,必传)
`songmid`(歌曲ID,必传)
`img`(歌曲图片链接,选传)
`albumId`(歌曲专辑ID,选传)
`interval`(格式化后的歌曲时长,选传,例:`03:55`)
`albumName`(歌曲专辑名称,选传)
`types`(歌曲可用音质数组,必传,
数组格式:`[{"type": "<音质>", size: "<格式化后的文件大小,选传>", hash: ""}]`,
例:`[{"type": "128k", size: "3.56M"}, {"type": "320k", size: null}]`)

以下为平台特定参数:
`hash`(歌曲hash,kg源必传)
`strMediaMid`(歌曲strMediaMid,tx源必传)
`albumMid`(歌曲albumMid,tx源专用,选传)
`copyrightId`(歌曲copyrightId,mg源必传)
`lrcUrl`(歌曲lrcUrl,mg源专用,选传) - -### `URL`方式传参 - -由于URL传参只适用于简单传参场景,所以目前只支持以下功能的调用: - -| 描述 | URL | 参数 -| --- | --- | --- -| 搜索歌曲 | `music/search/{source}/{keywords}` | `source`(源,可选)
`keywords`(要搜索的内容,必须)
例:`music/search/kw/xxx`、`music/search/xxx` -| 打开歌单 | `songlist/open/{source}/{id/url}` | `source`(源,必须)
`id/url`(歌单ID或歌单URL,必须)
例:`songlist/open/kw/123456` - -## 自定义源脚本编写说明 - -文件请使用UTF-8编码格式编写,脚本所用编程语言为JavaScript,可以使用ES6+语法,脚本与应用的交互是使用类似事件收发的方式进行,这是一个基本的脚本例子: - -```js -/** - * @name 测试音乐源 - * @description 我只是一个测试音乐源哦 - * @version 1.0.0 - * @author xxx - * @homepage http://xxx - */ - - -const { EVENT_NAMES, request, on, send } = window.lx - -const qualitys = { - kw: { - '128k': '128', - '320k': '320', - flac: 'flac', - }, -} -const httpRequest = (url, options) => new Promise((resolve, reject) => { - request(url, options, (err, resp) => { - if (err) return reject(err) - resolve(resp.body) - }) -}) - -const apis = { - kw: { - musicUrl({ songmid }, quality) { - return httpRequest('http://xxx').then(data => { - return data.url - }) - }, - }, -} - -// 注册应用API请求事件 -// source 音乐源,可能的值取决于初始化时传入的sources对象的源key值 -// info 请求附加信息,内容根据action变化 -// action 请求操作类型,目前只有musicUrl,即获取音乐URL链接, -// 当action为musicUrl时info的结构:{type, musicInfo}, -// info.type:音乐质量,可能的值有128k / 320k / flac(取决于初始化时对应源传入的qualitys值中的一个), -// info.musicInfo:音乐信息对象,里面有音乐ID、名字等信息 -on(EVENT_NAMES.request, ({ source, action, info }) => { - // 回调必须返回 Promise 对象 - switch (action) { - // action 为 musicUrl 时需要在 Promise 返回歌曲 url - case 'musicUrl': - return apis[source].musicUrl(info.musicInfo, qualitys[source][info.type]).catch(err => { - console.log(err) - return Promise.reject(err) - }) - } -}) - -// 脚本初始化完成后需要发送inited事件告知应用 -send(EVENT_NAMES.inited, { - status: true, // 初始化成功 or 失败 - openDevTools: false, // 是否打开开发者工具,方便用于调试脚本 - sources: { // 当前脚本支持的源 - kw: { // 支持的源对象,可用key值:kw/kg/tx/wy/mg - name: '酷我音乐', - type: 'music', // 目前固定为 music - actions: ['musicUrl'], // 目前固定为 ['musicUrl'] - qualitys: ['128k', '320k', 'flac'], // 当前脚本的该源所支持获取的Url音质,有效的值有:['128k', '320k', 'flac'] - }, - }, -}) - -``` - -### 自定义源信息 - -文件的开头必须包含以下注释: - -```js -/** - * @name 测试脚本 - * @description 我只是一个测试脚本 - * @version 1.0.0 - * @author xxx - * @homepage http://xxx - */ - -``` - -- `@name `:源的名字,建议不要过长,24个字符以内 -- `@description `:源的描述,建议不要过长,36个字符以内,可不填,不填时必须保留 @description -- `@version`:源的版本号,可不填,不填时可以删除 @version -- `@author `:脚本作者名字,可不填,不填时可以删除 @author -- `@homepage `:脚本主页,可不填,不填时可以删除 @homepage - -### `window.lx` - -应用为脚本暴露的API对象。 - -#### `window.lx.version` - -自定义源API版本,API变更时此版本号将会更改(新增于v1.14.0之后) - -#### `window.lx.EVENT_NAMES` - -常量事件名称对象,发送、注册事件时传入事件名时使用,可用值: - -| 事件名 | 描述 -| --- | --- -| `inited` | 脚本初始化完成后发送给应用的事件名,发送该事件时需要传入以下信息:`{status, sources, openDevTools}`
`status`:初始化结果(`true`成功,`false`失败)
`openDevTools`:是否打开DevTools,此选项可用于开发脚本时的调试
`sources`:支持的源信息对象,
`sources[kw/kg/tx/wy/mg].name`:源的名字(目前非必须)
`sources[kw/kg/tx/wy/mg].type`:源类型,目前固定值需为`music`
`sources[kw/kg/tx/wy/mg].actions`:支持的actions,由于目前只支持`musicUrl`,所以固定传`['musicUrl']`即可
`sources[kw/kg/tx/wy/mg].qualitys`:该源支持的音质列表,有效的值为`['128k', '320k', 'flac']`,该字段用于控制应用可用的音质类型 -| `request` | 应用API请求事件名,回调入参:`handler({ source, action, info})`,回调必须返回`Promise`对象
`source`:音乐源,可能的值取决于初始化时传入的`sources`对象的源key值
`info`:请求附加信息,内容根据`action`变化
`action`:请求操作类型,目前只有`musicUrl`,即获取音乐URL链接,需要在 Promise 返回歌曲 url,`info`的结构:`{type, musicInfo}`,`info.type`:音乐质量,可能的值有`128k` / `320k` / `flac`(取决于初始化时对应源传入的`qualitys`值中的一个),`info.musicInfo`:音乐信息对象,里面有音乐ID、名字等信息 -| `updateAlert` | 显示源更新弹窗,发送该事件时的参数:`{log, updateUrl}`
`log`:更新日志,必传,字符串类型,内容可以使用`\n`换行,最大长度1024,超过此长度后将被截取超出的部分
`updateUrl`:更新地址,用于引导用户去该地址更新源,选传,需为http协议的url地址,最大长度1024
此事件每次运行脚本只能调用一次(源版本v1.2.0新增)
例子:`lx.send(lx.EVENT_NAMES.updateAlert, { log: 'hello world', updateUrl: 'https://xxx.com' })` - - -#### `window.lx.on` - -事件注册方法,应用主动与脚本通信时使用: - -```js -/** - * @param event_name 事件名 - * @param handler 事件处理回调 -- 注意:注册的回调必须返回 Promise 对象 - */ -window.lx.on(event_name, handler) -``` - -**注意:** 注册的回调必须返回 `Promise` 对象。 - -#### `window.lx.send` - -事件发送方法,脚本主动与应用通信时使用: - -```js -/** - * @param event_name 事件名 - * @param datas 要传给应用的数据 - */ -window.lx.send(event_name, datas) -``` - -#### `window.lx.request` - -HTTP请求方法,用于发送HTTP请求,此HTTP请求方法不受跨域规则限制: - -```js -/** - * @param url 请求的URL - * @param options 请求选项,可用选项有 method / headers / body / form / formData / timeout - * @param callback 请求结果的回调 入参:err, resp, body - * @return 返回一个方法,调用此方法可以终止HTTP请求 - */ -const cancelHttp = window.lx.request(url, options, callback) -``` - -#### `window.lx.utils` - -应用提供给脚本的工具方法: - -- `window.lx.utils.buffer.from`:对应Node.js的 `Buffer.from` -- `window.lx.utils.buffer.bufToString`:Buffer转字符串 `bufToString(buffer, format)`,`format`对应Node.js `Buffer.toString`的参数(v1.14.0之后新增) -- `window.lx.utils.crypto.aesEncrypt`:AES加密 `aesEncrypt(buffer, mode, key, iv)` -- `window.lx.utils.crypto.md5`:MD5加密 `md5(str)` -- `window.lx.utils.crypto.randomBytes`:生成随机字符串 `randomBytes(size)` -- `window.lx.utils.crypto.rsaEncrypt`:RSA加密 `rsaEncrypt(buffer, key)` - -目前仅提供以上工具方法,如果需要其他方法可以开issue讨论。 diff --git a/README.md b/README.md index f80d3d44..f22441c2 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ 软件变化请查看:[更新日志](https://github.com/lyswhut/lx-music-desktop/blob/master/CHANGELOG.md)
软件下载请转到:[发布页面](https://github.com/lyswhut/lx-music-desktop/releases)
或者到网盘下载(网盘内有MAC、windows版):`https://www.lanzoui.com/b0bf2cfa/` 密码:`glqw`(若链接无法打开请百度:蓝奏云链接打不开)
-使用常见问题请转至:[常见问题](https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md)
+使用常见问题请转至:[常见问题](https://lyswhut.github.io/lx-music-doc/desktop/faq)
移动版项目地址: #### Scheme URL支持 @@ -56,7 +56,7 @@ 从v1.17.0起支持 Scheme URL,可以使用此功能从浏览器等场景下调用LX Music,我们开发了一个[油猴脚本](https://github.com/lyswhut/lx-music-script#readme)配套使用,
脚本安装地址:
-若你想自己调用LX Music,可以看[Scheme URL支持](https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md#scheme-url%E6%94%AF%E6%8C%81) +若你想自己调用LX Music,可以看[Scheme URL支持](https://lyswhut.github.io/lx-music-doc/desktop/scheme-url) #### 启动参数 @@ -70,7 +70,7 @@ - `-dt` 以非透明模式启动(Disable Transparent) - `-dhmkh` 禁用硬件媒体密钥处理(Disable Hardware Media Key Handling) -启动参数的详细说明请看[启动参数说明](https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md#%E5%90%AF%E5%8A%A8%E5%8F%82%E6%95%B0) +启动参数的详细说明请看[启动参数说明](https://lyswhut.github.io/lx-music-doc/desktop/run-params) #### 数据存储路径 @@ -110,7 +110,7 @@ npm run pack:linux ### 常见问题 -常见问题已移至: +常见问题已移至: ### 项目协议 diff --git a/publish/changeLog.md b/publish/changeLog.md index a1369f92..c6fa80ec 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -10,3 +10,8 @@ - 修复若配置了`http_proxy`环境变量时,会意外使用此代理配置的问题 - 修复多选后切换列表后不会清空多选内容的问题 + +### 文档 + +桌面版文档已迁移到: + From 6a78f659e3a3ecc38b0fe594443b2bd2870375dc Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 5 Jun 2022 14:51:46 +0800 Subject: [PATCH 11/32] =?UTF-8?q?=E7=A7=BB=E9=99=A4`http=5Fproxy`=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/modules/userApi/renderer/preload.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/modules/userApi/renderer/preload.js b/src/main/modules/userApi/renderer/preload.js index 31bfbc5f..dd83e1ff 100644 --- a/src/main/modules/userApi/renderer/preload.js +++ b/src/main/modules/userApi/renderer/preload.js @@ -3,6 +3,10 @@ const needle = require('needle') const { createCipheriv, publicEncrypt, constants, randomBytes, createHash } = require('crypto') const USER_API_RENDERER_EVENT_NAME = require('../rendererEvent/name') +for (const key of Object.keys(process.env)) { + if (/^(?:http_proxy|https_proxy|NO_PROXY)$/i.test(key)) delete process.env[key] +} + const sendMessage = (action, data, status, message) => { ipcRenderer.send(action, { data, status, message }) } From 5d20adc81e6d3a8d65e1986d856b036ae8d90802 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 5 Jun 2022 14:51:58 +0800 Subject: [PATCH 12/32] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 107 ++++++++++++++++++++-------------------------- package.json | 12 +++--- 2 files changed, 52 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2050fbe..f5ee2d87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "chalk": "^4.1.2", "changelog-parser": "^2.8.1", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.22.7", + "core-js": "^3.22.8", "cross-env": "^7.0.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", @@ -56,9 +56,9 @@ "electron-builder": "^23.0.9", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.139", + "electron-to-chromium": "^1.4.146", "electron-updater": "^5.0.4", - "eslint": "^8.16.0", + "eslint": "^8.17.0", "eslint-config-standard": "^17.0.0", "eslint-formatter-friendly": "git+https://github.com/lyswhut/eslint-friendly-formatter.git#2170d1320e2fad13615a9dcf229669f0bb473a53", "eslint-plugin-html": "^6.2.0", @@ -85,13 +85,13 @@ "svg-sprite-loader": "^6.0.11", "svg-transform-loader": "^2.0.13", "svgo-loader": "^3.0.0", - "terser-webpack-plugin": "^5.3.1", + "terser-webpack-plugin": "^5.3.3", "url-loader": "^4.1.1", "vue-loader": "^17.0.0", "vue-template-compiler": "^2.6.14", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.9.0", + "webpack-dev-server": "^4.9.1", "webpack-hot-middleware": "git+https://github.com/lyswhut/webpack-hot-middleware.git#329c4375134b89d39da23a56a94db651247c74a1", "webpack-merge": "^5.8.0" }, @@ -5520,9 +5520,9 @@ } }, "node_modules/core-js": { - "version": "3.22.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", - "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", + "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", "dev": true, "hasInstallScript": true, "funding": { @@ -6759,9 +6759,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.139", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.139.tgz", - "integrity": "sha512-lYxzcUCjWxxVug+A7UxBCUiVr13TCjfZFYJS9Lq1VpU/ErwV4a6zUQo9dfojuGpw/L/x9REGuBl6ICQPGgbs3g==", + "version": "1.4.146", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", + "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", "dev": true }, "node_modules/electron-updater": { @@ -7121,9 +7121,9 @@ } }, "node_modules/eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", - "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", + "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.0", @@ -15719,15 +15719,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", "dev": true, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.7", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", "terser": "^5.7.2" }, "engines": { @@ -15776,15 +15776,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -16656,9 +16647,9 @@ } }, "node_modules/webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -16828,9 +16819,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", - "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", + "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -16857,7 +16848,7 @@ "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" @@ -21576,9 +21567,9 @@ } }, "core-js": { - "version": "3.22.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.7.tgz", - "integrity": "sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg==", + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", + "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", "dev": true }, "core-js-compat": { @@ -22516,9 +22507,9 @@ } }, "electron-to-chromium": { - "version": "1.4.139", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.139.tgz", - "integrity": "sha512-lYxzcUCjWxxVug+A7UxBCUiVr13TCjfZFYJS9Lq1VpU/ErwV4a6zUQo9dfojuGpw/L/x9REGuBl6ICQPGgbs3g==", + "version": "1.4.146", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", + "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", "dev": true }, "electron-updater": { @@ -22784,9 +22775,9 @@ "dev": true }, "eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz", - "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", + "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.0", @@ -29431,15 +29422,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.7", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", "terser": "^5.7.2" }, "dependencies": { @@ -29459,12 +29450,6 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -30144,9 +30129,9 @@ } }, "webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -30287,9 +30272,9 @@ } }, "webpack-dev-server": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz", - "integrity": "sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", + "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -30316,7 +30301,7 @@ "schema-utils": "^4.0.0", "selfsigned": "^2.0.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", "ws": "^8.4.2" diff --git a/package.json b/package.json index bfafb9ec..f84902dc 100644 --- a/package.json +++ b/package.json @@ -192,7 +192,7 @@ "chalk": "^4.1.2", "changelog-parser": "^2.8.1", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.22.7", + "core-js": "^3.22.8", "cross-env": "^7.0.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", @@ -201,9 +201,9 @@ "electron-builder": "^23.0.9", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.139", + "electron-to-chromium": "^1.4.146", "electron-updater": "^5.0.4", - "eslint": "^8.16.0", + "eslint": "^8.17.0", "eslint-config-standard": "^17.0.0", "eslint-formatter-friendly": "git+https://github.com/lyswhut/eslint-friendly-formatter.git#2170d1320e2fad13615a9dcf229669f0bb473a53", "eslint-plugin-html": "^6.2.0", @@ -230,13 +230,13 @@ "svg-sprite-loader": "^6.0.11", "svg-transform-loader": "^2.0.13", "svgo-loader": "^3.0.0", - "terser-webpack-plugin": "^5.3.1", + "terser-webpack-plugin": "^5.3.3", "url-loader": "^4.1.1", "vue-loader": "^17.0.0", "vue-template-compiler": "^2.6.14", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.9.0", + "webpack-dev-server": "^4.9.1", "webpack-hot-middleware": "git+https://github.com/lyswhut/webpack-hot-middleware.git#329c4375134b89d39da23a56a94db651247c74a1", "webpack-merge": "^5.8.0" }, From 01f9fd502f03bbdb3f8a006182063399626617ae Mon Sep 17 00:00:00 2001 From: lyswhut Date: Mon, 6 Jun 2022 10:00:12 +0800 Subject: [PATCH 13/32] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAQ.md | 542 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 542 insertions(+) diff --git a/FAQ.md b/FAQ.md index 2b741077..57481be2 100644 --- a/FAQ.md +++ b/FAQ.md @@ -2,3 +2,545 @@ 本文档已迁移到: +在阅读本常见问题后,仍然无法解决你的问题,请提交issue或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题! + +## ~~软件为什么没有桌面歌词与自定义列表功能~~ + +洛雪音乐的最初定位不是作为播放器开发的,它主要用于**查找歌曲**,软件的播放功能仅用于试听,不建议用作为常用播放器使用。 + +## 音乐播放列表机制 + +1. 默认情况下,播放搜索列表、歌单列表、排行榜列表的歌曲时会自动将该歌曲添加到“我的列表”的试听列表后再播放,这与手动将歌曲添加到试听列表,再去试听列表找到这首歌点播放是等价的 +2. 如果你想要播放多首歌曲,需要使用多选功能(若不知道如何多选请看常见问题)多选后,将这些歌曲添加到“我的列表”播放,或使用稍后播放功能播放 +3. 第2条适用于搜索列表、歌单列表、排行榜列表、我的列表中的歌曲 +4. 对于歌单详情列表,除了可以使用第2条的方式播放外,你可以点击详情页上面的播放按钮临时播放当前歌单,或点击收藏将当前歌单收藏到“我的列表”后再去播放 +5. 对于排行榜详情列表,除了可以使用第2条的方式播放外,你可以在右击排行榜名字后弹出的菜单中,播放或收藏整个排行榜,这与第四条的歌单中的播放、与收藏按钮功能一致 +6. v1.18.0及之后新增了“双击列表里的歌曲时自动切换到当前列表播放”设置,默认关闭,此功能仅对歌单、排行榜有效 +7. 将歌曲添加“稍后播放”后,它们会被放在一个优先级最高的特殊队列中,点击“下一曲”时会消耗该队列中的歌曲,并且无法通过“上一曲”功能播放该队列的上一首歌曲 +8. 在切歌时若不是通过“上一曲”、“下一曲”功能切歌(例如直接点击“排行榜列表”、“我的列表”中的歌曲切歌),“稍后播放”队列将会被清空 + +## 可用的鼠标、键盘快捷操作 + +- 鼠标右击播放栏的歌曲图片封面可以定位当前播放的歌曲 +- 鼠标右击播放栏进度条上的`LRC`按钮可以锁定/解锁桌面歌词 +- 歌曲搜索框、歌单链接输入框内鼠标右击可以将当前剪贴板上的文字粘贴到输入框内 +- 鼠标右击搜索界面中的单条搜索历史可以将其移除 +- 歌曲列表内的文字在选中后,鼠标右击可以复制已选中的文字,此功能只对搜索、歌单、排行榜、我的列表中的列表有效 +- 鼠标在播放详情页内右键双击可以关闭播放详情页 +- 鼠标左击播放栏上的歌曲名字可以将它复制 +- 鼠标右击设置-主题设置的“道法自然(英文Auto)”主题可以打开亮、暗主题设置窗口 +- 歌曲搜索框的候选内容可以用键盘上下方向键选择,按回车键搜索已选内容 +- 在歌单详情页按退格键可以返回歌单列表 +- 歌曲列表中可以使用`Ctrl`、`Shift`键进行多选,这类似Windows下的文件选择,详情看常见问题列表多选部分 +- 在我的列表内可以使用`Ctrl + f`键打开搜索框进行列表内歌曲搜索,搜索框按`Esc`键可以关闭搜索框,搜索框内按上下方向键可以选择歌曲,按`回车`键跳转到已选歌曲,按`Ctrl + 回车`可以跳转并播放已选歌曲 +- 在我的列表按住`Ctrl`键可以进入列表拖动模式,此时可以用鼠标拖动列表调整列表的位置 +- 编辑列表名时按`Esc`键可以取消编辑 +- 按`F11`可以进入、退出全屏状态(v1.19.0新增) + +注:在macOS上`Ctrl`键对应`Command`键 + +## 歌曲无法试听与下载 + +### 所有歌曲都提示 `请求异常😮,可以多试几次,若还是不行就换一首吧。。。` + +尝试更换网络,如切换到移动网络,若移动网络还是不行则尝试开关下手机的飞行模式后再试,
+若使用家庭网络的话,可尝试将光猫断电5分钟左右再通电联网后播放。 + +### 提示 `getaddrinfo EAI_AGAIN ...` 或 `无法连接到服务器` + +尝试在在浏览器打开这个地址`http://ts.tempmusic.tk`,浏览器显示404是正常的,如果不是404那就证明所在网络无法访问接口服务器。 +若网页无法打开或打开来不是404,则可能是DNS的问题,可以尝试以下办法: + +1. 将DNS改成自动获取试试(注:改完可能需要清理下系统DNS缓存才生效) +2. 手动把DNS改一下,不要用360的DNS,可以把DNS改成`223.6.6.6`、`8.8.8.8`(注:改完可能需要清理下系统DNS缓存才生效) + +改完DNS后可能需要重启软件才生效 + +### 通用解决方法 + +尝试按以下顺序解决: + +1. 尝试更新到最新版本 +2. 尝试切换其他歌曲(或直接搜索该歌曲),若全部歌曲都无法试听与下载则进行下一步 +3. 尝试到 设置-音乐来源 切换到其他接口 +4. 尝试切换网络,比如用手机开热点(所有歌曲都提示请求异常时可通过此方法解决,或等一两天后再试) +5. 若还不行请到这个链接查看详情: +6. 若没有在第5条链接中的第一条评论中看到接口无法使用的说明,则应该是你网络无法访问接口服务器的问题,如果接口有问题我会在那里说明。 + +想要知道是不是自己网络的问题可以看看`http://ts.tempmusic.tk`能不能在浏览器打开,浏览器显示404是正常的,如果不是404那就证明所在网络无法访问接口服务器。 +若网页无法打开或打来不是404,则应该是DNS的问题,可以尝试以下办法: + +1. 将DNS改成自动获取试试 +2. 手动把DNS改一下,不要用360的DNS,可以把DNS改成`223.6.6.6`、`8.8.8.8` + +### Windows版提示 `音频加载错误,5秒后切换下一首` + +尝试关闭 Internet选项 的代理设置。 + +如果你不知道怎么做,可以尝试按以下步骤去做: + +按windows+r键打开“运行”窗口,输入`inetcpl.cpl`后回车,在打开的 Internet选项 对话框中,切换到 连接 -> 局域网设置,在弹出的新窗口中把代理服务器下的勾去掉,如果自动配置下的勾也有被勾选,那么建议也去掉,最后按确定关闭所有弹窗。 + + +## 列表多选 + +从v0.18.0起,列表多选需要键盘配合,想要多选前需按下`Shift`或`Ctrl`键然后再鼠标点击想要选中的内容即可触发多选机制,其中`Shift`键用于连续选择,`Ctrl`键用于不连续选择,`Ctrl+a`用于快速全选。 + +- 例子一:想要选中1-5项,则先按下`Shift`键后,鼠标点击第一项,再点击第五项即可完成选择; +- 例子二:想要选中1项与第3项,则先按下`Ctrl`键后,鼠标点击第一项,再点击第三项即可完成选择; +- 例子三:想要选中当前列表的全部内容,键盘先按下`Ctrl`键不放,然后按`a`键,即可完成选择。 + +用`Shift`或`Ctrl`选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按`Shift`或`Alt`键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S:`Ctrl`键对应Mac OS上的`Command`键) + +注:选完后可用鼠标右击弹出右键菜单操作已选的内容 + +## 播放整个歌单或排行榜 + +播放在线列表内的歌曲需要将它们都添加到我的列表才能播放,你可以全选列表内的歌曲然后添加到现有列表或者新创建的列表,然后去播放该列表内的歌曲。 + +从v1.10.0起,你可以右击排行榜名字的弹出菜单中直接播放或收藏整个排行榜的歌曲。 + +## 无法打开外部歌单 + +不支持跨源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);
+对于分享出来的歌单,若打开失败,可尝试先在浏览器中打开后,再从浏览器地址栏复制URL地址到软件打开;
+或者如果你知道歌单 id 也可以直接输入歌单 id 打开。
+ +注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开 + +### 打开网易源“我喜欢”歌单 + +由于网易源的“我喜欢”歌单需要登录才能打开,从v1.13.0起提供了可以以注入token的方式打开网易源“我喜欢”歌单的功能,现若想要打开此类歌单,需要在歌单链接或id后面拼上 `###` 再加上有效的token,拼接格式:`[id|url]###token`,例子(最后面的xxxxxx替换成你的token): +- `https://music.163.com/#/playlist?id=11332&userid=123456###xxxxxx` +- `11332###xxxxxx` + +即:将 `歌单链接或者歌单ID`、`###`、`token` 这三者拼到一起。 + +#### `token`的获取方法 + +**注:`token`是你账号的临时身份令牌,不要随便泄露给他人**
+在浏览器打开登录网易云音乐并**登录**后,按`F12`,此时将会打开开发者窗口,然后按你使用的浏览器操作: + +##### Chrome、360、QQ等浏览器 + +这些浏览器打开此窗口时界面可能是中文也可能是英文,英文的话按括号里的来 + +1. 点击窗口顶部`应用程序(application)`(若找不到此选项,则可能是被折叠起来了,看看顶部菜单的`>>`) +2. 展开左侧 `Cookies` +3. 点击 `https://music.163.com` +4. 在右侧窗口找到 `名称(Name)` 为 `MUSIC_U` 的这行,这行的第二列(`值(Value)`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制 + +##### 火狐浏览器 + +1. 点击窗口顶部`存储` +2. 展开左侧 `Cookie` +3. 点击 `https://music.163.com` +4. 在右侧窗口找到 `名称` 为 `MUSIC_U` 的这行,这行的最后一列(`值`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制 + +## 更新已收藏的在线歌单 + +该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“更新”使用该功能, + +需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。 + +## 调整我的列表的列表顺序 + +按住Ctrl键(Mac上对应Command键)的时候将进入“拖动模式”,此时可以拖动列表的位置来调整顺序。 + +## 同步功能的使用(实验性,首次使用前建议先备份一次列表) + +**注意:由于同步传输时的数据是明文传输,请在受信任的网络下使用此功能!**
+此功能需要配合移动端使用,PC端与移动端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用方法: + +1. 在PC端的设置-数据同步开启同步功能(这时如果出现安全软件、防火墙等提示网络连接弹窗时需要点击允许) +2. 在移动端的设置-同步-同步服务器地址输入PC端显示的同步服务器地址(如果显示可以多个,则输入与**移动端上显示的本机地址**最相似的那个),端口号与PC端的同步端口一致(**输入完毕后需要按一下键盘上的回车键使输入的内容生效**) +3. 输入完这两项后点击“启动同步” +4. 若连接成功,对于首次同步时,若两边的设备的列表不为空,则PC端会弹出选择列表同步方式的弹窗,同步方式的说明弹窗下面有介绍 + +#### 关于同步弹窗的说明 + +对于首次同步时,若两边的设备的列表不为空,则PC端会弹出选择列表同步方式的弹窗,此弹窗内的同步方式仅针对**首次同步**,
+第一次同步成功后,以后再同步时将会自动根据两边设备的列表内容合并同步,不信你可以在同步完成后断开两边的连接,然后在两边增删一些歌曲或列表后再同步试试看~😉 + +#### 连接同步服务失败的可能原因 + +- 此功能需要PC端与移动端都连接在同一个路由器下的网络才能使用 +- 检查防火墙是否拦截了PC端的服务端口 +- 路由器若开启了AP隔离,则此功能无法使用 + +#### 连接同步服务失败的检查 + +1. 确保PC端的同步服务已启用成功(若连接码、同步服务地址没有内容,则证明服务启动失败,此时看启用同步功能复选框后面的错误信息自行解决,另外若你不知道端口号是什么意思就不要乱改,或不要改得太大与太小) +2. 在手机浏览器地址栏输入`http://x.x.x.x:23332/hello` **(注:将`x.x.x.x`换成PC端显示的同步服务地址,`23332`为PC端的端口号)** 后回车,若此地址可以打开并显示 `Hello~::^-^::`则证明移动端与PC端网络已互通, +3. 若移动端无法打开第2步的地址,则在PC端的浏览器地址栏输入并打开该地址,若可以打开,则要么是被LX Music PC端被电脑防火墙拦截,要么PC端与移动端不在同一个网络下,或者路由器开启了AP隔离(一般在公共网络下会出现这种情况) + +## 界面异常(界面显示不完整) + +### Windows 7 下界面异常 + +由于软件默认使用了透明窗口,根据Electron官方文档的[说明](https://www.electronjs.org/docs/latest/tutorial/window-customization#limitations): +> 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。 + +因此,当 win7 没有使用**Aero**主题时界面将会显示异常,开启AERO的方法请自行百度:`win7开启Aero效果`(开启后可看到任务栏变透明)。
+从`0.14.0`版本起不再强制要求开启透明效果,若你实在不想开启(若非电脑配置太低,墙裂建议开启!),可通过添加运行参数`-dt`来运行程序即可,例如:`.\lx-music-desktop.exe -dt`,添加方法可自行百度“给快捷方式加参数”,该参数的作用是用来控制程序是否使用非透明窗口运行。 + +注:启用**Aero**主题后,若软件出现黑边框,则重启软件即可恢复正常。 + +对于一些完全无法正常显示界面、开启了AERO后问题仍未解决的情况,请阅读下面的 **Window 7 下软件启动后,界面无法显示** 解决。 + +### Linux 下界面异常 + +根据Electron里issue的[解决方案](https://github.com/electron/electron/issues/2170#issuecomment-736223269),
+若你遇到透明问题可尝试添加启动参数 `-dha` 来禁用硬件加速,例如:`.\lx-music-desktop.exe -dha`。 + +注:v1.6.0及之后的版本才支持`-dha`参数 + +## Windows 7 下软件启动后,界面无法显示 + +对于软件启动后,可以在任务栏看到软件,但软件界面在桌面上无任何显示,或者整个界面偶尔闪烁的情况。
+原始问题看:
+解决办法:下载`.NET Framework 4.7.1`或**更高**版本安装即可(建议安装最新版,若安装过程中遇到问题可尝试自行百度解决)。
+微软官方下载地址:
+下载`Runtime(运行时)`版即可,安装完成后可能需要重启才生效,**若出现闪烁的情况**,可阅读下面的**Windows 7 下整个界面闪烁**解决。 + +## Windows 7 下整个界面闪烁(消失又出现) + +可尝试在关掉软件后,在桌面空白处鼠标右击,在弹出的菜单中选择**个性化**,在弹出的窗口中**切换到系统内置的Aero主题**,然后再启动软件看是否解决。 + +## Windows 7 下桌面歌词字体列表为空 + +Windows 7 系统系统需要安装 Powershell 5.1及以上版本才可正常获取系统字体列表。 + +想要查看当前 Powershell 版本可以在 Powershell 窗口输入命令:`Get-Host` + +最新 Powershell 安装包可以去官方 [Github releases](https://github.com/PowerShell/PowerShell/releases) 页下载,安装过程中若出现错误,请自行按照提示或者百度/Google解决。 + +## 安装版安装失败,提示安装程序并未成功地运行完成 + +对于部分电脑出现安装失败的问题,可以做出以下尝试: + +- 若你之前可以安装成功,但现在安装失败,就去**控制面板-程序和功能**或用第三方卸载工具看下有没有之前的版本残留,若同时在不同路径下安装了多个版本就可能会出现该问题,这种情况卸载掉所有版本重新安装即可 +- 清理安装路径下的残留文件 +- 清理注册表(建议用清理工具清理) + +## 软件无法联网 + +软件的排行榜、歌单、搜索列表**都**无法加载: + +- 检查是否在设置界面开启了代理(当代理乱设置时软件将无法联网) +- 检查软件是否被第三方软件/防火墙阻止联网 + +## 桌面歌词显示异常 + +### Windows 7 系统桌面歌词显示异常 + +Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看上面的 **Windows 7 下界面异常** 方法解决。 + +### MAC OS 系统、桌面歌词有残留阴影 + +此问题似乎是Electron的Bug,翻阅electron的issue列表发现该Bug以存在很久了,遗憾的是没有一直都没有修复,由于我没有装MAC平台的电脑,没法重现,就没再去electron提issue,更多信息看: + +- +- + +### Linux 系统下桌面歌词窗口异常 + +`v1.2.1`以前的版本在 Ubuntu 18.10 下第一次开启桌面歌词时歌词窗口会变白,需要关闭后再开启, +`v1.2.1`及之后的版本已修复该问题。 + +其他 Linux 系统未测试,如有异常也是意料之中,目前不打算去处理 Linux 平台的桌面歌词问题,但你可以尝试按照`Linux 下界面异常`的解决方案去解决。 + +## 歌曲下载失败,提示 `ENOENT: no such file or directory, mkdir` + +更换下载歌曲目录即可解决(一般是设置的歌曲下载目录没有读写权限导致的)。 + +## 使用软件时导致耳机意外关机 + +据反馈,漫步者部分型号的耳机与本软件一起使用时将会导致耳机意外关机, +详情看:, +若出现该问题可尝试添加`-dhmkh`启动参数解决,启动参数添加方法请自行百度“windows给快捷方式添加启动参数”。 + +## 软件安装包说明 + +软件发布页及网盘中有多个类型的安装文件,以下是对这些类型文件的说明: + +文件名带 `win_` 的是在Windows系统上运行的版本,
+其中安装版(Setup)可自动更新软件,
+绿色版(green)为免安装版,自动更新功能不可用; + +以 **`.dmg`** 结尾的文件为 MAC 版本; + +以 **`.AppImage`**、**`.deb`**、**`.rpm`**、**`.pacman`** 结尾的为 Linux 版本。 + +带有`x64`的为64位的系统版本,带`x86`的为32位的系统版本;若两个都带有的则为集合版,安装时会自动根据系统位数选择对应的版本安装;带有`arm`的为arm架构系统的版本。 + +## 软件更新 + +软件启动时若发现新版本时会自动从本仓库下载安装包,下载完毕会弹窗提示更新。
+若下载未完成时软件被关闭,下次启动软件会再次自动下载。
+若还是**更新失败**,可能是无法访问GitHub导致的,这时需要手动更新,即下载最新安装包直接覆盖安装即可。
+注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!
+注意:**Mac版**、**Linux**版不支持自动更新! + +### Windows 安装版在升级后,卸载了旧版本,但没有安装新版本 + +出现这个问题的原因一般是你当初在安装本软件的时候是以管理员身份安装的,运行软件的时候没有以管理员身份运行,所以卸载后无法再装上。 + +安装本软件时建议选择 `为当前用户安装`,并安装在当前用户目录或者安装在不需要管理员权限的目录(即其他分区下),不要选`为所有用户安装`。 + +## 缺少`xxx.dll` + +这个是电脑缺少某些dll导致的,正常的系统是没有这个问题的,可以尝试如下几个解决办法: + +- 以管理员权限打开`cmd`,输入`sfc /scannow`回车等待检查完成重启电脑 +- 若上面的方法**修复、重启**电脑后仍然不行,就自行百度弹出的**错误信息**看下别人是怎么解决的 + +## MAC OS无法启动软件,提示 lx-music-desktop 已损坏 + +这是因为软件没有签名,被系统阻止运行,
+在终端里输入 `sudo xattr -rd com.apple.quarantine /Applications/lx-music-desktop.app`,然后输入你的电脑密码即可 + +还可以参考: + +- +- + +## 数据存储路径 + +默认情况下,软件的数据存储在: + +- Windows:`%APPDATA%/lx-music-desktop` +- Linux:`$XDG_CONFIG_HOME/lx-music-desktop` 或 `~/.config/lx-music-desktop` +- macOS:`~/Library/Application/lx-music-desktop` + +在Windows平台下,若程序目录下存在`portable`目录,则自动使用此目录作为数据存储目录(v1.17.0新增)。 + +## 杀毒软件提示有病毒或恶意行为 + +本人只能保证我写的代码不包含任何**恶意代码**、**收集用户信息**的行为,并且软件代码已开源,请自行查阅,软件安装包也是由CI拉取源代码构建,构建日志:[GitHub Actions](https://github.com/lyswhut/lx-music-desktop/actions)
+尽管如此,但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时([供应链攻击](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/intelligence/supply-chain-malware)),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。
+当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。 + +从`v0.17.0`起,由于加入了音频输出设备切换功能,该功能调用了 [MediaDevices.enumerateDevices()](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/enumerateDevices),可能导致安全软件提示洛雪要访问摄像头(目前发现卡巴斯基会提示),但实际上没有用到摄像头,并且摄像头的提示灯也不会亮,你可以选择阻止访问。 + +最后,若出现杀毒软件报毒、存在恶意行为,请自行判断选择是否继续使用本软件! + +## 启动参数 + +目前软件已支持的启动参数如下: + +- `-search` 启动软件时自动在搜索框搜索指定的内容,例如:`-search="突然的自我 - 伍佰"` +- `-dha` 禁用硬件加速启动(Disable Hardware Acceleration),窗口显示有问题时可以尝试添加此参数启动(v1.6.0起新增) +- `-dt` 以非透明模式启动(Disable Transparent),对于未开启AERO效果的win7系统可加此参数启动以确保界面正常显示(注:该参数对桌面歌词无效),原来的`-nt`参数已重命名为`-dt`(v1.6.0起重命名) +- `-dhmkh` 禁用硬件媒体密钥处理(Disable Hardware Media Key Handling),此选项将禁用Chromium的Hardware Media Key Handling特性(v1.9.0起新增) +- `-proxy-server` 设置代理服务器,代理应用的所有流量,例:`-proxy-server="127.0.0.1:1081"`(不支持设置账号密码,v1.17.0起新增)。注:应用内“设置-网络-代理设置”仅代理接口请求的流量,优先级更高 +- `-proxy-bypass-list` 以分号分隔的主机列表绕过代理服务器,例:`-proxy-bypass-list=";*.google.com;*foo.com;1.2.3.4:5678"`(与`-proxy-server`一起使用才有效,v1.17.0起新增)。注:此设置对应用内接口请求无效 +- `-play` 启动时播放指定列表的音乐,参数说明: + - `type`:播放类型,目前固定为`songList` + - `source`:播放源,可用值为`kw/kg/tx/wy/mg/myList`,其中`kw/kg/tx/wy/mg`对应各源的在线列表,`myList`为本地列表 + - `link`:要播放的在线列表歌单链接、或ID,source为`kw/kg/tx/wy/mg`之一(在线列表)时必传,举例:`./lx-music-desktop -play="type=songList&source=kw&link=歌单URL or ID"`,注意:如果传入URL时必须对URL进行编码后再传入 + - `name`:要播放的本地列表歌单名字,source为`myList`时必传,举例:`./lx-music-desktop -play="type=songList&source=myList&name=默认列表"` + - `index`:从列表的哪个位置开始播放,选传,若不传默认播放第一首歌曲,举例:`./lx-music-desktop -play="type=songList&source=myList&name=默认列表&index=2"` + +## Scheme URL支持 + +从v1.17.0起支持 Scheme URL,可以使用此功能从浏览器等场景下调用LX Music,我们开发了一个[油猴脚本](https://github.com/lyswhut/lx-music-script#readme)配套使用
+脚本安装地址:
+以下是目前可用的Scheme URL调用方式: + +- URL统一以`lxmusic://`开头 +- 若无特别说明,源的可用值为:`kw/kg/tx/wy/mg` +- 若无特别说明,音质的可用值为:`128k/320k/flac/flac32bit` + +目前支持两种传参方式: + +- 通过`data`传参,以经过URL编码的JSON数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据,支持复杂的参数调用 +- 通过`URL`传参,适用于简单传参的调用,不需要转成JSON格式,例:`lxmusic://music/search/xxxx`,但仍然需要对数据进行URL编码,只适应于简单参数调用(v1.18.0新增) + +### `data`方式传参 + +以经过URL编码的JSON数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据,JSON数据内容取决于下表的参数部分 + +| 描述 | URL | 参数 +| --- | --- | --- +| 打开歌单 | `songlist/open` | `source`(源,必须)
`id`(歌单ID,可选)
`url`(歌单URL,可选)其中ID与URL必需传一个 +| 播放歌单 | `songlist/play` | `source`(源,必须)
`id`(歌单ID,可选)
`url`(歌单URL,可选)其中`id`与`url`必需传一个
`index`(播放第几首歌,可选,从0开始) +| 搜索歌曲 | `music/search` | `keywords`(要搜索的内容,必须)
`source`(源,可选) +| 播放歌曲 | `music/play` | `name`(歌曲名,必传)
`singer`(艺术家名,必传)
`source`(源,必传)
`songmid`(歌曲ID,必传)
`img`(歌曲图片链接,选传)
`albumId`(歌曲专辑ID,选传)
`interval`(格式化后的歌曲时长,选传,例:`03:55`)
`albumName`(歌曲专辑名称,选传)
`types`(歌曲可用音质数组,必传,
数组格式:`[{"type": "<音质>", size: "<格式化后的文件大小,选传>", hash: ""}]`,
例:`[{"type": "128k", size: "3.56M"}, {"type": "320k", size: null}]`)

以下为平台特定参数:
`hash`(歌曲hash,kg源必传)
`strMediaMid`(歌曲strMediaMid,tx源必传)
`albumMid`(歌曲albumMid,tx源专用,选传)
`copyrightId`(歌曲copyrightId,mg源必传)
`lrcUrl`(歌曲lrcUrl,mg源专用,选传) + +### `URL`方式传参 + +由于URL传参只适用于简单传参场景,所以目前只支持以下功能的调用: + +| 描述 | URL | 参数 +| --- | --- | --- +| 搜索歌曲 | `music/search/{source}/{keywords}` | `source`(源,可选)
`keywords`(要搜索的内容,必须)
例:`music/search/kw/xxx`、`music/search/xxx` +| 打开歌单 | `songlist/open/{source}/{id/url}` | `source`(源,必须)
`id/url`(歌单ID或歌单URL,必须)
例:`songlist/open/kw/123456` + +## 自定义源脚本编写说明 + +文件请使用UTF-8编码格式编写,脚本所用编程语言为JavaScript,可以使用ES6+语法,脚本与应用的交互是使用类似事件收发的方式进行,这是一个基本的脚本例子: + +```js +/** + * @name 测试音乐源 + * @description 我只是一个测试音乐源哦 + * @version 1.0.0 + * @author xxx + * @homepage http://xxx + */ + + +const { EVENT_NAMES, request, on, send } = window.lx + +const qualitys = { + kw: { + '128k': '128', + '320k': '320', + flac: 'flac', + }, +} +const httpRequest = (url, options) => new Promise((resolve, reject) => { + request(url, options, (err, resp) => { + if (err) return reject(err) + resolve(resp.body) + }) +}) + +const apis = { + kw: { + musicUrl({ songmid }, quality) { + return httpRequest('http://xxx').then(data => { + return data.url + }) + }, + }, +} + +// 注册应用API请求事件 +// source 音乐源,可能的值取决于初始化时传入的sources对象的源key值 +// info 请求附加信息,内容根据action变化 +// action 请求操作类型,目前只有musicUrl,即获取音乐URL链接, +// 当action为musicUrl时info的结构:{type, musicInfo}, +// info.type:音乐质量,可能的值有128k / 320k / flac(取决于初始化时对应源传入的qualitys值中的一个), +// info.musicInfo:音乐信息对象,里面有音乐ID、名字等信息 +on(EVENT_NAMES.request, ({ source, action, info }) => { + // 回调必须返回 Promise 对象 + switch (action) { + // action 为 musicUrl 时需要在 Promise 返回歌曲 url + case 'musicUrl': + return apis[source].musicUrl(info.musicInfo, qualitys[source][info.type]).catch(err => { + console.log(err) + return Promise.reject(err) + }) + } +}) + +// 脚本初始化完成后需要发送inited事件告知应用 +send(EVENT_NAMES.inited, { + status: true, // 初始化成功 or 失败 + openDevTools: false, // 是否打开开发者工具,方便用于调试脚本 + sources: { // 当前脚本支持的源 + kw: { // 支持的源对象,可用key值:kw/kg/tx/wy/mg + name: '酷我音乐', + type: 'music', // 目前固定为 music + actions: ['musicUrl'], // 目前固定为 ['musicUrl'] + qualitys: ['128k', '320k', 'flac'], // 当前脚本的该源所支持获取的Url音质,有效的值有:['128k', '320k', 'flac'] + }, + }, +}) + +``` + +### 自定义源信息 + +文件的开头必须包含以下注释: + +```js +/** + * @name 测试脚本 + * @description 我只是一个测试脚本 + * @version 1.0.0 + * @author xxx + * @homepage http://xxx + */ + +``` + +- `@name `:源的名字,建议不要过长,24个字符以内 +- `@description `:源的描述,建议不要过长,36个字符以内,可不填,不填时必须保留 @description +- `@version`:源的版本号,可不填,不填时可以删除 @version +- `@author `:脚本作者名字,可不填,不填时可以删除 @author +- `@homepage `:脚本主页,可不填,不填时可以删除 @homepage + +### `window.lx` + +应用为脚本暴露的API对象。 + +#### `window.lx.version` + +自定义源API版本,API变更时此版本号将会更改(新增于v1.14.0之后) + +#### `window.lx.EVENT_NAMES` + +常量事件名称对象,发送、注册事件时传入事件名时使用,可用值: + +| 事件名 | 描述 +| --- | --- +| `inited` | 脚本初始化完成后发送给应用的事件名,发送该事件时需要传入以下信息:`{status, sources, openDevTools}`
`status`:初始化结果(`true`成功,`false`失败)
`openDevTools`:是否打开DevTools,此选项可用于开发脚本时的调试
`sources`:支持的源信息对象,
`sources[kw/kg/tx/wy/mg].name`:源的名字(目前非必须)
`sources[kw/kg/tx/wy/mg].type`:源类型,目前固定值需为`music`
`sources[kw/kg/tx/wy/mg].actions`:支持的actions,由于目前只支持`musicUrl`,所以固定传`['musicUrl']`即可
`sources[kw/kg/tx/wy/mg].qualitys`:该源支持的音质列表,有效的值为`['128k', '320k', 'flac']`,该字段用于控制应用可用的音质类型 +| `request` | 应用API请求事件名,回调入参:`handler({ source, action, info})`,回调必须返回`Promise`对象
`source`:音乐源,可能的值取决于初始化时传入的`sources`对象的源key值
`info`:请求附加信息,内容根据`action`变化
`action`:请求操作类型,目前只有`musicUrl`,即获取音乐URL链接,需要在 Promise 返回歌曲 url,`info`的结构:`{type, musicInfo}`,`info.type`:音乐质量,可能的值有`128k` / `320k` / `flac`(取决于初始化时对应源传入的`qualitys`值中的一个),`info.musicInfo`:音乐信息对象,里面有音乐ID、名字等信息 +| `updateAlert` | 显示源更新弹窗,发送该事件时的参数:`{log, updateUrl}`
`log`:更新日志,必传,字符串类型,内容可以使用`\n`换行,最大长度1024,超过此长度后将被截取超出的部分
`updateUrl`:更新地址,用于引导用户去该地址更新源,选传,需为http协议的url地址,最大长度1024
此事件每次运行脚本只能调用一次(源版本v1.2.0新增)
例子:`lx.send(lx.EVENT_NAMES.updateAlert, { log: 'hello world', updateUrl: 'https://xxx.com' })` + + +#### `window.lx.on` + +事件注册方法,应用主动与脚本通信时使用: + +```js +/** + * @param event_name 事件名 + * @param handler 事件处理回调 -- 注意:注册的回调必须返回 Promise 对象 + */ +window.lx.on(event_name, handler) +``` + +**注意:** 注册的回调必须返回 `Promise` 对象。 + +#### `window.lx.send` + +事件发送方法,脚本主动与应用通信时使用: + +```js +/** + * @param event_name 事件名 + * @param datas 要传给应用的数据 + */ +window.lx.send(event_name, datas) +``` + +#### `window.lx.request` + +HTTP请求方法,用于发送HTTP请求,此HTTP请求方法不受跨域规则限制: + +```js +/** + * @param url 请求的URL + * @param options 请求选项,可用选项有 method / headers / body / form / formData / timeout + * @param callback 请求结果的回调 入参:err, resp, body + * @return 返回一个方法,调用此方法可以终止HTTP请求 + */ +const cancelHttp = window.lx.request(url, options, callback) +``` + +#### `window.lx.utils` + +应用提供给脚本的工具方法: + +- `window.lx.utils.buffer.from`:对应Node.js的 `Buffer.from` +- `window.lx.utils.buffer.bufToString`:Buffer转字符串 `bufToString(buffer, format)`,`format`对应Node.js `Buffer.toString`的参数(v1.14.0之后新增) +- `window.lx.utils.crypto.aesEncrypt`:AES加密 `aesEncrypt(buffer, mode, key, iv)` +- `window.lx.utils.crypto.md5`:MD5加密 `md5(str)` +- `window.lx.utils.crypto.randomBytes`:生成随机字符串 `randomBytes(size)` +- `window.lx.utils.crypto.rsaEncrypt`:RSA加密 `rsaEncrypt(buffer, key)` + +目前仅提供以上工具方法,如果需要其他方法可以开issue讨论。 From f4147cce37c3e0c2aea65df7ca21a72be0e95fce Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 7 Jun 2022 08:51:41 +0800 Subject: [PATCH 14/32] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E8=80=85=E5=B7=A5=E5=85=B7=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/index.js | 1 + .../setting/components/SettingUpdate.vue | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/index.js b/src/main/index.js index 3fb0de7d..6e3194f7 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -195,6 +195,7 @@ function createWindow() { global.modules.mainWindow.loadURL(winURL + `?dt=${!!global.envParams.cmdParams.dt}&dark=${shouldUseDarkColors}&theme=${themeClass}`) winEvent(global.modules.mainWindow) + if (global.envParams.cmdParams.odt) require('@main/utils').openDevTools(global.modules.mainWindow.webContents) // global.modules.mainWindow.webContents.openDevTools() if (!isDev) autoUpdate() diff --git a/src/renderer/views/setting/components/SettingUpdate.vue b/src/renderer/views/setting/components/SettingUpdate.vue index 2a093dc8..3f31aeef 100644 --- a/src/renderer/views/setting/components/SettingUpdate.vue +++ b/src/renderer/views/setting/components/SettingUpdate.vue @@ -3,7 +3,7 @@ dt#update {{$t('setting__update')}} dd p.small | {{$t('setting__update_latest_label')}}{{versionInfo.newVersion ? versionInfo.newVersion.version : $t('setting__update_unknown')}} - p.small {{$t('setting__update_current_label')}}{{versionInfo.version}} + p.small(@click="handleOPenDevTools") {{$t('setting__update_current_label')}}{{versionInfo.version}} p.small(v-if="versionInfo.downloadProgress" style="line-height: 1.5;") | {{$t('setting__update_downloading')}} br @@ -20,12 +20,30 @@ import { versionInfo } from '@renderer/core/share' import { sizeFormate } from '@renderer/utils/tools' // import { openDirInExplorer, selectDir } from '@renderer/utils' import { currentStting } from '../setting' +import { rendererSend, NAMES } from '@common/ipc' export default { name: 'SettingUpdate', setup() { + let lastClickTime = 0 + let clickNum = 0 + const { t } = useI18n() + const handleOPenDevTools = () => { + if (window.performance.now() - lastClickTime > 1000) { + if (clickNum > 0) clickNum = 0 + } else { + if (clickNum > 6) { + rendererSend(NAMES.mainWindow.open_dev_tools) + clickNum = 0 + return + } + } + clickNum++ + lastClickTime = window.performance.now() + } + const downloadProgress = computed(() => { return versionInfo.downloadProgress ? `${versionInfo.downloadProgress.percent.toFixed(2)}% - ${sizeFormate(versionInfo.downloadProgress.transferred)}/${sizeFormate(versionInfo.downloadProgress.total)} - ${sizeFormate(versionInfo.downloadProgress.bytesPerSecond)}/s` @@ -40,6 +58,7 @@ export default { currentStting, versionInfo, downloadProgress, + handleOPenDevTools, showUpdateModal, } }, From b8a221e67e7f71e79fe29ed486f4be5493812cc1 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 7 Jun 2022 08:52:19 +0800 Subject: [PATCH 15/32] =?UTF-8?q?=E6=9B=B4=E6=96=B0t=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAQ.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index 57481be2..e6ca7ed3 100644 --- a/FAQ.md +++ b/FAQ.md @@ -36,6 +36,7 @@ - 在我的列表按住`Ctrl`键可以进入列表拖动模式,此时可以用鼠标拖动列表调整列表的位置 - 编辑列表名时按`Esc`键可以取消编辑 - 按`F11`可以进入、退出全屏状态(v1.19.0新增) +- 在歌曲添加弹窗中,若按住`Ctrl`键后再点击列表名,将不会自动关闭添加窗口,这对想要将同一首(一批)歌曲添加到多个列表时会很有用(v1.22.0新增) 注:在macOS上`Ctrl`键对应`Command`键 @@ -73,7 +74,7 @@ 1. 将DNS改成自动获取试试 2. 手动把DNS改一下,不要用360的DNS,可以把DNS改成`223.6.6.6`、`8.8.8.8` -### Windows版提示 `音频加载错误,5秒后切换下一首` +### Windows版所有歌曲都提示 `音频加载错误,5秒后切换下一首` 尝试关闭 Internet选项 的代理设置。 @@ -81,6 +82,7 @@ 按windows+r键打开“运行”窗口,输入`inetcpl.cpl`后回车,在打开的 Internet选项 对话框中,切换到 连接 -> 局域网设置,在弹出的新窗口中把代理服务器下的勾去掉,如果自动配置下的勾也有被勾选,那么建议也去掉,最后按确定关闭所有弹窗。 +> 来源: ## 列表多选 From f2e3d4a53d516e2b93050eff910c02ea20e5032e Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 7 Jun 2022 19:49:01 +0800 Subject: [PATCH 16/32] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f84902dc..c39afa4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.21.0", + "version": "1.22.0-beta", "description": "一个免费的音乐查找助手", "main": "./dist/main.js", "productName": "lx-music-desktop", From bb8509a21cf6fc39499c293bcd9577304f54e0f1 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 9 Jun 2022 13:03:46 +0800 Subject: [PATCH 17/32] =?UTF-8?q?=E6=94=AF=E6=8C=81mg=E6=BA=90=E9=80=90?= =?UTF-8?q?=E5=AD=97=E6=AD=8C=E8=AF=8D=E7=9A=84=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/store/modules/player.js | 1 + src/renderer/utils/music/mg/leaderboard.js | 2 + src/renderer/utils/music/mg/lyric.js | 118 ++++++++++++++++++++- src/renderer/utils/music/mg/mrc.js | 104 ++++++++++++++++++ src/renderer/utils/music/mg/musicSearch.js | 4 +- src/renderer/utils/music/mg/songList.js | 2 + 7 files changed, 226 insertions(+), 6 deletions(-) create mode 100644 src/renderer/utils/music/mg/mrc.js diff --git a/publish/changeLog.md b/publish/changeLog.md index c6fa80ec..26c37c37 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -5,6 +5,7 @@ ### 优化 - 添加歌曲到“我的列表”时,若按住`ctrl`键(Mac对应`Command`),则不会自动关闭添加窗口,这对想要将同一首(一批)歌曲添加到多个列表时会很有用 +- 支持mg源逐字歌词的播放,感谢 @mozbugbox 提供的帮助 ### 修复 diff --git a/src/renderer/store/modules/player.js b/src/renderer/store/modules/player.js index 9da84e1f..6eb62b01 100644 --- a/src/renderer/store/modules/player.js +++ b/src/renderer/store/modules/player.js @@ -238,6 +238,7 @@ const actions = { switch (musicInfo.source) { case 'kg': case 'kw': + case 'mg': break default: return buildLyricInfo(lrcInfo, musicInfo) diff --git a/src/renderer/utils/music/mg/leaderboard.js b/src/renderer/utils/music/mg/leaderboard.js index caa35c90..10d38081 100644 --- a/src/renderer/utils/music/mg/leaderboard.js +++ b/src/renderer/utils/music/mg/leaderboard.js @@ -148,6 +148,8 @@ export default { img: item.albumImgs && item.albumImgs.length ? item.albumImgs[0].img : null, lrc: null, lrcUrl: item.lrcUrl, + mrcUrl: item.mrcUrl, + trcUrl: item.trcUrl, otherSource: null, types, _types, diff --git a/src/renderer/utils/music/mg/lyric.js b/src/renderer/utils/music/mg/lyric.js index 308ceaee..fc75e8e5 100644 --- a/src/renderer/utils/music/mg/lyric.js +++ b/src/renderer/utils/music/mg/lyric.js @@ -1,14 +1,112 @@ import { httpFetch } from '../../request' +import musicSearch from './musicSearch' +import { decrypt } from './mrc' + +const mrcTools = { + rxps: { + lineTime: /^\s*\[(\d+),\d+\]/, + wordTime: /\(\d+,\d+\)/, + wordTimeAll: /(\(\d+,\d+\))/g, + }, + parseLyric(str) { + str = str.replace(/\r/g, '') + const lines = str.split('\n') + const lxlrcLines = [] + const lrcLines = [] + + for (const line of lines) { + if (line.length < 6) continue + let result = this.rxps.lineTime.exec(line) + if (!result) continue + + const startTime = parseInt(result[1]) + let time = startTime + let ms = time % 1000 + time /= 1000 + let m = parseInt(time / 60).toString().padStart(2, '0') + time %= 60 + let s = parseInt(time).toString().padStart(2, '0') + time = `${m}:${s}.${ms}` + + let words = line.replace(this.rxps.lineTime, '') + + lrcLines.push(`[${time}]${words.replace(this.rxps.wordTimeAll, '')}`) + + let times = words.match(this.rxps.wordTimeAll) + if (!times) continue + times = times.map(time => { + const result = /\((\d+),(\d+)\)/.exec(time) + return `<${parseInt(result[1]) - startTime},${result[2]}>` + }) + const wordArr = words.split(this.rxps.wordTime) + const newWords = times.map((time, index) => `${time}${wordArr[index]}`).join('') + lxlrcLines.push(`[${time}]${newWords}`) + } + return { + lyric: lrcLines.join('\n'), + lxlyric: lxlrcLines.join('\n'), + } + }, + getText(url, tryNum = 0) { + const requestObj = httpFetch(url, { + headers: { + Referer: 'https://app.c.nf.migu.cn/', + 'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36', + channel: '0146921', + }, + }) + return requestObj.promise.then(({ statusCode, body }) => { + if (statusCode == 200) return body + if (tryNum > 5 || statusCode == 404) return Promise.reject('歌词获取失败') + return this.getText(url, ++tryNum) + }) + }, + getMrc(url) { + return this.getText(url).then(text => { + return this.parseLyric(decrypt(text)) + }) + }, + getLrc(url) { + return this.getText(url).then(text => ({ lxlyric: '', lyric: text })) + }, + getTrc(url) { + if (!url) return Promise.resolve('') + return this.getText(url) + }, + getMusicInfo(songInfo) { + return songInfo.mrcUrl == null + ? musicSearch.search(`${songInfo.name} ${songInfo.singer || ''}`.trim(), 1, { limit: 25 }).then(({ list }) => { + const targetSong = list.find(s => s.songmid == songInfo.songmid) + return targetSong ? { lrcUrl: targetSong.lrcUrl, mrcUrl: targetSong.mrcUrl, trcUrl: targetSong.trcUrl } : Promise.reject('获取歌词失败') + }) + : Promise.resolve({ lrcUrl: songInfo.lrcUrl, mrcUrl: songInfo.mrcUrl, trcUrl: songInfo.trcUrl }) + }, + getLyric(songInfo) { + return { + promise: this.getMusicInfo(songInfo).then(info => { + let p + if (info.mrcUrl) p = this.getMrc(info.mrcUrl) + else if (info.lrcUrl) p = this.getLrc(info.lrcUrl) + if (p == null) return Promise.reject('获取歌词失败') + return Promise.all([p, this.getTrc(info.trcUrl)]).then(([lrcInfo, tlyric]) => { + lrcInfo.tlyric = tlyric + return lrcInfo + }) + }), + cancelHttp() {}, + } + }, +} export default { - getLyric(songInfo, tryNum = 0) { + getLyricWeb(songInfo, tryNum = 0) { // console.log(songInfo.copyrightId) if (songInfo.lrcUrl) { let requestObj = httpFetch(songInfo.lrcUrl) requestObj.promise = requestObj.promise.then(({ body, statusCode }) => { if (statusCode !== 200) { if (tryNum > 5) return Promise.reject('歌词获取失败') - let tryRequestObj = this.getLyric(songInfo, ++tryNum) + let tryRequestObj = this.getLyricWeb(songInfo, ++tryNum) requestObj.cancelHttp = tryRequestObj.cancelHttp.bind(tryRequestObj) return tryRequestObj.promise } @@ -19,15 +117,15 @@ export default { }) return requestObj } else { - let requestObj = httpFetch(`http://music.migu.cn/v3/api/music/audioPlayer/getLyric?copyrightId=${songInfo.copyrightId}`, { + let requestObj = httpFetch(`https://music.migu.cn/v3/api/music/audioPlayer/getLyric?copyrightId=${songInfo.copyrightId}`, { headers: { - Referer: 'http://music.migu.cn/v3/music/player/audio?from=migu', + Referer: 'https://music.migu.cn/v3/music/player/audio?from=migu', }, }) requestObj.promise = requestObj.promise.then(({ body }) => { if (body.returnCode !== '000000' || !body.lyric) { if (tryNum > 5) return Promise.reject(new Error('Get lyric failed')) - let tryRequestObj = this.getLyric(songInfo, ++tryNum) + let tryRequestObj = this.getLyricWeb(songInfo, ++tryNum) requestObj.cancelHttp = tryRequestObj.cancelHttp.bind(tryRequestObj) return tryRequestObj.promise } @@ -39,4 +137,14 @@ export default { return requestObj } }, + + getLyric(songInfo) { + let requestObj = mrcTools.getLyric(songInfo) + requestObj.promise = requestObj.promise.catch(() => { + let webRequestObj = this.getLyricWeb(songInfo) + requestObj.cancelHttp = webRequestObj.cancelHttp.bind(webRequestObj) + return webRequestObj.promise + }) + return requestObj + }, } diff --git a/src/renderer/utils/music/mg/mrc.js b/src/renderer/utils/music/mg/mrc.js new file mode 100644 index 00000000..98ebb68f --- /dev/null +++ b/src/renderer/utils/music/mg/mrc.js @@ -0,0 +1,104 @@ + +// const key = 'karakal@123Qcomyidongtiantianhaoting' +const DELTA = 2654435769n +const MIN_LENGTH = 32 +// const SPECIAL_CHAR = '0' +const keyArr = [ + 27303562373562475n, + 18014862372307051n, + 22799692160172081n, + 34058940340699235n, + 30962724186095721n, + 27303523720101991n, + 27303523720101998n, + 31244139033526382n, + 28992395054481524n, +] + + +const teaDecrypt = (data, key) => { + const length = data.length + const lengthBitint = BigInt(length) + if (length >= 1) { + // let j = data[data.length - 1]; + let j2 = data[0] + let j3 = toLong((6n + (52n / lengthBitint)) * DELTA) + while (true) { + let j4 = j3 + if (j4 == 0n) break + let j5 = toLong(3n & toLong(j4 >> 2n)) + let j6 = lengthBitint + while (true) { + j6-- + if (j6 > 0n) { + let j7 = data[(j6 - 1n)] + let i = j6 + j2 = toLong(data[i] - (toLong(toLong(j2 ^ j4) + toLong(j7 ^ key[toLong(toLong(3n & j6) ^ j5)])) ^ toLong(toLong(toLong(j7 >> 5n) ^ toLong(j2 << 2n)) + toLong(toLong(j2 >> 3n) ^ toLong(j7 << 4n))))) + data[i] = j2 + } else break + } + let j8 = data[lengthBitint - 1n] + j2 = toLong(data[0n] - toLong(toLong(toLong(key[toLong(toLong(j6 & 3n) ^ j5)] ^ j8) + toLong(j2 ^ j4)) ^ toLong(toLong(toLong(j8 >> 5n) ^ toLong(j2 << 2n)) + toLong(toLong(j2 >> 3n) ^ toLong(j8 << 4n))))) + data[0] = j2 + j3 = toLong(j4 - DELTA) + } + } + return data +} + +const longArrToString = (data) => { + const arrayList = [] + for (const j of data) arrayList.push(longToBytes(j).toString('utf16le')) + return arrayList.join('') +} + +// https://stackoverflow.com/a/29132118 +const longToBytes = (l) => { + const result = Buffer.alloc(8) + for (let i = 0; i < 8; i++) { + result[i] = parseInt(l & 0xFFn) + l >>= 8n + } + return result +} + + +const toBigintArray = (data) => { + const length = Math.floor(data.length / 16) + const jArr = Array(length) + for (let i = 0; i < length; i++) { + jArr[i] = toLong(data.substring(i * 16, (i * 16) + 16)) + } + return jArr +} + +// https://github.com/lyswhut/lx-music-desktop/issues/445#issuecomment-1139338682 +const MAX = 9223372036854775807n +const MIN = -9223372036854775808n +const toLong = str => { + const num = typeof str == 'string' ? BigInt('0x' + str) : str + if (num > MAX) return toLong(num - (1n << 64n)) + else if (num < MIN) return toLong(num + (1n << 64n)) + return num +} + +export const decrypt = (data) => { + // console.log(data.length) + // -3551594764563790630 + // console.log(toLongArrayFromArr(Buffer.from(key))) + // console.log(teaDecrypt(toBigintArray(data), keyArr)) + // console.log(longArrToString(teaDecrypt(toBigintArray(data), keyArr))) + // console.log(toByteArray(teaDecrypt(toBigintArray(data), keyArr))) + return (data == null || data.length < MIN_LENGTH) + ? data + : longArrToString(teaDecrypt(toBigintArray(data), keyArr)) +} + +// console.log(14895149309145760986n - ) +// console.log(toLong('14895149309145760986')) +// console.log(decrypt(str)) +// console.log(decrypt(str)) +// console.log(toByteArray([6048138644744000495n])) +// console.log(toByteArray([16325999628386395n])) +// console.log(toLong(90994076459972177136n)) + diff --git a/src/renderer/utils/music/mg/musicSearch.js b/src/renderer/utils/music/mg/musicSearch.js index 77595b60..62bd8bc4 100644 --- a/src/renderer/utils/music/mg/musicSearch.js +++ b/src/renderer/utils/music/mg/musicSearch.js @@ -89,7 +89,7 @@ export default { name: item.name, albumName: albumNInfo.name, albumId: albumNInfo.id, - songmid: item.id, + songmid: item.copyrightId, songId: item.songId, copyrightId: item.copyrightId, source: 'mg', @@ -97,6 +97,8 @@ export default { img: item.imgItems && item.imgItems.length ? item.imgItems[0].img : null, lrc: null, lrcUrl: item.lyricUrl, + mrcUrl: item.mrcurl, + trcUrl: item.trcUrl, otherSource: null, types, _types, diff --git a/src/renderer/utils/music/mg/songList.js b/src/renderer/utils/music/mg/songList.js index de789a7d..998415c5 100644 --- a/src/renderer/utils/music/mg/songList.js +++ b/src/renderer/utils/music/mg/songList.js @@ -212,6 +212,8 @@ export default { img: item.albumImgs && item.albumImgs.length ? item.albumImgs[0].img : null, lrc: null, lrcUrl: item.lrcUrl, + mrcUrl: item.mrcUrl, + trcUrl: item.trcUrl, otherSource: null, types, _types, From 0704a4ad12786ffd30a074ffe616f57725d3e0bc Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sat, 11 Jun 2022 18:52:52 +0800 Subject: [PATCH 18/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E9=94=AE=E6=97=B6=E7=9A=84=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/event/index.js | 6 +- src/renderer/utils/keyBind.js | 2 +- .../setting/components/SettingHotKey.vue | 108 +++++++++--------- 4 files changed, 61 insertions(+), 56 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 26c37c37..858e0635 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -11,6 +11,7 @@ - 修复若配置了`http_proxy`环境变量时,会意外使用此代理配置的问题 - 修复多选后切换列表后不会清空多选内容的问题 +- 修复设置快捷键时的处理逻辑问题 ### 文档 diff --git a/src/renderer/event/index.js b/src/renderer/event/index.js index 108105b5..af43ef9d 100644 --- a/src/renderer/event/index.js +++ b/src/renderer/event/index.js @@ -24,8 +24,10 @@ eventHub.on(baseName.bindKey, () => { // console.log(`key_${key}_${type}`) eventHub.emit(baseName.key_down, { event, keys, key, type }) // console.log(event, key) - if (!window.isEditingHotKey && appHotKeyConfig.local.enable && appHotKeyConfig.local.keys[key]) { - event.preventDefault() + // console.log(key, eventKey, type, event, keys) + if (window.isEditingHotKey) return + if (appHotKeyConfig.local.enable && appHotKeyConfig.local.keys[key]) { + event?.preventDefault() if (type == 'up') return // 软件内快捷键的最小化触发时 diff --git a/src/renderer/utils/keyBind.js b/src/renderer/utils/keyBind.js index fdea03d8..2489d150 100644 --- a/src/renderer/utils/keyBind.js +++ b/src/renderer/utils/keyBind.js @@ -107,7 +107,7 @@ const unbindKey = () => { const clearDownKeys = () => { let keys = Array.from(downKeys) for (let i = keys.length - 1; i > -1; i--) { - handleSendEvent(keys[i], 'up') + handleSendEvent(keys[i], keys[i], 'up', null, [keys[i]]) } downKeys.clear() } diff --git a/src/renderer/views/setting/components/SettingHotKey.vue b/src/renderer/views/setting/components/SettingHotKey.vue index 1085e3bc..57a54032 100644 --- a/src/renderer/views/setting/components/SettingHotKey.vue +++ b/src/renderer/views/setting/components/SettingHotKey.vue @@ -102,65 +102,67 @@ export default { }) } - const handleHotKeyBlur = async(event, info, type) => { - await hotKeySetEnable(true) - window.isEditingHotKey = false - isEditHotKey = false - const prevInput = hotKeyTargetInput - hotKeyTargetInput = null - if (prevInput.value == t('setting__hot_key_tip_input')) { - prevInput.value = newHotKey ? formatHotKeyName(newHotKey) : '' - return - } - let config = hotKeyConfig.value[type][info.name] - let originKey - if (type == 'global' && newHotKey && current_hot_key.value.global.enable) { - try { - await hotKeySetConfig({ - action: 'register', - data: { - key: newHotKey, - info, - }, - }) - } catch (error) { - console.log(error) + const handleHotKeyBlur = (event, info, type) => { + setTimeout(async() => { + await hotKeySetEnable(true) + window.isEditingHotKey = false + isEditHotKey = false + const prevInput = hotKeyTargetInput + hotKeyTargetInput = null + if (prevInput?.value == t('setting__hot_key_tip_input')) { + prevInput.value = newHotKey ? formatHotKeyName(newHotKey) : '' return } - } - if (config) { - if (config.key == newHotKey) return - originKey = config.key - delete current_hot_key.value[type].keys[config.key] - } else if (!newHotKey) return - - if (newHotKey) { - for (const [tempType, tempInfo] of Object.entries(current_hot_key.value)) { - if (tempType == type) continue - config = tempInfo.keys[newHotKey] - if (config) { - console.log(newHotKey, info, config, info.name, config.name) - delete current_hot_key.value[tempType].keys[newHotKey] - break + let config = hotKeyConfig.value[type][info.name] + let originKey + if (type == 'global' && newHotKey && current_hot_key.value.global.enable) { + try { + await hotKeySetConfig({ + action: 'register', + data: { + key: newHotKey, + info, + }, + }) + } catch (error) { + console.log(error) + return } } - current_hot_key.value[type].keys[newHotKey] = info - } + if (config) { + if (config.key == newHotKey) return + originKey = config.key + delete current_hot_key.value[type].keys[config.key] + } else if (!newHotKey) return - initHotKeyConfig() - // console.log(this.current_hot_key.global.keys) - if (originKey && current_hot_key.value.global.enable) { - try { - await hotKeySetConfig({ - action: 'unregister', - data: originKey, - }) - } catch (error) { - console.log(error) + if (newHotKey) { + for (const [tempType, tempInfo] of Object.entries(current_hot_key.value)) { + if (tempType == type) continue + config = tempInfo.keys[newHotKey] + if (config) { + console.log(newHotKey, info, config, info.name, config.name) + delete current_hot_key.value[tempType].keys[newHotKey] + break + } + } + current_hot_key.value[type].keys[newHotKey] = info } - } - await handleHotKeySaveConfig() - await getHotKeyStatus() + + initHotKeyConfig() + // console.log(this.current_hot_key.global.keys) + if (originKey && current_hot_key.value.global.enable) { + try { + await hotKeySetConfig({ + action: 'unregister', + data: originKey, + }) + } catch (error) { + console.log(error) + } + } + await handleHotKeySaveConfig() + await getHotKeyStatus() + }) } const handleKeyDown = ({ event, keys, key, type }) => { From 9d08f91079bf10cd269244e9b1ec160712427438 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 12 Jun 2022 14:39:58 +0800 Subject: [PATCH 19/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E6=AD=8C=E5=8D=95=E8=BE=93=E5=85=A5=E6=A1=86=E3=80=81?= =?UTF-8?q?=E6=AD=8C=E5=8D=95=E5=86=85=E6=AD=8C=E6=9B=B2=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E6=A1=86=E4=BC=9A=E6=84=8F=E5=A4=96=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E8=AE=BE=E7=BD=AE=E7=9A=84=E5=85=A8=E5=B1=80=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=94=AE=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=88#879?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/renderer/components/common/ListAddModal.vue | 2 +- .../components/common/ListAddMultipleModal.vue | 2 +- src/renderer/core/useApp/useEventListener.js | 9 +++++---- src/renderer/event/index.js | 10 ++++++---- src/renderer/utils/keyBind.js | 12 ++++++------ src/renderer/views/list/components/MyLists.vue | 4 ++-- src/renderer/views/list/components/SearchList.vue | 2 +- .../views/setting/components/SettingHotKey.vue | 4 ++-- 9 files changed, 25 insertions(+), 21 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 858e0635..68fab6e8 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -12,6 +12,7 @@ - 修复若配置了`http_proxy`环境变量时,会意外使用此代理配置的问题 - 修复多选后切换列表后不会清空多选内容的问题 - 修复设置快捷键时的处理逻辑问题 +- 修复在新建歌单输入框、歌单内歌曲搜索输入框会意外触发设置的全局快捷键的问题(#879) ### 文档 diff --git a/src/renderer/components/common/ListAddModal.vue b/src/renderer/components/common/ListAddModal.vue index a9537a71..37205168 100644 --- a/src/renderer/components/common/ListAddModal.vue +++ b/src/renderer/components/common/ListAddModal.vue @@ -8,7 +8,7 @@ - + diff --git a/src/renderer/components/common/ListAddMultipleModal.vue b/src/renderer/components/common/ListAddMultipleModal.vue index 9232ba7b..8f989142 100644 --- a/src/renderer/components/common/ListAddMultipleModal.vue +++ b/src/renderer/components/common/ListAddMultipleModal.vue @@ -8,7 +8,7 @@ - + diff --git a/src/renderer/core/useApp/useEventListener.js b/src/renderer/core/useApp/useEventListener.js index 859bb6e9..0dab7290 100644 --- a/src/renderer/core/useApp/useEventListener.js +++ b/src/renderer/core/useApp/useEventListener.js @@ -12,8 +12,9 @@ import { useRefGetter, } from '@renderer/utils/vueTools' -const handle_key_esc_down = ({ event }) => { - if (event.repeat) return +const handle_key_down = ({ event, type, key }) => { + // console.log(key) + if (key != 'escape' || !event || event.repeat || type == 'up' || window.isEditingHotKey) return if (event.target.tagName != 'INPUT' || event.target.classList.contains('ignore-esc')) { if (isFullscreen.value) { event.lx_handled = true @@ -113,7 +114,7 @@ export default ({ }) window.eventHub.emit(eventBaseName.bindKey) - window.eventHub.on('key_escape_down', handle_key_esc_down) + window.eventHub.on(eventBaseName.key_down, handle_key_down) window.eventHub.on('key_mod+f12_down', handle_open_devtools) window.eventHub.on('key_f11_down', handle_fullscreen) window.eventHub.on(eventBaseName.fullscreenToggle, handle_fullscreen) @@ -128,7 +129,7 @@ export default ({ } onBeforeUnmount(() => { - window.eventHub.off('key_escape_down', handle_key_esc_down) + window.eventHub.off(eventBaseName.key_down, handle_key_down) window.eventHub.off('key_mod+f12_down', handle_open_devtools) window.eventHub.off('key_f11_down', handle_fullscreen) window.eventHub.off(eventBaseName.fullscreenToggle, handle_fullscreen) diff --git a/src/renderer/event/index.js b/src/renderer/event/index.js index af43ef9d..934ac818 100644 --- a/src/renderer/event/index.js +++ b/src/renderer/event/index.js @@ -20,14 +20,15 @@ rendererInvoke(NAMES.mainWindow.get_hot_key).then(({ local, global }) => { }) eventHub.on(baseName.bindKey, () => { - keyBind.bindKey((key, eventKey, type, event, keys) => { + keyBind.bindKey((key, eventKey, type, event, keys, isEditing) => { // console.log(`key_${key}_${type}`) eventHub.emit(baseName.key_down, { event, keys, key, type }) // console.log(event, key) // console.log(key, eventKey, type, event, keys) - if (window.isEditingHotKey) return - if (appHotKeyConfig.local.enable && appHotKeyConfig.local.keys[key]) { - event?.preventDefault() + if (window.isEditingHotKey || (isEditing && type == 'down') || event?.lx_handled) return + if (event && appHotKeyConfig.local.enable && appHotKeyConfig.local.keys[key] && (key != 'escape' || !event.target.classList.contains('ignore-esc'))) { + // console.log(key, eventKey, type, keys, isEditing) + event.preventDefault() if (type == 'up') return // 软件内快捷键的最小化触发时 @@ -40,6 +41,7 @@ eventHub.on(baseName.bindKey, () => { eventHub.emit(appHotKeyConfig.local.keys[key].action) return } + // console.log(`key_${key}_${type}`) eventHub.emit(`key_${key}_${type}`, { event, keys, key, eventKey, type }) if (key != eventKey) eventHub.emit(`key_${eventKey}_${type}`, { event, keys, key, eventKey, type }) }) diff --git a/src/renderer/utils/keyBind.js b/src/renderer/utils/keyBind.js index 2489d150..c44ab158 100644 --- a/src/renderer/utils/keyBind.js +++ b/src/renderer/utils/keyBind.js @@ -2,7 +2,7 @@ import { isMac } from '../../common/utils' const downKeys = new Set() -const handleEvent = (type, event, keys) => { +const handleEvent = (type, event, keys, isEditing) => { let eventKey = event.key if (isMac) { let index = keys.indexOf('meta') @@ -23,7 +23,7 @@ const handleEvent = (type, event, keys) => { downKeys.delete(key) break } - handleSendEvent(key, eventKey, type, event, keys) + handleSendEvent(key, eventKey, type, event, keys, isEditing) } // 修饰键处理 @@ -54,7 +54,7 @@ const assertStopCallback = element => { } const handleKeyDown = event => { - if (assertStopCallback(event.target)) return + // if (assertStopCallback(event.target)) return // event.preventDefault() let keys = eventModifiers(event) switch (event.key) { @@ -70,11 +70,11 @@ const handleKeyDown = event => { keys.push((event.code.includes('Numpad') ? event.code.replace(/^Numpad(\w{1,3})\w*$/i, 'num$1') : event.key).toLowerCase()) break } - handleEvent('down', event, keys) + handleEvent('down', event, keys, assertStopCallback(event.target)) } const handleKeyUp = event => { - if (assertStopCallback(event.target)) return + // if (assertStopCallback(event.target)) return event.preventDefault() let keys = eventModifiers(event) switch (event.key) { @@ -88,7 +88,7 @@ const handleKeyUp = event => { keys.push((event.code.includes('Numpad') ? event.code.replace(/^Numpad(\w{1,3})\w*$/i, 'num$1') : event.key).toLowerCase()) break } - handleEvent('up', event, keys) + handleEvent('up', event, keys, assertStopCallback(event.target)) } let handleSendEvent diff --git a/src/renderer/views/list/components/MyLists.vue b/src/renderer/views/list/components/MyLists.vue index 161829b1..3990a09f 100644 --- a/src/renderer/views/list/components/MyLists.vue +++ b/src/renderer/views/list/components/MyLists.vue @@ -30,12 +30,12 @@ @contextmenu="handleListsItemRigthClick($event, index)" :aria-label="item.name" v-for="(item, index) in userLists" :key="item.id" :aria-selected="defaultList.id == listId" > {{item.name}} -
  • -
  • diff --git a/src/renderer/views/list/components/SearchList.vue b/src/renderer/views/list/components/SearchList.vue index b5477de0..dcae28f9 100644 --- a/src/renderer/views/list/components/SearchList.vue +++ b/src/renderer/views/list/components/SearchList.vue @@ -4,7 +4,7 @@ teleport(to="#view") transition(enter-active-class="animated-fast zoomIn" leave-active-class="animated zoomOut" @after-leave="handleAnimated") div(:class="$style.search" v-show="visible") div(:class="$style.form") - input.key-bind.ignore-esc(:placeholder="placeholder" v-model.trim="text" ref="dom_input" + input.ignore-esc(:placeholder="placeholder" v-model.trim="text" ref="dom_input" @input="handleDelaySearch" @keyup.enter="handleTemplistClick(selectIndex)" @keyup.arrow-down.prevent="handleKeyDown" diff --git a/src/renderer/views/setting/components/SettingHotKey.vue b/src/renderer/views/setting/components/SettingHotKey.vue index 57a54032..759971b5 100644 --- a/src/renderer/views/setting/components/SettingHotKey.vue +++ b/src/renderer/views/setting/components/SettingHotKey.vue @@ -7,7 +7,7 @@ dd div(:class="$style.hotKeyContainer" :style="{ opacity: current_hot_key.local.enable ? 1 : .6 }") div(:class="$style.hotKeyItem" v-for="item in allHotKeys.local") h4(:class="$style.hotKeyItemTitle") {{$t('setting__hot_key_' + item.name)}} - base-input.key-bind(:class="$style.hotKeyItemInput" readonly @keyup.prevent :placeholder="$t('setting__hot_key_unset_input')" + base-input(:class="$style.hotKeyItemInput" readonly @keyup.prevent :placeholder="$t('setting__hot_key_unset_input')" :value="hotKeyConfig.local[item.name] && formatHotKeyName(hotKeyConfig.local[item.name].key)" @focus="handleHotKeyFocus($event, item, 'local')" @blur="handleHotKeyBlur($event, item, 'local')") @@ -18,7 +18,7 @@ dd div(:class="$style.hotKeyContainer" :style="{ opacity: current_hot_key.global.enable ? 1 : .6 }") div(:class="$style.hotKeyItem" v-for="item in allHotKeys.global") h4(:class="$style.hotKeyItemTitle") {{$t('setting__hot_key_' + item.name)}} - base-input.key-bind(:class="[$style.hotKeyItemInput, hotKeyConfig.global[item.name] && hotKeyStatus[hotKeyConfig.global[item.name].key] && hotKeyStatus[hotKeyConfig.global[item.name].key].status === false ? $style.hotKeyFailed : null]" + base-input(:class="[$style.hotKeyItemInput, hotKeyConfig.global[item.name] && hotKeyStatus[hotKeyConfig.global[item.name].key] && hotKeyStatus[hotKeyConfig.global[item.name].key].status === false ? $style.hotKeyFailed : null]" :value="hotKeyConfig.global[item.name] && formatHotKeyName(hotKeyConfig.global[item.name].key)" @input.prevent readonly :placeholder="$t('setting__hot_key_unset_input')" @focus="handleHotKeyFocus($event, item, 'global')" @blur="handleHotKeyBlur($event, item, 'global')") From 4542f9b2e33d215b4279a96bed0cb00e8724ebf3 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 12 Jun 2022 14:46:34 +0800 Subject: [PATCH 20/32] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 796 ++++++++++++++++++++++------------------------ package.json | 22 +- 2 files changed, 386 insertions(+), 432 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5ee2d87..e098c56d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "lx-music-desktop", - "version": "1.21.0", + "version": "1.22.0-beta.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "lx-music-desktop", - "version": "1.21.0", + "version": "1.22.0-beta.2", "license": "Apache-2.0", "dependencies": { "bufferutil": "^4.0.6", "crypto-js": "^4.1.1", "electron-log": "^4.4.7", - "electron-store": "^8.0.1", + "electron-store": "^8.0.2", "font-list": "git+https://github.com/lyswhut/node-font-list.git#4edbb1933b49a9bac1eedd63a31da16b487fe57d", "http-terminator": "^3.2.0", "iconv-lite": "^0.6.3", @@ -27,8 +27,8 @@ "sortablejs": "^1.15.0", "tunnel": "^0.0.6", "utf-8-validate": "^5.0.9", - "vue": "^3.2.36", - "vue-i18n": "^9.2.0-beta.35", + "vue": "^3.2.37", + "vue-i18n": "^9.2.0-beta.36", "vue-router": "^4.1.0-aabe509", "vuex": "^4.0.2" }, @@ -43,7 +43,7 @@ "@babel/preset-env": "^7.18.2", "babel-loader": "^8.2.5", "babel-preset-minify": "^0.5.2", - "browserslist": "^4.20.3", + "browserslist": "^4.20.4", "chalk": "^4.1.2", "changelog-parser": "^2.8.1", "copy-webpack-plugin": "^11.0.0", @@ -53,11 +53,11 @@ "css-minimizer-webpack-plugin": "^4.0.0", "del": "^6.1.1", "electron": "^13.6.9", - "electron-builder": "^23.0.9", + "electron-builder": "^23.1.0", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.146", - "electron-updater": "^5.0.4", + "electron-to-chromium": "^1.4.152", + "electron-updater": "^5.0.5", "eslint": "^8.17.0", "eslint-config-standard": "^17.0.0", "eslint-formatter-friendly": "git+https://github.com/lyswhut/eslint-friendly-formatter.git#2170d1320e2fad13615a9dcf229669f0bb473a53", @@ -69,7 +69,7 @@ "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.5.0", - "less": "^4.1.2", + "less": "^4.1.3", "less-loader": "^11.0.0", "mini-css-extract-plugin": "^2.6.0", "node-loader": "^2.0.0", @@ -88,10 +88,10 @@ "terser-webpack-plugin": "^5.3.3", "url-loader": "^4.1.1", "vue-loader": "^17.0.0", - "vue-template-compiler": "^2.6.14", + "vue-template-compiler": "^2.7.0-alpha.6", "webpack": "^5.73.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.9.1", + "webpack-dev-server": "^4.9.2", "webpack-hot-middleware": "git+https://github.com/lyswhut/webpack-hot-middleware.git#329c4375134b89d39da23a56a94db651247c74a1", "webpack-merge": "^5.8.0" }, @@ -2045,36 +2045,36 @@ "dev": true }, "node_modules/@intlify/core-base": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.35.tgz", - "integrity": "sha512-53yuCpo2ov5OKdvBTvE5zKMo2clLVqNORwkcY9TUu0B+yrOeDwLWQnbPJnOoDu5KkRdbdXlMxnHNCpJ5vlGZ1g==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.36.tgz", + "integrity": "sha512-PGYUdWUgb+1Do9Ol/4csHTKxu0cNIOGhJSHZZxSb5tI9k3YkejCFBRIlKBokF5rK8OX4LDboJ6tDXeSwt1hO3g==", "dependencies": { - "@intlify/devtools-if": "9.2.0-beta.35", - "@intlify/message-compiler": "9.2.0-beta.35", - "@intlify/shared": "9.2.0-beta.35", - "@intlify/vue-devtools": "9.2.0-beta.35" + "@intlify/devtools-if": "9.2.0-beta.36", + "@intlify/message-compiler": "9.2.0-beta.36", + "@intlify/shared": "9.2.0-beta.36", + "@intlify/vue-devtools": "9.2.0-beta.36" }, "engines": { "node": ">= 12" } }, "node_modules/@intlify/devtools-if": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.35.tgz", - "integrity": "sha512-y3+7M+eS9mqeXTBa1QWAvt4nsjwWJ5G4xT+G3IFtd7Vb2CQHwli229n0avD+VdlDGwWCDWpLkny8QWtdNEYpOA==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.36.tgz", + "integrity": "sha512-UbU4xtHu87WnlimdCycRS4DZbEu8X31bCDJwdm7ShM+9WvCjFEttnD0KDyviIwblzTvJOtGRQ60R7zDgCOFz5Q==", "dependencies": { - "@intlify/shared": "9.2.0-beta.35" + "@intlify/shared": "9.2.0-beta.36" }, "engines": { "node": ">= 12" } }, "node_modules/@intlify/message-compiler": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.35.tgz", - "integrity": "sha512-wYQCgnRtyJ40HK3bJTrszHDaxqDXZH+9Ps7RsXNuNwZ9hIb1cVkLiUNIbuJS/XSJ1kATJXA6K+4if6ZLb0Ozxw==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.36.tgz", + "integrity": "sha512-u4EwW/U9Mc50G7vM1p24UQ3aPrrkm0eM60xKRLVib1XKpH+TK8taLeetSVPI/8mNOBkLNpXmysMfhD3HlsXHIA==", "dependencies": { - "@intlify/shared": "9.2.0-beta.35", + "@intlify/shared": "9.2.0-beta.36", "source-map": "0.6.1" }, "engines": { @@ -2090,20 +2090,20 @@ } }, "node_modules/@intlify/shared": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.35.tgz", - "integrity": "sha512-DXf7xrwf08GKhr93XPQ8EgaEN0CIELl+mAS6SlRhi/aLtZv5HSGSMkz4M/ICwoWzFLSgOx/ZdBSasex19MMogg==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.36.tgz", + "integrity": "sha512-+IXLiQ0V+9muzEf7RT9t9wEh6hNIK+kq+34Lce8W+DYny/jaFxPWIU4REYja3xC16kV7q+fz4I3vFz03gh7ysA==", "engines": { "node": ">= 12" } }, "node_modules/@intlify/vue-devtools": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.35.tgz", - "integrity": "sha512-h7nf5F7AV4uKrr7zKTIyv8EOaIv4yAXuo7tvnFsp5uF8FO+kpBwWDm5csw9v9neyz42hiINJSP0Amou9M2ShEA==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.36.tgz", + "integrity": "sha512-g2aPb9Gy5z4prF3Lmj+ag6/ujzNFJd6CPrUxFKprljWhmxlpf83+xEaoZkbl3zog5Nq5GKF4hU3xLDwnIjGGRA==", "dependencies": { - "@intlify/core-base": "9.2.0-beta.35", - "@intlify/shared": "9.2.0-beta.35" + "@intlify/core-base": "9.2.0-beta.36", + "@intlify/shared": "9.2.0-beta.36" }, "engines": { "node": ">= 12" @@ -2601,12 +2601,12 @@ "dev": true }, "node_modules/@vue/compiler-core": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.36.tgz", - "integrity": "sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz", + "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.36", + "@vue/shared": "3.2.37", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } @@ -2620,25 +2620,25 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.36.tgz", - "integrity": "sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz", + "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==", "dependencies": { - "@vue/compiler-core": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.36.tgz", - "integrity": "sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz", + "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.36", - "@vue/compiler-dom": "3.2.36", - "@vue/compiler-ssr": "3.2.36", - "@vue/reactivity-transform": "3.2.36", - "@vue/shared": "3.2.36", + "@vue/compiler-core": "3.2.37", + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-ssr": "3.2.37", + "@vue/reactivity-transform": "3.2.37", + "@vue/shared": "3.2.37", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -2654,12 +2654,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.36.tgz", - "integrity": "sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz", + "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==", "dependencies": { - "@vue/compiler-dom": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/compiler-dom": "3.2.37", + "@vue/shared": "3.2.37" } }, "node_modules/@vue/devtools-api": { @@ -2668,60 +2668,60 @@ "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" }, "node_modules/@vue/reactivity": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.36.tgz", - "integrity": "sha512-c2qvopo0crh9A4GXi2/2kfGYMxsJW4tVILrqRPydVGZHhq0fnzy6qmclWOhBFckEhmyxmpHpdJtIRYGeKcuhnA==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz", + "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==", "dependencies": { - "@vue/shared": "3.2.36" + "@vue/shared": "3.2.37" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.36.tgz", - "integrity": "sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz", + "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==", "dependencies": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.36", - "@vue/shared": "3.2.36", + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.36.tgz", - "integrity": "sha512-PTWBD+Lub+1U3/KhbCExrfxyS14hstLX+cBboxVHaz+kXoiDLNDEYAovPtxeTutbqtClIXtft+wcGdC+FUQ9qQ==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz", + "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==", "dependencies": { - "@vue/reactivity": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/reactivity": "3.2.37", + "@vue/shared": "3.2.37" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.36.tgz", - "integrity": "sha512-gYPYblm7QXHVuBohqNRRT7Wez0f2Mx2D40rb4fleehrJU9CnkjG0phhcGEZFfGwCmHZRqBCRgbFWE98bPULqkg==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz", + "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==", "dependencies": { - "@vue/runtime-core": "3.2.36", - "@vue/shared": "3.2.36", + "@vue/runtime-core": "3.2.37", + "@vue/shared": "3.2.37", "csstype": "^2.6.8" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.36.tgz", - "integrity": "sha512-uZE0+jfye6yYXWvAQYeHZv+f50sRryvy16uiqzk3jn8hEY8zTjI+rzlmZSGoE915k+W/Ol9XSw6vxOUD8dGkUg==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.37.tgz", + "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==", "dependencies": { - "@vue/compiler-ssr": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/compiler-ssr": "3.2.37", + "@vue/shared": "3.2.37" }, "peerDependencies": { - "vue": "3.2.36" + "vue": "3.2.37" } }, "node_modules/@vue/shared": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz", - "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==" + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz", + "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==" }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", @@ -3256,9 +3256,9 @@ "dev": true }, "node_modules/app-builder-lib": { - "version": "23.0.9", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.0.9.tgz", - "integrity": "sha512-2JboeCVrL+PksZ7IHp2teXbMUBnlucc3LhKGV+irxEA0l36bHs939AVtcaiATqyGnJcZkRdaB6TDd7SZfu+pxQ==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.1.0.tgz", + "integrity": "sha512-aZpKjBBLzyxtr4Cmbyi3dl8uRO8SI2PG2MYEKYRZL6pl7IsKP2hJkCYzlD6NjLJlRIAZcFPFjFbJliO74DFf7w==", "dev": true, "dependencies": { "@develar/schema-utils": "~2.6.5", @@ -4242,9 +4242,9 @@ } }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", + "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", "dev": true, "funding": [ { @@ -4257,10 +4257,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", + "caniuse-lite": "^1.0.30001349", + "electron-to-chromium": "^1.4.147", "escalade": "^3.1.1", - "node-releases": "^2.0.3", + "node-releases": "^2.0.5", "picocolors": "^1.0.0" }, "bin": { @@ -4323,7 +4323,7 @@ "node_modules/buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", "dev": true, "engines": { "node": ">=0.4.0" @@ -4332,7 +4332,7 @@ "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, "node_modules/buffer-from": { @@ -4601,9 +4601,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "version": "1.0.30001352", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", + "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", "dev": true, "funding": [ { @@ -4786,7 +4786,7 @@ "node_modules/chromium-pickle-js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", "dev": true }, "node_modules/ci-info": { @@ -5095,7 +5095,7 @@ "node_modules/colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", "dev": true, "engines": { "node": ">=0.1.90" @@ -5130,7 +5130,7 @@ "node_modules/compare-version": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5214,9 +5214,9 @@ } }, "node_modules/conf": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.0.3.tgz", - "integrity": "sha512-4gtQ/Q36qVxBzMe6B7gWOAfni1VdhuHkIzxydHkclnwGmgN+eW4bb6jj73vigCfr7d3WlmqawvhZrpCUCTPYxQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.1.2.tgz", + "integrity": "sha512-o9Fv1Mv+6A0JpoayQ8JleNp3hhkbOJP/Re/Q+QqxMPHPkABVsRjQGWZn9A5GcqLiTNC6d89p2PB5ZhHVDSMwyg==", "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", @@ -5237,9 +5237,9 @@ } }, "node_modules/conf/node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -5271,9 +5271,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/conf/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6197,7 +6197,7 @@ "node_modules/dir-compare/node_modules/commander": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", "dev": true, "dependencies": { "graceful-readlink": ">= 1.0.0" @@ -6231,12 +6231,12 @@ } }, "node_modules/dmg-builder": { - "version": "23.0.9", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.0.9.tgz", - "integrity": "sha512-a9mq85K31czOjso+T0aN9pWlmydzhehapU+ussFMD5FwD3l3JCK2ILlRfXuR3penbZT6LKCHuQFDIaZvsusY1w==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.1.0.tgz", + "integrity": "sha512-CzhPk/k12nJ2KqTbePkIwHOLiaWneQu2cgXCT9Hb5FhwI1vxTPalLsg8OZ57wKCrkL8AEftqqSff8gB5yWY/xw==", "dev": true, "dependencies": { - "app-builder-lib": "23.0.9", + "app-builder-lib": "23.1.0", "builder-util": "23.0.9", "builder-util-runtime": "9.0.2", "fs-extra": "^10.0.0", @@ -6506,17 +6506,17 @@ } }, "node_modules/electron-builder": { - "version": "23.0.9", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.0.9.tgz", - "integrity": "sha512-qeAbUfgVOBMjrDfGaTDsM2wuiPsISbADKLaMM27HAeVTjs6o4UuUFl+DzDVPal3v61W6nAB9kvBTeU9RZ/jH7g==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.1.0.tgz", + "integrity": "sha512-UEblaQY8N9m8/HriOwl7jgFJ4olpWDXwdDBqwUkQiRHVNRnCfrA0u8LV03li5ZYhma6zFWzfIZbHd+uk8y//lQ==", "dev": true, "dependencies": { "@types/yargs": "^17.0.1", - "app-builder-lib": "23.0.9", + "app-builder-lib": "23.1.0", "builder-util": "23.0.9", "builder-util-runtime": "9.0.2", "chalk": "^4.1.1", - "dmg-builder": "23.0.9", + "dmg-builder": "23.1.0", "fs-extra": "^10.0.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -6681,7 +6681,7 @@ "node_modules/electron-osx-sign/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/electron-publish": { @@ -6747,27 +6747,27 @@ } }, "node_modules/electron-store": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.0.1.tgz", - "integrity": "sha512-ZyLvNywiqSpbwC/pp89O/AycVWY/UJIkmtyzF2Bd0Nm/rLmcFc0NTGuLdg6+LE8mS8qsiK5JMoe4PnrecLHH5w==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.0.2.tgz", + "integrity": "sha512-9GwUMv51w8ydbkaG7X0HrPlElXLApg63zYy1/VZ/a08ndl0gfm4iCoD3f0E1JvP3V16a+7KxqriCI0c122stiA==", "dependencies": { - "conf": "^10.0.3", - "type-fest": "^1.0.2" + "conf": "^10.1.2", + "type-fest": "^2.12.2" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/electron-to-chromium": { - "version": "1.4.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", - "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", + "version": "1.4.152", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.152.tgz", + "integrity": "sha512-jk4Ju5SGZAQQJ1iI4Rgru7dDlvkQPLpNPWH9gIZmwCD4YteA5Bbk1xPcPDUf5jUYs3e1e80RXdi8XgKQZaigeg==", "dev": true }, "node_modules/electron-updater": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.4.tgz", - "integrity": "sha512-JBDRtm+631HTVTi5QEPF3THaPP1lB5Kz4ItGsAubYo7UF8i3akoIQlLzOcdskqS5TfukNdHxyq5NQnT/hI07OA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.5.tgz", + "integrity": "sha512-YcKEI9zpU+c0sNXTpjw3UpzP8Pfuuwo70T42oLYm0hHc0dy41ih51oENlhxgooa2+uzzpXhoCOyrpG+w6CB0Pw==", "dev": true, "dependencies": { "@types/semver": "^7.3.6", @@ -6777,7 +6777,8 @@ "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", - "semver": "^7.3.5" + "semver": "^7.3.5", + "typed-emitter": "^2.1.0" } }, "node_modules/electron-updater/node_modules/fs-extra": { @@ -8431,9 +8432,9 @@ } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -9006,7 +9007,7 @@ "node_modules/graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", "dev": true }, "node_modules/handle-thing": { @@ -9446,17 +9447,6 @@ "node": ">=12.0" } }, - "node_modules/http-terminator/node_modules/type-fest": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.0.tgz", - "integrity": "sha512-Qe5GRT+n/4GoqCNGGVp5Snapg1Omq3V7irBJB3EaKsp7HWDo5Gv2d/67gfNyV+d5EXD+x/RF5l1h4yJ7qNkcGA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -10540,9 +10530,9 @@ "dev": true }, "node_modules/less": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", - "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "dependencies": { "copy-anything": "^2.0.1", @@ -10561,7 +10551,7 @@ "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "needle": "^2.5.2", + "needle": "^3.1.0", "source-map": "~0.6.0" } }, @@ -10585,29 +10575,6 @@ "webpack": "^5.0.0" } }, - "node_modules/less/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/less/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/less/node_modules/image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -10635,24 +10602,6 @@ "node": ">=6" } }, - "node_modules/less/node_modules/needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, "node_modules/less/node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -11455,9 +11404,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", "dev": true }, "node_modules/normalize-path": { @@ -14129,6 +14078,16 @@ "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -15967,7 +15926,7 @@ "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, "dependencies": { "utf8-byte-length": "^1.0.1" @@ -16048,11 +16007,11 @@ } }, "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz", + "integrity": "sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16070,6 +16029,15 @@ "node": ">= 0.6" } }, + "node_modules/typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "dev": true, + "optionalDependencies": { + "rxjs": "*" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -16463,7 +16431,7 @@ "node_modules/utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", "dev": true }, "node_modules/util-deprecate": { @@ -16533,25 +16501,25 @@ } }, "node_modules/vue": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.36.tgz", - "integrity": "sha512-5yTXmrE6gW8IQgttzHW5bfBiFA6mx35ZXHjGLDmKYzW6MMmYvCwuKybANRepwkMYeXw2v1buGg3/lPICY5YlZw==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.37.tgz", + "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==", "dependencies": { - "@vue/compiler-dom": "3.2.36", - "@vue/compiler-sfc": "3.2.36", - "@vue/runtime-dom": "3.2.36", - "@vue/server-renderer": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-sfc": "3.2.37", + "@vue/runtime-dom": "3.2.37", + "@vue/server-renderer": "3.2.37", + "@vue/shared": "3.2.37" } }, "node_modules/vue-i18n": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.35.tgz", - "integrity": "sha512-kTYzZSB3B/ar3M9RfQ0KAyTGfvRw544qVzY++/sNV4stOKG6NxIDOdHdYTfVEXTSkczFwoZHTKXTWNVpx+GuHA==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.36.tgz", + "integrity": "sha512-xdMBEFic9hUQ+i95gDfNx1UKzfGO7mptQfGOpfLZ2g9lR1yiFUaFEj42S2Epg5l1tDc9/NU4SE1eYcwHXcmluw==", "dependencies": { - "@intlify/core-base": "9.2.0-beta.35", - "@intlify/shared": "9.2.0-beta.35", - "@intlify/vue-devtools": "9.2.0-beta.35", + "@intlify/core-base": "9.2.0-beta.36", + "@intlify/shared": "9.2.0-beta.36", + "@intlify/vue-devtools": "9.2.0-beta.36", "@vue/devtools-api": "^6.0.0-beta.13" }, "engines": { @@ -16604,13 +16572,13 @@ } }, "node_modules/vue-template-compiler": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz", - "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==", + "version": "2.7.0-alpha.6", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.0-alpha.6.tgz", + "integrity": "sha512-JDCP08Q5FW5Uvalk1TSQPVaVXgqnM7tvDZWpNuv38hy7MemdOglY+mp5NcX516BHo4kk2ImULpeDXlMFTupajw==", "dev": true, "dependencies": { "de-indent": "^1.0.2", - "he": "^1.1.0" + "he": "^1.2.0" } }, "node_modules/vuex": { @@ -16819,15 +16787,16 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", - "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", + "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", @@ -18697,30 +18666,30 @@ "dev": true }, "@intlify/core-base": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.35.tgz", - "integrity": "sha512-53yuCpo2ov5OKdvBTvE5zKMo2clLVqNORwkcY9TUu0B+yrOeDwLWQnbPJnOoDu5KkRdbdXlMxnHNCpJ5vlGZ1g==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.36.tgz", + "integrity": "sha512-PGYUdWUgb+1Do9Ol/4csHTKxu0cNIOGhJSHZZxSb5tI9k3YkejCFBRIlKBokF5rK8OX4LDboJ6tDXeSwt1hO3g==", "requires": { - "@intlify/devtools-if": "9.2.0-beta.35", - "@intlify/message-compiler": "9.2.0-beta.35", - "@intlify/shared": "9.2.0-beta.35", - "@intlify/vue-devtools": "9.2.0-beta.35" + "@intlify/devtools-if": "9.2.0-beta.36", + "@intlify/message-compiler": "9.2.0-beta.36", + "@intlify/shared": "9.2.0-beta.36", + "@intlify/vue-devtools": "9.2.0-beta.36" } }, "@intlify/devtools-if": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.35.tgz", - "integrity": "sha512-y3+7M+eS9mqeXTBa1QWAvt4nsjwWJ5G4xT+G3IFtd7Vb2CQHwli229n0avD+VdlDGwWCDWpLkny8QWtdNEYpOA==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.36.tgz", + "integrity": "sha512-UbU4xtHu87WnlimdCycRS4DZbEu8X31bCDJwdm7ShM+9WvCjFEttnD0KDyviIwblzTvJOtGRQ60R7zDgCOFz5Q==", "requires": { - "@intlify/shared": "9.2.0-beta.35" + "@intlify/shared": "9.2.0-beta.36" } }, "@intlify/message-compiler": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.35.tgz", - "integrity": "sha512-wYQCgnRtyJ40HK3bJTrszHDaxqDXZH+9Ps7RsXNuNwZ9hIb1cVkLiUNIbuJS/XSJ1kATJXA6K+4if6ZLb0Ozxw==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.36.tgz", + "integrity": "sha512-u4EwW/U9Mc50G7vM1p24UQ3aPrrkm0eM60xKRLVib1XKpH+TK8taLeetSVPI/8mNOBkLNpXmysMfhD3HlsXHIA==", "requires": { - "@intlify/shared": "9.2.0-beta.35", + "@intlify/shared": "9.2.0-beta.36", "source-map": "0.6.1" }, "dependencies": { @@ -18732,17 +18701,17 @@ } }, "@intlify/shared": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.35.tgz", - "integrity": "sha512-DXf7xrwf08GKhr93XPQ8EgaEN0CIELl+mAS6SlRhi/aLtZv5HSGSMkz4M/ICwoWzFLSgOx/ZdBSasex19MMogg==" + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.36.tgz", + "integrity": "sha512-+IXLiQ0V+9muzEf7RT9t9wEh6hNIK+kq+34Lce8W+DYny/jaFxPWIU4REYja3xC16kV7q+fz4I3vFz03gh7ysA==" }, "@intlify/vue-devtools": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.35.tgz", - "integrity": "sha512-h7nf5F7AV4uKrr7zKTIyv8EOaIv4yAXuo7tvnFsp5uF8FO+kpBwWDm5csw9v9neyz42hiINJSP0Amou9M2ShEA==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.36.tgz", + "integrity": "sha512-g2aPb9Gy5z4prF3Lmj+ag6/ujzNFJd6CPrUxFKprljWhmxlpf83+xEaoZkbl3zog5Nq5GKF4hU3xLDwnIjGGRA==", "requires": { - "@intlify/core-base": "9.2.0-beta.35", - "@intlify/shared": "9.2.0-beta.35" + "@intlify/core-base": "9.2.0-beta.36", + "@intlify/shared": "9.2.0-beta.36" } }, "@jridgewell/gen-mapping": { @@ -19182,12 +19151,12 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.36.tgz", - "integrity": "sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz", + "integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.36", + "@vue/shared": "3.2.37", "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, @@ -19200,25 +19169,25 @@ } }, "@vue/compiler-dom": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.36.tgz", - "integrity": "sha512-tcOTAOiW4s24QLnq+ON6J+GRONXJ+A/mqKCORi0LSlIh8XQlNnlm24y8xIL8la+ZDgkdbjarQ9ZqYSvEja6gVA==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz", + "integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==", "requires": { - "@vue/compiler-core": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37" } }, "@vue/compiler-sfc": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.36.tgz", - "integrity": "sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz", + "integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.36", - "@vue/compiler-dom": "3.2.36", - "@vue/compiler-ssr": "3.2.36", - "@vue/reactivity-transform": "3.2.36", - "@vue/shared": "3.2.36", + "@vue/compiler-core": "3.2.37", + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-ssr": "3.2.37", + "@vue/reactivity-transform": "3.2.37", + "@vue/shared": "3.2.37", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -19233,12 +19202,12 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.36.tgz", - "integrity": "sha512-+KugInUFRvOxEdLkZwE+W43BqHyhBh0jpYXhmqw1xGq2dmE6J9eZ8UUSOKNhdHtQ/iNLWWeK/wPZkVLUf3YGaw==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz", + "integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==", "requires": { - "@vue/compiler-dom": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/compiler-dom": "3.2.37", + "@vue/shared": "3.2.37" } }, "@vue/devtools-api": { @@ -19247,57 +19216,57 @@ "integrity": "sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==" }, "@vue/reactivity": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.36.tgz", - "integrity": "sha512-c2qvopo0crh9A4GXi2/2kfGYMxsJW4tVILrqRPydVGZHhq0fnzy6qmclWOhBFckEhmyxmpHpdJtIRYGeKcuhnA==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz", + "integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==", "requires": { - "@vue/shared": "3.2.36" + "@vue/shared": "3.2.37" } }, "@vue/reactivity-transform": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.36.tgz", - "integrity": "sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz", + "integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.36", - "@vue/shared": "3.2.36", + "@vue/compiler-core": "3.2.37", + "@vue/shared": "3.2.37", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/runtime-core": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.36.tgz", - "integrity": "sha512-PTWBD+Lub+1U3/KhbCExrfxyS14hstLX+cBboxVHaz+kXoiDLNDEYAovPtxeTutbqtClIXtft+wcGdC+FUQ9qQ==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz", + "integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==", "requires": { - "@vue/reactivity": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/reactivity": "3.2.37", + "@vue/shared": "3.2.37" } }, "@vue/runtime-dom": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.36.tgz", - "integrity": "sha512-gYPYblm7QXHVuBohqNRRT7Wez0f2Mx2D40rb4fleehrJU9CnkjG0phhcGEZFfGwCmHZRqBCRgbFWE98bPULqkg==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz", + "integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==", "requires": { - "@vue/runtime-core": "3.2.36", - "@vue/shared": "3.2.36", + "@vue/runtime-core": "3.2.37", + "@vue/shared": "3.2.37", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.36.tgz", - "integrity": "sha512-uZE0+jfye6yYXWvAQYeHZv+f50sRryvy16uiqzk3jn8hEY8zTjI+rzlmZSGoE915k+W/Ol9XSw6vxOUD8dGkUg==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.37.tgz", + "integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==", "requires": { - "@vue/compiler-ssr": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/compiler-ssr": "3.2.37", + "@vue/shared": "3.2.37" } }, "@vue/shared": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.36.tgz", - "integrity": "sha512-JtB41wXl7Au3+Nl3gD16Cfpj7k/6aCroZ6BbOiCMFCMvrOpkg/qQUXTso2XowaNqBbnkuGHurLAqkLBxNGc1hQ==" + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz", + "integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==" }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -19750,9 +19719,9 @@ "dev": true }, "app-builder-lib": { - "version": "23.0.9", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.0.9.tgz", - "integrity": "sha512-2JboeCVrL+PksZ7IHp2teXbMUBnlucc3LhKGV+irxEA0l36bHs939AVtcaiATqyGnJcZkRdaB6TDd7SZfu+pxQ==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.1.0.tgz", + "integrity": "sha512-aZpKjBBLzyxtr4Cmbyi3dl8uRO8SI2PG2MYEKYRZL6pl7IsKP2hJkCYzlD6NjLJlRIAZcFPFjFbJliO74DFf7w==", "dev": true, "requires": { "@develar/schema-utils": "~2.6.5", @@ -19965,7 +19934,8 @@ "optional": true }, "async": { - "version": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { @@ -20573,15 +20543,15 @@ } }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz", + "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", + "caniuse-lite": "^1.0.30001349", + "electron-to-chromium": "^1.4.147", "escalade": "^3.1.1", - "node-releases": "^2.0.3", + "node-releases": "^2.0.5", "picocolors": "^1.0.0" } }, @@ -20621,13 +20591,13 @@ "buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", "dev": true }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, "buffer-from": { @@ -20845,9 +20815,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "version": "1.0.30001352", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", + "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", "dev": true }, "caseless": { @@ -20977,7 +20947,7 @@ "chromium-pickle-js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", "dev": true }, "ci-info": { @@ -21229,7 +21199,7 @@ "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", "dev": true }, "combined-stream": { @@ -21255,7 +21225,7 @@ "compare-version": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true }, "component-emitter": { @@ -21329,9 +21299,9 @@ } }, "conf": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.0.3.tgz", - "integrity": "sha512-4gtQ/Q36qVxBzMe6B7gWOAfni1VdhuHkIzxydHkclnwGmgN+eW4bb6jj73vigCfr7d3WlmqawvhZrpCUCTPYxQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.1.2.tgz", + "integrity": "sha512-o9Fv1Mv+6A0JpoayQ8JleNp3hhkbOJP/Re/Q+QqxMPHPkABVsRjQGWZn9A5GcqLiTNC6d89p2PB5ZhHVDSMwyg==", "requires": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", @@ -21346,9 +21316,9 @@ }, "dependencies": { "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -21370,9 +21340,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { "lru-cache": "^6.0.0" } @@ -22048,7 +22018,7 @@ "commander": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", "dev": true, "requires": { "graceful-readlink": ">= 1.0.0" @@ -22075,12 +22045,12 @@ } }, "dmg-builder": { - "version": "23.0.9", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.0.9.tgz", - "integrity": "sha512-a9mq85K31czOjso+T0aN9pWlmydzhehapU+ussFMD5FwD3l3JCK2ILlRfXuR3penbZT6LKCHuQFDIaZvsusY1w==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.1.0.tgz", + "integrity": "sha512-CzhPk/k12nJ2KqTbePkIwHOLiaWneQu2cgXCT9Hb5FhwI1vxTPalLsg8OZ57wKCrkL8AEftqqSff8gB5yWY/xw==", "dev": true, "requires": { - "app-builder-lib": "23.0.9", + "app-builder-lib": "23.1.0", "builder-util": "23.0.9", "builder-util-runtime": "9.0.2", "dmg-license": "^1.0.11", @@ -22297,17 +22267,17 @@ } }, "electron-builder": { - "version": "23.0.9", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.0.9.tgz", - "integrity": "sha512-qeAbUfgVOBMjrDfGaTDsM2wuiPsISbADKLaMM27HAeVTjs6o4UuUFl+DzDVPal3v61W6nAB9kvBTeU9RZ/jH7g==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.1.0.tgz", + "integrity": "sha512-UEblaQY8N9m8/HriOwl7jgFJ4olpWDXwdDBqwUkQiRHVNRnCfrA0u8LV03li5ZYhma6zFWzfIZbHd+uk8y//lQ==", "dev": true, "requires": { "@types/yargs": "^17.0.1", - "app-builder-lib": "23.0.9", + "app-builder-lib": "23.1.0", "builder-util": "23.0.9", "builder-util-runtime": "9.0.2", "chalk": "^4.1.1", - "dmg-builder": "23.0.9", + "dmg-builder": "23.1.0", "fs-extra": "^10.0.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -22442,7 +22412,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -22498,24 +22468,24 @@ } }, "electron-store": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.0.1.tgz", - "integrity": "sha512-ZyLvNywiqSpbwC/pp89O/AycVWY/UJIkmtyzF2Bd0Nm/rLmcFc0NTGuLdg6+LE8mS8qsiK5JMoe4PnrecLHH5w==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.0.2.tgz", + "integrity": "sha512-9GwUMv51w8ydbkaG7X0HrPlElXLApg63zYy1/VZ/a08ndl0gfm4iCoD3f0E1JvP3V16a+7KxqriCI0c122stiA==", "requires": { - "conf": "^10.0.3", - "type-fest": "^1.0.2" + "conf": "^10.1.2", + "type-fest": "^2.12.2" } }, "electron-to-chromium": { - "version": "1.4.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", - "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", + "version": "1.4.152", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.152.tgz", + "integrity": "sha512-jk4Ju5SGZAQQJ1iI4Rgru7dDlvkQPLpNPWH9gIZmwCD4YteA5Bbk1xPcPDUf5jUYs3e1e80RXdi8XgKQZaigeg==", "dev": true }, "electron-updater": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.4.tgz", - "integrity": "sha512-JBDRtm+631HTVTi5QEPF3THaPP1lB5Kz4ItGsAubYo7UF8i3akoIQlLzOcdskqS5TfukNdHxyq5NQnT/hI07OA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.5.tgz", + "integrity": "sha512-YcKEI9zpU+c0sNXTpjw3UpzP8Pfuuwo70T42oLYm0hHc0dy41ih51oENlhxgooa2+uzzpXhoCOyrpG+w6CB0Pw==", "dev": true, "requires": { "@types/semver": "^7.3.6", @@ -22525,7 +22495,8 @@ "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", - "semver": "^7.3.5" + "semver": "^7.3.5", + "typed-emitter": "^2.1.0" }, "dependencies": { "fs-extra": { @@ -23775,9 +23746,9 @@ } }, "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -24212,7 +24183,7 @@ "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", "dev": true }, "handle-thing": { @@ -24540,11 +24511,6 @@ "globalthis": "^1.0.2", "semver-compare": "^1.0.0" } - }, - "type-fest": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.0.tgz", - "integrity": "sha512-Qe5GRT+n/4GoqCNGGVp5Snapg1Omq3V7irBJB3EaKsp7HWDo5Gv2d/67gfNyV+d5EXD+x/RF5l1h4yJ7qNkcGA==" } } }, @@ -25083,7 +25049,7 @@ "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "requires": { - "async": "^3.2.3", + "async": "^2.3.0", "chalk": "^4.0.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" @@ -25343,9 +25309,9 @@ "dev": true }, "less": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", - "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, "requires": { "copy-anything": "^2.0.1", @@ -25354,32 +25320,12 @@ "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "needle": "^2.5.2", + "needle": "^3.1.0", "parse-node-version": "^1.0.1", "source-map": "~0.6.0", "tslib": "^2.3.0" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -25398,18 +25344,6 @@ "semver": "^5.6.0" } }, - "needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -26053,9 +25987,9 @@ } }, "node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", "dev": true }, "normalize-path": { @@ -28119,6 +28053,16 @@ "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.1.0" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -29599,7 +29543,7 @@ "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, "requires": { "utf8-byte-length": "^1.0.1" @@ -29667,9 +29611,9 @@ } }, "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz", + "integrity": "sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==" }, "type-is": { "version": "1.6.18", @@ -29680,6 +29624,15 @@ "mime-types": "~2.1.24" } }, + "typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "dev": true, + "requires": { + "rxjs": "*" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -29983,7 +29936,7 @@ "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", "dev": true }, "util-deprecate": { @@ -30037,25 +29990,25 @@ "dev": true }, "vue": { - "version": "3.2.36", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.36.tgz", - "integrity": "sha512-5yTXmrE6gW8IQgttzHW5bfBiFA6mx35ZXHjGLDmKYzW6MMmYvCwuKybANRepwkMYeXw2v1buGg3/lPICY5YlZw==", + "version": "3.2.37", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.37.tgz", + "integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==", "requires": { - "@vue/compiler-dom": "3.2.36", - "@vue/compiler-sfc": "3.2.36", - "@vue/runtime-dom": "3.2.36", - "@vue/server-renderer": "3.2.36", - "@vue/shared": "3.2.36" + "@vue/compiler-dom": "3.2.37", + "@vue/compiler-sfc": "3.2.37", + "@vue/runtime-dom": "3.2.37", + "@vue/server-renderer": "3.2.37", + "@vue/shared": "3.2.37" } }, "vue-i18n": { - "version": "9.2.0-beta.35", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.35.tgz", - "integrity": "sha512-kTYzZSB3B/ar3M9RfQ0KAyTGfvRw544qVzY++/sNV4stOKG6NxIDOdHdYTfVEXTSkczFwoZHTKXTWNVpx+GuHA==", + "version": "9.2.0-beta.36", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.36.tgz", + "integrity": "sha512-xdMBEFic9hUQ+i95gDfNx1UKzfGO7mptQfGOpfLZ2g9lR1yiFUaFEj42S2Epg5l1tDc9/NU4SE1eYcwHXcmluw==", "requires": { - "@intlify/core-base": "9.2.0-beta.35", - "@intlify/shared": "9.2.0-beta.35", - "@intlify/vue-devtools": "9.2.0-beta.35", + "@intlify/core-base": "9.2.0-beta.36", + "@intlify/shared": "9.2.0-beta.36", + "@intlify/vue-devtools": "9.2.0-beta.36", "@vue/devtools-api": "^6.0.0-beta.13" } }, @@ -30092,13 +30045,13 @@ } }, "vue-template-compiler": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz", - "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==", + "version": "2.7.0-alpha.6", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.0-alpha.6.tgz", + "integrity": "sha512-JDCP08Q5FW5Uvalk1TSQPVaVXgqnM7tvDZWpNuv38hy7MemdOglY+mp5NcX516BHo4kk2ImULpeDXlMFTupajw==", "dev": true, "requires": { "de-indent": "^1.0.2", - "he": "^1.1.0" + "he": "^1.2.0" } }, "vuex": { @@ -30272,15 +30225,16 @@ } }, "webpack-dev-server": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", - "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", + "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", diff --git a/package.json b/package.json index c39afa4e..921f71e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.22.0-beta", + "version": "1.22.0-beta.2", "description": "一个免费的音乐查找助手", "main": "./dist/main.js", "productName": "lx-music-desktop", @@ -188,7 +188,7 @@ "@babel/preset-env": "^7.18.2", "babel-loader": "^8.2.5", "babel-preset-minify": "^0.5.2", - "browserslist": "^4.20.3", + "browserslist": "^4.20.4", "chalk": "^4.1.2", "changelog-parser": "^2.8.1", "copy-webpack-plugin": "^11.0.0", @@ -198,11 +198,11 @@ "css-minimizer-webpack-plugin": "^4.0.0", "del": "^6.1.1", "electron": "^13.6.9", - "electron-builder": "^23.0.9", + "electron-builder": "^23.1.0", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.146", - "electron-updater": "^5.0.4", + "electron-to-chromium": "^1.4.152", + "electron-updater": "^5.0.5", "eslint": "^8.17.0", "eslint-config-standard": "^17.0.0", "eslint-formatter-friendly": "git+https://github.com/lyswhut/eslint-friendly-formatter.git#2170d1320e2fad13615a9dcf229669f0bb473a53", @@ -214,7 +214,7 @@ "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.5.0", - "less": "^4.1.2", + "less": "^4.1.3", "less-loader": "^11.0.0", "mini-css-extract-plugin": "^2.6.0", "node-loader": "^2.0.0", @@ -233,10 +233,10 @@ "terser-webpack-plugin": "^5.3.3", "url-loader": "^4.1.1", "vue-loader": "^17.0.0", - "vue-template-compiler": "^2.6.14", + "vue-template-compiler": "^2.7.0-alpha.6", "webpack": "^5.73.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.9.1", + "webpack-dev-server": "^4.9.2", "webpack-hot-middleware": "git+https://github.com/lyswhut/webpack-hot-middleware.git#329c4375134b89d39da23a56a94db651247c74a1", "webpack-merge": "^5.8.0" }, @@ -244,7 +244,7 @@ "bufferutil": "^4.0.6", "crypto-js": "^4.1.1", "electron-log": "^4.4.7", - "electron-store": "^8.0.1", + "electron-store": "^8.0.2", "font-list": "git+https://github.com/lyswhut/node-font-list.git#4edbb1933b49a9bac1eedd63a31da16b487fe57d", "http-terminator": "^3.2.0", "iconv-lite": "^0.6.3", @@ -259,8 +259,8 @@ "sortablejs": "^1.15.0", "tunnel": "^0.0.6", "utf-8-validate": "^5.0.9", - "vue": "^3.2.36", - "vue-i18n": "^9.2.0-beta.35", + "vue": "^3.2.37", + "vue-i18n": "^9.2.0-beta.36", "vue-router": "^4.1.0-aabe509", "vuex": "^4.0.2" }, From 2884e671098a030e4618228a2d4d6cd3779ec152 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Sun, 12 Jun 2022 18:01:26 +0800 Subject: [PATCH 21/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8Desc=E9=94=AE=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/core/useApp/useEventListener.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/core/useApp/useEventListener.js b/src/renderer/core/useApp/useEventListener.js index 0dab7290..19ed5dc9 100644 --- a/src/renderer/core/useApp/useEventListener.js +++ b/src/renderer/core/useApp/useEventListener.js @@ -14,8 +14,8 @@ import { const handle_key_down = ({ event, type, key }) => { // console.log(key) - if (key != 'escape' || !event || event.repeat || type == 'up' || window.isEditingHotKey) return - if (event.target.tagName != 'INPUT' || event.target.classList.contains('ignore-esc')) { + if (key != 'escape' || !event || event.repeat || type == 'up' || window.isEditingHotKey || event.target.classList.contains('ignore-esc')) return + if (event.target.tagName != 'INPUT') { if (isFullscreen.value) { event.lx_handled = true rendererInvoke(NAMES.mainWindow.fullscreen, false).then(fullscreen => { From 283bdd6246138c59b146589273d76400a5022d67 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Mon, 13 Jun 2022 12:57:25 +0800 Subject: [PATCH 22/32] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=AD=8C=E6=9B=B2?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9B=B4=E6=96=B0=E6=93=8D=E4=BD=9C=E7=9A=84?= =?UTF-8?q?=E4=BA=8C=E6=AC=A1=E7=A1=AE=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/lang/en-us.json | 1 + src/lang/zh-cn.json | 1 + src/lang/zh-tw.json | 1 + src/renderer/views/list/components/MyLists.vue | 8 +++++++- 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 68fab6e8..afb02435 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -6,6 +6,7 @@ - 添加歌曲到“我的列表”时,若按住`ctrl`键(Mac对应`Command`),则不会自动关闭添加窗口,这对想要将同一首(一批)歌曲添加到多个列表时会很有用 - 支持mg源逐字歌词的播放,感谢 @mozbugbox 提供的帮助 +- 添加歌曲列表更新操作的二次确认 ### 修复 diff --git a/src/lang/en-us.json b/src/lang/en-us.json index a44f3cc2..78b064f1 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -127,6 +127,7 @@ "lists__sort_list": "Sort songs", "lists__source_detail": "Playlist Page", "lists__sync": "Update", + "lists__sync_confirm_tip": "This will replace the songs in {name} with the songs in the online list, are you sure you want to update?", "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}", "load_list_file_error_title": "Error loading playlist data", "loding_list": "Loading...", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index a6eded57..1214d9e7 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -127,6 +127,7 @@ "lists__sort_list": "排序歌曲", "lists__source_detail": "歌单详情页", "lists__sync": "更新", + "lists__sync_confirm_tip": "这将会把 {name} 内的歌曲替换成在线列表的歌曲,你确认要更新吗?", "load_list_file_error_detail": "我们已经帮你把旧的列表文件备份到{path}\n它以 JSON 格式存储,你可以尝试手动修复并恢复它\n\n错误详情:{detail}", "load_list_file_error_title": "播放列表数据加载错误(建议到GitHub或加群反馈)", "loding": "加载中...", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index dff22825..190c4be0 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -127,6 +127,7 @@ "lists__sort_list": "排序歌曲", "lists__source_detail": "歌單詳情頁", "lists__sync": "更新", + "lists__sync_confirm_tip": "這將會把 {name} 內的歌曲替換成在線列表的歌曲,你確認要更新嗎?", "load_list_file_error_detail": "我們已經幫你把舊的列表文件備份到{path}\n它以 JSON 格式存儲,你可以嘗試手動修復並恢復它\n\n錯誤詳情:{detail}", "load_list_file_error_title": "播放列表數據加載錯誤", "loding": "加載中...", diff --git a/src/renderer/views/list/components/MyLists.vue b/src/renderer/views/list/components/MyLists.vue index 3990a09f..a762b519 100644 --- a/src/renderer/views/list/components/MyLists.vue +++ b/src/renderer/views/list/components/MyLists.vue @@ -352,7 +352,13 @@ export default { this.handleExportList(index) break case 'sync': - this.handleSyncSourceList(userLists[index]) + this.$dialog.confirm({ + message: this.$t('lists__sync_confirm_tip', { name: userLists[index].name }), + confirmButtonText: this.$t('lists__remove_tip_button'), + }).then(isSync => { + if (!isSync) return + this.handleSyncSourceList(userLists[index]) + }) break case 'remove': this.$dialog.confirm({ From aa5e62118495a16a5f9d732344096d7ac2cdad16 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 14 Jun 2022 11:43:18 +0800 Subject: [PATCH 23/32] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=BE=E7=BD=AE-?= =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E6=AD=8C=E8=AF=8D=E8=AE=BE=E7=BD=AE-?= =?UTF-8?q?=E9=BC=A0=E6=A0=87=E7=A7=BB=E5=85=A5=E6=AD=8C=E8=AF=8D=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E6=97=B6=E9=99=8D=E4=BD=8E=E6=AD=8C=E8=AF=8D=E9=80=8F?= =?UTF-8?q?=E6=98=8E=E5=BA=A6=EF=BC=88#883=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 1 + src/common/defaultSetting.js | 3 +- src/lang/en-us.json | 1 + src/lang/zh-cn.json | 1 + src/lang/zh-tw.json | 1 + src/main/modules/winLyric/event.js | 4 +- src/main/modules/winLyric/index.js | 2 +- src/renderer-lyric/App.vue | 79 ++++++++++++++++++- .../components/SettingDesktopLyric.vue | 2 + src/renderer/views/setting/setting.js | 1 + 10 files changed, 88 insertions(+), 7 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index afb02435..e6bc4d59 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,6 +1,7 @@ ### 新增 - 新增设置-以全屏模式启动设置 +- 新增设置-桌面歌词设置-鼠标移入歌词区域时降低歌词透明度,默认关闭,注:此功能存在平台兼容性问题,若鼠标移入移出的间隔过短可能会导致无法恢复到正常透明度,这时尝试再移入移出即可恢复(#883) ### 优化 diff --git a/src/common/defaultSetting.js b/src/common/defaultSetting.js index 8904b1d9..45bd8e7b 100644 --- a/src/common/defaultSetting.js +++ b/src/common/defaultSetting.js @@ -2,7 +2,7 @@ const path = require('path') const os = require('os') const defaultSetting = { - version: '1.0.58', + version: '1.0.59', player: { togglePlayMethod: 'listLoop', highQuality: false, @@ -41,6 +41,7 @@ const defaultSetting = { theme: 0, isLockScreen: true, isDelayScroll: true, + isHoverHide: false, style: { font: '', fontSize: 120, diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 78b064f1..35d050d7 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -269,6 +269,7 @@ "setting__desktop_lyric_enable": "Display lyrics", "setting__desktop_lyric_font": "Lyric font", "setting__desktop_lyric_font_default": "Default", + "setting__desktop_lyric_hover_hide": "Reduce the transparency of lyrics when the mouse moves into the lyrics area (this feature has platform compatibility issues)", "setting__desktop_lyric_lock": "Lock lyrics", "setting__desktop_lyric_lock_screen": "It is not allowed to drag the lyrics window out of the main screen", "setting__download": "Download", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 1214d9e7..0dd444bd 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -269,6 +269,7 @@ "setting__desktop_lyric_enable": "显示歌词", "setting__desktop_lyric_font": "歌词字体", "setting__desktop_lyric_font_default": "默认", + "setting__desktop_lyric_hover_hide": "鼠标移入歌词区域时降低歌词透明度(此功能存在平台兼容性问题)", "setting__desktop_lyric_lock": "锁定歌词", "setting__desktop_lyric_lock_screen": "不允许歌词窗口拖出主屏幕之外", "setting__download": "下载设置", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 190c4be0..8640b371 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -269,6 +269,7 @@ "setting__desktop_lyric_enable": "顯示歌詞", "setting__desktop_lyric_font": "歌詞字體", "setting__desktop_lyric_font_default": "默認", + "setting__desktop_lyric_hover_hide": "鼠標移入歌詞區域時降低歌詞透明度(此功能存在平台兼容性問題)", "setting__desktop_lyric_lock": "鎖定歌詞", "setting__desktop_lyric_lock_screen": "不允許歌詞窗口拖出主屏幕之外", "setting__download": "下載設置", diff --git a/src/main/modules/winLyric/event.js b/src/main/modules/winLyric/event.js index 4e4b8e97..7259201c 100644 --- a/src/main/modules/winLyric/event.js +++ b/src/main/modules/winLyric/event.js @@ -47,9 +47,9 @@ const setLrcConfig = () => { if (isLock != desktopLyric.isLock) { isLock = desktopLyric.isLock if (desktopLyric.isLock) { - global.modules.lyricWindow.setIgnoreMouseEvents(true, { forward: false }) + global.modules.lyricWindow.setIgnoreMouseEvents(true, { forward: true }) } else { - global.modules.lyricWindow.setIgnoreMouseEvents(false) + global.modules.lyricWindow.setIgnoreMouseEvents(false, { forward: true }) } } if (isAlwaysOnTop != desktopLyric.isAlwaysOnTop) { diff --git a/src/main/modules/winLyric/index.js b/src/main/modules/winLyric/index.js index 575f1243..2827dc6c 100644 --- a/src/main/modules/winLyric/index.js +++ b/src/main/modules/winLyric/index.js @@ -64,7 +64,7 @@ const winEvent = lyricWindow => { lyricWindow.once('ready-to-show', () => { lyricWindow.show() if (global.appSetting.desktopLyric.isLock) { - global.modules.lyricWindow.setIgnoreMouseEvents(true, { forward: false }) + global.modules.lyricWindow.setIgnoreMouseEvents(true, { forward: true }) } // linux下每次重开时貌似要重新设置置顶 if (isLinux && global.appSetting.desktopLyric.isAlwaysOnTop) { diff --git a/src/renderer-lyric/App.vue b/src/renderer-lyric/App.vue index b4401d94..ae23bb8c 100644 --- a/src/renderer-lyric/App.vue +++ b/src/renderer-lyric/App.vue @@ -1,6 +1,6 @@