bookmark v1.4.1

This commit is contained in:
mrdong916 2020-11-25 19:43:38 +08:00
parent 7c4b99abb5
commit 97e0969d48
30 changed files with 641 additions and 465 deletions

View File

@ -6,6 +6,33 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/).
Commit convention is based on [Conventional Commits](http://conventionalcommits.org). Commit convention is based on [Conventional Commits](http://conventionalcommits.org).
Change log format is based on [Keep a Changelog](http://keepachangelog.com/). Change log format is based on [Keep a Changelog](http://keepachangelog.com/).
## [1.4.1](https://github.com/lyswhut/lx-music-desktop/compare/v1.4.0...v1.4.1) - 2020-11-25
### 修复
- 修复有歌词翻译与无歌词的音乐间切换会导致歌词翻译残留显示的问题
- 修复歌曲URL过期时等待刷新URL的自动切换歌曲时间间隔太短的问题
- 修复某些电脑上的某些歌曲没有声音的问题升级Electron9.3.4导致的现降级到9.3.3
## [1.4.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.3.0...v1.4.0) - 2020-11-21
### 新增
- 托盘菜单新增显示、隐藏主界面选项为Linux、MAC版添加托盘菜单
- 新增播放进度信息保存
### 优化
- 移除kg源的歌词文件开头的空白字符串
### 修复
- 修复专辑图片无法嵌入的问题
- 修复播放状态栏切换“上一首”歌曲按钮提示错误的问题
- 修复移动单首歌曲时,如果目标列表存在该歌曲,会导致将源列表与目标列表里的目标歌曲移除
- 修复kg源歌曲信息带有单引号等特殊字符被转义的问题
## [1.3.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.2.2...v1.3.0) - 2020-11-01 ## [1.3.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.2.2...v1.3.0) - 2020-11-01
### 新增 ### 新增

94
FAQ.md
View File

@ -2,7 +2,7 @@
在阅读本常见问题后仍然无法解决你的问题请提交issue或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题! 在阅读本常见问题后仍然无法解决你的问题请提交issue或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题!
## 软件为什么没有桌面歌词与自定义列表功能 ## ~~软件为什么没有桌面歌词与自定义列表功能~~
洛雪音乐的最初定位不是作为播放器开发的,它主要用于**查找歌曲**,软件的播放功能仅用于试听,不建议用作为常用播放器使用。 洛雪音乐的最初定位不是作为播放器开发的,它主要用于**查找歌曲**,软件的播放功能仅用于试听,不建议用作为常用播放器使用。
@ -33,10 +33,56 @@
用`Shift`或`Ctrl`选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按`Shift`或`Alt`键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S`Ctrl`键对应Mac OS上的`Command`键) 用`Shift`或`Ctrl`选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按`Shift`或`Alt`键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S`Ctrl`键对应Mac OS上的`Command`键)
注:选完后可用鼠标右击弹出右键菜单操作已选的内容
## 播放整个歌单或排行榜 ## 播放整个歌单或排行榜
播放在线列表内的歌曲需要将它们都添加到我的列表才能播放,你可以全选列表内的歌曲然后添加到现有列表或者新创建的列表,然后去播放该列表内的歌曲。 播放在线列表内的歌曲需要将它们都添加到我的列表才能播放,你可以全选列表内的歌曲然后添加到现有列表或者新创建的列表,然后去播放该列表内的歌曲。
## 无法打开外部歌单
不支持垮源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);<br>
对于分享出来的歌单若打开失败可尝试先在浏览器中打开后再从浏览器地址栏复制URL地址到软件打开<br>
或者如果你知道歌单 id 也可以直接输入歌单 id 打开。<br>
## Windows 7 下界面异常(界面显示不完整)
由于软件默认使用了透明窗口根据Electron官方文档的[说明](https://electronjs.org/docs/api/frameless-window#%E5%B1%80%E9%99%90%E6%80%A7)
> 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。
因此,当 win7 没有使用**AERO**主题时界面将会显示异常开启AERO的方法请自行百度`win7开启aero效果`(开启后可看到任务栏变透明)。<br>
从`0.14.0`版本起不再强制要求开启透明效果,若你实在不想开启(若非电脑配置太低,墙裂建议开启!),可通过添加运行参数`-nt`来运行程序即可,例如:`.\lx-music-desktop.exe -nt`,添加方法可自行百度“给快捷方式加参数”,该参数的作用是用来控制程序是否使用非透明窗口运行。
对于一些完全无法正常显示界面、开启了AERO后问题仍未解决的情况请阅读下面的 **软件启动后,界面无法显示** 解决
## 软件启动后,界面无法显示
对于软件启动后,可以在任务栏看到软件,但软件界面在桌面上无任何显示,或者整个界面偶尔闪烁的情况。<br>
原始问题看:<https://github.com/electron/electron/issues/19569#issuecomment-522231083><br>
解决办法:下载`.NET Framework 4.7.1`或**更高**版本安装即可(建议安装最新版,若安装过程中遇到问题可尝试自行百度解决)。<br>
微软官方下载地址:<https://dotnet.microsoft.com/download/dotnet-framework><br>
下载`Runtime(运行时)`版即可,安装完成后可能需要重启才生效。
若还是不行可尝试以下操作:
- 更新显卡驱动
- 尝试将绿色版的软件放在**桌面**或**我的文档**运行
## 安装版安装失败,提示安装程序并未成功地运行完成
对于部分电脑出现安装失败的问题,可以做出以下尝试:
- 若你之前可以安装成功,但现在安装失败,就去**控制面板-程序和功能**或用第三方卸载工具看下有没有之前的版本残留,若同时在不同路径下安装了多个版本就可能会出现该问题,这种情况卸载掉所有版本重新安装即可
- 清理安装路径下的残留文件
- 清理注册表(建议用清理工具清理)
## 软件无法联网
软件的排行榜、歌单、搜索列表**都**无法加载:
- 检查是否在设置界面开启了代理(当代理乱设置时软件将无法联网)
- 检查软件是否被第三方软件/防火墙阻止联网
## 桌面歌词显示异常 ## 桌面歌词显示异常
### Windows 7 系统桌面歌词显示异常 ### Windows 7 系统桌面歌词显示异常
@ -79,37 +125,6 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!<br> 注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!<br>
注意:**Mac版**、**Linux deb**版不支持自动更新! 注意:**Mac版**、**Linux deb**版不支持自动更新!
## Windows 7 下界面异常(界面显示不完整)
由于软件默认使用了透明窗口根据Electron官方文档的[说明](https://electronjs.org/docs/api/frameless-window#%E5%B1%80%E9%99%90%E6%80%A7)
> 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。
因此,当 win7 没有使用**AERO**主题时界面将会显示异常开启AERO的方法请自行百度`win7开启aero效果`(开启后可看到任务栏变透明)。<br>
从`0.14.0`版本起不再强制要求开启透明效果,若你实在不想开启(若非电脑配置太低,墙裂建议开启!),可通过添加运行参数`-nt`来运行程序即可,例如:`.\lx-music-desktop.exe -nt`,添加方法可自行百度“给快捷方式加参数”,该参数的作用是用来控制程序是否使用非透明窗口运行。
对于一些完全无法正常显示界面、开启了AERO后问题仍未解决的情况请阅读下面的 **软件启动后,界面无法显示** 解决
## 软件启动后,界面无法显示
对于软件启动后,可以在任务栏看到软件,但软件界面在桌面上无任何显示,或者整个界面偶尔闪烁的情况。<br>
原始问题看:<https://github.com/electron/electron/issues/19569#issuecomment-522231083><br>
解决办法:下载`.NET Framework 4.7.1`或**更高**版本安装即可(建议安装最新版,若安装过程中遇到问题可尝试自行百度解决)。<br>
微软官方下载地址:<https://dotnet.microsoft.com/download/dotnet-framework><br>
下载`Runtime(运行时)`版即可,安装完成后可能需要重启才生效。
若还是不行可尝试以下操作:
- 更新显卡驱动
- 尝试将绿色版的软件放在**桌面**或**我的文档**运行
## 安装版安装失败,提示安装程序并未成功地运行完成
对于部分电脑出现安装失败的问题,可以做出以下尝试:
- 若你之前可以安装成功,但现在安装失败,就去**控制面板-程序和功能**或用第三方卸载工具看下有没有之前的版本残留,若同时在不同路径下安装了多个版本就可能会出现该问题,这种情况卸载掉所有版本重新安装即可
- 清理安装路径下的残留文件
- 清理注册表(建议用清理工具清理)
## 缺少`xxx.dll` ## 缺少`xxx.dll`
这个是电脑缺少某些dll导致的正常的系统是没有这个问题的可以尝试如下几个解决办法 这个是电脑缺少某些dll导致的正常的系统是没有这个问题的可以尝试如下几个解决办法
@ -123,19 +138,6 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看下面的
尽管如此但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时([供应链攻击](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/intelligence/supply-chain-malware)),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。<br> 尽管如此但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时([供应链攻击](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/intelligence/supply-chain-malware)),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。<br>
当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。 当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。
从`0.17.0`起,由于加入了音频输出设备切换功能,该功能调用了 [MediaDevices.enumerateDevices()](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/enumerateDevices),可能导致安全软件提示洛雪要访问摄像头(目前发现卡巴斯基会提示),但实际上没有用到摄像头,并且摄像头的提示灯也不会亮,你可以选择阻止访问。 从`v0.17.0`起,由于加入了音频输出设备切换功能,该功能调用了 [MediaDevices.enumerateDevices()](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/enumerateDevices),可能导致安全软件提示洛雪要访问摄像头(目前发现卡巴斯基会提示),但实际上没有用到摄像头,并且摄像头的提示灯也不会亮,你可以选择阻止访问。
最后,若出现杀毒软件报毒、存在恶意行为,请自行判断选择是否继续使用本软件! 最后,若出现杀毒软件报毒、存在恶意行为,请自行判断选择是否继续使用本软件!
## 软件无法联网
软件的排行榜、歌单、搜索列表**都**无法加载:
- 检查是否在设置界面开启了代理(当代理乱设置时软件将无法联网)
- 检查软件是否被第三方软件/防火墙阻止联网
## 无法打开外部歌单
不支持垮源打开歌单,请确认你需要打开的歌单平台是否与软件标签所写的歌单源对应;<br>
对于分享出来的歌单若打开失败可尝试先在浏览器中打开后再从浏览器地址栏复制URL地址到软件打开<br>
或者如果你知道歌单 id 也可以直接输入歌单 id 打开。<br>

View File

@ -36,7 +36,7 @@
所用技术栈: 所用技术栈:
- Electron 10 - Electron 9
- Vue 2 - Vue 2
已支持的平台: 已支持的平台:
@ -99,7 +99,7 @@ npm run pack:linux
5. 由于使用本项目产生的包括由于本协议或由于使用或无法使用本项目而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害(包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿,或任何及所有其他商业损害或损失)由使用者负责。 5. 由于使用本项目产生的包括由于本协议或由于使用或无法使用本项目而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害(包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿,或任何及所有其他商业损害或损失)由使用者负责。
6. 本项目完全免费,且开源发布于 GitHub 面向全世界人用作对技术的学习交流,本项目不对项目内的技术可能存在违反当地法律法规的行为作保证,**禁止在违反当地法律法规的情况下使用本项目**,对于使用者在明知或不知当地法律法规不允许的情况下使用本项目所造成的任何违法违规行为由使用者承担,本项目不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。 6. 本项目完全免费,且开源发布于 GitHub 面向全世界人用作对技术的学习交流,本项目不对项目内的技术可能存在违反当地法律法规的行为作保证,**禁止在违反当地法律法规的情况下使用本项目**,对于使用者在明知或不知当地法律法规不允许的情况下使用本项目所造成的任何违法违规行为由使用者承担,本项目不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。
若你使用了本项目,将代表你接以上协议。 若你使用了本项目,将代表你接以上协议。
音乐平台不易,请尊重版权,支持正版。<br> 音乐平台不易,请尊重版权,支持正版。<br>
若对此有疑问请 mail to: 33755623+qq.com (请将`+`替换成`@`) 若对此有疑问请 mail to: 33755623+qq.com (请将`+`替换成`@`)

654
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "5yin", "name": "5yin",
"version": "1.3.0", "version": "1.4.1",
"description": "一个基于洛雪音乐助手修改的免费音乐下载助手", "description": "一个基于洛雪音乐助手修改的免费音乐下载助手",
"main": "./dist/electron/main.js", "main": "./dist/electron/main.js",
"productName": "五音助手", "productName": "五音助手",
@ -59,7 +59,7 @@
"lint:fix": "eslint --ext .js,.vue -f ./node_modules/eslint-formatter-friendly --fix src" "lint:fix": "eslint --ext .js,.vue -f ./node_modules/eslint-formatter-friendly --fix src"
}, },
"browserslist": [ "browserslist": [
"Electron 10.1.3" "Electron 9.3.4"
], ],
"engines": { "engines": {
"node": ">= 12" "node": ">= 12"
@ -165,14 +165,14 @@
"@babel/polyfill": "^7.12.1", "@babel/polyfill": "^7.12.1",
"@babel/preset-env": "^7.12.1", "@babel/preset-env": "^7.12.1",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"babel-loader": "^8.1.0", "babel-loader": "^8.2.1",
"babel-minify-webpack-plugin": "^0.3.1", "babel-minify-webpack-plugin": "^0.3.1",
"babel-preset-minify": "^0.5.1", "babel-preset-minify": "^0.5.1",
"cfonts": "^2.8.6", "cfonts": "^2.8.6",
"chalk": "^4.1.0", "chalk": "^4.1.0",
"changelog-parser": "^2.8.0", "changelog-parser": "^2.8.0",
"copy-webpack-plugin": "^6.2.1", "copy-webpack-plugin": "^6.3.1",
"core-js": "^3.6.5", "core-js": "^3.7.0",
"cross-env": "^7.0.2", "cross-env": "^7.0.2",
"css-loader": "^4.3.0", "css-loader": "^4.3.0",
"del": "^6.0.0", "del": "^6.0.0",
@ -180,21 +180,21 @@
"electron-builder": "^22.9.1", "electron-builder": "^22.9.1",
"electron-debug": "^3.1.0", "electron-debug": "^3.1.0",
"electron-devtools-installer": "^3.1.1", "electron-devtools-installer": "^3.1.1",
"eslint": "^7.12.1", "eslint": "^7.13.0",
"eslint-config-standard": "^14.1.1", "eslint-config-standard": "^14.1.1",
"eslint-formatter-friendly": "^7.0.0", "eslint-formatter-friendly": "^7.0.0",
"eslint-loader": "^4.0.2", "eslint-loader": "^4.0.2",
"eslint-plugin-html": "^6.1.0", "eslint-plugin-html": "^6.1.1",
"eslint-plugin-import": "^2.22.1", "eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1", "eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.2", "eslint-plugin-standard": "^4.1.0",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"friendly-errors-webpack-plugin": "^1.7.0", "friendly-errors-webpack-plugin": "^1.7.0",
"html-webpack-plugin": "^4.5.0", "html-webpack-plugin": "^4.5.0",
"less": "^3.12.2", "less": "^3.12.2",
"less-loader": "^7.0.2", "less-loader": "^7.1.0",
"markdown-it": "^11.0.1", "markdown-it": "^12.0.2",
"mini-css-extract-plugin": "^0.12.0", "mini-css-extract-plugin": "^0.12.0",
"optimize-css-assets-webpack-plugin": "^5.0.4", "optimize-css-assets-webpack-plugin": "^5.0.4",
"postcss-loader": "^4.0.4", "postcss-loader": "^4.0.4",
@ -206,21 +206,21 @@
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"spinnies": "^0.5.1", "spinnies": "^0.5.1",
"stylus": "^0.54.8", "stylus": "^0.54.8",
"stylus-loader": "^4.2.0", "stylus-loader": "^4.3.0",
"terser-webpack-plugin": "^4.2.3", "terser-webpack-plugin": "^4.2.3",
"url-loader": "^4.1.1", "url-loader": "^4.1.1",
"vue-loader": "^15.9.4", "vue-loader": "^15.9.5",
"vue-template-compiler": "^2.6.12", "vue-template-compiler": "^2.6.12",
"webpack": "^4.44.2", "webpack": "^4.44.2",
"webpack-cli": "^3.3.12", "webpack-cli": "^3.3.12",
"webpack-dev-server": "^3.11.0", "webpack-dev-server": "^3.11.0",
"webpack-hot-middleware": "^2.25.0", "webpack-hot-middleware": "^2.25.0",
"webpack-merge": "^5.3.0" "webpack-merge": "^5.4.0"
}, },
"dependencies": { "dependencies": {
"crypto-js": "^4.0.0", "crypto-js": "^4.0.0",
"dnscache": "^1.0.2", "dnscache": "^1.0.2",
"electron-log": "^4.2.4", "electron-log": "^4.3.0",
"electron-store": "^6.0.1", "electron-store": "^6.0.1",
"electron-updater": "^4.3.5", "electron-updater": "^4.3.5",
"iconv-lite": "^0.6.2", "iconv-lite": "^0.6.2",
@ -228,11 +228,11 @@
"js-htmlencode": "^0.3.0", "js-htmlencode": "^0.3.0",
"lrc-file-parser": "^1.0.5", "lrc-file-parser": "^1.0.5",
"needle": "^2.5.2", "needle": "^2.5.2",
"node-id3": "^0.2.1", "node-id3": "^0.1.21",
"request": "^2.88.2", "request": "^2.88.2",
"vue": "^2.6.12", "vue": "^2.6.12",
"vue-i18n": "^8.22.1", "vue-i18n": "^8.22.1",
"vue-router": "^3.4.8", "vue-router": "^3.4.9",
"vuex": "^3.5.1", "vuex": "^3.5.1",
"vuex-router-sync": "^5.0.0" "vuex-router-sync": "^5.0.0"
} }

