diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ba211cf..15e9e162 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,29 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/). Commit convention is based on [Conventional Commits](http://conventionalcommits.org). Change log format is based on [Keep a Changelog](http://keepachangelog.com/). +## [1.7.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.6.1...v1.7.0) - 2021-01-30 + +### 新增 + +- 搜索界面新增搜索状态的提示 +- 新增“稍后播放”功能,可在歌曲列表右键菜单使用 +- 新增“记住播放进度”功能的控制,该功能默认不再开启,可到播放设置-记住播放进度开启 + +### 优化 + +- 优化播放歌曲换源匹配 +- 优化设置界面设置项的展示 + +### 修复 + +- 修复快速切换歌曲时, 会出现播放的歌曲和界面展示的歌曲不一致的问题 +- 修复了一个由版本更新日志显示导致的潜在远程代码执行攻击漏洞,该漏洞影响v1.6.1及之前的所有版本,请务必更新到最新版本 +- 修复xm搜索源验证问题 + +### 其他 + +- 更新electron到9.4.2 + ## [1.6.1](https://github.com/lyswhut/lx-music-desktop/compare/v1.6.0...v1.6.1) - 2021-01-13 ### 优化 diff --git a/README.md b/README.md index 1905434b..1820fc76 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ npm run dev npm run pack:dir # 构建安装包(Windows版) -npm run pack +npm run pack:win # 构建安装包(Mac版) npm run pack:mac diff --git a/package-lock.json b/package-lock.json index f385ca2f..6263f319 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.6.0", + "version": "1.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2758,26 +2758,27 @@ } }, "@electron/get": { - "version": "1.12.2", - "resolved": "https://registry.npm.taobao.org/@electron/get/download/@electron/get-1.12.2.tgz", - "integrity": "sha1-ZEIGavuZvgjO+5ooHktGkrM3ZPM=", + "version": "1.12.3", + "resolved": "https://registry.npm.taobao.org/@electron/get/download/@electron/get-1.12.3.tgz", + "integrity": "sha1-+icjOFxLVlo0xMgvRgh6oqX79tA=", "dev": true, "requires": { "debug": "^4.1.1", "env-paths": "^2.2.0", + "filenamify": "^4.1.0", "fs-extra": "^8.1.0", "global-agent": "^2.0.2", "global-tunnel-ng": "^2.7.1", "got": "^9.6.0", "progress": "^2.0.3", - "sanitize-filename": "^1.6.2", + "semver": "^6.2.0", "sumchecker": "^3.0.1" } }, "@eslint/eslintrc": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/@eslint/eslintrc/download/@eslint/eslintrc-0.2.2.tgz?cache=0&sync_timestamp=1607145629875&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40eslint%2Feslintrc%2Fdownload%2F%40eslint%2Feslintrc-0.2.2.tgz", - "integrity": "sha1-0B/HkeL8M+iKKdbz3H6T0M14S3Y=", + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/@eslint/eslintrc/download/@eslint/eslintrc-0.3.0.tgz?cache=0&sync_timestamp=1610747269837&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40eslint%2Feslintrc%2Fdownload%2F%40eslint%2Feslintrc-0.3.0.tgz", + "integrity": "sha1-1zbWlj1wA7ZRTmMkvsnGAqw0Axg=", "dev": true, "requires": { "ajv": "^6.12.4", @@ -2787,7 +2788,7 @@ "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, @@ -2819,6 +2820,12 @@ "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", "dev": true }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336125847&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz", + "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.1.1.tgz?cache=0&sync_timestamp=1594567555399&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-3.1.1.tgz", @@ -2960,7 +2967,7 @@ }, "@types/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/@types/parse-json/download/@types/parse-json-4.0.0.tgz", + "resolved": "https://registry.npm.taobao.org/@types/parse-json/download/@types/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1605054896578&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fparse-json%2Fdownload%2F%40types%2Fparse-json-4.0.0.tgz", "integrity": "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA=", "dev": true }, @@ -3414,117 +3421,14 @@ } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", + "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", "dev": true, + "optional": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "app-builder-bin": { @@ -3786,8 +3690,8 @@ }, "async-each": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", + "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", "dev": true }, "async-exit-hook": { @@ -4672,9 +4576,9 @@ } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz", - "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.5.1.tgz?cache=0&sync_timestamp=1605123440207&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbase64-js%2Fdownload%2Fbase64-js-1.5.1.tgz", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", "dev": true }, "batch": { @@ -4698,15 +4602,16 @@ "dev": true }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299308660&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz", + "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", + "dev": true, + "optional": true }, "bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", + "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", "dev": true, "optional": true, "requires": { @@ -4953,21 +4858,13 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.1.0.tgz", + "integrity": "sha1-sv0Gtbda4pf3zi3GUfkY9b4VjI0=", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } } }, "browserify-sign": { @@ -5271,9 +5168,9 @@ } }, "call-bind": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/call-bind/download/call-bind-1.0.1.tgz?cache=0&sync_timestamp=1610168991908&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcall-bind%2Fdownload%2Fcall-bind-1.0.1.tgz", - "integrity": "sha1-KaypFR+N3P1bm3homPAF9CXohWc=", + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/call-bind/download/call-bind-1.0.2.tgz", + "integrity": "sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -5441,74 +5338,20 @@ } }, "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "version": "3.5.1", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.5.1.tgz?cache=0&sync_timestamp=1610719430924&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.5.1.tgz", + "integrity": "sha1-7pznu+vSt59J8wR5nVRo4x4U5oo=", "dev": true, + "optional": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" } }, "chownr": { @@ -6050,6 +5893,15 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "copy-anything": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/copy-anything/download/copy-anything-2.0.1.tgz", + "integrity": "sha1-KvvObaaEvfy+yTdS+nYoGctIDZo=", + "dev": true, + "requires": { + "is-what": "^3.7.1" + } + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", @@ -6082,9 +5934,9 @@ "dev": true }, "copy-webpack-plugin": { - "version": "6.4.0", - "resolved": "https://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-6.4.0.tgz?cache=0&sync_timestamp=1607603370481&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcopy-webpack-plugin%2Fdownload%2Fcopy-webpack-plugin-6.4.0.tgz", - "integrity": "sha1-f9OXr3jg0xDb9lddGg8v4Q79TVk=", + "version": "6.4.1", + "resolved": "https://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha1-E4zZtDbbygptBxcg1UFISJkuxH4=", "dev": true, "requires": { "cacache": "^15.0.5", @@ -6119,9 +5971,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-3.2.4.tgz?cache=0&sync_timestamp=1592290276588&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-3.2.4.tgz", - "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=", + "version": "3.2.5", + "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-3.2.5.tgz?cache=0&sync_timestamp=1610876605854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-3.2.5.tgz", + "integrity": "sha1-eTmvKmVt55pPGQGQPuityqfLlmE=", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -6132,36 +5984,6 @@ "picomatch": "^2.2.1" } }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", - "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", - "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, "loader-utils": { "version": "2.0.0", "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz", @@ -6173,15 +5995,6 @@ "json5": "^2.1.2" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", - "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-3.1.0.tgz?cache=0&sync_timestamp=1606290276843&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-3.1.0.tgz", @@ -6191,41 +6004,6 @@ "yocto-queue": "^0.1.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1597081605529&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz", - "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1594559733720&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", - "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859045787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz", - "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-3.0.0.tgz", @@ -6236,22 +6014,13 @@ "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-5.0.1.tgz?cache=0&sync_timestamp=1599741180858&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-5.0.1.tgz", - "integrity": "sha1-eIbshIBJpGJGepfT2Rjrsqr5NPQ=", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } } } }, "core-js": { - "version": "3.8.2", - "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.8.2.tgz", - "integrity": "sha1-Ch/WcJJG2pyo7/W7DL0V+6mscEQ=", + "version": "3.8.3", + "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.8.3.tgz?cache=0&sync_timestamp=1611040749668&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-3.8.3.tgz", + "integrity": "sha1-whkG4fFPNon5OrzG4miDVQ3ZLdA=", "dev": true }, "core-js-compat": { @@ -7258,9 +7027,9 @@ } }, "electron": { - "version": "9.3.3", - "resolved": "https://registry.npm.taobao.org/electron/download/electron-9.3.3.tgz?cache=0&sync_timestamp=1610496986855&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron%2Fdownload%2Felectron-9.3.3.tgz", - "integrity": "sha1-maZhnV32j5dpel0dgu86imP83zY=", + "version": "9.4.2", + "resolved": "https://registry.npm.taobao.org/electron/download/electron-9.4.2.tgz", + "integrity": "sha1-DHbfw9MXEIraxmhEuGip4uV9SPU=", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -7269,9 +7038,9 @@ }, "dependencies": { "@types/node": { - "version": "12.19.13", - "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-12.19.13.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-12.19.13.tgz", - "integrity": "sha1-iI4rNBWfuRSWWJSE7BaWGCErUbc=", + "version": "12.19.15", + "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-12.19.15.tgz", + "integrity": "sha1-DefpePtD22LaNp2xjqCIpjZzwYI=", "dev": true } } @@ -7690,13 +7459,13 @@ "dev": true }, "eslint": { - "version": "7.17.0", - "resolved": "https://registry.npm.taobao.org/eslint/download/eslint-7.17.0.tgz?cache=0&sync_timestamp=1609552954781&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint%2Fdownload%2Feslint-7.17.0.tgz", - "integrity": "sha1-TM2lvxJXKtO/dg5vGViG9QVprbA=", + "version": "7.18.0", + "resolved": "https://registry.npm.taobao.org/eslint/download/eslint-7.18.0.tgz?cache=0&sync_timestamp=1610751984223&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint%2Fdownload%2Feslint-7.18.0.tgz", + "integrity": "sha1-f9zS83FaQf5ilaFiNL1prtLHXmc=", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.2", + "@eslint/eslintrc": "^0.3.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -7720,7 +7489,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -7746,15 +7515,6 @@ "integrity": "sha1-If3I+82ceVzAMh8FY3AglXUVEag=", "dev": true }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, "globals": { "version": "12.4.0", "resolved": "https://registry.npm.taobao.org/globals/download/globals-12.4.0.tgz?cache=0&sync_timestamp=1596709342600&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-12.4.0.tgz", @@ -7770,6 +7530,12 @@ "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", "dev": true }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336125847&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz", + "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=", + "dev": true + }, "semver": { "version": "7.3.4", "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.4.tgz?cache=0&sync_timestamp=1606852064928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.4.tgz", @@ -8854,8 +8620,8 @@ }, "file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", + "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", "dev": true, "optional": true }, @@ -8868,6 +8634,23 @@ "minimatch": "^3.0.4" } }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/filename-reserved-regex/download/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/filenamify/download/filenamify-4.2.0.tgz?cache=0&sync_timestamp=1600940508592&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffilenamify%2Fdownload%2Ffilenamify-4.2.0.tgz", + "integrity": "sha1-yZcW1naGlYWztdMos/BlkNAy6J8=", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -8910,37 +8693,58 @@ } }, "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", + "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz?cache=0&sync_timestamp=1597081605529&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-locate%2Fdownload%2Fp-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859045787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } } } }, @@ -9070,9 +8874,9 @@ } }, "flatted": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-3.1.0.tgz", - "integrity": "sha1-pdBrSosB46Y3cdqly3oZA+LlcGc=", + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-3.1.1.tgz?cache=0&sync_timestamp=1611061309017&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fflatted%2Fdownload%2Fflatted-3.1.1.tgz", + "integrity": "sha1-xLSJ6ACW2d8d/JfHmHGup8YXxGk=", "dev": true }, "flush-write-stream": { @@ -9247,555 +9051,11 @@ "dev": true }, "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.1.tgz", + "integrity": "sha1-sgmrFMYQEmNsiGNQft9/tozFTp8=", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -9870,24 +9130,12 @@ } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" } }, "global-agent": { @@ -10536,9 +9784,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.2.1.tgz?cache=0&sync_timestamp=1603838208740&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fieee754%2Fdownload%2Fieee754-1.2.1.tgz", + "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=", "dev": true }, "iferr": { @@ -10712,12 +9960,13 @@ "dev": true }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", "dev": true, + "optional": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, "is-buffer": { @@ -10974,6 +10223,12 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-what": { + "version": "3.12.0", + "resolved": "https://registry.npm.taobao.org/is-what/download/is-what-3.12.0.tgz", + "integrity": "sha1-9EBc5L1t1CDTztUaAm+5DgNwXlU=", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -11283,11 +10538,12 @@ "integrity": "sha1-iCY2pyRcLP5uCk47psXWihN+XGU=" }, "less": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "version": "3.13.1", + "resolved": "https://registry.npm.taobao.org/less/download/less-3.13.1.tgz?cache=0&sync_timestamp=1610244863145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fless%2Fdownload%2Fless-3.13.1.tgz", + "integrity": "sha1-DryR0qDpwMZzW4PUlrCrBYMHeQk=", "dev": true, "requires": { + "copy-anything": "^2.0.1", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", @@ -11307,8 +10563,8 @@ }, "make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", "dev": true, "optional": true, "requires": { @@ -11316,40 +10572,33 @@ "semver": "^5.6.0" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, "pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1606852064928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", "dev": true, "optional": true }, "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true, "optional": true } } }, "less-loader": { - "version": "7.2.1", - "resolved": "https://registry.npm.taobao.org/less-loader/download/less-loader-7.2.1.tgz?cache=0&sync_timestamp=1609160680592&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fless-loader%2Fdownload%2Fless-loader-7.2.1.tgz", - "integrity": "sha1-qSPfhWclZ1Gwq04MPuz/EP0KWHY=", + "version": "7.3.0", + "resolved": "https://registry.npm.taobao.org/less-loader/download/less-loader-7.3.0.tgz", + "integrity": "sha1-+dbTbRhznWQgZ6Bftb1wyMYTF+U=", "dev": true, "requires": { "klona": "^2.0.4", @@ -11359,7 +10608,7 @@ "dependencies": { "ajv": { "version": "6.12.6", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1604996837320&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1609583919173&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", "dev": true, "requires": { @@ -11371,7 +10620,7 @@ }, "ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1604565113393&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz", + "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1608059984992&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz", "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", "dev": true }, @@ -11426,7 +10675,7 @@ }, "lines-and-columns": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, @@ -11841,8 +11090,8 @@ }, "minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", "dev": true }, "minimalistic-crypto-utils": { @@ -12023,9 +11272,9 @@ "dev": true }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "version": "2.14.2", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591684976&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz", + "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=", "dev": true, "optional": true }, @@ -12061,9 +11310,9 @@ } }, "native-request": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", - "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==", + "version": "1.0.8", + "resolved": "https://registry.npm.taobao.org/native-request/download/native-request-1.0.8.tgz", + "integrity": "sha1-j2a/YG4PfqJ8DlmV6y9dA+M65vs=", "dev": true, "optional": true }, @@ -12224,8 +11473,8 @@ }, "normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", "dev": true }, "normalize-url": { @@ -12980,21 +12229,21 @@ } }, "postcss-loader": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-loader/download/postcss-loader-4.1.0.tgz?cache=0&sync_timestamp=1605790872639&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-loader%2Fdownload%2Fpostcss-loader-4.1.0.tgz", - "integrity": "sha1-RkemyNrTy2slP7+qIdYiAQhvbjk=", + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/postcss-loader/download/postcss-loader-4.2.0.tgz", + "integrity": "sha1-9pk+o+D0ZgD7PuSbvQEESBI6fbQ=", "dev": true, "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.4", "loader-utils": "^2.0.0", "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "semver": "^7.3.4" }, "dependencies": { "ajv": { "version": "6.12.6", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1602353715225&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", + "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz?cache=0&sync_timestamp=1609583919173&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv%2Fdownload%2Fajv-6.12.6.tgz", "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", "dev": true, "requires": { @@ -13006,7 +12255,7 @@ }, "ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1595908717940&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz", + "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1608059984992&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz", "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", "dev": true }, @@ -13035,9 +12284,9 @@ } }, "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.1.0.tgz", - "integrity": "sha1-+WCIzfJKj6qa6poAny2dlCyZlkY=", + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.2.0.tgz?cache=0&sync_timestamp=1610966709037&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-5.2.0.tgz", + "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -14200,109 +13449,13 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz?cache=0&sync_timestamp=1602584331621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.5.0.tgz", + "integrity": "sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4=", "dev": true, + "optional": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "picomatch": "^2.2.1" } }, "regenerate": { @@ -14346,13 +13499,13 @@ } }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=", + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.1.tgz?cache=0&sync_timestamp=1610725785919&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexp.prototype.flags%2Fdownload%2Fregexp.prototype.flags-1.3.1.tgz", + "integrity": "sha1-fvNSro0VnnWMDq3Kb4/LTu8HviY=", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "regexpp": { @@ -14841,9 +13994,9 @@ } }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-5.0.1.tgz?cache=0&sync_timestamp=1599741180858&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-5.0.1.tgz", + "integrity": "sha1-eIbshIBJpGJGepfT2Rjrsqr5NPQ=", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -15717,6 +14870,15 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/strip-outer/download/strip-outer-1.0.1.tgz", + "integrity": "sha1-sv0qv2YEudHmATBXGV34Nrip1jE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", @@ -15787,9 +14949,9 @@ } }, "stylus-loader": { - "version": "4.3.1", - "resolved": "https://registry.npm.taobao.org/stylus-loader/download/stylus-loader-4.3.1.tgz", - "integrity": "sha1-i050kpTZ/gcpwuXh8Ey/h+HJQao=", + "version": "4.3.3", + "resolved": "https://registry.npm.taobao.org/stylus-loader/download/stylus-loader-4.3.3.tgz?cache=0&sync_timestamp=1610721092232&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstylus-loader%2Fdownload%2Fstylus-loader-4.3.3.tgz", + "integrity": "sha1-OBu2NBJyrFC839C4d3B+rJm2t1c=", "dev": true, "requires": { "fast-glob": "^3.2.4", @@ -15818,9 +14980,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-3.2.4.tgz?cache=0&sync_timestamp=1592290276588&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-3.2.4.tgz", - "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=", + "version": "3.2.5", + "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-3.2.5.tgz?cache=0&sync_timestamp=1610876605854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-glob%2Fdownload%2Ffast-glob-3.2.5.tgz", + "integrity": "sha1-eTmvKmVt55pPGQGQPuityqfLlmE=", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -15831,15 +14993,6 @@ "picomatch": "^2.2.1" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, "loader-utils": { "version": "2.0.0", "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz", @@ -16268,9 +15421,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.11.tgz", - "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", + "version": "2.0.12", + "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.12.tgz?cache=0&sync_timestamp=1603793741116&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftimers-browserify%2Fdownload%2Ftimers-browserify-2.0.12.tgz", + "integrity": "sha1-RKRcEfv0B/NPl7zNFXfGUjYbAO4=", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -16382,6 +15535,15 @@ "punycode": "^2.1.1" } }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/trim-repeated/download/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -16421,9 +15583,9 @@ } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.14.1.tgz?cache=0&sync_timestamp=1609887539329&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", "dev": true }, "tty-browserify": { @@ -16647,8 +15809,8 @@ }, "upath": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz", + "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", "dev": true }, "update-notifier": { @@ -16966,9 +16128,9 @@ "dev": true }, "vue-i18n": { - "version": "8.22.3", - "resolved": "https://registry.npm.taobao.org/vue-i18n/download/vue-i18n-8.22.3.tgz?cache=0&sync_timestamp=1610077297812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-i18n%2Fdownload%2Fvue-i18n-8.22.3.tgz", - "integrity": "sha1-SsD9w+cdT+GIk4xAqf/KMs3mBzI=" + "version": "8.22.4", + "resolved": "https://registry.npm.taobao.org/vue-i18n/download/vue-i18n-8.22.4.tgz?cache=0&sync_timestamp=1611071344508&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-i18n%2Fdownload%2Fvue-i18n-8.22.4.tgz", + "integrity": "sha1-JVy9q0/6czfFgZuC3RcSCK9044U=" }, "vue-loader": { "version": "15.9.6", @@ -16984,9 +16146,9 @@ } }, "vue-router": { - "version": "3.4.9", - "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.4.9.tgz?cache=0&sync_timestamp=1604611494091&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.4.9.tgz", - "integrity": "sha1-wBb0IDCuKTLxTkdIs5odmg4lDmY=" + "version": "3.5.1", + "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz", + "integrity": "sha1-7fPPSQeVLR4Fg+B5I3Igxf9utsk=" }, "vue-style-loader": { "version": "4.1.2", @@ -17015,9 +16177,9 @@ "dev": true }, "vuex": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.6.0.tgz?cache=0&sync_timestamp=1606318199388&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvuex%2Fdownload%2Fvuex-3.6.0.tgz", - "integrity": "sha1-le+lalj3YHwTWwUzUIM6CeAaqBM=" + "version": "3.6.2", + "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.6.2.tgz", + "integrity": "sha1-I2vAhqhww655lG8QfxbeWdWJXnE=" }, "vuex-router-sync": { "version": "5.0.0", @@ -17025,99 +16187,234 @@ "integrity": "sha512-Mry2sO4kiAG64714X1CFpTA/shUH1DmkZ26DFDtwoM/yyx6OtMrc+MxrU+7vvbNLO9LSpgwkiJ8W+rlmRtsM+w==" }, "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.4.tgz?cache=0&sync_timestamp=1600385568268&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.4.tgz", - "integrity": "sha1-bp2lOzyAuy1lCBiPWyAEEIZs0ws=", + "version": "1.7.5", + "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.5.tgz?cache=0&sync_timestamp=1607687456328&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.5.tgz", + "integrity": "sha1-EmfmxV4Lm1vkTCAjrtVDeiwmxFM=", "dev": true, "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", - "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz?cache=0&sync_timestamp=1593261419324&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.1.0.tgz", - "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", - "dev": true, - "optional": true - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.2.tgz?cache=0&sync_timestamp=1596729075254&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.2.tgz", - "integrity": "sha1-ONyOZY3sOAl0HrPve7Ckf+QkIy0=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz", - "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", - "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.4.0.tgz", - "integrity": "sha1-n9zN+ekVWAVEkiGsZF6DA6tbmto=", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - } + "watchpack-chokidar2": "^2.0.1" } }, "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha1-mUihhmy71suCTeoTp+1pH2yN3/A=", + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha1-OFAAcu5uzmbzdpk2lQ6hdxvhyVc=", "dev": true, "optional": true, "requires": { "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299308660&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1610719430924&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz", + "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1602584331621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "wbuf": { @@ -17130,9 +16427,9 @@ } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.44.2.tgz?cache=0&sync_timestamp=1600384574931&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack%2Fdownload%2Fwebpack-4.44.2.tgz", - "integrity": "sha1-a/4rCvBVyLLR6Q7SzZNj+EEma3I=", + "version": "4.46.0", + "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.46.0.tgz", + "integrity": "sha1-v5tEBOogoHNgXgoBHRiNd8tq1UI=", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -17143,7 +16440,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", + "enhanced-resolve": "^4.5.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", @@ -17161,9 +16458,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.1.tgz?cache=0&sync_timestamp=1597235774928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-6.4.1.tgz", - "integrity": "sha1-Ux5Yuj9RudrLmmZGyk3r9bFMpHQ=", + "version": "6.4.2", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.2.tgz", + "integrity": "sha1-NYZv1xBSjpLeEM8GAWSY5H454eY=", "dev": true }, "braces": { @@ -17235,9 +16532,9 @@ } }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.3.0.tgz?cache=0&sync_timestamp=1600385222087&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.3.0.tgz", - "integrity": "sha1-O4BvO/r8HsfeaVUe+TzKRsFwQSY=", + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.5.0.tgz?cache=0&sync_timestamp=1610568494923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.5.0.tgz", + "integrity": "sha1-Lzz9hNvjtIfxjy2y7x4GSlccpew=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -17290,6 +16587,17 @@ } } }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz?cache=0&sync_timestamp=1594427567713&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-5.1.1.tgz", @@ -17299,6 +16607,16 @@ "yallist": "^3.0.2" } }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", @@ -17320,6 +16638,12 @@ "to-regex": "^3.0.2" } }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1591175021598&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", @@ -17340,6 +16664,21 @@ "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1606852064928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-4.0.0.tgz?cache=0&sync_timestamp=1599741180858&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-4.0.0.tgz", + "integrity": "sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao=", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", @@ -17581,17 +16920,17 @@ }, "dependencies": { "mime": { - "version": "2.4.7", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.7.tgz?cache=0&sync_timestamp=1608083973342&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-2.4.7.tgz", - "integrity": "sha1-lirtm+DtGckf19wuzl1/TompDXQ=", + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.5.0.tgz?cache=0&sync_timestamp=1610756358369&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-2.5.0.tgz", + "integrity": "sha1-K0r5NEAXeYBu6YAmu0Lowa4YdrE=", "dev": true } } }, "webpack-dev-server": { - "version": "3.11.1", - "resolved": "https://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.11.1.tgz?cache=0&sync_timestamp=1609247125134&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-dev-server%2Fdownload%2Fwebpack-dev-server-3.11.1.tgz", - "integrity": "sha1-x0Aov1uoiFqvIw5Iog6JNquFEfA=", + "version": "3.11.2", + "resolved": "https://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.11.2.tgz?cache=0&sync_timestamp=1610549989125&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-dev-server%2Fdownload%2Fwebpack-dev-server-3.11.2.tgz", + "integrity": "sha1-aV687Xakkp8NXef9c/r+GF/jNwg=", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -17635,6 +16974,82 @@ "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299308660&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", + "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1610719430924&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz?cache=0&sync_timestamp=1604880033053&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcliui%2Fdownload%2Fcliui-5.0.0.tgz", @@ -17657,6 +17072,16 @@ } } }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, "del": { "version": "4.1.1", "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz?cache=0&sync_timestamp=1601076882347&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdel%2Fdownload%2Fdel-4.1.1.tgz", @@ -17672,6 +17097,61 @@ "rimraf": "^2.6.3" } }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz", + "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -17705,6 +17185,36 @@ "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=", "dev": true }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "p-map": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-2.1.0.tgz", @@ -17717,6 +17227,17 @@ "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", "dev": true }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1602584331621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1591175021598&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", @@ -17768,6 +17289,16 @@ "has-flag": "^3.0.0" } }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz", diff --git a/package.json b/package.json index 16240e49..3c90be58 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "lx-music-desktop", - "version": "1.6.1", - "description": "一个免费的音乐下载助手", + "version": "1.7.0", + "description": "一个免费的音乐查找助手", "main": "./dist/electron/main.js", "productName": "lx-music-desktop", "scripts": { - "pack": "node build-config/pack.js && npm run pack:win", - "pack:win": "npm run pack:win:setup:x86_64 && npm run pack:win:7z", + "pack": "node build-config/pack.js && npm run pack:win:setup:x64", + "pack:win": "node build-config/pack.js && npm run pack:win:setup:x86_64 && npm run pack:win:7z", "pack:win:setup:x86_64": "cross-env TARGET=win_安装版 ARCH=x86_64 electron-builder -w=nsis --x64 --ia32", "pack:win:setup:x64": "cross-env TARGET=win_安装版 ARCH=x64 electron-builder -w=nsis --x64", "pack:win:setup:x86": "cross-env TARGET=win_安装版 ARCH=x86 electron-builder -w=nsis --ia32", @@ -173,16 +173,16 @@ "cfonts": "^2.9.1", "chalk": "^4.1.0", "changelog-parser": "^2.8.0", - "copy-webpack-plugin": "^6.4.0", - "core-js": "^3.8.2", + "copy-webpack-plugin": "^6.4.1", + "core-js": "^3.8.3", "cross-env": "^7.0.3", "css-loader": "^4.3.0", "del": "^6.0.0", - "electron": "^9.3.3", + "electron": "^9.4.2", "electron-builder": "^22.9.1", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.1.1", - "eslint": "^7.17.0", + "eslint": "^7.18.0", "eslint-config-standard": "^14.1.1", "eslint-formatter-friendly": "^7.0.0", "eslint-loader": "^4.0.2", @@ -194,12 +194,12 @@ "file-loader": "^6.2.0", "friendly-errors-webpack-plugin": "^1.7.0", "html-webpack-plugin": "^4.5.1", - "less": "^3.12.2", - "less-loader": "^7.2.1", + "less": "^3.13.1", + "less-loader": "^7.3.0", "markdown-it": "^12.0.4", "mini-css-extract-plugin": "^0.12.0", "optimize-css-assets-webpack-plugin": "^5.0.4", - "postcss-loader": "^4.1.0", + "postcss-loader": "^4.2.0", "postcss-pxtorem": "^5.1.1", "pug": "^3.0.0", "pug-loader": "^2.4.0", @@ -208,14 +208,14 @@ "rimraf": "^3.0.2", "spinnies": "^0.5.1", "stylus": "^0.54.8", - "stylus-loader": "^4.3.1", + "stylus-loader": "^4.3.3", "terser-webpack-plugin": "^4.2.3", "url-loader": "^4.1.1", "vue-loader": "^15.9.6", "vue-template-compiler": "^2.6.12", - "webpack": "^4.44.2", + "webpack": "^4.46.0", "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.1", + "webpack-dev-server": "^3.11.2", "webpack-hot-middleware": "^2.25.0", "webpack-merge": "^5.7.3" }, @@ -233,9 +233,9 @@ "node-id3": "^0.2.2", "request": "^2.88.2", "vue": "^2.6.12", - "vue-i18n": "^8.22.3", - "vue-router": "^3.4.9", - "vuex": "^3.6.0", + "vue-i18n": "^8.22.4", + "vue-router": "^3.5.1", + "vuex": "^3.6.2", "vuex-router-sync": "^5.0.0" } } diff --git a/publish/changeLog.md b/publish/changeLog.md index cabaca8f..49be17dc 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,9 +1,20 @@ +### 新增 + +- 搜索界面新增搜索状态的提示 +- 新增“稍后播放”功能,可在歌曲列表右键菜单使用 +- 新增“记住播放进度”功能的控制,该功能默认不再开启,可到播放设置-记住播放进度开启 + ### 优化 -- 改进自动换源时的歌曲匹配 +- 优化播放歌曲换源匹配 +- 优化设置界面设置项的展示 ### 修复 -- 修复某些情况下自动换源的时间过长时会终止换源自动切歌的问题 -- 修复自动换源导致的搜索列表每页变成10条数据的问题 -- 降级electron到9.3.3修复部分系统没有声音的问题 +- 修复快速切换歌曲时, 会出现播放的歌曲和界面展示的歌曲不一致的问题 +- 修复了一个由版本更新日志显示导致的潜在远程代码执行攻击漏洞,该漏洞影响v1.6.1及之前的所有版本,请务必更新到最新版本 +- 修复xm搜索源验证问题 + +### 其他 + +- 更新electron到9.4.2 diff --git a/publish/utils/updateChangeLog.js b/publish/utils/updateChangeLog.js index 81a11a82..91a755d0 100644 --- a/publish/utils/updateChangeLog.js +++ b/publish/utils/updateChangeLog.js @@ -45,6 +45,7 @@ module.exports = async newVerNum => { }) version.version = newVerNum version.desc = newChangeLog + // version.desc = newMDChangeLog.replace(/(?:^|(\n))#{1,6} (.+)\n/g, '$1$2').trim() pkg.version = newVerNum console.log(chalk.blue('new version: ') + chalk.green(newVerNum)) diff --git a/publish/version.json b/publish/version.json index 95fc9c38..ca4bd10c 100644 --- a/publish/version.json +++ b/publish/version.json @@ -1 +1 @@ -{"version":"1.6.1","desc":"

优化

\n\n

修复

\n\n","history":[{"version":"1.6.0","desc":"

新增

\n\n

变更

\n\n

修复

\n\n"},{"version":"1.5.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.4.1","desc":"

修复

\n\n"},{"version":"1.4.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.3.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.2.2","desc":"

修复

\n\n"},{"version":"1.2.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.2.0","desc":"

提前祝大家中秋&国庆快乐~

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"1.1.1","desc":"

修复

\n\n"},{"version":"1.1.0","desc":"

新增

\n\n

修复

\n\n

优化

\n\n

移除

\n\n

其他

\n\n"},{"version":"1.0.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.0.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

更变

\n\n

其他

\n\n"},{"version":"0.18.2","desc":"

修复

\n\n"},{"version":"0.18.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.18.0","desc":"

新增

\n\n

优化

\n\n

更变

\n\n

修复

\n\n

移除

\n\n

其他

\n

更新 Electron 到 8.2.5

\n"},{"version":"0.17.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.16.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.15.0","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

修复

\n\n"},{"version":"0.14.1","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

修复

\n\n"},{"version":"0.14.0","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.13.1","desc":"

修复

\n\n

其他

\n\n"},{"version":"0.13.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n

其他

\n\n"},{"version":"0.12.1","desc":"

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.12.0","desc":"

由于新下载库仍然没有完成,但下载功能已经可用,so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!

\n

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.11.0","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.10.0","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.9.1","desc":"

修复

\n\n"},{"version":"0.9.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.8.2","desc":"

修复

\n\n"},{"version":"0.8.1","desc":"

修复

\n\n"},{"version":"0.8.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.7.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.6.2","desc":"

祝贺祖国成立70周年~!

\n

新增

\n\n

修复

\n\n"},{"version":"0.6.1","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.6.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.5.5","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.5.4","desc":"

移除

\n\n"},{"version":"0.5.3","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.5.2","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.5.1","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.5.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.4.0","desc":"

新增

\n\n

移除

\n\n"},{"version":"0.3.5","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.3.4","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.3.3","desc":"

修复

\n\n"},{"version":"0.3.2","desc":"

新增

\n\n"},{"version":"0.3.1","desc":"

修复

\n\n"},{"version":"0.3.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.2.3","desc":"

新增

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.2.2","desc":"

修复

\n\n"},{"version":"0.2.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.2.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.1.6","desc":"

修复

\n\n"},{"version":"0.1.5","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.1.4","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.1.3","desc":"

新增

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.1.2","desc":"

修复

\n\n"},{"version":"0.1.1","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.1.0","desc":"0.1.0版本发布"}]} +{"version":"1.7.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n","history":[{"version":"1.6.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.6.0","desc":"

新增

\n\n

变更

\n\n

修复

\n\n"},{"version":"1.5.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.4.1","desc":"

修复

\n\n"},{"version":"1.4.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.3.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"1.2.2","desc":"

修复

\n\n"},{"version":"1.2.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.2.0","desc":"

提前祝大家中秋&国庆快乐~

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"1.1.1","desc":"

修复

\n\n"},{"version":"1.1.0","desc":"

新增

\n\n

修复

\n\n

优化

\n\n

移除

\n\n

其他

\n\n"},{"version":"1.0.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"1.0.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

更变

\n\n

其他

\n\n"},{"version":"0.18.2","desc":"

修复

\n\n"},{"version":"0.18.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.18.0","desc":"

新增

\n\n

优化

\n\n

更变

\n\n

修复

\n\n

移除

\n\n

其他

\n

更新 Electron 到 8.2.5

\n"},{"version":"0.17.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.16.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.15.0","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

修复

\n\n"},{"version":"0.14.1","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

修复

\n\n"},{"version":"0.14.0","desc":"

洛雪提前祝大家新年快乐、身体健康、阖家幸福!

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.13.1","desc":"

修复

\n\n

其他

\n\n"},{"version":"0.13.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n

其他

\n\n"},{"version":"0.12.1","desc":"

优化

\n\n

修复

\n\n

其他

\n\n"},{"version":"0.12.0","desc":"

由于新下载库仍然没有完成,但下载功能已经可用,so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!

\n

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.11.0","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.10.0","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.9.1","desc":"

修复

\n\n"},{"version":"0.9.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.8.2","desc":"

修复

\n\n"},{"version":"0.8.1","desc":"

修复

\n\n"},{"version":"0.8.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.7.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.6.2","desc":"

祝贺祖国成立70周年~!

\n

新增

\n\n

修复

\n\n"},{"version":"0.6.1","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.6.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.5.5","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.5.4","desc":"

移除

\n\n"},{"version":"0.5.3","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.5.2","desc":"

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.5.1","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.5.0","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.4.0","desc":"

新增

\n\n

移除

\n\n"},{"version":"0.3.5","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.3.4","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.3.3","desc":"

修复

\n\n"},{"version":"0.3.2","desc":"

新增

\n\n"},{"version":"0.3.1","desc":"

修复

\n\n"},{"version":"0.3.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.2.3","desc":"

新增

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.2.2","desc":"

修复

\n\n"},{"version":"0.2.1","desc":"

优化

\n\n

修复

\n\n"},{"version":"0.2.0","desc":"

新增

\n\n

修复

\n\n"},{"version":"0.1.6","desc":"

修复

\n\n"},{"version":"0.1.5","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.1.4","desc":"

新增

\n\n

优化

\n\n"},{"version":"0.1.3","desc":"

新增

\n\n

修复

\n\n

移除

\n\n"},{"version":"0.1.2","desc":"

修复

\n\n"},{"version":"0.1.1","desc":"

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.1.0","desc":"0.1.0版本发布"}]} diff --git a/src/common/defaultSetting.js b/src/common/defaultSetting.js index efc8341a..22e08246 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.38', + version: '1.0.39', player: { togglePlayMethod: 'listLoop', highQuality: false, @@ -12,6 +12,7 @@ const defaultSetting = { mediaDeviceId: 'default', isMediaDeviceRemovedStopPlay: false, isShowLyricTransition: true, + isSavePlayTime: false, }, desktopLyric: { enable: false, diff --git a/src/main/index.js b/src/main/index.js index 9f0d24d0..e4544b34 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -54,6 +54,7 @@ app.on('web-contents-created', (event, contents) => { event.preventDefault() if (/^devtools/.test(navigationUrl)) return console.log(navigationUrl) + if (!/^https?:\/\//.test(navigationUrl)) return await shell.openExternal(navigationUrl) }) contents.on('will-attach-webview', (event, webPreferences, params) => { diff --git a/src/main/rendererEvents/xm_verify/xm_verify_view.js b/src/main/rendererEvents/xm_verify/xm_verify_view.js index c9ce121f..22df05ef 100644 --- a/src/main/rendererEvents/xm_verify/xm_verify_view.js +++ b/src/main/rendererEvents/xm_verify/xm_verify_view.js @@ -32,22 +32,35 @@ mainHandle(ipcMainWindowNames.handle_xm_verify_open, (event, url) => new Promise disableHtmlFullscreenWindowResize: true, }, }) - view.webContents.on('did-finish-load', () => { - if (/punish\?/.test(view.webContents.getURL())) return - let ses = view.webContents.session - ses.cookies.get({ name: 'x5sec' }) - .then(async([x5sec]) => { + // view.webContents.on('did-finish-load', () => { + // if (/punish\?/.test(view.webContents.getURL())) return + // let ses = view.webContents.session + // ses.cookies.get({ name: 'x5sec' }) + // .then(async([x5sec]) => { + // isActioned = true + // await closeView() + // if (!x5sec) return reject(new Error('get x5sec failed')) + // resolve(x5sec.value) + // }).catch(async err => { + // isActioned = true + // await closeView() + // reject(err) + // }) + // }) + view.webContents.session.webRequest.onCompleted({ urls: ['*://www.xiami.com/*'] }, details => { + if (/\/_____tmd_____\/slide\?/.test(details.url)) { + for (const item of details.responseHeaders['set-cookie']) { + if (!/^x5sec=/.test(item)) continue + const x5sec = /x5sec=(\w+);.+$/.exec(item) isActioned = true - await closeView() - if (!x5sec) return reject(new Error('get x5sec failed')) - resolve(x5sec.value) - }).catch(async err => { - isActioned = true - await closeView() - reject(err) - }) + closeView().finally(() => { + if (!x5sec) return reject(new Error('get x5sec failed')) + resolve(x5sec[1]) + }) + } + } }) - + // console.log(url) global.modules.mainWindow.setBrowserView(view) const windowSizeInfo = getWindowSizeInfo(global.appSetting) view.setBounds({ x: (windowSizeInfo.width - 380) / 2, y: ((windowSizeInfo.height - 320 + 52) / 2), width: 380, height: 320 }) diff --git a/src/renderer/assets/styles/animate.less b/src/renderer/assets/styles/animate.less index 2258ad96..96081c80 100644 --- a/src/renderer/assets/styles/animate.less +++ b/src/renderer/assets/styles/animate.less @@ -871,6 +871,41 @@ transform: scale(1); } } +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} .flipInX { backface-visibility: visible !important; diff --git a/src/renderer/components/core/Player.vue b/src/renderer/components/core/Player.vue index 6843c5de..2fb13e46 100644 --- a/src/renderer/components/core/Player.vue +++ b/src/renderer/components/core/Player.vue @@ -34,7 +34,7 @@ div(:class="$style.player") div(:class="$style.titleBtn" @click='addMusicTo' :tips="$t('core.player.add_music_to')") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='80%' viewBox='0 0 512 512' space='preserve') use(xlink:href='#icon-add-2') - //- div(:class="$style.playBtn" @click='handleNext' tips="音量") + //- div(:class="$style.playBtn" @click='playNext' tips="音量") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 291.063 291.064' space='preserve') use(xlink:href='#icon-sound') @@ -49,7 +49,7 @@ div(:class="$style.player") span(style="margin: 0 5px;") / span {{maxPlayTimeStr}} div(:class="$style.right") - div(:class="$style.playBtn" @click='handlePrev' :tips="$t('core.player.prev')" style="transform: rotate(180deg);") + div(:class="$style.playBtn" @click='playPrev' :tips="$t('core.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') use(xlink:href='#icon-nextMusic') div(:class="$style.playBtn" :tips="isPlay ? $t('core.player.pause') : $t('core.player.play')" @click='togglePlay') @@ -57,7 +57,7 @@ div(:class="$style.player") use(xlink:href='#icon-pause') svg(v-else version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 170 170' space='preserve') use(xlink:href='#icon-play') - div(:class="$style.playBtn" @click='handleNext' :tips="$t('core.player.next')") + div(:class="$style.playBtn" @click='playNext' :tips="$t('core.player.next')") 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') use(xlink:href='#icon-nextMusic') //- transition(enter-active-class="animated lightSpeedIn" @@ -90,7 +90,6 @@ import { rendererSend, rendererOn, NAMES } from '../../../common/ipc' import { formatPlayTime2, getRandom, checkPath, setTitle, clipboardWriteText, debounce, throttle, assertApiSupport } from '../../utils' import { mapGetters, mapActions, mapMutations } from 'vuex' import { requestMsg } from '../../utils/message' -import { isMac } from '../../../common/utils' import { player as eventPlayerNames } from '../../../common/hotKey' import musicSdk from '@renderer/utils/music' import path from 'path' @@ -107,7 +106,6 @@ const playNextModes = [ export default { data() { return { - show: true, volume: 0, nowPlayTime: 0, maxPlayTime: 0, @@ -123,7 +121,6 @@ export default { singer: '', album: '', }, - targetSong: null, pregessWidth: 0, lyric: { lines: [], @@ -133,7 +130,6 @@ export default { delayNextTimeout: null, restorePlayTime: 0, retryNum: 0, - isMac, volumeEvent: { isMsDown: false, msDownX: 0, @@ -149,10 +145,19 @@ export default { }, computed: { ...mapGetters(['setting']), - ...mapGetters('player', ['list', 'playIndex', 'changePlay', 'listId', 'isShowPlayerDetail', 'playedList']), + ...mapGetters('player', ['list', 'changePlay', 'playMusicInfo', 'isShowPlayerDetail', 'playInfo', 'playedList']), // pic() { // return this.musicInfo.img ? this.musicInfo.img : '' // }, + listId() { // 当前播放歌曲的列表ID + return this.playInfo.listId + }, + playIndex() { // 当前播放歌曲所在列表的 播放列表的播放位置 + return this.playInfo.playIndex + }, + targetSong() { + return this.playInfo.musicInfo + }, title() { return this.musicInfo.name ? this.setting.download.fileName.replace('歌名', this.musicInfo.name).replace('歌手', this.musicInfo.singer) @@ -247,38 +252,19 @@ export default { if (!n) return this.resetChangePlay() if (window.restorePlayInfo) { - let musicInfo = this.targetSong = this.list[window.restorePlayInfo.index] - this.musicInfo.songmid = musicInfo.songmid - this.musicInfo.singer = musicInfo.singer - this.musicInfo.name = musicInfo.name - this.musicInfo.album = musicInfo.albumName - this.setImg(musicInfo) - this.setLrc(musicInfo) - this.nowPlayTime = this.restorePlayTime = window.restorePlayInfo.time - this.maxPlayTime = window.restorePlayInfo.maxTime || 0 - this.handleUpdateWinLyricInfo('music_info', { - songmid: this.musicInfo.songmid, - singer: this.musicInfo.singer, - name: this.musicInfo.name, - album: this.musicInfo.album, - }) - this.$nextTick(() => { - this.sendProgressEvent(this.progress, 'paused') - }) - if (this.setting.player.togglePlayMethod == 'random') this.setPlayedList(musicInfo) + this.handleRestorePlay(window.restorePlayInfo) window.restorePlayInfo = null return } // console.log('changePlay') this.handleRemoveMusic() - if (this.playIndex < 0) return - this.stopPlay() + if (!this.playInfo.musicInfo) return this.play() }, 'setting.player.togglePlayMethod'(n) { audio.loop = n === 'singleLoop' if (this.playedList.length) this.clearPlayedList() - if (n == 'random' && this.playIndex > -1) this.setPlayedList(this.list[this.playIndex]) + if (n == 'random') this.setPlayedList(this.playMusicInfo) }, 'setting.player.isMute'(n) { audio.muted = n @@ -297,13 +283,13 @@ export default { if (index < 0) { // console.log(this.playIndex) if (n.length) { - this.fixPlayIndex(this.playIndex - 1) - this.handleNext() + this.setPlayIndex(this.playInfo.listPlayIndex - 1) + this.playNext() } else { - this.setPlayIndex(-1) + this.setPlayMusicInfo(null) } } else { - this.fixPlayIndex(index) + this.setPlayIndex(index) } // console.log(this.playIndex) } @@ -317,26 +303,37 @@ export default { }, nowPlayTime(n, o) { if (Math.abs(n - o) > 2) this.isActiveTransition = true - this.savePlayInfo({ - time: n, - maxTime: this.maxPlayTime, - listId: this.listId, - list: this.listId == null ? this.list : null, - index: this.playIndex, - }) + if (this.setting.player.isSavePlayTime && !this.playInfo.isTempPlay) { + this.savePlayInfo({ + time: n, + maxTime: this.maxPlayTime, + listId: this.listId, + list: this.listId == null ? this.list : null, + index: this.playIndex, + }) + } + }, + maxPlayTime(maxPlayTime) { + if (!this.playInfo.isTempPlay) { + this.savePlayInfo({ + time: this.nowPlayTime, + maxTime: maxPlayTime, + listId: this.listId, + list: this.listId == null ? this.list : null, + index: this.playIndex, + }) + } }, }, methods: { - ...mapActions('player', ['getUrl', 'getPic', 'getLrc']), + ...mapActions('player', ['getUrl', 'getPic', 'getLrc', 'playPrev', 'playNext']), ...mapMutations('player', [ + 'setPlayMusicInfo', 'setPlayIndex', - 'fixPlayIndex', 'resetChangePlay', 'visiblePlayerDetail', 'clearPlayedList', 'setPlayedList', - 'removePlayedList', - 'setList', ]), ...mapMutations(['setVolume', 'setPlayNextMode', 'setVisibleDesktopLyric', 'setLockDesktopLyric']), ...mapMutations('list', ['updateMusicInfo']), @@ -345,8 +342,8 @@ export default { let eventHub = window.eventHub let name = action == 'on' ? '$on' : '$off' eventHub[name](eventPlayerNames.toggle_play.action, this.togglePlay) - eventHub[name](eventPlayerNames.next.action, this.handleNext) - eventHub[name](eventPlayerNames.prev.action, this.handlePrev) + eventHub[name](eventPlayerNames.next.action, this.playNext) + eventHub[name](eventPlayerNames.prev.action, this.playPrev) eventHub[name](eventPlayerNames.volume_up.action, this.handleSetVolumeUp) eventHub[name](eventPlayerNames.volume_down.action, this.handleSetVolumeDown) eventHub[name](eventPlayerNames.volume_mute.action, this.handleSetVolumeMute) @@ -377,7 +374,7 @@ export default { console.log('播放完毕') this.stopPlay() this.status = this.statusText = this.$t('core.player.end') - this.handleNext() + this.playNext() }) audio.addEventListener('error', () => { // console.log('code', audio.error) @@ -389,7 +386,7 @@ export default { // console.log(this.retryNum) if (!this.restorePlayTime) this.restorePlayTime = audio.currentTime // 记录出错的播放时间 this.retryNum++ - this.setUrl(this.list[this.playIndex], true) + this.setUrl(this.targetSong, true) this.status = this.statusText = this.$t('core.player.refresh_url') return } @@ -407,7 +404,9 @@ export default { audio.currentTime = this.restorePlayTime this.restorePlayTime = 0 } - if (!this.targetSong.interval && this.listId != 'download') this.updateMusicInfo({ id: this.listId, index: this.playIndex, data: { interval: formatPlayTime2(this.maxPlayTime) } }) + if (!this.targetSong.interval && this.listId != 'download') { + this.updateMusicInfo({ id: this.listId, index: this.playIndex, data: { interval: formatPlayTime2(this.maxPlayTime) }, musicInfo: this.targetSong }) + } }) audio.addEventListener('loadstart', () => { console.log('loadstart') @@ -470,10 +469,11 @@ export default { this.handleRegisterEvent('on') }, async play() { - console.log('play', this.playIndex) this.clearDelayNextTimeout() - let targetSong = this.targetSong = this.list[this.playIndex] - if (this.setting.player.togglePlayMethod == 'random') this.setPlayedList(targetSong) + + const targetSong = this.targetSong + + if (this.setting.player.togglePlayMethod == 'random') this.setPlayedList(this.playMusicInfo) this.retryNum = 0 this.restorePlayTime = 0 @@ -481,7 +481,7 @@ export default { const filePath = path.join(this.setting.download.savePath, targetSong.fileName) // console.log(filePath) if (!await checkPath(filePath) || !targetSong.isComplate || /\.ape$/.test(filePath)) { - return this.list.length == 1 ? null : this.handleNext() + return this.list.length == 1 ? null : this.playNext() } this.musicInfo.songmid = targetSong.musicInfo.songmid this.musicInfo.singer = targetSong.musicInfo.singer @@ -492,7 +492,7 @@ export default { this.setImg(targetSong.musicInfo) this.setLrc(targetSong.musicInfo) } else { - if (!this.assertApiSupport(targetSong.source)) return this.handleNext() + if (!this.assertApiSupport(targetSong.source)) return this.playNext() this.musicInfo.songmid = targetSong.songmid this.musicInfo.singer = targetSong.singer this.musicInfo.name = targetSong.name @@ -507,6 +507,15 @@ export default { name: this.musicInfo.name, album: this.musicInfo.album, }) + if (!this.playInfo.isTempPlay) { + this.savePlayInfo({ + time: this.nowPlayTime, + maxTime: this.maxPlayTime, + listId: this.listId, + list: this.listId == null ? this.list : null, + index: this.playIndex, + }) + } }, clearDelayNextTimeout() { // console.log(this.delayNextTimeout) @@ -519,120 +528,10 @@ export default { this.clearDelayNextTimeout() this.delayNextTimeout = setTimeout(() => { this.delayNextTimeout = null - this.handleNext() + this.playNext() }, 5000) }, - async filterList() { - // if (this.list.listName === null) return - let list - let playedList = [...this.playedList] - if (this.listId == 'download') { - list = [] - for (const item of this.list) { - const filePath = path.join(this.setting.download.savePath, item.fileName) - if (!await checkPath(filePath) || !item.isComplate || /\.ape$/.test(filePath)) continue - let index = playedList.indexOf(item) - if (index > -1) { - playedList.splice(index, 1) - continue - } - list.push(item) - } - } else { - list = this.list.filter(s => { - let index = playedList.indexOf(s) - if (index > -1) { - playedList.splice(index, 1) - return false - } - return this.assertApiSupport(s.source) - }) - } - if (!list.length && this.playedList.length) { - this.clearPlayedList() - return this.filterList() - } - return list - }, - async handlePrev() { - // console.log(playIndex) - if (this.setting.player.togglePlayMethod == 'random' && this.playedList.length) { - let index = this.playedList.indexOf(this.targetSong) - index -= 1 - while (true) { - if (index > -1) { - let listIndex = this.list.indexOf(this.playedList[index]) - if (listIndex < 0) { - this.removePlayedList(index) - continue - } - this.setPlayIndex(listIndex) - return - } - break - } - } - let list = await this.filterList() - if (!list.length) return this.setPlayIndex(-1) - let playIndex = list.indexOf(this.list[this.playIndex]) - let index - switch (this.setting.player.togglePlayMethod) { - case 'random': - index = this.hanldeListRandom(list, playIndex) - break - case 'listLoop': - case 'list': - index = playIndex === 0 ? list.length - 1 : playIndex - 1 - break - default: - return - } - if (index < 0) return - index = this.list.indexOf(list[index]) - this.setPlayIndex(index) - }, - async handleNext() { - // if (this.list.listName === null) return - // eslint-disable-next-line no-debugger - if (this.setting.player.togglePlayMethod == 'random' && this.playedList.length) { - let index = this.playedList.indexOf(this.targetSong) - index += 1 - while (true) { - if (index < this.playedList.length) { - let listIndex = this.list.indexOf(this.playedList[index]) - if (listIndex < 0) { - this.removePlayedList(index) - continue - } - this.setPlayIndex(listIndex) - return - } - break - } - } - let list = await this.filterList() - if (!list.length) return this.setPlayIndex(-1) - let playIndex = list.indexOf(this.list[this.playIndex]) - // console.log(playIndex) - let index - switch (this.setting.player.togglePlayMethod) { - case 'listLoop': - index = playIndex === list.length - 1 ? 0 : playIndex + 1 - break - case 'random': - index = this.hanldeListRandom(list, playIndex) - break - case 'list': - index = playIndex === list.length - 1 ? -1 : playIndex + 1 - break - default: - return - } - if (index < 0) return - index = this.list.indexOf(list[index]) - this.setPlayIndex(index) - }, hanldeListRandom(list, index) { return getRandom(0, list.length) }, @@ -674,7 +573,7 @@ export default { togglePlay() { if (!audio.src) { if (this.restorePlayTime != null) { - if (!this.assertApiSupport(this.targetSong.source)) return this.handleNext() + if (!this.assertApiSupport(this.targetSong.source)) return this.playNext() this.setUrl(this.targetSong) } return @@ -703,8 +602,9 @@ export default { this.musicInfo.url = targetSong.typeUrl[type] this.status = this.statusText = this.$t('core.player.geting_url') - return this.getUrl({ musicInfo: targetSong, originMusic, type, isRefresh }).then(() => { - audio.src = this.musicInfo.url = targetSong.typeUrl[type] + return this.getUrl({ musicInfo: targetSong, originMusic, type, isRefresh }).then(url => { + if ((targetSong !== this.targetSong && originMusic !== this.targetSong) || this.isPlay) return + audio.src = this.musicInfo.url = url }).catch(err => { // console.log('err', err.message) if (err.message == requestMsg.cancelRequest) return @@ -714,13 +614,13 @@ export default { this.status = this.statusText = 'Try toggle source...' return (originMusic.otherSource && originMusic.otherSource.length ? Promise.resolve(originMusic.otherSource) : musicSdk.findMusic(originMusic)).then(res => { - this.updateMusicInfo({ id: this.listId, index: this.playIndex, data: { otherSource: res } }) + this.updateMusicInfo({ id: this.listId, index: this.playIndex, data: { otherSource: res }, musicInfo: originMusic }) return res }).then(otherSource => { console.log('find otherSource', otherSource) if (otherSource.length) { for (const item of otherSource) { - if (retryedSource.includes(item.source)) continue + if (retryedSource.includes(item.source) || !this.assertApiSupport(item.source)) continue console.log('try toggle to: ', item.source, item.name, item.singer, item.interval) return this.setUrl(item, isRefresh, false, retryedSource, originMusic) } @@ -825,13 +725,13 @@ export default { this.setProgressWidth() }, handleToMusicLocation() { - if (!this.listId || this.listId == 'download') return + if (!this.listId || this.listId == '__temp__' || this.listId == 'download') return if (this.playIndex == -1) return this.$router.push({ path: 'list', query: { id: this.listId, - scrollIndex: this.playIndex, + scrollIndex: this.playInfo.playIndex, }, }) }, @@ -846,7 +746,7 @@ export default { startLoadingTimeout() { // console.log('start load timeout') this.loadingTimeout = setTimeout(() => { - this.handleNext() + this.playNext() }, 20000) }, clearLoadingTimeout() { @@ -865,7 +765,7 @@ export default { if (skipTime > this.maxPlayTime) skipTime = (this.maxPlayTime - audio.currentTime) / 2 if (skipTime - this.mediaBuffer.playTime < 1 || this.maxPlayTime - skipTime < 1) { this.mediaBuffer.playTime = 0 - this.handleNext() + this.playNext() return } this.startBuffering() @@ -925,13 +825,13 @@ export default { handlePlayDetailAction({ type, data }) { switch (type) { case 'prev': - this.handlePrev() + this.playPrev() break case 'togglePlay': this.togglePlay() break case 'next': - this.handleNext() + this.playNext() break case 'progress': this.setProgress(data) @@ -972,6 +872,28 @@ export default { if (!this.musicInfo.songmid) return this.isShowAddMusicTo = true }, + handleRestorePlay(restorePlayInfo) { + let musicInfo = this.list[restorePlayInfo.index] + this.musicInfo.songmid = musicInfo.songmid + this.musicInfo.singer = musicInfo.singer + this.musicInfo.name = musicInfo.name + this.musicInfo.album = musicInfo.albumName + this.setImg(musicInfo) + this.setLrc(musicInfo) + this.nowPlayTime = this.restorePlayTime = restorePlayInfo.time + this.maxPlayTime = restorePlayInfo.maxTime || 0 + this.handleUpdateWinLyricInfo('music_info', { + songmid: this.musicInfo.songmid, + singer: this.musicInfo.singer, + name: this.musicInfo.name, + album: this.musicInfo.album, + }) + this.$nextTick(() => { + this.sendProgressEvent(this.progress, 'paused') + }) + + if (this.setting.player.togglePlayMethod == 'random') this.setPlayedList(this.playMusicInfo) + }, }, } diff --git a/src/renderer/components/material/Menu.vue b/src/renderer/components/material/Menu.vue index a48afd6e..ad4df157 100644 --- a/src/renderer/components/material/Menu.vue +++ b/src/renderer/components/material/Menu.vue @@ -138,7 +138,7 @@ export default { // will-change: transform; li { cursor: pointer; - min-width: 90px; + min-width: 96px; line-height: 34px; // color: @color-btn; padding: 0 10px; diff --git a/src/renderer/components/material/Modal.vue b/src/renderer/components/material/Modal.vue index 83a4f4fa..d9981428 100644 --- a/src/renderer/components/material/Modal.vue +++ b/src/renderer/components/material/Modal.vue @@ -74,9 +74,9 @@ export default { 'slideOutLeft', 'slideOutRight', 'slideOutUp', - 'hinge', + // 'hinge', ], - inClass: 'animated flipInX', + inClass: 'animated jackInTheBox', outClass: 'animated flipOutX', unwatchFn: null, } diff --git a/src/renderer/components/material/SongList.vue b/src/renderer/components/material/SongList.vue index 3b83508e..67c3c46a 100644 --- a/src/renderer/components/material/SongList.vue +++ b/src/renderer/components/material/SongList.vue @@ -114,6 +114,11 @@ export default { action: 'download', disabled: !this.listMenu.itemMenuControl.download, }, + { + name: this.$t('material.song_list.list_play_later'), + action: 'playLater', + disabled: !this.listMenu.itemMenuControl.playLater, + }, { name: this.$t('material.song_list.list_search'), action: 'search', @@ -173,6 +178,7 @@ export default { itemMenuControl: { play: true, addTo: true, + playLater: true, download: true, search: true, sourceDetail: true, @@ -335,6 +341,7 @@ export default { handleListItemRigthClick(event, index) { this.listMenu.itemMenuControl.sourceDetail = !!musicSdk[this.list[index].source].getMusicDetailPageUrl this.listMenu.itemMenuControl.play = + this.listMenu.itemMenuControl.playLater = this.listMenu.itemMenuControl.download = this.assertApiSupport(this.list[index].source) let dom_selected = this.$refs.dom_tbody.querySelector('tr.selected') diff --git a/src/renderer/components/material/VersionModal.vue b/src/renderer/components/material/VersionModal.vue index 9439d57e..2d398110 100644 --- a/src/renderer/components/material/VersionModal.vue +++ b/src/renderer/components/material/VersionModal.vue @@ -3,17 +3,17 @@ material-modal(:show="version.showModal" @close="handleClose" v-if="version.newV main(:class="$style.main" v-if="version.isDownloaded") h2 🚀程序更新🚀 - div.scroll(:class="$style.info") + div.scroll.select(:class="$style.info") div(:class="$style.current") h3 最新版本:{{version.newVersion.version}} h3 当前版本:{{version.version}} h3 版本变化: - p(:class="$style.desc" v-html="version.newVersion.desc") + pre(:class="$style.desc" v-text="version.newVersion.desc") div(:class="[$style.history, $style.desc]" v-if="history.length") h3 历史版本: div(:class="$style.item" v-for="ver in history") h4 v{{ver.version}} - p(v-html="ver.desc") + pre(v-text="ver.desc") div(:class="$style.footer") div(:class="$style.desc") p 新版本已下载完毕, @@ -27,17 +27,17 @@ material-modal(:show="version.showModal" @close="handleClose" v-if="version.newV main(:class="$style.main" v-else-if="version.isError && !version.isUnknow && version.newVersion.version != version.version") h2 ❌ 版本更新出错 ❌ - div.scroll(:class="$style.info") + div.scroll.select(:class="$style.info") div(:class="$style.current") h3 最新版本:{{version.newVersion.version}} h3 当前版本:{{version.version}} h3 版本变化: - p(:class="$style.desc" v-html="version.newVersion.desc") + pre(:class="$style.desc" v-text="version.newVersion.desc") div(:class="[$style.history, $style.desc]" v-if="history.length") h3 历史版本: div(:class="$style.item" v-for="ver in history") h4 v{{ver.version}} - p(v-html="ver.desc") + pre(v-text="ver.desc") div(:class="$style.footer") div(:class="$style.desc") @@ -58,7 +58,7 @@ material-modal(:show="version.showModal" @close="handleClose" v-if="version.newV main(:class="$style.main" v-else-if="version.isDownloading && version.isTimeOut && !version.isUnknow") h2 ❗️ 新版本下载超时 ❗️ div(:class="$style.desc") - p 你当前所在网络访问GitHub较慢,导致新版本下载超时(已经下了半个钟了😳),建议手动更新版本! + p 你当前所在网络访问GitHub较慢,导致新版本下载超时(已经下了半个钟了😳),你仍可选择继续等,但墙裂建议手动更新版本! p | 你可以去 material-btn(min @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/releases')" tips="点击打开") 软件发布页 @@ -75,7 +75,7 @@ material-modal(:show="version.showModal" @close="handleClose" v-if="version.newV main(:class="$style.main" v-else-if="version.isUnknow") h2 ❓ 获取最新版本信息失败 ❓ - div.scroll(:class="$style.info") + div.scroll.select(:class="$style.info") div(:class="$style.current") h3 当前版本:{{version.version}} div(:class="$style.desc") @@ -94,17 +94,17 @@ material-modal(:show="version.showModal" @close="handleClose" v-if="version.newV main(:class="$style.main" v-else) h2 🌟发现新版本🌟 - div.scroll(:class="$style.info") + div.scroll.select(:class="$style.info") div(:class="$style.current") h3 最新版本:{{version.newVersion.version}} h3 当前版本:{{version.version}} h3 版本变化: - p(:class="$style.desc" v-html="version.newVersion.desc") + pre(:class="$style.desc" v-text="version.newVersion.desc") div(:class="[$style.history, $style.desc]" v-if="history.length") h3 历史版本: div(:class="$style.item" v-for="ver in history") h4 v{{ver.version}} - p(v-html="ver.desc") + pre(v-text="ver.desc") div(:class="$style.footer") div(:class="$style.desc") @@ -146,7 +146,7 @@ export default { progress() { return this.version.downloadProgress ? `${this.version.downloadProgress.percent.toFixed(2)}% - ${sizeFormate(this.version.downloadProgress.transferred)}/${sizeFormate(this.version.downloadProgress.total)} - ${sizeFormate(this.version.downloadProgress.bytesPerSecond)}/s` - : '初始化中...' + : '处理更新中...' }, isIgnored() { return this.setting.ignoreVersion == this.version.newVersion.version @@ -207,6 +207,11 @@ export default { font-size: 14px; line-height: 1.3; } + pre { + white-space: pre-wrap; + text-align: justify; + margin-top: 10px; + } } .info { diff --git a/src/renderer/lang/en-us/material/song_list.json b/src/renderer/lang/en-us/material/song_list.json index 8782cd51..d0b3ba23 100644 --- a/src/renderer/lang/en-us/material/song_list.json +++ b/src/renderer/lang/en-us/material/song_list.json @@ -1,5 +1,6 @@ { "list_play": "Play", + "list_play_later": "Play later", "list_add_to": "Add to ...", "list_download": "Download", "list_search": "Search", diff --git a/src/renderer/lang/en-us/view/download.json b/src/renderer/lang/en-us/view/download.json index 57f45632..1fd22e42 100644 --- a/src/renderer/lang/en-us/view/download.json +++ b/src/renderer/lang/en-us/view/download.json @@ -1,5 +1,6 @@ { "menu_play": "Play", + "menu_play_later": "Play later", "menu_start": "Start task", "menu_pause": "Pause Task", "menu_file": "Locate File", diff --git a/src/renderer/lang/en-us/view/list.json b/src/renderer/lang/en-us/view/list.json index 0bb795de..ba66d08e 100644 --- a/src/renderer/lang/en-us/view/list.json +++ b/src/renderer/lang/en-us/view/list.json @@ -7,6 +7,7 @@ "lists_sync": "Sync", "lists_remove": "Remove", "list_play": "Play", + "list_play_later": "Play later", "list_copy_name": "Copy name", "list_add_to": "Add to ...", "list_move_to": "Move to ...", diff --git a/src/renderer/lang/en-us/view/search.json b/src/renderer/lang/en-us/view/search.json index a265f2cf..655d1d4c 100644 --- a/src/renderer/lang/en-us/view/search.json +++ b/src/renderer/lang/en-us/view/search.json @@ -1,5 +1,6 @@ { "list_play": "Play", + "list_play_later": "Play later", "list_add_to": "Add to ...", "list_download": "Download", "list_source_detail": "Song Page", @@ -10,6 +11,7 @@ "time": "Length", "lossless": "SQ", "high_quality": "HQ", + "loding_list": "Loading...", "no_item": "Search what I want to 😉", "hot_search": "Top Searches", "history_search": "History Searches", diff --git a/src/renderer/lang/en-us/view/setting.json b/src/renderer/lang/en-us/view/setting.json index 8c94a881..2eaa537a 100644 --- a/src/renderer/lang/en-us/view/setting.json +++ b/src/renderer/lang/en-us/view/setting.json @@ -2,7 +2,6 @@ "basic": "General", "basic_theme": "Theme", "basic_show_animation": "Show switching animation", - "basic_animation_title": "Animation effect of the pop-up layer", "basic_animation": "Random pop-up animation", "basic_source_title": "Choose a music source", "basic_source_test": "Test API (Available for most software features)", @@ -21,8 +20,7 @@ "basic_window_size_larger": "Larger", "basic_window_size_oversized": "Oversized", "basic_window_size_huge": "Huge", - "basic_to_tray_title": "Minimize it to the system tray without closing the software when closing", - "basic_to_tray": "Minimize to system tray when closing", + "basic_to_tray": "Do not exit the software when closing the software and minimize it to the system tray", "basic_lang_title": "The language displayed in the software", "basic_lang": "Language", "basic_control_btn_position": "Control Button Position", @@ -30,21 +28,13 @@ "basic_control_btn_position_right": "Right", "play": "Play", - "play_toggle_title": "If none selected, it stopped when the music playing is done.", - "play_toggle": "Playback mode", - "play_toggle_list_loop": "Playlist repeat", - "play_toggle_random": "Playlist shuffle", - "play_toggle_list": "Play in order", - "play_toggle_single_loop": "Single repeat", + "play_save_play_time": "Remember playback progress", "play_lyric_transition": "Show lyrics translation", - "play_quality_title": "The 320k quality is preferred for playing", - "play_quality": "Prefer High Quality 320k", - "play_task_bar_title": "Show playing progress on the taskbar", - "play_task_bar": "Taskbar play progress bar", + "play_quality": "Play 320K quality songs first (if supported)", + "play_task_bar": "Show playing progress on the taskbar", "play_mediaDevice_title": "Select a media device for audio output", "play_mediaDevice": "Audio output", - "play_mediaDevice_remove_stop_play": "Whether to pause playback when the audio output device is changed", - "play_mediaDevice_remove_stop_play_title": "Whether to pause the song when the current sound output device is changed", + "play_mediaDevice_remove_stop_play": "Pause the song when the current sound output device is changed", "desktop_lyric": "Desktop Lyric Settings", "desktop_lyric_enable": "Display lyrics", @@ -53,18 +43,13 @@ "desktop_lyric_lock_screen": "It is not allowed to drag the lyrics window out of the main screen", "search": "Search", - "search_hot_title": "Select whether to show popular searches", "search_hot": "Top Searches", - "search_history_title": "Select whether to show search history", "search_history": "Search history", - "search_focus_search_box_title": "Whether the search box is automatically focused on startup", - "search_focus_search_box": "Whether the search box is focused on startup", + "search_focus_search_box": "Automatically focus the search box on startup", "list": "List", - "list_source_title": "Select whether to show music source", - "list_source": "Select whether to show music source (for Your Library only)", - "list_scroll_title": "Select whether to remember the playlist scrollbar position", - "list_scroll": "Remember playlist scrolling position (for Your library only)", + "list_source": "Show song source (only valid for my music category)", + "list_scroll": "Remember the position of the scroll bar of the playlist (only valid for my music classification)", "download": "Download", "download_enable": "Whether to enable download function", @@ -150,7 +135,7 @@ "update_latest": "The software is up-to-date, enjoy yourself!🥂", "update_open_version_modal_btn": "Open the update window🚀", "update_checking": "Checking for updates...", - "update_init": "Initializing update...", + "update_init": "Processing update...", "about": "About lx-music-desktop", diff --git a/src/renderer/lang/en-us/view/song_list.json b/src/renderer/lang/en-us/view/song_list.json index 8c600d5b..55512767 100644 --- a/src/renderer/lang/en-us/view/song_list.json +++ b/src/renderer/lang/en-us/view/song_list.json @@ -8,5 +8,6 @@ "tip_2": "If you encounter a link to a playlist that cannot be opened, welcome feedback", "tip_3": "Kugou source does not support opening with playlist ID, but supports Kugou code opening", "play_all": "Play", + "play_later": "Play later", "add_all": "Collect" } diff --git a/src/renderer/lang/zh-cn/material/song_list.json b/src/renderer/lang/zh-cn/material/song_list.json index a0eb76f1..8735c6d9 100644 --- a/src/renderer/lang/zh-cn/material/song_list.json +++ b/src/renderer/lang/zh-cn/material/song_list.json @@ -1,5 +1,6 @@ { "list_play": "播放", + "list_play_later": "稍后播放", "list_add_to": "添加到...", "list_download": "下载", "list_source_detail": "歌曲详情页", diff --git a/src/renderer/lang/zh-cn/view/download.json b/src/renderer/lang/zh-cn/view/download.json index 89af68b3..846f3de1 100644 --- a/src/renderer/lang/zh-cn/view/download.json +++ b/src/renderer/lang/zh-cn/view/download.json @@ -1,5 +1,6 @@ { "menu_play": "播放", + "menu_play_later": "稍后播放", "menu_start": "开始任务", "menu_pause": "暂停任务", "menu_file": "定位文件", diff --git a/src/renderer/lang/zh-cn/view/list.json b/src/renderer/lang/zh-cn/view/list.json index ae8507eb..bd619951 100644 --- a/src/renderer/lang/zh-cn/view/list.json +++ b/src/renderer/lang/zh-cn/view/list.json @@ -7,6 +7,7 @@ "lists_sync": "同步", "lists_remove": "删除", "list_play": "播放", + "list_play_later": "稍后播放", "list_copy_name": "复制歌曲名", "list_source_detail": "歌曲详情页", "list_add_to": "添加到...", diff --git a/src/renderer/lang/zh-cn/view/search.json b/src/renderer/lang/zh-cn/view/search.json index b981c68f..bc418cb6 100644 --- a/src/renderer/lang/zh-cn/view/search.json +++ b/src/renderer/lang/zh-cn/view/search.json @@ -1,5 +1,6 @@ { "list_play": "播放", + "list_play_later": "稍后播放", "list_add_to": "添加到...", "list_download": "下载", "list_source_detail": "歌曲详情页", @@ -10,6 +11,7 @@ "time": "时长", "lossless": "无损", "high_quality": "高品质", + "loding_list": "加载中...", "no_item": "搜我所想~~😉", "hot_search": "热门搜索", "history_search": "历史搜索", diff --git a/src/renderer/lang/zh-cn/view/setting.json b/src/renderer/lang/zh-cn/view/setting.json index 86472ccd..00e1dcdd 100644 --- a/src/renderer/lang/zh-cn/view/setting.json +++ b/src/renderer/lang/zh-cn/view/setting.json @@ -1,7 +1,6 @@ { "basic": "基本设置", "basic_theme": "主题颜色", - "basic_animation_title": "弹出层的动画效果", "basic_animation": "弹出层随机动画", "basic_show_animation": "显示切换动画", "basic_source_title": "选择音乐来源", @@ -21,8 +20,7 @@ "basic_window_size_larger": "较大", "basic_window_size_oversized": "超大", "basic_window_size_huge": "巨大", - "basic_to_tray_title": "关闭时不退出软件将其最小化到系统托盘", - "basic_to_tray": "关闭时最小化到系统托盘", + "basic_to_tray": "关闭软件时不退出软件将其最小化到系统托盘", "basic_lang_title": "软件显示的语言", "basic_lang": "语言", "basic_control_btn_position": "控制按钮位置", @@ -30,21 +28,13 @@ "basic_control_btn_position_right": "右边", "play": "播放设置", - "play_toggle_title": "都不选时播放完当前歌曲就停止播放", - "play_toggle": "歌曲切换方式", - "play_toggle_list_loop": "列表循环", - "play_toggle_random": "列表随机", - "play_toggle_list": "顺序播放", - "play_toggle_single_loop": "单曲循环", + "play_save_play_time": "记住播放进度", "play_lyric_transition": "显示歌词翻译", - "play_quality_title": "启用时将优先播放320K品质的歌曲", - "play_quality": "优先播放高品质音乐", - "play_task_bar_title": "在任务栏上显示当前歌曲播放进度", - "play_task_bar": "任务栏播放进度条", + "play_quality": "优先播放320K品质的歌曲(如果支持)", + "play_task_bar": "在任务栏上显示当前歌曲播放进度", "play_mediaDevice_title": "选择声音输出的媒体设备", "play_mediaDevice": "音频输出", - "play_mediaDevice_remove_stop_play": "音频输出设备被改变时是否暂停播放", - "play_mediaDevice_remove_stop_play_title": "当前的声音输出设备被改变时是否暂停播放歌曲", + "play_mediaDevice_remove_stop_play": "当前的声音输出设备被改变时暂停播放歌曲", "desktop_lyric": "桌面歌词设置", "desktop_lyric_enable": "显示歌词", @@ -53,18 +43,13 @@ "desktop_lyric_lock_screen": "不允许歌词窗口拖出主屏幕之外", "search": "搜索设置", - "search_hot_title": "是否显示热门搜索", - "search_hot": "热门搜索", - "search_history_title": "是否显示历史搜索记录", - "search_history": "搜索历史", - "search_focus_search_box_title": "启动时是否自动聚焦搜索框", - "search_focus_search_box": "启动时是否聚焦搜索框", + "search_hot": "显示热门搜索", + "search_history": "显示历史搜索记录", + "search_focus_search_box": "启动时自动聚焦搜索框", "list": "列表设置", - "list_source_title": "是否显示歌曲源", - "list_source": "是否显示歌曲源(仅对我的音乐分类有效)", - "list_scroll_title": "是否记住播放列表滚动条位置", - "list_scroll": "记住列表滚动位置(仅对我的音乐分类有效)", + "list_source": "显示歌曲源(仅对我的音乐分类有效)", + "list_scroll": "记住播放列表滚动条位置(仅对我的音乐分类有效)", "download": "下载设置", "download_enable": "是否启用下载功能", @@ -150,7 +135,7 @@ "update_latest": "软件已是最新,尽情地体验吧~🥂", "update_open_version_modal_btn": "打开更新窗口 🚀", "update_checking": "检查更新中...", - "update_init": "更新初始化中...", + "update_init": "处理更新中...", "about": "关于洛雪音乐", diff --git a/src/renderer/lang/zh-cn/view/song_list.json b/src/renderer/lang/zh-cn/view/song_list.json index bbbadf6b..f0b6f1fb 100644 --- a/src/renderer/lang/zh-cn/view/song_list.json +++ b/src/renderer/lang/zh-cn/view/song_list.json @@ -8,5 +8,6 @@ "tip_2": "若遇到无法打开的歌单链接,欢迎反馈", "tip_3": "酷狗源不支持用歌单ID打开,但支持酷狗码打开", "play_all": "播放", + "play_later": "稍后播放", "add_all": "收藏" } diff --git a/src/renderer/lang/zh-tw/material/song_list.json b/src/renderer/lang/zh-tw/material/song_list.json index ed5a4460..c91c8ca4 100644 --- a/src/renderer/lang/zh-tw/material/song_list.json +++ b/src/renderer/lang/zh-tw/material/song_list.json @@ -1,5 +1,6 @@ { "list_play": "播放", + "list_play_later": "稍後播放", "list_add_to": "添加到...", "list_download": "下載", "list_search": "搜索", diff --git a/src/renderer/lang/zh-tw/view/download.json b/src/renderer/lang/zh-tw/view/download.json index 025f5b98..6264abae 100644 --- a/src/renderer/lang/zh-tw/view/download.json +++ b/src/renderer/lang/zh-tw/view/download.json @@ -1,5 +1,6 @@ { "menu_play": "播放", + "menu_play_later": "稍後播放", "menu_start": "開始任務", "menu_pause": "暫停任務", "menu_file": "定位文件", diff --git a/src/renderer/lang/zh-tw/view/list.json b/src/renderer/lang/zh-tw/view/list.json index fbdf37f9..6f2d1731 100644 --- a/src/renderer/lang/zh-tw/view/list.json +++ b/src/renderer/lang/zh-tw/view/list.json @@ -7,6 +7,7 @@ "lists_sync": "同步", "lists_remove": "刪除", "list_play": "播放", + "list_play_later": "稍後播放", "list_copy_name": "複製歌曲名", "list_add_to": "添加到...", "list_move_to": "移動到...", diff --git a/src/renderer/lang/zh-tw/view/search.json b/src/renderer/lang/zh-tw/view/search.json index ac9d7a36..9a1c2168 100644 --- a/src/renderer/lang/zh-tw/view/search.json +++ b/src/renderer/lang/zh-tw/view/search.json @@ -1,5 +1,6 @@ { "list_play": "播放", + "list_play_later": "稍後播放", "list_add_to": "添加到...", "list_download": "下載", "list_source_detail": "歌曲詳情頁", @@ -10,6 +11,7 @@ "time": "時長", "lossless": "無損", "high_quality": "高品質", + "loding_list": "加載中...", "no_item": "搜我所想~~😉", "hot_search": "熱門搜索", "history_search": "歷史搜索", diff --git a/src/renderer/lang/zh-tw/view/setting.json b/src/renderer/lang/zh-tw/view/setting.json index 0ced2518..0ba303c2 100644 --- a/src/renderer/lang/zh-tw/view/setting.json +++ b/src/renderer/lang/zh-tw/view/setting.json @@ -1,7 +1,6 @@ { "basic": "基本設置", "basic_theme": "主題顏色", - "basic_animation_title": "彈出層的動畫效果", "basic_animation": "彈出層隨機動畫", "basic_show_animation": "顯示切換動畫", "basic_source_title": "選擇音樂來源", @@ -21,46 +20,37 @@ "basic_window_size_larger": "較大", "basic_window_size_oversized": "超大", "basic_window_size_huge": "巨大", - "basic_to_tray_title": "關閉時不退出軟件將其最小化到系統托盤", - "basic_to_tray": "關閉時最小化到系統托盤", + "basic_to_tray": "關閉軟件時不退出軟件將其最小化到系統托盤", "basic_lang_title": "軟件顯示的語言", "basic_lang": "語言", "basic_control_btn_position": "控制按鈕位置", "basic_control_btn_position_left": "左邊", "basic_control_btn_position_right": "右邊", + "play": "播放設置", - "play_toggle_title": "都不選時播放完當前歌曲就停止播放", - "play_toggle": "歌曲切換方式", - "play_toggle_list_loop": "列表循環", - "play_toggle_random": "列表隨機", - "play_toggle_list": "順序播放", - "play_toggle_single_loop": "單曲循環", + "play_save_play_time": "記住播放進度", "play_lyric_transition": "顯示歌詞翻譯", - "play_quality_title": "啟用時將優先播放320K品質的歌曲", - "play_quality": "優先播放高品質音樂", - "play_task_bar_title": "在任務欄上顯示當前歌曲播放進度", - "play_task_bar": "任務欄播放進度條", + "play_quality": "優先播放320K品質的歌曲(如果支持)", + "play_task_bar": "在任務欄上顯示當前歌曲播放進度", "play_mediaDevice_title": "選擇聲音輸出的媒體設備", "play_mediaDevice": "音頻輸出", - "play_mediaDevice_remove_stop_play": "音頻輸出設備被改變時是否暫停播放", - "play_mediaDevice_remove_stop_play_title": "當前的聲音輸出設備被改變時是否暫停播放歌曲", + "play_mediaDevice_remove_stop_play": "當前的聲音輸出設備被改變時暫停播放歌曲", + "desktop_lyric": "桌面歌詞設置", "desktop_lyric_enable": "顯示歌詞", "desktop_lyric_lock": "鎖定歌詞", "desktop_lyric_always_on_top": "使歌詞總是在其他窗口之上", "desktop_lyric_lock_screen": "不允許歌詞窗口拖出主屏幕之外", + "search": "搜索設置", - "search_hot_title": "是否顯示熱門搜索", - "search_hot": "熱門搜索", - "search_history_title": "是否顯示歷史搜索記錄", - "search_history": "搜索歷史", - "search_focus_search_box_title": "啟動時是否自動聚焦搜索框", - "search_focus_search_box": "啟動時是否聚焦搜索框", + "search_hot": "顯示熱門搜索", + "search_history": "顯示歷史搜索記錄", + "search_focus_search_box": "啟動時自動聚焦搜索框", + "list": "列表設置", - "list_source_title": "是否顯示歌曲源", - "list_source": "是否顯示歌曲源(僅對我的音樂分類有效)", - "list_scroll_title": "是否記住播放列表滾動條位置", - "list_scroll": "記住列表滾動位置(僅對我的音樂分類有效)", + "list_source": "顯示歌曲源(僅對我的音樂分類有效)", + "list_scroll": "記住播放列表滾動條位置(僅對我的音樂分類有效)", + "download": "下載設置", "download_enable": "是否啟用下載功能", "download_path_title": "下載歌曲保存的路徑", @@ -79,6 +69,7 @@ "download_name2": "歌手 - 歌名", "download_name3": "歌名", "download_select_save_path": "選擇歌曲保存路徑", + "hot_key": "快捷鍵設置", "hot_key_local_title": "軟件內快捷鍵", "hot_key_global_title": "全局快捷鍵", @@ -98,15 +89,18 @@ "hot_key_desktop_lyric_toggle_visible": "開/關桌面歌詞", "hot_key_desktop_lyric_toggle_lock": "桌面歌詞鎖定切換", "hot_key_desktop_lyric_toggle_always_top": "桌面歌詞置頂切換", + "network": "網絡設置", "network_proxy_title": "HTTP代理設置(亂設置軟件將無法聯網)", "network_proxy_host": "主機", "network_proxy_port": "端口", "network_proxy_username": "用戶名", "network_proxy_password": "密碼", + "odc": "強迫症設置", "odc_clear_search_input": "離開搜索界面時清空搜索框", "odc_clear_search_list": "離開搜索界面時清空搜索列表", + "backup": "備份與恢復", "backup_part": "部分數據(列表數據包括試聽列表、收藏列表、用戶自定義列表,設置數據不包括快捷鍵設置)", "backup_part_import_list": "導入列表", @@ -121,7 +115,8 @@ "backup_part_import_setting_desc": "選擇配置文件", "backup_part_export_setting_desc": "選擇設置保存位置", "backup_part_import_list_desc": "選擇列表文件", - "backup_part_export_list_desc": "選擇列表保存位置", + "backup_part_export_list_desc": "選擇歌單保存位置", + "other": "其他", "other_tray_theme": "托盤圖標樣式", "other_tray_theme_native": "純色", @@ -130,6 +125,7 @@ "other_cache_label": "軟件已使用緩存大小:", "other_cache_label_title": "當前已用緩存", "other_cache_clear_btn": "清理緩存", + "update": "軟件更新", "update_latest_label": "最新版本:", "update_unknown": "未知", @@ -139,8 +135,11 @@ "update_latest": "軟件已是最新,盡情地體驗吧~🥂", "update_open_version_modal_btn": "打開更新窗口 🚀", "update_checking": "檢查更新中...", - "update_init": "更新初始化中...", + "update_init": "處理更新中...", + "about": "關於洛雪音樂", + + "is_enable": "是否啟用", "is_show": "是否顯示", "click_open": "點擊打開", diff --git a/src/renderer/lang/zh-tw/view/song_list.json b/src/renderer/lang/zh-tw/view/song_list.json index a52e8aa9..b4f484b5 100644 --- a/src/renderer/lang/zh-tw/view/song_list.json +++ b/src/renderer/lang/zh-tw/view/song_list.json @@ -8,5 +8,6 @@ "tip_2": "若遇到無法打開的歌單鏈接,歡迎反饋", "tip_3": "酷狗源不支持用歌單ID打開,但支持酷狗碼打開", "play_all": "播放", + "play_later": "稍後播放", "add_all": "收藏" } diff --git a/src/renderer/store/actions.js b/src/renderer/store/actions.js index ed8b8ec1..266dd7d5 100644 --- a/src/renderer/store/actions.js +++ b/src/renderer/store/actions.js @@ -19,16 +19,31 @@ export default { }, getVersionInfo2(state, retryNum = 0) { return new Promise((resolve, reject) => { - httpGet('https://cdn.stsky.cn/lx-music/desktop/version.json', { + httpGet('https://gitee.com/lyswhut/lx-music-desktop-versions/raw/master/version.json', { timeout: 20000, }, (err, resp, body) => { + if (!err && !body.version) err = new Error(JSON.stringify(body)) if (err) { return ++retryNum > 3 - ? reject(err) + ? this.dispatch('getVersionInfo3').then(resolve).catch(reject) : this.dispatch('getVersionInfo2', retryNum).then(resolve).catch(reject) } resolve(body) }) }) }, + getVersionInfo3(state, retryNum = 0) { + return new Promise((resolve, reject) => { + httpGet('https://cdn.stsky.cn/lx-music/desktop/version.json', { + timeout: 20000, + }, (err, resp, body) => { + if (err) { + return ++retryNum > 3 + ? reject(err) + : this.dispatch('getVersionInfo3', retryNum).then(resolve).catch(reject) + } + resolve(body) + }) + }) + }, } diff --git a/src/renderer/store/modules/list.js b/src/renderer/store/modules/list.js index ce6ce500..fceb4056 100644 --- a/src/renderer/store/modules/list.js +++ b/src/renderer/store/modules/list.js @@ -57,6 +57,20 @@ const mutations = { if (defaultList != null) Object.assign(state.defaultList, { list: defaultList.list, location: defaultList.location }) if (loveList != null) Object.assign(state.loveList, { list: loveList.list, location: loveList.location }) if (userList != null) state.userList = userList + if (window.localStorage.getItem('isResetOtherSource') != '1') { + for (const item of defaultList.list) { + if (item.otherSource) item.otherSource = null + } + for (const item of loveList.list) { + if (item.otherSource) item.otherSource = null + } + for (const list of userList) { + for (const item of list.list) { + if (item.otherSource) item.otherSource = null + } + } + window.localStorage.setItem('isResetOtherSource', '1') + } allListInit(state.defaultList, state.loveList, state.userList) state.isInitedList = true }, @@ -142,9 +156,9 @@ const mutations = { if (!targetList) return targetList.list.splice(0, targetList.list.length) }, - updateMusicInfo(state, { id, index, data }) { + updateMusicInfo(state, { id, index, data, musicInfo = {} }) { let targetList = allList[id] - if (!targetList) return + if (!targetList) return Object.assign(musicInfo, data) Object.assign(targetList.list[index], data) }, createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId }) { diff --git a/src/renderer/store/modules/player.js b/src/renderer/store/modules/player.js index 62c12804..a6a27bfc 100644 --- a/src/renderer/store/modules/player.js +++ b/src/renderer/store/modules/player.js @@ -1,4 +1,6 @@ +import path from 'path' import music from '../../utils/music' +import { getRandom, checkPath, assertApiSupport } from '../../utils' // state const state = { @@ -10,20 +12,101 @@ const state = { changePlay: false, isShowPlayerDetail: false, playedList: [], + + playMusicInfo: null, + tempPlayList: [], } let urlRequest let picRequest let lrcRequest +const filterList = async({ playedList, listInfo, savePath, commit }) => { + // if (this.list.listName === null) return + let list + let canPlayList = [] + const filteredPlayedList = playedList.filter(({ listId, isTempPlay }) => listInfo.id === listId && !isTempPlay).map(({ musicInfo }) => musicInfo) + if (listInfo.id == 'download') { + list = [] + for (const item of listInfo.list) { + const filePath = path.join(savePath, item.fileName) + if (!await checkPath(filePath) || !item.isComplate || /\.ape$/.test(filePath)) continue + + canPlayList.push(item) + + // 排除已播放音乐 + let index = filteredPlayedList.indexOf(item) + if (index > -1) { + filteredPlayedList.splice(index, 1) + continue + } + list.push(item) + } + } else { + list = listInfo.list.filter(s => { + if (!assertApiSupport(s.source)) return false + canPlayList.push(s) + + let index = filteredPlayedList.indexOf(s) + if (index > -1) { + filteredPlayedList.splice(index, 1) + return false + } + return true + }) + } + if (!list.length && playedList.length) { + commit('clearPlayedList') + return canPlayList + } + return list +} + // getters const getters = { list: state => state.listInfo.list, - listId: state => state.listInfo.id, changePlay: satte => satte.changePlay, - playIndex: state => state.playIndex, + playInfo(state) { + if (state.playMusicInfo == null) return { listId: null, playIndex: -1, playListId: null, listPlayIndex: -1, isPlayList: false, musicInfo: null } + const playListId = state.listInfo.id + let listId = state.playMusicInfo.listId + const isTempPlay = !!state.playMusicInfo.isTempPlay + const isPlayList = listId === playListId + let playIndex = -1 + let listPlayIndex = state.playIndex + + if (listId != '__temp__') { + if (isPlayList) { + playIndex = state.listInfo.list.indexOf(state.playMusicInfo.musicInfo) + if (!isTempPlay) listPlayIndex = playIndex + } else { + let list = window.allList[listId] + if (list) playIndex = list.list.indexOf(state.playMusicInfo.musicInfo) + } + } + // console.log({ + // listId, + // playIndex, + // playListId, + // listPlayIndex, + // isPlayList, + // isTempPlay, + // musicInfo: state.playMusicInfo.musicInfo, + // }) + return { + listId, + playIndex, + playListId, + listPlayIndex, + isPlayList, + isTempPlay, + musicInfo: state.playMusicInfo.musicInfo, + } + }, isShowPlayerDetail: state => state.isShowPlayerDetail, + playMusicInfo: state => state.playMusicInfo, playedList: state => state.playedList, + tempPlayList: state => state.tempPlayList, } // actions @@ -36,12 +119,13 @@ const actions = { // return Promise.reject(new Error('该歌曲没有可播放的音频')) } if (urlRequest && urlRequest.cancelHttp) urlRequest.cancelHttp() - if (musicInfo.typeUrl[type] && !isRefresh) return Promise.resolve() + if (musicInfo.typeUrl[type] && !isRefresh) return Promise.resolve(musicInfo.typeUrl[type]) urlRequest = music[musicInfo.source].getMusicUrl(musicInfo, type) - return urlRequest.promise.then(result => { - if (originMusic) commit('setUrl', { musicInfo: originMusic, url: result.url, type }) - commit('setUrl', { musicInfo, url: result.url, type }) + return urlRequest.promise.then(({ url }) => { + if (originMusic) commit('setUrl', { musicInfo: originMusic, url, type }) + commit('setUrl', { musicInfo, url, type }) urlRequest = null + return url }).catch(err => { urlRequest = null return Promise.reject(err) @@ -78,6 +162,122 @@ const actions = { return Promise.reject(err) }) }, + + async playPrev({ state, rootState, commit, getters }) { + const currentListId = state.listInfo.id + const currentList = state.listInfo.list + if (state.playedList.length) { + // 从已播放列表移除播放列表已删除的歌曲 + let index + for (index = state.playedList.indexOf(state.playMusicInfo) - 1; index > -1; index--) { + const playMusicInfo = state.playedList[index] + if (playMusicInfo.listId == currentListId && !currentList.includes(playMusicInfo.musicInfo)) { + commit('removePlayedList', index) + continue + } + break + } + + if (index > -1) { + commit('setPlayMusicInfo', state.playedList[index]) + return + } + } + + let filteredList = await filterList({ + listInfo: state.listInfo, + playedList: state.playedList, + savePath: rootState.setting.download.savePath, + commit, + }) + if (!filteredList.length) return commit('setPlayMusicInfo', null) + const playInfo = getters.playInfo + let currentIndex = filteredList.indexOf(currentList[playInfo.listPlayIndex]) + if (currentIndex == -1) currentIndex = 0 + let nextIndex = currentIndex + if (!playInfo.isTempPlay) { + switch (rootState.setting.player.togglePlayMethod) { + case 'random': + nextIndex = getRandom(0, filteredList.length) + break + case 'listLoop': + case 'list': + nextIndex = currentIndex === 0 ? filteredList.length - 1 : currentIndex - 1 + break + case 'singleLoop': + break + default: + nextIndex = -1 + return + } + if (nextIndex < 0) return + } + + commit('setPlayMusicInfo', { + musicInfo: filteredList[nextIndex], + listId: currentListId, + }) + }, + async playNext({ state, rootState, commit, getters }) { + if (state.tempPlayList.length) { + const playMusicInfo = state.tempPlayList[0] + commit('removeTempPlayList', 0) + commit('setPlayMusicInfo', playMusicInfo) + return + } + const currentListId = state.listInfo.id + const currentList = state.listInfo.list + if (state.playedList.length) { + // 从已播放列表移除播放列表已删除的歌曲 + let index + for (index = state.playedList.indexOf(state.playMusicInfo) + 1; index < state.playedList.length; index++) { + const playMusicInfo = state.playedList[index] + if (playMusicInfo.listId == currentListId && !currentList.includes(playMusicInfo.musicInfo)) { + commit('removePlayedList', index) + continue + } + break + } + + if (index < state.playedList.length) { + commit('setPlayMusicInfo', state.playedList[index]) + return + } + } + let filteredList = await filterList({ + listInfo: state.listInfo, + playedList: state.playedList, + savePath: rootState.setting.download.savePath, + commit, + }) + + if (!filteredList.length) return commit('setPlayMusicInfo', null) + const playInfo = getters.playInfo + const currentIndex = filteredList.indexOf(currentList[playInfo.listPlayIndex]) + let nextIndex = currentIndex + switch (rootState.setting.player.togglePlayMethod) { + case 'listLoop': + nextIndex = currentIndex === filteredList.length - 1 ? 0 : currentIndex + 1 + break + case 'random': + nextIndex = getRandom(0, filteredList.length) + break + case 'list': + nextIndex = currentIndex === filteredList.length - 1 ? -1 : currentIndex + 1 + break + case 'singleLoop': + break + default: + nextIndex = -1 + return + } + if (nextIndex < 0) return + + commit('setPlayMusicInfo', { + musicInfo: filteredList[nextIndex], + listId: currentListId, + }) + }, } @@ -94,23 +294,28 @@ const mutations = { datas.musicInfo.tlrc = datas.tlyric }, setList(state, { list, index }) { + state.playMusicInfo = { + musicInfo: list.list[index], + listId: list.id, + } state.listInfo = list state.playIndex = index state.changePlay = true + // console.log(state.playMusicInfo) if (state.playedList.length) this.commit('player/clearPlayedList') + if (state.tempPlayList.length) this.commit('player/clearTempPlayeList') }, setPlayIndex(state, index) { state.playIndex = index - state.changePlay = true - // console.log(state.changePlay) }, - fixPlayIndex(state, index) { - state.playIndex = index + setChangePlay(state) { + state.changePlay = true }, resetChangePlay(state) { state.changePlay = false }, setPlayedList(state, item) { + // console.log(item) if (state.playedList.includes(item)) return state.playedList.push(item) }, @@ -118,11 +323,35 @@ const mutations = { state.playedList.splice(index, 1) }, clearPlayedList(state) { - state.playedList = [] + state.playedList.splice(0, state.playedList.length) }, visiblePlayerDetail(state, visible) { state.isShowPlayerDetail = visible }, + setTempPlayList(state, list) { + state.tempPlayList.push(...list.map(({ musicInfo, listId }) => ({ musicInfo, listId, isTempPlay: true }))) + if (!state.playMusicInfo) this.commit('player/playNext') + }, + removeTempPlayList(state, index) { + state.tempPlayList.splice(index, 1) + }, + clearTempPlayeList(state) { + state.tempPlayList.splice(0, state.tempPlayList.length) + }, + + setPlayMusicInfo(state, playMusicInfo) { + let playIndex = state.playIndex + if (playMusicInfo == null) { + playIndex = -1 + } else { + let listId = playMusicInfo.listId + if (listId != '__temp__' && listId === state.listInfo.id) playIndex = state.listInfo.list.indexOf(state.playMusicInfo.musicInfo) + } + + state.playMusicInfo = playMusicInfo + state.playIndex = playIndex + state.changePlay = true + }, } export default { diff --git a/src/renderer/store/modules/search.js b/src/renderer/store/modules/search.js index ff3a3e2b..1daa10a8 100644 --- a/src/renderer/store/modules/search.js +++ b/src/renderer/store/modules/search.js @@ -127,7 +127,7 @@ const actions = { } })) } - Promise.all(task).then(results => commit('setLists', { results, page })) + return Promise.all(task).then(results => commit('setLists', { results, page })) } else { return music[rootState.setting.search.searchSource].musicSearch.search(text, page, limit).catch(error => { console.log(error) diff --git a/src/renderer/utils/index.js b/src/renderer/utils/index.js index 51fd5b3a..1e642b57 100644 --- a/src/renderer/utils/index.js +++ b/src/renderer/utils/index.js @@ -232,6 +232,7 @@ export const objectDeepMerge = (target, source, mergedObj) => { * @param {*} url */ export const openUrl = url => { + if (!/^https?:\/\//.test(url)) return shell.openExternal(url) } diff --git a/src/renderer/utils/music/index.js b/src/renderer/utils/music/index.js index 9653e637..81caef4c 100644 --- a/src/renderer/utils/music/index.js +++ b/src/renderer/utils/music/index.js @@ -59,25 +59,42 @@ export default { async findMusic(musicInfo) { const tasks = [] + const sortSingle = singer => singer.includes('、') ? singer.split('、').sort((a, b) => a.charCodeAt(0) - b.charCodeAt(0)).join('、') : singer + const sortMusic = (arr, callback) => { + const tempResult = [] + for (let i = arr.length - 1; i > -1; i--) { + const item = arr[i] + if (callback(item)) { + delete item.sortedSinger + tempResult.push(item) + arr.splice(i, 1) + } + } + tempResult.reverse() + return tempResult + } + const trimStr = str => typeof str == 'string' ? str.trim() : str + const sortedSinger = sortSingle(musicInfo.singer) + const musicName = trimStr(musicInfo.name) for (const source of sources.sources) { if (!sources[source.id].musicSearch || source.id === musicInfo.source || source.id === 'xm') continue - const sortedSinger = musicInfo.singer.includes('、') ? musicInfo.singer.split('、').sort((a, b) => a.charCodeAt(0) - b.charCodeAt(0)).join('、') : null - tasks.push(sources[source.id].musicSearch.search(`${musicInfo.name} ${musicInfo.singer || ''}`.trim(), 1, { limit: 10 }).then(res => { + tasks.push(sources[source.id].musicSearch.search(`${musicName} ${musicInfo.singer || ''}`.trim(), 1, { limit: 10 }).then(res => { for (const item of res.list) { + item.sortedSinger = sortSingle(item.singer) + item.name = trimStr(item.name) if ( ( - item.singer === musicInfo.singer && - (item.name === musicInfo.name || item.interval === musicInfo.interval) + item.sortedSinger === sortedSinger && + (item.name === musicName || item.interval === musicInfo.interval) ) || ( - item.interval === musicInfo.interval && item.name === musicInfo.name && - (item.singer.includes(musicInfo.singer) || musicInfo.singer.includes(item.singer)) + item.interval === musicInfo.interval && item.name === musicName && + (item.sortedSinger.includes(sortedSinger) || sortedSinger.includes(item.sortedSinger)) ) || ( - sortedSinger && - item.singer.includes('、') && - item.singer.split('、').sort((a, b) => a.charCodeAt(0) - b.charCodeAt(0)).join('、') === sortedSinger + item.name === musicName && item.albumName === musicInfo.albumName && + item.interval === musicInfo.interval ) ) { return item @@ -89,35 +106,13 @@ export default { const result = (await Promise.all(tasks)).filter(s => s) const newResult = [] if (result.length) { - for (let i = result.length - 1; i > -1; i--) { - const item = result[i] - if (item.singer === musicInfo.singer && item.name === musicInfo.name && item.interval === musicInfo.interval) { - newResult.push(item) - result.splice(i, 1) - } + newResult.push(...sortMusic(result, item => item.sortedSinger === sortedSinger && item.name === musicName && item.interval === musicInfo.interval)) + newResult.push(...sortMusic(result, item => item.sortedSinger === sortedSinger && item.interval === musicInfo.interval)) + newResult.push(...sortMusic(result, item => item.name === musicName && item.sortedSinger === sortedSinger && item.albumName === musicInfo.albumName)) + newResult.push(...sortMusic(result, item => item.sortedSinger === sortedSinger && item.name === musicName)) + for (const item of result) { + delete item.sortedSinger } - for (let i = result.length - 1; i > -1; i--) { - const item = result[i] - if (item.singer === musicInfo.singer && item.interval === musicInfo.interval) { - newResult.push(item) - result.splice(i, 1) - } - } - for (let i = result.length - 1; i > -1; i--) { - const item = result[i] - if (item.name === musicInfo.name && item.singer === musicInfo.singer && item.albumName === musicInfo.albumName) { - newResult.push(item) - result.splice(i, 1) - } - } - for (let i = result.length - 1; i > -1; i--) { - const item = result[i] - if (item.singer === musicInfo.singer && item.name === musicInfo.name) { - newResult.push(item) - result.splice(i, 1) - } - } - newResult.reverse() newResult.push(...result) } // console.log(newResult) diff --git a/src/renderer/utils/music/xm/hotSearch.js b/src/renderer/utils/music/xm/hotSearch.js index 3dbd67c0..247fdd5c 100644 --- a/src/renderer/utils/music/xm/hotSearch.js +++ b/src/renderer/utils/music/xm/hotSearch.js @@ -1,17 +1,18 @@ -import { xmRequest } from './util' +// import { xmRequest } from './util' export default { _requestObj: null, async getList(retryNum = 0) { - if (this._requestObj) this._requestObj.cancelHttp() - if (retryNum > 2) return Promise.reject(new Error('try max num')) + // if (this._requestObj) this._requestObj.cancelHttp() + // if (retryNum > 2) return Promise.reject(new Error('try max num')) - const _requestObj = xmRequest('/api/search/getHotSearchWords') - const { body, statusCode } = await _requestObj.promise - // console.log(body) - if (statusCode != 200 || body.code !== 'SUCCESS') return this.getList(++retryNum) + // const _requestObj = xmRequest('/api/search/getHotSearchWords') + // const { body, statusCode } = await _requestObj.promise + // // console.log(body) + // if (statusCode != 200 || body.code !== 'SUCCESS') return this.getList(++retryNum) // // console.log(body, statusCode) - return { source: 'xm', list: this.filterList(body.result.data.hotWords) } + // return { source: 'xm', list: this.filterList(body.result.data.hotWords) } + return { source: 'xm', list: [] } }, filterList(rawList) { return rawList.map(item => item.word) diff --git a/src/renderer/utils/music/xm/util.js b/src/renderer/utils/music/xm/util.js index de8fa799..d8b30f08 100644 --- a/src/renderer/utils/music/xm/util.js +++ b/src/renderer/utils/music/xm/util.js @@ -96,7 +96,7 @@ export const xmRequest = (path, params = '') => { if (resp.body.code !== 'SUCCESS' && resp.body.rgv587_flag == 'sm') { window.globalObj.xm.isShowVerify = true return wait(300).then(() => { - return rendererInvoke(NAMES.mainWindow.handle_xm_verify_open, 'https:' + resp.body.url).then(x5sec => { + return rendererInvoke(NAMES.mainWindow.handle_xm_verify_open, /^https:/.test(resp.body.url) ? resp.body.url : 'https:' + resp.body.url).then(x5sec => { handleSaveToken({ cookies: { x5sec } }) // console.log(x5sec) window.globalObj.xm.isShowVerify = false diff --git a/src/renderer/views/Download.vue b/src/renderer/views/Download.vue index 77a327df..8e265de7 100644 --- a/src/renderer/views/Download.vue +++ b/src/renderer/views/Download.vue @@ -45,7 +45,7 @@ export default { return { clickTime: window.performance.now(), clickIndex: -1, - selectdData: [], + selectedData: [], isShowDownloadMultiple: false, tabId: 'all', keyEvent: { @@ -59,6 +59,7 @@ export default { play: true, start: true, pause: true, + playLater: true, file: true, search: true, remove: true, @@ -74,13 +75,13 @@ export default { computed: { ...mapGetters(['setting']), ...mapGetters('download', ['list', 'downloadStatus']), - ...mapGetters('player', ['listId', 'playIndex']), + ...mapGetters('player', ['playInfo']), isPlayList() { - return this.listId == 'download' + return this.playInfo.listId == 'download' }, playListIndex() { - if (this.listId != 'download' || !this.list.length) return - let info = this.list[this.playIndex] + if (this.playInfo.listId != 'download' || !this.list.length) return + let info = this.list[this.playInfo.playIndex] if (!info) return -1 let key = info.key return this.showList.findIndex(i => i.key == key) @@ -140,6 +141,11 @@ export default { action: 'pause', hide: !this.listMenu.itemMenuControl.pause, }, + { + name: this.$t('view.download.menu_play_later'), + action: 'playLater', + hide: !this.listMenu.itemMenuControl.playLater, + }, { name: this.$t('view.download.menu_file'), action: 'file', @@ -229,7 +235,7 @@ export default { }, handleSelectData(event, clickIndex) { if (this.keyEvent.isShiftDown) { - if (this.selectdData.length) { + if (this.selectedData.length) { let lastSelectIndex = this.lastSelectIndex this.removeAllSelect() if (lastSelectIndex != clickIndex) { @@ -240,8 +246,8 @@ export default { clickIndex = temp isNeedReverse = true } - this.selectdData = this.showList.slice(lastSelectIndex, clickIndex + 1) - if (isNeedReverse) this.selectdData.reverse() + this.selectedData = this.showList.slice(lastSelectIndex, clickIndex + 1) + if (isNeedReverse) this.selectedData.reverse() let nodes = this.$refs.dom_tbody.childNodes do { nodes[lastSelectIndex].classList.add('active') @@ -250,24 +256,24 @@ export default { } } else { event.currentTarget.classList.add('active') - this.selectdData.push(this.showList[clickIndex]) + this.selectedData.push(this.showList[clickIndex]) this.lastSelectIndex = clickIndex } } else if (this.keyEvent.isModDown) { this.lastSelectIndex = clickIndex let item = this.showList[clickIndex] - let index = this.selectdData.indexOf(item) + let index = this.selectedData.indexOf(item) if (index < 0) { - this.selectdData.push(item) + this.selectedData.push(item) event.currentTarget.classList.add('active') } else { - this.selectdData.splice(index, 1) + this.selectedData.splice(index, 1) event.currentTarget.classList.remove('active') } - } else if (this.selectdData.length) this.removeAllSelect() + } else if (this.selectedData.length) this.removeAllSelect() }, removeAllSelect() { - this.selectdData = [] + this.selectedData = [] let dom_tbody = this.$refs.dom_tbody if (!dom_tbody) return let nodes = dom_tbody.querySelectorAll('.active') @@ -306,6 +312,14 @@ export default { case 'remove': this.removeTask(item) break + case 'playLater': + if (this.selectedData.length) { + this.setTempPlayList(this.selectedData.map(s => ({ listId: 'download', musicInfo: s }))) + this.removeAllSelect() + } else { + this.setTempPlayList([{ listId: 'download', musicInfo: item }]) + } + break case 'file': this.handleOpenFolder(item.filePath) break @@ -316,7 +330,7 @@ export default { }, handleSelectAllData() { this.removeAllSelect() - this.selectdData = [...this.showList] + this.selectedData = [...this.showList] let nodes = this.$refs.dom_tbody.childNodes for (const node of nodes) { @@ -324,19 +338,19 @@ export default { } }, // async handleFlowBtnClick(action) { - // let selectdData = [...this.selectdData] + // let selectedData = [...this.selectedData] // this.removeAllSelect() // await this.$nextTick() // switch (action) { // case 'start': - // this.startTasks(selectdData) + // this.startTasks(selectedData) // break // case 'pause': - // this.pauseTasks(selectdData) + // this.pauseTasks(selectedData) // break // case 'remove': - // this.removeTasks(selectdData) + // this.removeTasks(selectedData) // break // } // }, @@ -353,7 +367,7 @@ export default { }) }, handleTabChange() { - this.selectdData = [] + this.selectedData = [] }, handleListItemRigthClick(event, index) { this.listMenu.itemMenuControl.sourceDetail = !!musicSdk[this.showList[index].musicInfo.source].getMusicDetailPageUrl @@ -368,16 +382,19 @@ export default { let item = this.showList[index] if (item.isComplate) { this.listMenu.itemMenuControl.play = + this.listMenu.itemMenuControl.playLater = this.listMenu.itemMenuControl.file = true this.listMenu.itemMenuControl.start = this.listMenu.itemMenuControl.pause = false - } else if (item.status === this.downloadStatus.ERROR || item.status === this.downloadStatus.PAUSE) { - this.listMenu.itemMenuControl.play = - this.listMenu.itemMenuControl.pause = - this.listMenu.itemMenuControl.file = false - this.listMenu.itemMenuControl.start = true + // } else if (item.status === this.downloadStatus.ERROR || item.status === this.downloadStatus.PAUSE) { + // this.listMenu.itemMenuControl.play = + // this.listMenu.itemMenuControl.playLater = + // this.listMenu.itemMenuControl.pause = + // this.listMenu.itemMenuControl.file = false + // this.listMenu.itemMenuControl.start = true } else { this.listMenu.itemMenuControl.play = + this.listMenu.itemMenuControl.playLater = this.listMenu.itemMenuControl.start = this.listMenu.itemMenuControl.file = false this.listMenu.itemMenuControl.pause = true @@ -407,10 +424,10 @@ export default { if (item) this.handlePlay(item) break case 'start': - if (this.selectdData.length) { - let selectdData = [...this.selectdData] + if (this.selectedData.length) { + let selectedData = [...this.selectedData] this.removeAllSelect() - this.startTasks(selectdData) + this.startTasks(selectedData) } else { item = this.showList[index] if (item) this.startTask(item) @@ -420,10 +437,10 @@ export default { } break case 'pause': - if (this.selectdData.length) { - let selectdData = [...this.selectdData] + if (this.selectedData.length) { + let selectedData = [...this.selectedData] this.removeAllSelect() - this.pauseTasks(selectdData) + this.pauseTasks(selectedData) } else { item = this.showList[index] if (item) this.pauseTask(item) @@ -443,10 +460,10 @@ export default { if (item) this.handleSearch(item.musicInfo) break case 'remove': - if (this.selectdData.length) { - let selectdData = [...this.selectdData] + if (this.selectedData.length) { + let selectedData = [...this.selectedData] this.removeAllSelect() - this.removeTasks(selectdData) + this.removeTasks(selectedData) } else { item = this.showList[index] if (item) this.removeTask(item) diff --git a/src/renderer/views/Leaderboard.vue b/src/renderer/views/Leaderboard.vue index 7d90705f..317b1b3c 100644 --- a/src/renderer/views/Leaderboard.vue +++ b/src/renderer/views/Leaderboard.vue @@ -77,7 +77,7 @@ export default { ...mapActions('leaderboard', ['getBoardsList', 'getList']), ...mapActions('download', ['createDownload', 'createDownloadMultiple']), ...mapMutations('list', ['listAdd', 'listAddMultiple']), - ...mapMutations('player', ['setList']), + ...mapMutations('player', ['setList', 'setTempPlayList']), handleListBtnClick(info) { switch (info.action) { case 'download': @@ -121,6 +121,14 @@ export default { } this.testPlay(info.index) break + case 'playLater': + if (this.selectedData.length) { + this.setTempPlayList(this.selectedData.map(s => ({ listId: '__temp__', musicInfo: s }))) + this.resetSelect() + } else { + this.setTempPlayList([{ listId: '__temp__', musicInfo: this.list[info.index] }]) + } + break case 'search': this.handleSearch(info.index) break diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index b875cbaf..8703fd19 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -37,7 +37,7 @@ table tbody(@contextmenu.capture="handleContextMenu" ref="dom_tbody") tr(v-for='(item, index) in list' :key='item.songmid' :id="'mid_' + item.songmid" @contextmenu="handleListItemRigthClick($event, index)" - @click="handleDoubleClick($event, index)" :class="[isPlayList && playIndex === index ? $style.active : '', assertApiSupport(item.source) ? null : $style.disabled]") + @click="handleDoubleClick($event, index)" :class="[isPlayList && playInfo.playIndex === index ? $style.active : '', assertApiSupport(item.source) ? null : $style.disabled]") td.nobreak.center(style="width: 5%; padding-left: 3px; padding-right: 3px;" :class="$style.noSelect" @click.stop) {{index + 1}} td.break span.select {{item.name}} @@ -122,6 +122,7 @@ export default { isShowItemMenu: false, itemMenuControl: { play: true, + playLater: true, copyName: true, addTo: true, moveTo: true, @@ -145,12 +146,12 @@ export default { computed: { ...mapGetters(['userInfo', 'setting']), ...mapGetters('list', ['isInitedList', 'defaultList', 'loveList', 'userList']), - ...mapGetters('player', { - playerListId: 'listId', - playIndex: 'playIndex', - }), + ...mapGetters('player', ['playInfo']), + playerListId() { + return this.playInfo.listId + }, isPlayList() { - return this.playerListId == this.listId + return this.playInfo.listId == this.listId }, list() { return this.listData.list @@ -223,6 +224,11 @@ export default { action: 'download', disabled: !this.listMenu.itemMenuControl.download, }, + { + name: this.$t('view.list.list_play_later'), + action: 'playLater', + disabled: !this.listMenu.itemMenuControl.playLater, + }, { name: this.$t('view.list.list_add_to'), action: 'addTo', @@ -355,6 +361,7 @@ export default { ...mapActions('download', ['createDownload', 'createDownloadMultiple']), ...mapMutations('player', { setPlayList: 'setList', + setTempPlayList: 'setTempPlayList', }), listenEvent() { window.eventHub.$on('key_shift_down', this.handle_key_shift_down) @@ -726,6 +733,7 @@ export default { handleListItemRigthClick(event, index) { this.listMenu.itemMenuControl.sourceDetail = !!musicSdk[this.list[index].source].getMusicDetailPageUrl this.listMenu.itemMenuControl.play = + this.listMenu.itemMenuControl.playLater = this.listMenu.itemMenuControl.download = this.assertApiSupport(this.list[index].source) let dom_selected = this.$refs.dom_tbody.querySelector('tr.selected') @@ -789,6 +797,14 @@ export default { case 'play': this.testPlay(index) break + case 'playLater': + if (this.selectdListDetailData.length) { + this.setTempPlayList(this.selectdListDetailData.map(s => ({ listId: this.listId, musicInfo: s }))) + this.removeAllSelectListDetail() + } else { + this.setTempPlayList([{ listId: this.listId, musicInfo: this.list[index] }]) + } + break case 'copyName': minfo = this.list[index] clipboardWriteText(this.setting.download.fileName.replace('歌名', minfo.name).replace('歌手', minfo.singer)) diff --git a/src/renderer/views/Search.vue b/src/renderer/views/Search.vue index f7ed67a4..9fb8f0a8 100644 --- a/src/renderer/views/Search.vue +++ b/src/renderer/views/Search.vue @@ -3,60 +3,65 @@ //- transition div(:class="$style.header") material-tab(:class="$style.tab" :list="sources" align="left" item-key="id" item-name="name" v-model="searchSourceId") - div(v-if="listInfo.list.length" :class="$style.list") - div(:class="$style.thead") - table - thead - tr - th.nobreak.center(style="width: 5%;") # - th.nobreak {{$t('view.search.name')}} - th.nobreak(style="width: 22%;") {{$t('view.search.singer')}} - th.nobreak(style="width: 22%;") {{$t('view.search.album')}} - th.nobreak(style="width: 8%;") {{$t('view.search.time')}} - th.nobreak(style="width: 13%;") {{$t('view.search.action')}} - div.scroll(:class="$style.tbody" ref="dom_scrollContent") - table - tbody(@contextmenu.capture="handleContextMenu" ref="dom_tbody") - tr(v-for='(item, index) in listInfo.list' :key='item.songmid' @contextmenu="handleListItemRigthClick($event, index)" @click="handleDoubleClick($event, index)") - td.nobreak.center(style="width: 5%; padding-left: 3px; padding-right: 3px;" :class="$style.noSelect" @click.stop) {{index + 1}} - td.break - span.select {{item.name}} - span.badge.badge-theme-success(:class="[$style.labelQuality, $style.noSelect]" v-if="item._types.ape || item._types.flac || item._types.wav") {{$t('material.song_list.lossless')}} - span.badge.badge-theme-info(:class="[$style.labelQuality, $style.noSelect]" v-else-if="item._types['320k']") {{$t('material.song_list.high_quality')}} - span(:class="[$style.labelSource, $style.noSelect]" v-if="searchSourceId == 'all'") {{item.source}} - td.break(style="width: 22%;") - span.select {{item.singer}} - td.break(style="width: 22%;") - span.select {{item.albumName}} - td(style="width: 8%;") - span(:class="[$style.time, $style.noSelect]") {{item.interval || '--/--'}} - td(style="width: 13%; padding-left: 0; padding-right: 0;") - material-list-buttons(:index="index" :remove-btn="false" :class="$style.listBtn" - :play-btn="assertApiSupport(item.source)" - :download-btn="assertApiSupport(item.source)" - @btn-click="handleListBtnClick") - div(:class="$style.pagination") - material-pagination(:max-page="listInfo.allPage" :limit="listInfo.limit" :page="page" @btn-click="handleTogglePage") - div(v-else :class="$style.noitem") - div.scroll(:class="$style.noitemListContainer" v-if="setting.search.isShowHotSearch || setting.search.isShowHistorySearch") - dl(:class="[$style.noitemList, $style.noitemHotSearchList]" v-if="setting.search.isShowHotSearch") - dt(:class="$style.noitemListTitle") {{$t('view.search.hot_search')}} - dd(:class="$style.noitemListItem" @click="handleNoitemSearch(item)" v-for="item in hotSearchList") {{item}} - dl(:class="$style.noitemList" v-if="setting.search.isShowHistorySearch && historyList.length") - dt(:class="$style.noitemListTitle") - span {{$t('view.search.history_search')}} - span(:class="$style.historyClearBtn" @click="clearHistory" :tips="$t('view.search.history_clear')") - svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 512 512' space='preserve') - use(xlink:href='#icon-eraser') - dd(:class="$style.noitemListItem" v-for="(item, index) in historyList" @contextmenu="removeHistory(index)" :key="index + item" @click="handleNoitemSearch(item)" :tips="$t('view.search.history_remove')") {{item}} - div(v-else :class="$style.noitem_list") - p {{$t('view.search.no_item')}} + div(:class="$style.main") + div(:class="$style.list" v-show="isLoading || listInfo.list.length") + div(:class="$style.thead") + table + thead + tr + th.nobreak.center(style="width: 5%;") # + th.nobreak {{$t('view.search.name')}} + th.nobreak(style="width: 22%;") {{$t('view.search.singer')}} + th.nobreak(style="width: 22%;") {{$t('view.search.album')}} + th.nobreak(style="width: 8%;") {{$t('view.search.time')}} + th.nobreak(style="width: 13%;") {{$t('view.search.action')}} + div.scroll(:class="$style.tbody" ref="dom_scrollContent") + table + tbody(@contextmenu.capture="handleContextMenu" ref="dom_tbody") + tr(v-for='(item, index) in listInfo.list' :key='item.songmid' @contextmenu="handleListItemRigthClick($event, index)" @click="handleDoubleClick($event, index)") + td.nobreak.center(style="width: 5%; padding-left: 3px; padding-right: 3px;" :class="$style.noSelect" @click.stop) {{index + 1}} + td.break + span.select {{item.name}} + span.badge.badge-theme-success(:class="[$style.labelQuality, $style.noSelect]" v-if="item._types.ape || item._types.flac || item._types.wav") {{$t('material.song_list.lossless')}} + span.badge.badge-theme-info(:class="[$style.labelQuality, $style.noSelect]" v-else-if="item._types['320k']") {{$t('material.song_list.high_quality')}} + span(:class="[$style.labelSource, $style.noSelect]" v-if="searchSourceId == 'all'") {{item.source}} + td.break(style="width: 22%;") + span.select {{item.singer}} + td.break(style="width: 22%;") + span.select {{item.albumName}} + td(style="width: 8%;") + span(:class="[$style.time, $style.noSelect]") {{item.interval || '--/--'}} + td(style="width: 13%; padding-left: 0; padding-right: 0;") + material-list-buttons(:index="index" :remove-btn="false" :class="$style.listBtn" + :play-btn="assertApiSupport(item.source)" + :download-btn="assertApiSupport(item.source)" + @btn-click="handleListBtnClick") + div(:class="$style.pagination") + material-pagination(:max-page="listInfo.allPage" :limit="listInfo.limit" :page="page" @btn-click="handleTogglePage") + transition(enter-active-class="animated-fast fadeIn" leave-active-class="animated fadeOut") + div(v-show="isLoading" :class="$style.loading") + p {{$t('view.search.loding_list')}} + transition(enter-active-class="animated-fast fadeIn" leave-active-class="animated-fast fadeOut") + div(v-show="!isLoading && !listInfo.list.length" :class="$style.noitem") + div.scroll(:class="$style.noitemListContainer" v-if="setting.search.isShowHotSearch || setting.search.isShowHistorySearch") + dl(:class="[$style.noitemList, $style.noitemHotSearchList]" v-if="setting.search.isShowHotSearch") + dt(:class="$style.noitemListTitle") {{$t('view.search.hot_search')}} + dd(:class="$style.noitemListItem" @click="handleNoitemSearch(item)" v-for="item in hotSearchList") {{item}} + dl(:class="$style.noitemList" v-if="setting.search.isShowHistorySearch && historyList.length") + dt(:class="$style.noitemListTitle") + span {{$t('view.search.history_search')}} + span(:class="$style.historyClearBtn" @click="clearHistory" :tips="$t('view.search.history_clear')") + svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 512 512' space='preserve') + use(xlink:href='#icon-eraser') + dd(:class="$style.noitemListItem" v-for="(item, index) in historyList" @contextmenu="removeHistory(index)" :key="index + item" @click="handleNoitemSearch(item)" :tips="$t('view.search.history_remove')") {{item}} + div(v-else :class="$style.noitem_list") + p {{$t('view.search.no_item')}} + material-menu(:menus="listItemMenu" :location="listMenu.menuLocation" item-name="name" :isShow="listMenu.isShowItemMenu" @menu-click="handleListItemMenuClick") material-download-modal(:show="isShowDownload" :musicInfo="musicInfo" @select="handleAddDownload" @close="isShowDownload = false") material-download-multiple-modal(:show="isShowDownloadMultiple" :list="selectedData" @select="handleAddDownloadMultiple" @close="isShowDownloadMultiple = false") //- material-flow-btn(:show="isShowEditBtn && (searchSourceId == 'all' || assertApiSupport(searchSourceId))" :remove-btn="false" @btn-click="handleFlowBtnClick") material-list-add-modal(:show="isShowListAdd" :musicInfo="musicInfo" @close="handleListAddModalClose") material-list-add-multiple-modal(:show="isShowListAddMultiple" :musicList="selectedData" @close="handleListAddMultipleModalClose") - material-menu(:menus="listItemMenu" :location="listMenu.menuLocation" item-name="name" :isShow="listMenu.isShowItemMenu" @menu-click="handleListItemMenuClick")