From 996396c943d5bf366d2b51ce65e9f2e78dc2767d Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 4 Feb 2022 18:29:48 +0800 Subject: [PATCH 01/50] =?UTF-8?q?=E8=BF=87=E6=BB=A4tx=E6=BA=90=E6=9F=90?= =?UTF-8?q?=E4=BA=9B=E4=B8=8D=E6=94=AF=E6=8C=81=E6=92=AD=E6=94=BE=E7=9A=84?= =?UTF-8?q?=E6=AD=8C=E6=9B=B2=EF=BC=8C=E8=A7=A3=E5=86=B3=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E6=AD=A4=E7=B1=BB=E5=86=85=E5=AE=B9=E4=BC=9A=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=84=8F=E5=A4=96=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 | 7 +------ src/renderer/utils/music/tx/musicSearch.js | 10 +++++++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index ac15941d..a2b5e790 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,11 +1,6 @@ ### 优化 -- 优化kw源英文与翻译歌词的匹配 - -### 修复 - -- 修复快捷键与默认按键行为冲突的问题,现在若将某些有默认行为的按键(如在列表中上、下箭头、Home、End等键可以使列表滚动)设置为快捷键时,将禁用其默认行为 -- 修复列表的聚焦问题,现在在列表中使用上、下箭头、空格等键滚动列表时不会导致滚动到一定距离后丢失焦点的问题 +- 过滤tx源某些不支持播放的歌曲,解决播放此类内容会导致意外的问题 ### 其他 diff --git a/src/renderer/utils/music/tx/musicSearch.js b/src/renderer/utils/music/tx/musicSearch.js index ffe1328d..00d84627 100644 --- a/src/renderer/utils/music/tx/musicSearch.js +++ b/src/renderer/utils/music/tx/musicSearch.js @@ -32,7 +32,10 @@ export default { }, handleResult(rawList) { // console.log(rawList) - return rawList.map(item => { + const list = [] + rawList.forEach(item => { + if (!item.strMediaMid) return + let types = [] let _types = {} if (item.size128 !== 0) { @@ -64,7 +67,7 @@ export default { } } // types.reverse() - return { + list.push({ singer: this.getSinger(item.singer), name: item.songname, albumName: item.albumname, @@ -83,8 +86,9 @@ export default { types, _types, typeUrl: {}, - } + }) }) + return list }, search(str, page = 1, { limit } = {}) { if (limit == null) limit = this.limit From 6df01edc7aa9cd05e5370336e30cc427f1afcd1d Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 4 Feb 2022 18:30:06 +0800 Subject: [PATCH 02/50] =?UTF-8?q?=E6=9B=B4=E6=96=B0electron=E5=88=B0v13.6.?= =?UTF-8?q?9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 14 +++++++------- package.json | 2 +- publish/changeLog.md | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 69dc40d0..c2bf1fc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.17.0", + "version": "1.17.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -6426,9 +6426,9 @@ } }, "electron": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.8.tgz", - "integrity": "sha512-e1wEPTzbPXwUlIdayqeTHYeq+HHPx0X2zZZfjnzD1H5EujmPvOg84TBw7meNctk9d/yLz+GTRySydUNS9ZdY9A==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.9.tgz", + "integrity": "sha512-Es/sBy85NIuqsO9MW41PUCpwIkeinlTQ7g0ainfnmRAM2rmog3GBxVCaoV5dzEjwTF7TKG1Yr/E7Z3qHmlfWAg==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -6437,9 +6437,9 @@ }, "dependencies": { "@types/node": { - "version": "14.18.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.9.tgz", - "integrity": "sha512-j11XSuRuAlft6vLDEX4RvhqC0KxNxx6QIyMXNb0vHHSNPXTPeiy3algESWmOOIzEtiEL0qiowPU3ewW9hHVa7Q==", + "version": "14.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", + "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", "dev": true } } diff --git a/package.json b/package.json index 0a43ccc8..41ba0856 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "css-loader": "^6.5.1", "css-minimizer-webpack-plugin": "^3.4.1", "del": "^6.0.0", - "electron": "^13.6.8", + "electron": "^13.6.9", "electron-builder": "^22.11.7", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", diff --git a/publish/changeLog.md b/publish/changeLog.md index a2b5e790..4631d8ba 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -4,4 +4,4 @@ ### 其他 -- 更新electron到v13.6.8 +- 更新electron到v13.6.9 From 8e4e7d9efa9c8310cc5dd236bf651d9fd3ff5068 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Mon, 7 Feb 2022 13:02:46 +0800 Subject: [PATCH 03/50] =?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 | 435 +++++++++++++++++++++++++++++++--------------- package.json | 28 +-- 2 files changed, 308 insertions(+), 155 deletions(-) diff --git a/package-lock.json b/package-lock.json index c2bf1fc2..4bc50bc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,15 @@ "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", "dev": true }, + "@ampproject/remapping": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.0.4.tgz", + "integrity": "sha512-zU3pj3pf//YhaoozRTYKaL20KopXrzuZFc/8Ylc49AuV8grYKH23TTq9JJoR70F8zQbil58KjSchZTWeX+jrIQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -26,26 +35,26 @@ "dev": true }, "@babel/core": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", - "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.0.tgz", + "integrity": "sha512-x/5Ea+RO5MvF9ize5DeVICJoVrNv0Mi2RnIABrZEKYvPEpldXwauPkgvYA17cKa6WpU3LoYvYbuEMFtSNFsarA==", "dev": true, "requires": { + "@ampproject/remapping": "^2.0.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", + "@babel/generator": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.12", + "@babel/helpers": "^7.17.0", + "@babel/parser": "^7.17.0", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "dependencies": { "@babel/code-frame": { @@ -57,6 +66,17 @@ "@babel/highlight": "^7.16.7" } }, + "@babel/generator": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz", + "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", @@ -75,15 +95,33 @@ } }, "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", "dev": true }, + "@babel/traverse": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz", + "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.0", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -104,9 +142,9 @@ } }, "@babel/eslint-parser": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", - "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", + "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", "dev": true, "requires": { "eslint-scope": "^5.1.1", @@ -1016,31 +1054,97 @@ } }, "@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.0.tgz", + "integrity": "sha512-Xe/9NFxjPwELUvW2dsukcMZIp6XwPSbI4ojFBJuX5ramHuVE22SVcZIwqzdWo5uCgeTXW8qV97lMvSOjq+1+nQ==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz", + "integrity": "sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "dev": true + }, + "@babel/traverse": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz", + "integrity": "sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.0", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } } } }, @@ -2017,9 +2121,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", - "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", + "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.16.7", @@ -2579,9 +2683,9 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -2608,9 +2712,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2673,6 +2777,28 @@ "@intlify/shared": "9.2.0-beta.29" } }, + "@jridgewell/resolve-uri": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.4.tgz", + "integrity": "sha512-cz8HFjOFfUBtvN+NXYSFMHYRdxZMaEl0XypVrhzxBgadKIXhIkRd8aMeHhmF56Sl7SuS8OnUpQ73/k9LE4VnLg==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.10.tgz", + "integrity": "sha512-Ht8wIW5v165atIX1p+JvKR5ONzUyF4Ac8DZIQ5kZs9zrb6M8SJNXpx1zn04rn65VjBMygRoMXcyYwNK0fT7bEg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.2.tgz", + "integrity": "sha512-9KzzH4kMjA2XmBRHfqG2/Vtl7s92l6uNDd0wW7frDE+EUvQFGqNXhWp0UGJjSkt3v2AYjzOZn1QO9XaTNJIt1Q==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@malept/cross-spawn-promise": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", @@ -3461,6 +3587,12 @@ "string-width": "^4.1.0" } }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -4932,9 +5064,9 @@ } }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -5527,9 +5659,9 @@ "dev": true }, "copy-webpack-plugin": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", - "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", "dev": true, "requires": { "fast-glob": "^3.2.7", @@ -5547,9 +5679,9 @@ "dev": true }, "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5664,9 +5796,9 @@ } }, "core-js": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", - "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.0.tgz", + "integrity": "sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ==", "dev": true }, "core-js-compat": { @@ -5765,21 +5897,27 @@ } }, "css-loader": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", - "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.6.0.tgz", + "integrity": "sha512-FK7H2lisOixPT406s5gZM1S3l8GrfhEBT3ZiL2UX1Ng1XWs0y2GPllz/OTyvbaHe12VgQrIXIzuEGVlbUhodqg==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.2.15", + "postcss": "^8.4.5", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", + "postcss-value-parser": "^4.2.0", "semver": "^7.3.5" }, "dependencies": { + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -6631,9 +6769,9 @@ } }, "electron-log": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.5.tgz", - "integrity": "sha512-Cfa2CKnwBhlUfIl/qr2GF5SCqfoA9yPBqTJ6/wPs+PEn36M2+EZ3RpGSaOhYQ1BZpolL1CWyeu3gMG8epLl3Ng==" + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.6.tgz", + "integrity": "sha512-nirYgRdY+F+vclr8ijdwy2vW03IzFpDHTaKNWu76dEN21Y76+smcES5knS7cgHUUB0qNLOi8vZO36taakjbSXA==" }, "electron-publish": { "version": "22.11.7", @@ -6769,9 +6907,9 @@ } }, "electron-to-chromium": { - "version": "1.4.56", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz", - "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==", + "version": "1.4.65", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.65.tgz", + "integrity": "sha512-0/d8Skk8sW3FxXP0Dd6MnBlrwx7Qo9cqQec3BlIAlvKnrmS3pHsIbaroEi+nd0kZkGpQ6apMEre7xndzjlEnLw==", "dev": true }, "electron-updater": { @@ -7051,9 +7189,9 @@ "dev": true }, "eslint": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", - "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.5", @@ -7130,6 +7268,12 @@ "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7137,9 +7281,9 @@ "dev": true }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -7513,9 +7657,9 @@ "dev": true }, "eslint-plugin-vue": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.4.0.tgz", - "integrity": "sha512-Ga96QRG8GA9AyzKtEDxqYRCMt/VJM4SLkcNmm4FvUiFBE4jpaBr25unRBi9iVmHLYhA9EZ/4I+jD8n1vfWzyAA==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.4.1.tgz", + "integrity": "sha512-nmWOhNmDx9TZ+yP9ZhezTkZUupSHsYA2TocRm+efPSXMOyFrVczVlaIuQcLBjCtI8CbkBiUQ3VcyQsjlIhDrhA==", "dev": true, "requires": { "eslint-utils": "^3.0.0", @@ -7543,14 +7687,6 @@ "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } } }, "eslint-utils": { @@ -7660,9 +7796,9 @@ "dev": true }, "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true } } @@ -7674,6 +7810,14 @@ "dev": true, "requires": { "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "esrecurse": { @@ -7683,12 +7827,20 @@ "dev": true, "requires": { "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "estree-walker": { @@ -8321,9 +8473,9 @@ } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "flatten": { @@ -8941,12 +9093,12 @@ } }, "http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", + "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", "dev": true, "requires": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -10429,9 +10581,9 @@ "dev": true }, "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" }, "nanomatch": { "version": "1.2.13", @@ -11141,13 +11293,13 @@ "dev": true }, "postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", + "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", "requires": { - "nanoid": "^3.1.30", + "nanoid": "^3.2.0", "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.2" } }, "postcss-calc": { @@ -11389,9 +11541,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -12597,9 +12749,9 @@ } }, "regexp.prototype.flags": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.2.tgz", - "integrity": "sha512-uaro52GSI5be7+ssxjxxnLlleDBN3VHIWQHvBhfeeSXRQkuV/0Jo/hBU+omYH6NUkM+LYpTHnRRf2W/v+x7LzQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -13469,9 +13621,9 @@ "dev": true }, "source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-resolve": { "version": "0.5.3", @@ -14263,12 +14415,12 @@ } }, "terser-webpack-plugin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", - "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "requires": { - "jest-worker": "^27.4.1", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", @@ -14306,9 +14458,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", - "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", + "version": "27.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.0.tgz", + "integrity": "sha512-8OEHiPNOPTfaWnJ2SUHM8fmgeGq37uuGsQBvGKQJl1f+6WIy6g7G3fE2ruI5294bUKUI9FaCWt5hDvO8HSwsSg==", "dev": true, "requires": { "@types/node": "*", @@ -15061,6 +15213,12 @@ "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -15153,9 +15311,9 @@ } }, "webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.68.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.68.0.tgz", + "integrity": "sha512-zUcqaUO0772UuuW2bzaES2Zjlm/y3kRBQDVFVCge+s2Y8mwuUTdperGaAv65/NtRL/1zanpSJOq/MD8u61vo6g==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -15269,13 +15427,13 @@ } }, "webpack-dev-middleware": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", - "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", "dev": true, "requires": { "colorette": "^2.0.10", - "memfs": "^3.2.2", + "memfs": "^3.4.1", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -15288,9 +15446,9 @@ "dev": true }, "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -15352,19 +15510,20 @@ } }, "webpack-dev-server": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", - "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", + "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", "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/sockjs": "^0.3.33", "@types/ws": "^8.2.2", "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", @@ -15384,8 +15543,8 @@ "sockjs": "^0.3.21", "spdy": "^4.0.2", "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.0", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "dependencies": { "@types/json-schema": { @@ -15395,9 +15554,9 @@ "dev": true }, "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -15423,12 +15582,6 @@ } } }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -15680,9 +15833,9 @@ } }, "ws": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.1.tgz", - "integrity": "sha512-6eqQ4yN2y2xv8b+BgbkUzPPyfo/PDl3VOWb06ZE0jIFYwuHMsMQN6F7o84yxJYCblfCRAxzpU59We4Rr4w0Luw==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "dev": true }, "xdg-basedir": { diff --git a/package.json b/package.json index 41ba0856..349a73e2 100644 --- a/package.json +++ b/package.json @@ -173,12 +173,12 @@ }, "homepage": "https://github.com/lyswhut/lx-music-desktop#readme", "devDependencies": { - "@babel/core": "^7.16.12", - "@babel/eslint-parser": "^7.16.5", + "@babel/core": "^7.17.0", + "@babel/eslint-parser": "^7.17.0", "@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.16.10", + "@babel/plugin-transform-runtime": "^7.17.0", "@babel/polyfill": "^7.12.1", "@babel/preset-env": "^7.16.11", "babel-loader": "^8.2.3", @@ -187,18 +187,18 @@ "cfonts": "^2.10.0", "chalk": "^4.1.2", "changelog-parser": "^2.8.0", - "copy-webpack-plugin": "^10.2.1", - "core-js": "^3.20.3", + "copy-webpack-plugin": "^10.2.4", + "core-js": "^3.21.0", "cross-env": "^7.0.3", - "css-loader": "^6.5.1", + "css-loader": "^6.6.0", "css-minimizer-webpack-plugin": "^3.4.1", "del": "^6.0.0", "electron": "^13.6.9", "electron-builder": "^22.11.7", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.56", - "eslint": "^8.7.0", + "electron-to-chromium": "^1.4.65", + "eslint": "^8.8.0", "eslint-config-standard": "^16.0.3", "eslint-formatter-friendly": "^7.0.0", "eslint-plugin-html": "^6.2.0", @@ -206,7 +206,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.0.0", "eslint-plugin-standard": "^4.1.0", - "eslint-plugin-vue": "^8.4.0", + "eslint-plugin-vue": "^8.4.1", "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.5.0", @@ -215,7 +215,7 @@ "markdown-it": "^12.3.2", "mini-css-extract-plugin": "^2.5.3", "node-loader": "^2.0.0", - "postcss": "^8.4.5", + "postcss": "^8.4.6", "postcss-loader": "^6.2.1", "postcss-pxtorem": "^6.0.0", "pug": "^3.0.2", @@ -227,20 +227,20 @@ "svg-sprite-loader": "^6.0.11", "svg-transform-loader": "^2.0.13", "svgo-loader": "^3.0.0", - "terser-webpack-plugin": "^5.3.0", + "terser-webpack-plugin": "^5.3.1", "url-loader": "^4.1.1", "vue-loader": "^17.0.0", "vue-template-compiler": "^2.6.14", - "webpack": "^5.67.0", + "webpack": "^5.68.0", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.7.3", + "webpack-dev-server": "^4.7.4", "webpack-hot-middleware": "github:lyswhut/webpack-hot-middleware#329c4375134b89d39da23a56a94db651247c74a1", "webpack-merge": "^5.8.0" }, "dependencies": { "bufferutil": "^4.0.6", "crypto-js": "^4.1.1", - "electron-log": "^4.4.5", + "electron-log": "^4.4.6", "electron-store": "^8.0.1", "electron-updater": "^4.6.1", "font-list": "github:lyswhut/node-font-list#4edbb1933b49a9bac1eedd63a31da16b487fe57d", From 0588f2846bfb5bdc730466047d2ff8d0aa07bbe3 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 8 Feb 2022 17:34:58 +0800 Subject: [PATCH 04/50] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f3d8d4f1..f8a9dcc1 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ 软件变化请查看:[更新日志](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://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md)
+移动版项目地址: #### Scheme URL支持 From 80fc43a075897d8928afe993eabe8e040b8e5274 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 9 Feb 2022 19:53:26 +0800 Subject: [PATCH 05/50] =?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 | 222 +++++++++++++++++++++++----------------------- package.json | 8 +- 2 files changed, 115 insertions(+), 115 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4bc50bc2..db78fc7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,9 @@ "dev": true }, "@ampproject/remapping": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.0.4.tgz", - "integrity": "sha512-zU3pj3pf//YhaoozRTYKaL20KopXrzuZFc/8Ylc49AuV8grYKH23TTq9JJoR70F8zQbil58KjSchZTWeX+jrIQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.0.tgz", + "integrity": "sha512-d5RysTlJ7hmw5Tw4UxgxcY3lkMe92n8sXCcuLPAyIAHK6j8DefDwtGnVVDgOnv+RnEosulDJ9NPKQL27bDId0g==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" @@ -35,9 +35,9 @@ "dev": true }, "@babel/core": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.0.tgz", - "integrity": "sha512-x/5Ea+RO5MvF9ize5DeVICJoVrNv0Mi2RnIABrZEKYvPEpldXwauPkgvYA17cKa6WpU3LoYvYbuEMFtSNFsarA==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz", + "integrity": "sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==", "dev": true, "requires": { "@ampproject/remapping": "^2.0.0", @@ -45,7 +45,7 @@ "@babel/generator": "^7.17.0", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.17.0", + "@babel/helpers": "^7.17.2", "@babel/parser": "^7.17.0", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.0", @@ -1054,9 +1054,9 @@ } }, "@babel/helpers": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.0.tgz", - "integrity": "sha512-Xe/9NFxjPwELUvW2dsukcMZIp6XwPSbI4ojFBJuX5ramHuVE22SVcZIwqzdWo5uCgeTXW8qV97lMvSOjq+1+nQ==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", + "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", "dev": true, "requires": { "@babel/template": "^7.16.7", @@ -2729,30 +2729,30 @@ "dev": true }, "@intlify/core-base": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.29.tgz", - "integrity": "sha512-4HzfpBC0pBjud26vWXhy+HRrcJR+KsQPpGbIbS/FVbqeUTOX90+RsBC5HOpIVmdeVPpzQUyzKAZdj+hkTQYQ3Q==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.30.tgz", + "integrity": "sha512-tnOuI8gs4S7vv4WjG8oFL7vbZ4PM7Is/Ld3lRHQlBO7UjpnCVcQ94AgP/4F0cUPFn9JSPMQRN0aOOahW1BXvSA==", "requires": { - "@intlify/devtools-if": "9.2.0-beta.29", - "@intlify/message-compiler": "9.2.0-beta.29", - "@intlify/shared": "9.2.0-beta.29", - "@intlify/vue-devtools": "9.2.0-beta.29" + "@intlify/devtools-if": "9.2.0-beta.30", + "@intlify/message-compiler": "9.2.0-beta.30", + "@intlify/shared": "9.2.0-beta.30", + "@intlify/vue-devtools": "9.2.0-beta.30" } }, "@intlify/devtools-if": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.29.tgz", - "integrity": "sha512-AEF+K/VYTR1FkakCi8ZQOARcla2wOdX4khS5X4zEcUwl06VSaN0ilBnLX4727zcVU5jh8YkOM0uERLLyf2lxeg==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.30.tgz", + "integrity": "sha512-3OxGFi6ooya9DFqX/JsxFjrj9nGYcDoo4CRGYSDqnC+xv4bnsyB5ekmaYBiVZtagCdZdSUMxbTFphl1WbtgNLQ==", "requires": { - "@intlify/shared": "9.2.0-beta.29" + "@intlify/shared": "9.2.0-beta.30" } }, "@intlify/message-compiler": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.29.tgz", - "integrity": "sha512-FvMDwe57VvupujvNYUY90J8wv26wKu6j7I93dLwBOo/PTg7nQqFrmYQAF23UfDAdXO4FTdgHfFyb5ecYrN+n3g==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.30.tgz", + "integrity": "sha512-2kj/0nLIFrgiO86f9VifcUUcV8LdzXt4YYPIujx/LkTEQOuSFUo/bNiMaG1hyfiU/8mfq6tsaWKjoOZjeao1eQ==", "requires": { - "@intlify/shared": "9.2.0-beta.29", + "@intlify/shared": "9.2.0-beta.30", "source-map": "0.6.1" }, "dependencies": { @@ -2764,17 +2764,17 @@ } }, "@intlify/shared": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.29.tgz", - "integrity": "sha512-blMW14WBr3fiCEk/XO4IbSxM8WMAhQOzEgWzP1aqbkeXbIMiHeyFI0ZexwyTKsvDZz0wEWlhupQi+9udrJsozA==" + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.30.tgz", + "integrity": "sha512-E1WHRTIlUEse3d/6t1pAagSXRxmeVeNIhx5kT80dfpYxw8lOnCWV9wLve2bq9Fkv+3TD2I5j+CdN7jvSl3LdsA==" }, "@intlify/vue-devtools": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.29.tgz", - "integrity": "sha512-VkeSxU4RLiY89MT5POET+szYJbfmRG1rR2Ndw7Rgqgl7UqiL4ayTdT/VN6I9lw41nK98deK0QXv/FqWmUOyJGg==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.30.tgz", + "integrity": "sha512-hcqDfwP/oXVmVCaJ0RA+uv1WSCcd42/Y13S0bySmWZv2KamLcxiD7wYxp/MaECG/D4KZcSLkq/wDHTG7lhYf5Q==", "requires": { - "@intlify/core-base": "9.2.0-beta.29", - "@intlify/shared": "9.2.0-beta.29" + "@intlify/core-base": "9.2.0-beta.30", + "@intlify/shared": "9.2.0-beta.30" } }, "@jridgewell/resolve-uri": { @@ -2790,9 +2790,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.2.tgz", - "integrity": "sha512-9KzzH4kMjA2XmBRHfqG2/Vtl7s92l6uNDd0wW7frDE+EUvQFGqNXhWp0UGJjSkt3v2AYjzOZn1QO9XaTNJIt1Q==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -3179,20 +3179,20 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.29.tgz", - "integrity": "sha512-RePZ/J4Ub3sb7atQw6V6Rez+/5LCRHGFlSetT3N4VMrejqJnNPXKUt5AVm/9F5MJriy2w/VudEIvgscCfCWqxw==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.30.tgz", + "integrity": "sha512-64fq1KfcR+k3Vlw+IsBM2VhV5B+2IP3YxvKU8LWCDLrkmlXtbf2eMK6+0IwX5KP41D0f1gzryIiXR7P8cB9O5Q==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.29", + "@vue/shared": "3.2.30", "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, "dependencies": { "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==" }, "source-map": { "version": "0.6.1", @@ -3202,25 +3202,25 @@ } }, "@vue/compiler-dom": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.29.tgz", - "integrity": "sha512-y26vK5khdNS9L3ckvkqJk/78qXwWb75Ci8iYLb67AkJuIgyKhIOcR1E8RIt4mswlVCIeI9gQ+fmtdhaiTAtrBQ==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.30.tgz", + "integrity": "sha512-t7arHz2SXLCXlF2fdGDFVbhENbGMez254Z5edUqb//6WXJU1lC7GvSkUE7i5x8WSjgfqt60i0V8zdmk16rvLdw==", "requires": { - "@vue/compiler-core": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/compiler-core": "3.2.30", + "@vue/shared": "3.2.30" } }, "@vue/compiler-sfc": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.29.tgz", - "integrity": "sha512-X9+0dwsag2u6hSOP/XsMYqFti/edvYvxamgBgCcbSYuXx1xLZN+dS/GvQKM4AgGS4djqo0jQvWfIXdfZ2ET68g==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.30.tgz", + "integrity": "sha512-P/5YpILtcQY92z72gxhkyOUPHVskEzhSrvYi91Xcr+csOxaDaYU5OqOxCzZKcf3Og70Tat404vO1OHrwprN90A==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.29", - "@vue/compiler-dom": "3.2.29", - "@vue/compiler-ssr": "3.2.29", - "@vue/reactivity-transform": "3.2.29", - "@vue/shared": "3.2.29", + "@vue/compiler-core": "3.2.30", + "@vue/compiler-dom": "3.2.30", + "@vue/compiler-ssr": "3.2.30", + "@vue/reactivity-transform": "3.2.30", + "@vue/shared": "3.2.30", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -3228,9 +3228,9 @@ }, "dependencies": { "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==" }, "source-map": { "version": "0.6.1", @@ -3240,12 +3240,12 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.29.tgz", - "integrity": "sha512-LrvQwXlx66uWsB9/VydaaqEpae9xtmlUkeSKF6aPDbzx8M1h7ukxaPjNCAXuFd3fUHblcri8k42lfimHfzMICA==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.30.tgz", + "integrity": "sha512-OUh3MwAu/PsD7VN3UOdBbTkltkrUCNouSht47+CMRzpUR5+ta7+xyMAVHeq8wg4YZenWaJimbR5TL35Ka4Vk6g==", "requires": { - "@vue/compiler-dom": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/compiler-dom": "3.2.30", + "@vue/shared": "3.2.30" } }, "@vue/devtools-api": { @@ -3254,64 +3254,64 @@ "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" }, "@vue/reactivity": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.29.tgz", - "integrity": "sha512-Ryhb6Gy62YolKXH1gv42pEqwx7zs3n8gacRVZICSgjQz8Qr8QeCcFygBKYfJm3o1SccR7U+bVBQDWZGOyG1k4g==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.30.tgz", + "integrity": "sha512-qlNKbkRn2JiGxVUEdoXbLAy+vcuHUCcq+YH2uXWz0BNMvXY2plmz+oqsw+694llwmYLkke5lbdYF4DIupisIkg==", "requires": { - "@vue/shared": "3.2.29" + "@vue/shared": "3.2.30" } }, "@vue/reactivity-transform": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.29.tgz", - "integrity": "sha512-YF6HdOuhdOw6KyRm59+3rML8USb9o8mYM1q+SH0G41K3/q/G7uhPnHGKvspzceD7h9J3VR1waOQ93CUZj7J7OA==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.30.tgz", + "integrity": "sha512-Le5XzCJyK3qTjoTnvQG/Ehu8fYjayauMNFyMaEnwFlm/avDofpuibpS9u+/6AgzsGnVWN+i0Jgf25bJd9DIwMw==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.29", - "@vue/shared": "3.2.29", + "@vue/compiler-core": "3.2.30", + "@vue/shared": "3.2.30", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" }, "dependencies": { "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==" } } }, "@vue/runtime-core": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.29.tgz", - "integrity": "sha512-VMvQuLdzoTGmCwIKTKVwKmIL0qcODIqe74JtK1pVr5lnaE0l25hopodmPag3RcnIcIXe+Ye3B2olRCn7fTCgig==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.30.tgz", + "integrity": "sha512-RTi7xH0Ht/6wfbo2WFBMJTEiyWFTqGhrksJm8lz6E+auO6lXZ6Eq3gPNfLt47GDWCm4xyrv+rs5R4UbarPEQ1Q==", "requires": { - "@vue/reactivity": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/reactivity": "3.2.30", + "@vue/shared": "3.2.30" } }, "@vue/runtime-dom": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.29.tgz", - "integrity": "sha512-YJgLQLwr+SQyORzTsBQLL5TT/5UiV83tEotqjL7F9aFDIQdFBTCwpkCFvX9jqwHoyi9sJqM9XtTrMcc8z/OjPA==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.30.tgz", + "integrity": "sha512-a3+jrncDvEFQmB+v9k0VyT4/Y3XO6OAueCroXXY4yLyr6PJeyxljweV5TzvW0rvVzH9sZO0QAvG76Lo+6C92Qw==", "requires": { - "@vue/runtime-core": "3.2.29", - "@vue/shared": "3.2.29", + "@vue/runtime-core": "3.2.30", + "@vue/shared": "3.2.30", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.29.tgz", - "integrity": "sha512-lpiYx7ciV7rWfJ0tPkoSOlLmwqBZ9FTmQm33S+T4g0j1fO/LmhJ9b9Ctl1o5xvIFVDk9QkSUWANZn7H2pXuxVw==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.30.tgz", + "integrity": "sha512-pzb8J/w+JdZVOtuKFlirGqrs4GP60FXGDJySw3WV2pCetuFstaacDrnymEeSo3ohAD+Qjv7zAG+Y7OvkdxQxmQ==", "requires": { - "@vue/compiler-ssr": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/compiler-ssr": "3.2.30", + "@vue/shared": "3.2.30" } }, "@vue/shared": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.29.tgz", - "integrity": "sha512-BjNpU8OK6Z0LVzGUppEk0CMYm/hKDnZfYdjSmPOs0N+TR1cLKJAkDwW8ASZUvaaSLEi6d3hVM7jnWnX+6yWnHw==" + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.30.tgz", + "integrity": "sha512-B3HouBtUxcfu2w2d+VhdLcVBXKYYhXiFMAfQ+hoe8NUhKkPRkWDIqhpuehCZxVQ3S2dN1P1WfKGlxGC+pfmxGg==" }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -6907,9 +6907,9 @@ } }, "electron-to-chromium": { - "version": "1.4.65", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.65.tgz", - "integrity": "sha512-0/d8Skk8sW3FxXP0Dd6MnBlrwx7Qo9cqQec3BlIAlvKnrmS3pHsIbaroEi+nd0kZkGpQ6apMEre7xndzjlEnLw==", + "version": "1.4.67", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.67.tgz", + "integrity": "sha512-A6a2jEPLueEDfb7kvh7/E94RKKnIb01qL+4I7RFxtajmo+G9F5Ei7HgY5PRbQ4RDrh6DGDW66P0hD5XI2nRAcg==", "dev": true }, "electron-updater": { @@ -15162,15 +15162,15 @@ "dev": true }, "vue": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.29.tgz", - "integrity": "sha512-cFIwr7LkbtCRanjNvh6r7wp2yUxfxeM2yPpDQpAfaaLIGZSrUmLbNiSze9nhBJt5MrZ68Iqt0O5scwAMEVxF+Q==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.30.tgz", + "integrity": "sha512-ZmTFWVJUX2XADkuOB8GcLTuxnBLogjJBTNVrM7WsTnjqRQ+VR8bLNrvNsbn8vj/LaP5+0WFAPrpngOYE2x+e+Q==", "requires": { - "@vue/compiler-dom": "3.2.29", - "@vue/compiler-sfc": "3.2.29", - "@vue/runtime-dom": "3.2.29", - "@vue/server-renderer": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/compiler-dom": "3.2.30", + "@vue/compiler-sfc": "3.2.30", + "@vue/runtime-dom": "3.2.30", + "@vue/server-renderer": "3.2.30", + "@vue/shared": "3.2.30" } }, "vue-eslint-parser": { @@ -15231,13 +15231,13 @@ } }, "vue-i18n": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.29.tgz", - "integrity": "sha512-Cbs7qwlTXI/B5XjueGFLUYoS7Mh+9ZB3RgV1pQYYHVC1xPVbWDaskOB/YkLiyff2ZdssViX93xQ/KLkcZ3DhFw==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.30.tgz", + "integrity": "sha512-5DqrgG9ffgC7j3RRAfViC0WUcdz0C3Ix1qq1AyQItpF7UkSB6iSJGEjBG6KdspbRQq/8t1YzDx4JRXbL05l6ow==", "requires": { - "@intlify/core-base": "9.2.0-beta.29", - "@intlify/shared": "9.2.0-beta.29", - "@intlify/vue-devtools": "9.2.0-beta.29", + "@intlify/core-base": "9.2.0-beta.30", + "@intlify/shared": "9.2.0-beta.30", + "@intlify/vue-devtools": "9.2.0-beta.30", "@vue/devtools-api": "^6.0.0-beta.13" } }, diff --git a/package.json b/package.json index 349a73e2..61b3f86f 100644 --- a/package.json +++ b/package.json @@ -173,7 +173,7 @@ }, "homepage": "https://github.com/lyswhut/lx-music-desktop#readme", "devDependencies": { - "@babel/core": "^7.17.0", + "@babel/core": "^7.17.2", "@babel/eslint-parser": "^7.17.0", "@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", @@ -197,7 +197,7 @@ "electron-builder": "^22.11.7", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.65", + "electron-to-chromium": "^1.4.67", "eslint": "^8.8.0", "eslint-config-standard": "^16.0.3", "eslint-formatter-friendly": "^7.0.0", @@ -256,8 +256,8 @@ "socket.io": "^4.4.1", "sortablejs": "^1.14.0", "utf-8-validate": "^5.0.8", - "vue": "^3.2.29", - "vue-i18n": "^9.2.0-beta.29", + "vue": "^3.2.30", + "vue-i18n": "^9.2.0-beta.30", "vue-router": "^4.0.12", "vuex": "^4.0.2" } From 748a420b64a8fa341bc01360d9d58b5280455448 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 9 Feb 2022 21:02:43 +0800 Subject: [PATCH 06/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8E=92=E8=A1=8C?= =?UTF-8?q?=E6=A6=9C=E5=90=8D=E5=AD=97=E5=8F=B3=E5=87=BB=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E6=92=AD=E6=94=BE=E5=8A=9F=E8=83=BD=E5=9C=A8=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E9=9D=9E=E6=BF=80=E6=B4=BB=E7=9A=84=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E5=88=97=E8=A1=A8=E8=8E=B7=E5=8F=96=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- publish/changeLog.md | 4 ++++ src/renderer/views/Leaderboard.vue | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 4631d8ba..d8426554 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -2,6 +2,10 @@ - 过滤tx源某些不支持播放的歌曲,解决播放此类内容会导致意外的问题 +### 修复 + +- 修复排行榜名字右击菜单的播放功能在播放非激活的列表时的列表获取问题 + ### 其他 - 更新electron到v13.6.9 diff --git a/src/renderer/views/Leaderboard.vue b/src/renderer/views/Leaderboard.vue index 705b7f44..b3f95db2 100644 --- a/src/renderer/views/Leaderboard.vue +++ b/src/renderer/views/Leaderboard.vue @@ -193,7 +193,6 @@ export default { case 'play': this.playSongListDetail({ boardId: board.id, - list: [...this.list], id, }) break @@ -220,8 +219,9 @@ export default { sourceListId: `board__${boardId}`, }) }, - async playSongListDetail({ boardId, id, list }) { + async playSongListDetail({ boardId, id }) { let isPlayingList = false + const list = this.tabId == boardId ? [...this.list] : null if (list?.length) { this.setTempList({ list, From 8e5b144f005cfe63d30235e24536e8dcdda70470 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 10 Feb 2022 12:48:01 +0800 Subject: [PATCH 07/50] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E2=80=9C=E5=8F=8C?= =?UTF-8?q?=E5=87=BB=E5=88=97=E8=A1=A8=E9=87=8C=E7=9A=84=E6=AD=8C=E6=9B=B2?= =?UTF-8?q?=E6=97=B6=E8=87=AA=E5=8A=A8=E5=88=87=E6=8D=A2=E5=88=B0=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E5=88=97=E8=A1=A8=E6=92=AD=E6=94=BE=E2=80=9D=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= 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 + .../components/material/OnlineList/index.vue | 10 ++++++---- .../components/material/OnlineList/usePlay.js | 8 ++++++-- src/renderer/views/Leaderboard.vue | 14 +++++++++++--- .../views/setting/components/SettingList.vue | 2 ++ src/renderer/views/songList/SongList.vue | 8 ++++---- 10 files changed, 35 insertions(+), 14 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index d8426554..febf8b95 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,6 +1,7 @@ ### 优化 - 过滤tx源某些不支持播放的歌曲,解决播放此类内容会导致意外的问题 +- 新增“双击列表里的歌曲时自动切换到当前列表播放”设置,此功能仅对歌单、排行榜有效,默认关闭 ### 修复 diff --git a/src/common/defaultSetting.js b/src/common/defaultSetting.js index 306a30f4..965c9686 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.48', + version: '1.0.49', player: { togglePlayMethod: 'listLoop', highQuality: false, @@ -36,6 +36,7 @@ const defaultSetting = { }, }, list: { + isClickPlayList: false, isShowAlbumName: true, isShowSource: true, isSaveScrollLocation: true, diff --git a/src/lang/en-us.json b/src/lang/en-us.json index efa873e6..cd171e66 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -284,6 +284,7 @@ "setting__list_add_music_location_type": "Position when adding a song to the list", "setting__list_add_music_location_type_bottom": "Bottom", "setting__list_add_music_location_type_top": "Top", + "setting__list_click_action": "Automatically switch to the current list when double-clicking a song in the list (only valid for playlists and rankings)", "setting__list_scroll": "Remember the position of the scroll bar of the playlist (only valid for my music classification)", "setting__list_source": "Show song source (only valid for my music category)", "setting__network": "Network", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 0a4f33b4..de13f05a 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -284,6 +284,7 @@ "setting__list_add_music_location_type": "添加歌曲到列表时的位置", "setting__list_add_music_location_type_bottom": "底部", "setting__list_add_music_location_type_top": "顶部", + "setting__list_click_action": "双击列表里的歌曲时自动切换到当前列表播放(仅对歌单、排行榜有效)", "setting__list_scroll": "记住播放列表滚动条位置(仅对我的音乐分类有效)", "setting__list_source": "显示歌曲源(仅对我的音乐分类有效)", "setting__network": "网络设置", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index bd2f2660..6bbd1c33 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -284,6 +284,7 @@ "setting__list_add_music_location_type": "添加歌曲到列表時的位置", "setting__list_add_music_location_type_bottom": "底部", "setting__list_add_music_location_type_top": "頂部", + "setting__list_click_action": "雙擊列表裡的歌曲時自動切換到當前列表播放(僅對歌單、排行榜有效)", "setting__list_scroll": "記住播放列表滾動條位置(僅對我的音樂分類有效)", "setting__list_source": "顯示歌曲源(僅對我的音樂分類有效)", "setting__network": "網絡設置", diff --git a/src/renderer/components/material/OnlineList/index.vue b/src/renderer/components/material/OnlineList/index.vue index 1fd225f6..29ee173e 100644 --- a/src/renderer/components/material/OnlineList/index.vue +++ b/src/renderer/components/material/OnlineList/index.vue @@ -50,7 +50,7 @@ div(:class="$style.songList") diff --git a/src/renderer/views/setting/components/SettingList.vue b/src/renderer/views/setting/components/SettingList.vue index ce4416fe..3e39325e 100644 --- a/src/renderer/views/setting/components/SettingList.vue +++ b/src/renderer/views/setting/components/SettingList.vue @@ -5,6 +5,8 @@ dd base-checkbox(id="setting_list_showSource_enable" v-model="currentStting.list.isShowSource" :label="$t('setting__list_source')") .gap-top base-checkbox(id="setting_list_scroll_enable" v-model="currentStting.list.isSaveScrollLocation" :label="$t('setting__list_scroll')") + .gap-top + base-checkbox(id="setting_list_clickAction_enable" v-model="currentStting.list.isClickPlayList" :label="$t('setting__list_click_action')") dd(:tips="$t('setting__basic_sourcename_title')") h3#list_addMusicLocationType {{$t('setting__list_add_music_location_type')}} div diff --git a/src/renderer/views/songList/SongList.vue b/src/renderer/views/songList/SongList.vue index 1350566e..de422a63 100644 --- a/src/renderer/views/songList/SongList.vue +++ b/src/renderer/views/songList/SongList.vue @@ -14,7 +14,7 @@ div(:class="$style.container") base-btn(:class="$style.headerRightBtn" :disabled="detailLoading" @click="playSongListDetail") {{$t('list__play')}} base-btn(:class="$style.headerRightBtn" :disabled="detailLoading" @click="addSongListDetail") {{$t('list__collect')}} base-btn(:class="$style.headerRightBtn" @click="hideListDetail") {{$t('back')}} - material-online-list(ref="songList" @toggle-page="handleToggleListDetailPage" :page="listDetail.page" :limit="listDetail.limit" :total="listDetail.total" + material-online-list(ref="songList" @play-list="playSongListDetail" @toggle-page="handleToggleListDetailPage" :page="listDetail.page" :limit="listDetail.limit" :total="listDetail.total" :list="listDetail.list" :noItem="isGetDetailFailed ? $t('list__load_failed') : $t('list__loading')") transition(enter-active-class="animated-fast fadeIn" leave-active-class="animated-fast fadeOut") div(:class="$style.songListContainer" v-show="!isVisibleListDetail") @@ -315,14 +315,14 @@ export default { sourceListId: this.listDetail.id, }) }, - async playSongListDetail() { + async playSongListDetail(index = 0) { if (!this.listDetail.info.name) return const id = `${this.listDetail.source}__${this.listDetail.id}` let isPlayingList = false if (this.listDetail.list?.length) { this.setTempList({ list: [...this.listDetail.list], - index: 0, + index, id, }) isPlayingList = true @@ -339,7 +339,7 @@ export default { } else { this.setTempList({ list, - index: 0, + index, id, }) } From 68827f76972f83edfe7e9b24244d171d73416582 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 11 Feb 2022 16:06:07 +0800 Subject: [PATCH 08/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=90=8D=E6=97=B6=E6=97=A0=E6=B3=95=E4=BD=BF?= =?UTF-8?q?=E7=94=A8`Ctrl`=E9=94=AE=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/MyLists.vue | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index febf8b95..26fd1a39 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -6,6 +6,7 @@ ### 修复 - 修复排行榜名字右击菜单的播放功能在播放非激活的列表时的列表获取问题 +- 修复修改列表名时无法使用`Ctrl`键的问题 ### 其他 diff --git a/src/renderer/views/list/components/MyLists.vue b/src/renderer/views/list/components/MyLists.vue index c083a66c..c7db1752 100644 --- a/src/renderer/views/list/components/MyLists.vue +++ b/src/renderer/views/list/components/MyLists.vue @@ -197,8 +197,17 @@ export default { ...mapActions('leaderboard', { getBoardListAll: 'getListAll', }), - handle_key_mod_down() { + handle_key_mod_down(event) { if (!this.keyEvent.isModDown) { + // console.log(event) + switch (event.event.target.tagName) { + case 'INPUT': + case 'SELECT': + case 'TEXTAREA': + return + default: if (event.event.target.isContentEditable) return + } + this.keyEvent.isModDown = true this.setDisabledSort(false) const dom_target = this.dom_lists_list.querySelector('.' + this.$style.editing) From 777551cb43163e658c8eb12019ddee1b6aa4959b Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 11 Feb 2022 16:51:39 +0800 Subject: [PATCH 09/50] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=94=B6=E8=97=8F=E7=9A=84=E5=9C=A8=E7=BA=BF=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=E5=AF=B9=E5=BA=94=E5=B9=B3=E5=8F=B0=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E5=8A=9F=E8=83=BD?= 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/store/modules/songList.js | 8 ++-- src/renderer/utils/music/kg/leaderboard.js | 4 ++ src/renderer/utils/music/kg/songList.js | 5 +++ src/renderer/utils/music/kw/leaderboard.js | 4 ++ src/renderer/utils/music/kw/songList.js | 7 ++++ src/renderer/utils/music/mg/leaderboard.js | 13 +++++- src/renderer/utils/music/mg/songList.js | 4 ++ src/renderer/utils/music/tx/leaderboard.js | 5 +++ src/renderer/utils/music/tx/songList.js | 4 ++ src/renderer/utils/music/wy/leaderboard.js | 5 +++ src/renderer/utils/music/wy/songList.js | 4 ++ .../views/list/components/MyLists.vue | 41 ++++++++++++++++++- 16 files changed, 100 insertions(+), 8 deletions(-) diff --git a/publish/changeLog.md b/publish/changeLog.md index 26fd1a39..a6b56050 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -2,6 +2,7 @@ - 过滤tx源某些不支持播放的歌曲,解决播放此类内容会导致意外的问题 - 新增“双击列表里的歌曲时自动切换到当前列表播放”设置,此功能仅对歌单、排行榜有效,默认关闭 +- 新增打开收藏的在线列表的对应平台详情页功能,可以在我的列表-列表右键菜单中使用 ### 修复 diff --git a/src/lang/en-us.json b/src/lang/en-us.json index cd171e66..875eb1db 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -118,6 +118,7 @@ "lists__remove_tip_button": "Yes, that's right", "lists__rename": "Rename", "lists__sort_list": "Sort songs", + "lists__source_detail": "Playlist Page", "lists__sync": "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", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index de13f05a..0e3b4abd 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -118,6 +118,7 @@ "lists__remove_tip_button": "是的 没错", "lists__rename": "重命名", "lists__sort_list": "排序歌曲", + "lists__source_detail": "歌单详情页", "lists__sync": "更新", "load_list_file_error_detail": "我们已经帮你把旧的列表文件备份到{path}\n它以 JSON 格式存储,你可以尝试手动修复并恢复它\n\n错误详情:{detail}", "load_list_file_error_title": "播放列表数据加载错误(建议到GitHub或加群反馈)", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 6bbd1c33..4aedd277 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -118,6 +118,7 @@ "lists__remove_tip_button": "是的 沒錯", "lists__rename": "重命名", "lists__sort_list": "排序歌曲", + "lists__source_detail": "歌單詳情頁", "lists__sync": "更新", "load_list_file_error_detail": "我們已經幫你把舊的列表文件備份到{path}\n它以 JSON 格式存儲,你可以嘗試手動修復並恢復它\n\n錯誤詳情:{detail}", "load_list_file_error_title": "播放列表數據加載錯誤", diff --git a/src/renderer/store/modules/songList.js b/src/renderer/store/modules/songList.js index d2b2d14a..c784fd86 100644 --- a/src/renderer/store/modules/songList.js +++ b/src/renderer/store/modules/songList.js @@ -68,7 +68,7 @@ const getters = { const actions = { getTags({ state, rootState, commit }) { let source = rootState.setting.songList.source - return music[source].songList.getTags().then(result => commit('setTags', { tags: result, source })) + return music[source]?.songList.getTags().then(result => commit('setTags', { tags: result, source })) }, getList({ state, rootState, commit }, page) { let source = rootState.setting.songList.source @@ -79,7 +79,7 @@ const actions = { if (state.list.list.length && state.list.key == key) return if (cache.has(key)) return Promise.resolve(cache.get(key)).then(result => commit('setList', { result, key, page })) commit('clearList') - return music[source].songList.getList(sortId, tabId, page).then(result => commit('setList', { result, key, page })) + return music[source]?.songList.getList(sortId, tabId, page).then(result => commit('setList', { result, key, page })) }, getListDetail({ state, commit }, { id, source, page, isRefresh = false }) { let key = `sdetail__${source}__${id}__${page}` @@ -89,7 +89,7 @@ const actions = { return ( cache.has(key) ? Promise.resolve(cache.get(key)) - : music[source].songList.getListDetail(id, page).then(result => ({ ...result, list: filterList(result.list) })) + : music[source]?.songList.getListDetail(id, page).then(result => ({ ...result, list: filterList(result.list) })) ).then(result => { commit('setListDetail', { result, key, source, id, page }) return result.list @@ -102,7 +102,7 @@ const actions = { if (isRefresh && cache.has(key)) cache.delete(key) return cache.has(key) ? Promise.resolve(cache.get(key)) - : music[source].songList.getListDetail(id, page).then(result => { + : music[source]?.songList.getListDetail(id, page).then(result => { cache.set(key, result) return result }) diff --git a/src/renderer/utils/music/kg/leaderboard.js b/src/renderer/utils/music/kg/leaderboard.js index eb8c9c11..b26e65e0 100644 --- a/src/renderer/utils/music/kg/leaderboard.js +++ b/src/renderer/utils/music/kg/leaderboard.js @@ -193,4 +193,8 @@ export default { } }) }, + getDetailPageUrl(id) { + if (typeof id == 'string') id = id.replace('kg__', '') + return `https://www.kugou.com/yy/rank/home/1-${id}.html` + }, } diff --git a/src/renderer/utils/music/kg/songList.js b/src/renderer/utils/music/kg/songList.js index 825e4527..f4c008b4 100644 --- a/src/renderer/utils/music/kg/songList.js +++ b/src/renderer/utils/music/kg/songList.js @@ -718,6 +718,11 @@ export default { } }) }, + + getDetailPageUrl(id) { + if (typeof id == 'string') id = id.replace('id_', '') + return `https://www.kugou.com/yy/special/single/${id}.html` + }, } // getList diff --git a/src/renderer/utils/music/kw/leaderboard.js b/src/renderer/utils/music/kw/leaderboard.js index b731e633..d978780a 100644 --- a/src/renderer/utils/music/kw/leaderboard.js +++ b/src/renderer/utils/music/kw/leaderboard.js @@ -191,4 +191,8 @@ export default { } }) }, + + // getDetailPageUrl(id) { + // return `http://www.kuwo.cn/rankList/${id}` + // }, } diff --git a/src/renderer/utils/music/kw/songList.js b/src/renderer/utils/music/kw/songList.js index 36ed6ea3..e15e0cd4 100644 --- a/src/renderer/utils/music/kw/songList.js +++ b/src/renderer/utils/music/kw/songList.js @@ -307,6 +307,13 @@ export default { getTags() { return Promise.all([this.getTag(), this.getHotTag()]).then(([tags, hotTag]) => ({ tags, hotTag, source: 'kw' })) }, + getDetailPageUrl(id) { + if (/^digest-/.test(id)) { + let result = id.split('__') + id = result[1] + } + return `http://www.kuwo.cn/playlist_detail/${id}` + }, } // getList diff --git a/src/renderer/utils/music/mg/leaderboard.js b/src/renderer/utils/music/mg/leaderboard.js index 8e67ea5a..bac7bf33 100644 --- a/src/renderer/utils/music/mg/leaderboard.js +++ b/src/renderer/utils/music/mg/leaderboard.js @@ -4,8 +4,7 @@ import { sizeFormate } from '../../index' // const boardList = [{ id: 'mg__27553319', name: '咪咕尖叫新歌榜', bangid: '27553319' }, { id: 'mg__27186466', name: '咪咕尖叫热歌榜', bangid: '27186466' }, { id: 'mg__27553408', name: '咪咕尖叫原创榜', bangid: '27553408' }, { id: 'mg__23189800', name: '咪咕港台榜', bangid: '23189800' }, { id: 'mg__23189399', name: '咪咕内地榜', bangid: '23189399' }, { id: 'mg__19190036', name: '咪咕欧美榜', bangid: '19190036' }, { id: 'mg__23189813', name: '咪咕日韩榜', bangid: '23189813' }, { id: 'mg__23190126', name: '咪咕彩铃榜', bangid: '23190126' }, { id: 'mg__15140045', name: '咪咕KTV榜', bangid: '15140045' }, { id: 'mg__15140034', name: '咪咕网络榜', bangid: '15140034' }, { id: 'mg__23217754', name: 'MV榜', bangid: '23217754' }, { id: 'mg__23218151', name: '新专辑榜', bangid: '23218151' }, { id: 'mg__21958042', name: 'iTunes榜', bangid: '21958042' }, { id: 'mg__21975570', name: 'billboard榜', bangid: '21975570' }, { id: 'mg__22272815', name: '台湾Hito中文榜', bangid: '22272815' }, { id: 'mg__22272904', name: '中国TOP排行榜', bangid: '22272904' }, { id: 'mg__22272943', name: '韩国Melon榜', bangid: '22272943' }, { id: 'mg__22273437', name: '英国UK榜', bangid: '22273437' }] -const boardList = [{ id: 'mg__27553319', name: '尖叫新歌榜', bangid: '27553319' }, { id: 'mg__27186466', name: '尖叫热歌榜', bangid: '27186466' }, { id: 'mg__27553408', name: '尖叫原创榜', bangid: '27553408' }, { id: 'mg__23189800', name: '港台榜', bangid: '23189800' }, { id: 'mg__23189399', name: '内地榜', bangid: '23189399' }, { id: 'mg__19190036', name: '欧美榜', bangid: '19190036' }, { id: 'mg__23189813', name: '日韩榜', bangid: '23189813' }, { id: 'mg__23190126', name: '彩铃榜', bangid: '23190126' }, { id: 'mg__15140045', name: 'KTV榜', bangid: '15140045' }, { id: 'mg__15140034', name: '网络榜', bangid: '15140034' }, { id: 'mg__21958042', name: '美国iTunes榜', bangid: '21958042' }, { id: 'mg__21975570', name: '美国billboard榜', bangid: '21975570' }, { id: 'mg__22272815', name: '台湾Hito中文榜', bangid: '22272815' }, { id: 'mg__22272943', name: '韩国Melon榜', bangid: '22272943' }, { id: 'mg__22273437', name: '英国UK榜', bangid: '22273437' }] - +const boardList = [{ id: 'mg__27553319', name: '尖叫新歌榜', bangid: '27553319', webId: 'jianjiao_newsong' }, { id: 'mg__27186466', name: '尖叫热歌榜', bangid: '27186466', webId: 'jianjiao_hotsong' }, { id: 'mg__27553408', name: '尖叫原创榜', bangid: '27553408', webId: 'jianjiao_original' }, { id: 'mg__23189800', name: '港台榜', bangid: '23189800', webId: 'hktw' }, { id: 'mg__23189399', name: '内地榜', bangid: '23189399', webId: 'mainland' }, { id: 'mg__19190036', name: '欧美榜', bangid: '19190036', webId: 'eur_usa' }, { id: 'mg__23189813', name: '日韩榜', bangid: '23189813', webId: 'jpn_kor' }, { id: 'mg__23190126', name: '彩铃榜', bangid: '23190126', webId: 'coloring' }, { id: 'mg__15140045', name: 'KTV榜', bangid: '15140045', webId: 'ktv' }, { id: 'mg__15140034', name: '网络榜', bangid: '15140034', webId: 'network' }, { id: 'mg__21958042', name: '美国iTunes榜', bangid: '21958042', webId: 'itunes' }, { id: 'mg__21975570', name: '美国billboard榜', bangid: '21975570', webId: 'billboard' }, { id: 'mg__22272815', name: '台湾Hito中文榜', bangid: '22272815', webId: 'hito' }, { id: 'mg__22272943', name: '韩国Melon榜', bangid: '22272943', webId: 'mnet' }, { id: 'mg__22273437', name: '英国UK榜', bangid: '22273437', webId: 'uk' }] export default { limit: 200, list: [ @@ -216,4 +215,14 @@ export default { } }) }, + + getDetailPageUrl(id) { + if (typeof id == 'string') id = id.replace('mg__', '') + for (const item of boardList) { + if (item.bangid == id) { + return `https://music.migu.cn/v3/music/top/${item.webId}` + } + } + return null + }, } diff --git a/src/renderer/utils/music/mg/songList.js b/src/renderer/utils/music/mg/songList.js index f6e42c70..72ac1d09 100644 --- a/src/renderer/utils/music/mg/songList.js +++ b/src/renderer/utils/music/mg/songList.js @@ -355,6 +355,10 @@ export default { getTags() { return this.getTag() }, + + getDetailPageUrl(id) { + return `https://music.migu.cn/v3/music/playlist/${id}` + }, } // getList diff --git a/src/renderer/utils/music/tx/leaderboard.js b/src/renderer/utils/music/tx/leaderboard.js index 89d9eb5f..63330b84 100644 --- a/src/renderer/utils/music/tx/leaderboard.js +++ b/src/renderer/utils/music/tx/leaderboard.js @@ -237,4 +237,9 @@ export default { }) }) }, + + getDetailPageUrl(id) { + if (typeof id == 'string') id = id.replace('tx__', '') + return `https://y.qq.com/n/ryqq/toplist/${id}` + }, } diff --git a/src/renderer/utils/music/tx/songList.js b/src/renderer/utils/music/tx/songList.js index 79f06e4b..abebf341 100644 --- a/src/renderer/utils/music/tx/songList.js +++ b/src/renderer/utils/music/tx/songList.js @@ -292,6 +292,10 @@ export default { getTags() { return Promise.all([this.getTag(), this.getHotTag()]).then(([tags, hotTag]) => ({ tags, hotTag, source: 'tx' })) }, + + getDetailPageUrl(id) { + return `https://y.qq.com/n/ryqq/playlist/${id}` + }, } // getList diff --git a/src/renderer/utils/music/wy/leaderboard.js b/src/renderer/utils/music/wy/leaderboard.js index dd6aa60d..1427da31 100644 --- a/src/renderer/utils/music/wy/leaderboard.js +++ b/src/renderer/utils/music/wy/leaderboard.js @@ -199,4 +199,9 @@ export default { source: 'wy', } }, + + getDetailPageUrl(id) { + if (typeof id == 'string') id = id.replace('wy__', '') + return `https://music.163.com/#/discover/toplist?id=${id}` + }, } diff --git a/src/renderer/utils/music/wy/songList.js b/src/renderer/utils/music/wy/songList.js index 857039ef..b8b3c051 100644 --- a/src/renderer/utils/music/wy/songList.js +++ b/src/renderer/utils/music/wy/songList.js @@ -289,6 +289,10 @@ export default { getTags() { return Promise.all([this.getTag(), this.getHotTag()]).then(([tags, hotTag]) => ({ tags, hotTag, source: 'wy' })) }, + + getDetailPageUrl(id) { + return `https://music.163.com/#/playlist?id=${id}` + }, } // getList diff --git a/src/renderer/views/list/components/MyLists.vue b/src/renderer/views/list/components/MyLists.vue index c7db1752..733ec502 100644 --- a/src/renderer/views/list/components/MyLists.vue +++ b/src/renderer/views/list/components/MyLists.vue @@ -19,7 +19,7 @@ {{loveList.name}}
  • {{item.name}} @@ -41,7 +41,7 @@ + + + diff --git a/src/renderer/views/setting/components/SettingBasic.vue b/src/renderer/views/setting/components/SettingBasic.vue index d5724a3f..f530b98b 100644 --- a/src/renderer/views/setting/components/SettingBasic.vue +++ b/src/renderer/views/setting/components/SettingBasic.vue @@ -9,12 +9,15 @@ dd label {{$t('theme_' + theme.className)}} dd - .gap-top.top - 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_to_tray" v-model="currentStting.tray.isShow" :label="$t('setting__basic_to_tray')") + div + .gap-top.top + 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_to_tray" v-model="currentStting.tray.isShow" :label="$t('setting__basic_to_tray')") + p.gap-top + base-btn.btn(min @click="isShowPlayTimeoutModal = true") {{$t('setting__play_timeout')}} {{ timeLabel ? ` (${timeLabel})` : '' }} dd(:tips="$t('setting__basic_source_title')") h3#basic_source {{$t('setting__basic_source')}} @@ -48,6 +51,7 @@ dd div base-checkbox.gap-left(v-for="item in controlBtnPositionList" :key="item.id" :id="`setting_basic_control_btn_position_${item.id}`" name="setting_basic_control_btn_position" need v-model="currentStting.controlBtnPosition" :value="item.id" :label="item.name") +play-timeout-modal(v-model="isShowPlayTimeoutModal") user-api-modal(v-model="isShowUserApiModal") @@ -58,12 +62,15 @@ import { langList } from '@/lang' import { currentStting } from '../setting' import { setWindowSize } from '@renderer/utils' import apiSourceInfo from '@renderer/utils/music/api-source-info' +import { useTimeout } from '@renderer/utils/timeoutStop' +import PlayTimeoutModal from './PlayTimeoutModal' import UserApiModal from './UserApiModal' export default { name: 'SettingBasic', components: { + PlayTimeoutModal, UserApiModal, }, setup() { @@ -81,6 +88,9 @@ export default { apiSource.value = visible }) + const isShowPlayTimeoutModal = ref(false) + const { timeLabel } = useTimeout() + const isShowUserApiModal = ref(false) const getApiStatus = () => { let status @@ -138,6 +148,8 @@ export default { return { currentStting, themes, + isShowPlayTimeoutModal, + timeLabel, apiSources, isShowUserApiModal, windowSizeList, diff --git a/src/renderer/views/setting/setting.js b/src/renderer/views/setting/setting.js index 8b007922..8b753255 100644 --- a/src/renderer/views/setting/setting.js +++ b/src/renderer/views/setting/setting.js @@ -8,6 +8,8 @@ export const currentStting = ref({ volume: 1, mediaDeviceId: 'default', isMediaDeviceRemovedStopPlay: false, + waitPlayEndStop: true, + waitPlayEndStopTime: 0, }, desktopLyric: { enable: false, From 5aa027f1a97e8e9b14f963aa2d8007cca45393a1 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Mon, 14 Feb 2022 15:48:43 +0800 Subject: [PATCH 16/50] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/defaultSetting.js | 2 +- src/renderer/views/setting/components/PlayTimeoutModal.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/defaultSetting.js b/src/common/defaultSetting.js index f7ab6228..b7c00775 100644 --- a/src/common/defaultSetting.js +++ b/src/common/defaultSetting.js @@ -17,7 +17,7 @@ const defaultSetting = { isSavePlayTime: false, audioVisualization: false, waitPlayEndStop: true, - waitPlayEndStopTime: 0, + waitPlayEndStopTime: '', }, desktopLyric: { enable: false, diff --git a/src/renderer/views/setting/components/PlayTimeoutModal.vue b/src/renderer/views/setting/components/PlayTimeoutModal.vue index 0d0b43b4..5ff0a1b8 100644 --- a/src/renderer/views/setting/components/PlayTimeoutModal.vue +++ b/src/renderer/views/setting/components/PlayTimeoutModal.vue @@ -57,7 +57,7 @@ export default { text = '' } time.value = text - return orgText == text ? parseInt(text) : '' + return text && orgText == text ? parseInt(text) : '' } const handleConfirm = () => { let time = verify() From a3b844d2e35f91f44d5f38064f03dc97bc5c43b0 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Mon, 14 Feb 2022 15:55:12 +0800 Subject: [PATCH 17/50] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E7=9A=84=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lang/en-us.json | 2 ++ src/lang/zh-tw.json | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/lang/en-us.json b/src/lang/en-us.json index e45e2e78..d45c1f83 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -147,6 +147,8 @@ "play_timeout_close": "Close", "play_timeout_confirm": "Confirm", "play_timeout_end": "Wait for the song to finish before pausing", + "play_timeout_stop": "Cancel timer", + "play_timeout_tip": "Pause after {time}", "play_timeout_unit": "minute", "play_timeout_update": "Update timing", "player__add_music_to": "Add the current song to...", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index fad40b87..68e16f3c 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -147,6 +147,8 @@ "play_timeout_close": "關閉", "play_timeout_confirm": "確認", "play_timeout_end": "等待歌曲播放完畢再暫停", + "play_timeout_stop": "取消定時", + "play_timeout_tip": "{time} 後暫停播放", "play_timeout_unit": "分鐘", "play_timeout_update": "更新定時", "player__add_music_to": "添加當前歌曲到...", From 1aeb8e29e261df21bf28028d78d47f1e32248b07 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 15 Feb 2022 15:13:25 +0800 Subject: [PATCH 18/50] =?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 | 196 ++++++++++++++++++++++++++++------------------ package.json | 6 +- 2 files changed, 121 insertions(+), 81 deletions(-) diff --git a/package-lock.json b/package-lock.json index db78fc7c..130d8c1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.17.1", + "version": "1.18.0-beta", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2645,14 +2645,14 @@ } }, "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.1.0.tgz", + "integrity": "sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -2661,6 +2661,12 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2682,6 +2688,23 @@ "ms": "2.1.2" } }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "globals": { "version": "13.12.1", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", @@ -3179,12 +3202,12 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.30.tgz", - "integrity": "sha512-64fq1KfcR+k3Vlw+IsBM2VhV5B+2IP3YxvKU8LWCDLrkmlXtbf2eMK6+0IwX5KP41D0f1gzryIiXR7P8cB9O5Q==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz", + "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.30", + "@vue/shared": "3.2.31", "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, @@ -3202,25 +3225,25 @@ } }, "@vue/compiler-dom": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.30.tgz", - "integrity": "sha512-t7arHz2SXLCXlF2fdGDFVbhENbGMez254Z5edUqb//6WXJU1lC7GvSkUE7i5x8WSjgfqt60i0V8zdmk16rvLdw==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz", + "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==", "requires": { - "@vue/compiler-core": "3.2.30", - "@vue/shared": "3.2.30" + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/compiler-sfc": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.30.tgz", - "integrity": "sha512-P/5YpILtcQY92z72gxhkyOUPHVskEzhSrvYi91Xcr+csOxaDaYU5OqOxCzZKcf3Og70Tat404vO1OHrwprN90A==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz", + "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.30", - "@vue/compiler-dom": "3.2.30", - "@vue/compiler-ssr": "3.2.30", - "@vue/reactivity-transform": "3.2.30", - "@vue/shared": "3.2.30", + "@vue/compiler-core": "3.2.31", + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-ssr": "3.2.31", + "@vue/reactivity-transform": "3.2.31", + "@vue/shared": "3.2.31", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -3240,12 +3263,12 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.30.tgz", - "integrity": "sha512-OUh3MwAu/PsD7VN3UOdBbTkltkrUCNouSht47+CMRzpUR5+ta7+xyMAVHeq8wg4YZenWaJimbR5TL35Ka4Vk6g==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz", + "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==", "requires": { - "@vue/compiler-dom": "3.2.30", - "@vue/shared": "3.2.30" + "@vue/compiler-dom": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/devtools-api": { @@ -3254,21 +3277,21 @@ "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" }, "@vue/reactivity": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.30.tgz", - "integrity": "sha512-qlNKbkRn2JiGxVUEdoXbLAy+vcuHUCcq+YH2uXWz0BNMvXY2plmz+oqsw+694llwmYLkke5lbdYF4DIupisIkg==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz", + "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==", "requires": { - "@vue/shared": "3.2.30" + "@vue/shared": "3.2.31" } }, "@vue/reactivity-transform": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.30.tgz", - "integrity": "sha512-Le5XzCJyK3qTjoTnvQG/Ehu8fYjayauMNFyMaEnwFlm/avDofpuibpS9u+/6AgzsGnVWN+i0Jgf25bJd9DIwMw==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz", + "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.30", - "@vue/shared": "3.2.30", + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" }, @@ -3281,37 +3304,37 @@ } }, "@vue/runtime-core": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.30.tgz", - "integrity": "sha512-RTi7xH0Ht/6wfbo2WFBMJTEiyWFTqGhrksJm8lz6E+auO6lXZ6Eq3gPNfLt47GDWCm4xyrv+rs5R4UbarPEQ1Q==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz", + "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==", "requires": { - "@vue/reactivity": "3.2.30", - "@vue/shared": "3.2.30" + "@vue/reactivity": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/runtime-dom": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.30.tgz", - "integrity": "sha512-a3+jrncDvEFQmB+v9k0VyT4/Y3XO6OAueCroXXY4yLyr6PJeyxljweV5TzvW0rvVzH9sZO0QAvG76Lo+6C92Qw==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz", + "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==", "requires": { - "@vue/runtime-core": "3.2.30", - "@vue/shared": "3.2.30", + "@vue/runtime-core": "3.2.31", + "@vue/shared": "3.2.31", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.30.tgz", - "integrity": "sha512-pzb8J/w+JdZVOtuKFlirGqrs4GP60FXGDJySw3WV2pCetuFstaacDrnymEeSo3ohAD+Qjv7zAG+Y7OvkdxQxmQ==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz", + "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==", "requires": { - "@vue/compiler-ssr": "3.2.30", - "@vue/shared": "3.2.30" + "@vue/compiler-ssr": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/shared": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.30.tgz", - "integrity": "sha512-B3HouBtUxcfu2w2d+VhdLcVBXKYYhXiFMAfQ+hoe8NUhKkPRkWDIqhpuehCZxVQ3S2dN1P1WfKGlxGC+pfmxGg==" + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz", + "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==" }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -6907,9 +6930,9 @@ } }, "electron-to-chromium": { - "version": "1.4.67", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.67.tgz", - "integrity": "sha512-A6a2jEPLueEDfb7kvh7/E94RKKnIb01qL+4I7RFxtajmo+G9F5Ei7HgY5PRbQ4RDrh6DGDW66P0hD5XI2nRAcg==", + "version": "1.4.70", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.70.tgz", + "integrity": "sha512-joSEu0IwP/rOY8mHcQ6J2MEm5GgsvVcrNDSGg2wQiV0epjsq6pNvRk4UA2nqV8aK0PPL+Z1Z/uD73bG8swzroA==", "dev": true }, "electron-updater": { @@ -7189,12 +7212,12 @@ "dev": true }, "eslint": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", - "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.9.0.tgz", + "integrity": "sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.1.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -7202,10 +7225,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7231,6 +7254,12 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -7253,9 +7282,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -7263,11 +7292,22 @@ } }, "eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, + "espree": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -15162,15 +15202,15 @@ "dev": true }, "vue": { - "version": "3.2.30", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.30.tgz", - "integrity": "sha512-ZmTFWVJUX2XADkuOB8GcLTuxnBLogjJBTNVrM7WsTnjqRQ+VR8bLNrvNsbn8vj/LaP5+0WFAPrpngOYE2x+e+Q==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz", + "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==", "requires": { - "@vue/compiler-dom": "3.2.30", - "@vue/compiler-sfc": "3.2.30", - "@vue/runtime-dom": "3.2.30", - "@vue/server-renderer": "3.2.30", - "@vue/shared": "3.2.30" + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-sfc": "3.2.31", + "@vue/runtime-dom": "3.2.31", + "@vue/server-renderer": "3.2.31", + "@vue/shared": "3.2.31" } }, "vue-eslint-parser": { diff --git a/package.json b/package.json index 134d0b7c..a299d63c 100644 --- a/package.json +++ b/package.json @@ -197,8 +197,8 @@ "electron-builder": "^22.11.7", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.67", - "eslint": "^8.8.0", + "electron-to-chromium": "^1.4.70", + "eslint": "^8.9.0", "eslint-config-standard": "^16.0.3", "eslint-formatter-friendly": "^7.0.0", "eslint-plugin-html": "^6.2.0", @@ -256,7 +256,7 @@ "socket.io": "^4.4.1", "sortablejs": "^1.14.0", "utf-8-validate": "^5.0.8", - "vue": "^3.2.30", + "vue": "^3.2.31", "vue-i18n": "^9.2.0-beta.30", "vue-router": "^4.0.12", "vuex": "^4.0.2" From 13ffcfbbcd04b416d55c1bbc759de6792e04bc52 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 15 Feb 2022 15:29:13 +0800 Subject: [PATCH 19/50] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E5=BC=B9=E7=AA=97=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lang/en-us.json | 1 + src/lang/zh-cn.json | 1 + src/lang/zh-tw.json | 1 + src/renderer/core/useApp/useDeepLink.js | 19 ++++++++++++++++--- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/lang/en-us.json b/src/lang/en-us.json index d45c1f83..32af9b11 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -140,6 +140,7 @@ "my_list": "Your Library", "no_item": "Nothing's here...", "not_agree": "Not accept", + "ok": "Ok", "pagination__next": "Next page", "pagination__page": "Page {num}", "pagination__prev": "Previous page", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 1599efa0..4bd878a7 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -140,6 +140,7 @@ "my_list": "我的列表", "no_item": "列表竟然是空的...", "not_agree": "不接受", + "ok": "好吧", "pagination__next": "下一页", "pagination__page": "第 {num} 页", "pagination__prev": "上一页", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 68e16f3c..93769b46 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -140,6 +140,7 @@ "my_list": "我的列表", "no_item": "列表竟然是空的...", "not_agree": "不接受", + "ok": "好吧", "pagination__next": "下一頁", "pagination__page": "第 {num} 頁", "pagination__prev": "上一頁", diff --git a/src/renderer/core/useApp/useDeepLink.js b/src/renderer/core/useApp/useDeepLink.js index 1d253da1..1a1dea8e 100644 --- a/src/renderer/core/useApp/useDeepLink.js +++ b/src/renderer/core/useApp/useDeepLink.js @@ -7,6 +7,18 @@ import { isShowPlayerDetail, setShowPlayerDetail, playMusicInfo } from '@rendere import usePlaySonglist from './compositions/usePlaySonglist' import { dialog } from '@renderer/plugins/Dialog' +const useDialog = () => { + const { t } = useI18n() + const errorDialog = message => { + dialog({ + message: `${t('deep_link__handle_error_tip', { message })}`, + confirmButtonText: t('ok'), + }) + } + + return errorDialog +} + const sources = ['kw', 'kg', 'tx', 'wy', 'mg'] const sourceVerify = source => { if (!sources.includes(source)) throw new Error('Source no match') @@ -58,9 +70,10 @@ export default () => { const setTempPlayList = useCommit('player', 'setTempPlayList') const playNext = useAction('player', 'playNext') const playSongListDetail = usePlaySonglist() - const { t } = useI18n() let isInited = false + const showErrorDialog = useDialog() + const handleOpenSonglist = params => { if (params.id) { router.replace({ @@ -243,7 +256,7 @@ export default () => { try { handleLinkAction(envParams.deeplink) } catch (err) { - dialog(`${t('deep_link__handle_error_tip', { message: err.message })}`) + showErrorDialog(err.message) } }) } @@ -260,7 +273,7 @@ export default () => { try { handleLinkAction(envParams.deeplink) } catch (err) { - dialog(`${t('deep_link__handle_error_tip', { message: err.message })}`) + showErrorDialog(err.message) } } isInited = true From 2f56a7090ab01286a936474c42df45ed49f97425 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Tue, 15 Feb 2022 18:49:02 +0800 Subject: [PATCH 20/50] =?UTF-8?q?=E6=96=B0=E5=A2=9EScheme=20URL=E5=AF=B9?= =?UTF-8?q?=E9=9F=B3=E4=B9=90=E6=90=9C=E7=B4=A2=E7=9A=84=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=9B=E6=96=B0=E5=A2=9EScheme=20URL?= =?UTF-8?q?=E4=BB=A5url=E4=BC=A0=E5=8F=82=E7=9A=84=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAQ.md | 20 +- publish/changeLog.md | 2 + src/renderer/core/useApp/useDeepLink.js | 281 ------------------ src/renderer/core/useApp/useDeepLink/index.js | 74 +++++ .../core/useApp/useDeepLink/useMusicAction.js | 167 +++++++++++ .../useApp/useDeepLink/useSonglistAction.js | 102 +++++++ src/renderer/core/useApp/useDeepLink/utils.js | 45 +++ src/renderer/store/mutations.js | 1 + src/renderer/views/Search.vue | 65 ++-- 9 files changed, 450 insertions(+), 307 deletions(-) delete mode 100644 src/renderer/core/useApp/useDeepLink.js create mode 100644 src/renderer/core/useApp/useDeepLink/index.js create mode 100644 src/renderer/core/useApp/useDeepLink/useMusicAction.js create mode 100644 src/renderer/core/useApp/useDeepLink/useSonglistAction.js create mode 100644 src/renderer/core/useApp/useDeepLink/utils.js diff --git a/FAQ.md b/FAQ.md index 7557d5a6..23759d43 100644 --- a/FAQ.md +++ b/FAQ.md @@ -305,16 +305,34 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看上面的 - URL统一以`lxmusic://`开头 - 此技术目前只支持 Windows、Mac系统 -- URL传参以经过URL编码的JSON数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据 - 若无特别说明,源的可用值为:`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+语法,脚本与应用的交互是使用类似事件收发的方式进行,这是一个基本的脚本例子: diff --git a/publish/changeLog.md b/publish/changeLog.md index bc4ee3f8..a99e3bd0 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -3,6 +3,8 @@ - 新增“双击列表里的歌曲时自动切换到当前列表播放”设置,此功能仅对歌单、排行榜有效,默认关闭 - 新增打开收藏的在线列表的对应平台详情页功能,可以在我的列表-列表右键菜单中使用 - 新增定时暂停播放功能,由于此功能大多数人可能不常用,所以将其放在设置-基本设置中 +- 新增Scheme URL对音乐搜索的调用支持,详情看常见问题-Scheme URL支持 +- 新增Scheme URL以url传参的方式调用,详情看常见问题-Scheme URL支持 ### 优化 diff --git a/src/renderer/core/useApp/useDeepLink.js b/src/renderer/core/useApp/useDeepLink.js deleted file mode 100644 index 1a1dea8e..00000000 --- a/src/renderer/core/useApp/useDeepLink.js +++ /dev/null @@ -1,281 +0,0 @@ -import { useCommit, useAction, onBeforeUnmount, useRouter, useI18n, markRaw } from '@renderer/utils/vueTools' -import { base as eventBaseName } from '@renderer/event/names' -import { getEnvParams, clearEnvParamsDeeplink } from '@renderer/utils/tools' -import { decodeName } from '@renderer/utils' -// import { allList, defaultList, loveList, userLists } from '@renderer/core/share/list' -import { isShowPlayerDetail, setShowPlayerDetail, playMusicInfo } from '@renderer/core/share/player' -import usePlaySonglist from './compositions/usePlaySonglist' -import { dialog } from '@renderer/plugins/Dialog' - -const useDialog = () => { - const { t } = useI18n() - const errorDialog = message => { - dialog({ - message: `${t('deep_link__handle_error_tip', { message })}`, - confirmButtonText: t('ok'), - }) - } - - return errorDialog -} - -const sources = ['kw', 'kg', 'tx', 'wy', 'mg'] -const sourceVerify = source => { - if (!sources.includes(source)) throw new Error('Source no match') -} - -const qualitys = ['128k', '320k', 'flac', 'flac32bit'] -const qualityFilter = (source, types) => { - types = types.filter(({ type }) => qualitys.includes(type)).map(({ type, size, hash }) => { - if (size != null && typeof size != 'string') throw new Error(type + ' size type no match') - if (source == 'kg' && typeof hash != 'string') throw new Error(type + ' hash type no match') - return hash == null ? { type, size } : { type, size, hash } - }) - if (!types.length) throw new Error('quality no match') - return types -} - -const dataVerify = (rules, data) => { - const newData = {} - for (const rule of rules) { - const val = data[rule.key] - if (rule.required && val == null) throw new Error(rule.key + ' missing') - if (val != null) { - if (rule.types && !rule.types.includes(typeof val)) throw new Error(rule.key + ' type no match') - if (rule.max && String(val).length > rule.max) throw new Error(rule.key + ' max length no match') - if (rule.min && String(val).length > rule.min) throw new Error(rule.key + ' min length no match') - } - newData[rule.key] = val - } - return newData -} - -export default () => { - // const setList = useCommit('list', 'setList') - // const listAdd = useCommit('list', 'listAdd') - // const listMove = useCommit('list', 'listMove') - // const listAddMultiple = useCommit('list', 'listAddMultiple') - // const listMoveMultiple = useCommit('list', 'listMoveMultiple') - // const listRemove = useCommit('list', 'listRemove') - // const listRemoveMultiple = useCommit('list', 'listRemoveMultiple') - // const listClear = useCommit('list', 'listClear') - // const updateMusicInfo = useCommit('list', 'updateMusicInfo') - // const createUserList = useCommit('list', 'createUserList') - // const removeUserList = useCommit('list', 'removeUserList') - // const setUserListName = useCommit('list', 'setUserListName') - // const setMusicPosition = useCommit('list', 'setMusicPosition') - // // const setSyncListData = useCommit('list', 'setSyncListData') - // const setUserListPosition = useCommit('list', 'setUserListPosition') - const router = useRouter() - const setTempPlayList = useCommit('player', 'setTempPlayList') - const playNext = useAction('player', 'playNext') - const playSongListDetail = usePlaySonglist() - let isInited = false - - const showErrorDialog = useDialog() - - const handleOpenSonglist = params => { - if (params.id) { - router.replace({ - path: '/songList', - query: { - source: params.source, - id: params.id, - }, - }) - } else if (params.url) { - router.replace({ - path: '/songList', - query: { - source: params.source, - url: params.url, - }, - }) - } - } - - const handlePlayMusic = _musicInfo => { - const musicInfo = { - ..._musicInfo, - singer: decodeName(_musicInfo.singer), - name: decodeName(_musicInfo.name), - albumName: decodeName(_musicInfo.albumName), - otherSource: null, - _types: {}, - typeUrl: {}, - } - for (const type of musicInfo.types) { - musicInfo._types[type.type] = { size: type.size } - } - markRaw(musicInfo) - const isPlaying = !!playMusicInfo.musicInfo - setTempPlayList([{ listId: '__temp__', musicInfo, isTop: true }]) - if (isPlaying) playNext() - } - - const handleSonglist = (action, songlistInfo) => { - sourceVerify(songlistInfo.source) - switch (action) { - case 'open': - songlistInfo = dataVerify([ - { key: 'source', types: ['string'] }, - { key: 'id', types: ['string', 'number'], max: 64 }, - { key: 'url', types: ['string'], max: 500 }, - ], songlistInfo) - if (isShowPlayerDetail.value) setShowPlayerDetail(false) - handleOpenSonglist(songlistInfo) - break - case 'play': - songlistInfo = dataVerify([ - { key: 'source', types: ['string'] }, - { key: 'id', types: ['string', 'number'], max: 64 }, - { key: 'url', types: ['string'], max: 500 }, - { key: 'index', types: ['number'], max: 1000000 }, - ], songlistInfo) - playSongListDetail(songlistInfo.source, songlistInfo.id ?? songlistInfo.url, songlistInfo.index ?? 0) - break - default: throw new Error('Unknown action: ' + action) - } - } - - const handleMusic = (action, musicInfo) => { - switch (musicInfo.source) { - case 'kw': - musicInfo = dataVerify([ - { key: 'name', types: ['string'], required: true, max: 200 }, - { key: 'singer', types: ['string'], required: true, max: 200 }, - { key: 'source', types: ['string'], required: true }, - { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, - { key: 'img', types: ['string'], max: 1024 }, - { key: 'albumId', types: ['string', 'number'], max: 64 }, - { key: 'interval', types: ['string'], max: 64 }, - { key: 'albumName', types: ['string'], max: 64 }, - { key: 'types', types: ['object'], required: true }, - ], musicInfo) - break - case 'kg': - musicInfo = dataVerify([ - { key: 'name', types: ['string'], required: true, max: 200 }, - { key: 'singer', types: ['string'], required: true, max: 200 }, - { key: 'source', types: ['string'], required: true }, - { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, - { key: 'img', types: ['string'], max: 1024 }, - { key: 'albumId', types: ['string', 'number'], max: 64 }, - { key: 'interval', types: ['string'], max: 64 }, - { key: '_interval', types: ['number'], max: 64 }, - { key: 'albumName', types: ['string'], max: 64 }, - { key: 'types', types: ['object'], required: true }, - - { key: 'hash', types: ['string'], required: true, max: 64 }, - ], musicInfo) - break - case 'tx': - musicInfo = dataVerify([ - { key: 'name', types: ['string'], required: true, max: 200 }, - { key: 'singer', types: ['string'], required: true, max: 200 }, - { key: 'source', types: ['string'], required: true }, - { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, - { key: 'img', types: ['string'], max: 1024 }, - { key: 'albumId', types: ['string', 'number'], max: 64 }, - { key: 'interval', types: ['string'], max: 64 }, - { key: 'albumName', types: ['string'], max: 64 }, - { key: 'types', types: ['object'], required: true }, - - { key: 'strMediaMid', types: ['string'], required: true, max: 64 }, - { key: 'albumMid', types: ['string'], max: 64 }, - ], musicInfo) - break - case 'wy': - musicInfo = dataVerify([ - { key: 'name', types: ['string'], required: true, max: 200 }, - { key: 'singer', types: ['string'], required: true, max: 200 }, - { key: 'source', types: ['string'], required: true }, - { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, - { key: 'img', types: ['string'], max: 1024 }, - { key: 'albumId', types: ['string', 'number'], max: 64 }, - { key: 'interval', types: ['string'], max: 64 }, - { key: 'albumName', types: ['string'], max: 64 }, - { key: 'types', types: ['object'], required: true }, - ], musicInfo) - break - case 'mg': - musicInfo = dataVerify([ - { key: 'name', types: ['string'], required: true, max: 200 }, - { key: 'singer', types: ['string'], required: true, max: 200 }, - { key: 'source', types: ['string'], required: true }, - { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, - { key: 'img', types: ['string'], max: 1024 }, - { key: 'albumId', types: ['string', 'number'], max: 64 }, - { key: 'interval', types: ['string'], max: 64 }, - { key: 'albumName', types: ['string'], max: 64 }, - { key: 'types', types: ['object'], required: true }, - - { key: 'copyrightId', types: ['string', 'number'], required: true, max: 64 }, - { key: 'lrcUrl', types: ['string'], max: 1024 }, - ], musicInfo) - break - default: throw new Error('Unknown action: ' + action) - } - musicInfo.types = qualityFilter(musicInfo.source, musicInfo.types) - switch (action) { - case 'play': - handlePlayMusic(musicInfo) - break - default: throw new Error('Unknown action: ' + action) - } - } - - const handleLinkAction = link => { - // console.log(link) - const [url, search] = link.split('?') - const [type, action] = url.replace('lxmusic://', '').split('/') - const params = {} - for (const param of search.split('&')) { - const [key, value] = param.split('=') - params[key] = value - } - if (params.data) params.data = JSON.parse(decodeURIComponent(params.data)) - console.log(params.data) - switch (type) { - case 'music': - handleMusic(action, params.data) - break - case 'songlist': - handleSonglist(action, params.data) - break - default: throw new Error('Unknown type: ' + type) - } - } - - const handleFocus = () => { - if (!isInited) return - - getEnvParams().then(envParams => { - if (!envParams.deeplink) return - clearEnvParamsDeeplink() - try { - handleLinkAction(envParams.deeplink) - } catch (err) { - showErrorDialog(err.message) - } - }) - } - - window.eventHub.on(eventBaseName.focus, handleFocus) - - onBeforeUnmount(() => { - window.eventHub.off(eventBaseName.focus, handleFocus) - }) - - return envParams => { - if (envParams.deeplink) { - clearEnvParamsDeeplink() - try { - handleLinkAction(envParams.deeplink) - } catch (err) { - showErrorDialog(err.message) - } - } - isInited = true - } -} diff --git a/src/renderer/core/useApp/useDeepLink/index.js b/src/renderer/core/useApp/useDeepLink/index.js new file mode 100644 index 00000000..1d3f8dc7 --- /dev/null +++ b/src/renderer/core/useApp/useDeepLink/index.js @@ -0,0 +1,74 @@ +import { onBeforeUnmount } from '@renderer/utils/vueTools' +import { base as eventBaseName } from '@renderer/event/names' +import { getEnvParams, clearEnvParamsDeeplink } from '@renderer/utils/tools' + +import { useDialog } from './utils' +import useMusicAction from './useMusicAction' +import useSonglistAction from './useSonglistAction' + +export default () => { + let isInited = false + + const showErrorDialog = useDialog() + + const handleMusicAction = useMusicAction() + const handleSonglistAction = useSonglistAction() + + + const handleLinkAction = link => { + // console.log(link) + const [url, search] = link.split('?') + const [type, action, ...paths] = url.replace('lxmusic://', '').split('/') + const params = {} + if (search) { + for (const param of search.split('&')) { + const [key, value] = param.split('=') + params[key] = value + } + if (params.data) params.data = JSON.parse(decodeURIComponent(params.data)) + } + params.paths = paths.map(p => decodeURIComponent(p)) + console.log(params) + switch (type) { + case 'music': + handleMusicAction(action, params) + break + case 'songlist': + handleSonglistAction(action, params) + break + default: throw new Error('Unknown type: ' + type) + } + } + + const handleFocus = () => { + if (!isInited) return + + getEnvParams().then(envParams => { + if (!envParams.deeplink) return + clearEnvParamsDeeplink() + try { + handleLinkAction(envParams.deeplink) + } catch (err) { + showErrorDialog(err.message) + } + }) + } + + window.eventHub.on(eventBaseName.focus, handleFocus) + + onBeforeUnmount(() => { + window.eventHub.off(eventBaseName.focus, handleFocus) + }) + + return envParams => { + if (envParams.deeplink) { + clearEnvParamsDeeplink() + try { + handleLinkAction(envParams.deeplink) + } catch (err) { + showErrorDialog(err.message) + } + } + isInited = true + } +} diff --git a/src/renderer/core/useApp/useDeepLink/useMusicAction.js b/src/renderer/core/useApp/useDeepLink/useMusicAction.js new file mode 100644 index 00000000..3c4ab01e --- /dev/null +++ b/src/renderer/core/useApp/useDeepLink/useMusicAction.js @@ -0,0 +1,167 @@ +import { useCommit, useAction, useRouter, markRaw } from '@renderer/utils/vueTools' +import { decodeName } from '@renderer/utils' +// import { allList, defaultList, loveList, userLists } from '@renderer/core/share/list' +import { playMusicInfo } from '@renderer/core/share/player' + +import { dataVerify, qualityFilter, sources } from './utils' + +const useSearchMusic = () => { + const router = useRouter() + + return ({ paths, data: params }) => { + let text + let source + if (params) { + text = dataVerify([ + { key: 'keywords', types: ['string', 'number'], max: 128, required: true }, + ], params).keywords + source = params.source + } else { + if (!paths.length) throw new Error('Keyword missing') + + if (paths.length > 1) { + text = paths[1] + source = paths[0] + } else { + text = paths[0] + } + + if (text.length > 128) text = text.substring(0, 128) + } + + const sourceList = [...sources, 'all'] + source = sourceList.includes(source) ? source : null + router.replace({ + path: '/search', + query: { + text, + source, + }, + }) + } +} + +const usePlayMusic = () => { + const setTempPlayList = useCommit('player', 'setTempPlayList') + const playNext = useAction('player', 'playNext') + + const filterInfoByPlayMusic = musicInfo => { + switch (musicInfo.source) { + case 'kw': + musicInfo = dataVerify([ + { key: 'name', types: ['string'], required: true, max: 200 }, + { key: 'singer', types: ['string'], required: true, max: 200 }, + { key: 'source', types: ['string'], required: true }, + { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, + { key: 'img', types: ['string'], max: 1024 }, + { key: 'albumId', types: ['string', 'number'], max: 64 }, + { key: 'interval', types: ['string'], max: 64 }, + { key: 'albumName', types: ['string'], max: 64 }, + { key: 'types', types: ['object'], required: true }, + ], musicInfo) + break + case 'kg': + musicInfo = dataVerify([ + { key: 'name', types: ['string'], required: true, max: 200 }, + { key: 'singer', types: ['string'], required: true, max: 200 }, + { key: 'source', types: ['string'], required: true }, + { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, + { key: 'img', types: ['string'], max: 1024 }, + { key: 'albumId', types: ['string', 'number'], max: 64 }, + { key: 'interval', types: ['string'], max: 64 }, + { key: '_interval', types: ['number'], max: 64 }, + { key: 'albumName', types: ['string'], max: 64 }, + { key: 'types', types: ['object'], required: true }, + + { key: 'hash', types: ['string'], required: true, max: 64 }, + ], musicInfo) + break + case 'tx': + musicInfo = dataVerify([ + { key: 'name', types: ['string'], required: true, max: 200 }, + { key: 'singer', types: ['string'], required: true, max: 200 }, + { key: 'source', types: ['string'], required: true }, + { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, + { key: 'img', types: ['string'], max: 1024 }, + { key: 'albumId', types: ['string', 'number'], max: 64 }, + { key: 'interval', types: ['string'], max: 64 }, + { key: 'albumName', types: ['string'], max: 64 }, + { key: 'types', types: ['object'], required: true }, + + { key: 'strMediaMid', types: ['string'], required: true, max: 64 }, + { key: 'albumMid', types: ['string'], max: 64 }, + ], musicInfo) + break + case 'wy': + musicInfo = dataVerify([ + { key: 'name', types: ['string'], required: true, max: 200 }, + { key: 'singer', types: ['string'], required: true, max: 200 }, + { key: 'source', types: ['string'], required: true }, + { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, + { key: 'img', types: ['string'], max: 1024 }, + { key: 'albumId', types: ['string', 'number'], max: 64 }, + { key: 'interval', types: ['string'], max: 64 }, + { key: 'albumName', types: ['string'], max: 64 }, + { key: 'types', types: ['object'], required: true }, + ], musicInfo) + break + case 'mg': + musicInfo = dataVerify([ + { key: 'name', types: ['string'], required: true, max: 200 }, + { key: 'singer', types: ['string'], required: true, max: 200 }, + { key: 'source', types: ['string'], required: true }, + { key: 'songmid', types: ['string', 'number'], max: 64, required: true }, + { key: 'img', types: ['string'], max: 1024 }, + { key: 'albumId', types: ['string', 'number'], max: 64 }, + { key: 'interval', types: ['string'], max: 64 }, + { key: 'albumName', types: ['string'], max: 64 }, + { key: 'types', types: ['object'], required: true }, + + { key: 'copyrightId', types: ['string', 'number'], required: true, max: 64 }, + { key: 'lrcUrl', types: ['string'], max: 1024 }, + ], musicInfo) + break + default: throw new Error('Unknown source: ' + musicInfo.source) + } + musicInfo.types = qualityFilter(musicInfo.source, musicInfo.types) + return musicInfo + } + + return ({ data: _musicInfo }) => { + _musicInfo = filterInfoByPlayMusic(_musicInfo) + + const musicInfo = { + ..._musicInfo, + singer: decodeName(_musicInfo.singer), + name: decodeName(_musicInfo.name), + albumName: decodeName(_musicInfo.albumName), + otherSource: null, + _types: {}, + typeUrl: {}, + } + for (const type of musicInfo.types) { + musicInfo._types[type.type] = { size: type.size } + } + markRaw(musicInfo) + const isPlaying = !!playMusicInfo.musicInfo + setTempPlayList([{ listId: '__temp__', musicInfo, isTop: true }]) + if (isPlaying) playNext() + } +} + +export default () => { + const handleSearchMusic = useSearchMusic() + const handlePlayMusic = usePlayMusic() + + return (action, info) => { + switch (action) { + case 'search': + handleSearchMusic(info) + break + case 'play': + handlePlayMusic(info) + break + default: throw new Error('Unknown action: ' + action) + } + } +} diff --git a/src/renderer/core/useApp/useDeepLink/useSonglistAction.js b/src/renderer/core/useApp/useDeepLink/useSonglistAction.js new file mode 100644 index 00000000..f5ae2b4a --- /dev/null +++ b/src/renderer/core/useApp/useDeepLink/useSonglistAction.js @@ -0,0 +1,102 @@ +import { useRouter } from '@renderer/utils/vueTools' +import { isShowPlayerDetail, setShowPlayerDetail } from '@renderer/core/share/player' +import usePlaySonglist from '../compositions/usePlaySonglist' + +import { dataVerify, sourceVerify } from './utils' + +const useOpenSonglist = () => { + const router = useRouter() + + const handleOpenSonglist = params => { + if (params.id) { + router.replace({ + path: '/songList', + query: { + source: params.source, + id: params.id, + }, + }) + } else if (params.url) { + router.replace({ + path: '/songList', + query: { + source: params.source, + url: params.url, + }, + }) + } + } + + return ({ paths, data }) => { + let songlistInfo = { + source: null, + id: null, + url: null, + } + if (!data) { + songlistInfo.source = paths[0] + songlistInfo.url = paths[1] + } + + sourceVerify(songlistInfo.source) + + songlistInfo = dataVerify([ + { key: 'source', types: ['string'] }, + { key: 'id', types: ['string', 'number'], max: 64 }, + { key: 'url', types: ['string'], max: 500 }, + ], songlistInfo) + + if (!songlistInfo.id && !songlistInfo.url) throw new Error('id or url missing') + if (isShowPlayerDetail.value) setShowPlayerDetail(false) + handleOpenSonglist(songlistInfo) + } +} +const usePlaySonglistDetail = () => { + const playSongListDetail = usePlaySonglist() + + return ({ paths, data }) => { + let songlistInfo = { + source: null, + id: null, + url: null, + index: null, + } + if (!data) { + songlistInfo.source = paths[0] + songlistInfo.url = paths[1] + songlistInfo.index = paths[2] + if (songlistInfo.index != null) songlistInfo.index = parseInt(songlistInfo.index) + } + + sourceVerify(songlistInfo.source) + + songlistInfo = dataVerify([ + { key: 'source', types: ['string'] }, + { key: 'id', types: ['string', 'number'], max: 64 }, + { key: 'url', types: ['string'], max: 500 }, + { key: 'index', types: ['number'], max: 1000000 }, + ], songlistInfo) + + if (!songlistInfo.id && !songlistInfo.url) throw new Error('id or url missing') + + playSongListDetail(songlistInfo.source, songlistInfo.id ?? songlistInfo.url, songlistInfo.index ?? 0) + } +} + +export default () => { + const handleOpenSonglist = useOpenSonglist() + const handlePlaySonglist = usePlaySonglistDetail() + + + return (action, info) => { + switch (action) { + case 'open': + handleOpenSonglist(info) + break + case 'play': + handlePlaySonglist(info) + break + default: throw new Error('Unknown action: ' + action) + } + } +} diff --git a/src/renderer/core/useApp/useDeepLink/utils.js b/src/renderer/core/useApp/useDeepLink/utils.js new file mode 100644 index 00000000..0606c417 --- /dev/null +++ b/src/renderer/core/useApp/useDeepLink/utils.js @@ -0,0 +1,45 @@ +import { useI18n } from '@renderer/utils/vueTools' +import { dialog } from '@renderer/plugins/Dialog' + +export const useDialog = () => { + const { t } = useI18n() + const errorDialog = message => { + dialog({ + message: `${t('deep_link__handle_error_tip', { message })}`, + confirmButtonText: t('ok'), + }) + } + + return errorDialog +} + +export const sources = ['kw', 'kg', 'tx', 'wy', 'mg'] +export const sourceVerify = source => { + if (!sources.includes(source)) throw new Error('Source no match') +} + +export const qualitys = ['128k', '320k', 'flac', 'flac32bit'] +export const qualityFilter = (source, types) => { + types = types.filter(({ type }) => qualitys.includes(type)).map(({ type, size, hash }) => { + if (size != null && typeof size != 'string') throw new Error(type + ' size type no match') + if (source == 'kg' && typeof hash != 'string') throw new Error(type + ' hash type no match') + return hash == null ? { type, size } : { type, size, hash } + }) + if (!types.length) throw new Error('quality no match') + return types +} + +export const dataVerify = (rules, data) => { + const newData = {} + for (const rule of rules) { + const val = data[rule.key] + if (rule.required && val == null) throw new Error(rule.key + ' missing') + if (val != null) { + if (rule.types && !rule.types.includes(typeof val)) throw new Error(rule.key + ' type no match') + if (rule.max && String(val).length > rule.max) throw new Error(rule.key + ' max length no match') + if (rule.min && String(val).length > rule.min) throw new Error(rule.key + ' min length no match') + } + newData[rule.key] = val + } + return newData +} diff --git a/src/renderer/store/mutations.js b/src/renderer/store/mutations.js index 5d353e9f..9b28610b 100644 --- a/src/renderer/store/mutations.js +++ b/src/renderer/store/mutations.js @@ -3,6 +3,7 @@ export default { state.setting.themeId = val }, setSearchSource(state, { searchSource, tempSearchSource }) { + console.log(searchSource, tempSearchSource) if (searchSource != null) state.setting.search.searchSource = searchSource if (tempSearchSource != null) state.setting.search.tempSearchSource = tempSearchSource }, diff --git a/src/renderer/views/Search.vue b/src/renderer/views/Search.vue index 315b075e..edfffd6d 100644 --- a/src/renderer/views/Search.vue +++ b/src/renderer/views/Search.vue @@ -2,7 +2,7 @@ div(:class="$style.search") //- transition div(:class="$style.header") - base-tab(:class="$style.tab" :list="sources" align="left" item-key="id" item-name="name" v-model="searchSourceId") + base-tab(:class="$style.tab" :list="sources" align="left" item-key="id" item-name="name" @change="handleSourceChange" v-model="searchSourceId") div(:class="$style.main") div(:class="$style.list" v-show="isLoading || listInfo.list.length") div.thead(:class="$style.thead") @@ -109,12 +109,28 @@ export default { isLoading: false, } }, - beforeRouteUpdate(to, from, next) { - if (to.query.text === undefined) return - this.text = to.query.text - this.page = 1 - this.handleSearch(this.text, this.page) - next() + beforeRouteUpdate(to, from) { + if (to.query.source && (this.sourceList[to.query.source] || to.query.source == 'all')) { + if (this.setting.search.searchSource != to.query.source) { + this.setSearchSource({ + searchSource: to.query.source, + }) + } + if (this.searchSourceId != to.query.source) { + this.searchSourceId = to.query.source + } + this.$nextTick(() => { + this.handleGetHotSearch() + }) + } + if (to.query.text != null && this.text != to.query.text) { + this.text = to.query.text + } + + this.$nextTick(() => { + this.page = 1 + this.handleSearch(this.text, this.page) + }) }, created() { this.listenEvent() @@ -124,18 +140,20 @@ export default { }, mounted() { // console.log('mounted') - - // 处理搜索源不存在时页面报错的问题 - if (!this.sourceList[this.setting.search.searchSource] && this.setting.search.searchSource != 'all') { + if (this.$route.query.source && (this.sourceList[this.$route.query.source] || this.$route.query.source == 'all')) { + this.setSearchSource({ + searchSource: this.$route.query.source, + }) + } else if (!this.sourceList[this.setting.search.searchSource] && this.setting.search.searchSource != 'all') { // 处理搜索源不存在时页面报错的问题 this.setSearchSource({ searchSource: 'kw', }) } this.searchSourceId = this.setting.search.searchSource - if (this.$route.query.text === undefined) { + if (this.$route.query.text == null) { this.text = this.$store.getters['search/searchText'] this.page = this.listInfo.page - } else if (this.$route.query.text === '') { + } else if (this.$route.query.text == '') { this.clearList() } else { this.text = this.$route.query.text @@ -156,18 +174,6 @@ export default { 'listInfo.list'() { this.removeAllSelect() }, - searchSourceId(n) { - if (n === this.setting.search.searchSource) return - if (this.text !== '') this.isLoading = true - this.$nextTick(() => { - this.page = 1 - this.handleSearch(this.text, this.page) - this.handleGetHotSearch() - }) - this.setSearchSource({ - searchSource: n, - }) - }, }, computed: { ...mapGetters(['userInfo', 'setting']), @@ -417,7 +423,7 @@ export default { this.getHotSearch(this.setting.search.searchSource) }, handleNoitemSearch(text) { - this.$router.push({ + this.$router.replace({ path: 'search', query: { text, @@ -512,6 +518,15 @@ export default { break } }, + handleSourceChange(source) { + this.$router.replace({ + path: 'search', + query: { + text: this.text, + source, + }, + }) + }, }, } From 43c505115812141ae2548e3f0c1692bc48676eab Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 16 Feb 2022 10:33:52 +0800 Subject: [PATCH 21/50] =?UTF-8?q?=E6=89=93=E5=BC=80=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E6=97=B6=E9=9A=90=E8=97=8F=E5=A4=96?= =?UTF-8?q?=E9=83=A8=E8=BF=9B=E5=BA=A6=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/core/PlayBar/index.vue | 24 ++++++++++++++----- .../components/core/PlayDetail/PlayBar.vue | 13 +++++----- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/renderer/components/core/PlayBar/index.vue b/src/renderer/components/core/PlayBar/index.vue index 3b6568fb..169f7c4f 100644 --- a/src/renderer/components/core/PlayBar/index.vue +++ b/src/renderer/components/core/PlayBar/index.vue @@ -10,12 +10,13 @@ div(:class="$style.player") div(:class="$style.title" @click="handleCopy(title)" :tips="title + $t('copy_tip')") {{title}} control-btns div(:class="$style.column2") - common-progress-bar(:progress="progress" :handleTransitionEnd="handleTransitionEnd" :isActiveTransition="isActiveTransition") + common-progress-bar(:progress="progress" :handleTransitionEnd="handleTransitionEnd" :isActiveTransition="isActiveTransition" v-if="!isShowPlayerDetail") div(:class="$style.column3") - span(:class="$style.statusText") {{statusText}} - span {{nowPlayTimeStr}} - span(style="margin: 0 5px;") / - span {{maxPlayTimeStr}} + template(v-if="!isShowPlayerDetail") + span(:class="$style.statusText") {{statusText}} + span {{nowPlayTimeStr}} + span(style="margin: 0 5px;") / + span {{maxPlayTimeStr}} div(:class="$style.right") div(:class="$style.playBtn" @click='playPrev' :tips="$t('player__prev')" style="transform: rotate(180deg);") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve') @@ -48,7 +49,17 @@ import { player as eventPlayerNames } from '@renderer/event/names' import ControlBtns from './ControlBtns' import usePlayProgress from '@renderer/utils/compositions/usePlayProgress' // import { lyric } from '@renderer/core/share/lyric' -import { statusText, musicInfo, setMusicInfo, setShowPlayerDetail, isPlay, musicInfoItem, playInfo, playMusicInfo } from '@renderer/core/share/player' +import { + statusText, + musicInfo, + setMusicInfo, + isShowPlayerDetail, + setShowPlayerDetail, + isPlay, + musicInfoItem, + playInfo, + playMusicInfo, +} from '@renderer/core/share/player' export default { name: 'CorePlayBar', @@ -138,6 +149,7 @@ export default { playNext, playPrev, handleToMusicLocation, + isShowPlayerDetail, } }, } diff --git a/src/renderer/components/core/PlayDetail/PlayBar.vue b/src/renderer/components/core/PlayDetail/PlayBar.vue index 2384efd3..9590af84 100644 --- a/src/renderer/components/core/PlayDetail/PlayBar.vue +++ b/src/renderer/components/core/PlayDetail/PlayBar.vue @@ -6,11 +6,10 @@ div(:class="$style.footer") div(:class="$style.progressContent") common-progress-bar(:class-name="$style.progress" :progress="progress" :handleTransitionEnd="handleTransitionEnd" :isActiveTransition="isActiveTransition") div(:class="$style.timeLabel") - span(style="margin-left: 15px") {{status}} - div - span {{nowPlayTimeStr}} - span(style="margin: 0 5px;") / - span {{maxPlayTimeStr}} + span(:class="$style.status" style="margin-left: 15px") {{status}} + span {{nowPlayTimeStr}} + span(style="margin: 0 5px;") / + span {{maxPlayTimeStr}} div(:class="$style.playControl") div(:class="$style.playBtn" @click="playPrev" style="transform: rotate(180deg);" :tips="$t('player__prev')") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve') @@ -108,11 +107,13 @@ export default { width: 100%; height: 18px; display: flex; - justify-content: space-between; span { font-size: 13px; } } +.status { + flex: auto; +} .play-control { flex: none; From a7e3c1a0c4ac4a631cb3f1f75bacb48adbc7a669 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 16 Feb 2022 11:30:35 +0800 Subject: [PATCH 22/50] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BF=9B=E5=BA=A6?= =?UTF-8?q?=E6=9D=A1=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/components/common/ProgressBar.vue | 1 + src/renderer/components/core/PlayDetail/LyricPlayer.vue | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/common/ProgressBar.vue b/src/renderer/components/common/ProgressBar.vue index 93c3c6fc..9166923a 100644 --- a/src/renderer/components/common/ProgressBar.vue +++ b/src/renderer/components/common/ProgressBar.vue @@ -127,6 +127,7 @@ export default { background-color: @color-player-progress-bar2; box-shadow: 0 0 2px rgba(0, 0, 0, 0.3); opacity: 0.8; + will-change: transform; } .progress-bar3 { diff --git a/src/renderer/components/core/PlayDetail/LyricPlayer.vue b/src/renderer/components/core/PlayDetail/LyricPlayer.vue index e62d2552..cdea77f7 100644 --- a/src/renderer/components/core/PlayDetail/LyricPlayer.vue +++ b/src/renderer/components/core/PlayDetail/LyricPlayer.vue @@ -2,7 +2,7 @@
    -
    +
    From 3534dd27dc8c4bdd27363e06405de45a0dd5d785 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 16 Feb 2022 18:32:55 +0800 Subject: [PATCH 23/50] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=BA=90?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9B=B4=E6=96=B0=E5=BC=B9=E7=AA=97=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAQ.md | 1 + publish/changeLog.md | 1 + src/common/ipcNames.js | 2 + src/lang/en-us.json | 4 +- src/lang/zh-cn.json | 4 +- src/lang/zh-tw.json | 4 +- src/main/modules/userApi/event/event.js | 4 ++ src/main/modules/userApi/event/name.js | 1 + src/main/modules/userApi/index.js | 9 ++-- src/main/modules/userApi/main.js | 6 ++- src/main/modules/userApi/renderer/preload.js | 43 +++++++++++++------ .../modules/userApi/rendererEvent/name.js | 1 + .../userApi/rendererEvent/rendererEvent.js | 14 ++++++ src/main/modules/userApi/utils/index.js | 11 +++++ src/main/rendererEvents/userApi.js | 10 ++++- src/renderer/components/base/Checkbox.vue | 1 + src/renderer/core/useApp/useInitUserApi.js | 17 ++++++-- src/renderer/utils/tools.js | 15 ++++++- .../views/setting/components/UserApiModal.vue | 12 ++++++ 19 files changed, 134 insertions(+), 26 deletions(-) diff --git a/FAQ.md b/FAQ.md index 23759d43..71c061bd 100644 --- a/FAQ.md +++ b/FAQ.md @@ -445,6 +445,7 @@ send(EVENT_NAMES.inited, { | --- | --- | `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` | 显示源更新弹窗,发送此事件时,需要传入一个字符串(更新日志),内容可以使用`\n`换行,最大长度1024,超过此长度后将被截取超出的部分,此事件每次运行脚本只能调用一次(源版本v1.2.0新增)
    例子:`lx.send(lx.EVENT_NAMES.updateAlert, 'hello world')` #### `window.lx.on` diff --git a/publish/changeLog.md b/publish/changeLog.md index a99e3bd0..05989f72 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -5,6 +5,7 @@ - 新增定时暂停播放功能,由于此功能大多数人可能不常用,所以将其放在设置-基本设置中 - 新增Scheme URL对音乐搜索的调用支持,详情看常见问题-Scheme URL支持 - 新增Scheme URL以url传参的方式调用,详情看常见问题-Scheme URL支持 +- 自定义源新增更新弹窗方法,同时自定义源管理新增是否允许源显示更新弹窗设置(出于防止滥用考虑),当源作者想要通知用户源已更新时,可以调用此方法弹窗告诉用户,调用说明看常见问题-自定义源部分 ### 优化 diff --git a/src/common/ipcNames.js b/src/common/ipcNames.js index 2293a819..afd62c7a 100644 --- a/src/common/ipcNames.js +++ b/src/common/ipcNames.js @@ -69,6 +69,8 @@ const names = { request_user_api_cancel: 'request_user_api_cancel', get_user_api_status: 'get_user_api_status', user_api_status: 'user_api_status', + user_api_show_update_alert: 'user_api_show_update_alert', + user_api_set_allow_update_alert: 'user_api_set_allow_update_alert', get_lyric: 'get_lyric', save_lyric: 'save_lyric', diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 32af9b11..b83b3bb0 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -410,6 +410,7 @@ "theme_purple": "Purple", "theme_red": "Red", "theme_yellow": "Yellow", + "user_api__allow_show_update_alert": "Allow update popup to show", "user_api__btn_export": "Export", "user_api__btn_import": "Import", "user_api__btn_remove": "Remove", @@ -417,5 +418,6 @@ "user_api__noitem": "There is nothing here...😲", "user_api__note": "Tip: Although we have isolated the script's running environment as much as possible, importing scripts containing malicious behaviors may still affect your system. Please import them carefully.", "user_api__readme": "Source writing instructions: ", - "user_api__title": "Custom Source Management" + "user_api__title": "Custom Source Management", + "user_api__update_alert": "Custom source [{name}] found new version:" } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 4bd878a7..fdf2c8c5 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -410,6 +410,7 @@ "theme_purple": "重斤球紫", "theme_red": "热情似火", "theme_yellow": "信口雌黄", + "user_api__allow_show_update_alert": "允许显示更新弹窗", "user_api__btn_export": "导出", "user_api__btn_import": "导入", "user_api__btn_remove": "移除", @@ -417,5 +418,6 @@ "user_api__noitem": "这里竟然是空的 😲", "user_api__note": "提示:虽然我们已经尽可能地隔离了脚本的运行环境,但导入包含恶意行为的脚本仍可能会影响你的系统,请谨慎导入。", "user_api__readme": "源编写说明:", - "user_api__title": "自定义源管理" + "user_api__title": "自定义源管理", + "user_api__update_alert": "自定义源 [{name}] 发现新版本:" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 93769b46..10febd01 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -410,6 +410,7 @@ "theme_purple": "重斤球紫", "theme_red": "熱情似火", "theme_yellow": "信口雌黃", + "user_api__allow_show_update_alert": "允許顯示更新彈窗", "user_api__btn_export": "導出", "user_api__btn_import": "導入", "user_api__btn_remove": "移除", @@ -417,5 +418,6 @@ "user_api__noitem": "這裡竟然是空的 😲", "user_api__note": "提示:雖然我們已經盡可能地隔離了腳本的運行環境,但導入包含惡意行為的腳本仍可能會影響你的系統,請謹慎導入。", "user_api__readme": "源編寫說明:", - "user_api__title": "自定義源管理" + "user_api__title": "自定義源管理", + "user_api__update_alert": "自定義源 [{name}] 發現新版本:" } diff --git a/src/main/modules/userApi/event/event.js b/src/main/modules/userApi/event/event.js index b0c3a2cc..ff384904 100644 --- a/src/main/modules/userApi/event/event.js +++ b/src/main/modules/userApi/event/event.js @@ -5,6 +5,10 @@ class UserApi extends EventEmitter { status(info) { this.emit(USER_API_EVENT_NAME.status, info) } + + showUpdateAlert(info) { + this.emit(USER_API_EVENT_NAME.showUpdateAlert, info) + } } module.exports = UserApi diff --git a/src/main/modules/userApi/event/name.js b/src/main/modules/userApi/event/name.js index 5e57ccbf..865ce773 100644 --- a/src/main/modules/userApi/event/name.js +++ b/src/main/modules/userApi/event/name.js @@ -1,3 +1,4 @@ module.exports = { status: 'status', + showUpdateAlert: 'showUpdateAlert', } diff --git a/src/main/modules/userApi/index.js b/src/main/modules/userApi/index.js index 261675df..3a9bba72 100644 --- a/src/main/modules/userApi/index.js +++ b/src/main/modules/userApi/index.js @@ -1,8 +1,8 @@ const Event = require('./event/event') const eventNames = require('./event/name') const { closeWindow } = require('./main') -const { getUserApis, importApi, removeApi } = require('./utils') -const { request, cancelRequest, getStatus, loadApi } = require('./rendererEvent/rendererEvent') +const { getUserApis, importApi, removeApi, setAllowShowUpdateAlert: saveAllowShowUpdateAlert } = require('./utils') +const { request, cancelRequest, getStatus, loadApi, setAllowShowUpdateAlert } = require('./rendererEvent/rendererEvent') // const { getApiList, importApi, removeApi, setApi, getStatus, request, eventNames } let userApiId @@ -41,4 +41,7 @@ exports.setApi = async id => { await loadApi(id) } - +exports.setAllowShowUpdateAlert = (id, enable) => { + saveAllowShowUpdateAlert(id, enable) + setAllowShowUpdateAlert(id, enable) +} diff --git a/src/main/modules/userApi/main.js b/src/main/modules/userApi/main.js index f844eace..7b30f679 100644 --- a/src/main/modules/userApi/main.js +++ b/src/main/modules/userApi/main.js @@ -15,7 +15,6 @@ fs.readFile(path.join(dir, 'renderer/user-api.html'), 'utf8', (err, data) => { }) const denyEvents = [ - 'new-window', 'will-navigate', 'will-redirect', 'will-attach-webview', @@ -49,11 +48,13 @@ exports.createWindow = async userApi => { contextIsolation: true, // worldSafeExecuteJavaScript: true, nodeIntegration: false, + nodeIntegrationInWorker: false, spellcheck: false, autoplayPolicy: 'document-user-activation-required', enableWebSQL: false, disableDialogs: true, + nativeWindowOpen: false, webgl: false, images: false, @@ -70,6 +71,9 @@ exports.createWindow = async userApi => { // eslint-disable-next-line node/no-callback-literal callback(false) }) + global.modules.userApiWindow.webContents.setWindowOpenHandler(() => { + return { action: 'deny' } + }) winEvent(global.modules.userApiWindow) diff --git a/src/main/modules/userApi/renderer/preload.js b/src/main/modules/userApi/renderer/preload.js index 8e520e4c..8bc4e4d9 100644 --- a/src/main/modules/userApi/renderer/preload.js +++ b/src/main/modules/userApi/renderer/preload.js @@ -3,14 +3,16 @@ const needle = require('needle') const { createCipheriv, publicEncrypt, constants, randomBytes, createHash } = require('crypto') const USER_API_RENDERER_EVENT_NAME = require('../rendererEvent/name') -const sendMessage = (action, status, data, message) => { - ipcRenderer.send(action, { status, data, message }) +const sendMessage = (action, data, status, message) => { + ipcRenderer.send(action, { data, status, message }) } let isInitedApi = false +let isShowedUpdateAlert = false const EVENT_NAMES = { request: 'request', inited: 'inited', + updateAlert: 'updateAlert', } const eventNames = Object.values(EVENT_NAMES) const events = { @@ -35,7 +37,7 @@ const supportActions = { const handleRequest = (context, { requestKey, data }) => { // console.log(data) - if (!events.request) return sendMessage(USER_API_RENDERER_EVENT_NAME.response, false, { requestKey }, 'Request event is not defined') + if (!events.request) return sendMessage(USER_API_RENDERER_EVENT_NAME.response, { requestKey }, false, 'Request event is not defined') try { events.request.call(context, { source: data.source, action: data.action, info: data.info }).then(response => { let sendData = { @@ -53,12 +55,12 @@ const handleRequest = (context, { requestKey, data }) => { } break } - sendMessage(USER_API_RENDERER_EVENT_NAME.response, true, sendData) + sendMessage(USER_API_RENDERER_EVENT_NAME.response, sendData, true) }).catch(err => { - sendMessage(USER_API_RENDERER_EVENT_NAME.response, false, { requestKey }, err.message) + sendMessage(USER_API_RENDERER_EVENT_NAME.response, { requestKey }, false, err.message) }) } catch (err) { - sendMessage(USER_API_RENDERER_EVENT_NAME.response, false, { requestKey }, err.message) + sendMessage(USER_API_RENDERER_EVENT_NAME.response, { requestKey }, false, err.message) } } @@ -80,7 +82,7 @@ const handleRequest = (context, { requestKey, data }) => { */ const handleInit = (context, info) => { if (!info) { - sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, 'Init failed') + sendMessage(USER_API_RENDERER_EVENT_NAME.init, null, false, 'Init failed') // sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, typeof info.message === 'string' ? info.message.substring(0, 100) : '') return } @@ -88,7 +90,7 @@ const handleInit = (context, info) => { sendMessage(USER_API_RENDERER_EVENT_NAME.openDevTools) } if (!info.status) { - sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, 'Init failed') + sendMessage(USER_API_RENDERER_EVENT_NAME.init, null, false, 'Init failed') // sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, typeof info.message === 'string' ? info.message.substring(0, 100) : '') return } @@ -109,16 +111,22 @@ const handleInit = (context, info) => { } } catch (error) { console.log(error) - sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, error.message) + sendMessage(USER_API_RENDERER_EVENT_NAME.init, null, false, error.message) return } - sendMessage(USER_API_RENDERER_EVENT_NAME.init, true, sourceInfo) + sendMessage(USER_API_RENDERER_EVENT_NAME.init, sourceInfo, true) ipcRenderer.on(USER_API_RENDERER_EVENT_NAME.request, (event, data) => { handleRequest(context, data) }) } +const handleShowUpdateAlert = (message) => { + if (!message || typeof message != 'string') return + if (message.length > 1024) message = message.substring(0, 1024) + '...' + sendMessage(USER_API_RENDERER_EVENT_NAME.showUpdateAlert, message) +} + contextBridge.exposeInMainWorld('lx', { EVENT_NAMES, request(url, { method = 'get', timeout, headers, body, form, formData }, callback) { @@ -165,12 +173,19 @@ contextBridge.exposeInMainWorld('lx', { if (!eventNames.includes(eventName)) return reject(new Error('The event is not supported: ' + eventName)) switch (eventName) { case EVENT_NAMES.inited: - if (isInitedApi) return + if (isInitedApi) return reject(new Error('Script is inited')) isInitedApi = true handleInit(this, data) + resolve() + break + case EVENT_NAMES.updateAlert: + if (isShowedUpdateAlert) return reject(new Error('The update alert can only be called once')) + isShowedUpdateAlert = true + handleShowUpdateAlert(data) + resolve() break default: - resolve(new Error('Unknown event name: ' + eventName)) + reject(new Error('Unknown event name: ' + eventName)) } }) }, @@ -180,7 +195,9 @@ contextBridge.exposeInMainWorld('lx', { case EVENT_NAMES.request: events.request = handler break + default: return Promise.reject(new Error('The event is not supported: ' + eventName)) } + return Promise.resolve() }, utils: { crypto: { @@ -208,7 +225,7 @@ contextBridge.exposeInMainWorld('lx', { }, }, }, - version: '1.1.0', + version: '1.2.0', // removeEvent(eventName, handler) { // if (!eventNames.includes(eventName)) return Promise.reject(new Error('The event is not supported: ' + eventName)) // let handlers diff --git a/src/main/modules/userApi/rendererEvent/name.js b/src/main/modules/userApi/rendererEvent/name.js index c95c019e..d3040c7f 100644 --- a/src/main/modules/userApi/rendererEvent/name.js +++ b/src/main/modules/userApi/rendererEvent/name.js @@ -3,6 +3,7 @@ const names = { request: '', response: '', openDevTools: '', + showUpdateAlert: '', } diff --git a/src/main/modules/userApi/rendererEvent/rendererEvent.js b/src/main/modules/userApi/rendererEvent/rendererEvent.js index 076a80bb..5a7ab10b 100644 --- a/src/main/modules/userApi/rendererEvent/rendererEvent.js +++ b/src/main/modules/userApi/rendererEvent/rendererEvent.js @@ -37,9 +37,18 @@ const handleOpenDevTools = () => { }) } } +const handleShowUpdateAlert = (event, { data }) => { + if (!userApi.allowShowUpdateAlert) return + global.lx_event.userApi.showUpdateAlert({ + name: userApi.name, + description: userApi.description, + message: data, + }) +} mainOn(USER_API_RENDERER_EVENT_NAME.init, handleInit) mainOn(USER_API_RENDERER_EVENT_NAME.response, handleResponse) mainOn(USER_API_RENDERER_EVENT_NAME.openDevTools, handleOpenDevTools) +mainOn(USER_API_RENDERER_EVENT_NAME.showUpdateAlert, handleShowUpdateAlert) exports.loadApi = async apiId => { if (!apiId) return global.lx_event.userApi.status(status = { status: false, message: 'api id is null' }) @@ -82,3 +91,8 @@ exports.request = ({ requestKey, data }) => new Promise((resolve, reject) => { }) exports.getStatus = () => status + +exports.setAllowShowUpdateAlert = (id, enable) => { + if (!userApi || userApi.id != id) return + userApi.allowShowUpdateAlert = enable +} diff --git a/src/main/modules/userApi/utils/index.js b/src/main/modules/userApi/utils/index.js index 27aa183e..7d8de509 100644 --- a/src/main/modules/userApi/utils/index.js +++ b/src/main/modules/userApi/utils/index.js @@ -11,6 +11,9 @@ exports.getUserApis = () => { userApis = defaultUserApis electronStore_userApi.set('userApis', userApis) } + for (const api of userApis) { + if (api.allowShowUpdateAlert == null) api.allowShowUpdateAlert = false + } return userApis } @@ -27,6 +30,7 @@ exports.importApi = script => { name, description, script, + allowShowUpdateAlert: true, } userApis.push(apiInfo) getStore('userApi').set('userApis', userApis) @@ -42,3 +46,10 @@ exports.removeApi = ids => { } getStore('userApi').set('userApis', userApis) } + +exports.setAllowShowUpdateAlert = (id, enable) => { + const targetApi = userApis.find(api => api.id == id) + if (!targetApi) return + targetApi.allowShowUpdateAlert = enable + getStore('userApi').set('userApis', userApis) +} diff --git a/src/main/rendererEvents/userApi.js b/src/main/rendererEvents/userApi.js index 0f1599b6..559386c0 100644 --- a/src/main/rendererEvents/userApi.js +++ b/src/main/rendererEvents/userApi.js @@ -1,11 +1,15 @@ const { mainSend, mainHandle, NAMES: { mainWindow: ipcMainWindowNames } } = require('@common/ipc') -const { getApiList, importApi, removeApi, setApi, getStatus, request, cancelRequest, eventNames } = require('../modules/userApi') +const { getApiList, importApi, removeApi, setApi, getStatus, request, cancelRequest, eventNames, setAllowShowUpdateAlert } = require('../modules/userApi') const handleStatusChange = status => { mainSend(global.modules.mainWindow, ipcMainWindowNames.user_api_status, status) } +const handleShowUpdateAlert = info => { + mainSend(global.modules.mainWindow, ipcMainWindowNames.user_api_show_update_alert, info) +} global.lx_event.userApi.on(eventNames.status, handleStatusChange) +global.lx_event.userApi.on(eventNames.showUpdateAlert, handleShowUpdateAlert) mainHandle(ipcMainWindowNames.import_user_api, async(event, script) => { return importApi(script) @@ -27,6 +31,10 @@ mainHandle(ipcMainWindowNames.get_user_api_status, event => { return getStatus() }) +mainHandle(ipcMainWindowNames.user_api_set_allow_update_alert, (event, { id, enable }) => { + return setAllowShowUpdateAlert(id, enable) +}) + mainHandle(ipcMainWindowNames.request_user_api, (event, musicInfo) => { return request(musicInfo) }) diff --git a/src/renderer/components/base/Checkbox.vue b/src/renderer/components/base/Checkbox.vue index dfbe0af4..b80cc807 100644 --- a/src/renderer/components/base/Checkbox.vue +++ b/src/renderer/components/base/Checkbox.vue @@ -41,6 +41,7 @@ export default { default: false, }, }, + emits: ['update:modelValue', 'change'], data() { return { bool: false, diff --git a/src/renderer/core/useApp/useInitUserApi.js b/src/renderer/core/useApp/useInitUserApi.js index 550c5f1b..020f8ca3 100644 --- a/src/renderer/core/useApp/useInitUserApi.js +++ b/src/renderer/core/useApp/useInitUserApi.js @@ -1,18 +1,21 @@ -import { onBeforeUnmount } from '@renderer/utils/vueTools' -import { onUserApiStatus, setUserApi, getUserApiList, userApiRequest, userApiRequestCancel } from '@renderer/utils/tools' +import { onBeforeUnmount, useI18n } from '@renderer/utils/vueTools' +import { onUserApiStatus, setUserApi, getUserApiList, userApiRequest, userApiRequestCancel, onShowUserApiUpdateAlert } from '@renderer/utils/tools' import apiSourceInfo from '@renderer/utils/music/api-source-info' import music from '@renderer/utils/music' import { apiSource, qualityList, userApi } from '@renderer/core/share' +import { dialog } from '@renderer/plugins/Dialog' export default ({ setting }) => { + const { t } = useI18n() + if (/^user_api/.test(setting.value.apiSource)) { setUserApi(setting.value.apiSource) } else { qualityList.value = music.supportQuality[setting.value.apiSource] } - const rUserApiStatus = onUserApiStatus(({ status, message, apiInfo }) => { + const rUserApiStatus = onUserApiStatus((event, { status, message, apiInfo }) => { userApi.status = status userApi.message = message @@ -66,8 +69,16 @@ export default ({ setting }) => { } }) + const rUserApiShowUpdateAlert = onShowUserApiUpdateAlert((event, { name, message }) => { + dialog({ + message: `${t('user_api__update_alert', { name })}\n${message}`, + confirmButtonText: t('ok'), + }) + }) + onBeforeUnmount(() => { rUserApiStatus() + rUserApiShowUpdateAlert() }) return () => { diff --git a/src/renderer/utils/tools.js b/src/renderer/utils/tools.js index 39902415..218e6e2d 100644 --- a/src/renderer/utils/tools.js +++ b/src/renderer/utils/tools.js @@ -13,6 +13,17 @@ export const setUserApi = source => { }) } +export const onShowUserApiUpdateAlert = callback => { + rendererOn(NAMES.mainWindow.user_api_show_update_alert, callback) + return () => { + rendererOff(callback) + } +} + +export const setAllowShowUserApiUpdateAlert = (id, enable) => { + return rendererInvoke(NAMES.mainWindow.user_api_set_allow_update_alert, { id, enable }) +} + export const saveMyList = data => { rendererSend(NAMES.mainWindow.save_playlist, { type: 'myList', @@ -105,7 +116,7 @@ export const getSearchHistoryList = () => { } export const onUserApiStatus = callback => { - rendererOn(NAMES.mainWindow.user_api_status, (event, { status, message, apiInfo }) => callback({ status, message, apiInfo })) + rendererOn(NAMES.mainWindow.user_api_status, callback) return () => { rendererOff(callback) } @@ -133,7 +144,7 @@ export const setDesktopLyricInfo = (type, data, info) => { }) } export const onGetDesktopLyricInfo = callback => { - rendererOn(NAMES.mainWindow.get_lyric_info, (event, info) => callback(event, info)) + rendererOn(NAMES.mainWindow.get_lyric_info, callback) return () => { rendererOff(callback) } diff --git a/src/renderer/views/setting/components/UserApiModal.vue b/src/renderer/views/setting/components/UserApiModal.vue index a8862999..64fa1649 100644 --- a/src/renderer/views/setting/components/UserApiModal.vue +++ b/src/renderer/views/setting/components/UserApiModal.vue @@ -7,6 +7,8 @@ material-modal(:show="modelValue" bg-close @close="handleClose" teleport="#view" div(:class="$style.listLeft") h3 {{api.name}} p {{api.description}} + div + base-checkbox(:class="$style.checkbox" :id="`user_api_${api.id}`" v-model="api.allowShowUpdateAlert" @change="handleChangeAllowUpdateAlert(api, $event)" :label="$t('user_api__allow_show_update_alert')") base-btn(:class="$style.listBtn" outline :tips="$t('user_api__btn_remove')" @click.stop="handleRemove(index)") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' viewBox='0 0 212.982 212.982' space='preserve' v-once) use(xlink:href='#icon-delete') @@ -29,6 +31,7 @@ import { promises as fsPromises } from 'fs' import { selectDir, openUrl } from '@renderer/utils' import apiSourceInfo from '@renderer/utils/music/api-source-info' import { userApi, apiSource } from '@renderer/core/share' +import { setAllowShowUserApiUpdateAlert } from '@renderer/utils/tools' export default { props: { @@ -84,6 +87,9 @@ export default { handleOpenUrl(url) { openUrl(url) }, + handleChangeAllowUpdateAlert(api, enable) { + setAllowShowUserApiUpdateAlert(api.id, enable) + }, }, } @@ -114,6 +120,12 @@ export default { color: @color-theme; } +.checkbox { + margin-top: 3px; + font-size: 14px; + opacity: .86; +} + .content { flex: auto; min-height: 100px; From 48fc96226c38220cd23a66ef1ae09305d8e67ee7 Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 16 Feb 2022 18:38:11 +0800 Subject: [PATCH 24/50] =?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 a299d63c..0eafe2ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.18.0-beta", + "version": "1.18.0-beta2", "description": "一个免费的音乐查找助手", "main": "./dist/electron/main.js", "productName": "lx-music-desktop", From fc12a235f2ce289f1b62111c7d784db2c628fb2a Mon Sep 17 00:00:00 2001 From: lyswhut Date: Thu, 17 Feb 2022 10:13:45 +0800 Subject: [PATCH 25/50] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=BA=90?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=96=B0=E5=9C=B0=E5=9D=80=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FAQ.md | 2 +- src/lang/en-us.json | 5 ++-- src/lang/zh-cn.json | 5 ++-- src/lang/zh-tw.json | 5 ++-- src/main/modules/userApi/renderer/preload.js | 19 ++++++++----- .../userApi/rendererEvent/rendererEvent.js | 3 ++- src/renderer/core/useApp/useInitUserApi.js | 27 +++++++++++++++---- src/renderer/plugins/Dialog/Dialog.vue | 9 ++++--- src/renderer/plugins/Dialog/index.js | 4 ++- 9 files changed, 54 insertions(+), 25 deletions(-) diff --git a/FAQ.md b/FAQ.md index 71c061bd..aa7307a2 100644 --- a/FAQ.md +++ b/FAQ.md @@ -445,7 +445,7 @@ send(EVENT_NAMES.inited, { | --- | --- | `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` | 显示源更新弹窗,发送此事件时,需要传入一个字符串(更新日志),内容可以使用`\n`换行,最大长度1024,超过此长度后将被截取超出的部分,此事件每次运行脚本只能调用一次(源版本v1.2.0新增)
    例子:`lx.send(lx.EVENT_NAMES.updateAlert, 'hello world')` +| `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` diff --git a/src/lang/en-us.json b/src/lang/en-us.json index b83b3bb0..7f083a4b 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -140,7 +140,7 @@ "my_list": "Your Library", "no_item": "Nothing's here...", "not_agree": "Not accept", - "ok": "Ok", + "ok": "OK", "pagination__next": "Next page", "pagination__page": "Page {num}", "pagination__prev": "Previous page", @@ -419,5 +419,6 @@ "user_api__note": "Tip: Although we have isolated the script's running environment as much as possible, importing scripts containing malicious behaviors may still affect your system. Please import them carefully.", "user_api__readme": "Source writing instructions: ", "user_api__title": "Custom Source Management", - "user_api__update_alert": "Custom source [{name}] found new version:" + "user_api__update_alert": "Custom source [{name}] found new version:", + "user_api__update_alert_open_url": "Open update address" } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index fdf2c8c5..cb7ea4ac 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -140,7 +140,7 @@ "my_list": "我的列表", "no_item": "列表竟然是空的...", "not_agree": "不接受", - "ok": "好吧", + "ok": "我知道了", "pagination__next": "下一页", "pagination__page": "第 {num} 页", "pagination__prev": "上一页", @@ -419,5 +419,6 @@ "user_api__note": "提示:虽然我们已经尽可能地隔离了脚本的运行环境,但导入包含恶意行为的脚本仍可能会影响你的系统,请谨慎导入。", "user_api__readme": "源编写说明:", "user_api__title": "自定义源管理", - "user_api__update_alert": "自定义源 [{name}] 发现新版本:" + "user_api__update_alert": "自定义源 [{name}] 发现新版本:", + "user_api__update_alert_open_url": "打开更新地址" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 10febd01..fbf348d1 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -140,7 +140,7 @@ "my_list": "我的列表", "no_item": "列表竟然是空的...", "not_agree": "不接受", - "ok": "好吧", + "ok": "我知道了", "pagination__next": "下一頁", "pagination__page": "第 {num} 頁", "pagination__prev": "上一頁", @@ -419,5 +419,6 @@ "user_api__note": "提示:雖然我們已經盡可能地隔離了腳本的運行環境,但導入包含惡意行為的腳本仍可能會影響你的系統,請謹慎導入。", "user_api__readme": "源編寫說明:", "user_api__title": "自定義源管理", - "user_api__update_alert": "自定義源 [{name}] 發現新版本:" + "user_api__update_alert": "自定義源 [{name}] 發現新版本:", + "user_api__update_alert_open_url": "打開更新地址" } diff --git a/src/main/modules/userApi/renderer/preload.js b/src/main/modules/userApi/renderer/preload.js index 8bc4e4d9..18e2c3f5 100644 --- a/src/main/modules/userApi/renderer/preload.js +++ b/src/main/modules/userApi/renderer/preload.js @@ -121,10 +121,16 @@ const handleInit = (context, info) => { }) } -const handleShowUpdateAlert = (message) => { - if (!message || typeof message != 'string') return - if (message.length > 1024) message = message.substring(0, 1024) + '...' - sendMessage(USER_API_RENDERER_EVENT_NAME.showUpdateAlert, message) +const handleShowUpdateAlert = (data, resolve, reject) => { + if (!data || typeof data != 'object') return reject(new Error('parameter format error.')) + if (!data.log || typeof data.log != 'string') return reject(new Error('log is required.')) + if (data.updateUrl && !/^https?:\/\/[^\s$.?#].[^\s]*$/.test(data.updateUrl) && data.updateUrl.length > 1024) delete data.updateUrl + if (data.log.length > 1024) data.log = data.log.substring(0, 1024) + '...' + sendMessage(USER_API_RENDERER_EVENT_NAME.showUpdateAlert, { + log: data.log, + updateUrl: data.updateUrl, + }) + resolve() } contextBridge.exposeInMainWorld('lx', { @@ -179,10 +185,9 @@ contextBridge.exposeInMainWorld('lx', { resolve() break case EVENT_NAMES.updateAlert: - if (isShowedUpdateAlert) return reject(new Error('The update alert can only be called once')) + if (isShowedUpdateAlert) return reject(new Error('The update alert can only be called once.')) isShowedUpdateAlert = true - handleShowUpdateAlert(data) - resolve() + handleShowUpdateAlert(data, resolve, reject) break default: reject(new Error('Unknown event name: ' + eventName)) diff --git a/src/main/modules/userApi/rendererEvent/rendererEvent.js b/src/main/modules/userApi/rendererEvent/rendererEvent.js index 5a7ab10b..2982416b 100644 --- a/src/main/modules/userApi/rendererEvent/rendererEvent.js +++ b/src/main/modules/userApi/rendererEvent/rendererEvent.js @@ -42,7 +42,8 @@ const handleShowUpdateAlert = (event, { data }) => { global.lx_event.userApi.showUpdateAlert({ name: userApi.name, description: userApi.description, - message: data, + log: data.log, + updateUrl: data.updateUrl, }) } mainOn(USER_API_RENDERER_EVENT_NAME.init, handleInit) diff --git a/src/renderer/core/useApp/useInitUserApi.js b/src/renderer/core/useApp/useInitUserApi.js index 020f8ca3..beb0dd0f 100644 --- a/src/renderer/core/useApp/useInitUserApi.js +++ b/src/renderer/core/useApp/useInitUserApi.js @@ -1,5 +1,6 @@ import { onBeforeUnmount, useI18n } from '@renderer/utils/vueTools' import { onUserApiStatus, setUserApi, getUserApiList, userApiRequest, userApiRequestCancel, onShowUserApiUpdateAlert } from '@renderer/utils/tools' +import { openUrl } from '@renderer/utils' import apiSourceInfo from '@renderer/utils/music/api-source-info' import music from '@renderer/utils/music' import { apiSource, qualityList, userApi } from '@renderer/core/share' @@ -69,11 +70,27 @@ export default ({ setting }) => { } }) - const rUserApiShowUpdateAlert = onShowUserApiUpdateAlert((event, { name, message }) => { - dialog({ - message: `${t('user_api__update_alert', { name })}\n${message}`, - confirmButtonText: t('ok'), - }) + const rUserApiShowUpdateAlert = onShowUserApiUpdateAlert((event, { name, log, updateUrl }) => { + if (updateUrl) { + dialog({ + message: `${t('user_api__update_alert', { name })}\n${log}`, + selection: true, + showCancel: true, + confirmButtonText: t('user_api__update_alert_open_url'), + cancelButtonText: t('close'), + }).then(confirm => { + if (!confirm) return + setTimeout(() => { + openUrl(updateUrl) + }, 300) + }) + } else { + dialog({ + message: `${t('user_api__update_alert', { name })}\n${log}`, + selection: true, + confirmButtonText: t('ok'), + }) + } }) onBeforeUnmount(() => { diff --git a/src/renderer/plugins/Dialog/Dialog.vue b/src/renderer/plugins/Dialog/Dialog.vue index 96853de1..ba496f23 100644 --- a/src/renderer/plugins/Dialog/Dialog.vue +++ b/src/renderer/plugins/Dialog/Dialog.vue @@ -1,6 +1,6 @@