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- 修复某些情况下自动换源的时间过长时会终止换源自动切歌的问题
\n- 修复自动换源导致的搜索列表每页变成10条数据的问题
\n- 降级electron到9.3.3修复部分系统没有声音的问题
\n
\n","history":[{"version":"1.6.0","desc":"新增
\n\n- 我的列表右键菜单新增列表排序功能,可调整单曲、多选后的歌曲的顺序。注意:多选排序还将会按照选中歌曲时的顺序排序
\n- 添加鼠标提示的自动关闭功能,鼠标长时间(目前是10秒)不动时鼠标提示将会自动关闭
\n- 添加鼠标指向歌曲封面的提示(对于进度条左边的歌曲封面,你可能不知道的操作->右击在“我的列表”定位当前播放的歌曲)
\n- 隐藏播放详情页按钮添加快速隐藏详情页提示(你可能不知道的操作->在播放详情页内的任意非窗口可拖动区域右键双击可以快速隐藏详情页)
\n- 添加桌面歌词字体、透明度调整按钮微调提示(你可能不知道的操作->对于字体、透明度可右击微调)
\n- 我的列表右键菜单添加搜索当前歌曲功能
\n- 新增
-dha参数,添加此启动参数将禁用硬件加速启动(Disable Hardware Acceleration),窗口显示有问题时可以尝试添加此参数启动,Linux系统的界面显示有问题时可尝试添加此参数启动,若不行可尝试添加-dt参数启动 \n- 新增播放自动换源功能~
\n
\n变更
\n\n-nt参数更名为-dt(Disable Transparent),目前原来的-nt参数仍然可用,但将在后续的版本中移除 \n
\n修复
\n\n- 修复恢复上次播放的歌曲时在随机播放模式下不把恢复播放的歌曲放入已播放队列的问题(该问题会导致随机模式下会导致未播放完整个列表前就会再次随机到该歌曲,以及无法通过上一曲切回该歌曲)
\n- 修复音乐嵌入的封面在 Mac 系统无法显示的问题
\n- 修复
-dt(原来的-nt)启动参数不真正生效的问题 \n
\n"},{"version":"1.5.0","desc":"新增
\n\n- 直接从歌单详情收藏的列表新增同步功能。注意:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表
\n
\n优化
\n\n- 优化软件启动时恢复上一次播放的歌曲进度功能
\n
\n修复
\n\n- 修复MAC平台上下载歌曲封面嵌入无法显示的问题
\n- 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题
\n- 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题
\n- 修复某些酷狗源歌单链接无法打开的问题
\n
\n"},{"version":"1.4.1","desc":"修复
\n\n- 修复有歌词翻译与无歌词的音乐间切换会导致歌词翻译残留显示的问题
\n- 修复歌曲URL过期时,等待刷新URL的自动切换歌曲时间间隔太短的问题
\n- 修复某些电脑上的某些歌曲没有声音的问题(升级Electron9.3.4导致的,现降级到9.3.3)
\n
\n"},{"version":"1.4.0","desc":"新增
\n\n- 托盘菜单新增显示、隐藏主界面选项,为Linux、MAC版添加托盘菜单
\n- 新增播放进度信息保存
\n
\n优化
\n\n修复
\n\n- 修复专辑图片无法嵌入的问题
\n- 修复播放状态栏切换“上一首”歌曲按钮提示错误的问题
\n- 修复移动单首歌曲时,如果目标列表存在该歌曲,会导致将源列表与目标列表里的目标歌曲移除
\n- 修复kg源歌曲信息带有单引号等特殊字符被转义的问题
\n
\n"},{"version":"1.3.0","desc":"新增
\n\n- 播放详情页新增歌曲评论加载显示(某些平台暂不支持显示子评论)
\n
\n优化
\n\n修复
\n\n- 修复小芸源音乐搜索结果最多只有20条搜索结果的问题
\n
\n"},{"version":"1.2.2","desc":"修复
\n\n- 降级 Electron 到 9.x.x 版本修复 Linux 版桌面歌词窗口变白的问题
\n
\n"},{"version":"1.2.1","desc":"优化
\n\n- Linux版的软件界面默认使用圆角与阴影,顺便修复了桌面歌词窗口变白的问题,已在Ubuntu 18.10测试正常,若显示异常可尝试添加
-nt参数启动 \n
\n修复
\n\n- 修复聚合搜索的分页问题
\n- 修复代理输入框输入的内容不生效的问题
\n
\n"},{"version":"1.2.0","desc":"提前祝大家中秋&国庆快乐~
\n新增
\n\n- 播放控制栏开启/关闭桌面歌词按钮 新增右击按钮时锁定/解锁桌面歌词功能
\n
\n优化
\n\n- 优化我的列表滚动条位置的保存逻辑
\n- 更新设置-备份与恢复功能的描述
\n- 优化软件内鼠标悬停的提示界面
\n
\n修复
\n\n- 修复桌面歌词窗口不允许拖出桌面之外的位置计算偏移Bug
\n- 修复网易云KTV嗨榜无法加载的问题
\n- 修复初始化搜索历史列表功能
\n- 修复重启软件后试听列表与收藏列表无法恢复上次的滚动位置的问题
\n- 修复歌曲封面无法嵌入的Bug
\n- 修复酷狗歌词格式问题
\n- 修复关闭切换动画时从搜索候选列表点击内容无效的问题
\n
\n其他
\n\n- 更新 Electron 到 v10.1.3
\n
\n"},{"version":"1.1.1","desc":"修复
\n\n"},{"version":"1.1.0","desc":"新增
\n\n- 在歌单详情界面新增播放当前歌单按钮、收藏歌单按钮,注:播放歌单不会将歌曲添加到试听列表
\n- 新增
不允许将歌词窗口拖出主屏幕之外的设置项,默认开启,在连接多个屏幕时想要拖动到其他屏幕时可关闭此设置 \n- 新增大部分平台的歌词翻译,感谢 @InoriHimea 提供的krc解码算法
\n- 新增
显示歌词翻译设置,默认开启,仅支持某些平台,注:无论该设置是否开启,嵌入或下载歌词时都不会带上翻译 \n- 新增
显示切换动画设置,默认开启,关闭时将基本禁用软件内的所有切换动画 \n- 播放状态栏新增桌面歌词的开关、播放模式的切换、歌曲的收藏按钮,Thanks to @andylow for the icon!
\n
\n修复
\n\n- 修复使用全局快捷键还原窗口时,窗口没有获取焦点的问题
\n- 修复我的列表搜索对最后一个字符的匹配问题
\n- 修复窗口在
较小模式下最小化/关闭按钮不居中的问题 \n
\n优化
\n\n- 桌面歌词当前播放行改为上下居中
\n- 为区分静音状态,静音时音量条会变淡,调整音量条时将会取消静音
\n- 优化随机播放机制,现在通过
下一曲切换歌曲时,直到播放完整个列表之前将不会再随机到之前播放过的歌曲,并且通过上一曲可以正确播放上一首歌曲 \n- 当下载目录没有写入权限时将显示没有写入权限的提示
\n
\n移除
\n\n- 移除默认的全局声音媒体快捷键接管
\n- 移除对百度音乐的支持,因百度音乐原有的大部分API失效,而且该平台相对其他平台来说音乐太少了,可有可无,以后再看情况恢复
\n
\n其他
\n\n"},{"version":"1.0.1","desc":"优化
\n\n修复
\n\n- 修复在 Windows 系统下缩放比非100%时,拖动桌面歌词会自动加大桌面歌词窗口的问题
\n
\n"},{"version":"1.0.0","desc":"新增
\n\n- 新增
rpm、pacman包的构建(未测试可用性) \n- 新增因系统音频设备列表改变导致的当前音频输出设备改变时是否暂停播放的设置,默认关闭
\n- 新增歌曲列表右击菜单
\n- 新增自定义列表,创建列表的按钮在表头
#左侧,鼠标移上去才会显示;编辑列表名字时,按ESC键可快速取消编辑,按回车键或使输入框失去焦点即可保存列表名字,右击列表可编辑已创建的列表,“试听列表”与“我的收藏”两个列表固定不可编辑 \n- 改变排行榜布局,新增更多排行榜
\n- 新增我的列表右键菜单复制歌曲名选项
\n- 新增桌面歌词,默认关闭,可到设置或者托盘菜单开启(建议使用全局快捷键控制);调整字体大小、透明度时,鼠标左击按钮正常调整,右击微调;Windows 7未开启Aero效果时桌面歌词会有问题,详情看常见问题解决;Linux版桌面歌词有问题,以后再尝试优化;
\n- 新增“清热板蓝”皮肤
\n- 新增软件最小化、关闭按钮位置设置,MAC版默认为左边,非MAC为右边,不想用默认的可到设置修改
\n- 新增快捷键设置,软件内快捷键默认开启,全局快捷键默认关闭(注:若想开启蓝牙耳机切歌需开启全局快捷键,当快捷键被中划线划掉时,表示当前快捷键被其他程序占用导致注册失败)
\n- 新增首次运行时自动根据当前系统使用的语言设置软件显示的语言
\n- 新增歌词区域的触摸板、鼠标滚轮等对歌词滚动的支持
\n- 为了方便支持正版资源,歌曲列表右击菜单新增跳转到当前歌曲源官方详情页菜单(注意:在本版本之前添加的虾米源歌曲无法跳转详情页,需要移除后重新搜索添加)
\n- 新增我的列表内歌曲搜索,在我的列表按
ctrl+f将显示搜索框;鼠标滑过或键盘上下方向键选择搜索结果;鼠标点击或按回车键定位选中的歌曲;按ctrl键的情况下鼠标点击或按回车键确认定位歌曲时,将会在定位歌曲结束后播放该歌曲(搜索框激活的情况下按esc可快速清空搜索框/关闭搜索框) \n- 新增托盘图标样式设置,可到设置-其他切换
\n- 新增开关下载功能控制,默认关闭,可到设置-下载设置开启
\n- 新增将歌词嵌入音频文件中,默认关闭,可到设置-下载设置开启
\n- 新增当列表文件损坏时对损坏文件的备份,若出现该情况可打开
%HOMEPATH%\\AppData\\Roaming\\lx-music-desktop找到playList.json.bak尝试手动修复列表文件,列表文件以JSON格式存储 \n- 新增在歌单详情列表按退格(Backspace)键可快速返回歌单列表
\n
\n优化
\n\n- 改进歌曲切换时的歌词滚动效果
\n- 优化批量添加、删除播放列表的歌曲操作逻辑,大幅提升批量添加、删除列表歌曲的流畅度
\n- 改进歌单列表展示
\n- 改进聚合搜索的搜索结果排序,修复当某些源搜索失败时导致其他源无法显示结果的问题,现在聚合搜索已达到最初的理想效果,为了使排序更精确,建议同时输入 歌曲名 歌手名 搜索(歌曲名在前歌手名在后),欢迎体验~!
\n- 压缩备份数据文件大小
\n
\n修复
\n\n- 修复按住
Ctrl等键触发多选机制时不松开按键的情况下切换到其他窗口后再松开按键,这时切回软件不按按键都处在多选模式的问题 \n- 修复Linux版开启托盘无法退出的问题
\n- 修复某些情况下可能导致的音源输出问题
\n- 修复某些情况下无法开始下载任务的问题
\n- 修复 tab 组件边框溢出问题
\n- 修复错误更新试听列表外的歌曲时间的问题
\n- 修复网易音乐源歌单、排行榜歌曲列表加载显示的数量与实际不对的问题,同时支持加载大于1000首歌的歌单(歌曲大于1000首会分页),注意:目前软件一下子显示太多歌曲时会卡顿,不建议在同一列表内添加太多歌曲
\n- 修复歌曲图片链接没有扩展名的情况下无法嵌入图片的问题
\n- 修复无法检测最新版本时弹窗提示的显示
\n- 修复某些情况下从托盘还原窗口后无法操作的问题
\n- 修复Linux下无法
ctrl+a全选的问题 \n- 修复主题背景图片覆盖不全的问题
\n- 修复聚合搜索音源标签的皮肤配色问题
\n
\n更变
\n\n- 修改设置-列表-是否显示歌曲源的默认设置为选中(该变更不影响之前的设置)
\n- 移除浮动按钮,现在在多选完成后可鼠标右击随意一项在弹出的右键菜单中进行原来悬浮按钮的操作
\n- 为了避免出现误会,现在下载弹窗中不可用的音质将直接隐藏
\n- 更改初始设置的搜索设置为聚合搜索(该变更不影响之前的设置)
\n
\n其他
\n\n"},{"version":"0.18.2","desc":"修复
\n\n- 修复开启托盘时,可能导致无法自动更新的问题
\n
\n"},{"version":"0.18.1","desc":"优化
\n\n- win下的托盘图标使用更大的图片
\n- 加长软件协议的强制停留时间
\n
\n修复
\n\n"},{"version":"0.18.0","desc":"新增
\n\n- 新增FLAC格式音乐标签信息写入与封面嵌入(因128k以外的音质已失效,目前该功能用不上了)
\n- 添加软件启动时是否自动聚焦搜索框的设置
\n- 新增托盘设置,默认关闭,可到设置开启,感谢 @LasyIsLazy 提交的PR
\n- 新增打开酷狗源用户歌单
\n- 新增使用协议
\n- 新增虾米音源
\n- 新增新皮肤“粉妆玉琢”、“青出于黑”,可去体验下~
\n- 新增“超大”、“巨大”窗口尺寸
\n- 新增播放详情页(退出详情页可点击右上角退出按钮或者在播放详情页任意地方鼠标快速右击两次)
\n
\n优化
\n\n- 略微加深音量条底色
\n- 优化其他界面细节
\n- 优化英语翻译,感谢 @CPCer
\n- 优化程序的流畅度
\n
\n更变
\n\n- 下载列表的歌曲下载、播放将随设置中的保存路径改变而改变,不再固定指向其初始位置
\n- 移除列表多选框,现在多选需要键盘配合,想要多选前需按下
Shift或Ctrl键然后再鼠标点击想要选中的内容即可触发多选机制,其中Shift键用于连续选择,Ctrl键用于不连续选择,Ctrl+a用于快速全选。例子一:想要选中1-5项,则先按下Shift键后,鼠标点击第一项,再点击第五项即可完成选择;例子二:想要选中1项与第3项,则先按下Ctrl键后,鼠标点击第一项,再点击第三项即可完成选择;例子三:想要选中当前列表的全部内容,键盘先按下Ctrl键不放,然后按a键,即可完成选择。用Shift或Ctrl选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按Shift或Alt键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S:Ctrl键对应Mac OS上的Command键) \n- 现在进度条的封面图左击改为打开播放详情页,在列表定位歌曲改为右击
\n
\n修复
\n\n- 修复网易源某些歌曲提示没有可播放的音质的问题
\n- 修复下载管理刷新URL失败时不标记任务下载失败的问题
\n- 修复列表导出的文字描述,感谢 @CPCer
\n- 修复歌曲切换方式无法取消勾选的问题
\n- 修复打开歌单详情的情况下切到其他界面再切回来报错的问题
\n- 修正播放列表浮动按钮错误的文字提示
\n
\n移除
\n\n- 因128k以外的音质失效,So 禁止所有128k外的音质下载
\n
\n其他
\n更新 Electron 到 8.2.5
\n"},{"version":"0.17.0","desc":"新增
\n\n- 新增多语言设置,目前软件内置了简体中文、繁体中文、英语三种语言,欢迎提交PR翻译更多语言!
\n- 新增无法打开外部歌单FAQ
\n- 新增启动参数
search,使用例子:.\\lx-music-desktop.exe -search="突然的自我 - 伍佰" \n- 新增音频输出设置
\n- 新增软件内的包括字体在内的界面内容大小调整,现在当窗口大小切换到“较小/大/较大”时,软件内的元素将会适当减小或加大,窗口大小的“小”与“中”内的元素将保持之前的大小暂不做改变
\n- 新增音源别名,默认将显示别名,想要显示回原名可到设置切换(免责声明:别名仅是本软件用于描述各音源的标签,其名字归版权方所有)
\n- 新增发现新版本更新失败弹窗的忽略提醒按钮,忽略提醒后,以后同一个版本再失败时将不会弹窗提醒,但仍可到设置-版本更新手动点开更新弹窗查看或恢复提醒
\n- 新增热搜词,默认关闭,可到设置开启
\n- 新增历史搜索记录,默认关闭,可到设置开启(右击单个历史记录标签可移除所点击的记录)
\n
\n优化
\n\n- 优化月里嫦娥皮肤侧栏鼠标悬浮颜色
\n- 优化播放进度条的动画效果
\n- 现在添加下载任务时,后面添加的任务会在列表顶部插入
\n- 优化歌单打开机制,现在歌单加载失败时会提示加载失败了,并且支持直接打开企鹅、酷我手机分享出来的歌单了
\n- 优化右上角最小化/关闭按钮布局
\n
\n修复
\n\n- 修复歌单详情处于加载状态时无法返回的问题
\n- 修复鼠标右击复制列表内容时会复制音质标签的问题
\n- 修复
0.6.2及以前的版本导出的“所有数据”内的歌曲列表无法导入的问题 \n- 修复下载列表在某些情况下无法取消全选的问题
\n
\n其他
\n\n"},{"version":"0.16.0","desc":"新增
\n\n- 允许选中列表内歌曲名、歌手名、专辑名内的文字,选中后可使用键盘快捷键进行复制
\n- 新增在列表可选内容区域鼠标右击时自动复制列表已选文字的功能
\n- 新增在搜索框鼠标右击时自动粘贴剪贴板的文本到搜索框中
\n- 任务下载失败时将显示搜索按钮,方便在其他源搜索该歌曲
\n
\n优化
\n\n- 优化木叶之村主题翻页器背景颜色
\n- 优化各个主题音质标签颜色
\n- 优化其他一些界面细节及用户交互效果
\n
\n修复
\n\n- 修复启用透明窗口鼠标不穿透的bug
\n- 修复大窗口时设置的音乐来源选项不换行的问题
\n- 修复某些情况下暂停任务会自动开始任务的问题
\n- 修复移除暂停、错误的任务时不删除未下载完成的文件的问题
\n- 修复酷狗源歌单热门标签歌单列表无法加载问题
\n- 修复QQ源歌单热门标签歌单列表无法加载问题
\n
\n其他
\n\n"},{"version":"0.15.0","desc":"洛雪提前祝大家新年快乐、身体健康、阖家幸福!
\n修复
\n\n- 修复歌曲下载列表无法加载的问题
\n- 修复歌曲下载任务数大于最大下载任务数的问题
\n- 修复某些情况下歌曲下载错误的问题
\n- 修复下载列表数据没有被迁移直接被丢弃的问题
\n
\n"},{"version":"0.14.1","desc":"洛雪提前祝大家新年快乐、身体健康、阖家幸福!
\n修复
\n\n- 修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题
\n
\n"},{"version":"0.14.0","desc":"洛雪提前祝大家新年快乐、身体健康、阖家幸福!
\n新增
\n\n- 新增各大平台歌单热门标签显示(显示在歌单界面的第一个下拉标签菜单中)
\n- 恢复QQ音乐源128k音质试听
\n- 新增不强制win7开启透明效果即可使用,但要配置运行参数
-nt,例如:.\\lx-music-desktop.exe -nt,添加方法可自行百度“给快捷方式加参数” \n- 新增“新年快乐”主题,可自行切换体验
\n
\n优化
\n\n- 减淡各个主题的歌曲列表分隔线颜色
\n- 在线音乐列表音质标签优化,当歌曲有无损音质时隐藏高品质标签
\n- 更新改进的歌词播放插件,现在歌词的播放显示将更准确
\n
\n修复
\n\n- 修复咪咕源无法搜索的问题
\n- 修复更新弹窗底部文字颜色没有适配当前主题颜色的问题
\n- 修复导入设置窗口大小、代理设置不立即生效的问题
\n- 修复在线音乐列表获取失败时无限循环请求的问题
\n
\n其他
\n\n- 将软件设置与播放列表分离存储成两个文件
\n- 更新 Electron 到 7.1.9
\n
\n"},{"version":"0.13.1","desc":"修复
\n\n其他
\n\n- 由于electron 7.1.3 - 7.1.5 的自动更新功能存在Bug,现降级到7.1.2
\n
\n"},{"version":"0.13.0","desc":"新增
\n\n- 新增搜索框搜索建议键盘上下方向键选择功能
\n- 聚合搜索新增音源显示
\n- 新增“离开搜索界面时清空搜索列表”设置选项,默认关闭,可到设置-强迫症设置开启
\n
\n优化
\n\n修复
\n\n- 修复存在弹出层时,搜索建议列表被弹出层覆盖的问题
\n- 修复搜索、排行榜、歌单列表多选框从不定状态到选中的Bug
\n
\n移除
\n\n其他
\n\n- 更新electron到7.1.5
\n- 更新vue到2.6.11
\n
\n"},{"version":"0.12.1","desc":"优化
\n\n- 优化定位歌曲时的列表滚动机制
\n- 优化链接点击效果
\n
\n修复
\n\n- 修复使用酷我源下载歌曲时,当歌曲无封面时下载报错的问题
\n- 修复酷我源排行榜、歌单详情列表里的歌曲音质匹配问题(原来无论歌曲有无高品、无损都会显示有)
\n- 禁止外部链接在软件内打开,将所有外部链接从默认浏览器打开
\n
\n其他
\n\n"},{"version":"0.12.0","desc":"由于新下载库仍然没有完成,但下载功能已经可用,so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!
\n新增
\n\n- 新增下载功能对代理设置的支持,现在若在软件设置了代理服务器,下载功能也将会走代理网络了
\n
\n优化
\n\n- 新下载模块将对恢复下载的任务进行字节校验,用于解决下载进度超过100%后仍然下载的问题
\n- 注意:目前仍然无法暂停处于链接获取状态中的任务
\n
\n修复
\n\n- 修复Linux deb版本
.desktop桌面文件缺少图标的问题,新增中文名称显示、软件分类,感谢@lowy的反馈! \n- 修复下载列表歌曲状态分类列表操作Bug
\n- 修复歌曲封面下载失败时仍然执行嵌入封面操作导致报错的问题
\n- 跳过重复添加相同歌曲名与扩展名的歌曲,例如你之前下载了A歌曲的128k音质,现在想要下载它的320k音质,但由于两者都是MP3格式,会因为重名导致之前的128k音质被覆盖但列表中仍然显示两种音质的问题(但实际上都是指向后面的320k音质)
\n
\n"},{"version":"0.11.0","desc":"新增
\n\n- 新增歌曲缓冲定时器,尝试用于解决网络正常但是歌曲缓冲过久的问题
\n- 新增下载管理的任务状态分类
\n- 添加杀毒软件提示有病毒或恶意行为的说明,可到常见问题拉到最后查看(常见问题可在开源地址找到)
\n
\n优化
\n\n- 优化更新弹窗机制及其内容描述,对于可以自动更新的版本,现在可以看到软件的下载进度了
\n
\n"},{"version":"0.10.0","desc":"优化
\n\n- 大幅减少程序播放时对CPU与GPU的使用,经测试CPU使用减少60%以上,GPU使用减少90%以上,这应该能解决MAC系统上的温度上涨的问题
\n
\n修复
\n\n- 修复酷我源搜索提示、排行榜无法获取的问题
\n- 修复咪咕源无法播放的问题
\n
\n"},{"version":"0.9.1","desc":"修复
\n\n"},{"version":"0.9.0","desc":"新增
\n\n- 新增窗口大小设置,若觉得软件窗口小可以到设置页调大点
\n- 新增定位当前播放歌曲,点击播放栏左侧的歌曲图片可在播放列表定位当前播放的歌曲(该功能对播放下载列表的歌曲无效)
\n
\n修复
\n\n- 修复搜索提示失效的问题
\n- 修复从歌单或列表点击搜索按钮搜索目标歌曲时,搜索框未聚焦仍然弹出候选搜索列表的问题
\n
\n"},{"version":"0.8.2","desc":"修复
\n\n- 兼容旧版酷我源搜索列表过滤128k音质的bug(注:0.8.1版本仅修复了酷我源的歌曲过滤问题,该修复仅对以后添加的歌曲有效,如果是之前添加的歌曲仍会出现这个问题,现修复对之前旧列表数据的兼容处理)
\n
\n"},{"version":"0.8.1","desc":"修复
\n\n- 修复酷我源搜索歌曲结果未添加128k音质导致播放128k音质时显示“该歌曲没有可播放的音频”的问题
\n
\n"},{"version":"0.8.0","desc":"新增
\n\n- 新增网易云源歌曲搜索
\n- 新增网易云源歌单
\n- 新增各平台通过输入歌单链接或歌单ID打开歌单详情列表,目前只适配了网页版歌单链接,其他方式的歌单链接可能无法解析,但你可想办法获取歌单ID后输入打开。注:各平台歌单ID均为纯数字,若遇到链接里存在歌单ID但无法解析的歌单链接,可以到GitHub提交issue或发送邮件或加群830125506反馈!
\n- 新增音量调整滑动功能,现在支持鼠标左右拖动调整音量了
\n
\n优化
\n\n- 优化搜索框搜索体验
\n- 优化音量条交互视觉效果
\n- 缓存歌单详情列表数据
\n
\n修复
\n\n- 修复QQ源歌单无法翻页Bug
\n- 修复默认列表没有创建时无法显示收藏列表的Bug
\n- 修复网易云128k直接试听
\n- 修复歌曲音质不存在时仍然播放或下载的Bug
\n- 修复调整音量时,调整的位置与鼠标点击的位置不一致的问题
\n
\n"},{"version":"0.7.0","desc":"新增
\n\n- 新增“我的收藏”本地播放列表
\n- 新增缓存清理功能,可到设置-其他查看与清理软件缓存
\n- 新增QQ音乐源搜索
\n- 新增咪咕源搜索
\n- 新增咪咕源歌单
\n- 新增咪咕源排行榜
\n- 新增我的音乐列表歌曲源显示,默认关闭,可到设置-列表设置开启
\n
\n优化
\n\n- 优化选择框动画效果
\n- 尝试优化选我的音乐列表内容很多时多选的卡顿问题
\n
\n修复
\n\n- 修复列表延迟显示的Bug
\n- 修复QQ音源128k音质试听
\n
\n"},{"version":"0.6.2","desc":"祝贺祖国成立70周年~!
\n新增
\n\n修复
\n\n- 修正火影皮肤名字
\n- 修复当试听列表为空时,无法切到其他界面的Bug
\n- 修复百度源搜索结果为空时的接口处理Bug
\n- 恢复酷狗其他音质播放
\n
\n"},{"version":"0.6.1","desc":"新增
\n\n- 新增试听列表滚动条位置恢复设置(可自动恢复到上次离开时的列表滚动位置),本功能默认开启,若不需要可到设置-列表设置将其关闭
\n- 新增 《海贼王》 皮肤,喜欢个性化的可以试试~
\n
\n优化
\n\n- 新增DNS解析缓存,加快请求速度
\n- 优化代码逻辑,减少软件对系统资源的占用
\n- 优化新版本信息检测,尽量减少弹出版本获取失败弹窗弹出的概率
\n- 优化下拉列表动画效果
\n
\n修复
\n\n- 修复请求超时的逻辑处理Bug,尝试修复请求无法取消导致的正在播放的歌曲与界面显示的信息不一致的问题
\n- 修复其他一些小Bug
\n
\n移除
\n\n- 移除
192k 音质 \n- 移除酷我音源
ape 音质,无损推荐 flac 格式 \n
\n"},{"version":"0.6.0","desc":"新增
\n\n- 新增音乐聚合搜索,目前支持酷我、酷狗、百度源搜索
\n- 新增代理功能
\n
\n优化
\n\n- 优化从《梦里嫦娥》皮肤切换到其他皮肤时侧栏动画的切换效果
\n
\n修复
\n\n- 修复试听列表没有歌曲时会显示列表加载中的Bug
\n- 修复切换歌单列表详情时的UI Bug
\n
\n"},{"version":"0.5.5","desc":"新增
\n\n- 月是故乡明,祝大家中秋快乐🥮~~新增个性皮肤**《月里嫦娥》**,时间仓促,皮肤还不是很完善,可以试试喜不喜欢~😉
\n- 新增 MAC 版本退出快捷键支持
\n- 新增点击播放器中的歌曲标题可以复制标题的功能(遇到好听的歌曲方便分享)
\n
\n修复
\n\n- 修复 MAC 系统下软件关闭时再次从 dock 打开时报错的Bug
\n- 修复下载的歌曲文件名中包含命名规则不允许的符号时下载失败的问题(若歌曲名包含这些符号会自动将其移除)
\n- 修复 MAC 版本不能复制粘贴的问题
\n
\n"},{"version":"0.5.4","desc":"移除
\n\n- 下载的FLAC文件在修改歌曲信息后,软件无法播放,但使用本地播放器可以播放
\n- 为了稳妥起见,暂时移除FLAC格式的meta信息修改
\n- MP3格式无此问题
\n
\n"},{"version":"0.5.3","desc":"优化
\n\n修复
\n\n- 修复试听酷狗源的音乐仍然获取320k音质导致获取失败的Bug
\n
\n"},{"version":"0.5.2","desc":"新增
\n\n- 新增强迫症设置-离开搜索界面时是否清空搜索框
\n- 设置-关于板块新增常见问题链接
\n- 歌单左上角的分类按钮添加一个向下图标,方便识别该按钮为下拉框(该按钮可选择歌单类型,请自行尝试)
\n
\n优化
\n\n- 略微优化最小化按钮字符
\n- 优化试听列表的加载体验,当歌曲数过多时列表将延迟加载
\n
\n修复
\n\n移除
\n\n- 因接口失效,移除网易云音源,酷狗音源仅支持播放128k音质
\n
\n"},{"version":"0.5.1","desc":"新增
\n\n- 新增右上角最小化/关闭按钮鼠标滑过符号
\n- 新增下载列表定位文件按钮
\n
\n修复
\n\n- 修复百度源歌单全部分类无法加载的问题
\n- 修复更新弹窗无法弹出的问题
\n
\n"},{"version":"0.5.0","desc":"新增
\n\n- 新增封面嵌入(默认开启,可到设置-下载设置关闭)
\n- 新增歌词下载(默认关闭,可到设置-下载设置开启)
\n- 新增单例应用功能(实现软件单开功能,禁止软件多开)
\n
\n优化
\n\n修复
\n\n- 修复歌单无法翻页的问题
\n- 修复在某些情况下,添加下载歌曲导致下载列表崩溃的问题
\n- 修复版本更新弹窗Bug
\n- 修复酷狗歌单推荐歌单出现在其他分类中的Bug
\n
\n"},{"version":"0.4.0","desc":"新增
\n\n- 新增歌单功能,目前支持酷我、酷狗、百度源歌单
\n- 在设置界面-关于洛雪音乐说明部分新增最新版网盘下载地址与打赏地址
\n- 新增酷狗 电音热歌榜、DJ热歌榜
\n- 新增版本更新超时功能,对于部分无法访问GitHub的用户做更新超时提醒
\n
\n移除
\n\n- 注意:0.4.0以前的版本即将失效,请更新到0.4.0版本
\n
\n"},{"version":"0.3.5","desc":"新增
\n\n- 新增测试接口,该接口同样速度较慢,但软件的大部分功能可用,请自行切换到该接口,找接口辛苦,且用且珍惜!
\n
\n优化
\n\n- 取消需要刷新URL时windows任务栏进度显示错误状态(现显示为暂停状态)
\n
\n修复
\n\n- 修复使用临时接口时在试听列表双击灰色歌曲仍然会进行播放的Bug
\n- 修复歌词加载Bug
\n
\n"},{"version":"0.3.4","desc":"优化
\n\n- 减少接口不稳定带来的影响,适当增加请求等待时间
\n
\n修复
\n\n- 修复播放过程中URL过期不会刷新URL的问题
\n
\n"},{"version":"0.3.3","desc":"修复
\n\n- messoer的接口已经关闭,暂时切换到临时接口使用,部分功能受限。。。
\n- 修复设置界面更新出错时仍然显示更新下载中的问题
\n- 修复手动定位播放进度条时存在偏差的问题
\n- 屏蔽播放器中没有歌曲时对进度条的点击
\n
\n"},{"version":"0.3.2","desc":"新增
\n\n"},{"version":"0.3.1","desc":"修复
\n\n"},{"version":"0.3.0","desc":"新增
\n\n- 新增MAC及Linux版本(需要的可自行下载)
\n- 新增音量调整
\n- 新增任务栏播放进度条控制选项(现在可在设置界面关闭在任务栏显示的播放进度)
\n- 新增更新出错时的弹窗提示
\n- 从该版本起,非安装版也会有更新弹窗提醒了,但仍然需要手动下载新版本更新,版本信息可到设置页面查看
\n
\n修复
\n\n- 强制把临时接口设置回
messoer 接口 \n
\n"},{"version":"0.2.3","desc":"新增
\n\n- 新增任务栏程序标题改变功能(播放歌曲时任务栏标题将显示当前播放的歌曲)
\n
\n修复
\n\n- 使用临时接口时,试听列表中的下载按钮仍然能点击的Bug
\n- 修复某些情况下歌曲链接未能缓存的问题
\n
\n移除
\n\n- 移除临时接口(因服务器被攻击,本接口已关闭)
\n- 移除列表栏设置的隐藏专辑栏选项(感觉这个设置并没有什么luan用,并且还会打破布局)
\n
\n"},{"version":"0.2.2","desc":"修复
\n\n- 修复下载过程中出错重试5次都失败后不会自动开始下一个任务的Bug
\n- 修复播放到一半URL过期时不会刷新URL直接播放下一首的问题
\n
\n"},{"version":"0.2.1","desc":"优化
\n\n- 新增歌曲URL存储,当URL无效时才重新获取,以减少接口不稳定的影响
\n
\n修复
\n\n- 修复歌曲加载无法加载时自动切换混乱的Bug
\n- 修复移除列表最后一首歌曲时播放器不停止播放的问题
\n
\n"},{"version":"0.2.0","desc":"新增
\n\n- 新增百度音乐排行榜及其音乐直接试听与下载
\n- 新增网易云排行榜音乐直接试听与下载(目前仅支持128k音质)
\n- 新增酷狗排行榜音乐直接试听与下载(目前仅支持128k音质)
\n
\n修复
\n\n- 修复更新弹窗历史版本描述多余的换行问题
\n- 修复歌曲无法播放的情况下歌词仍会播放的问题
\n
\n"},{"version":"0.1.6","desc":"修复
\n\n"},{"version":"0.1.5","desc":"新增
\n\n- 新增搜索列表批量试听与下载功能
\n- 新增排行榜列表批量试听与下载功能
\n- 新增试听列表批量移除与下载功能
\n- 新增下载列表批量开始、暂停与移除功能
\n
\n优化
\n\n"},{"version":"0.1.4","desc":"新增
\n\n- 新增音乐来源切换,可到设置页面-基本设置 look look !
\n- 为搜索结果列表添加多选功能。
\nP.S:暂时没想好多选后的操作按钮放哪… \n
\n优化
\n\n- 重构与改进checkbox组件,使其支持不定选中状态
\n- 完善上一个版本的http请求封装并切换部分请求到该方法上
\n- 优化其他一些细节
\n
\n"},{"version":"0.1.3","desc":"新增
\n\n修复
\n\n- 修复安装包许可协议乱码问题
\n- messoer 提供的接口已挂,暂时切换到临时接口!
\n
\n移除
\n\n- 由于messoer接口无法使用,QQ音乐排行榜直接播放/下载功能暂时关闭
\n
\n"},{"version":"0.1.2","desc":"修复
\n\n"},{"version":"0.1.1","desc":"新增
\n\n- QQ音乐排行榜直接试听与下载(该接口貌似不太稳定,且用且珍惜!)
\n
\n优化
\n\n- 优化http请求机制
\n- 更新关于本软件说明
\n
\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- 优化播放歌曲换源匹配
\n- 优化设置界面设置项的展示
\n
\n修复
\n\n- 修复快速切换歌曲时, 会出现播放的歌曲和界面展示的歌曲不一致的问题
\n- 修复了一个由版本更新日志显示导致的潜在远程代码执行攻击漏洞,该漏洞影响v1.6.1及之前的所有版本,请务必更新到最新版本
\n- 修复xm搜索源验证问题
\n
\n其他
\n\n","history":[{"version":"1.6.1","desc":"优化
\n\n修复
\n\n- 修复某些情况下自动换源的时间过长时会终止换源自动切歌的问题
\n- 修复自动换源导致的搜索列表每页变成10条数据的问题
\n- 降级electron到9.3.3修复部分系统没有声音的问题
\n
\n"},{"version":"1.6.0","desc":"新增
\n\n- 我的列表右键菜单新增列表排序功能,可调整单曲、多选后的歌曲的顺序。注意:多选排序还将会按照选中歌曲时的顺序排序
\n- 添加鼠标提示的自动关闭功能,鼠标长时间(目前是10秒)不动时鼠标提示将会自动关闭
\n- 添加鼠标指向歌曲封面的提示(对于进度条左边的歌曲封面,你可能不知道的操作->右击在“我的列表”定位当前播放的歌曲)
\n- 隐藏播放详情页按钮添加快速隐藏详情页提示(你可能不知道的操作->在播放详情页内的任意非窗口可拖动区域右键双击可以快速隐藏详情页)
\n- 添加桌面歌词字体、透明度调整按钮微调提示(你可能不知道的操作->对于字体、透明度可右击微调)
\n- 我的列表右键菜单添加搜索当前歌曲功能
\n- 新增
-dha参数,添加此启动参数将禁用硬件加速启动(Disable Hardware Acceleration),窗口显示有问题时可以尝试添加此参数启动,Linux系统的界面显示有问题时可尝试添加此参数启动,若不行可尝试添加-dt参数启动 \n- 新增播放自动换源功能~
\n
\n变更
\n\n-nt参数更名为-dt(Disable Transparent),目前原来的-nt参数仍然可用,但将在后续的版本中移除 \n
\n修复
\n\n- 修复恢复上次播放的歌曲时在随机播放模式下不把恢复播放的歌曲放入已播放队列的问题(该问题会导致随机模式下会导致未播放完整个列表前就会再次随机到该歌曲,以及无法通过上一曲切回该歌曲)
\n- 修复音乐嵌入的封面在 Mac 系统无法显示的问题
\n- 修复
-dt(原来的-nt)启动参数不真正生效的问题 \n
\n"},{"version":"1.5.0","desc":"新增
\n\n- 直接从歌单详情收藏的列表新增同步功能。注意:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表
\n
\n优化
\n\n- 优化软件启动时恢复上一次播放的歌曲进度功能
\n
\n修复
\n\n- 修复MAC平台上下载歌曲封面嵌入无法显示的问题
\n- 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题
\n- 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题
\n- 修复某些酷狗源歌单链接无法打开的问题
\n
\n"},{"version":"1.4.1","desc":"修复
\n\n- 修复有歌词翻译与无歌词的音乐间切换会导致歌词翻译残留显示的问题
\n- 修复歌曲URL过期时,等待刷新URL的自动切换歌曲时间间隔太短的问题
\n- 修复某些电脑上的某些歌曲没有声音的问题(升级Electron9.3.4导致的,现降级到9.3.3)
\n
\n"},{"version":"1.4.0","desc":"新增
\n\n- 托盘菜单新增显示、隐藏主界面选项,为Linux、MAC版添加托盘菜单
\n- 新增播放进度信息保存
\n
\n优化
\n\n修复
\n\n- 修复专辑图片无法嵌入的问题
\n- 修复播放状态栏切换“上一首”歌曲按钮提示错误的问题
\n- 修复移动单首歌曲时,如果目标列表存在该歌曲,会导致将源列表与目标列表里的目标歌曲移除
\n- 修复kg源歌曲信息带有单引号等特殊字符被转义的问题
\n
\n"},{"version":"1.3.0","desc":"新增
\n\n- 播放详情页新增歌曲评论加载显示(某些平台暂不支持显示子评论)
\n
\n优化
\n\n修复
\n\n- 修复小芸源音乐搜索结果最多只有20条搜索结果的问题
\n
\n"},{"version":"1.2.2","desc":"修复
\n\n- 降级 Electron 到 9.x.x 版本修复 Linux 版桌面歌词窗口变白的问题
\n
\n"},{"version":"1.2.1","desc":"优化
\n\n- Linux版的软件界面默认使用圆角与阴影,顺便修复了桌面歌词窗口变白的问题,已在Ubuntu 18.10测试正常,若显示异常可尝试添加
-nt参数启动 \n
\n修复
\n\n- 修复聚合搜索的分页问题
\n- 修复代理输入框输入的内容不生效的问题
\n
\n"},{"version":"1.2.0","desc":"提前祝大家中秋&国庆快乐~
\n新增
\n\n- 播放控制栏开启/关闭桌面歌词按钮 新增右击按钮时锁定/解锁桌面歌词功能
\n
\n优化
\n\n- 优化我的列表滚动条位置的保存逻辑
\n- 更新设置-备份与恢复功能的描述
\n- 优化软件内鼠标悬停的提示界面
\n
\n修复
\n\n- 修复桌面歌词窗口不允许拖出桌面之外的位置计算偏移Bug
\n- 修复网易云KTV嗨榜无法加载的问题
\n- 修复初始化搜索历史列表功能
\n- 修复重启软件后试听列表与收藏列表无法恢复上次的滚动位置的问题
\n- 修复歌曲封面无法嵌入的Bug
\n- 修复酷狗歌词格式问题
\n- 修复关闭切换动画时从搜索候选列表点击内容无效的问题
\n
\n其他
\n\n- 更新 Electron 到 v10.1.3
\n
\n"},{"version":"1.1.1","desc":"修复
\n\n"},{"version":"1.1.0","desc":"新增
\n\n- 在歌单详情界面新增播放当前歌单按钮、收藏歌单按钮,注:播放歌单不会将歌曲添加到试听列表
\n- 新增
不允许将歌词窗口拖出主屏幕之外的设置项,默认开启,在连接多个屏幕时想要拖动到其他屏幕时可关闭此设置 \n- 新增大部分平台的歌词翻译,感谢 @InoriHimea 提供的krc解码算法
\n- 新增
显示歌词翻译设置,默认开启,仅支持某些平台,注:无论该设置是否开启,嵌入或下载歌词时都不会带上翻译 \n- 新增
显示切换动画设置,默认开启,关闭时将基本禁用软件内的所有切换动画 \n- 播放状态栏新增桌面歌词的开关、播放模式的切换、歌曲的收藏按钮,Thanks to @andylow for the icon!
\n
\n修复
\n\n- 修复使用全局快捷键还原窗口时,窗口没有获取焦点的问题
\n- 修复我的列表搜索对最后一个字符的匹配问题
\n- 修复窗口在
较小模式下最小化/关闭按钮不居中的问题 \n
\n优化
\n\n- 桌面歌词当前播放行改为上下居中
\n- 为区分静音状态,静音时音量条会变淡,调整音量条时将会取消静音
\n- 优化随机播放机制,现在通过
下一曲切换歌曲时,直到播放完整个列表之前将不会再随机到之前播放过的歌曲,并且通过上一曲可以正确播放上一首歌曲 \n- 当下载目录没有写入权限时将显示没有写入权限的提示
\n
\n移除
\n\n- 移除默认的全局声音媒体快捷键接管
\n- 移除对百度音乐的支持,因百度音乐原有的大部分API失效,而且该平台相对其他平台来说音乐太少了,可有可无,以后再看情况恢复
\n
\n其他
\n\n"},{"version":"1.0.1","desc":"优化
\n\n修复
\n\n- 修复在 Windows 系统下缩放比非100%时,拖动桌面歌词会自动加大桌面歌词窗口的问题
\n
\n"},{"version":"1.0.0","desc":"新增
\n\n- 新增
rpm、pacman包的构建(未测试可用性) \n- 新增因系统音频设备列表改变导致的当前音频输出设备改变时是否暂停播放的设置,默认关闭
\n- 新增歌曲列表右击菜单
\n- 新增自定义列表,创建列表的按钮在表头
#左侧,鼠标移上去才会显示;编辑列表名字时,按ESC键可快速取消编辑,按回车键或使输入框失去焦点即可保存列表名字,右击列表可编辑已创建的列表,“试听列表”与“我的收藏”两个列表固定不可编辑 \n- 改变排行榜布局,新增更多排行榜
\n- 新增我的列表右键菜单复制歌曲名选项
\n- 新增桌面歌词,默认关闭,可到设置或者托盘菜单开启(建议使用全局快捷键控制);调整字体大小、透明度时,鼠标左击按钮正常调整,右击微调;Windows 7未开启Aero效果时桌面歌词会有问题,详情看常见问题解决;Linux版桌面歌词有问题,以后再尝试优化;
\n- 新增“清热板蓝”皮肤
\n- 新增软件最小化、关闭按钮位置设置,MAC版默认为左边,非MAC为右边,不想用默认的可到设置修改
\n- 新增快捷键设置,软件内快捷键默认开启,全局快捷键默认关闭(注:若想开启蓝牙耳机切歌需开启全局快捷键,当快捷键被中划线划掉时,表示当前快捷键被其他程序占用导致注册失败)
\n- 新增首次运行时自动根据当前系统使用的语言设置软件显示的语言
\n- 新增歌词区域的触摸板、鼠标滚轮等对歌词滚动的支持
\n- 为了方便支持正版资源,歌曲列表右击菜单新增跳转到当前歌曲源官方详情页菜单(注意:在本版本之前添加的虾米源歌曲无法跳转详情页,需要移除后重新搜索添加)
\n- 新增我的列表内歌曲搜索,在我的列表按
ctrl+f将显示搜索框;鼠标滑过或键盘上下方向键选择搜索结果;鼠标点击或按回车键定位选中的歌曲;按ctrl键的情况下鼠标点击或按回车键确认定位歌曲时,将会在定位歌曲结束后播放该歌曲(搜索框激活的情况下按esc可快速清空搜索框/关闭搜索框) \n- 新增托盘图标样式设置,可到设置-其他切换
\n- 新增开关下载功能控制,默认关闭,可到设置-下载设置开启
\n- 新增将歌词嵌入音频文件中,默认关闭,可到设置-下载设置开启
\n- 新增当列表文件损坏时对损坏文件的备份,若出现该情况可打开
%HOMEPATH%\\AppData\\Roaming\\lx-music-desktop找到playList.json.bak尝试手动修复列表文件,列表文件以JSON格式存储 \n- 新增在歌单详情列表按退格(Backspace)键可快速返回歌单列表
\n
\n优化
\n\n- 改进歌曲切换时的歌词滚动效果
\n- 优化批量添加、删除播放列表的歌曲操作逻辑,大幅提升批量添加、删除列表歌曲的流畅度
\n- 改进歌单列表展示
\n- 改进聚合搜索的搜索结果排序,修复当某些源搜索失败时导致其他源无法显示结果的问题,现在聚合搜索已达到最初的理想效果,为了使排序更精确,建议同时输入 歌曲名 歌手名 搜索(歌曲名在前歌手名在后),欢迎体验~!
\n- 压缩备份数据文件大小
\n
\n修复
\n\n- 修复按住
Ctrl等键触发多选机制时不松开按键的情况下切换到其他窗口后再松开按键,这时切回软件不按按键都处在多选模式的问题 \n- 修复Linux版开启托盘无法退出的问题
\n- 修复某些情况下可能导致的音源输出问题
\n- 修复某些情况下无法开始下载任务的问题
\n- 修复 tab 组件边框溢出问题
\n- 修复错误更新试听列表外的歌曲时间的问题
\n- 修复网易音乐源歌单、排行榜歌曲列表加载显示的数量与实际不对的问题,同时支持加载大于1000首歌的歌单(歌曲大于1000首会分页),注意:目前软件一下子显示太多歌曲时会卡顿,不建议在同一列表内添加太多歌曲
\n- 修复歌曲图片链接没有扩展名的情况下无法嵌入图片的问题
\n- 修复无法检测最新版本时弹窗提示的显示
\n- 修复某些情况下从托盘还原窗口后无法操作的问题
\n- 修复Linux下无法
ctrl+a全选的问题 \n- 修复主题背景图片覆盖不全的问题
\n- 修复聚合搜索音源标签的皮肤配色问题
\n
\n更变
\n\n- 修改设置-列表-是否显示歌曲源的默认设置为选中(该变更不影响之前的设置)
\n- 移除浮动按钮,现在在多选完成后可鼠标右击随意一项在弹出的右键菜单中进行原来悬浮按钮的操作
\n- 为了避免出现误会,现在下载弹窗中不可用的音质将直接隐藏
\n- 更改初始设置的搜索设置为聚合搜索(该变更不影响之前的设置)
\n
\n其他
\n\n"},{"version":"0.18.2","desc":"修复
\n\n- 修复开启托盘时,可能导致无法自动更新的问题
\n
\n"},{"version":"0.18.1","desc":"优化
\n\n- win下的托盘图标使用更大的图片
\n- 加长软件协议的强制停留时间
\n
\n修复
\n\n"},{"version":"0.18.0","desc":"新增
\n\n- 新增FLAC格式音乐标签信息写入与封面嵌入(因128k以外的音质已失效,目前该功能用不上了)
\n- 添加软件启动时是否自动聚焦搜索框的设置
\n- 新增托盘设置,默认关闭,可到设置开启,感谢 @LasyIsLazy 提交的PR
\n- 新增打开酷狗源用户歌单
\n- 新增使用协议
\n- 新增虾米音源
\n- 新增新皮肤“粉妆玉琢”、“青出于黑”,可去体验下~
\n- 新增“超大”、“巨大”窗口尺寸
\n- 新增播放详情页(退出详情页可点击右上角退出按钮或者在播放详情页任意地方鼠标快速右击两次)
\n
\n优化
\n\n- 略微加深音量条底色
\n- 优化其他界面细节
\n- 优化英语翻译,感谢 @CPCer
\n- 优化程序的流畅度
\n
\n更变
\n\n- 下载列表的歌曲下载、播放将随设置中的保存路径改变而改变,不再固定指向其初始位置
\n- 移除列表多选框,现在多选需要键盘配合,想要多选前需按下
Shift或Ctrl键然后再鼠标点击想要选中的内容即可触发多选机制,其中Shift键用于连续选择,Ctrl键用于不连续选择,Ctrl+a用于快速全选。例子一:想要选中1-5项,则先按下Shift键后,鼠标点击第一项,再点击第五项即可完成选择;例子二:想要选中1项与第3项,则先按下Ctrl键后,鼠标点击第一项,再点击第三项即可完成选择;例子三:想要选中当前列表的全部内容,键盘先按下Ctrl键不放,然后按a键,即可完成选择。用Shift或Ctrl选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按Shift或Alt键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S:Ctrl键对应Mac OS上的Command键) \n- 现在进度条的封面图左击改为打开播放详情页,在列表定位歌曲改为右击
\n
\n修复
\n\n- 修复网易源某些歌曲提示没有可播放的音质的问题
\n- 修复下载管理刷新URL失败时不标记任务下载失败的问题
\n- 修复列表导出的文字描述,感谢 @CPCer
\n- 修复歌曲切换方式无法取消勾选的问题
\n- 修复打开歌单详情的情况下切到其他界面再切回来报错的问题
\n- 修正播放列表浮动按钮错误的文字提示
\n
\n移除
\n\n- 因128k以外的音质失效,So 禁止所有128k外的音质下载
\n
\n其他
\n更新 Electron 到 8.2.5
\n"},{"version":"0.17.0","desc":"新增
\n\n- 新增多语言设置,目前软件内置了简体中文、繁体中文、英语三种语言,欢迎提交PR翻译更多语言!
\n- 新增无法打开外部歌单FAQ
\n- 新增启动参数
search,使用例子:.\\lx-music-desktop.exe -search="突然的自我 - 伍佰" \n- 新增音频输出设置
\n- 新增软件内的包括字体在内的界面内容大小调整,现在当窗口大小切换到“较小/大/较大”时,软件内的元素将会适当减小或加大,窗口大小的“小”与“中”内的元素将保持之前的大小暂不做改变
\n- 新增音源别名,默认将显示别名,想要显示回原名可到设置切换(免责声明:别名仅是本软件用于描述各音源的标签,其名字归版权方所有)
\n- 新增发现新版本更新失败弹窗的忽略提醒按钮,忽略提醒后,以后同一个版本再失败时将不会弹窗提醒,但仍可到设置-版本更新手动点开更新弹窗查看或恢复提醒
\n- 新增热搜词,默认关闭,可到设置开启
\n- 新增历史搜索记录,默认关闭,可到设置开启(右击单个历史记录标签可移除所点击的记录)
\n
\n优化
\n\n- 优化月里嫦娥皮肤侧栏鼠标悬浮颜色
\n- 优化播放进度条的动画效果
\n- 现在添加下载任务时,后面添加的任务会在列表顶部插入
\n- 优化歌单打开机制,现在歌单加载失败时会提示加载失败了,并且支持直接打开企鹅、酷我手机分享出来的歌单了
\n- 优化右上角最小化/关闭按钮布局
\n
\n修复
\n\n- 修复歌单详情处于加载状态时无法返回的问题
\n- 修复鼠标右击复制列表内容时会复制音质标签的问题
\n- 修复
0.6.2及以前的版本导出的“所有数据”内的歌曲列表无法导入的问题 \n- 修复下载列表在某些情况下无法取消全选的问题
\n
\n其他
\n\n"},{"version":"0.16.0","desc":"新增
\n\n- 允许选中列表内歌曲名、歌手名、专辑名内的文字,选中后可使用键盘快捷键进行复制
\n- 新增在列表可选内容区域鼠标右击时自动复制列表已选文字的功能
\n- 新增在搜索框鼠标右击时自动粘贴剪贴板的文本到搜索框中
\n- 任务下载失败时将显示搜索按钮,方便在其他源搜索该歌曲
\n
\n优化
\n\n- 优化木叶之村主题翻页器背景颜色
\n- 优化各个主题音质标签颜色
\n- 优化其他一些界面细节及用户交互效果
\n
\n修复
\n\n- 修复启用透明窗口鼠标不穿透的bug
\n- 修复大窗口时设置的音乐来源选项不换行的问题
\n- 修复某些情况下暂停任务会自动开始任务的问题
\n- 修复移除暂停、错误的任务时不删除未下载完成的文件的问题
\n- 修复酷狗源歌单热门标签歌单列表无法加载问题
\n- 修复QQ源歌单热门标签歌单列表无法加载问题
\n
\n其他
\n\n"},{"version":"0.15.0","desc":"洛雪提前祝大家新年快乐、身体健康、阖家幸福!
\n修复
\n\n- 修复歌曲下载列表无法加载的问题
\n- 修复歌曲下载任务数大于最大下载任务数的问题
\n- 修复某些情况下歌曲下载错误的问题
\n- 修复下载列表数据没有被迁移直接被丢弃的问题
\n
\n"},{"version":"0.14.1","desc":"洛雪提前祝大家新年快乐、身体健康、阖家幸福!
\n修复
\n\n- 修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题
\n
\n"},{"version":"0.14.0","desc":"洛雪提前祝大家新年快乐、身体健康、阖家幸福!
\n新增
\n\n- 新增各大平台歌单热门标签显示(显示在歌单界面的第一个下拉标签菜单中)
\n- 恢复QQ音乐源128k音质试听
\n- 新增不强制win7开启透明效果即可使用,但要配置运行参数
-nt,例如:.\\lx-music-desktop.exe -nt,添加方法可自行百度“给快捷方式加参数” \n- 新增“新年快乐”主题,可自行切换体验
\n
\n优化
\n\n- 减淡各个主题的歌曲列表分隔线颜色
\n- 在线音乐列表音质标签优化,当歌曲有无损音质时隐藏高品质标签
\n- 更新改进的歌词播放插件,现在歌词的播放显示将更准确
\n
\n修复
\n\n- 修复咪咕源无法搜索的问题
\n- 修复更新弹窗底部文字颜色没有适配当前主题颜色的问题
\n- 修复导入设置窗口大小、代理设置不立即生效的问题
\n- 修复在线音乐列表获取失败时无限循环请求的问题
\n
\n其他
\n\n- 将软件设置与播放列表分离存储成两个文件
\n- 更新 Electron 到 7.1.9
\n
\n"},{"version":"0.13.1","desc":"修复
\n\n其他
\n\n- 由于electron 7.1.3 - 7.1.5 的自动更新功能存在Bug,现降级到7.1.2
\n
\n"},{"version":"0.13.0","desc":"新增
\n\n- 新增搜索框搜索建议键盘上下方向键选择功能
\n- 聚合搜索新增音源显示
\n- 新增“离开搜索界面时清空搜索列表”设置选项,默认关闭,可到设置-强迫症设置开启
\n
\n优化
\n\n修复
\n\n- 修复存在弹出层时,搜索建议列表被弹出层覆盖的问题
\n- 修复搜索、排行榜、歌单列表多选框从不定状态到选中的Bug
\n
\n移除
\n\n其他
\n\n- 更新electron到7.1.5
\n- 更新vue到2.6.11
\n
\n"},{"version":"0.12.1","desc":"优化
\n\n- 优化定位歌曲时的列表滚动机制
\n- 优化链接点击效果
\n
\n修复
\n\n- 修复使用酷我源下载歌曲时,当歌曲无封面时下载报错的问题
\n- 修复酷我源排行榜、歌单详情列表里的歌曲音质匹配问题(原来无论歌曲有无高品、无损都会显示有)
\n- 禁止外部链接在软件内打开,将所有外部链接从默认浏览器打开
\n
\n其他
\n\n"},{"version":"0.12.0","desc":"由于新下载库仍然没有完成,但下载功能已经可用,so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!
\n新增
\n\n- 新增下载功能对代理设置的支持,现在若在软件设置了代理服务器,下载功能也将会走代理网络了
\n
\n优化
\n\n- 新下载模块将对恢复下载的任务进行字节校验,用于解决下载进度超过100%后仍然下载的问题
\n- 注意:目前仍然无法暂停处于链接获取状态中的任务
\n
\n修复
\n\n- 修复Linux deb版本
.desktop桌面文件缺少图标的问题,新增中文名称显示、软件分类,感谢@lowy的反馈! \n- 修复下载列表歌曲状态分类列表操作Bug
\n- 修复歌曲封面下载失败时仍然执行嵌入封面操作导致报错的问题
\n- 跳过重复添加相同歌曲名与扩展名的歌曲,例如你之前下载了A歌曲的128k音质,现在想要下载它的320k音质,但由于两者都是MP3格式,会因为重名导致之前的128k音质被覆盖但列表中仍然显示两种音质的问题(但实际上都是指向后面的320k音质)
\n
\n"},{"version":"0.11.0","desc":"新增
\n\n- 新增歌曲缓冲定时器,尝试用于解决网络正常但是歌曲缓冲过久的问题
\n- 新增下载管理的任务状态分类
\n- 添加杀毒软件提示有病毒或恶意行为的说明,可到常见问题拉到最后查看(常见问题可在开源地址找到)
\n
\n优化
\n\n- 优化更新弹窗机制及其内容描述,对于可以自动更新的版本,现在可以看到软件的下载进度了
\n
\n"},{"version":"0.10.0","desc":"优化
\n\n- 大幅减少程序播放时对CPU与GPU的使用,经测试CPU使用减少60%以上,GPU使用减少90%以上,这应该能解决MAC系统上的温度上涨的问题
\n
\n修复
\n\n- 修复酷我源搜索提示、排行榜无法获取的问题
\n- 修复咪咕源无法播放的问题
\n
\n"},{"version":"0.9.1","desc":"修复
\n\n"},{"version":"0.9.0","desc":"新增
\n\n- 新增窗口大小设置,若觉得软件窗口小可以到设置页调大点
\n- 新增定位当前播放歌曲,点击播放栏左侧的歌曲图片可在播放列表定位当前播放的歌曲(该功能对播放下载列表的歌曲无效)
\n
\n修复
\n\n- 修复搜索提示失效的问题
\n- 修复从歌单或列表点击搜索按钮搜索目标歌曲时,搜索框未聚焦仍然弹出候选搜索列表的问题
\n
\n"},{"version":"0.8.2","desc":"修复
\n\n- 兼容旧版酷我源搜索列表过滤128k音质的bug(注:0.8.1版本仅修复了酷我源的歌曲过滤问题,该修复仅对以后添加的歌曲有效,如果是之前添加的歌曲仍会出现这个问题,现修复对之前旧列表数据的兼容处理)
\n
\n"},{"version":"0.8.1","desc":"修复
\n\n- 修复酷我源搜索歌曲结果未添加128k音质导致播放128k音质时显示“该歌曲没有可播放的音频”的问题
\n
\n"},{"version":"0.8.0","desc":"新增
\n\n- 新增网易云源歌曲搜索
\n- 新增网易云源歌单
\n- 新增各平台通过输入歌单链接或歌单ID打开歌单详情列表,目前只适配了网页版歌单链接,其他方式的歌单链接可能无法解析,但你可想办法获取歌单ID后输入打开。注:各平台歌单ID均为纯数字,若遇到链接里存在歌单ID但无法解析的歌单链接,可以到GitHub提交issue或发送邮件或加群830125506反馈!
\n- 新增音量调整滑动功能,现在支持鼠标左右拖动调整音量了
\n
\n优化
\n\n- 优化搜索框搜索体验
\n- 优化音量条交互视觉效果
\n- 缓存歌单详情列表数据
\n
\n修复
\n\n- 修复QQ源歌单无法翻页Bug
\n- 修复默认列表没有创建时无法显示收藏列表的Bug
\n- 修复网易云128k直接试听
\n- 修复歌曲音质不存在时仍然播放或下载的Bug
\n- 修复调整音量时,调整的位置与鼠标点击的位置不一致的问题
\n
\n"},{"version":"0.7.0","desc":"新增
\n\n- 新增“我的收藏”本地播放列表
\n- 新增缓存清理功能,可到设置-其他查看与清理软件缓存
\n- 新增QQ音乐源搜索
\n- 新增咪咕源搜索
\n- 新增咪咕源歌单
\n- 新增咪咕源排行榜
\n- 新增我的音乐列表歌曲源显示,默认关闭,可到设置-列表设置开启
\n
\n优化
\n\n- 优化选择框动画效果
\n- 尝试优化选我的音乐列表内容很多时多选的卡顿问题
\n
\n修复
\n\n- 修复列表延迟显示的Bug
\n- 修复QQ音源128k音质试听
\n
\n"},{"version":"0.6.2","desc":"祝贺祖国成立70周年~!
\n新增
\n\n修复
\n\n- 修正火影皮肤名字
\n- 修复当试听列表为空时,无法切到其他界面的Bug
\n- 修复百度源搜索结果为空时的接口处理Bug
\n- 恢复酷狗其他音质播放
\n
\n"},{"version":"0.6.1","desc":"新增
\n\n- 新增试听列表滚动条位置恢复设置(可自动恢复到上次离开时的列表滚动位置),本功能默认开启,若不需要可到设置-列表设置将其关闭
\n- 新增 《海贼王》 皮肤,喜欢个性化的可以试试~
\n
\n优化
\n\n- 新增DNS解析缓存,加快请求速度
\n- 优化代码逻辑,减少软件对系统资源的占用
\n- 优化新版本信息检测,尽量减少弹出版本获取失败弹窗弹出的概率
\n- 优化下拉列表动画效果
\n
\n修复
\n\n- 修复请求超时的逻辑处理Bug,尝试修复请求无法取消导致的正在播放的歌曲与界面显示的信息不一致的问题
\n- 修复其他一些小Bug
\n
\n移除
\n\n- 移除
192k 音质 \n- 移除酷我音源
ape 音质,无损推荐 flac 格式 \n
\n"},{"version":"0.6.0","desc":"新增
\n\n- 新增音乐聚合搜索,目前支持酷我、酷狗、百度源搜索
\n- 新增代理功能
\n
\n优化
\n\n- 优化从《梦里嫦娥》皮肤切换到其他皮肤时侧栏动画的切换效果
\n
\n修复
\n\n- 修复试听列表没有歌曲时会显示列表加载中的Bug
\n- 修复切换歌单列表详情时的UI Bug
\n
\n"},{"version":"0.5.5","desc":"新增
\n\n- 月是故乡明,祝大家中秋快乐🥮~~新增个性皮肤**《月里嫦娥》**,时间仓促,皮肤还不是很完善,可以试试喜不喜欢~😉
\n- 新增 MAC 版本退出快捷键支持
\n- 新增点击播放器中的歌曲标题可以复制标题的功能(遇到好听的歌曲方便分享)
\n
\n修复
\n\n- 修复 MAC 系统下软件关闭时再次从 dock 打开时报错的Bug
\n- 修复下载的歌曲文件名中包含命名规则不允许的符号时下载失败的问题(若歌曲名包含这些符号会自动将其移除)
\n- 修复 MAC 版本不能复制粘贴的问题
\n
\n"},{"version":"0.5.4","desc":"移除
\n\n- 下载的FLAC文件在修改歌曲信息后,软件无法播放,但使用本地播放器可以播放
\n- 为了稳妥起见,暂时移除FLAC格式的meta信息修改
\n- MP3格式无此问题
\n
\n"},{"version":"0.5.3","desc":"优化
\n\n修复
\n\n- 修复试听酷狗源的音乐仍然获取320k音质导致获取失败的Bug
\n
\n"},{"version":"0.5.2","desc":"新增
\n\n- 新增强迫症设置-离开搜索界面时是否清空搜索框
\n- 设置-关于板块新增常见问题链接
\n- 歌单左上角的分类按钮添加一个向下图标,方便识别该按钮为下拉框(该按钮可选择歌单类型,请自行尝试)
\n
\n优化
\n\n- 略微优化最小化按钮字符
\n- 优化试听列表的加载体验,当歌曲数过多时列表将延迟加载
\n
\n修复
\n\n移除
\n\n- 因接口失效,移除网易云音源,酷狗音源仅支持播放128k音质
\n
\n"},{"version":"0.5.1","desc":"新增
\n\n- 新增右上角最小化/关闭按钮鼠标滑过符号
\n- 新增下载列表定位文件按钮
\n
\n修复
\n\n- 修复百度源歌单全部分类无法加载的问题
\n- 修复更新弹窗无法弹出的问题
\n
\n"},{"version":"0.5.0","desc":"新增
\n\n- 新增封面嵌入(默认开启,可到设置-下载设置关闭)
\n- 新增歌词下载(默认关闭,可到设置-下载设置开启)
\n- 新增单例应用功能(实现软件单开功能,禁止软件多开)
\n
\n优化
\n\n修复
\n\n- 修复歌单无法翻页的问题
\n- 修复在某些情况下,添加下载歌曲导致下载列表崩溃的问题
\n- 修复版本更新弹窗Bug
\n- 修复酷狗歌单推荐歌单出现在其他分类中的Bug
\n
\n"},{"version":"0.4.0","desc":"新增
\n\n- 新增歌单功能,目前支持酷我、酷狗、百度源歌单
\n- 在设置界面-关于洛雪音乐说明部分新增最新版网盘下载地址与打赏地址
\n- 新增酷狗 电音热歌榜、DJ热歌榜
\n- 新增版本更新超时功能,对于部分无法访问GitHub的用户做更新超时提醒
\n
\n移除
\n\n- 注意:0.4.0以前的版本即将失效,请更新到0.4.0版本
\n
\n"},{"version":"0.3.5","desc":"新增
\n\n- 新增测试接口,该接口同样速度较慢,但软件的大部分功能可用,请自行切换到该接口,找接口辛苦,且用且珍惜!
\n
\n优化
\n\n- 取消需要刷新URL时windows任务栏进度显示错误状态(现显示为暂停状态)
\n
\n修复
\n\n- 修复使用临时接口时在试听列表双击灰色歌曲仍然会进行播放的Bug
\n- 修复歌词加载Bug
\n
\n"},{"version":"0.3.4","desc":"优化
\n\n- 减少接口不稳定带来的影响,适当增加请求等待时间
\n
\n修复
\n\n- 修复播放过程中URL过期不会刷新URL的问题
\n
\n"},{"version":"0.3.3","desc":"修复
\n\n- messoer的接口已经关闭,暂时切换到临时接口使用,部分功能受限。。。
\n- 修复设置界面更新出错时仍然显示更新下载中的问题
\n- 修复手动定位播放进度条时存在偏差的问题
\n- 屏蔽播放器中没有歌曲时对进度条的点击
\n
\n"},{"version":"0.3.2","desc":"新增
\n\n"},{"version":"0.3.1","desc":"修复
\n\n"},{"version":"0.3.0","desc":"新增
\n\n- 新增MAC及Linux版本(需要的可自行下载)
\n- 新增音量调整
\n- 新增任务栏播放进度条控制选项(现在可在设置界面关闭在任务栏显示的播放进度)
\n- 新增更新出错时的弹窗提示
\n- 从该版本起,非安装版也会有更新弹窗提醒了,但仍然需要手动下载新版本更新,版本信息可到设置页面查看
\n
\n修复
\n\n- 强制把临时接口设置回
messoer 接口 \n
\n"},{"version":"0.2.3","desc":"新增
\n\n- 新增任务栏程序标题改变功能(播放歌曲时任务栏标题将显示当前播放的歌曲)
\n
\n修复
\n\n- 使用临时接口时,试听列表中的下载按钮仍然能点击的Bug
\n- 修复某些情况下歌曲链接未能缓存的问题
\n
\n移除
\n\n- 移除临时接口(因服务器被攻击,本接口已关闭)
\n- 移除列表栏设置的隐藏专辑栏选项(感觉这个设置并没有什么luan用,并且还会打破布局)
\n
\n"},{"version":"0.2.2","desc":"修复
\n\n- 修复下载过程中出错重试5次都失败后不会自动开始下一个任务的Bug
\n- 修复播放到一半URL过期时不会刷新URL直接播放下一首的问题
\n
\n"},{"version":"0.2.1","desc":"优化
\n\n- 新增歌曲URL存储,当URL无效时才重新获取,以减少接口不稳定的影响
\n
\n修复
\n\n- 修复歌曲加载无法加载时自动切换混乱的Bug
\n- 修复移除列表最后一首歌曲时播放器不停止播放的问题
\n
\n"},{"version":"0.2.0","desc":"新增
\n\n- 新增百度音乐排行榜及其音乐直接试听与下载
\n- 新增网易云排行榜音乐直接试听与下载(目前仅支持128k音质)
\n- 新增酷狗排行榜音乐直接试听与下载(目前仅支持128k音质)
\n
\n修复
\n\n- 修复更新弹窗历史版本描述多余的换行问题
\n- 修复歌曲无法播放的情况下歌词仍会播放的问题
\n
\n"},{"version":"0.1.6","desc":"修复
\n\n"},{"version":"0.1.5","desc":"新增
\n\n- 新增搜索列表批量试听与下载功能
\n- 新增排行榜列表批量试听与下载功能
\n- 新增试听列表批量移除与下载功能
\n- 新增下载列表批量开始、暂停与移除功能
\n
\n优化
\n\n"},{"version":"0.1.4","desc":"新增
\n\n- 新增音乐来源切换,可到设置页面-基本设置 look look !
\n- 为搜索结果列表添加多选功能。
\nP.S:暂时没想好多选后的操作按钮放哪… \n
\n优化
\n\n- 重构与改进checkbox组件,使其支持不定选中状态
\n- 完善上一个版本的http请求封装并切换部分请求到该方法上
\n- 优化其他一些细节
\n
\n"},{"version":"0.1.3","desc":"新增
\n\n修复
\n\n- 修复安装包许可协议乱码问题
\n- messoer 提供的接口已挂,暂时切换到临时接口!
\n
\n移除
\n\n- 由于messoer接口无法使用,QQ音乐排行榜直接播放/下载功能暂时关闭
\n
\n"},{"version":"0.1.2","desc":"修复
\n\n"},{"version":"0.1.1","desc":"新增
\n\n- QQ音乐排行榜直接试听与下载(该接口貌似不太稳定,且用且珍惜!)
\n
\n优化
\n\n- 优化http请求机制
\n- 更新关于本软件说明
\n
\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")