From 537e7307b6fa8ebed836920f74bd800d4016c300 Mon Sep 17 00:00:00 2001 From: mrdong916 Date: Mon, 14 Dec 2020 15:11:15 +0800 Subject: [PATCH] v1.5.0 --- CHANGELOG.md | 17 ++++++ build-config/main/webpack.config.base.js | 7 ++- .../renderer-lyric/webpack.config.base.js | 7 ++- build-config/renderer/webpack.config.base.js | 7 ++- jsconfig.json | 19 +++++++ package.json | 42 +++++++------- publish/changeLog.md | 14 ++++- publish/version.json | 2 +- src/common/defaultSetting.js | 3 +- src/common/hotKey.js | 2 +- src/renderer/App.vue | 18 +++++- src/renderer/components/core/Player.vue | 44 +++++++++++---- src/renderer/lang/en-us/view/list.json | 1 + src/renderer/lang/index.js | 2 +- src/renderer/lang/zh-cn/view/list.json | 1 + src/renderer/lang/zh-tw/view/list.json | 1 + src/renderer/main.js | 2 +- src/renderer/plugins/Tips/index.js | 13 +++-- src/renderer/plugins/i18n.js | 2 +- src/renderer/store/modules/download.js | 12 ++-- src/renderer/store/modules/list.js | 13 +++-- src/renderer/store/modules/player.js | 9 +++ src/renderer/store/modules/songList.js | 29 +++++++--- src/renderer/utils/index.js | 2 +- src/renderer/utils/music/kg/songList.js | 2 +- src/renderer/utils/music/mg/comment.js | 2 +- src/renderer/views/List.vue | 56 ++++++++++++++++++- src/renderer/views/Setting.vue | 4 +- src/renderer/views/SongList.vue | 17 ++++-- 29 files changed, 266 insertions(+), 84 deletions(-) create mode 100644 jsconfig.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 756b6e27..1b4a58e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,23 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/). Commit convention is based on [Conventional Commits](http://conventionalcommits.org). Change log format is based on [Keep a Changelog](http://keepachangelog.com/). +## [1.5.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.4.1...v1.5.0) - 2020-12-13 + +### 新增 + +- 直接从歌单详情收藏的列表新增同步功能。注意:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表 + +### 优化 + +- 优化软件启动时恢复上一次播放的歌曲进度功能 + +### 修复 + +- 修复MAC平台上下载歌曲封面嵌入无法显示的问题 +- 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题 +- 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题 +- 修复某些酷狗源歌单链接无法打开的问题 + ## [1.4.1](https://github.com/lyswhut/lx-music-desktop/compare/v1.4.0...v1.4.1) - 2020-11-25 diff --git a/build-config/main/webpack.config.base.js b/build-config/main/webpack.config.base.js index fc5be7d5..961facf3 100644 --- a/build-config/main/webpack.config.base.js +++ b/build-config/main/webpack.config.base.js @@ -9,9 +9,10 @@ module.exports = { }, resolve: { alias: { - '@': path.join(__dirname, '../../src/main'), - events: path.join(__dirname, '../../src/main/events'), - common: path.join(__dirname, '../../src/common'), + '@main': path.join(__dirname, '../../src/main'), + '@renderer': path.join(__dirname, '../../src/renderer'), + '@lyric': path.join(__dirname, '../../src/renderer-lyric'), + '@common': path.join(__dirname, '../../src/common'), }, extensions: ['*', '.js', '.json', '.node'], }, diff --git a/build-config/renderer-lyric/webpack.config.base.js b/build-config/renderer-lyric/webpack.config.base.js index ed08fd5e..d0e72ed2 100644 --- a/build-config/renderer-lyric/webpack.config.base.js +++ b/build-config/renderer-lyric/webpack.config.base.js @@ -21,8 +21,11 @@ module.exports = { }, resolve: { alias: { - '@': path.join(__dirname, '../../src/renderer'), - common: path.join(__dirname, '../../src/common'), + '@main': path.join(__dirname, '../../src/main'), + '@renderer': path.join(__dirname, '../../src/renderer'), + '@lyric': path.join(__dirname, '../../src/renderer-lyric'), + '@static': path.join(__dirname, '../../src/static'), + '@common': path.join(__dirname, '../../src/common'), }, extensions: ['*', '.js', '.json', '.vue', '.node'], }, diff --git a/build-config/renderer/webpack.config.base.js b/build-config/renderer/webpack.config.base.js index fdf69a36..6721ac9a 100644 --- a/build-config/renderer/webpack.config.base.js +++ b/build-config/renderer/webpack.config.base.js @@ -21,8 +21,11 @@ module.exports = { }, resolve: { alias: { - '@': path.join(__dirname, '../../src/renderer'), - common: path.join(__dirname, '../../src/common'), + '@main': path.join(__dirname, '../../src/main'), + '@renderer': path.join(__dirname, '../../src/renderer'), + '@lyric': path.join(__dirname, '../../src/renderer-lyric'), + '@static': path.join(__dirname, '../../src/static'), + '@common': path.join(__dirname, '../../src/common'), }, extensions: ['*', '.js', '.json', '.vue', '.node'], }, diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 00000000..aa3964b1 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + // This is the line you want to add + "allowSyntheticDefaultImports": true, + + "baseUrl": ".", + "paths": { + "@main": ["src/main"], + "@renderer": ["src/renderer"], + "@lyric": ["src/renderer-lyric"], + "@static": ["src/static"], + "@common": ["src/common"], + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules/**/*"] +} diff --git a/package.json b/package.json index b02f94e7..521e3282 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "5yin", - "version": "1.4.1", + "version": "1.5.0", "description": "一个基于洛雪音乐助手修改的免费音乐下载助手", "main": "./dist/electron/main.js", "productName": "五音助手", @@ -34,16 +34,18 @@ "publish:gh:linux": "node build-config/pack.js && npm run publish:linux", "publish:linux": "npm run publish:linux:deb && npm run publish:linux:appImage && npm run publish:linux:rpm && npm run publish:linux:pacman", "publish:linux:appImage": "cross-env ARCH=x64 electron-builder -l=AppImage -p onTagOrDraft", - "publish:linux:deb": "npm run publish:linux:deb:x64 && npm run publish:linux:deb:x86", + "publish:linux:deb": "npm run publish:linux:deb:x64 && npm run publish:linux:deb:x86 && npm run publish:linux:deb:arm64", "publish:linux:deb:x64": "cross-env ARCH=x64 electron-builder -l=deb --x64 -p onTagOrDraft", "publish:linux:deb:x86": "cross-env ARCH=x86 electron-builder -l=deb --ia32 -p onTagOrDraft", + "publish:linux:deb:arm64": "cross-env ARCH=arm64 electron-builder -l=deb --arm64 -p onTagOrDraft", "publish:linux:rpm": "cross-env ARCH=x64 electron-builder -l=rpm --x64 -p onTagOrDraft", "publish:linux:pacman": "cross-env ARCH=x64 electron-builder -l=pacman --x64 -p onTagOrDraft", "pack:linux": "node build-config/pack.js && npm run pack:linux:deb && npm run pack:linux:appImage && npm run pack:linux:rpm && npm run pack:linux:pacman", "pack:linux:appImage": "cross-env ARCH=x64 electron-builder -l=AppImage", - "pack:linux:deb": "npm run pack:linux:deb:x64 && npm run pack:linux:deb:x86", + "pack:linux:deb": "npm run pack:linux:deb:x64 && npm run pack:linux:deb:x86 && npm run pack:linux:deb:arm64", "pack:linux:deb:x64": "cross-env ARCH=x64 electron-builder -l=deb --x64", "pack:linux:deb:x86": "cross-env ARCH=x86 electron-builder -l=deb --ia32", + "pack:linux:deb:arm64": "cross-env ARCH=arm64 electron-builder -l=deb --arm64", "pack:linux:rpm": "cross-env ARCH=x64 electron-builder -l=rpm --x64", "pack:linux:pacman": "cross-env ARCH=x64 electron-builder -l=pacman --x64", "pack:mac": "node build-config/pack.js && electron-builder -m=dmg", @@ -158,29 +160,29 @@ }, "homepage": "https://github.com/sixyin/lx-music-desktop#readme", "devDependencies": { - "@babel/core": "^7.12.3", + "@babel/core": "^7.12.10", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-runtime": "^7.12.1", + "@babel/plugin-transform-runtime": "^7.12.10", "@babel/polyfill": "^7.12.1", - "@babel/preset-env": "^7.12.1", + "@babel/preset-env": "^7.12.10", "babel-eslint": "^10.1.0", - "babel-loader": "^8.2.1", + "babel-loader": "^8.2.2", "babel-minify-webpack-plugin": "^0.3.1", "babel-preset-minify": "^0.5.1", - "cfonts": "^2.8.6", + "cfonts": "^2.9.0", "chalk": "^4.1.0", "changelog-parser": "^2.8.0", - "copy-webpack-plugin": "^6.3.1", - "core-js": "^3.7.0", - "cross-env": "^7.0.2", + "copy-webpack-plugin": "^6.4.0", + "core-js": "^3.8.1", + "cross-env": "^7.0.3", "css-loader": "^4.3.0", "del": "^6.0.0", "electron": "^9.3.3", "electron-builder": "^22.9.1", "electron-debug": "^3.1.0", "electron-devtools-installer": "^3.1.1", - "eslint": "^7.13.0", + "eslint": "^7.15.0", "eslint-config-standard": "^14.1.1", "eslint-formatter-friendly": "^7.0.0", "eslint-loader": "^4.0.2", @@ -194,19 +196,19 @@ "html-webpack-plugin": "^4.5.0", "less": "^3.12.2", "less-loader": "^7.1.0", - "markdown-it": "^12.0.2", + "markdown-it": "^12.0.3", "mini-css-extract-plugin": "^0.12.0", "optimize-css-assets-webpack-plugin": "^5.0.4", - "postcss-loader": "^4.0.4", + "postcss-loader": "^4.1.0", "postcss-pxtorem": "^5.1.1", "pug": "^3.0.0", "pug-loader": "^2.4.0", - "pug-plain-loader": "^1.0.0", + "pug-plain-loader": "^1.1.0", "raw-loader": "^4.0.2", "rimraf": "^3.0.2", "spinnies": "^0.5.1", "stylus": "^0.54.8", - "stylus-loader": "^4.3.0", + "stylus-loader": "^4.3.1", "terser-webpack-plugin": "^4.2.3", "url-loader": "^4.1.1", "vue-loader": "^15.9.5", @@ -215,7 +217,7 @@ "webpack-cli": "^3.3.12", "webpack-dev-server": "^3.11.0", "webpack-hot-middleware": "^2.25.0", - "webpack-merge": "^5.4.0" + "webpack-merge": "^5.6.1" }, "dependencies": { "crypto-js": "^4.0.0", @@ -228,12 +230,12 @@ "js-htmlencode": "^0.3.0", "lrc-file-parser": "^1.0.5", "needle": "^2.5.2", - "node-id3": "^0.1.21", + "node-id3": "^0.1.19", "request": "^2.88.2", "vue": "^2.6.12", - "vue-i18n": "^8.22.1", + "vue-i18n": "^8.22.2", "vue-router": "^3.4.9", - "vuex": "^3.5.1", + "vuex": "^3.6.0", "vuex-router-sync": "^5.0.0" } } diff --git a/publish/changeLog.md b/publish/changeLog.md index 0285b88e..085d884a 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,6 +1,14 @@ +### 新增 + +- 直接从歌单详情收藏的列表新增同步功能。注意:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表 + +### 优化 + +- 优化软件启动时恢复上一次播放的歌曲进度功能 ### 修复 -- 修复有歌词翻译与无歌词的音乐间切换会导致歌词翻译残留显示的问题 -- 修复歌曲URL过期时,等待刷新URL的自动切换歌曲时间间隔太短的问题 -- 修复某些电脑上的某些歌曲没有声音的问题(升级Electron9.3.4导致的,现降级到9.3.3) +- 修复MAC平台上下载歌曲封面嵌入无法显示的问题 +- 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题 +- 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题 +- 修复某些酷狗源歌单链接无法打开的问题 diff --git a/publish/version.json b/publish/version.json index 9a31cb07..4b8fc7f2 100644 --- a/publish/version.json +++ b/publish/version.json @@ -1 +1 @@ -{"version":"1.4.1","desc":"

修复

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

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

修复

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

优化

\n\n

修复

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

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

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

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

修复

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

新增

\n\n

修复

\n\n

优化

\n\n

移除

\n\n

其他

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

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

\n\n

更变

\n\n

其他

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

修复

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

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

更变

\n\n

修复

\n\n

移除

\n\n

其他

\n

更新 Electron 到 8.2.5

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

新增

\n\n

优化

\n\n

修复

\n\n

其他

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

新增

\n\n

优化

\n\n

修复

\n\n

其他

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

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

\n

修复

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

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

\n

修复

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

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

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

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

修复

\n\n

其他

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

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n

其他

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

优化

\n\n

修复

\n\n

其他

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

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

\n

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

优化

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

优化

\n\n

修复

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

修复

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

新增

\n\n

修复

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

修复

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

修复

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

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

祝贺祖国成立70周年~!

\n

新增

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

\n\n

移除

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

修复

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

移除

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

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

\n\n

移除

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

新增

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

移除

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

新增

\n\n

优化

\n\n

修复

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

优化

\n\n

修复

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

修复

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

新增

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

修复

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

新增

\n\n

修复

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

新增

\n\n

修复

\n\n

移除

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

修复

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

优化

\n\n

修复

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

新增

\n\n

修复

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

修复

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

新增

\n\n

优化

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

新增

\n\n

优化

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

新增

\n\n

修复

\n\n

移除

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

修复

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

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

修复

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

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

修复

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

优化

\n\n

修复

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

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

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

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

修复

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

新增

\n\n

修复

\n\n

优化

\n\n

移除

\n\n

其他

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

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

\n\n

更变

\n\n

其他

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

修复

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

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

更变

\n\n

修复

\n\n

移除

\n\n

其他

\n

更新 Electron 到 8.2.5

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

新增

\n\n

优化

\n\n

修复

\n\n

其他

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

新增

\n\n

优化

\n\n

修复

\n\n

其他

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

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

\n

修复

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

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

\n

修复

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

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

\n

新增

\n\n

优化

\n\n

修复

\n\n

其他

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

修复

\n\n

其他

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

新增

\n\n

优化

\n\n

修复

\n\n

移除

\n\n

其他

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

优化

\n\n

修复

\n\n

其他

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

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

\n

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

优化

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

优化

\n\n

修复

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

修复

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

新增

\n\n

修复

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

修复

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

修复

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

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

祝贺祖国成立70周年~!

\n

新增

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

\n\n

移除

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

修复

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

移除

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

优化

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

\n\n

移除

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

新增

\n\n

修复

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

新增

\n\n

优化

\n\n

修复

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

新增

\n\n

移除

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

新增

\n\n

优化

\n\n

修复

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

优化

\n\n

修复

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

修复

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

新增

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

修复

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

新增

\n\n

修复

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

新增

\n\n

修复

\n\n

移除

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

修复

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

优化

\n\n

修复

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

新增

\n\n

修复

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

修复

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

新增

\n\n

优化

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

新增

\n\n

优化

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

新增

\n\n

修复

\n\n

移除

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

修复

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

新增

\n\n

优化

\n\n

修复

\n\n"},{"version":"0.1.0","desc":"0.1.0版本发布"}]} diff --git a/src/common/defaultSetting.js b/src/common/defaultSetting.js index 32c08602..023a2470 100644 --- a/src/common/defaultSetting.js +++ b/src/common/defaultSetting.js @@ -1,6 +1,5 @@ const path = require('path') const os = require('os') -const { isMac } = require('./utils') const defaultSetting = { version: '1.0.38', @@ -92,7 +91,7 @@ const defaultSetting = { randomAnimate: true, ignoreVersion: null, isAgreePact: false, - controlBtnPosition: isMac ? 'left' : 'right', + controlBtnPosition: process.platform === 'darwin' ? 'left' : 'right', } const overwriteSetting = { diff --git a/src/common/hotKey.js b/src/common/hotKey.js index 92bb31bd..c11372a8 100644 --- a/src/common/hotKey.js +++ b/src/common/hotKey.js @@ -1,4 +1,4 @@ -const names = require('../main/events/_name') +const names = require('@main/events/_name') const hotKey = { common: { min: { diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 01ccc8b3..08a5e7e6 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -273,7 +273,21 @@ export default { getPlayList().then(({ defaultList, loveList, userList, downloadList }) => { if (!defaultList) defaultList = this.defaultList if (!loveList) loveList = this.loveList - if (!userList) userList = this.userList + if (userList) { + let needSave = false + const getListId = id => id.includes('.') ? getListId(id.substring(0, id.lastIndexOf('_'))) : id + userList.forEach(l => { + if (!l.id.includes('__') || l.source) return + let [source, id] = l.id.split('__') + id = getListId(id) + l.source = source + l.sourceListId = id + if (!needSave) needSave = true + }) + if (needSave) this.saveUserList(userList) + } else { + userList = this.userList + } if (!defaultList.list) defaultList.list = [] if (!loveList.list) loveList.list = [] @@ -306,7 +320,9 @@ export default { initPlayInfo() { rendererInvoke(NAMES.mainWindow.get_data, 'playInfo').then(info => { // console.log(info, window.allList) + window.restorePlayInfo = null if (!info) return + if (info.index < 0) return if (info.listId) { const list = window.allList[info.listId] // console.log(list) diff --git a/src/renderer/components/core/Player.vue b/src/renderer/components/core/Player.vue index 88b5adc8..21cab61f 100644 --- a/src/renderer/components/core/Player.vue +++ b/src/renderer/components/core/Player.vue @@ -244,9 +244,31 @@ export default { watch: { changePlay(n) { if (!n) return + this.resetChangePlay() + if (window.restorePlayInfo) { + let musicInfo = this.targetSong = this.list[window.restorePlayInfo.index] + this.musicInfo.songmid = musicInfo.songmid + this.musicInfo.singer = musicInfo.singer + this.musicInfo.name = musicInfo.name + this.musicInfo.album = musicInfo.albumName + this.setImg(musicInfo) + this.setLrc(musicInfo) + this.nowPlayTime = this.restorePlayTime = window.restorePlayInfo.time + this.maxPlayTime = window.restorePlayInfo.maxTime || 0 + this.handleUpdateWinLyricInfo('music_info', { + songmid: this.musicInfo.songmid, + singer: this.musicInfo.singer, + name: this.musicInfo.name, + album: this.musicInfo.album, + }) + this.$nextTick(() => { + this.sendProgressEvent(this.progress, 'paused') + }) + window.restorePlayInfo = null + return + } // console.log('changePlay') this.handleRemoveMusic() - this.resetChangePlay() if (this.playIndex < 0) return this.stopPlay() this.play() @@ -295,6 +317,7 @@ export default { if (Math.abs(n - o) > 2) this.isActiveTransition = true this.savePlayInfo({ time: n, + maxTime: this.maxPlayTime, listId: this.listId, list: this.listId == null ? this.list : null, index: this.playIndex, @@ -377,12 +400,7 @@ export default { this.clearLoadingTimeout() this.status = this.statusText = this.$t('core.player.loading') this.maxPlayTime = audio.duration - if (window.restorePlayInfo) { - audio.currentTime = window.restorePlayInfo.time - window.restorePlayInfo = null - audio.pause() - this.stopPlay() - } else if (this.restorePlayTime) { + if (this.restorePlayTime) { audio.currentTime = this.restorePlayTime this.restorePlayTime = 0 } @@ -651,7 +669,13 @@ export default { ) }, togglePlay() { - if (!audio.src) return + if (!audio.src) { + if (this.restorePlayTime != null) { + if (!this.assertApiSupport(this.targetSong.source)) return this.handleNext() + this.setUrl(this.targetSong) + } + return + } if (this.isPlay) { audio.pause() this.clearBufferTimeout() @@ -801,7 +825,7 @@ export default { // console.log('start load timeout') this.loadingTimeout = setTimeout(() => { this.handleNext() - }, 10000) + }, 20000) }, clearLoadingTimeout() { if (!this.loadingTimeout) return @@ -810,7 +834,7 @@ export default { this.loadingTimeout = null }, startBuffering() { - console.error('start t') + console.log('start t') if (this.mediaBuffer.timeout) return this.mediaBuffer.timeout = setTimeout(() => { this.mediaBuffer.timeout = null diff --git a/src/renderer/lang/en-us/view/list.json b/src/renderer/lang/en-us/view/list.json index 8a23de01..37809cf7 100644 --- a/src/renderer/lang/en-us/view/list.json +++ b/src/renderer/lang/en-us/view/list.json @@ -4,6 +4,7 @@ "lists_rename": "Rename", "lists_moveup": "Move Up", "lists_movedown": "Move Down", + "lists_sync": "Sync", "lists_remove": "Remove", "list_play": "Play", "list_copy_name": "Copy name", diff --git a/src/renderer/lang/index.js b/src/renderer/lang/index.js index a13e7b34..22204a90 100644 --- a/src/renderer/lang/index.js +++ b/src/renderer/lang/index.js @@ -1,7 +1,7 @@ // http://kazupon.github.io/vue-i18n/en/messages.html const requireLang = require.context( - '@/lang', + '@renderer/lang', true, /\.json$/, ) diff --git a/src/renderer/lang/zh-cn/view/list.json b/src/renderer/lang/zh-cn/view/list.json index e53c3460..87778d88 100644 --- a/src/renderer/lang/zh-cn/view/list.json +++ b/src/renderer/lang/zh-cn/view/list.json @@ -4,6 +4,7 @@ "lists_rename": "重命名", "lists_moveup": "上移", "lists_movedown": "下移", + "lists_sync": "同步", "lists_remove": "删除", "list_play": "播放", "list_copy_name": "复制歌曲名", diff --git a/src/renderer/lang/zh-tw/view/list.json b/src/renderer/lang/zh-tw/view/list.json index 52612a8c..1f218c54 100644 --- a/src/renderer/lang/zh-tw/view/list.json +++ b/src/renderer/lang/zh-tw/view/list.json @@ -4,6 +4,7 @@ "lists_rename": "重命名", "lists_moveup": "上移", "lists_movedown": "下移", + "lists_sync": "同步", "lists_remove": "刪除", "list_play": "播放", "list_copy_name": "複製歌曲名", diff --git a/src/renderer/main.js b/src/renderer/main.js index bac4f660..8f26b7ee 100644 --- a/src/renderer/main.js +++ b/src/renderer/main.js @@ -17,7 +17,7 @@ import store from './store' import '../common/error' import { getSetting } from './utils' -import languageList from '@/lang/languages.json' +import languageList from '@renderer/lang/languages.json' import { rendererSend, NAMES } from '../common/ipc' sync(store, router) diff --git a/src/renderer/plugins/Tips/index.js b/src/renderer/plugins/Tips/index.js index 4e2aee98..eede83c9 100644 --- a/src/renderer/plugins/Tips/index.js +++ b/src/renderer/plugins/Tips/index.js @@ -4,11 +4,14 @@ import { debounce } from '../../utils' let instance let prevTips -const getTips = el => el.getAttribute('tips') - ? el.getAttribute('tips') - : el.parentNode === document.documentElement - ? null - : getTips(el.parentNode) +const getTips = el => + el + ? el.getAttribute('tips') + ? el.getAttribute('tips') + : el.parentNode === document.documentElement + ? null + : getTips(el.parentNode) + : null const showTips = debounce(event => { let msg = getTips(event.target) diff --git a/src/renderer/plugins/i18n.js b/src/renderer/plugins/i18n.js index 48b8cca1..ba3bc165 100644 --- a/src/renderer/plugins/i18n.js +++ b/src/renderer/plugins/i18n.js @@ -9,7 +9,7 @@ // Lib imports import Vue from 'vue' import VueI18n from 'vue-i18n' -import messages from '@/lang' +import messages from '@renderer/lang' Vue.use(VueI18n) diff --git a/src/renderer/store/modules/download.js b/src/renderer/store/modules/download.js index 13e30e00..5e438108 100644 --- a/src/renderer/store/modules/download.js +++ b/src/renderer/store/modules/download.js @@ -377,11 +377,13 @@ const actions = { }, } commit('setStatusText', { downloadInfo, text: '获取URL中...' }) - let p = options.url ? Promise.resolve() : getUrl(downloadInfo).then(result => { - commit('updateUrl', { downloadInfo, url: result.url }) - if (!result.url) return Promise.reject(new Error('获取URL失败')) - options.url = result.url - }) + let p = options.url + ? Promise.resolve() + : getUrl(downloadInfo).then(result => { + commit('updateUrl', { downloadInfo, url: result.url }) + if (!result.url) return Promise.reject(new Error('获取URL失败')) + options.url = result.url + }) p.then(() => { tryNum[downloadInfo.key] = 0 dls[downloadInfo.key] = download(options) diff --git a/src/renderer/store/modules/list.js b/src/renderer/store/modules/list.js index e46f2782..9df804c3 100644 --- a/src/renderer/store/modules/list.js +++ b/src/renderer/store/modules/list.js @@ -60,7 +60,7 @@ const mutations = { allListInit(state.defaultList, state.loveList, state.userList) state.isInitedList = true }, - setList(state, { id, list, name, location }) { + setList(state, { id, list, name, location, source, sourceListId }) { const targetList = allList[id] if (targetList) { if (name && targetList.name === name) { @@ -76,6 +76,8 @@ const mutations = { id, list, location, + source, + sourceListId, } state.userList.push(newList) allListUpdate(newList) @@ -92,8 +94,7 @@ const mutations = { if (!fromList || !toList) return fromList.list.splice(fromList.list.indexOf(musicInfo), 1) let index = toList.list.findIndex(s => s.songmid === musicInfo.songmid) - if (index > -1) return toList.list.splice(index, 1) - toList.list.push(musicInfo) + if (index < 0) toList.list.push(musicInfo) }, listAddMultiple(state, { id, list }) { let targetList = allList[id] @@ -110,7 +111,7 @@ const mutations = { }, // { fromId, toId, list } listMoveMultiple(state, { fromId, toId, list }) { - console.log(state.commit) + // console.log(state.commit) this.commit('list/listRemoveMultiple', { id: fromId, list }) this.commit('list/listAddMultiple', { id: toId, list }) }, @@ -146,7 +147,7 @@ const mutations = { if (!targetList) return Object.assign(targetList.list[index], data) }, - createUserList(state, { name, id = `userlist_${Date.now()}`, list = [] }) { + createUserList(state, { name, id = `userlist_${Date.now()}`, list = [], source, sourceListId }) { let newList = state.userList.find(item => item.id === id) if (!newList) { newList = { @@ -154,6 +155,8 @@ const mutations = { id, list: [], location: 0, + source, + sourceListId, } state.userList.push(newList) allListUpdate(newList) diff --git a/src/renderer/store/modules/player.js b/src/renderer/store/modules/player.js index 16fbc8a0..80a38b5b 100644 --- a/src/renderer/store/modules/player.js +++ b/src/renderer/store/modules/player.js @@ -59,6 +59,15 @@ const actions = { }, getLrc({ commit, state }, musicInfo) { if (lrcRequest && lrcRequest.cancelHttp) lrcRequest.cancelHttp() + if (musicInfo.lrc && musicInfo.tlrc != null) { + if (musicInfo.lrc.startsWith('\ufeff[id:$00000000]')) { + let str = musicInfo.lrc.replace('\ufeff[id:$00000000]\n', '') + commit('setLrc', { musicInfo, lyric: str, tlyric: musicInfo.tlrc }) + } + return Promise.resolve() + } + + lrcRequest = music[musicInfo.source].getLyric(musicInfo) return lrcRequest.promise.then(({ lyric, tlyric }) => { lrcRequest = null diff --git a/src/renderer/store/modules/songList.js b/src/renderer/store/modules/songList.js index 731b04e1..72bc4367 100644 --- a/src/renderer/store/modules/songList.js +++ b/src/renderer/store/modules/songList.js @@ -9,6 +9,15 @@ for (const source of music.sources) { sources.push(source) } +const filterList = list => { + const keys = new Set() + return list.filter(item => { + if (keys.has(item.songmid)) return false + keys.add(item.songmid) + return true + }) +} + // state const state = { tags: {}, @@ -78,20 +87,22 @@ const actions = { return ( cache.has(key) ? Promise.resolve(cache.get(key)) - : music[source].songList.getListDetail(id, page) + : music[source].songList.getListDetail(id, page).then(result => ({ ...result, list: filterList(result.list) })) ).then(result => commit('setListDetail', { result, key, source, id, page })) }, - getListDetailAll({ state, rootState }, id) { - let source = rootState.setting.songList.source + getListDetailAll({ state, rootState }, { source, id }) { + // console.log(source, id) const loadData = (id, page) => { let key = `sdetail__${source}__${id}__${page}` - return cache.has(key) ? Promise.resolve(cache.get(key)) : music[source].songList.getListDetail(id, page).then(result => { - cache.set(key, result) - return result - }) + return cache.has(key) + ? Promise.resolve(cache.get(key)) + : music[source].songList.getListDetail(id, page).then(result => { + cache.set(key, result) + return result + }) } return loadData(id, 1).then(result => { - if (result.total <= result.limit) return result.list + if (result.total <= result.limit) return filterList(result.list) let maxPage = Math.ceil(result.total / result.limit) const loadDetail = (loadPage = 1) => { @@ -99,7 +110,7 @@ const actions = { ? loadData(id, ++loadPage).then(result => result.list) : loadData(id, ++loadPage).then(result1 => loadDetail(loadPage).then(result2 => [...result1.list, ...result2])) } - return loadDetail().then(result2 => [...result.list, ...result2]) + return loadDetail().then(result2 => [...result.list, ...result2]).then(list => filterList(list)) }) }, } diff --git a/src/renderer/utils/index.js b/src/renderer/utils/index.js index 2c601149..6bef1ad7 100644 --- a/src/renderer/utils/index.js +++ b/src/renderer/utils/index.js @@ -80,7 +80,7 @@ const encodeNames = { ''': "'", ''': "'", } -export const decodeName = str => str.replace(/(?:&|<|>|"|'|')/gm, s => encodeNames[s]) +export const decodeName = (str = '') => str.replace(/(?:&|<|>|"|'|')/gm, s => encodeNames[s]) const easeInOutQuad = (t, b, c, d) => { t /= d / 2 diff --git a/src/renderer/utils/music/kg/songList.js b/src/renderer/utils/music/kg/songList.js index f1fc7afe..2bf3ff76 100644 --- a/src/renderer/utils/music/kg/songList.js +++ b/src/renderer/utils/music/kg/songList.js @@ -378,7 +378,7 @@ export default { id = id.toString() if (id.includes('special/single/')) { id = id.replace(this.regExps.listDetailLink, '$1') - } else if (/http(?:s):/.test(id)) { + } else if (/https?:/.test(id)) { return this.getUserListDetail(id.replace(/^.*http/, 'http'), page) } else if (/^\d+$/.test(id)) { return this.getUserListDetailByCode(id) diff --git a/src/renderer/utils/music/mg/comment.js b/src/renderer/utils/music/mg/comment.js index 2e9f1621..a6c8a134 100644 --- a/src/renderer/utils/music/mg/comment.js +++ b/src/renderer/utils/music/mg/comment.js @@ -31,7 +31,7 @@ export default { }, }) const { body, statusCode } = await _requestObj.promise - console.log(body) + // console.log(body) if (statusCode != 200 || body.returnCode !== '000000') throw new Error('获取评论失败') return { source: 'mg', comments: this.filterComment(body.data.items), total: body.data.itemTotal, page, limit, maxPage: Math.ceil(body.data.itemTotal / limit) || 1 } }, diff --git a/src/renderer/views/List.vue b/src/renderer/views/List.vue index 251e2b2a..d0f1a077 100644 --- a/src/renderer/views/List.vue +++ b/src/renderer/views/List.vue @@ -11,7 +11,10 @@ span(:class="$style.listsLabel") {{defaultList.name}} li(:class="[$style.listsItem, loveList.id == listId ? $style.active : null]" :tips="loveList.name" @click="handleListToggle(loveList.id)") span(:class="$style.listsLabel") {{loveList.name}} - li.user-list(:class="[$style.listsItem, item.id == listId ? $style.active : null, listsData.rightClickItemIndex == index ? $style.clicked : null]" @contextmenu="handleListsItemRigthClick($event, index)" :tips="item.name" v-for="(item, index) in userList" :key="item.id") + li.user-list( + :class="[$style.listsItem, item.id == listId ? $style.active : null, listsData.rightClickItemIndex == index ? $style.clicked : null, fetchingListStatus[item.id] ? $style.fetching : null]" + @contextmenu="handleListsItemRigthClick($event, index)" + :tips="item.name" v-for="(item, index) in userList" :key="item.id") span(:class="$style.listsLabel" @click="handleListToggle(item.id, index + 2)") {{item.name}} input.key-bind(:class="$style.listsInput" @contextmenu.stop type="text" @keyup.enter="handleListsSave(index, $event)" @blur="handleListsSave(index, $event)" :value="item.name" :placeholder="item.name") transition(enter-active-class="animated-fast slideInLeft" leave-active-class="animated-fast fadeOut" @after-leave="handleListsNewAfterLeave") @@ -100,6 +103,7 @@ export default { isShowItemMenu: false, itemMenuControl: { rename: true, + sync: false, moveup: true, movedown: true, remove: true, @@ -131,6 +135,7 @@ export default { isMove: false, isMoveMultiple: false, isVisibleMusicSearch: false, + fetchingListStatus: {}, } }, computed: { @@ -180,6 +185,11 @@ export default { action: 'rename', disabled: !this.listsData.itemMenuControl.rename, }, + { + name: this.$t('view.list.lists_sync'), + action: 'sync', + disabled: !this.listsData.itemMenuControl.sync, + }, { name: this.$t('view.list.lists_moveup'), action: 'moveup', @@ -309,7 +319,18 @@ export default { }, methods: { ...mapMutations(['setPrevSelectListId']), - ...mapMutations('list', ['listRemove', 'listRemoveMultiple', 'setUserListName', 'createUserList', 'moveupUserList', 'movedownUserList', 'removeUserList', 'setListScroll']), + ...mapMutations('list', [ + 'listRemove', + 'listRemoveMultiple', + 'setUserListName', + 'createUserList', + 'moveupUserList', + 'movedownUserList', + 'removeUserList', + 'setListScroll', + 'setList', + ]), + ...mapActions('songList', ['getListDetailAll']), ...mapActions('download', ['createDownload', 'createDownloadMultiple']), ...mapMutations('player', { setPlayList: 'setList', @@ -668,6 +689,8 @@ export default { }).catch(_ => _) }, handleListsItemRigthClick(event, index) { + const source = this.userList[index].source + this.listsData.itemMenuControl.sync = !!source && !!musicSdk[source].songList this.listsData.itemMenuControl.moveup = index > 0 this.listsData.itemMenuControl.movedown = index < this.userList.length - 1 this.listsData.rightClickItemIndex = index @@ -714,6 +737,9 @@ export default { dom.querySelector('input').focus() }) break + case 'sync': + this.handleSyncSourceList(index) + break case 'moveup': this.moveupUserList(index) break @@ -814,6 +840,27 @@ export default { break } }, + fetchList(id, source, sourceListId) { + if (this.fetchingListStatus[id] == null) { + this.$set(this.fetchingListStatus, id, true) + } else { + this.fetchingListStatus[id] = true + } + return this.getListDetailAll({ source, id: sourceListId }).catch(err => { + return Promise.reject(err) + }).finally(() => { + this.fetchingListStatus[id] = false + }) + }, + async handleSyncSourceList(index) { + const targetList = this.userList[index] + const list = await this.fetchList(targetList.id, targetList.source, targetList.sourceListId) + // console.log(targetList.list.length, list.length) + this.setList({ + ...targetList, + list, + }) + }, }, } @@ -880,7 +927,7 @@ export default { .listsItem { position: relative; transition: .3s ease; - transition-property: color, background-color; + transition-property: color, background-color, opacity; background-color: transparent; &:hover:not(.active) { background-color: @color-theme_2-hover; @@ -896,6 +943,9 @@ export default { &.clicked { background-color: @color-theme_2-hover; } + &.fetching { + opacity: .5; + } &.editing { padding: 0 10px; background-color: @color-theme_2-hover; diff --git a/src/renderer/views/Setting.vue b/src/renderer/views/Setting.vue index ef0a0c21..af04bec5 100644 --- a/src/renderer/views/Setting.vue +++ b/src/renderer/views/Setting.vue @@ -294,11 +294,11 @@ import { sizeFormate, setWindowSize, } from '../utils' -import { rendererSend, rendererInvoke, NAMES } from '../../common/ipc' +import { rendererSend, rendererInvoke, NAMES } from '@common/ipc' import { mergeSetting, isMac } from '../../common/utils' import apiSourceInfo from '../utils/music/api-source-info' import fs from 'fs' -import languageList from '@/lang/languages.json' +import languageList from '@renderer/lang/languages.json' import { base as eventBaseName } from '../event/names' import * as hotKeys from '../../common/hotKey' import { mainWindow as eventsNameMainWindow, winLyric as eventsNameWinLyric } from '../../main/events/_name' diff --git a/src/renderer/views/SongList.vue b/src/renderer/views/SongList.vue index 93ae0b1b..2c1b5cda 100644 --- a/src/renderer/views/SongList.vue +++ b/src/renderer/views/SongList.vue @@ -373,6 +373,7 @@ export default { } }, handleGetSongListDetail() { + if (!this.importSongListText.length) return this.setSelectListInfo({ play_count: null, id: this.importSongListText, @@ -404,14 +405,22 @@ export default { }, async fetchList() { this.detailLoading = true - const list = await this.getListDetailAll(this.selectListInfo.id) - this.detailLoading = false - return list + return this.getListDetailAll({ source: this.source, id: this.selectListInfo.id }).catch(err => { + return Promise.reject(err) + }).finally(() => { + this.detailLoading = false + }) }, async addSongListDetail() { if (!this.listDetail.info.name) return const list = await this.fetchList() - this.createUserList({ name: this.listDetail.info.name, id: `${this.listDetail.source}__${this.listDetail.id}`, list }) + this.createUserList({ + name: this.listDetail.info.name, + id: `${this.listDetail.source}__${this.listDetail.id}`, + list, + source: this.listDetail.source, + sourceListId: this.listDetail.id, + }) }, async playSongListDetail() { if (!this.listDetail.info.name) return