+6. 若没有在第5条链接中的第一条评论中看到接口无法使用的说明,则应该是你网络无法访问接口服务器的问题,如果接口有问题我会在那里说明。
+
+想要知道是不是自己网络的问题可以看看`http://ts.tempmusic.tk`能不能在浏览器打开,浏览器显示404是正常的,如果不是404那就证明所在网络无法访问接口服务器。
+若网页无法打开或打来不是404,则应该是DNS的问题,可以尝试以下办法:
+
+1. 将DNS改成自动获取试试
+2. 手动把DNS改一下,不要用360的DNS,可以把DNS改成`114.114.114.114`、`8.8.8.8`
+
+## 列表多选
+
+长按列表将会进入多选模式。
+
+- 例子一:想要选中1-5项,进入多选模式后,取消所有选中的内容,切换到区间,点击第一项,再点击第五项即可完成选择;
+- 例子二:想要选中1项与第3项,进入多选模式后,点击第一项,再点击第三项即可完成选择;
+- 例子三:想要选中当前列表的全部内容,进入多选模式后,点击全选即可完成选择(注:由于**在线列表**使用分页加载,全选只会选择目前已加载的内容,若要完整选择整个在线列表的内容则需要往下滑动将列表加载完毕再进行全选)。
+
+注:选完后可用歌曲列表三个点的菜单操作已选的内容
+
+## 无法打开外部歌单
+
+不支持垮源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);
+对于分享出来的歌单,若打开失败,可尝试先在浏览器中打开后,再从浏览器地址栏复制URL地址到软件打开;
+或者如果你知道歌单 id 也可以直接输入歌单 id 打开。
+
+注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开
+
+## 播放整个歌单或排行榜
+
+播放在线列表内的歌曲需要将它们都添加到我的列表才能播放,你可以全选列表内的歌曲然后添加到现有列表或者新创建的列表,然后去播放该列表内的歌曲。
+
+## 无法打开外部歌单
+
+不支持垮源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);
+对于分享出来的歌单,若打开失败,可尝试先在浏览器中打开后,再从浏览器地址栏复制URL地址到软件打开;
+或者如果你知道歌单 id 也可以直接输入歌单 id 打开。
+
+
+## 同步功能的使用(实验性,首次使用前建议先备份一次列表)
+
+**注意:由于同步传输时的数据是明文传输,请在受信任的网络下使用此功能!**
+此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用方法:
+
+1. 在PC端的设置-数据同步开启同步功能(这时如果出现安全软件、防火墙等提示网络连接弹窗时需要点击允许)
+2. 在移动端的设置-同步-同步服务器地址输入PC端显示的同步服务器地址(如果显示可以多个,则输入与**移动端上显示的本机地址**最相似的那个),端口号与PC端的同步端口一致
+3. 输入完这两项后点击“启动同步”
+4. 若连接成功,对于首次同步时,若两边的设备的列表不为空,则PC端会弹出选择列表同步方式的弹窗,同步方式的说明弹窗下面有介绍
+
+对于连接同步失败的可能原因:
+
+- 此功能需要PC端与移动端都连接在同一个路由器下的网络才能使用
+- 路由器若开启了AP隔离,则此功能无法使用
+- 检查防火墙是否拦截了PC端的服务端口
+
+## 更新已收藏的在线歌单
+
+该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“更新”使用该功能,
+
+需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。
+
+## 杀毒软件提示有病毒或恶意行为
+
+本人只能保证我写的代码不包含任何**恶意代码**、**收集用户信息**的行为,并且软件代码已开源,请自行查阅,软件安装包也是由CI拉取源代码构建,构建日志:[GitHub Actions](https://github.com/lyswhut/lx-music-mobile/actions)
+尽管如此,但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时([供应链攻击](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/intelligence/supply-chain-malware)),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。
+当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。
+
+最后,若出现杀毒软件报毒、存在恶意行为,请自行判断选择是否继续使用本软件!
+
+
### Linux 下界面异常
根据Electron里issue的[解决方案](https://github.com/electron/electron/issues/2170#issuecomment-736223269),
diff --git a/build-config/renderer-lyric/webpack.config.base.js b/build-config/renderer-lyric/webpack.config.base.js
index dd9ba8ea..839149aa 100644
--- a/build-config/renderer-lyric/webpack.config.base.js
+++ b/build-config/renderer-lyric/webpack.config.base.js
@@ -97,26 +97,38 @@ module.exports = {
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'imgs/[name]--[folder].[ext]',
+ type: 'asset',
+ parser: {
+ dataUrlCondition: {
+ maxSize: 10000,
+ },
+ },
+ generator: {
+ filename: 'imgs/[name]-[contenthash:8][ext]',
},
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'media/[name]--[folder].[ext]',
+ type: 'asset',
+ parser: {
+ dataUrlCondition: {
+ maxSize: 10000,
+ },
+ },
+ generator: {
+ filename: 'media/[name]-[contenthash:8][ext]',
},
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'fonts/[name]--[folder].[ext]',
+ type: 'asset',
+ parser: {
+ dataUrlCondition: {
+ maxSize: 10000,
+ },
+ },
+ generator: {
+ filename: 'fonts/[name]-[contenthash:8][ext]',
},
},
],
diff --git a/build-config/renderer/webpack.config.base.js b/build-config/renderer/webpack.config.base.js
index 5d330a53..f9ba81db 100644
--- a/build-config/renderer/webpack.config.base.js
+++ b/build-config/renderer/webpack.config.base.js
@@ -97,26 +97,38 @@ module.exports = {
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'imgs/[name]--[folder].[ext]',
+ type: 'asset',
+ parser: {
+ dataUrlCondition: {
+ maxSize: 10000,
+ },
+ },
+ generator: {
+ filename: 'imgs/[name]-[contenthash:8][ext]',
},
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'media/[name]--[folder].[ext]',
+ type: 'asset',
+ parser: {
+ dataUrlCondition: {
+ maxSize: 10000,
+ },
+ },
+ generator: {
+ filename: 'media/[name]-[contenthash:8][ext]',
},
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
- loader: 'url-loader',
- options: {
- limit: 10000,
- name: 'fonts/[name]--[folder].[ext]',
+ type: 'asset',
+ parser: {
+ dataUrlCondition: {
+ maxSize: 10000,
+ },
+ },
+ generator: {
+ filename: 'fonts/[name]-[contenthash:8][ext]',
},
},
],
diff --git a/package-lock.json b/package-lock.json
index 2adfe7b4..1e0399b1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
- "version": "1.10.2",
+ "version": "1.12.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -20,26 +20,26 @@
}
},
"@babel/compat-data": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz",
- "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz",
+ "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==",
"dev": true
},
"@babel/core": {
- "version": "7.14.6",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz",
- "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz",
+ "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.14.5",
- "@babel/generator": "^7.14.5",
- "@babel/helper-compilation-targets": "^7.14.5",
- "@babel/helper-module-transforms": "^7.14.5",
- "@babel/helpers": "^7.14.6",
- "@babel/parser": "^7.14.6",
+ "@babel/generator": "^7.15.0",
+ "@babel/helper-compilation-targets": "^7.15.0",
+ "@babel/helper-module-transforms": "^7.15.0",
+ "@babel/helpers": "^7.14.8",
+ "@babel/parser": "^7.15.0",
"@babel/template": "^7.14.5",
- "@babel/traverse": "^7.14.5",
- "@babel/types": "^7.14.5",
+ "@babel/traverse": "^7.15.0",
+ "@babel/types": "^7.15.0",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -58,12 +58,12 @@
}
},
"@babel/generator": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz",
- "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz",
+ "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.14.5",
+ "@babel/types": "^7.15.0",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
@@ -88,6 +88,52 @@
"@babel/types": "^7.14.5"
}
},
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz",
+ "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.15.0"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz",
+ "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.15.0",
+ "@babel/helper-simple-access": "^7.14.8",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.15.0",
+ "@babel/types": "^7.15.0"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz",
+ "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.15.0",
+ "@babel/helper-optimise-call-expression": "^7.14.5",
+ "@babel/traverse": "^7.15.0",
+ "@babel/types": "^7.15.0"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.14.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz",
+ "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.8"
+ }
+ },
"@babel/helper-split-export-declaration": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
@@ -98,9 +144,9 @@
}
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/highlight": {
@@ -115,9 +161,9 @@
}
},
"@babel/parser": {
- "version": "7.14.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz",
- "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz",
+ "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==",
"dev": true
},
"@babel/template": {
@@ -132,29 +178,29 @@
}
},
"@babel/traverse": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz",
- "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz",
+ "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.14.5",
- "@babel/generator": "^7.14.5",
+ "@babel/generator": "^7.15.0",
"@babel/helper-function-name": "^7.14.5",
"@babel/helper-hoist-variables": "^7.14.5",
"@babel/helper-split-export-declaration": "^7.14.5",
- "@babel/parser": "^7.14.5",
- "@babel/types": "^7.14.5",
+ "@babel/parser": "^7.15.0",
+ "@babel/types": "^7.15.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
},
@@ -221,30 +267,30 @@
},
"dependencies": {
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
}
}
},
"@babel/helper-compilation-targets": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz",
- "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz",
+ "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.14.5",
+ "@babel/compat-data": "^7.15.0",
"@babel/helper-validator-option": "^7.14.5",
"browserslist": "^4.16.6",
"semver": "^6.3.0"
@@ -395,12 +441,12 @@
}
},
"@babel/generator": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz",
- "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz",
+ "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.14.5",
+ "@babel/types": "^7.15.0",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
@@ -441,9 +487,9 @@
}
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/highlight": {
@@ -458,9 +504,9 @@
}
},
"@babel/parser": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.5.tgz",
- "integrity": "sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz",
+ "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==",
"dev": true
},
"@babel/template": {
@@ -475,29 +521,29 @@
}
},
"@babel/traverse": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz",
- "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz",
+ "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.14.5",
- "@babel/generator": "^7.14.5",
+ "@babel/generator": "^7.15.0",
"@babel/helper-function-name": "^7.14.5",
"@babel/helper-hoist-variables": "^7.14.5",
"@babel/helper-split-export-declaration": "^7.14.5",
- "@babel/parser": "^7.14.5",
- "@babel/types": "^7.14.5",
+ "@babel/parser": "^7.15.0",
+ "@babel/types": "^7.15.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
},
@@ -524,18 +570,18 @@
},
"dependencies": {
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
}
@@ -826,18 +872,18 @@
},
"dependencies": {
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
}
@@ -1015,18 +1061,18 @@
},
"dependencies": {
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
}
@@ -1075,12 +1121,12 @@
}
},
"@babel/generator": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz",
- "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz",
+ "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.14.5",
+ "@babel/types": "^7.15.0",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
@@ -1115,9 +1161,9 @@
}
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/highlight": {
@@ -1132,9 +1178,9 @@
}
},
"@babel/parser": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz",
- "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz",
+ "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==",
"dev": true
},
"@babel/template": {
@@ -1149,29 +1195,29 @@
}
},
"@babel/traverse": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz",
- "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz",
+ "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.14.5",
- "@babel/generator": "^7.14.5",
+ "@babel/generator": "^7.15.0",
"@babel/helper-function-name": "^7.14.5",
"@babel/helper-hoist-variables": "^7.14.5",
"@babel/helper-split-export-declaration": "^7.14.5",
- "@babel/parser": "^7.14.7",
- "@babel/types": "^7.14.5",
+ "@babel/parser": "^7.15.0",
+ "@babel/types": "^7.15.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
},
@@ -1189,14 +1235,14 @@
}
},
"@babel/helpers": {
- "version": "7.14.6",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz",
- "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==",
+ "version": "7.14.8",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz",
+ "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==",
"dev": true,
"requires": {
"@babel/template": "^7.14.5",
- "@babel/traverse": "^7.14.5",
- "@babel/types": "^7.14.5"
+ "@babel/traverse": "^7.14.8",
+ "@babel/types": "^7.14.8"
},
"dependencies": {
"@babel/code-frame": {
@@ -1209,12 +1255,12 @@
}
},
"@babel/generator": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz",
- "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz",
+ "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.14.5",
+ "@babel/types": "^7.15.0",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
@@ -1249,9 +1295,9 @@
}
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/highlight": {
@@ -1266,9 +1312,9 @@
}
},
"@babel/parser": {
- "version": "7.14.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.6.tgz",
- "integrity": "sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz",
+ "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==",
"dev": true
},
"@babel/template": {
@@ -1283,29 +1329,29 @@
}
},
"@babel/traverse": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz",
- "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz",
+ "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.14.5",
- "@babel/generator": "^7.14.5",
+ "@babel/generator": "^7.15.0",
"@babel/helper-function-name": "^7.14.5",
"@babel/helper-hoist-variables": "^7.14.5",
"@babel/helper-split-export-declaration": "^7.14.5",
- "@babel/parser": "^7.14.5",
- "@babel/types": "^7.14.5",
+ "@babel/parser": "^7.15.0",
+ "@babel/types": "^7.15.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
},
@@ -1372,9 +1418,9 @@
}
},
"@babel/plugin-proposal-async-generator-functions": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz",
- "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz",
+ "integrity": "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.14.5",
@@ -1548,12 +1594,6 @@
"@babel/plugin-transform-parameters": "^7.14.5"
},
"dependencies": {
- "@babel/compat-data": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz",
- "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==",
- "dev": true
- },
"@babel/helper-plugin-utils": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
@@ -1900,9 +1940,9 @@
}
},
"@babel/plugin-transform-classes": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz",
- "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz",
+ "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==",
"dev": true,
"requires": {
"@babel/helper-annotate-as-pure": "^7.14.5",
@@ -1959,9 +1999,9 @@
}
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/highlight": {
@@ -1976,9 +2016,9 @@
}
},
"@babel/parser": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz",
- "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz",
+ "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==",
"dev": true
},
"@babel/template": {
@@ -1993,12 +2033,12 @@
}
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
},
@@ -2165,9 +2205,9 @@
"dev": true
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/highlight": {
@@ -2182,9 +2222,9 @@
}
},
"@babel/parser": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz",
- "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz",
+ "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==",
"dev": true
},
"@babel/template": {
@@ -2199,12 +2239,12 @@
}
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
},
@@ -2275,22 +2315,189 @@
}
},
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz",
- "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz",
+ "integrity": "sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.14.5",
+ "@babel/helper-module-transforms": "^7.15.0",
"@babel/helper-plugin-utils": "^7.14.5",
- "@babel/helper-simple-access": "^7.14.5",
+ "@babel/helper-simple-access": "^7.14.8",
"babel-plugin-dynamic-import-node": "^2.3.3"
},
"dependencies": {
+ "@babel/code-frame": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.14.5"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz",
+ "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.15.0",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
+ "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
+ "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz",
+ "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.15.0"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz",
+ "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.15.0",
+ "@babel/helper-simple-access": "^7.14.8",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.15.0",
+ "@babel/types": "^7.15.0"
+ }
+ },
"@babel/helper-plugin-utils": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
"integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
"dev": true
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz",
+ "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.15.0",
+ "@babel/helper-optimise-call-expression": "^7.14.5",
+ "@babel/traverse": "^7.15.0",
+ "@babel/types": "^7.15.0"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.14.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz",
+ "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.8"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
+ "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz",
+ "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
+ "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.14.5",
+ "@babel/parser": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz",
+ "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.14.5",
+ "@babel/generator": "^7.15.0",
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/helper-hoist-variables": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/parser": "^7.15.0",
+ "@babel/types": "^7.15.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.9",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
}
}
},
@@ -2314,9 +2521,9 @@
"dev": true
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
}
}
@@ -2340,9 +2547,9 @@
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz",
- "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz",
+ "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==",
"dev": true,
"requires": {
"@babel/helper-create-regexp-features-plugin": "^7.14.5"
@@ -2444,9 +2651,9 @@
}
},
"@babel/plugin-transform-runtime": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz",
- "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz",
+ "integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.14.5",
@@ -2605,17 +2812,17 @@
}
},
"@babel/preset-env": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz",
- "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz",
+ "integrity": "sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.14.7",
- "@babel/helper-compilation-targets": "^7.14.5",
+ "@babel/compat-data": "^7.15.0",
+ "@babel/helper-compilation-targets": "^7.15.0",
"@babel/helper-plugin-utils": "^7.14.5",
"@babel/helper-validator-option": "^7.14.5",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5",
- "@babel/plugin-proposal-async-generator-functions": "^7.14.7",
+ "@babel/plugin-proposal-async-generator-functions": "^7.14.9",
"@babel/plugin-proposal-class-properties": "^7.14.5",
"@babel/plugin-proposal-class-static-block": "^7.14.5",
"@babel/plugin-proposal-dynamic-import": "^7.14.5",
@@ -2648,7 +2855,7 @@
"@babel/plugin-transform-async-to-generator": "^7.14.5",
"@babel/plugin-transform-block-scoped-functions": "^7.14.5",
"@babel/plugin-transform-block-scoping": "^7.14.5",
- "@babel/plugin-transform-classes": "^7.14.5",
+ "@babel/plugin-transform-classes": "^7.14.9",
"@babel/plugin-transform-computed-properties": "^7.14.5",
"@babel/plugin-transform-destructuring": "^7.14.7",
"@babel/plugin-transform-dotall-regex": "^7.14.5",
@@ -2659,10 +2866,10 @@
"@babel/plugin-transform-literals": "^7.14.5",
"@babel/plugin-transform-member-expression-literals": "^7.14.5",
"@babel/plugin-transform-modules-amd": "^7.14.5",
- "@babel/plugin-transform-modules-commonjs": "^7.14.5",
+ "@babel/plugin-transform-modules-commonjs": "^7.15.0",
"@babel/plugin-transform-modules-systemjs": "^7.14.5",
"@babel/plugin-transform-modules-umd": "^7.14.5",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9",
"@babel/plugin-transform-new-target": "^7.14.5",
"@babel/plugin-transform-object-super": "^7.14.5",
"@babel/plugin-transform-parameters": "^7.14.5",
@@ -2677,20 +2884,14 @@
"@babel/plugin-transform-unicode-escapes": "^7.14.5",
"@babel/plugin-transform-unicode-regex": "^7.14.5",
"@babel/preset-modules": "^0.1.4",
- "@babel/types": "^7.14.5",
+ "@babel/types": "^7.15.0",
"babel-plugin-polyfill-corejs2": "^0.2.2",
"babel-plugin-polyfill-corejs3": "^0.2.2",
"babel-plugin-polyfill-regenerator": "^0.2.2",
- "core-js-compat": "^3.15.0",
+ "core-js-compat": "^3.16.0",
"semver": "^6.3.0"
},
"dependencies": {
- "@babel/compat-data": {
- "version": "7.14.7",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz",
- "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==",
- "dev": true
- },
"@babel/helper-plugin-utils": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
@@ -2698,38 +2899,20 @@
"dev": true
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
+ "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
"dev": true
},
"@babel/types": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
- "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
+ "version": "7.15.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
+ "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.9",
"to-fast-properties": "^2.0.0"
}
- },
- "core-js-compat": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.1.tgz",
- "integrity": "sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww==",
- "dev": true,
- "requires": {
- "browserslist": "^4.16.6",
- "semver": "7.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
- "dev": true
- }
- }
}
}
},
@@ -2747,9 +2930,9 @@
}
},
"@babel/runtime": {
- "version": "7.14.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz",
- "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==",
+ "version": "7.14.8",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
+ "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
"dev": true,
"requires": {
"regenerator-runtime": "^0.13.4"
@@ -2896,9 +3079,9 @@
}
},
"@eslint/eslintrc": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz",
- "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==",
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
@@ -2925,9 +3108,9 @@
}
},
"globals": {
- "version": "13.9.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
- "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
+ "version": "13.10.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz",
+ "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@@ -3068,6 +3251,21 @@
"integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==",
"dev": true
},
+ "@types/component-emitter": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
+ "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
+ },
+ "@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+ },
+ "@types/cors": {
+ "version": "2.8.12",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
+ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
+ },
"@types/debug": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz",
@@ -3146,8 +3344,7 @@
"@types/node": {
"version": "13.11.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz",
- "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==",
- "dev": true
+ "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ=="
},
"@types/parse-json": {
"version": "4.0.0",
@@ -3194,21 +3391,44 @@
"dev": true
},
"@vue/component-compiler-utils": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.1.tgz",
- "integrity": "sha512-Mci9WJYLRjyJEBkGHMPxZ1ihJ9l6gOy2Gr6hpYZUNpQoe5+nbpeb3w00aP+PSHJygCF+fxJsqp7Af1zGDITzuw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz",
+ "integrity": "sha512-rAYMLmgMuqJFWAOb3Awjqqv5X3Q3hVr4jH/kgrFJpiU0j3a90tnNBplqbj+snzrgZhC9W128z+dtgMifOiMfJg==",
"dev": true,
"requires": {
"consolidate": "^0.15.1",
"hash-sum": "^1.0.2",
"lru-cache": "^4.1.2",
"merge-source-map": "^1.1.0",
+ "postcss": "^7.0.36",
"postcss-selector-parser": "^6.0.2",
"prettier": "^1.18.2",
"source-map": "~0.6.1",
"vue-template-es2015-compiler": "^1.9.0"
},
"dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
@@ -3219,12 +3439,32 @@
"yallist": "^2.1.2"
}
},
+ "postcss": {
+ "version": "7.0.36",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz",
+ "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ }
+ },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
@@ -3416,7 +3656,6 @@
"version": "1.3.7",
"resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz",
"integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
- "dev": true,
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
@@ -3428,10 +3667,16 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
+ "acorn-import-assertions": {
+ "version": "1.7.6",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz",
+ "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==",
+ "dev": true
+ },
"acorn-jsx": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
- "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true
},
"aggregate-error": {
@@ -3569,6 +3814,11 @@
"color-convert": "^1.9.0"
}
},
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
+ },
"app-builder-bin": {
"version": "3.5.13",
"resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.13.tgz",
@@ -3892,100 +4142,6 @@
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
"integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
},
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
- "dev": true
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "babel-core": {
- "version": "6.26.3",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
- "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-helpers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "convert-source-map": "^1.5.1",
- "debug": "^2.6.9",
- "json5": "^0.5.1",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4",
- "path-is-absolute": "^1.0.1",
- "private": "^0.1.8",
- "slash": "^1.0.0",
- "source-map": "^0.5.7"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
"babel-eslint": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
@@ -4000,82 +4156,12 @@
"resolve": "^1.12.0"
}
},
- "babel-generator": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
- "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
- "dev": true,
- "requires": {
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "detect-indent": "^4.0.0",
- "jsesc": "^1.3.0",
- "lodash": "^4.17.4",
- "source-map": "^0.5.7",
- "trim-right": "^1.0.1"
- },
- "dependencies": {
- "jsesc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
- "dev": true
- }
- }
- },
- "babel-helper-evaluate-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz",
- "integrity": "sha512-dRFlMTqUJRGzx5a2smKxmptDdNCXKSkPcXWzKLwAV72hvIZumrd/0z9RcewHkr7PmAEq+ETtpD1GK6wZ6ZUXzw==",
- "dev": true
- },
- "babel-helper-flip-expressions": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz",
- "integrity": "sha512-kNGohWmtAG3b7tN1xocRQ5rsKkH/hpvZsMiGOJ1VwGJKhnwzR5KlB3rvKBaBPl5/IGHcopB2JN+r1SUEX1iMAw==",
- "dev": true
- },
"babel-helper-is-nodes-equiv": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
"integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
"dev": true
},
- "babel-helper-is-void-0": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz",
- "integrity": "sha512-JVqdX8y7Rf/x4NwbqtUI7mdQjL9HWoDnoAEQ8Gv8oxzjvbJv+n75f7l36m9Y8C7sCUltX3V5edndrp7Hp1oSXQ==",
- "dev": true
- },
- "babel-helper-mark-eval-scopes": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz",
- "integrity": "sha512-nrho5Dg4vl0VUgURVpGpEGiwbst5JX7efIyDHFxmkCx/ocQFnrPt8ze9Kxl6TKjR29bJ7D/XKY1NMlSxOQJRbQ==",
- "dev": true
- },
- "babel-helper-remove-or-void": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz",
- "integrity": "sha512-D68W1M3ibCcbg0ysh3ww4/O0g10X1CXK720oOuR8kpfY7w0yP4tVcpK7zDmI1JecynycTQYAZ1rhLJo9aVtIKQ==",
- "dev": true
- },
- "babel-helper-to-multiple-sequence-expressions": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz",
- "integrity": "sha512-1uCrBD+EAaMnAYh7hc944n8Ga19y3daEnoXWPYDvFVsxMCc1l8aDjksApaCEaNSSuewq8BEcff47Cy1PbLg2Gw==",
- "dev": true
- },
- "babel-helpers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
"babel-loader": {
"version": "8.2.2",
"resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.2.2.tgz?cache=0&sync_timestamp=1606424508891&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-loader%2Fdownload%2Fbabel-loader-8.2.2.tgz",
@@ -4153,59 +4239,6 @@
}
}
},
- "babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-minify-webpack-plugin": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/babel-minify-webpack-plugin/-/babel-minify-webpack-plugin-0.3.1.tgz",
- "integrity": "sha512-Johg6Ju0Gxevk2R55eutMqnyXwlyUzCtwunBpiyNzoxGnKum+x5nfNuYZYHGd5Bmc1gmhjwzb7GkxHWOtYWmtQ==",
- "dev": true,
- "requires": {
- "babel-core": "^6.26.0",
- "babel-preset-minify": "^0.3.0",
- "webpack-sources": "^1.0.1"
- },
- "dependencies": {
- "babel-preset-minify": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz",
- "integrity": "sha512-+VV2GWEyak3eDOmzT1DDMuqHrw3VbE9nBNkx2LLVs4pH/Me32ND8DRpVDd8IRvk1xX5p75nygyRPtkMh6GIAbQ==",
- "dev": true,
- "requires": {
- "babel-plugin-minify-builtins": "^0.3.0",
- "babel-plugin-minify-constant-folding": "^0.3.0",
- "babel-plugin-minify-dead-code-elimination": "^0.3.0",
- "babel-plugin-minify-flip-comparisons": "^0.3.0",
- "babel-plugin-minify-guarded-expressions": "^0.3.0",
- "babel-plugin-minify-infinity": "^0.3.0",
- "babel-plugin-minify-mangle-names": "^0.3.0",
- "babel-plugin-minify-numeric-literals": "^0.3.0",
- "babel-plugin-minify-replace": "^0.3.0",
- "babel-plugin-minify-simplify": "^0.3.0",
- "babel-plugin-minify-type-constructors": "^0.3.0",
- "babel-plugin-transform-inline-consecutive-adds": "^0.3.0",
- "babel-plugin-transform-member-expression-literals": "^6.9.0",
- "babel-plugin-transform-merge-sibling-variables": "^6.9.0",
- "babel-plugin-transform-minify-booleans": "^6.9.0",
- "babel-plugin-transform-property-literals": "^6.9.0",
- "babel-plugin-transform-regexp-constructors": "^0.3.0",
- "babel-plugin-transform-remove-console": "^6.9.0",
- "babel-plugin-transform-remove-debugger": "^6.9.0",
- "babel-plugin-transform-remove-undefined": "^0.3.0",
- "babel-plugin-transform-simplify-comparison-operators": "^6.9.0",
- "babel-plugin-transform-undefined-to-void": "^6.9.0",
- "lodash.isplainobject": "^4.0.6"
- }
- }
- }
- },
"babel-plugin-dynamic-import-node": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
@@ -4215,101 +4248,6 @@
"object.assign": "^4.1.0"
}
},
- "babel-plugin-minify-builtins": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz",
- "integrity": "sha512-MqhSHlxkmgURqj3144qPksbZ/qof1JWdumcbucc4tysFcf3P3V3z3munTevQgKEFNMd8F5/ECGnwb63xogLjAg==",
- "dev": true,
- "requires": {
- "babel-helper-evaluate-path": "^0.3.0"
- }
- },
- "babel-plugin-minify-constant-folding": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz",
- "integrity": "sha512-1XeRpx+aY1BuNY6QU/cm6P+FtEi3ar3XceYbmC+4q4W+2Ewq5pL7V68oHg1hKXkBIE0Z4/FjSoHz6vosZLOe/A==",
- "dev": true,
- "requires": {
- "babel-helper-evaluate-path": "^0.3.0"
- }
- },
- "babel-plugin-minify-dead-code-elimination": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz",
- "integrity": "sha512-SjM2Fzg85YZz+q/PNJ/HU4O3W98FKFOiP9K5z3sfonlamGOzvZw3Eup2OTiEBsbbqTeY8yzNCAv3qpJRYCgGmw==",
- "dev": true,
- "requires": {
- "babel-helper-evaluate-path": "^0.3.0",
- "babel-helper-mark-eval-scopes": "^0.3.0",
- "babel-helper-remove-or-void": "^0.3.0",
- "lodash.some": "^4.6.0"
- }
- },
- "babel-plugin-minify-flip-comparisons": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz",
- "integrity": "sha512-B8lK+ekcpSNVH7PZpWDe5nC5zxjRiiT4nTsa6h3QkF3Kk6y9qooIFLemdGlqBq6j0zALEnebvCpw8v7gAdpgnw==",
- "dev": true,
- "requires": {
- "babel-helper-is-void-0": "^0.3.0"
- }
- },
- "babel-plugin-minify-guarded-expressions": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz",
- "integrity": "sha512-O+6CvF5/Ttsth3LMg4/BhyvVZ82GImeKMXGdVRQGK/8jFiP15EjRpdgFlxv3cnqRjqdYxLCS6r28VfLpb9C/kA==",
- "dev": true,
- "requires": {
- "babel-helper-flip-expressions": "^0.3.0"
- }
- },
- "babel-plugin-minify-infinity": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz",
- "integrity": "sha512-Sj8ia3/w9158DWieUxU6/VvnYVy59geeFEkVgLZYBE8EBP+sN48tHtBM/jSgz0ejEdBlcfqJ6TnvPmVXTzR2BQ==",
- "dev": true
- },
- "babel-plugin-minify-mangle-names": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz",
- "integrity": "sha512-PYTonhFWURsfAN8achDwvR5Xgy6EeTClLz+fSgGRqjAIXb0OyFm3/xfccbQviVi1qDXmlSnt6oJhBg8KE4Fn7Q==",
- "dev": true,
- "requires": {
- "babel-helper-mark-eval-scopes": "^0.3.0"
- }
- },
- "babel-plugin-minify-numeric-literals": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz",
- "integrity": "sha512-TgZj6ay8zDw74AS3yiIfoQ8vRSNJisYO/Du60S8nPV7EW7JM6fDMx5Sar6yVHlVuuwNgvDUBh191K33bVrAhpg==",
- "dev": true
- },
- "babel-plugin-minify-replace": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz",
- "integrity": "sha512-VR6tTg2Lt0TicHIOw04fsUtpPw7RaRP8PC8YzSFwEixnzvguZjZJoL7TgG7ZyEWQD1cJ96UezswECmFNa815bg==",
- "dev": true
- },
- "babel-plugin-minify-simplify": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz",
- "integrity": "sha512-2M16ytQOCqBi7bYMu4DCWn8e6KyFCA108F6+tVrBJxOmm5u2sOmTFEa8s94tR9RHRRNYmcUf+rgidfnzL3ik9Q==",
- "dev": true,
- "requires": {
- "babel-helper-flip-expressions": "^0.3.0",
- "babel-helper-is-nodes-equiv": "^0.0.1",
- "babel-helper-to-multiple-sequence-expressions": "^0.3.0"
- }
- },
- "babel-plugin-minify-type-constructors": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz",
- "integrity": "sha512-XRXpvsUCPeVw9YEUw+9vSiugcSZfow81oIJT0yR9s8H4W7yJ6FHbImi5DJHoL8KcDUjYnL9wYASXk/fOkbyR6Q==",
- "dev": true,
- "requires": {
- "babel-helper-is-void-0": "^0.3.0"
- }
- },
"babel-plugin-polyfill-corejs2": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz",
@@ -4322,13 +4260,13 @@
}
},
"babel-plugin-polyfill-corejs3": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz",
- "integrity": "sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A==",
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz",
+ "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==",
"dev": true,
"requires": {
"@babel/helper-define-polyfill-provider": "^0.2.2",
- "core-js-compat": "^3.9.1"
+ "core-js-compat": "^3.14.0"
}
},
"babel-plugin-polyfill-regenerator": {
@@ -4340,12 +4278,6 @@
"@babel/helper-define-polyfill-provider": "^0.2.2"
}
},
- "babel-plugin-transform-inline-consecutive-adds": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz",
- "integrity": "sha512-iZsYAIjYLLfLK0yN5WVT7Xf7Y3wQ9Z75j9A8q/0IglQSpUt2ppTdHlwl/GeaXnxdaSmsxBu861klbTBbv2n+RA==",
- "dev": true
- },
"babel-plugin-transform-member-expression-literals": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz",
@@ -4373,12 +4305,6 @@
"esutils": "^2.0.2"
}
},
- "babel-plugin-transform-regexp-constructors": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz",
- "integrity": "sha512-h92YHzyl042rb0naKO8frTHntpRFwRgKkfWD8602kFHoQingjJNtbvZzvxqHncJ6XmKVyYvfrBpDOSkCTDIIxw==",
- "dev": true
- },
"babel-plugin-transform-remove-console": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz",
@@ -4391,15 +4317,6 @@
"integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=",
"dev": true
},
- "babel-plugin-transform-remove-undefined": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz",
- "integrity": "sha512-TYGQucc8iP3LJwN3kDZLEz5aa/2KuFrqpT+s8f8NnHsBU1sAgR3y8Opns0xhC+smyDYWscqFCKM1gbkWQOhhnw==",
- "dev": true,
- "requires": {
- "babel-helper-evaluate-path": "^0.3.0"
- }
- },
"babel-plugin-transform-simplify-comparison-operators": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz",
@@ -4602,126 +4519,6 @@
}
}
},
- "babel-register": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
- "dev": true,
- "requires": {
- "babel-core": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "core-js": "^2.5.0",
- "home-or-tmp": "^2.0.0",
- "lodash": "^4.17.4",
- "mkdirp": "^0.5.1",
- "source-map-support": "^0.4.15"
- },
- "dependencies": {
- "core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
- "dev": true
- }
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "dev": true,
- "requires": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- },
- "dependencies": {
- "core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
- "dev": true
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
- "dev": true
- }
- }
- },
- "babel-template": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-traverse": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "debug": "^2.6.8",
- "globals": "^9.18.0",
- "invariant": "^2.2.2",
- "lodash": "^4.17.4"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "esutils": "^2.0.2",
- "lodash": "^4.17.4",
- "to-fast-properties": "^1.0.3"
- },
- "dependencies": {
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
- "dev": true
- }
- }
- },
"babel-walk": {
"version": "3.0.0-canary-5",
"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
@@ -4750,12 +4547,6 @@
}
}
},
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true
- },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -4777,6 +4568,11 @@
"pascalcase": "^0.1.1"
}
},
+ "base64-arraybuffer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+ "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
+ },
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -4784,6 +4580,11 @@
"dev": true,
"optional": true
},
+ "base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
+ },
"batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
@@ -4908,9 +4709,7 @@
"boolean": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.2.tgz",
- "integrity": "sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw==",
- "dev": true,
- "optional": true
+ "integrity": "sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw=="
},
"boxen": {
"version": "5.0.1",
@@ -4962,22 +4761,22 @@
}
},
"browserslist": {
- "version": "4.16.6",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
- "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
+ "version": "4.16.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz",
+ "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001219",
+ "caniuse-lite": "^1.0.30001248",
"colorette": "^1.2.2",
- "electron-to-chromium": "^1.3.723",
+ "electron-to-chromium": "^1.3.793",
"escalade": "^3.1.1",
- "node-releases": "^1.1.71"
+ "node-releases": "^1.1.73"
},
"dependencies": {
"caniuse-lite": {
- "version": "1.0.30001228",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz",
- "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==",
+ "version": "1.0.30001248",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz",
+ "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==",
"dev": true
}
}
@@ -5017,6 +4816,14 @@
"integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=",
"dev": true
},
+ "bufferutil": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz",
+ "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==",
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
"builder-util": {
"version": "22.11.7",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.11.7.tgz",
@@ -5160,6 +4967,15 @@
"unset-value": "^1.0.0"
}
},
+ "cache-content-type": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz",
+ "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==",
+ "requires": {
+ "mime-types": "^2.1.18",
+ "ylru": "^1.2.0"
+ }
+ },
"cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npm.taobao.org/cacheable-request/download/cacheable-request-6.1.0.tgz",
@@ -5266,9 +5082,9 @@
}
},
"chalk": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
- "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -5570,6 +5386,11 @@
"mimic-response": "^1.0.0"
}
},
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -5636,8 +5457,7 @@
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
},
"compressible": {
"version": "2.0.18",
@@ -5822,7 +5642,6 @@
"version": "0.5.3",
"resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz",
"integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=",
- "dev": true,
"requires": {
"safe-buffer": "5.1.2"
},
@@ -5830,21 +5649,19 @@
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz",
- "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=",
- "dev": true
+ "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
}
}
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz",
- "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=",
- "dev": true
+ "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
},
"convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.1"
@@ -5870,6 +5687,22 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
"dev": true
},
+ "cookies": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz",
+ "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==",
+ "requires": {
+ "depd": "~2.0.0",
+ "keygrip": "~1.1.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ }
+ }
+ },
"copy-anything": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz",
@@ -6016,15 +5849,15 @@
}
},
"core-js": {
- "version": "3.15.2",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz",
- "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q==",
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz",
+ "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==",
"dev": true
},
"core-js-compat": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.14.0.tgz",
- "integrity": "sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A==",
+ "version": "3.16.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.0.tgz",
+ "integrity": "sha512-5D9sPHCdewoUK7pSUPfTF7ZhLh8k9/CoJXWUEo+F1dZT5Z1DVgcuRqUKhjeKW+YLb8f21rTFgWwQJiNw1hoZ5Q==",
"dev": true,
"requires": {
"browserslist": "^4.16.6",
@@ -6044,6 +5877,15 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
"cosmiconfig": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
@@ -6102,9 +5944,9 @@
}
},
"crypto-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz",
- "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg=="
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
},
"crypto-random-string": {
"version": "2.0.0",
@@ -6148,69 +5990,21 @@
}
},
"css-loader": {
- "version": "5.2.7",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz",
- "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.2.0.tgz",
+ "integrity": "sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g==",
"dev": true,
"requires": {
"icss-utils": "^5.1.0",
- "loader-utils": "^2.0.0",
"postcss": "^8.2.15",
"postcss-modules-extract-imports": "^3.0.0",
"postcss-modules-local-by-default": "^4.0.0",
"postcss-modules-scope": "^3.0.0",
"postcss-modules-values": "^4.0.0",
"postcss-value-parser": "^4.1.0",
- "schema-utils": "^3.0.0",
"semver": "^7.3.5"
},
"dependencies": {
- "@types/json-schema": {
- "version": "7.0.8",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz",
- "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==",
- "dev": true
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true
- },
- "loader-utils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
- "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- }
- },
- "schema-utils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz",
- "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.7",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- },
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@@ -6492,6 +6286,11 @@
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+ },
"default-gateway": {
"version": "4.2.0",
"resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-4.2.0.tgz?cache=0&sync_timestamp=1598471816842&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdefault-gateway%2Fdownload%2Fdefault-gateway-4.2.0.tgz",
@@ -6512,7 +6311,6 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
"requires": {
"object-keys": "^1.0.12"
}
@@ -6556,31 +6354,30 @@
}
}
},
+ "delay": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz",
+ "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="
+ },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+ },
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
- "dev": true
- },
- "detect-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"detect-node": {
"version": "2.0.4",
@@ -6859,8 +6656,12 @@
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
- "dev": true
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "eiows": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/eiows/-/eiows-3.6.1.tgz",
+ "integrity": "sha512-BvTdSAMiRZ7+2xpJNJ+Q6pCbH83ZwJf1kXKKaSPsj297IIUpiY8t6YpvAZKxZet6Ags9okWuCEGu9el+0HKnHg=="
},
"ejs": {
"version": "3.1.6",
@@ -6872,9 +6673,9 @@
}
},
"electron": {
- "version": "13.1.7",
- "resolved": "https://registry.npmjs.org/electron/-/electron-13.1.7.tgz",
- "integrity": "sha512-sVfpP/0s6a82FK32LMuEe9L+aWZw15u3uYn9xUJArPjy4OZHteE6yM5871YCNXNiDnoCLQ5eqQWipiVgHsf8nQ==",
+ "version": "13.1.8",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-13.1.8.tgz",
+ "integrity": "sha512-ei2ZyyG81zUOlvm5Zxri668TdH5GNLY0wF+XrC2FRCqa8AABAPjJIWTRkhFEr/H6PDVPNZjMPvSs3XhHyVVk2g==",
"dev": true,
"requires": {
"@electron/get": "^1.0.1",
@@ -6883,9 +6684,9 @@
},
"dependencies": {
"@types/node": {
- "version": "14.17.5",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz",
- "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA==",
+ "version": "14.17.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.9.tgz",
+ "integrity": "sha512-CMjgRNsks27IDwI785YMY0KLt3co/c0cQ5foxHYv/shC2w8oOnVwz5Ubq1QG5KzrcW+AXk6gzdnxIkDnTvzu3g==",
"dev": true
}
}
@@ -7028,9 +6829,9 @@
}
},
"electron-log": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.3.5.tgz",
- "integrity": "sha512-J5Ew3axdk7W4jzzxKLSAi1sqbcAoo9CzHuBVsG0tT47j256xKulNrWFf3lZmHJ1KDXOQUcuwOngQF0jjmpEdpw=="
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.1.tgz",
+ "integrity": "sha512-nK/DwxPLtwWbggPCm27eMQhYHc3gzoZ+cokBK99diO4WsZJKrv5l44EUW8mRfWpmC8ZubnMyp6GTUIJyTc9AJA=="
},
"electron-publish": {
"version": "22.11.7",
@@ -7117,9 +6918,9 @@
}
},
"electron-to-chromium": {
- "version": "1.3.779",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz",
- "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==",
+ "version": "1.3.796",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.796.tgz",
+ "integrity": "sha512-agwJFgM0FUC1UPPbQ4aII3HamaaJ09fqWGAWYHmzxDWqdmTleCHyyA0kt3fJlTd5M440IaeuBfzXzXzCotnZcQ==",
"dev": true
},
"electron-updater": {
@@ -7199,8 +7000,7 @@
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "dev": true
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"end-of-stream": {
"version": "1.4.4",
@@ -7211,6 +7011,48 @@
"once": "^1.4.0"
}
},
+ "engine.io": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.1.tgz",
+ "integrity": "sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w==",
+ "requires": {
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~4.0.0",
+ "ws": "~7.4.2"
+ },
+ "dependencies": {
+ "cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
+ "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
+ "requires": {
+ "base64-arraybuffer": "0.1.4"
+ }
+ },
"enhanced-resolve": {
"version": "5.8.2",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz",
@@ -7222,9 +7064,9 @@
},
"dependencies": {
"graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
"dev": true
}
}
@@ -7375,8 +7217,7 @@
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
- "dev": true
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"escape-string-regexp": {
"version": "1.0.5",
@@ -7385,13 +7226,13 @@
"dev": true
},
"eslint": {
- "version": "7.30.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz",
- "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==",
+ "version": "7.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
"dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
- "@eslint/eslintrc": "^0.4.2",
+ "@eslint/eslintrc": "^0.4.3",
"@humanwhocodes/config-array": "^0.5.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
@@ -7442,9 +7283,9 @@
}
},
"@babel/helper-validator-identifier": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
- "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "version": "7.14.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz",
+ "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==",
"dev": true
},
"@babel/highlight": {
@@ -7502,9 +7343,9 @@
"dev": true
},
"globals": {
- "version": "13.9.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
- "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
+ "version": "13.10.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz",
+ "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@@ -8522,12 +8363,31 @@
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
+ "fast-json-stringify": {
+ "version": "2.7.7",
+ "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.7.tgz",
+ "integrity": "sha512-2kiwC/hBlK7QiGALsvj0QxtYwaReLOmAwOWJIxt5WHBB9EwXsqbsu8LCel47yh8NV8CEcFmnZYcXh4BionJcwQ==",
+ "requires": {
+ "ajv": "^6.11.0",
+ "deepmerge": "^4.2.2",
+ "rfdc": "^1.2.0",
+ "string-similarity": "^4.0.1"
+ }
+ },
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fast-printf": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.6.tgz",
+ "integrity": "sha512-Uz/uW6R1Fd8YqCGeoQosRIfB4dBbr8uMbFVdEci2AyXYcfucFqhpSMAGs8skRRdZd+MGCDBu48+B8Zmu7Pta5A==",
+ "requires": {
+ "boolean": "^3.0.2"
+ }
+ },
"fastest-levenshtein": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
@@ -8698,9 +8558,9 @@
}
},
"flatted": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.0.tgz",
- "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
+ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
"dev": true
},
"follow-redirects": {
@@ -8748,8 +8608,7 @@
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
- "dev": true
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"friendly-errors-webpack-plugin": {
"version": "1.7.0",
@@ -8988,8 +8847,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz",
"integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==",
- "dev": true,
- "optional": true,
"requires": {
"define-properties": "^1.1.3"
}
@@ -9164,16 +9021,6 @@
"integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
"dev": true
},
- "home-or-tmp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.1"
- }
- },
"hosted-git-info": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
@@ -9261,6 +9108,22 @@
"entities": "^2.0.0"
}
},
+ "http-assert": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz",
+ "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==",
+ "requires": {
+ "deep-equal": "~1.0.1",
+ "http-errors": "~1.7.2"
+ },
+ "dependencies": {
+ "deep-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
+ }
+ }
+ },
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npm.taobao.org/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz",
@@ -9277,7 +9140,6 @@
"version": "1.7.2",
"resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407647372&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz",
"integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=",
- "dev": true,
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
@@ -9289,8 +9151,7 @@
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
}
}
},
@@ -9428,6 +9289,43 @@
"sshpk": "^1.7.0"
}
},
+ "http-terminator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/http-terminator/-/http-terminator-3.0.0.tgz",
+ "integrity": "sha512-YdNsDQgsHuxBSOWWhkQHMgOD7c5CU3e9u+pokp9tI6BwJ8LjUhJYBO+k2a3NXoDXbToSm7OQk4RzNTooPQP5IQ==",
+ "requires": {
+ "delay": "^5.0.0",
+ "roarr": "^4.0.10",
+ "type-fest": "^0.20.2"
+ },
+ "dependencies": {
+ "detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ },
+ "roarr": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-4.2.5.tgz",
+ "integrity": "sha512-ZSs1hr2gyWickWDr2Yw0qcuef+EJKwZtNxUj7poxvIDxVq+ZvQreVNdPVLHonWpavBeZaOcAGVFV5xM/HqRR8g==",
+ "requires": {
+ "boolean": "^3.0.2",
+ "detect-node": "^2.0.5",
+ "fast-json-stringify": "^2.5.2",
+ "fast-printf": "^1.6.4",
+ "globalthis": "^1.0.2",
+ "is-circular": "^1.0.2",
+ "json-stringify-safe": "^5.0.1",
+ "semver-compare": "^1.0.0"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
+ }
+ }
+ },
"human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -9567,15 +9465,6 @@
"integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
"dev": true
},
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dev": true,
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
"ip": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
@@ -9660,6 +9549,11 @@
"ci-info": "^3.1.1"
}
},
+ "is-circular": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-circular/-/is-circular-1.0.2.tgz",
+ "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA=="
+ },
"is-color-stop": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
@@ -9739,18 +9633,17 @@
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
- "is-finite": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
- "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
- "dev": true
- },
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
+ "is-generator-function": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz",
+ "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A=="
+ },
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
@@ -10167,6 +10060,14 @@
"integrity": "sha1-iBkexzjOn3WRwl6QVt6Si0AncZQ=",
"dev": true
},
+ "keygrip": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
+ "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
+ "requires": {
+ "tsscmp": "1.0.6"
+ }
+ },
"keyv": {
"version": "3.1.0",
"resolved": "https://registry.npm.taobao.org/keyv/download/keyv-3.1.0.tgz?cache=0&sync_timestamp=1600337463601&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fkeyv%2Fdownload%2Fkeyv-3.1.0.tgz",
@@ -10194,6 +10095,80 @@
"integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
"dev": true
},
+ "koa": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz",
+ "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==",
+ "requires": {
+ "accepts": "^1.3.5",
+ "cache-content-type": "^1.0.0",
+ "content-disposition": "~0.5.2",
+ "content-type": "^1.0.4",
+ "cookies": "~0.8.0",
+ "debug": "~3.1.0",
+ "delegates": "^1.0.0",
+ "depd": "^2.0.0",
+ "destroy": "^1.0.4",
+ "encodeurl": "^1.0.2",
+ "escape-html": "^1.0.3",
+ "fresh": "~0.5.2",
+ "http-assert": "^1.3.0",
+ "http-errors": "^1.6.3",
+ "is-generator-function": "^1.0.7",
+ "koa-compose": "^4.1.0",
+ "koa-convert": "^1.2.0",
+ "on-finished": "^2.3.0",
+ "only": "~0.0.2",
+ "parseurl": "^1.3.2",
+ "statuses": "^1.5.0",
+ "type-is": "^1.6.16",
+ "vary": "^1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "koa-compose": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz",
+ "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="
+ },
+ "koa-convert": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz",
+ "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=",
+ "requires": {
+ "co": "^4.6.0",
+ "koa-compose": "^3.0.0"
+ },
+ "dependencies": {
+ "koa-compose": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz",
+ "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=",
+ "requires": {
+ "any-promise": "^1.1.0"
+ }
+ }
+ }
+ },
"latest-version": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
@@ -10432,12 +10407,6 @@
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
},
- "lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
- "dev": true
- },
"lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -10450,12 +10419,6 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
- "lodash.some": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
- "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
- "dev": true
- },
"lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
@@ -10474,14 +10437,10 @@
"integrity": "sha1-AF/eL15uRwaPk1/yhXPhJe9y8Zc=",
"dev": true
},
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dev": true,
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
+ "long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
},
"lower-case": {
"version": "2.0.2",
@@ -10507,9 +10466,9 @@
"dev": true
},
"lrc-file-parser": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-1.1.0.tgz",
- "integrity": "sha512-2C6j7lk2UpUae5+OnnQxXZ81ekg+LPWylAYzpCws3MFPSBqh4U3aA0cfLmjpIyDpKmS4hfNINfJZtt2jFX9peg=="
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-1.1.2.tgz",
+ "integrity": "sha512-AUzLhGkriwf0P0bQzLvLYFDXPcfBpwPb124MYySuvdyL9M3QPEPro9jEXD75qxM3MHbRdq2B1bbfKETUqJPPxg=="
},
"lru-cache": {
"version": "6.0.0",
@@ -10544,9 +10503,9 @@
}
},
"markdown-it": {
- "version": "12.1.0",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.1.0.tgz",
- "integrity": "sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==",
+ "version": "12.2.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz",
+ "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==",
"dev": true,
"requires": {
"argparse": "^2.0.1",
@@ -10604,8 +10563,7 @@
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
- "dev": true
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"memory-fs": {
"version": "0.4.1",
@@ -10699,18 +10657,18 @@
"dev": true
},
"mini-css-extract-plugin": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.1.0.tgz",
- "integrity": "sha512-SV1GgjMcfqy6hW07rAniUbQE4qS3inh3v4rZEUySkPRWy3vMbS3jUCjMOvNI4lUnDlQYJEmuUqKktTCNY5koFQ==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.2.0.tgz",
+ "integrity": "sha512-91HeVHbq7PUJ4TwOuMTlFWfVWrLqf3SF0PlEDPV+wtgsfxrMebN9LLzflyQqdKLp4/H3PexRB1WLKsCqpWKkxQ==",
"dev": true,
"requires": {
- "schema-utils": "^3.0.0"
+ "schema-utils": "^3.1.0"
},
"dependencies": {
"@types/json-schema": {
- "version": "7.0.7",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
- "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
"dev": true
},
"ajv": {
@@ -10732,12 +10690,12 @@
"dev": true
},
"schema-utils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz",
- "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
"dev": true,
"requires": {
- "@types/json-schema": "^7.0.7",
+ "@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
}
@@ -10897,8 +10855,7 @@
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz",
- "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=",
- "dev": true
+ "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
},
"neo-async": {
"version": "2.6.2",
@@ -10943,6 +10900,11 @@
"integrity": "sha1-Mt6ir7Ppkm8C7lzoeUkCaRpna/M=",
"dev": true
},
+ "node-gyp-build": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
+ "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
+ },
"node-id3": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/node-id3/-/node-id3-0.2.3.tgz",
@@ -10962,9 +10924,9 @@
}
},
"node-releases": {
- "version": "1.1.72",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
- "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
+ "version": "1.1.73",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz",
+ "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==",
"dev": true
},
"normalize-package-data": {
@@ -11050,8 +11012,7 @@
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"object-copy": {
"version": "0.1.0",
@@ -11146,8 +11107,7 @@
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
},
"object-visit": {
"version": "1.0.1",
@@ -11200,7 +11160,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "dev": true,
"requires": {
"ee-first": "1.1.1"
}
@@ -11229,6 +11188,11 @@
"mimic-fn": "^2.1.0"
}
},
+ "only": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
+ "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q="
+ },
"opn": {
"version": "5.5.0",
"resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz",
@@ -11261,18 +11225,6 @@
"url-parse": "^1.4.3"
}
},
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "dev": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
- },
"p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/p-cancelable/download/p-cancelable-1.1.0.tgz",
@@ -11388,8 +11340,7 @@
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz",
- "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=",
- "dev": true
+ "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ="
},
"pascal-case": {
"version": "3.1.2",
@@ -11567,9 +11518,9 @@
"dev": true
},
"postcss": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz",
- "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==",
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz",
+ "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==",
"dev": true,
"requires": {
"colorette": "^1.2.2",
@@ -11999,12 +11950,6 @@
"renderkid": "^2.0.6"
}
},
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
- "dev": true
- },
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -12687,15 +12632,6 @@
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
},
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "dev": true,
- "requires": {
- "is-finite": "^1.0.0"
- }
- },
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@@ -12821,6 +12757,11 @@
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true
},
+ "rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
+ },
"rgb-regex": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
@@ -12930,9 +12871,7 @@
"semver-compare": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
- "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
- "dev": true,
- "optional": true
+ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
},
"semver-diff": {
"version": "3.1.1",
@@ -13123,8 +13062,7 @@
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz",
- "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=",
- "dev": true
+ "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM="
},
"shallow-clone": {
"version": "3.0.1",
@@ -13156,12 +13094,6 @@
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true
- },
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@@ -13351,6 +13283,57 @@
}
}
},
+ "socket.io": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.3.tgz",
+ "integrity": "sha512-tLkaY13RcO4nIRh1K2hT5iuotfTaIQw7cVIe0FUykN3SuQi0cm7ALxuyT5/CtDswOMWUzMGTibxYNx/gU7In+Q==",
+ "requires": {
+ "@types/cookie": "^0.4.0",
+ "@types/cors": "^2.8.10",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "debug": "~4.3.1",
+ "engine.io": "~5.1.1",
+ "socket.io-adapter": "~2.3.1",
+ "socket.io-parser": "~4.0.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ }
+ }
+ },
+ "socket.io-adapter": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz",
+ "integrity": "sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw=="
+ },
+ "socket.io-parser": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
+ "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
+ "requires": {
+ "@types/component-emitter": "^1.2.10",
+ "component-emitter": "~1.3.0",
+ "debug": "~4.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ }
+ }
+ },
"sockjs": {
"version": "0.3.21",
"resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.21.tgz?cache=0&sync_timestamp=1596167355358&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsockjs%2Fdownload%2Fsockjs-0.3.21.tgz",
@@ -13387,12 +13370,6 @@
}
}
},
- "source-list-map": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
- "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
- "dev": true
- },
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@@ -13418,15 +13395,6 @@
"urix": "^0.1.0"
}
},
- "source-map-support": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
- "dev": true,
- "requires": {
- "source-map": "^0.5.6"
- }
- },
"source-map-url": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
@@ -13675,8 +13643,12 @@
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
+ "string-similarity": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz",
+ "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ=="
},
"string-width": {
"version": "4.2.2",
@@ -13938,9 +13910,9 @@
},
"dependencies": {
"ajv": {
- "version": "8.6.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.1.tgz",
- "integrity": "sha512-42VLtQUOLefAvKFAQIxIZDaThq6om/PrfP0CYk3/vn+y4BMNkKnbli8ON2QCiHov4KkzOSJ/xSoBJdayiiYvVQ==",
+ "version": "8.6.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
+ "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -14268,8 +14240,7 @@
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz",
- "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=",
- "dev": true
+ "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM="
},
"token-stream": {
"version": "1.0.0",
@@ -14286,12 +14257,6 @@
"punycode": "^2.1.1"
}
},
- "trim-right": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
- "dev": true
- },
"truncate-utf8-bytes": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
@@ -14330,6 +14295,11 @@
"integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=",
"dev": true
},
+ "tsscmp": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="
+ },
"tunnel": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
@@ -14368,7 +14338,6 @@
"version": "1.6.18",
"resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz",
"integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=",
- "dev": true,
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
@@ -14718,6 +14687,14 @@
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true
},
+ "utf-8-validate": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz",
+ "integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==",
+ "requires": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
"utf8-byte-length": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
@@ -14766,8 +14743,7 @@
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "dev": true
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"vendors": {
"version": "1.0.4",
@@ -14808,9 +14784,9 @@
"integrity": "sha512-ynhcL+PmTxuuSE1T10htiSXzjBozxYIE3ffbM1RfgAkVbr/v1SP+9Mi/7/uv8ZVV1yGuKjFAYp9BXq+X7op6MQ=="
},
"vue-loader": {
- "version": "15.9.7",
- "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.7.tgz",
- "integrity": "sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q==",
+ "version": "15.9.8",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz",
+ "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
@@ -14881,9 +14857,9 @@
}
},
"webpack": {
- "version": "5.45.1",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.45.1.tgz",
- "integrity": "sha512-68VT2ZgG9EHs6h6UxfV2SEYewA9BA3SOLSnC2NEbJJiEwbAiueDL033R1xX0jzjmXvMh0oSeKnKgbO2bDXIEyQ==",
+ "version": "5.49.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.49.0.tgz",
+ "integrity": "sha512-XarsANVf28A7Q3KPxSnX80EkCcuOer5hTOEJWJNvbskOZ+EK3pobHarGHceyUZMxpsTHBHhlV7hiQyLZzGosYw==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.0",
@@ -14892,6 +14868,7 @@
"@webassemblyjs/wasm-edit": "1.11.1",
"@webassemblyjs/wasm-parser": "1.11.1",
"acorn": "^8.4.1",
+ "acorn-import-assertions": "^1.7.6",
"browserslist": "^4.14.5",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.8.0",
@@ -14908,13 +14885,13 @@
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.1.3",
"watchpack": "^2.2.0",
- "webpack-sources": "^2.3.0"
+ "webpack-sources": "^3.2.0"
},
"dependencies": {
"@types/json-schema": {
- "version": "7.0.8",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz",
- "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==",
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
"dev": true
},
"acorn": {
@@ -14942,52 +14919,36 @@
"dev": true
},
"graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
"dev": true
},
"mime-db": {
- "version": "1.48.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
- "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==",
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
+ "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==",
"dev": true
},
"mime-types": {
- "version": "2.1.31",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
- "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
+ "version": "2.1.32",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
+ "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
"dev": true,
"requires": {
- "mime-db": "1.48.0"
+ "mime-db": "1.49.0"
}
},
"schema-utils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz",
- "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+ "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
"dev": true,
"requires": {
- "@types/json-schema": "^7.0.7",
+ "@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
}
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "webpack-sources": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz",
- "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==",
- "dev": true,
- "requires": {
- "source-list-map": "^2.0.1",
- "source-map": "^0.6.1"
- }
}
}
},
@@ -15629,22 +15590,10 @@
}
},
"webpack-sources": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
- "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
- "dev": true,
- "requires": {
- "source-list-map": "^2.0.0",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz",
+ "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==",
+ "dev": true
},
"websocket-driver": {
"version": "0.7.4",
@@ -15912,6 +15861,11 @@
"fd-slicer": "~1.1.0"
}
},
+ "ylru": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz",
+ "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ=="
+ },
"yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 35410f6e..17e5fb52 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
- "version": "1.11.0",
+ "version": "1.12.0",
"description": "一个免费的音乐查找助手",
"main": "./dist/electron/main.js",
"productName": "lx-music-desktop",
@@ -163,33 +163,32 @@
},
"homepage": "https://github.com/lyswhut/lx-music-desktop#readme",
"devDependencies": {
- "@babel/core": "^7.14.6",
+ "@babel/core": "^7.15.0",
"@babel/plugin-proposal-class-properties": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-modules-umd": "^7.14.5",
- "@babel/plugin-transform-runtime": "^7.14.5",
+ "@babel/plugin-transform-runtime": "^7.15.0",
"@babel/polyfill": "^7.12.1",
- "@babel/preset-env": "^7.14.7",
+ "@babel/preset-env": "^7.15.0",
"babel-eslint": "^10.1.0",
"babel-loader": "^8.2.2",
- "babel-minify-webpack-plugin": "^0.3.1",
"babel-preset-minify": "^0.5.1",
- "browserslist": "^4.16.6",
+ "browserslist": "^4.16.7",
"cfonts": "^2.9.3",
- "chalk": "^4.1.1",
+ "chalk": "^4.1.2",
"changelog-parser": "^2.8.0",
"copy-webpack-plugin": "^9.0.1",
- "core-js": "^3.15.2",
+ "core-js": "^3.16.0",
"cross-env": "^7.0.3",
- "css-loader": "^5.2.7",
+ "css-loader": "^6.2.0",
"css-minimizer-webpack-plugin": "^3.0.2",
"del": "^6.0.0",
- "electron": "^13.1.7",
+ "electron": "^13.1.8",
"electron-builder": "^22.11.7",
"electron-debug": "^3.2.0",
"electron-devtools-installer": "^3.2.0",
- "electron-to-chromium": "^1.3.779",
- "eslint": "^7.30.0",
+ "electron-to-chromium": "^1.3.796",
+ "eslint": "^7.32.0",
"eslint-config-standard": "^14.1.1",
"eslint-formatter-friendly": "^7.0.0",
"eslint-loader": "^4.0.2",
@@ -204,9 +203,9 @@
"less": "^4.1.1",
"less-loader": "^10.0.1",
"less-plugin-clean-css": "^1.5.1",
- "markdown-it": "^12.1.0",
- "mini-css-extract-plugin": "^2.1.0",
- "postcss": "^8.3.5",
+ "markdown-it": "^12.2.0",
+ "mini-css-extract-plugin": "^2.2.0",
+ "postcss": "^8.3.6",
"postcss-loader": "^6.1.1",
"postcss-pxtorem": "^6.0.0",
"pug": "^3.0.2",
@@ -219,25 +218,32 @@
"stylus-loader": "^6.1.0",
"terser-webpack-plugin": "^5.1.4",
"url-loader": "^4.1.1",
- "vue-loader": "^15.9.7",
+ "vue-loader": "^15.9.8",
"vue-template-compiler": "^2.6.14",
- "webpack": "^5.45.1",
+ "webpack": "^5.49.0",
"webpack-cli": "^4.7.2",
"webpack-dev-server": "^3.11.2",
"webpack-hot-middleware": "^2.25.0",
"webpack-merge": "^5.8.0"
},
"dependencies": {
- "crypto-js": "^4.0.0",
- "electron-log": "^4.3.5",
+ "crypto-js": "^4.1.1",
+ "electron-log": "^4.4.1",
+ "bufferutil": "^4.0.3",
+ "eiows": "^3.6.1",
"electron-store": "^8.0.0",
"electron-updater": "^4.3.9",
+ "http-terminator": "^3.0.0",
"iconv-lite": "^0.6.3",
"image-size": "^1.0.0",
- "lrc-file-parser": "^1.1.0",
+ "koa": "^2.13.1",
+ "long": "^4.0.0",
+ "lrc-file-parser": "^1.1.2",
"needle": "^2.8.0",
"node-id3": "^0.2.3",
"request": "^2.88.2",
+ "socket.io": "^4.1.3",
+ "utf-8-validate": "^5.0.5",
"vue": "^2.6.14",
"vue-i18n": "^8.25.0",
"vue-router": "^3.5.2",
diff --git a/publish/changeLog.md b/publish/changeLog.md
index 3efcad29..e305bab2 100644
--- a/publish/changeLog.md
+++ b/publish/changeLog.md
@@ -1,26 +1,12 @@
### 新增
-- 添加 win arm64 架构的安装包构建
-- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”
+- 新增局域网同步功能(实验性,首次使用前建议先备份一次列表),此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用问题请看"常见问题"。
### 优化
-- 优化网络请求,尝试去解决无法连接服务器的问题
-- 优化mg源打开歌单的链接兼容
+- 添加播放器对系统媒体控制与显示的兼容处理,现在在windows下的锁屏界面可以正确显示当前播放的音乐信息及切换歌曲了
### 修复
-- 修复mg源搜索失效的问题
-
-### 移除
-
-- 因wy源的歌单列表已没有“最新”排序的选项,所以现跟随移除wy源歌单列表按“最新”排序的按钮
-
-### 变更
-
-- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌,然后再点击列表的第一首歌,完成倒序选中,最后随便右击列表的任意一首歌,在弹出的菜单中选择调整顺序,在弹出框输入1后确定即可反转列表。
-若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。
-
-### 其他
-
-- 更新electron到v13.1.7
+- 修复导入kg歌单最多只能加载100、500首歌曲的问题。注:现在可以加载1000+首歌曲的歌单,但出于未知原因会导致部分歌曲无法加载(可能是无版权导致的),目前酷狗码仍然最多只能加载500首歌
+- 修复某些情况下所显示的歌词、封面图片与当前正在播放的歌曲不一致的问题
diff --git a/publish/version.json b/publish/version.json
index 50b3d364..cf50980b 100644
--- a/publish/version.json
+++ b/publish/version.json
@@ -1 +1 @@
-{"version":"1.11.0","desc":"新增\n- 添加 win arm64 架构的安装包构建\n- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”\n\n优化\n- 优化网络请求,尝试去解决无法连接服务器的问题\n- 优化mg源打开歌单的链接兼容\n\n修复\n- 修复mg源搜索失效的问题\n\n移除\n- 因wy源的歌单列表已没有“最新”排序的选项,所以现跟随移除wy源歌单列表按“最新”排序的按钮\n\n变更\n- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌,然后再点击列表的第一首歌,完成倒序选中,最后随便右击列表的任意一首歌,在弹出的菜单中选择调整顺序,在弹出框输入1后确定即可反转列表。\n若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。\n\n其他\n- 更新electron到v13.1.7","history":[{"version":"1.10.2","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题"},{"version":"1.10.1","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题\n- 修复播放在空的歌单列表点击播放全部时报错的问题"},{"version":"1.10.0","desc":"lx music移动端已经发布了,使用习惯仍跟桌面版一样,不过功能、界面仍比较简单,有兴趣的可以去体检一下,项目地址:\nhttps://github.com/lyswhut/lx-music-mobile#readme\n\n新增\n- 排行榜界面添加播放、收藏整个排行榜功能,可以右击排行榜名字后,在弹出的右键菜单中使用。注:收藏、播放存在分页的排行榜时需等待操作完成后才能切换排行榜,不然会导致操作中断。\n- 新增Mac arm64位dmg包的构建\n\n修复\n- 修复全局快捷键对桌面歌词无效的问题\n- 修复快捷键设置框内的提示问题\n- 修复在当前正常播放的列表中使用稍后播放功能时,播放完后稍后播放的歌曲后不会恢复原来播放位置播放的问题\n- 修复kw部分歌单无法打开的问题\n- 修复wy源的歌曲音质匹配问题\n- 修复mg源歌单标签、排行榜歌曲列表无法加载的问题\n- 修复了一个歌曲下载失败时不会跳过任务的问题\n\n其他\n- 更新 Electron 到 12.0.8"},{"version":"1.9.0","desc":"新增\n- 新增启动参数`-dhmkh`,此参数将禁用Chromium的Hardware Media Key Handling特性,用于解决漫步者部分型号耳机与本程序冲突导致耳机意外关机的问题\n- 新增Windows arm64位免安装版的构建\n- 新增黑色皮肤“黑灯瞎火”,有关于皮肤配色的建议欢迎反馈\n- 新增自动换源下载功能,默认关闭,当无法从歌曲的原始源下载时,将尝试切换到其他源下载,注:此功能不100%保证换源后的歌曲版本与原版一致\n\n优化\n- 程序启动时对数据文件做读取校验,数据出现损坏时自动备份损坏的数据,若出现数据读取错误的弹窗并出现我的列表丢失时可到GitHub或加群反馈\n- 当设置-代理启用,但主机地址为空的时,将不再使用代理配置进行网络连接,并且在离开设置界面时自动禁用代理\n- 优化歌曲自动换源匹配\n- 分离歌词与歌曲列表信息的保存,以减小列表列表文件损坏的几率\n- 兼容打开咪咕移动端分享的歌单链接,添加打开歌单的信息显示\n\n修复\n- 修复备份与恢复功能在恢复数据时某些设置不立即生效的问题\n- 修正设置页“搜索设置”部分内容的缩进显示问题\n- 修复正在播放“稍后播放”的歌曲时,对“稍后播放”前播放的列表进行添加、删除操作会导致切歌的问题"},{"version":"1.8.2","desc":"### 修复\r\n\r\n- 修复歌曲ID存储变更导致酷狗图片获取失败的问题\n- 修复收藏的在线列表id迁移保存出错的问题"},{"version":"1.8.1","desc":"修复\n- 修复歌词翻译的主题颜色适配问题"},{"version":"1.8.0","desc":"新增\n- 新增设置-其他-列表缓存信息清理功能,注:此功能一般情况下不要使用\n- 新增启动参数`-play`,可以在启动软件时播放指定歌单,使用方法看Readme.md的\"启动参数\"部分\n- 新增逐字歌词播放,默认开启,可到设置界面关闭,注:本功能目前仅对酷狗源的歌曲有效\n- 新增自定义源功能,源编写规则可以去常见问题查看\n\n优化\n- 允许播放除了搜索列表以外的所有歌曲,即原来没有播放按钮或者灰色的歌曲都可以去尝试点击播放。注:该功能的原理是尝试自动切换到其他源播放,所以不一定会播放成功,特别是对于那些独家的资源\n- 优化单首歌曲的“添加到列表”弹窗歌曲列表状态的显示;现在在收藏单首歌曲时,若列表存在本歌曲则列表名字将变成灰色不可点击状态。总的来说,在添加单首歌曲时若列表名是灰色,则证明当前歌曲已在那个列表中\n- 将歌词翻译放到原文的下方,同时新增当前播放翻译的高亮功能\n\n移除\n- 移除虾米源。注:虽然已移除该源,但仍可尝试去播放之前添加的歌曲,虽然不一定会成功\n\n修复\n- 修复音乐搜索列表的稍后播放功能无效的问题\n- 修复搜索列表双击不支持播放的源时会导致切歌的问题\n- 修复歌单列表加载失败时无法进入歌单打开界面的问题\n- 修复mg源歌单列表无法加载的问题\n- 修复kg跳转到官方歌曲详情页的歌曲无法播放的问题\n- 修复我的列表的歌曲添加到其他列表时不排除当前列表的问题\n- 修复在下载列表右击未下载完成的歌曲弹出的右击菜单中没有开始下载选项的问题\n\n变更\n- 歌词翻译显示功能修改为默认关闭,注:此变更仅影响首次安装软件的用户\n\n其他\n- 更新electron到v9.4.4"},{"version":"1.7.1","desc":"修复\n- 修复非透明模式下右侧滚动条无法拖动的问题\n- 修复MAC下xm音乐滑块验证问题"},{"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"},{"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版本发布"}]}
+{"version":"1.12.0","desc":"新增\n- 新增局域网同步功能(实验性,首次使用前建议先备份一次列表),此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用问题请看\"常见问题\"。\n\n优化\n- 添加播放器对系统媒体控制与显示的兼容处理,现在在windows下的锁屏界面可以正确显示当前播放的音乐信息及切换歌曲了\n\n修复\n- 修复导入kg歌单最多只能加载100、500首歌曲的问题。注:现在可以加载1000+首歌曲的歌单,但出于未知原因会导致部分歌曲无法加载(可能是无版权导致的),目前酷狗码仍然最多只能加载500首歌\n- 修复某些情况下所显示的歌词、封面图片与当前正在播放的歌曲不一致的问题","history":[{"version":"1.11.0","desc":"新增\n- 添加 win arm64 架构的安装包构建\n- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”\n\n优化\n- 优化网络请求,尝试去解决无法连接服务器的问题\n- 优化mg源打开歌单的链接兼容\n\n修复\n- 修复mg源搜索失效的问题\n\n移除\n- 因wy源的歌单列表已没有“最新”排序的选项,所以现跟随移除wy源歌单列表按“最新”排序的按钮\n\n变更\n- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌,然后再点击列表的第一首歌,完成倒序选中,最后随便右击列表的任意一首歌,在弹出的菜单中选择调整顺序,在弹出框输入1后确定即可反转列表。\n若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。\n\n其他\n- 更新electron到v13.1.7"},{"version":"1.10.2","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题"},{"version":"1.10.1","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题\n- 修复播放在空的歌单列表点击播放全部时报错的问题"},{"version":"1.10.0","desc":"lx music移动端已经发布了,使用习惯仍跟桌面版一样,不过功能、界面仍比较简单,有兴趣的可以去体检一下,项目地址:\nhttps://github.com/lyswhut/lx-music-mobile#readme\n\n新增\n- 排行榜界面添加播放、收藏整个排行榜功能,可以右击排行榜名字后,在弹出的右键菜单中使用。注:收藏、播放存在分页的排行榜时需等待操作完成后才能切换排行榜,不然会导致操作中断。\n- 新增Mac arm64位dmg包的构建\n\n修复\n- 修复全局快捷键对桌面歌词无效的问题\n- 修复快捷键设置框内的提示问题\n- 修复在当前正常播放的列表中使用稍后播放功能时,播放完后稍后播放的歌曲后不会恢复原来播放位置播放的问题\n- 修复kw部分歌单无法打开的问题\n- 修复wy源的歌曲音质匹配问题\n- 修复mg源歌单标签、排行榜歌曲列表无法加载的问题\n- 修复了一个歌曲下载失败时不会跳过任务的问题\n\n其他\n- 更新 Electron 到 12.0.8"},{"version":"1.9.0","desc":"新增\n- 新增启动参数`-dhmkh`,此参数将禁用Chromium的Hardware Media Key Handling特性,用于解决漫步者部分型号耳机与本程序冲突导致耳机意外关机的问题\n- 新增Windows arm64位免安装版的构建\n- 新增黑色皮肤“黑灯瞎火”,有关于皮肤配色的建议欢迎反馈\n- 新增自动换源下载功能,默认关闭,当无法从歌曲的原始源下载时,将尝试切换到其他源下载,注:此功能不100%保证换源后的歌曲版本与原版一致\n\n优化\n- 程序启动时对数据文件做读取校验,数据出现损坏时自动备份损坏的数据,若出现数据读取错误的弹窗并出现我的列表丢失时可到GitHub或加群反馈\n- 当设置-代理启用,但主机地址为空的时,将不再使用代理配置进行网络连接,并且在离开设置界面时自动禁用代理\n- 优化歌曲自动换源匹配\n- 分离歌词与歌曲列表信息的保存,以减小列表列表文件损坏的几率\n- 兼容打开咪咕移动端分享的歌单链接,添加打开歌单的信息显示\n\n修复\n- 修复备份与恢复功能在恢复数据时某些设置不立即生效的问题\n- 修正设置页“搜索设置”部分内容的缩进显示问题\n- 修复正在播放“稍后播放”的歌曲时,对“稍后播放”前播放的列表进行添加、删除操作会导致切歌的问题"},{"version":"1.8.2","desc":"### 修复\r\n\r\n- 修复歌曲ID存储变更导致酷狗图片获取失败的问题\n- 修复收藏的在线列表id迁移保存出错的问题"},{"version":"1.8.1","desc":"修复\n- 修复歌词翻译的主题颜色适配问题"},{"version":"1.8.0","desc":"新增\n- 新增设置-其他-列表缓存信息清理功能,注:此功能一般情况下不要使用\n- 新增启动参数`-play`,可以在启动软件时播放指定歌单,使用方法看Readme.md的\"启动参数\"部分\n- 新增逐字歌词播放,默认开启,可到设置界面关闭,注:本功能目前仅对酷狗源的歌曲有效\n- 新增自定义源功能,源编写规则可以去常见问题查看\n\n优化\n- 允许播放除了搜索列表以外的所有歌曲,即原来没有播放按钮或者灰色的歌曲都可以去尝试点击播放。注:该功能的原理是尝试自动切换到其他源播放,所以不一定会播放成功,特别是对于那些独家的资源\n- 优化单首歌曲的“添加到列表”弹窗歌曲列表状态的显示;现在在收藏单首歌曲时,若列表存在本歌曲则列表名字将变成灰色不可点击状态。总的来说,在添加单首歌曲时若列表名是灰色,则证明当前歌曲已在那个列表中\n- 将歌词翻译放到原文的下方,同时新增当前播放翻译的高亮功能\n\n移除\n- 移除虾米源。注:虽然已移除该源,但仍可尝试去播放之前添加的歌曲,虽然不一定会成功\n\n修复\n- 修复音乐搜索列表的稍后播放功能无效的问题\n- 修复搜索列表双击不支持播放的源时会导致切歌的问题\n- 修复歌单列表加载失败时无法进入歌单打开界面的问题\n- 修复mg源歌单列表无法加载的问题\n- 修复kg跳转到官方歌曲详情页的歌曲无法播放的问题\n- 修复我的列表的歌曲添加到其他列表时不排除当前列表的问题\n- 修复在下载列表右击未下载完成的歌曲弹出的右击菜单中没有开始下载选项的问题\n\n变更\n- 歌词翻译显示功能修改为默认关闭,注:此变更仅影响首次安装软件的用户\n\n其他\n- 更新electron到v9.4.4"},{"version":"1.7.1","desc":"修复\n- 修复非透明模式下右侧滚动条无法拖动的问题\n- 修复MAC下xm音乐滑块验证问题"},{"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"},{"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 6a531679..fe0764cb 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.42',
+ version: '1.0.43',
player: {
togglePlayMethod: 'listLoop',
highQuality: false,
@@ -85,6 +85,10 @@ const defaultSetting = {
isToTray: false,
themeId: 0,
},
+ sync: {
+ enable: false,
+ port: '23332',
+ },
windowSizeId: 2,
themeId: 0,
langId: null,
diff --git a/src/common/ipcNames.js b/src/common/ipcNames.js
index aa68e8d1..ad9bb243 100644
--- a/src/common/ipcNames.js
+++ b/src/common/ipcNames.js
@@ -66,6 +66,13 @@ const names = {
get_music_url: 'get_music_url',
save_music_url: 'save_music_url',
clear_music_url: 'clear_music_url',
+
+ sync_enable: 'sync_enable',
+ sync_status: 'sync_status',
+ sync_get_status: 'sync_get_status',
+ sync_generate_code: 'sync_generate_code',
+ sync_action_list: 'sync_action_list',
+ sync_list: 'sync_list',
},
winLyric: {
close: 'close',
diff --git a/src/main/events/Common.js b/src/main/events/Common.js
index bb9dea0d..e1ac61da 100644
--- a/src/main/events/Common.js
+++ b/src/main/events/Common.js
@@ -10,6 +10,10 @@ class Common extends EventEmitter {
configStatus(name) {
this.emit(COMMON_EVENT_NAME.configStatus, name)
}
+
+ saveMyList(data) {
+ this.emit(COMMON_EVENT_NAME.saveMyList, data)
+ }
}
module.exports = Common
diff --git a/src/main/events/_name.js b/src/main/events/_name.js
index d15a2c09..ea4c5154 100644
--- a/src/main/events/_name.js
+++ b/src/main/events/_name.js
@@ -1,6 +1,7 @@
exports.common = {
initConfig: 'initConfig',
configStatus: 'config',
+ saveMyList: 'saveMyList',
}
exports.mainWindow = {
diff --git a/src/main/events/index.js b/src/main/events/index.js
index 6899d1f0..9b543697 100644
--- a/src/main/events/index.js
+++ b/src/main/events/index.js
@@ -7,6 +7,7 @@ const WinLyric = require('./WinLyric')
const HotKey = require('./HotKey')
const { Event: UserApi } = require('../modules/userApi')
+const { Event: Sync } = require('../modules/sync')
if (!global.lx_event.common) global.lx_event.common = new Common()
if (!global.lx_event.mainWindow) global.lx_event.mainWindow = new MainWindow()
@@ -15,3 +16,4 @@ if (!global.lx_event.winLyric) global.lx_event.winLyric = new WinLyric()
if (!global.lx_event.hotKey) global.lx_event.hotKey = new HotKey()
if (!global.lx_event.userApi) global.lx_event.userApi = new UserApi()
+if (!global.lx_event.sync) global.lx_event.sync = new Sync()
diff --git a/src/main/modules/sync/event/event.js b/src/main/modules/sync/event/event.js
new file mode 100644
index 00000000..ade680a9
--- /dev/null
+++ b/src/main/modules/sync/event/event.js
@@ -0,0 +1,23 @@
+const { EventEmitter } = require('events')
+const SYNC_EVENT_NAME = require('./name')
+
+class Sync extends EventEmitter {
+ status(status) {
+ this.emit(SYNC_EVENT_NAME.status, status)
+ }
+
+ sync_list(data) {
+ this.emit(SYNC_EVENT_NAME.sync_list, data)
+ }
+
+ sync_handle_list(data) {
+ this.emit(SYNC_EVENT_NAME.sync_handle_list, data)
+ }
+
+ action_list(data) {
+ this.emit(SYNC_EVENT_NAME.sync_action_list, data)
+ }
+}
+
+module.exports = Sync
+
diff --git a/src/main/modules/sync/event/name.js b/src/main/modules/sync/event/name.js
new file mode 100644
index 00000000..30abdf51
--- /dev/null
+++ b/src/main/modules/sync/event/name.js
@@ -0,0 +1,6 @@
+module.exports = {
+ sync_action_list: 'sync_action_list',
+ sync_list: 'sync_list',
+ sync_handle_list: 'sync_handle_list',
+ status: 'status',
+}
diff --git a/src/main/modules/sync/index.js b/src/main/modules/sync/index.js
new file mode 100644
index 00000000..c1237a44
--- /dev/null
+++ b/src/main/modules/sync/index.js
@@ -0,0 +1,15 @@
+const Event = require('./event/event')
+const eventNames = require('./event/name')
+const modules = require('./modules')
+const { startServer, stopServer, getStatus, generateCode } = require('./server/server')
+
+
+module.exports = {
+ startServer,
+ stopServer,
+ getStatus,
+ generateCode,
+ Event,
+ eventNames,
+ modules,
+}
diff --git a/src/main/modules/sync/modules/index.js b/src/main/modules/sync/modules/index.js
new file mode 100644
index 00000000..8e783c9a
--- /dev/null
+++ b/src/main/modules/sync/modules/index.js
@@ -0,0 +1 @@
+exports.list = require('./list')
diff --git a/src/main/modules/sync/modules/list.js b/src/main/modules/sync/modules/list.js
new file mode 100644
index 00000000..41574768
--- /dev/null
+++ b/src/main/modules/sync/modules/list.js
@@ -0,0 +1,41 @@
+const { encryptMsg, decryptMsg } = require('../server/utils')
+let io
+
+const handleListAction = ({ action, data }) => {
+ // console.log(action, data)
+ global.lx_event.sync.action_list({ action, data })
+}
+
+// const addMusic = (orderId, callback) => {
+// // ...
+// }
+
+const broadcast = async(action, data, excludeIds = []) => {
+ if (!io) return
+ const sockets = await io.fetchSockets()
+ for (const socket of sockets) {
+ if (excludeIds.includes(socket.data.keyInfo.clientId)) continue
+ socket.emit(action, encryptMsg(socket.data.keyInfo, data))
+ }
+}
+
+exports.sendListAction = (action, data) => {
+ // io.sockets
+ return broadcast('list:action', JSON.stringify({ action, data }))
+}
+
+exports.registerListHandler = (_io, socket) => {
+ io = _io
+ socket.on('list:action', msg => {
+ // console.log(msg)
+ msg = decryptMsg(socket.data.keyInfo, msg)
+ if (!msg) return
+ handleListAction(JSON.parse(msg))
+ broadcast('list:action', msg, [socket.data.keyInfo.clientId])
+ // socket.broadcast.emit('list:action', { action: 'list_remove', data: { id: 'default', index: 0 } })
+ })
+ // socket.on('list:add', addMusic)
+}
+exports.unregisterListHandler = () => {
+ io = null
+}
diff --git a/src/main/modules/sync/server/auth.js b/src/main/modules/sync/server/auth.js
new file mode 100644
index 00000000..df1d3bf5
--- /dev/null
+++ b/src/main/modules/sync/server/auth.js
@@ -0,0 +1,69 @@
+const { aesEncrypt, aesDecrypt, createClientKeyInfo, getClientKeyInfo, setClientKeyInfo } = require('./utils')
+
+const authMsg = 'lx-music auth::'
+const helloMsg = 'Hello~::^-^::'
+
+exports.authCode = async(req, res, authCode) => {
+ let code = 401
+ let msg = 'Forbidden'
+ // console.log(req.headers)
+ if (req.headers.m) {
+ label:
+ if (req.headers.i) {
+ const keyInfo = getClientKeyInfo(req.headers.i)
+ if (!keyInfo) break label
+ let text
+ try {
+ text = aesDecrypt(req.headers.m, keyInfo.key, keyInfo.iv)
+ } catch (err) {
+ break label
+ }
+ console.log(text)
+ if (text.startsWith(authMsg)) {
+ code = 200
+ const deviceName = text.replace(authMsg, '') || 'Unknown'
+ if (deviceName != keyInfo.deviceName) {
+ keyInfo.deviceName = deviceName
+ setClientKeyInfo(keyInfo)
+ }
+ msg = aesEncrypt(helloMsg, keyInfo.key, keyInfo.iv)
+ }
+ } else {
+ let key = ''.padStart(16, Buffer.from(authCode).toString('hex'))
+ const iv = Buffer.from(key.split('').reverse().join('')).toString('base64')
+ key = Buffer.from(key).toString('base64')
+ // console.log(authCode, key, iv)
+ let text
+ try {
+ text = aesDecrypt(req.headers.m, key, iv)
+ } catch (err) {
+ break label
+ }
+ console.log(text)
+ if (text.startsWith(authMsg)) {
+ code = 200
+ const deviceName = text.replace(authMsg, '') || 'Unknown'
+ msg = aesEncrypt(JSON.stringify(createClientKeyInfo(deviceName)), key, iv)
+ }
+ }
+ }
+ res.writeHead(code)
+ res.end(msg)
+}
+
+exports.authConnect = async req => {
+ const { i, t } = req._query
+ label:
+ if (i && t) {
+ const keyInfo = getClientKeyInfo(i)
+ if (!keyInfo) break label
+ let text
+ try {
+ text = aesDecrypt(t, keyInfo.key, keyInfo.iv)
+ } catch (err) {
+ break label
+ }
+ if (text == 'lx-music connect') return
+ }
+ throw new Error('failed')
+}
diff --git a/src/main/modules/sync/server/index.js b/src/main/modules/sync/server/index.js
new file mode 100644
index 00000000..dbfb83f1
--- /dev/null
+++ b/src/main/modules/sync/server/index.js
@@ -0,0 +1,7 @@
+const { startServer, stopServer, getStatus } = require('./server')
+
+module.exports = {
+ startServer,
+ stopServer,
+ getStatus,
+}
diff --git a/src/main/modules/sync/server/server.js b/src/main/modules/sync/server/server.js
new file mode 100644
index 00000000..bcb521ee
--- /dev/null
+++ b/src/main/modules/sync/server/server.js
@@ -0,0 +1,165 @@
+const http = require('http')
+const sio = require('socket.io')
+const { createHttpTerminator } = require('http-terminator')
+const modules = require('../modules')
+const { authCode, authConnect } = require('./auth')
+const { getAddress, getServerId, generateCode, getClientKeyInfo } = require('./utils')
+const syncList = require('./syncList')
+
+
+let status = {
+ status: false,
+ message: '',
+ address: [],
+ code: '',
+ devices: [],
+}
+
+const handleConnection = (io, socket) => {
+ console.log('connection')
+ // console.log(socket.handshake.query)
+ for (const module of Object.values(modules)) {
+ module.registerListHandler(io, socket)
+ }
+}
+
+const authConnection = (req, callback) => {
+ // console.log(req.headers)
+ // // console.log(req.auth)
+ // console.log(req._query.authCode)
+ authConnect(req).then(() => {
+ callback(null, true)
+ }).catch(err => {
+ callback(err, false)
+ })
+}
+
+let httpTerminator = null
+let io = null
+
+const handleStartServer = (port = 9527) => new Promise((resolve, reject) => {
+ const httpServer = http.createServer((req, res) => {
+ // console.log(req.url)
+ let code
+ let msg
+ switch (req.url) {
+ case '/hello':
+ code = 200
+ msg = 'Hello~::^-^::'
+ break
+ case '/id':
+ code = 200
+ msg = 'OjppZDo6' + getServerId()
+ break
+ case '/ah':
+ authCode(req, res, status.code)
+ break
+ default:
+ code = 401
+ msg = 'Forbidden'
+ break
+ }
+ if (!code) return
+ res.writeHead(code)
+ res.end(msg)
+ })
+ httpTerminator = createHttpTerminator({
+ server: httpServer,
+ })
+ io = sio(httpServer, {
+ path: '/sync',
+ serveClient: false,
+ connectTimeout: 10000,
+ pingTimeout: 30000,
+ maxHttpBufferSize: 3e6,
+ allowRequest: authConnection,
+ transports: ['websocket'],
+ })
+
+ io.on('connection', async socket => {
+ socket.on('disconnect', reason => {
+ console.log('disconnect', reason)
+ status.devices.splice(status.devices.findIndex(k => k.clientId == keyInfo.clientId), 1)
+ global.lx_event.sync.status(status)
+ })
+ const keyInfo = getClientKeyInfo(socket.handshake.query.i)
+ // socket.lx_keyInfo = keyInfo
+ socket.data.keyInfo = keyInfo
+ try {
+ await syncList(io, socket)
+ } catch (err) {
+ console.log(err)
+ return
+ }
+ status.devices.push(keyInfo)
+ handleConnection(io, socket, keyInfo)
+ global.lx_event.sync.status(status)
+ })
+
+ httpServer.on('error', error => {
+ console.log(error)
+ reject(error)
+ })
+
+ httpServer.on('listening', () => {
+ const addr = httpServer.address()
+ const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port
+ console.info(`Listening on ${bind}`)
+ resolve()
+ })
+
+ httpServer.listen(port)
+})
+
+const handleStopServer = async() => {
+ if (!httpTerminator) return
+ await io.close()
+ await httpTerminator.terminate().catch(() => {})
+ io = null
+ httpTerminator = null
+}
+
+exports.stopServer = async() => {
+ if (!status.status) return
+ console.log('stoping sync server...')
+ return handleStopServer().then(() => {
+ console.log('sync server stoped')
+ status.status = false
+ status.message = ''
+ status.address = []
+ status.code = ''
+ }).catch(err => {
+ console.log(err)
+ status.message = err.message
+ }).finally(() => {
+ global.lx_event.sync.status(status)
+ })
+}
+exports.startServer = async port => {
+ if (status.status) await handleStopServer()
+
+ console.log('starting sync server...')
+ return handleStartServer(port).then(() => {
+ console.log('sync server started')
+ status.status = true
+ status.message = ''
+ status.address = getAddress()
+ status.code = generateCode()
+ }).catch(err => {
+ console.log(err)
+ status.status = false
+ status.message = err.message
+ status.address = []
+ status.code = ''
+ }).finally(() => {
+ global.lx_event.sync.status(status)
+ })
+}
+
+exports.getStatus = () => status
+
+exports.generateCode = async() => {
+ status.code = generateCode()
+ global.lx_event.sync.status(status)
+ return status.code
+}
diff --git a/src/main/modules/sync/server/syncList.js b/src/main/modules/sync/server/syncList.js
new file mode 100644
index 00000000..5897e385
--- /dev/null
+++ b/src/main/modules/sync/server/syncList.js
@@ -0,0 +1,394 @@
+const path = require('path')
+const fs = require('fs')
+const fsPromises = fs.promises
+const { app } = require('electron')
+const { encryptMsg, decryptMsg } = require('./utils')
+const SYNC_EVENT_NAMES = require('../event/name')
+const { common: COMMON_EVENT_NAME } = require('@main/events/_name')
+const { throttle } = require('@common/utils')
+
+let io
+let syncingId = null
+const wait = (time = 1000) => new Promise((resolve, reject) => setTimeout(resolve, time))
+
+const getRemoteListData = socket => new Promise((resolve, reject) => {
+ console.log('getRemoteListData')
+ const handleError = reason => {
+ reject(new Error(reason))
+ }
+ const handleSuccess = enData => {
+ socket.removeListener('disconnect', handleError)
+ socket.removeListener('list:sync', handleSuccess)
+ console.log('getRemoteListData', 'handleSuccess')
+ const data = JSON.parse(decryptMsg(socket.data.keyInfo, enData))
+ if (!data) return reject(new Error('Get remote list data failed'))
+ if (data.action != 'getData') return
+ resolve(data.data)
+ }
+
+ socket.on('disconnect', handleError)
+ socket.on('list:sync', handleSuccess)
+ socket.emit('list:sync', encryptMsg(socket.data.keyInfo, JSON.stringify({ action: 'getData', data: 'all' })))
+})
+
+const getLocalListData = () => new Promise((resolve, reject) => {
+ const handleSuccess = ({ action, data }) => {
+ if (action !== 'getData') return
+ global.lx_event.sync.off(SYNC_EVENT_NAMES.sync_handle_list, handleSuccess)
+ resolve(data)
+ }
+ global.lx_event.sync.on(SYNC_EVENT_NAMES.sync_handle_list, handleSuccess)
+ global.lx_event.sync.sync_list({
+ action: 'getData',
+ })
+})
+const getSyncMode = keyInfo => new Promise((resolve, reject) => {
+ const handleSuccess = ({ action, data }) => {
+ if (action !== 'selectMode') return
+ global.lx_event.sync.off(SYNC_EVENT_NAMES.sync_handle_list, handleSuccess)
+ resolve(data)
+ }
+ global.lx_event.sync.on(SYNC_EVENT_NAMES.sync_handle_list, handleSuccess)
+ global.lx_event.sync.sync_list({
+ action: 'selectMode',
+ data: keyInfo,
+ })
+})
+
+const finishedSync = socket => {
+ return socket.emit('list:sync', encryptMsg(socket.data.keyInfo, JSON.stringify({
+ action: 'finished',
+ })))
+}
+
+const setLocalList = listData => {
+ global.lx_event.sync.sync_list({
+ action: 'setData',
+ data: listData,
+ })
+}
+const setRemotelList = async(socket, listData) => {
+ if (!io) return
+ const sockets = await io.fetchSockets()
+ for (const socket of sockets) {
+ // if (excludeIds.includes(socket.data.keyInfo.clientId)) continue
+ socket.emit('list:sync', encryptMsg(socket.data.keyInfo, JSON.stringify({ action: 'setData', data: listData })))
+ }
+}
+
+let writeFilePromises = {}
+const updateSnapshot = (path, data) => {
+ console.log('updateSnapshot', path)
+ let writeFilePromise = writeFilePromises[path] || Promise.resolve()
+ return writeFilePromise.then(() => {
+ writeFilePromise = writeFilePromises[path] = fsPromises.writeFile(path, data)
+ return writeFilePromise
+ })
+}
+
+
+const createListDataObj = listData => {
+ const listDataObj = {}
+ for (const list of listData.userList) listDataObj[list.id] = list
+ return listDataObj
+}
+
+const handleMergeList = (sourceList, targetList, addMusicLocationType) => {
+ let newList
+ switch (addMusicLocationType) {
+ case 'top':
+ newList = [...targetList.list, ...sourceList.list]
+ break
+ case 'bottom':
+ default:
+ newList = [...sourceList.list, ...targetList.list]
+ break
+ }
+ const map = {}
+ const ids = []
+ switch (addMusicLocationType) {
+ case 'top':
+ newList = [...targetList.list, ...sourceList.list]
+ for (let i = newList.length - 1; i > -1; i--) {
+ const item = newList[i]
+ if (map[item.songmid]) continue
+ ids.unshift(item.songmid)
+ map[item.songmid] = item
+ }
+ break
+ case 'bottom':
+ default:
+ newList = [...sourceList.list, ...targetList.list]
+ for (const item of newList) {
+ if (map[item.songmid]) continue
+ ids.push(item.songmid)
+ map[item.songmid] = item
+ }
+ break
+ }
+ return {
+ ...sourceList,
+ list: ids.map(id => map[id]),
+ }
+}
+const mergeList = (sourceListData, targetListData) => {
+ const addMusicLocationType = global.appSetting.list.addMusicLocationType
+ const newListData = {}
+ newListData.defaultList = handleMergeList(sourceListData.defaultList, targetListData.defaultList, addMusicLocationType)
+ newListData.loveList = handleMergeList(sourceListData.loveList, targetListData.loveList, addMusicLocationType)
+
+ const listDataObj = createListDataObj(sourceListData)
+ newListData.userList = [...sourceListData.userList]
+
+ for (const list of targetListData.userList) {
+ const targetList = listDataObj[list.id]
+ if (targetList) {
+ targetList.list = handleMergeList(targetList, list, addMusicLocationType).list
+ } else {
+ newListData.userList.push(list)
+ }
+ }
+
+ return newListData
+}
+const overwriteList = (sourceListData, targetListData) => {
+ const newListData = {}
+ newListData.defaultList = sourceListData.defaultList
+ newListData.loveList = sourceListData.loveList
+
+ const listDataObj = createListDataObj(sourceListData)
+ newListData.userList = [...sourceListData.userList]
+
+ for (const list of targetListData.userList) {
+ const targetList = listDataObj[list.id]
+ if (targetList) continue
+ newListData.userList.push(list)
+ }
+
+ return newListData
+}
+
+const handleMergeListData = async socket => {
+ let isSelectingMode = false
+ const handleDisconnect = () => {
+ if (!isSelectingMode) return
+ global.lx_event.sync.sync_list({
+ action: 'closeSelectMode',
+ })
+ }
+ socket.on('disconnect', handleDisconnect)
+ isSelectingMode = true
+ const mode = await getSyncMode(socket.data.keyInfo)
+ isSelectingMode = false
+ const [remoteListData, localListData] = await Promise.all([getRemoteListData(socket), getLocalListData()])
+ console.log('handleMergeListData', 'remoteListData, localListData')
+ let listData
+ switch (mode) {
+ case 'merge_local_remote':
+ listData = mergeList(localListData, remoteListData)
+ break
+ case 'merge_remote_local':
+ listData = mergeList(remoteListData, localListData)
+ break
+ case 'overwrite_local_remote':
+ listData = overwriteList(localListData, remoteListData)
+ break
+ case 'overwrite_remote_local':
+ listData = overwriteList(remoteListData, localListData)
+ break
+ case 'overwrite_local_remote_full':
+ listData = localListData
+ break
+ case 'overwrite_remote_local_full':
+ listData = remoteListData
+ break
+ case 'none': return
+ case 'cancel':
+ socket.disconnect(true)
+ throw new Error('cancel')
+ }
+ return listData
+}
+
+const handleSyncList = async socket => {
+ const [remoteListData, localListData] = await Promise.all([getRemoteListData(socket), getLocalListData()])
+ console.log('handleSyncList', 'remoteListData, localListData')
+ const listData = {}
+ if (localListData.defaultList.list.length || localListData.loveList.list.length || localListData.userList.length) {
+ if (remoteListData.defaultList.list.length || remoteListData.loveList.list.length || remoteListData.userList.length) {
+ const mergedList = await handleMergeListData(socket)
+ console.log('handleMergeListData', 'mergedList')
+ console.log(mergedList)
+ if (!mergedList) return
+ listData.defaultList = mergedList.defaultList
+ listData.loveList = mergedList.loveList
+ listData.userList = mergedList.userList
+ setLocalList(mergedList)
+ setRemotelList(socket, mergedList)
+ } else {
+ setRemotelList(socket, localListData)
+ listData.defaultList = localListData.defaultList
+ listData.loveList = localListData.loveList
+ listData.userList = localListData.userList
+ }
+ } else {
+ if (remoteListData.defaultList.list.length || remoteListData.loveList.list.length || remoteListData.userList.length) {
+ setLocalList(remoteListData)
+ listData.defaultList = remoteListData.defaultList
+ listData.loveList = remoteListData.loveList
+ listData.userList = remoteListData.userList
+ } else {
+ listData.defaultList = localListData.defaultList
+ listData.loveList = localListData.loveList
+ listData.userList = localListData.userList
+ }
+ }
+ return updateSnapshot(socket.data.snapshotFilePath, JSON.stringify({
+ defaultList: listData.defaultList,
+ loveList: listData.loveList,
+ userList: listData.userList,
+ })).then(() => {
+ socket.data.isCreatedSnapshot = true
+ return listData
+ })
+}
+
+const mergeListDataFromSnapshot = (sourceList, targetList, snapshotList, addMusicLocationType) => {
+ const removedListIds = new Set()
+ const sourceListItemIds = new Set()
+ const targetListItemIds = new Set()
+ for (const m of sourceList.list) sourceListItemIds.add(m.songmid)
+ for (const m of targetList.list) targetListItemIds.add(m.songmid)
+ for (const m of snapshotList.list) {
+ if (!sourceListItemIds.has(m.songmid)) removedListIds.add(m.songmid)
+ }
+ for (const m of snapshotList.list) {
+ if (!targetListItemIds.has(m.songmid)) removedListIds.add(m.songmid)
+ }
+
+ let newList
+ const map = {}
+ const ids = []
+ switch (addMusicLocationType) {
+ case 'top':
+ newList = [...targetList.list, ...sourceList.list]
+ for (let i = newList.length - 1; i > -1; i--) {
+ const item = newList[i]
+ if (map[item.songmid] || removedListIds.has(item.songmid)) continue
+ ids.unshift(item.songmid)
+ map[item.songmid] = item
+ }
+ break
+ case 'bottom':
+ default:
+ newList = [...sourceList.list, ...targetList.list]
+ for (const item of newList) {
+ if (map[item.songmid] || removedListIds.has(item.songmid)) continue
+ ids.push(item.songmid)
+ map[item.songmid] = item
+ }
+ break
+ }
+ return {
+ ...sourceList,
+ list: ids.map(id => map[id]),
+ }
+}
+const handleMergeListDataFromSnapshot = async(socket, snapshot) => {
+ const addMusicLocationType = global.appSetting.list.addMusicLocationType
+ const [remoteListData, localListData] = await Promise.all([getRemoteListData(socket), getLocalListData()])
+ console.log('handleMergeListDataFromSnapshot', 'remoteListData, localListData')
+ const newListData = {}
+ newListData.defaultList = mergeListDataFromSnapshot(localListData.defaultList, remoteListData.defaultList, snapshot.defaultList, addMusicLocationType)
+ newListData.loveList = mergeListDataFromSnapshot(localListData.loveList, remoteListData.loveList, snapshot.loveList, addMusicLocationType)
+ const localUserListData = createListDataObj(localListData)
+ const remoteUserListData = createListDataObj(remoteListData)
+ const snapshotUserListData = createListDataObj(snapshot)
+ const removedListIds = new Set()
+ const localUserListIds = new Set()
+ const remoteUserListIds = new Set()
+ for (const l of localListData.userList) localUserListIds.add(l.id)
+ for (const l of remoteListData.userList) remoteUserListIds.add(l.id)
+
+ for (const l of snapshot.userList) {
+ if (!localUserListIds.has(l.id)) removedListIds.add(l.id)
+ }
+ for (const l of snapshot.userList) {
+ if (!remoteUserListIds.has(l.id)) removedListIds.add(l.id)
+ }
+
+ let newUserList = []
+ for (const list of localListData.userList) {
+ if (removedListIds.has(list.id)) continue
+ const remoteList = remoteUserListData[list.id]
+ let newList
+ if (remoteList) {
+ newList = mergeListDataFromSnapshot(list, remoteList, snapshotUserListData[list.id], addMusicLocationType)
+ } else {
+ newList = { ...list }
+ }
+ newUserList.push(newList)
+ }
+ for (const list of remoteListData.userList) {
+ if (removedListIds.has(list.id) || localUserListData[list.id]) continue
+ newUserList.push({ ...list })
+ }
+ newListData.userList = newUserList
+ setLocalList(newListData)
+ setRemotelList(socket, newListData)
+ return updateSnapshot(socket.data.snapshotFilePath, JSON.stringify({
+ defaultList: newListData.defaultList,
+ loveList: newListData.loveList,
+ userList: newListData.userList,
+ })).then(() => {
+ socket.data.isCreatedSnapshot = true
+ return newListData
+ })
+}
+
+const registerUpdateSnapshotTask = (socket, snapshot) => {
+ if (!socket.data.isCreatedSnapshot) return
+ const handleUpdateSnapshot = throttle(({ defaultList, loveList, userList }) => {
+ if (defaultList != null) snapshot.defaultList = defaultList
+ if (loveList != null) snapshot.loveList = loveList
+ if (userList != null) snapshot.userList = userList
+ updateSnapshot(socket.data.snapshotFilePath, JSON.stringify(snapshot))
+ }, 10000)
+ global.lx_event.common.on(COMMON_EVENT_NAME.saveMyList, handleUpdateSnapshot)
+ socket.on('disconnect', () => {
+ global.lx_event.common.off(COMMON_EVENT_NAME.saveMyList, handleUpdateSnapshot)
+ })
+}
+
+const syncList = async socket => {
+ socket.data.snapshotFilePath = path.join(app.getPath('userData'), `snapshot-${Buffer.from(socket.data.keyInfo.clientId).toString('hex').substring(0, 10)}.json`)
+ let fileData
+ let isSyncRequired = false
+ try {
+ fileData = await fsPromises.readFile(socket.data.snapshotFilePath)
+ fileData = JSON.parse(fileData)
+ } catch (err) {
+ if (err.code !== 'ENOENT') throw err
+ isSyncRequired = true
+ }
+ console.log('isSyncRequired', isSyncRequired)
+ if (isSyncRequired) return handleSyncList(socket)
+ return handleMergeListDataFromSnapshot(socket, fileData)
+}
+
+const checkSyncQueue = async() => {
+ if (!syncingId) return
+ await wait()
+ return checkSyncQueue()
+}
+module.exports = async(_io, socket) => {
+ io = _io
+ await checkSyncQueue()
+ syncingId = socket.data.keyInfo.clientId
+ return syncList(socket).then(newListData => {
+ registerUpdateSnapshotTask(socket, { ...newListData })
+ return finishedSync(socket)
+ }).finally(() => {
+ syncingId = null
+ })
+}
diff --git a/src/main/modules/sync/server/utils.js b/src/main/modules/sync/server/utils.js
new file mode 100644
index 00000000..e880fd83
--- /dev/null
+++ b/src/main/modules/sync/server/utils.js
@@ -0,0 +1,93 @@
+const { networkInterfaces } = require('os')
+const { randomBytes, createCipheriv, createDecipheriv } = require('crypto')
+const getStore = require('@common/store')
+const STORE_NAME = 'sync'
+
+exports.getAddress = () => {
+ const nets = networkInterfaces()
+ const results = []
+ // console.log(nets)
+
+ for (const name of Object.keys(nets)) {
+ for (const net of nets[name]) {
+ // Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses
+ if (net.family === 'IPv4' && !net.internal) {
+ results.push(net.address)
+ }
+ }
+ }
+ return results
+}
+
+let serverId
+exports.getServerId = () => {
+ if (serverId) return serverId
+ const store = getStore(STORE_NAME)
+ serverId = store.get('serverId')
+ if (!serverId) {
+ serverId = randomBytes(4 * 4).toString('base64')
+ store.set('serverId', serverId)
+ }
+ return serverId
+}
+
+let keyInfos
+exports.createClientKeyInfo = deviceName => {
+ const keyInfo = {
+ clientId: randomBytes(4 * 4).toString('base64'),
+ key: randomBytes(16).toString('base64'),
+ iv: randomBytes(16).toString('base64'),
+ deviceName,
+ }
+ const store = getStore(STORE_NAME)
+ if (!keyInfos) keyInfos = store.get('keys') || {}
+ if (Object.keys(keyInfos).length > 101) throw new Error('max keys')
+
+ keyInfos[keyInfo.clientId] = keyInfo
+ store.set('keys', keyInfos)
+ return keyInfo
+}
+exports.setClientKeyInfo = keyInfo => {
+ keyInfos[keyInfo.clientId] = keyInfo
+ const store = getStore(STORE_NAME)
+ store.set('keys', keyInfos)
+}
+exports.getClientKeyInfo = clientId => {
+ if (!keyInfos) {
+ const store = getStore(STORE_NAME)
+ keyInfos = store.get('keys') || {}
+ }
+ return keyInfos[clientId] || null
+}
+
+exports.generateCode = () => {
+ return Math.random().toString().substring(2, 8)
+}
+
+exports.aesEncrypt = (buffer, key, iv) => {
+ const cipher = createCipheriv('aes-128-cbc', Buffer.from(key, 'base64'), Buffer.from(iv, 'base64'))
+ return Buffer.concat([cipher.update(buffer), cipher.final()]).toString('base64')
+}
+
+exports.aesDecrypt = (text, key, iv) => {
+ const decipher = createDecipheriv('aes-128-cbc', Buffer.from(key, 'base64'), Buffer.from(iv, 'base64'))
+ return Buffer.concat([decipher.update(Buffer.from(text, 'base64')), decipher.final()]).toString()
+}
+
+exports.encryptMsg = (keyInfo, msg) => {
+ return msg
+ // if (!keyInfo) return ''
+ // return exports.aesEncrypt(msg, keyInfo.key, keyInfo.iv)
+}
+
+exports.decryptMsg = (keyInfo, enMsg) => {
+ return enMsg
+ // if (!keyInfo) return ''
+ // let msg = ''
+ // try {
+ // msg = exports.aesDecrypt(enMsg, keyInfo.key, keyInfo.iv)
+ // } catch (err) {
+ // console.log(err)
+ // }
+ // return msg
+}
diff --git a/src/main/rendererEvents/index.js b/src/main/rendererEvents/index.js
index 9fafd6df..1df53eeb 100644
--- a/src/main/rendererEvents/index.js
+++ b/src/main/rendererEvents/index.js
@@ -23,3 +23,4 @@ require('./musicUrl')
require('./kw_decodeLyric')
require('./userApi')
+require('./sync')
diff --git a/src/main/rendererEvents/playList.js b/src/main/rendererEvents/playList.js
index 3eb0aed3..d73a7e29 100644
--- a/src/main/rendererEvents/playList.js
+++ b/src/main/rendererEvents/playList.js
@@ -24,6 +24,7 @@ mainOn(ipcMainWindowNames.save_playlist, (event, { type, data }) => {
switch (type) {
case 'myList':
handleSaveList(data)
+ global.lx_event.common.saveMyList(data)
break
case 'downloadList':
getStore('downloadList').set('list', data)
diff --git a/src/main/rendererEvents/sync.js b/src/main/rendererEvents/sync.js
new file mode 100644
index 00000000..55569f84
--- /dev/null
+++ b/src/main/rendererEvents/sync.js
@@ -0,0 +1,33 @@
+const { mainSend, NAMES: { mainWindow: ipcMainWindowNames }, mainOn, mainHandle } = require('@common/ipc')
+const { eventNames, modules, startServer, stopServer, getStatus, generateCode } = require('../modules/sync')
+
+
+mainOn(ipcMainWindowNames.sync_action_list, (event, { action, data }) => {
+ modules.list.sendListAction(action, data)
+})
+
+mainHandle(ipcMainWindowNames.sync_enable, (event, { enable, port }) => {
+ return enable ? startServer(port) : stopServer()
+})
+
+mainHandle(ipcMainWindowNames.sync_get_status, () => {
+ return getStatus()
+})
+
+mainHandle(ipcMainWindowNames.sync_generate_code, () => {
+ return generateCode()
+})
+
+mainOn(ipcMainWindowNames.sync_list, (event, { action, data }) => {
+ global.lx_event.sync.sync_handle_list({ action, data })
+})
+
+global.lx_event.sync.on(eventNames.sync_action_list, ({ action, data }) => {
+ mainSend(global.modules.mainWindow, ipcMainWindowNames.sync_action_list, { action, data })
+})
+global.lx_event.sync.on(eventNames.status, status => {
+ mainSend(global.modules.mainWindow, ipcMainWindowNames.sync_status, status)
+})
+global.lx_event.sync.on(eventNames.sync_list, ({ action, data }) => {
+ mainSend(global.modules.mainWindow, ipcMainWindowNames.sync_list, { action, data })
+})
diff --git a/src/main/utils/autoUpdate.js b/src/main/utils/autoUpdate.js
index 4c562584..3051574a 100644
--- a/src/main/utils/autoUpdate.js
+++ b/src/main/utils/autoUpdate.js
@@ -1,4 +1,4 @@
-const { log } = require('../../common/utils')
+const { log, isWin } = require('../../common/utils')
const { autoUpdater } = require('electron-updater')
const { mainOn, mainSend, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc')
@@ -120,6 +120,11 @@ module.exports = () => {
}, 1000)
})
- autoUpdater.checkForUpdates()
+ // 由于集合安装包中不包含win arm版,这将会导致arm版更新失败
+ if (isWin && process.arch.includes('arm')) {
+ handleSendEvent({ type: ipcMainWindowNames.update_error, info: 'failed' })
+ } else {
+ autoUpdater.checkForUpdates()
+ }
}
diff --git a/src/renderer/App.vue b/src/renderer/App.vue
index 56626d6b..5e548f19 100644
--- a/src/renderer/App.vue
+++ b/src/renderer/App.vue
@@ -8,6 +8,7 @@
core-icons
material-version-modal(v-show="version.showModal")
material-pact-modal(v-show="!setting.isAgreePact || globalObj.isShowPact")
+ material-sync-mode-modal(v-show="globalObj.sync.isShowSyncMode")
#container(v-else :class="theme")
core-aside#left
#right
@@ -17,6 +18,7 @@
core-icons
material-version-modal(v-show="version.showModal")
material-pact-modal(v-show="!setting.isAgreePact || globalObj.isShowPact")
+ material-sync-mode-modal(v-show="globalObj.sync.isShowSyncMode")
diff --git a/src/renderer/components/core/PlayerDetail.vue b/src/renderer/components/core/PlayerDetail.vue
index 3ed3442b..7cd02a0c 100644
--- a/src/renderer/components/core/PlayerDetail.vue
+++ b/src/renderer/components/core/PlayerDetail.vue
@@ -282,7 +282,7 @@ export default {
setProgress(event) {
this.$emit('action', {
type: 'progress',
- data: event.offsetX / this.pregessWidth,
+ data: event,
})
},
setProgressWidth() {
diff --git a/src/renderer/components/material/Modal.vue b/src/renderer/components/material/Modal.vue
index d9981428..6b6de777 100644
--- a/src/renderer/components/material/Modal.vue
+++ b/src/renderer/components/material/Modal.vue
@@ -140,7 +140,7 @@ export default {
box-shadow: 0 0 3px rgba(0, 0, 0, .3);
overflow: hidden;
max-height: 80%;
- max-width: 70%;
+ max-width: 76%;
position: relative;
display: flex;
flex-flow: column nowrap;
diff --git a/src/renderer/components/material/SyncModeModal.vue b/src/renderer/components/material/SyncModeModal.vue
new file mode 100644
index 00000000..bded1cc3
--- /dev/null
+++ b/src/renderer/components/material/SyncModeModal.vue
@@ -0,0 +1,164 @@
+
+material-modal(:show="globalObj.sync.isShowSyncMode" @close="handleClose(false)" :bgClose="false" :close-btn="false")
+ main(:class="$style.main")
+ h2 {{$t('material.sync_mode_modal.title', { name: globalObj.sync.deviceName })}}
+ div.scroll(:class="$style.content")
+ dl(:class="$style.btnGroup")
+ dt(:class="$style.label") {{$t('material.sync_mode_modal.merge_label')}}
+ dd(:class="$style.btns")
+ material-btn(:class="$style.btn" @click="handleSelectMode('merge_local_remote')") {{$t('material.sync_mode_modal.merge_btn_local_remote')}}
+ material-btn(:class="$style.btn" @click="handleSelectMode('merge_remote_local')") {{$t('material.sync_mode_modal.merge_btn_remote_local')}}
+ dl(:class="$style.btnGroup")
+ dt(:class="$style.label") {{$t('material.sync_mode_modal.overwrite_label')}}
+ dd(:class="$style.btns")
+ material-btn(:class="$style.btn" @click="handleSelectMode('overwrite_local_remote')") {{$t('material.sync_mode_modal.overwrite_btn_local_remote')}}
+ material-btn(:class="$style.btn" @click="handleSelectMode('overwrite_remote_local')") {{$t('material.sync_mode_modal.overwrite_btn_remote_local')}}
+ dd(style="font-size: 14px; margin-top: 5px;")
+ material-checkbox(id="sync_mode_modal_isOverwrite" v-model="isOverwrite" :label="$t('material.sync_mode_modal.overwrite')")
+
+ dl(:class="$style.btnGroup")
+ dt(:class="$style.label") {{$t('material.sync_mode_modal.other_label')}}
+ dd(:class="$style.btns")
+ material-btn(:class="$style.btn" @click="handleSelectMode('none')") {{$t('material.sync_mode_modal.overwrite_btn_none')}}
+ material-btn(:class="$style.btn" @click="handleSelectMode('cancel')") {{$t('material.sync_mode_modal.overwrite_btn_cancel')}}
+ dl(:class="$style.btnGroup")
+ dd
+ section(:class="$style.tipGroup")
+ h3(:class="$style.title") {{$t('material.sync_mode_modal.merge_tip')}}
+ p(:class="$style.tip") {{$t('material.sync_mode_modal.merge_tip_desc')}}
+ section(:class="$style.tipGroup")
+ h3(:class="$style.title") {{$t('material.sync_mode_modal.overwrite_tip')}}
+ p(:class="$style.tip") {{$t('material.sync_mode_modal.overwrite_tip_desc')}}
+ section(:class="$style.tipGroup")
+ h3(:class="$style.title") {{$t('material.sync_mode_modal.other_tip')}}
+ p(:class="$style.tip") {{$t('material.sync_mode_modal.other_tip_desc')}}
+
+
+
+
+
+
diff --git a/src/renderer/event/index.js b/src/renderer/event/index.js
index d818b955..29374416 100644
--- a/src/renderer/event/index.js
+++ b/src/renderer/event/index.js
@@ -1,7 +1,7 @@
import Vue from 'vue'
import keyBind from '../utils/keyBind'
import { rendererOn, rendererSend, NAMES, rendererInvoke } from '../../common/ipc'
-import { base as baseName } from './names'
+import { base as baseName, sync as syncName } from './names'
import { common as hotKeyNamesCommon } from '../../common/hotKey'
const eventHub = window.eventHub = new Vue()
@@ -77,3 +77,18 @@ rendererOn(NAMES.mainWindow.set_hot_key_config, (event, config) => {
}
window.eventHub.$emit(baseName.set_hot_key_config, config)
})
+
+rendererOn(NAMES.mainWindow.sync_action_list, (event, { action, data }) => {
+ window.eventHub.$emit(syncName.handle_action_list, { action, data })
+})
+eventHub.$on(syncName.send_action_list, ({ action, data }) => {
+ if (!window.globalObj.sync.enable) return
+ rendererSend(NAMES.mainWindow.sync_action_list, { action, data })
+})
+rendererOn(NAMES.mainWindow.sync_list, (event, { action, data }) => {
+ window.eventHub.$emit(syncName.handle_sync_list, { action, data })
+})
+eventHub.$on(syncName.send_sync_list, ({ action, data }) => {
+ if (!window.globalObj.sync.enable) return
+ rendererSend(NAMES.mainWindow.sync_list, { action, data })
+})
diff --git a/src/renderer/event/names.js b/src/renderer/event/names.js
index e8135907..7ce8c475 100644
--- a/src/renderer/event/names.js
+++ b/src/renderer/event/names.js
@@ -10,6 +10,12 @@ const names = {
set_config: 'set_config',
set_hot_key_config: 'set_hot_key_config',
},
+ sync: {
+ send_action_list: 'send_action_list',
+ handle_action_list: 'handle_action_list',
+ send_sync_list: 'send_sync_list',
+ handle_sync_list: 'handle_sync_list',
+ },
}
for (const item of Object.keys(names)) {
@@ -20,3 +26,4 @@ for (const item of Object.keys(names)) {
}
export const base = names.base
+export const sync = names.sync
diff --git a/src/renderer/lang/en-us/material/sync_mode_modal.json b/src/renderer/lang/en-us/material/sync_mode_modal.json
new file mode 100644
index 00000000..77d3b00d
--- /dev/null
+++ b/src/renderer/lang/en-us/material/sync_mode_modal.json
@@ -0,0 +1,19 @@
+{
+ "merge_btn_local_remote": "Local list merge remote list",
+ "merge_btn_remote_local": "Remote list merge local list",
+ "merge_label": "Merge",
+ "merge_tip": "Merge:",
+ "merge_tip_desc": "Merge the two lists together, the same song will be removed (the song of the merged person is removed), and different songs will be added.",
+ "other_label": "Other",
+ "other_tip": "Other: ",
+ "other_tip_desc": "\"Only use real-time synchronization function\" will not modify the lists of both parties, only real-time synchronization operations; \"Cancel synchronization\" will directly disconnect the two parties.",
+ "overwrite": "Full coverage",
+ "overwrite_btn_cancel": "Cancel sync",
+ "overwrite_btn_local_remote": "Local list Overwrite remote list",
+ "overwrite_btn_none": "Only use real-time synchronization",
+ "overwrite_btn_remote_local": "Remote list Overwrite local list",
+ "overwrite_label": "Cover",
+ "overwrite_tip": "Cover: ",
+ "overwrite_tip_desc": "The list with the same ID of the covered person and the covered list will be deleted and replaced with the list of the covered person (lists with different list IDs will be merged together). If you check Complete coverage, all lists of the covered person will be moved. \nDivide, and then replace with a list of overriders.",
+ "title": "Choose how to synchronize the list with {name}"
+}
diff --git a/src/renderer/lang/en-us/view/setting.json b/src/renderer/lang/en-us/view/setting.json
index 946cbeb3..1db3e36c 100644
--- a/src/renderer/lang/en-us/view/setting.json
+++ b/src/renderer/lang/en-us/view/setting.json
@@ -130,6 +130,14 @@
"search_focus_search_box": "Automatically focus the search box on startup",
"search_history": "Search history",
"search_hot": "Top Searches",
+ "sync": "Data synchronization [This is a test function, it is recommended to back up the playlist before using it for the first time]",
+ "sync_address": "Synchronization service address: {address}",
+ "sync_auth_code": "Connection code: {code}",
+ "sync_device": "Connected devices: {devices}",
+ "sync_enable": "Enable the synchronization function (because the data is transmitted in clear text, please use it under a trusted network)",
+ "sync_port": "Sync port settings",
+ "sync_port_tip": "Please enter the synchronization service port number",
+ "sync_refresh_code": "Refresh the connection code",
"update": "Update",
"update_checking": "Checking for updates...",
"update_current_label": "Current version: ",
diff --git a/src/renderer/lang/zh-cn/material/sync_mode_modal.json b/src/renderer/lang/zh-cn/material/sync_mode_modal.json
new file mode 100644
index 00000000..e50ff220
--- /dev/null
+++ b/src/renderer/lang/zh-cn/material/sync_mode_modal.json
@@ -0,0 +1,19 @@
+{
+ "merge_btn_local_remote": "本机列表 合并 远程列表",
+ "merge_btn_remote_local": "远程列表 合并 本机列表",
+ "merge_label": "合并",
+ "merge_tip": "合并:",
+ "merge_tip_desc": "将两边的列表合并到一起,相同的歌曲将被去掉(去掉的是被合并者的歌曲),不同的歌曲将被添加。",
+ "other_label": "其他",
+ "other_tip": "其他:",
+ "other_tip_desc": "“仅使用实时同步功能”将不修改双方的列表,仅实时同步操作;“取消同步”将直接断开双方的连接。",
+ "overwrite": "完全覆盖",
+ "overwrite_btn_cancel": "取消同步",
+ "overwrite_btn_local_remote": "本机列表 覆盖 远程列表",
+ "overwrite_btn_none": "仅使用实时同步功能",
+ "overwrite_btn_remote_local": "远程列表 覆盖 本机列表",
+ "overwrite_label": "覆盖",
+ "overwrite_tip": "覆盖:",
+ "overwrite_tip_desc": "被覆盖者与覆盖者列表ID相同的列表将被删除后替换成覆盖者的列表(列表ID不同的列表将被合并到一起),若勾选完全覆盖,则被覆盖者的所有列表将被移除,然后替换成覆盖者的列表。",
+ "title": "选择与 {name} 的列表同步方式"
+}
diff --git a/src/renderer/lang/zh-cn/view/setting.json b/src/renderer/lang/zh-cn/view/setting.json
index 7ee36002..6c9a8fa5 100644
--- a/src/renderer/lang/zh-cn/view/setting.json
+++ b/src/renderer/lang/zh-cn/view/setting.json
@@ -130,6 +130,14 @@
"search_focus_search_box": "启动时自动聚焦搜索框",
"search_history": "显示历史搜索记录",
"search_hot": "显示热门搜索",
+ "sync": "数据同步 [此为测试功能,首次使用前建议先备份一次歌单]",
+ "sync_address": "同步服务地址:{address}",
+ "sync_auth_code": "连接码:{code}",
+ "sync_device": "已连接的设备:{devices}",
+ "sync_enable": "启用同步功能(由于数据是明文传输,请在受信任的网络下使用)",
+ "sync_port": "同步端口设置",
+ "sync_port_tip": "请输入同步服务端口号",
+ "sync_refresh_code": "刷新连接码",
"update": "软件更新",
"update_checking": "检查更新中...",
"update_current_label": "当前版本:",
diff --git a/src/renderer/lang/zh-tw/material/sync_mode_modal.json b/src/renderer/lang/zh-tw/material/sync_mode_modal.json
new file mode 100644
index 00000000..bce8305b
--- /dev/null
+++ b/src/renderer/lang/zh-tw/material/sync_mode_modal.json
@@ -0,0 +1,19 @@
+{
+ "merge_btn_local_remote": "本機列表 合併 遠程列表",
+ "merge_btn_remote_local": "遠程列表 合併 本機列表",
+ "merge_label": "合併",
+ "merge_tip": "合併:",
+ "merge_tip_desc": "將兩邊的列表合併到一起,相同的歌曲將被去掉(去掉的是被合併者的歌曲),不同的歌曲將被添加。",
+ "other_label": "其他",
+ "other_tip": "其他:",
+ "other_tip_desc": "“僅使用實時同步功能”將不修改雙方的列表,僅實時同步操作;“取消同步”將直接斷開雙方的連接。",
+ "overwrite": "完全覆蓋",
+ "overwrite_btn_cancel": "取消同步",
+ "overwrite_btn_local_remote": "本機列表 覆蓋 遠程列表",
+ "overwrite_btn_none": "僅使用實時同步功能",
+ "overwrite_btn_remote_local": "遠程列表 覆蓋 本機列表",
+ "overwrite_label": "覆蓋",
+ "overwrite_tip": "覆蓋:",
+ "overwrite_tip_desc": "被覆蓋者與覆蓋者列表ID相同的列表將被刪除後替換成覆蓋者的列表(列表ID不同的列表將被合併到一起),若勾選完全覆蓋,則被覆蓋者的所有列表將被移除,然後替換成覆蓋者的列表。",
+ "title": "選擇與 {name} 的列表同步方式"
+}
diff --git a/src/renderer/lang/zh-tw/view/setting.json b/src/renderer/lang/zh-tw/view/setting.json
index 79d82a22..4b9308de 100644
--- a/src/renderer/lang/zh-tw/view/setting.json
+++ b/src/renderer/lang/zh-tw/view/setting.json
@@ -130,6 +130,14 @@
"search_focus_search_box": "啟動時自動聚焦搜索框",
"search_history": "顯示歷史搜索記錄",
"search_hot": "顯示熱門搜索",
+ "sync": "數據同步 [此為測試功能,首次使用前建議先備份一次歌單]",
+ "sync_address": "同步服務地址:{address}",
+ "sync_auth_code": "連接碼:{code}",
+ "sync_device": "已連接的設備:{devices}",
+ "sync_enable": "啟用同步功能(由於數據是明文傳輸,請在受信任的網絡下使用)",
+ "sync_port": "同步端口設置",
+ "sync_port_tip": "請輸入同步服務端口號",
+ "sync_refresh_code": "刷新連接碼",
"update": "軟件更新",
"update_checking": "檢查更新中...",
"update_current_label": "當前版本:",
diff --git a/src/renderer/store/modules/list.js b/src/renderer/store/modules/list.js
index 13765a68..b53c6d71 100644
--- a/src/renderer/store/modules/list.js
+++ b/src/renderer/store/modules/list.js
@@ -1,10 +1,14 @@
import musicSdk from '../../utils/music'
import { clearLyric, clearMusicUrl } from '../../utils'
+import { sync as eventSyncName } from '@renderer/event/names'
let allList = {}
window.allList = allList
const allListInit = (defaultList, loveList, userList) => {
+ for (const id of Object.keys(allList)) {
+ delete allList[id]
+ }
allList[defaultList.id] = defaultList
allList[loveList.id] = loveList
for (const list of userList) allList[list.id] = list
@@ -67,8 +71,28 @@ const mutations = {
if (userList != null) state.userList = userList
allListInit(state.defaultList, state.loveList, state.userList)
state.isInitedList = true
+
+ // if (!isSync) {
+ // window.eventHub.$emit(eventSyncName.send_action_list, {
+ // action: 'init_list',
+ // data: { defaultList, loveList, userList },
+ // })
+ // }
},
- setList(state, { id, list, name, location, source, sourceListId }) {
+ setSyncListData(state, { defaultList, loveList, userList }) {
+ state.defaultList.list.splice(0, state.defaultList.list.length, ...defaultList.list)
+ state.loveList.list.splice(0, state.loveList.list.length, ...loveList.list)
+ state.userList = userList
+ allListInit(state.defaultList, state.loveList, state.userList)
+ },
+ setList(state, { id, list, name, location, source, sourceListId, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'set_list',
+ data: { id, list, name, location, source, sourceListId },
+ })
+ }
+
const targetList = allList[id]
if (targetList) {
if (name && targetList.name === name) {
@@ -90,11 +114,20 @@ const mutations = {
state.userList.push(newList)
allListUpdate(newList)
},
- listAdd(state, { id, musicInfo }) {
+ listAdd(state, { id, musicInfo, addMusicLocationType, isSync }) {
+ if (!addMusicLocationType) addMusicLocationType = this.state.setting.list.addMusicLocationType
+
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'list_add',
+ data: { id, musicInfo, addMusicLocationType },
+ })
+ }
+
const targetList = allList[id]
if (!targetList) return
if (targetList.list.some(s => s.songmid === musicInfo.songmid)) return
- switch (this.state.setting.list.addMusicLocationType) {
+ switch (addMusicLocationType) {
case 'top':
targetList.list.unshift(musicInfo)
break
@@ -104,11 +137,18 @@ const mutations = {
break
}
},
- listMove(state, { fromId, musicInfo, toId }) {
+ listMove(state, { fromId, musicInfo, toId, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'list_move',
+ data: { fromId, musicInfo, toId },
+ })
+ }
+
const fromList = allList[fromId]
const toList = allList[toId]
if (!fromList || !toList) return
- fromList.list.splice(fromList.list.indexOf(musicInfo), 1)
+ fromList.list.splice(fromList.list.findIndex(s => s.songmid === musicInfo.songmid), 1)
let index = toList.list.findIndex(s => s.songmid === musicInfo.songmid)
if (index < 0) {
switch (this.state.setting.list.addMusicLocationType) {
@@ -122,41 +162,79 @@ const mutations = {
}
}
},
- listAddMultiple(state, { id, list }) {
+ listAddMultiple(state, { id, list, addMusicLocationType, isSync }) {
+ if (!addMusicLocationType) addMusicLocationType = this.state.setting.list.addMusicLocationType
+
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'list_add_multiple',
+ data: { id, list, addMusicLocationType },
+ })
+ }
+
let targetList = allList[id]
if (!targetList) return
let newList
- switch (this.state.setting.list.addMusicLocationType) {
+ const map = {}
+ const ids = []
+ switch (addMusicLocationType) {
case 'top':
newList = [...list, ...targetList.list]
+ for (let i = newList.length - 1; i > -1; i--) {
+ const item = newList[i]
+ if (map[item.songmid]) continue
+ ids.unshift(item.songmid)
+ map[item.songmid] = item
+ }
break
case 'bottom':
default:
newList = [...targetList.list, ...list]
+ for (const item of newList) {
+ if (map[item.songmid]) continue
+ ids.push(item.songmid)
+ map[item.songmid] = item
+ }
break
}
- let map = {}
- let ids = []
- for (const item of newList) {
- if (map[item.songmid]) continue
- ids.push(item.songmid)
- map[item.songmid] = item
- }
targetList.list.splice(0, targetList.list.length, ...ids.map(id => map[id]))
},
// { fromId, toId, list }
- listMoveMultiple(state, { fromId, toId, list }) {
+ listMoveMultiple(state, { fromId, toId, list, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'list_move_multiple',
+ data: { fromId, toId, list },
+ })
+ }
+
// console.log(state.commit)
- this.commit('list/listRemoveMultiple', { id: fromId, list })
- this.commit('list/listAddMultiple', { id: toId, list })
+ this.commit('list/listRemoveMultiple', { listId: fromId, ids: list.map(s => s.songmid), isSync: true })
+ this.commit('list/listAddMultiple', { id: toId, list, isSync: true })
},
- listRemove(state, { id, index }) {
- let targetList = allList[id]
+ listRemove(state, { listId, id, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'list_remove',
+ data: { listId, id },
+ })
+ }
+
+ let targetList = allList[listId]
if (!targetList) return
+ const index = targetList.list.findIndex(item => item.songmid == id)
+ if (index < 0) return
targetList.list.splice(index, 1)
},
- listRemoveMultiple(state, { id, list }) {
- let targetList = allList[id]
+ listRemoveMultiple(state, { listId, ids: musicIds, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'list_remove_multiple',
+ data: { listId, ids: musicIds },
+ })
+ }
+
+ let targetList = allList[listId]
if (!targetList) return
let map = {}
let ids = []
@@ -164,25 +242,50 @@ const mutations = {
ids.push(item.songmid)
map[item.songmid] = item
}
- for (const item of list) {
- if (map[item.songmid]) delete map[item.songmid]
+ for (const songmid of musicIds) {
+ if (map[songmid]) delete map[songmid]
}
let newList = []
for (const id of ids) if (map[id]) newList.push(map[id])
targetList.list.splice(0, targetList.list.length, ...newList)
},
- listClear(state, id) {
+ listClear(state, { id, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'list_clear',
+ data: { id },
+ })
+ }
+
let targetList = allList[id]
if (!targetList) return
targetList.list.splice(0, targetList.list.length)
},
- updateMusicInfo(state, { id, index, data, musicInfo = {} }) {
- let targetList = allList[id]
- if (!targetList) return Object.assign(musicInfo, data)
- Object.assign(targetList.list[index], data)
+ updateMusicInfo(state, { listId, id, data, musicInfo, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'update_music_info',
+ data: { listId, id, data, musicInfo },
+ })
+ }
+
+ let targetList = allList[listId]
+ if (!targetList) {
+ if (musicInfo) Object.assign(musicInfo, data)
+ return
+ }
+ const targetMusicInfo = targetList.list.find(item => item.songmid == id)
+ if (targetMusicInfo) Object.assign(targetMusicInfo, data)
},
- createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId }) {
+ createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'create_user_list',
+ data: { name, id, list, source, sourceListId },
+ })
+ }
+
let newList = state.userList.find(item => item.id === id)
if (!newList) {
newList = {
@@ -196,35 +299,75 @@ const mutations = {
state.userList.push(newList)
allListUpdate(newList)
}
- this.commit('list/listAddMultiple', { id, list })
+ this.commit('list/listAddMultiple', { id, list, isSync: true })
},
- removeUserList(state, index) {
+ removeUserList(state, { id, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'remove_user_list',
+ data: { id },
+ })
+ }
+
+ const index = state.userList.findIndex(l => l.id === id)
+ if (index < 0) return
let list = state.userList.splice(index, 1)[0]
allListRemove(list)
},
- setUserListName(state, { index, name }) {
- let list = state.userList[index]
+ setUserListName(state, { id, name, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'set_user_list_name',
+ data: { id, name },
+ })
+ }
+
+ let list = allList[id]
if (!list) return
list.name = name
},
- moveupUserList(state, index) {
- let targetList = state.userList[index]
+ moveupUserList(state, { id, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'moveup_user_list',
+ data: { id },
+ })
+ }
+
+ const index = state.userList.findIndex(l => l.id == id)
+ if (index < 0) return
+ let targetList = allList[id]
state.userList.splice(index, 1)
state.userList.splice(index - 1, 0, targetList)
},
- movedownUserList(state, index) {
- let targetList = state.userList[index]
+ movedownUserList(state, { id, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'movedown_user_list',
+ data: { id },
+ })
+ }
+ const index = state.userList.findIndex(l => l.id == id)
+ if (index < 0) return
+ let targetList = allList[id]
state.userList.splice(index, 1)
state.userList.splice(index + 1, 0, targetList)
},
setListScroll(state, { id, location }) {
if (allList[id]) allList[id].location = location
},
- sortList(state, { id, sortNum, musicInfos }) {
- let targetList = allList[id]
- this.commit('list/listRemoveMultiple', { id, list: musicInfos })
+ setMusicPosition(state, { id, position, list, isSync }) {
+ if (!isSync) {
+ window.eventHub.$emit(eventSyncName.send_action_list, {
+ action: 'set_music_position',
+ data: { id, position, list },
+ })
+ }
- targetList.list.splice(sortNum - 1, 0, ...musicInfos)
+ let targetList = allList[id]
+ this.commit('list/listRemoveMultiple', { listId: id, ids: list.map(m => m.songmid), isSync: true })
+
+ targetList.list.splice(position - 1, 0, ...list)
},
clearCache() {
const lists = Object.values(allList)
diff --git a/src/renderer/store/modules/player.js b/src/renderer/store/modules/player.js
index 9444d749..4f6c5ef7 100644
--- a/src/renderer/store/modules/player.js
+++ b/src/renderer/store/modules/player.js
@@ -141,6 +141,7 @@ const getLyric = function(musicInfo, retryedSource = [], originMusic) {
})
}
+let prevPlayIndex
// getters
const getters = {
list: state => state.listInfo.list,
@@ -156,13 +157,14 @@ const getters = {
if (listId != '__temp__') {
if (isPlayList) {
- playIndex = state.listInfo.list.indexOf(state.playMusicInfo.musicInfo)
+ playIndex = state.listInfo.list.findIndex(m => m.songmid == state.playMusicInfo.musicInfo.songmid)
if (!isTempPlay) listPlayIndex = playIndex
} else {
let list = window.allList[listId]
- if (list) playIndex = list.list.indexOf(state.playMusicInfo.musicInfo)
+ if (list) playIndex = list.list.findIndex(m => m.songmid == state.playMusicInfo.musicInfo.songmid)
}
}
+ if (listPlayIndex > -1) prevPlayIndex = listPlayIndex
// console.log({
// listId,
// playIndex,
@@ -170,7 +172,7 @@ const getters = {
// listPlayIndex,
// isPlayList,
// isTempPlay,
- // musicInfo: state.playMusicInfo.musicInfo,
+ // // musicInfo: state.playMusicInfo.musicInfo,
// })
return {
listId,
@@ -250,9 +252,9 @@ const actions = {
if (state.playedList.length) {
// 从已播放列表移除播放列表已删除的歌曲
let index
- for (index = state.playedList.indexOf(state.playMusicInfo) - 1; index > -1; index--) {
+ for (index = state.playedList.findIndex(m => m.songmid === state.playMusicInfo.musicInfo.songmid) - 1; index > -1; index--) {
const playMusicInfo = state.playedList[index]
- if (playMusicInfo.listId == currentListId && !currentList.includes(playMusicInfo.musicInfo)) {
+ if (playMusicInfo.listId == currentListId && !currentList.some(m => m.songmid === playMusicInfo.musicInfo.songmid)) {
commit('removePlayedList', index)
continue
}
@@ -273,7 +275,19 @@ const actions = {
})
if (!filteredList.length) return commit('setPlayMusicInfo', null)
const playInfo = getters.playInfo
- let currentIndex = filteredList.indexOf(currentList[playInfo.listPlayIndex])
+ let currentMusic
+ if (playInfo.listPlayIndex < 0) {
+ let index = prevPlayIndex
+ if (index > currentList.length - 1) index = 0
+ while (index > -1) {
+ currentMusic = currentList[index]
+ if (currentMusic) break
+ index--
+ }
+ } else {
+ currentMusic = currentList[playInfo.listPlayIndex]
+ }
+ let currentIndex = filteredList.findIndex(m => m.songmid == currentMusic.songmid)
if (currentIndex == -1) currentIndex = 0
let nextIndex = currentIndex
if (!playInfo.isTempPlay) {
@@ -311,9 +325,9 @@ const actions = {
if (state.playedList.length) {
// 从已播放列表移除播放列表已删除的歌曲
let index
- for (index = state.playedList.indexOf(state.playMusicInfo) + 1; index < state.playedList.length; index++) {
+ for (index = state.playedList.findIndex(m => m.songmid === state.playMusicInfo.musicInfo.songmid) + 1; index < state.playedList.length; index++) {
const playMusicInfo = state.playedList[index]
- if (playMusicInfo.listId == currentListId && !currentList.includes(playMusicInfo.musicInfo)) {
+ if (playMusicInfo.listId == currentListId && !currentList.some(m => m.songmid === playMusicInfo.musicInfo.songmid)) {
commit('removePlayedList', index)
continue
}
@@ -334,7 +348,19 @@ const actions = {
if (!filteredList.length) return commit('setPlayMusicInfo', null)
const playInfo = getters.playInfo
- const currentIndex = filteredList.indexOf(currentList[playInfo.listPlayIndex])
+ let currentMusic
+ if (playInfo.listPlayIndex < 0) {
+ let index = prevPlayIndex - 1
+ if (index < 0) index = currentList.length - 1
+ while (index > -1) {
+ currentMusic = currentList[index]
+ if (currentMusic) break
+ index--
+ }
+ } else {
+ currentMusic = currentList[playInfo.listPlayIndex]
+ }
+ let currentIndex = filteredList.findIndex(m => m.songmid == currentMusic.songmid)
let nextIndex = currentIndex
switch (rootState.setting.player.togglePlayMethod) {
case 'listLoop':
@@ -433,7 +459,7 @@ const mutations = {
playIndex = -1
} else {
let listId = playMusicInfo.listId
- if (listId != '__temp__' && !playMusicInfo.isTempPlay && listId === state.listInfo.id) playIndex = state.listInfo.list.indexOf(playMusicInfo.musicInfo)
+ if (listId != '__temp__' && !playMusicInfo.isTempPlay && listId === state.listInfo.id) playIndex = state.listInfo.list.findIndex(m => m.songmid == playMusicInfo.musicInfo.songmid)
}
state.playMusicInfo = playMusicInfo
diff --git a/src/renderer/utils/music/kg/songList.js b/src/renderer/utils/music/kg/songList.js
index 97f5e0cf..fc20d4aa 100644
--- a/src/renderer/utils/music/kg/songList.js
+++ b/src/renderer/utils/music/kg/songList.js
@@ -165,7 +165,9 @@ export default {
: result.body.err_code
) !== 0)
) return this.createHttp(url, options, ++retryNum)
- return result.body.data || result.body.info
+ if (result.body.data) return result.body.data
+ if (Array.isArray(result.body.info)) return result.body
+ return result.body.info
},
createTask(hashs) {
@@ -183,9 +185,9 @@ export default {
let list = hashs
let tasks = []
while (list.length) {
- tasks.push(Object.assign({ data: list.slice(0, 20) }, data))
- if (list.length < 20) break
- list = list.slice(20)
+ tasks.push(Object.assign({ data: list.slice(0, 100) }, data))
+ if (list.length < 100) break
+ list = list.slice(100)
}
let url = 'http://kmr.service.kugou.com/v2/album_audio/audio'
return tasks.map(task => this.createHttp(url, {
@@ -267,6 +269,68 @@ export default {
}
},
+ deDuplication(datas) {
+ let ids = new Set()
+ return datas.filter(({ hash }) => {
+ if (ids.has(hash)) return false
+ ids.add(hash)
+ return true
+ })
+ },
+
+ async getUserListDetailByLink({ info }, link) {
+ let listInfo = info['0']
+ let total = listInfo.count
+ let tasks = []
+ let page = 0
+ while (total) {
+ const limit = total > 90 ? 90 : total
+ total -= limit
+ page += 1
+ tasks.push(this.createHttp(link.replace(/pagesize=\d+/, 'pagesize=' + limit).replace(/page=\d+/, 'page=' + page), {
+ headers: {
+ 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
+ Referer: link,
+ },
+ }).then(data => data.list.info))
+ }
+ let result = await Promise.all(tasks).then(([...datas]) => datas.flat())
+ result = await Promise.all(this.createTask(this.deDuplication(result).map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat())
+ // console.log(result)
+ return {
+ list: this.filterData2(result) || [],
+ page,
+ limit: this.listDetailLimit,
+ total: listInfo.count,
+ source: 'kg',
+ info: {
+ name: listInfo.name,
+ img: listInfo.pic && listInfo.pic.replace('{size}', 240),
+ // desc: body.result.info.list_desc,
+ author: listInfo.list_create_username,
+ // play_count: this.formatPlayCount(listInfo.count),
+ },
+ }
+ },
+ createGetListDetail2Task(id, total) {
+ let tasks = []
+ let page = 0
+ while (total) {
+ const limit = total > 300 ? 300 : total
+ total -= limit
+ page += 1
+ tasks.push(this.createHttp('https://mobiles.kugou.com/api/v5/special/song_v2?appid=1058&global_specialid=' + id + '&specialid=0&plat=0&version=8000&page=' + page + '&pagesize=' + limit + '&srcappid=2919&clientver=20000&clienttime=1586163263991&mid=1586163263991&uuid=1586163263991&dfid=-&signature=' + toMD5('NVPh5oo715z5DIWAeQlhMDsWXXQV4hwtappid=1058clienttime=1586163263991clientver=20000dfid=-global_specialid=' + id + 'mid=1586163263991page=' + page + 'pagesize=' + limit + 'plat=0specialid=0srcappid=2919uuid=1586163263991version=8000NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt'), {
+ headers: {
+ mid: '1586163263991',
+ Referer: 'https://m3ws.kugou.com/share/index.php',
+ 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+ dfid: '-',
+ clienttime: '1586163263991',
+ },
+ }).then(data => data.info))
+ }
+ return Promise.all(tasks).then(([...datas]) => datas.flat())
+ },
async getUserListDetail2(global_collection_id) {
let id = global_collection_id
if (id.length > 1000) throw new Error('get list error')
@@ -279,22 +343,14 @@ export default {
clienttime: '1586163242519',
},
})
- let songInfo = await this.createHttp('https://mobiles.kugou.com/api/v5/special/song_v2?appid=1058&global_specialid=' + id + '&specialid=0&plat=0&version=8000&pagesize=' + info.songcount + '&srcappid=2919&clientver=20000&clienttime=1586163263991&mid=1586163263991&uuid=1586163263991&dfid=-&signature=' + toMD5('NVPh5oo715z5DIWAeQlhMDsWXXQV4hwtappid=1058clienttime=1586163263991clientver=20000dfid=-global_specialid=' + id + 'mid=1586163263991pagesize=' + info.songcount + 'plat=0specialid=0srcappid=2919uuid=1586163263991version=8000NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt'), {
- headers: {
- mid: '1586163263991',
- Referer: 'https://m3ws.kugou.com/share/index.php',
- 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
- dfid: '-',
- clienttime: '1586163263991',
- },
- })
- let result = await Promise.all(this.createTask(songInfo.info.map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat())
+ const songInfo = await this.createGetListDetail2Task(id, info.songcount)
+ let result = await Promise.all(this.createTask(this.deDuplication(songInfo).map(item => ({ hash: item.hash })))).then(([...datas]) => datas.flat())
// console.log(info, songInfo)
return {
list: this.filterData2(result) || [],
page: 1,
- limit: songInfo.total,
- total: songInfo.total,
+ limit: this.listDetailLimit,
+ total: info.songcount,
source: 'kg',
info: {
name: info.specialname,
@@ -333,10 +389,9 @@ export default {
// console.log(body, location)
if (statusCode > 400) return this.getUserListDetail(link, page, ++retryNum)
if (location) {
+ // console.log(location)
if (location.includes('global_collection_id')) return this.getUserListDetail2(location.replace(/^.*?global_collection_id=(\w+)(?:&.*$|#.*$|$)/, '$1'))
if (location.includes('chain=')) return this.getUserListDetail3(location.replace(/^.*?chain=(\w+)(?:&.*$|#.*$|$)/, '$1'), page)
-
- // console.log('location', location)
if (location.includes('.html')) {
if (location.includes('zlist.html')) {
let link = location.replace(/^(.*)zlist\.html/, 'https://m3ws.kugou.com/zlist/list')
@@ -348,27 +403,12 @@ export default {
return this.getUserListDetail(link, page, ++retryNum)
} else return this.getUserListDetail3(location.replace(/.+\/(\w+).html(?:\?.*|&.*$|#.*$|$)/, '$1'), page)
}
+ // console.log('location', location)
return this.getUserListDetail(link, page, ++retryNum)
}
if (typeof body == 'string') return this.getUserListDetail2(body.replace(/^[\s\S]+?"global_collection_id":"(\w+)"[\s\S]+?$/, '$1'))
if (body.errcode !== 0) return this.getUserListDetail(link, page, ++retryNum)
- let listInfo = body.info['0']
- let result = body.list.info.map(item => ({ hash: item.hash }))
- result = await Promise.all(this.createTask(result)).then(([...datas]) => datas.flat())
- return {
- list: this.filterData2(result) || [],
- page,
- limit: this.listDetailLimit,
- total: listInfo.count,
- source: 'kg',
- info: {
- name: listInfo.name,
- img: listInfo.pic && listInfo.pic.replace('{size}', 240),
- // desc: body.result.info.list_desc,
- author: listInfo.list_create_username,
- // play_count: this.formatPlayCount(listInfo.count),
- },
- }
+ return this.getUserListDetailByLink(body, link)
},
getListDetail(id, page, tryNum = 0) { // 获取歌曲列表内的音乐
diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue
index d71f876c..e9022860 100644
--- a/src/renderer/views/List.vue
+++ b/src/renderer/views/List.vue
@@ -355,7 +355,7 @@ export default {
'removeUserList',
'setListScroll',
'setList',
- 'sortList',
+ 'setMusicPosition',
]),
...mapActions('songList', ['getListDetailAll']),
...mapActions('leaderboard', {
@@ -576,7 +576,7 @@ export default {
this.setPlayList({ list: this.listData, index })
},
handleRemove(index) {
- this.listRemove({ id: this.listId, index })
+ this.listRemove({ listId: this.listId, id: this.list[index].songmid })
},
handleListBtnClick(info) {
switch (info.action) {
@@ -677,8 +677,9 @@ export default {
let dom_target = this.$refs.dom_lists_list.querySelector('.' + this.$style.editing)
if (dom_target) dom_target.classList.remove(this.$style.editing)
let name = event.target.value.trim()
- if (name.length) return this.setUserListName({ index, name })
- event.target.value = this.userList[index].name
+ const targetList = this.userList[index]
+ if (name.length) return this.setUserListName({ id: targetList.id, name })
+ event.target.value = targetList.name
},
handleListsCreate(event) {
if (event.target.readonly) return
@@ -774,13 +775,13 @@ export default {
this.handleSyncSourceList(index)
break
case 'moveup':
- this.moveupUserList(index)
+ this.moveupUserList({ id: this.userList[index].id })
break
case 'movedown':
- this.movedownUserList(index)
+ this.movedownUserList({ id: this.userList[index].id })
break
case 'remove':
- this.removeUserList(index)
+ this.removeUserList({ id: this.userList[index].id })
break
}
},
@@ -870,7 +871,7 @@ export default {
break
case 'remove':
if (this.selectdListDetailData.length) {
- this.listRemoveMultiple({ id: this.listId, list: this.selectdListDetailData })
+ this.listRemoveMultiple({ listId: this.listId, ids: this.selectdListDetailData.map(m => m.songmid) })
this.removeAllSelectListDetail()
} else {
this.handleRemove(index)
@@ -929,10 +930,10 @@ export default {
},
handleSortMusicInfo(num) {
num = Math.min(num, this.list.length)
- this.sortList({
+ this.setMusicPosition({
id: this.listId,
- sortNum: num,
- musicInfos: this.selectdListDetailData.length ? [...this.selectdListDetailData] : [this.musicInfo],
+ position: num,
+ list: this.selectdListDetailData.length ? [...this.selectdListDetailData] : [this.musicInfo],
})
this.removeAllSelectListDetail()
this.isShowListSortModal = false
diff --git a/src/renderer/views/Setting.vue b/src/renderer/views/Setting.vue
index ada914d9..31774c21 100644
--- a/src/renderer/views/Setting.vue
+++ b/src/renderer/views/Setting.vue
@@ -150,6 +150,21 @@ div(:class="$style.main")
div
material-checkbox(id="setting_download_isDownloadLrc" v-model="current_setting.download.isDownloadLrc" :label="$t('view.setting.is_enable')")
+ dt#sync {{$t('view.setting.sync')}}
+ dd
+ material-checkbox(id="setting_sync_enable" v-model="current_setting.sync.enable" @change="handleSyncChange('enable')" :label="syncEnableTitle")
+ div
+ p.small {{$t('view.setting.sync_auth_code', { code: sync.status.code || '' })}}
+ p.small {{$t('view.setting.sync_address', { address: sync.status.address.join(', ') || '' })}}
+ p.small {{$t('view.setting.sync_device', { devices: syncDevices })}}
+ p
+ material-btn(:class="$style.btn" min :disabled="!sync.status.status" @click="handleRefreshSyncCode") {{$t('view.setting.sync_refresh_code')}}
+ dd
+ h3#sync_port {{$t('view.setting.sync_port')}}
+ div
+ p
+ material-input(:class="$style.gapLeft" v-model.trim="current_setting.sync.port" @change="handleSyncChange('port')" :placeholder="$t('view.setting.sync_port_tip')")
+
dt#hot_key {{$t('view.setting.hot_key')}}
dd
h3#hot_key_local_title {{$t('view.setting.hot_key_local_title')}}
@@ -295,7 +310,7 @@ import {
getSetting,
saveSetting,
} from '../utils'
-import { rendererSend, rendererInvoke, NAMES } from '@common/ipc'
+import { rendererSend, rendererInvoke, rendererOn, NAMES, rendererOff } from '@common/ipc'
import { mergeSetting, isMac } from '../../common/utils'
import apiSourceInfo from '../utils/music/api-source-info'
import fs from 'fs'
@@ -410,6 +425,21 @@ export default {
},
]
},
+ syncEnableTitle() {
+ let title = this.$t('view.setting.sync_enable')
+ if (this.sync.status.message) {
+ title += ` [${this.sync.status.message}]`
+ }
+ // else if (this.sync.status.address.length) {
+ // // title += ` [${this.sync.status.address.join(', ')}]`
+ // }
+ return title
+ },
+ syncDevices() {
+ return this.sync.status.devices.length
+ ? this.sync.status.devices.map(d => `${d.deviceName} (${d.clientId.substring(0, 5)})`).join(', ')
+ : ''
+ },
},
data() {
return {
@@ -474,6 +504,10 @@ export default {
isToTray: false,
themeId: 0,
},
+ sync: {
+ enable: false,
+ port: '23332',
+ },
windowSizeId: 1,
langId: 'cns',
themeId: 0,
@@ -608,6 +642,15 @@ export default {
},
isDisabledResourceCacheClear: false,
isDisabledListCacheClear: false,
+ sync: {
+ status: {
+ status: false,
+ message: '',
+ address: [],
+ code: '',
+ devices: [],
+ },
+ },
}
},
watch: {
@@ -665,6 +708,7 @@ export default {
window.eventHub.$off(eventBaseName.set_config, this.handleUpdateSetting)
window.eventHub.$off(eventBaseName.key_down, this.handleKeyDown)
window.eventHub.$off(eventBaseName.set_hot_key_config, this.handleUpdateHotKeyConfig)
+ this.syncUnInit()
if (this.current_setting.network.proxy.enable && !this.current_setting.network.proxy.host) window.globalObj.proxy.enable = false
},
@@ -684,6 +728,7 @@ export default {
this.current_hot_key = window.appHotKeyConfig
this.initHotKeyConfig()
this.getHotKeyStatus()
+ this.syncInit()
},
// initTOC() {
// const list = this.$refs.dom_setting_list.children
@@ -1151,6 +1196,42 @@ export default {
return status
},
+ setStatus(e, status) {
+ this.sync.status.status = status.status
+ this.sync.status.message = status.message
+ this.sync.status.address = status.address
+ this.sync.status.code = status.code
+ this.sync.status.devices = status.devices
+ },
+ syncInit() {
+ rendererInvoke(NAMES.mainWindow.sync_get_status).then(status => {
+ this.sync.status.status = status.status
+ this.sync.status.message = status.message
+ this.sync.status.address = status.address
+ this.sync.status.code = status.code
+ this.sync.status.devices = status.devices
+ })
+ rendererOn(NAMES.mainWindow.sync_status, this.setStatus)
+ },
+ syncUnInit() {
+ rendererOff(NAMES.mainWindow.sync_status, this.setStatus)
+ },
+ handleSyncChange(action) {
+ switch (action) {
+ case 'port':
+ if (!this.current_setting.sync.enable) return
+ case 'enable':
+ rendererInvoke(NAMES.mainWindow.sync_enable, {
+ enable: this.current_setting.sync.enable,
+ port: this.current_setting.sync.port,
+ })
+ window.globalObj.sync.enable = this.current_setting.sync.enable
+ break
+ }
+ },
+ handleRefreshSyncCode() {
+ rendererInvoke(NAMES.mainWindow.sync_generate_code)
+ },
},
}