View File

@ -1,11 +1,6 @@
### 新增
- 播放详情页新增歌曲评论加载显示(某些平台暂不支持显示子评论)
### 优化
- 修改播放详情页的歌曲图片的显示效果
### 修复 ### 修复
- 修复小芸源音乐搜索结果最多只有20条搜索结果的问题 - 修复有歌词翻译与无歌词的音乐间切换会导致歌词翻译残留显示的问题
- 修复歌曲URL过期时等待刷新URL的自动切换歌曲时间间隔太短的问题
- 修复某些电脑上的某些歌曲没有声音的问题升级Electron9.3.4导致的现降级到9.3.3

File diff suppressed because one or more lines are too long

View File

@ -17,6 +17,18 @@ class MainWindow extends EventEmitter {
toggleHide() { toggleHide() {
this.emit(MAIN_WINDOW_EVENT_NAME.toggle_hide) this.emit(MAIN_WINDOW_EVENT_NAME.toggle_hide)
} }
readyToShow() {
this.emit(MAIN_WINDOW_EVENT_NAME.ready_to_show)
}
show() {
this.emit(MAIN_WINDOW_EVENT_NAME.show)
}
hide() {
this.emit(MAIN_WINDOW_EVENT_NAME.hide)
}
} }
module.exports = MainWindow module.exports = MainWindow

View File

@ -10,6 +10,9 @@ exports.mainWindow = {
quit: 'quit', quit: 'quit',
toggle_minimize: 'toggle_minimize', toggle_minimize: 'toggle_minimize',
toggle_hide: 'toggle_hide', toggle_hide: 'toggle_hide',
ready_to_show: 'ready_to_show',
show: 'show',
hide: 'hide',
} }
exports.tray = { exports.tray = {

View File

@ -82,7 +82,7 @@ if (isDev) {
winURL = 'http://localhost:9080' winURL = 'http://localhost:9080'
} else { } else {
global.__static = path.join(__dirname, '/static') global.__static = path.join(__dirname, '/static')
winURL = `file://${__dirname}/index.html` winURL = `file://${path.join(__dirname, 'index.html')}`
} }
function createWindow() { function createWindow() {

View File

@ -23,7 +23,9 @@ exports.registerHotkey = ({ key, info }) => {
} }
} }
global.appHotKey.state[key].info = info global.appHotKey.state[key].info = info
let status = global.appHotKey.state[key].status = globalShortcut.isRegistered(transKey) ? false : globalShortcut.register(transKey, () => { let status = global.appHotKey.state[key].status = globalShortcut.isRegistered(transKey)
? false
: globalShortcut.register(transKey, () => {
handleKeyDown(key) handleKeyDown(key)
}) })
return status return status

View File

@ -1,6 +1,6 @@
const { app, Tray, Menu } = require('electron') const { app, Tray, Menu } = require('electron')
const { isWin } = require('../../common/utils') const { isWin } = require('../../common/utils')
const { tray: TRAY_EVENT_NAME, common: COMMON_EVENT_NAME } = require('../events/_name') const { tray: TRAY_EVENT_NAME, common: COMMON_EVENT_NAME, mainWindow: MAIN_WINDOW_NAME } = require('../events/_name')
const path = require('path') const path = require('path')
let isEnableTray = null let isEnableTray = null
let themeId = null let themeId = null
@ -29,6 +29,16 @@ global.lx_event.common.on(COMMON_EVENT_NAME.config, sourceName => {
createMenu(global.modules.tray) createMenu(global.modules.tray)
}) })
global.lx_event.mainWindow.on(MAIN_WINDOW_NAME.ready_to_show, () => {
createMenu(global.modules.tray)
})
global.lx_event.mainWindow.on(MAIN_WINDOW_NAME.show, () => {
createMenu(global.modules.tray)
})
global.lx_event.mainWindow.on(MAIN_WINDOW_NAME.hide, () => {
createMenu(global.modules.tray)
})
const createTray = () => { const createTray = () => {
if ((global.modules.tray && !global.modules.tray.isDestroyed()) || !global.appSetting.tray || !global.appSetting.tray.isShow) return if ((global.modules.tray && !global.modules.tray.isDestroyed()) || !global.appSetting.tray || !global.appSetting.tray.isShow) return
@ -58,8 +68,24 @@ const destroyTray = () => {
} }
const createMenu = tray => { const createMenu = tray => {
if (!global.modules.tray || !isWin) return if (!global.modules.tray) return
let menu = [] let menu = []
global.modules.mainWindow && menu.push(global.modules.mainWindow.isVisible() ? {
label: '隐藏主界面',
click() {
global.modules.mainWindow.hide()
},
} : {
label: '显示主界面',
click() {
if (!global.modules.mainWindow) return
if (!global.modules.mainWindow.isVisible()) {
global.modules.mainWindow.show()
}
global.modules.mainWindow.restore()
global.modules.mainWindow.focus()
},
})
menu.push(global.appSetting.desktopLyric.enable ? { menu.push(global.appSetting.desktopLyric.enable ? {
label: '关闭桌面歌词', label: '关闭桌面歌词',
click() { click() {

View File

@ -1,3 +1,4 @@
const path = require('path')
const { BrowserWindow } = require('electron') const { BrowserWindow } = require('electron')
const { winLyric: WIN_LYRIC_EVENT_NAME } = require('../../events/_name') const { winLyric: WIN_LYRIC_EVENT_NAME } = require('../../events/_name')
const { debounce } = require('../../../common/utils') const { debounce } = require('../../../common/utils')
@ -13,7 +14,7 @@ global.lx_event.winLyric.on(WIN_LYRIC_EVENT_NAME.close, () => {
closeWindow() closeWindow()
}) })
let winURL = global.isDev ? 'http://localhost:9081/lyric.html' : `file://${__dirname}/lyric.html` let winURL = global.isDev ? 'http://localhost:9081/lyric.html' : `file://${path.join(__dirname, 'lyric.html')}`
const setLyricsConfig = debounce(config => { const setLyricsConfig = debounce(config => {
// if (x != null) bounds.x = x // if (x != null) bounds.x = x

View File

@ -29,5 +29,13 @@ module.exports = mainWindow => {
mainWindow.once('ready-to-show', () => { mainWindow.once('ready-to-show', () => {
mainWindow.show() mainWindow.show()
global.lx_event.mainWindow.readyToShow()
})
mainWindow.on('show', () => {
global.lx_event.mainWindow.show()
})
mainWindow.on('hide', () => {
global.lx_event.mainWindow.hide()
}) })
} }

View File

@ -47,6 +47,9 @@ module.exports = (filePath, meta) => {
if (err) console.log(err.message) if (err) console.log(err.message)
delete meta.APIC delete meta.APIC
handleWriteMeta(meta, filePath) handleWriteMeta(meta, filePath)
fs.unlink(picPath, err => {
if (err) console.log(err.message)
})
}) })
}) })
.on('error', err => { .on('error', err => {

View File

@ -279,7 +279,7 @@ export default {
rendererSend(NAMES.winLyric.close) rendererSend(NAMES.winLyric.close)
}, },
setLyric() { setLyric() {
window.lrc.setLyric((this.isShowLyricTransition && this.lyrics.tlyric ? this.lyrics.tlyric + '\n' : '') + this.lyrics.lyric) window.lrc.setLyric((this.isShowLyricTransition && this.lyrics.tlyric ? (this.lyrics.tlyric + '\n') : '') + (this.lyrics.lyric || ''))
}, },
}, },
} }

View File

@ -174,6 +174,9 @@ export default {
...mapMutations('search', { ...mapMutations('search', {
setSearchHistoryList: 'setHistory', setSearchHistoryList: 'setHistory',
}), }),
...mapMutations('player', {
setPlayList: 'setList',
}),
init() { init() {
document.documentElement.style.fontSize = this.windowSizeActive.fontSize document.documentElement.style.fontSize = this.windowSizeActive.fontSize
@ -276,6 +279,7 @@ export default {
if (!loveList.list) loveList.list = [] if (!loveList.list) loveList.list = []
this.initList({ defaultList, loveList, userList }) this.initList({ defaultList, loveList, userList })
this.initDownloadList(downloadList) // this.initDownloadList(downloadList) //
this.initPlayInfo()
}) })
}, },
initDownloadList(downloadList) { initDownloadList(downloadList) {
@ -299,6 +303,27 @@ export default {
} }
}) })
}, },
initPlayInfo() {
rendererInvoke(NAMES.mainWindow.get_data, 'playInfo').then(info => {
// console.log(info, window.allList)
if (!info) return
if (info.listId) {
const list = window.allList[info.listId]
// console.log(list)
if (!list) return
info.list = list.list
}
window.restorePlayInfo = info
this.setPlayList({
list: {
list: info.list,
id: info.listId,
},
index: info.index,
})
})
},
showUpdateModal() { showUpdateModal() {
(this.version.newVersion && this.version.newVersion.history (this.version.newVersion && this.version.newVersion.history
? Promise.resolve(this.version.newVersion) ? Promise.resolve(this.version.newVersion)

View File

@ -8,7 +8,7 @@ div(:class="$style.aside")
svg(:class="$style.controlBtniIcon" version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' width='100%' viewBox='0 0 24 24' space='preserve') svg(:class="$style.controlBtniIcon" version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' width='100%' viewBox='0 0 24 24' space='preserve')
use(xlink:href='#icon-window-minimize') use(xlink:href='#icon-window-minimize')
div(:class="['animated', logoAnimate, $style.logo]" v-else) L X div(:class="['animated', logoAnimate, $style.logo]" v-else) ^_^
//- svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='0 0 127 61' space='preserve') //- svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' width='100%' height='100%' viewBox='0 0 127 61' space='preserve')
use(xlink:href='#icon-logo') use(xlink:href='#icon-logo')

View File

@ -49,7 +49,7 @@ div(:class="$style.player")
span(style="margin: 0 5px;") / span(style="margin: 0 5px;") /
span {{maxPlayTimeStr}} span {{maxPlayTimeStr}}
div(:class="$style.right") div(:class="$style.right")
div(:class="$style.playBtn" @click='handlePrev' :tips="$t('core.player.next')" style="transform: rotate(180deg);") div(:class="$style.playBtn" @click='handlePrev' :tips="$t('core.player.prev')" style="transform: rotate(180deg);")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve') svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve')
use(xlink:href='#icon-nextMusic') use(xlink:href='#icon-nextMusic')
div(:class="$style.playBtn" :tips="isPlay ? $t('core.player.pause') : $t('core.player.play')" @click='togglePlay') div(:class="$style.playBtn" :tips="isPlay ? $t('core.player.pause') : $t('core.player.play')" @click='togglePlay')
@ -87,7 +87,7 @@ div(:class="$style.player")
<script> <script>
import Lyric from 'lrc-file-parser' import Lyric from 'lrc-file-parser'
import { rendererSend, rendererOn, NAMES } from '../../../common/ipc' import { rendererSend, rendererOn, NAMES } from '../../../common/ipc'
import { formatPlayTime2, getRandom, checkPath, setTitle, clipboardWriteText, debounce, assertApiSupport } from '../../utils' import { formatPlayTime2, getRandom, checkPath, setTitle, clipboardWriteText, debounce, throttle, assertApiSupport } from '../../utils'
import { mapGetters, mapActions, mapMutations } from 'vuex' import { mapGetters, mapActions, mapMutations } from 'vuex'
import { requestMsg } from '../../utils/message' import { requestMsg } from '../../utils/message'
import { isMac } from '../../../common/utils' import { isMac } from '../../../common/utils'
@ -130,7 +130,7 @@ export default {
line: 0, line: 0,
}, },
delayNextTimeout: null, delayNextTimeout: null,
audioErrorTime: 0, restorePlayTime: 0,
retryNum: 0, retryNum: 0,
isMac, isMac,
volumeEvent: { volumeEvent: {
@ -195,6 +195,12 @@ export default {
this.handleSaveVolume = debounce(volume => { this.handleSaveVolume = debounce(volume => {
this.setVolume(volume) this.setVolume(volume)
}, 300) }, 300)
this.savePlayInfo = throttle(n => {
rendererSend(NAMES.mainWindow.save_data, {
path: 'playInfo',
data: n,
})
}, 2000)
rendererOn(NAMES.mainWindow.get_lyric_info, (event, info) => { rendererOn(NAMES.mainWindow.get_lyric_info, (event, info) => {
switch (info.action) { switch (info.action) {
@ -287,6 +293,12 @@ export default {
}, },
nowPlayTime(n, o) { nowPlayTime(n, o) {
if (Math.abs(n - o) > 2) this.isActiveTransition = true if (Math.abs(n - o) > 2) this.isActiveTransition = true
this.savePlayInfo({
time: n,
listId: this.listId,
list: this.listId == null ? this.list : null,
index: this.playIndex,
})
}, },
}, },
methods: { methods: {
@ -299,6 +311,7 @@ export default {
'clearPlayedList', 'clearPlayedList',
'setPlayedList', 'setPlayedList',
'removePlayedList', 'removePlayedList',
'setList',
]), ]),
...mapMutations(['setVolume', 'setPlayNextMode', 'setVisibleDesktopLyric', 'setLockDesktopLyric']), ...mapMutations(['setVolume', 'setPlayNextMode', 'setVisibleDesktopLyric', 'setLockDesktopLyric']),
...mapMutations('list', ['updateMusicInfo']), ...mapMutations('list', ['updateMusicInfo']),
@ -348,7 +361,7 @@ export default {
this.stopPlay() this.stopPlay()
if (this.listId != 'download' && audio.error.code !== 1 && this.retryNum < 2) { // URL2URL if (this.listId != 'download' && audio.error.code !== 1 && this.retryNum < 2) { // URL2URL
// console.log(this.retryNum) // console.log(this.retryNum)
if (!this.audioErrorTime) this.audioErrorTime = audio.currentTime // if (!this.restorePlayTime) this.restorePlayTime = audio.currentTime //
this.retryNum++ this.retryNum++
this.setUrl(this.list[this.playIndex], true) this.setUrl(this.list[this.playIndex], true)
this.status = this.statusText = this.$t('core.player.refresh_url') this.status = this.statusText = this.$t('core.player.refresh_url')
@ -360,15 +373,24 @@ export default {
this.addDelayNextTimeout() this.addDelayNextTimeout()
}) })
audio.addEventListener('loadeddata', () => { audio.addEventListener('loadeddata', () => {
console.log('loadeddata')
this.clearLoadingTimeout()
this.status = this.statusText = this.$t('core.player.loading')
this.maxPlayTime = audio.duration this.maxPlayTime = audio.duration
if (this.audioErrorTime) { if (window.restorePlayInfo) {
audio.currentTime = this.audioErrorTime audio.currentTime = window.restorePlayInfo.time
this.audioErrorTime = 0 window.restorePlayInfo = null
audio.pause()
this.stopPlay()
} else if (this.restorePlayTime) {
audio.currentTime = this.restorePlayTime
this.restorePlayTime = 0
} }
if (!this.targetSong.interval && this.listId != 'download') this.updateMusicInfo({ id: this.listId, index: this.playIndex, data: { interval: formatPlayTime2(this.maxPlayTime) } }) if (!this.targetSong.interval && this.listId != 'download') this.updateMusicInfo({ id: this.listId, index: this.playIndex, data: { interval: formatPlayTime2(this.maxPlayTime) } })
this.status = this.statusText = this.$t('core.player.loading')
}) })
audio.addEventListener('loadstart', () => { audio.addEventListener('loadstart', () => {
console.log('loadstart')
this.startLoadingTimeout()
this.status = this.statusText = this.$t('core.player.loading') this.status = this.statusText = this.$t('core.player.loading')
}) })
audio.addEventListener('canplay', () => { audio.addEventListener('canplay', () => {
@ -378,11 +400,10 @@ export default {
this.mediaBuffer.playTime = 0 this.mediaBuffer.playTime = 0
audio.currentTime = playTime audio.currentTime = playTime
} }
if (this.mediaBuffer.timeout) {
this.clearBufferTimeout() this.clearBufferTimeout()
}
// if (this.musicInfo.lrc) window.lrc.play(audio.currentTime * 1000) // if (this.musicInfo.lrc) window.lrc.play(audio.currentTime * 1000)
this.status = this.statusText = this.$t('core.player.loading') this.status = this.statusText = ''
}) })
// audio.addEventListener('canplaythrough', () => { // audio.addEventListener('canplaythrough', () => {
// console.log('') // console.log('')
@ -391,6 +412,7 @@ export default {
// }) // })
audio.addEventListener('emptied', () => { audio.addEventListener('emptied', () => {
this.mediaBuffer.playTime = 0 this.mediaBuffer.playTime = 0
this.clearLoadingTimeout()
this.clearBufferTimeout() this.clearBufferTimeout()
// console.log(' or ') // console.log(' or ')
@ -432,7 +454,7 @@ export default {
let targetSong = this.targetSong = this.list[this.playIndex] let targetSong = this.targetSong = this.list[this.playIndex]
if (this.setting.player.togglePlayMethod == 'random') this.setPlayedList(targetSong) if (this.setting.player.togglePlayMethod == 'random') this.setPlayedList(targetSong)
this.retryNum = 0 this.retryNum = 0
this.audioErrorTime = 0 this.restorePlayTime = 0
if (this.listId == 'download') { if (this.listId == 'download') {
const filePath = path.join(this.setting.download.savePath, targetSong.fileName) const filePath = path.join(this.setting.download.savePath, targetSong.fileName)
@ -517,15 +539,18 @@ export default {
if (this.setting.player.togglePlayMethod == 'random' && this.playedList.length) { if (this.setting.player.togglePlayMethod == 'random' && this.playedList.length) {
let index = this.playedList.indexOf(this.targetSong) let index = this.playedList.indexOf(this.targetSong)
index -= 1 index -= 1
while (true) {
if (index > -1) { if (index > -1) {
let listIndex = this.list.indexOf(this.playedList[index]) let listIndex = this.list.indexOf(this.playedList[index])
if (listIndex < 0) { if (listIndex < 0) {
this.removePlayedList(index) this.removePlayedList(index)
return this.handlePrev() continue
} }
this.setPlayIndex(listIndex) this.setPlayIndex(listIndex)
return return
} }
break
}
} }
let list = await this.filterList() let list = await this.filterList()
if (!list.length) return this.setPlayIndex(-1) if (!list.length) return this.setPlayIndex(-1)
@ -552,15 +577,18 @@ export default {
if (this.setting.player.togglePlayMethod == 'random' && this.playedList.length) { if (this.setting.player.togglePlayMethod == 'random' && this.playedList.length) {
let index = this.playedList.indexOf(this.targetSong) let index = this.playedList.indexOf(this.targetSong)
index += 1 index += 1
while (true) {
if (index < this.playedList.length) { if (index < this.playedList.length) {
let listIndex = this.list.indexOf(this.playedList[index]) let listIndex = this.list.indexOf(this.playedList[index])
if (listIndex < 0) { if (listIndex < 0) {
this.removePlayedList(index) this.removePlayedList(index)
return this.handleNext() continue
} }
this.setPlayIndex(listIndex) this.setPlayIndex(listIndex)
return return
} }
break
}
} }
let list = await this.filterList() let list = await this.filterList()
if (!list.length) return this.setPlayIndex(-1) if (!list.length) return this.setPlayIndex(-1)
@ -607,7 +635,7 @@ export default {
setProgress(pregress) { setProgress(pregress) {
if (!audio.src) return if (!audio.src) return
const time = pregress * this.maxPlayTime const time = pregress * this.maxPlayTime
if (this.audioErrorTime) this.audioErrorTime = time if (this.restorePlayTime) this.restorePlayTime = time
if (this.mediaBuffer.playTime) { if (this.mediaBuffer.playTime) {
this.clearBufferTimeout() this.clearBufferTimeout()
this.mediaBuffer.playTime = time this.mediaBuffer.playTime = time
@ -667,18 +695,10 @@ export default {
} }
}, },
setLrc(targetSong) { setLrc(targetSong) {
this.getLrc(targetSong).then(() => {
this.musicInfo.lrc = targetSong.lrc this.musicInfo.lrc = targetSong.lrc
this.musicInfo.tlrc = targetSong.tlrc this.musicInfo.tlrc = targetSong.tlrc
}).catch(() => {
let lrcP = this.musicInfo.lrc && this.musicInfo.tlrc != null
? Promise.resolve()
: this.getLrc(targetSong).then(() => {
this.musicInfo.lrc = targetSong.lrc
this.musicInfo.tlrc = targetSong.tlrc
})
lrcP
.catch(() => {
this.status = this.statusText = this.$t('core.player.lyric_error') this.status = this.statusText = this.$t('core.player.lyric_error')
}).finally(() => { }).finally(() => {
this.handleUpdateWinLyricInfo('lyric', { lrc: this.musicInfo.lrc, tlrc: this.musicInfo.tlrc }) this.handleUpdateWinLyricInfo('lyric', { lrc: this.musicInfo.lrc, tlrc: this.musicInfo.tlrc })
@ -694,6 +714,7 @@ export default {
this.status = this.musicInfo.name = this.musicInfo.singer = '' this.status = this.musicInfo.name = this.musicInfo.singer = ''
this.musicInfo.songmid = null this.musicInfo.songmid = null
this.musicInfo.lrc = null this.musicInfo.lrc = null
this.musicInfo.tlrc = null
this.musicInfo.url = null this.musicInfo.url = null
this.nowPlayTime = 0 this.nowPlayTime = 0
this.maxPlayTime = 0 this.maxPlayTime = 0
@ -776,8 +797,20 @@ export default {
// console.log(e) // console.log(e)
this.isActiveTransition = false this.isActiveTransition = false
}, },
startLoadingTimeout() {
// console.log('start load timeout')
this.loadingTimeout = setTimeout(() => {
this.handleNext()
}, 10000)
},
clearLoadingTimeout() {
if (!this.loadingTimeout) return
// console.log('clear load timeout')
clearTimeout(this.loadingTimeout)
this.loadingTimeout = null
},
startBuffering() { startBuffering() {
console.log('start t') console.error('start t')
if (this.mediaBuffer.timeout) return if (this.mediaBuffer.timeout) return
this.mediaBuffer.timeout = setTimeout(() => { this.mediaBuffer.timeout = setTimeout(() => {
this.mediaBuffer.timeout = null this.mediaBuffer.timeout = null
@ -872,7 +905,7 @@ export default {
}) })
}, },
setLyric() { setLyric() {
window.lrc.setLyric((this.setting.player.isShowLyricTransition && this.musicInfo.tlrc ? this.musicInfo.tlrc + '\n' : '') + this.musicInfo.lrc) window.lrc.setLyric((this.setting.player.isShowLyricTransition && this.musicInfo.tlrc ? (this.musicInfo.tlrc + '\n') : '') + (this.musicInfo.lrc || ''))
if (this.isPlay && (this.musicInfo.url || this.listId == 'download')) { if (this.isPlay && (this.musicInfo.url || this.listId == 'download')) {
window.lrc.play(audio.currentTime * 1000) window.lrc.play(audio.currentTime * 1000)
this.handleUpdateWinLyricInfo('play', audio.currentTime * 1000) this.handleUpdateWinLyricInfo('play', audio.currentTime * 1000)

View File

@ -29,7 +29,7 @@
"play_toggle_mode_single_loop": "Single Loop", "play_toggle_mode_single_loop": "Single Loop",
"play_toggle_mode_off": "Disable", "play_toggle_mode_off": "Disable",
"comment_show": "Show song comments", "comment_show": "Song comments",
"comment_hot_loading": "Hot comments are loading", "comment_hot_loading": "Hot comments are loading",
"comment_new_loading": "Latest comments are loading", "comment_new_loading": "Latest comments are loading",
"comment_hot_load_error": "Hot comments failed to load, click to try to reload", "comment_hot_load_error": "Hot comments failed to load, click to try to reload",

View File

@ -29,7 +29,7 @@
"play_toggle_mode_single_loop": "单曲循环", "play_toggle_mode_single_loop": "单曲循环",
"play_toggle_mode_off": "禁用", "play_toggle_mode_off": "禁用",
"comment_show": "显示歌曲评论", "comment_show": "歌曲评论",
"comment_hot_loading": "热门评论加载中", "comment_hot_loading": "热门评论加载中",
"comment_new_loading": "最新评论加载中", "comment_new_loading": "最新评论加载中",
"comment_hot_load_error": "热门评论加载失败,点击尝试重新加载", "comment_hot_load_error": "热门评论加载失败,点击尝试重新加载",

View File

@ -29,7 +29,7 @@
"play_toggle_mode_single_loop": "單曲循環", "play_toggle_mode_single_loop": "單曲循環",
"play_toggle_mode_off": "禁用", "play_toggle_mode_off": "禁用",
"comment_show": "顯示歌曲評論", "comment_show": "歌曲評論",
"comment_hot_loading": "熱門評論加載中", "comment_hot_loading": "熱門評論加載中",
"comment_new_loading": "最新評論加載中", "comment_new_loading": "最新評論加載中",
"comment_hot_load_error": "熱門評論加載失敗,點擊嘗試重新加載", "comment_hot_load_error": "熱門評論加載失敗,點擊嘗試重新加載",

View File

@ -78,8 +78,9 @@ const encodeNames = {
'&gt;': '>', '&gt;': '>',
'&quot;': '"', '&quot;': '"',
'&apos;': "'", '&apos;': "'",
'&#039;': "'",
} }
export const decodeName = str => str.replace(/(?:&amp;|&lt;|&gt;|&quot;|&apos;)/g, s => encodeNames[s]) export const decodeName = str => str.replace(/(?:&amp;|&lt;|&gt;|&quot;|&apos;|&#039;)/gm, s => encodeNames[s])
const easeInOutQuad = (t, b, c, d) => { const easeInOutQuad = (t, b, c, d) => {
t /= d / 2 t /= d / 2
@ -132,7 +133,7 @@ const handleScroll = (element, to, duration = 300, fn = () => {}) => {
* @param {*} fn 滚动完成后的回调 * @param {*} fn 滚动完成后的回调
* @param {*} delay 延迟执行时间 * @param {*} delay 延迟执行时间
*/ */
export const scrollTo = (element, to, duration = 300, fn = () => {}, delay) => { export const scrollTo = (element, to, duration = 300, fn = () => {}, delay = 0) => {
let cancelFn let cancelFn
let timeout let timeout
if (delay) { if (delay) {

View File

@ -1,5 +1,5 @@
import { httpFetch } from '../../request' import { httpFetch } from '../../request'
import { dateFormat2 } from '../../' import { decodeName, dateFormat2 } from '../../'
export default { export default {
_requestObj: null, _requestObj: null,
@ -48,7 +48,7 @@ export default {
return rawList.map(item => { return rawList.map(item => {
let data = { let data = {
id: item.id, id: item.id,
text: item.content.split('\n'), text: decodeName(item.content || '').split('\n'),
time: item.addtime, time: item.addtime,
timeStr: dateFormat2(new Date(item.addtime).getTime()), timeStr: dateFormat2(new Date(item.addtime).getTime()),
userName: item.user_name, userName: item.user_name,
@ -61,7 +61,7 @@ export default {
return item.pcontent ? { return item.pcontent ? {
id: item.id, id: item.id,
text: item.pcontent.split('\n'), text: decodeName(item.pcontent).split('\n'),
time: null, time: null,
userName: item.puser, userName: item.puser,
avatar: null, avatar: null,

View File

@ -1,4 +1,5 @@
import { httpFetch } from '../../request' import { httpFetch } from '../../request'
import { decodeName } from '../..'
export default { export default {
_requestObj: null, _requestObj: null,
@ -25,7 +26,7 @@ export default {
filterList(rawList) { filterList(rawList) {
const list = [] const list = []
rawList.forEach(item => { rawList.forEach(item => {
item.keywords.map(k => list.push(k.keyword)) item.keywords.map(k => list.push(decodeName(k.keyword)))
}) })
return list return list
}, },

View File

@ -1,5 +1,5 @@
import { httpGet, cancelHttp, httpFetch } from '../../request' import { httpGet, cancelHttp, httpFetch } from '../../request'
import { formatPlayTime, sizeFormate } from '../../index' import { decodeName, formatPlayTime, sizeFormate } from '../../index'
let boardList = [{ id: 'kg__8888', name: '酷狗TOP500', bangid: '8888' }, { id: 'kg__6666', name: '酷狗飙升榜', bangid: '6666' }, { id: 'kg__37361', name: '酷狗雷达榜', bangid: '37361' }, { id: 'kg__23784', name: '网络红歌榜', bangid: '23784' }, { id: 'kg__24971', name: 'DJ热歌榜', bangid: '24971' }, { id: 'kg__35811', name: '会员专享热歌榜', bangid: '35811' }, { id: 'kg__31308', name: '华语新歌榜', bangid: '31308' }, { id: 'kg__31310', name: '欧美新歌榜', bangid: '31310' }, { id: 'kg__31311', name: '韩国新歌榜', bangid: '31311' }, { id: 'kg__31312', name: '日本新歌榜', bangid: '31312' }, { id: 'kg__31313', name: '粤语新歌榜', bangid: '31313' }, { id: 'kg__33162', name: 'ACG新歌榜', bangid: '33162' }, { id: 'kg__21101', name: '酷狗分享榜', bangid: '21101' }, { id: 'kg__30972', name: '腾讯音乐人原创榜', bangid: '30972' }, { id: 'kg__22603', name: '5sing音乐榜', bangid: '22603' }, { id: 'kg__33160', name: '电音热歌榜', bangid: '33160' }, { id: 'kg__21335', name: '繁星音乐榜', bangid: '21335' }, { id: 'kg__33161', name: '古风新歌榜', bangid: '33161' }, { id: 'kg__33163', name: '影视金曲榜', bangid: '33163' }, { id: 'kg__33166', name: '欧美金曲榜', bangid: '33166' }, { id: 'kg__33165', name: '粤语金曲榜', bangid: '33165' }, { id: 'kg__36107', name: '小语种热歌榜', bangid: '36107' }, { id: 'kg__4681', name: '美国BillBoard榜', bangid: '4681' }, { id: 'kg__4680', name: '英国单曲榜', bangid: '4680' }, { id: 'kg__4673', name: '日本公信榜', bangid: '4673' }, { id: 'kg__38623', name: '韩国Melon音乐榜', bangid: '38623' }, { id: 'kg__42807', name: 'joox本地热歌榜', bangid: '42807' }, { id: 'kg__42808', name: '台湾KKBOX风云榜', bangid: '42808' }] let boardList = [{ id: 'kg__8888', name: '酷狗TOP500', bangid: '8888' }, { id: 'kg__6666', name: '酷狗飙升榜', bangid: '6666' }, { id: 'kg__37361', name: '酷狗雷达榜', bangid: '37361' }, { id: 'kg__23784', name: '网络红歌榜', bangid: '23784' }, { id: 'kg__24971', name: 'DJ热歌榜', bangid: '24971' }, { id: 'kg__35811', name: '会员专享热歌榜', bangid: '35811' }, { id: 'kg__31308', name: '华语新歌榜', bangid: '31308' }, { id: 'kg__31310', name: '欧美新歌榜', bangid: '31310' }, { id: 'kg__31311', name: '韩国新歌榜', bangid: '31311' }, { id: 'kg__31312', name: '日本新歌榜', bangid: '31312' }, { id: 'kg__31313', name: '粤语新歌榜', bangid: '31313' }, { id: 'kg__33162', name: 'ACG新歌榜', bangid: '33162' }, { id: 'kg__21101', name: '酷狗分享榜', bangid: '21101' }, { id: 'kg__30972', name: '腾讯音乐人原创榜', bangid: '30972' }, { id: 'kg__22603', name: '5sing音乐榜', bangid: '22603' }, { id: 'kg__33160', name: '电音热歌榜', bangid: '33160' }, { id: 'kg__21335', name: '繁星音乐榜', bangid: '21335' }, { id: 'kg__33161', name: '古风新歌榜', bangid: '33161' }, { id: 'kg__33163', name: '影视金曲榜', bangid: '33163' }, { id: 'kg__33166', name: '欧美金曲榜', bangid: '33166' }, { id: 'kg__33165', name: '粤语金曲榜', bangid: '33165' }, { id: 'kg__36107', name: '小语种热歌榜', bangid: '36107' }, { id: 'kg__4681', name: '美国BillBoard榜', bangid: '4681' }, { id: 'kg__4680', name: '英国单曲榜', bangid: '4680' }, { id: 'kg__4673', name: '日本公信榜', bangid: '4673' }, { id: 'kg__38623', name: '韩国Melon音乐榜', bangid: '38623' }, { id: 'kg__42807', name: 'joox本地热歌榜', bangid: '42807' }, { id: 'kg__42808', name: '台湾KKBOX风云榜', bangid: '42808' }]
@ -134,9 +134,9 @@ export default {
} }
} }
return { return {
singer: item.singername, singer: decodeName(item.singername),
name: item.songname, name: decodeName(item.songname),
albumName: item.album_name, albumName: decodeName(item.album_name),
albumId: item.album_id, albumId: item.album_id,
songmid: item.audio_id, songmid: item.audio_id,
source: 'kg', source: 'kg',

View File

@ -1,8 +1,10 @@
import { httpFetch } from '../../request' import { httpFetch } from '../../request'
import { decodeLyric } from './util' import { decodeLyric } from './util'
import { decodeName } from '../..'
const parseLyric = str => { const parseLyric = str => {
str = str.replace(/(?:<\d+,\d+,\d+>|\r)/g, '') str = str.replace(/(?:<\d+,\d+,\d+>|\r)/g, '')
if (str.startsWith('\ufeff[id:$00000000]')) str = str.replace('\ufeff[id:$00000000]\n', '')
let trans = str.match(/\[language:([\w=\\/+]+)\]/) let trans = str.match(/\[language:([\w=\\/+]+)\]/)
let tlyric let tlyric
if (trans) { if (trans) {
@ -29,6 +31,8 @@ const parseLyric = str => {
return str.replace(result[1], time) return str.replace(result[1], time)
}) })
tlyric = tlyric ? tlyric.join('\n') : '' tlyric = tlyric ? tlyric.join('\n') : ''
lyric = decodeName(lyric)
tlyric = decodeName(tlyric)
return { return {
lyric, lyric,
tlyric, tlyric,

View File

@ -1,7 +1,7 @@
// import '../../polyfill/array.find' // import '../../polyfill/array.find'
// import jshtmlencode from 'js-htmlencode' // import jshtmlencode from 'js-htmlencode'
import { httpFetch } from '../../request' import { httpFetch } from '../../request'
import { formatPlayTime, sizeFormate } from '../../index' import { decodeName, formatPlayTime, sizeFormate } from '../../index'
// import { debug } from '../../utils/env' // import { debug } from '../../utils/env'
// import { formatSinger } from './util' // import { formatSinger } from './util'
@ -50,9 +50,9 @@ export default {
} }
} }
list.push({ list.push({
singer: item.singername, singer: decodeName(item.singername),
name: item.songname, name: decodeName(item.songname),
albumName: item.album_name, albumName: decodeName(item.album_name),
albumId: item.album_id, albumId: item.album_id,
songmid: item.audio_id, songmid: item.audio_id,
source: 'kg', source: 'kg',

View File

@ -1,5 +1,5 @@
import { httpFetch } from '../../request' import { httpFetch } from '../../request'
import { formatPlayTime, sizeFormate } from '../../index' import { decodeName, formatPlayTime, sizeFormate } from '../../index'
import { toMD5 } from '../utils' import { toMD5 } from '../utils'
export default { export default {
@ -454,9 +454,9 @@ export default {
} }
} }
return { return {
singer: item.singername, singer: decodeName(item.singername),
name: item.songname, name: decodeName(item.songname),
albumName: item.album_name, albumName: decodeName(item.album_name),
albumId: item.album_id, albumId: item.album_id,
songmid: item.audio_id, songmid: item.audio_id,
source: 'kg', source: 'kg',
@ -507,9 +507,9 @@ export default {
} }
} }
list.push({ list.push({
singer: item.author_name, singer: decodeName(item.author_name),
name: item.ori_audio_name, name: decodeName(item.ori_audio_name),
albumName: item.album_info.album_name, albumName: decodeName(item.album_info.album_name),
albumId: item.album_info.album_id, albumId: item.album_info.album_id,
songmid: item.audio_info.audio_id, songmid: item.audio_info.audio_id,
source: 'kg', source: 'kg',

View File

@ -382,7 +382,8 @@ export default {
return this.searchSourceId == 'all' return this.searchSourceId == 'all'
? list.filter(s => this.assertApiSupport(s.source)) ? list.filter(s => this.assertApiSupport(s.source))
: this.assertApiSupport(this.searchSourceId) : this.assertApiSupport(this.searchSourceId)
? [...list] : [] ? [...list]
: []
}, },
handleListAddModalClose() { handleListAddModalClose() {
this.isShowListAdd = false this.isShowListAdd = false