Compare commits

...

67 Commits

Author SHA1 Message Date
lyswhut
2bc4912416 发布0.14.1版本 2020-01-22 22:31:39 +08:00
lyswhut
474f0d8291 修正描述 2020-01-22 22:31:04 +08:00
lyswhut
231fe54408 修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题 2020-01-22 22:30:50 +08:00
lyswhut
78bef70735 发布0.14.0版本 2020-01-22 19:50:34 +08:00
lyswhut
ce7247e209 新增获取版本信息的备用链接 2020-01-22 10:12:10 +08:00
lyswhut
1d807e2a89 更新Windows 7 下界面异常问题描述 2020-01-20 13:46:41 +08:00
lyswhut
749141c10e 适配输入框提示文本颜色 2020-01-19 18:05:16 +08:00
lyswhut
e2c7c0596c 修复标签列表颜色适配 2020-01-19 17:43:40 +08:00
lyswhut
392cd72f83 优化新年快乐皮肤 2020-01-19 17:32:43 +08:00
lyswhut
340a9d937b 优化音质标签颜色 2020-01-19 17:26:53 +08:00
lyswhut
5d7ad836db 新增“新年快乐”主题 2020-01-19 16:00:01 +08:00
lyswhut
f8e449b017 新增不强制win7开启透明效果即可使用 2020-01-19 13:56:54 +08:00
lyswhut
bb0b59080a 更新依赖到最新 2020-01-17 21:52:36 +08:00
lyswhut
95b08c2406 修复无搜索结果的处理 2020-01-17 21:26:31 +08:00
lyswhut
3ef5e0e55a 更新 Electron 到 7.1.8 2020-01-14 13:06:45 +08:00
lyswhut
ae9b4bc2f5 更换migu搜索接口 2020-01-13 13:20:04 +08:00
lyswhut
914e738931 修复在线音乐列表获取失败时无限循环请求的问题 2020-01-13 12:49:09 +08:00
lyswhut
e4c19c0f2a 恢复QQ音乐源128k音质试听 2020-01-11 17:45:22 +08:00
lyswhut
54354518d0 简化写法 2020-01-10 22:19:24 +08:00
lyswhut
d36e21ab56 更新软件依赖到最新 2020-01-10 22:14:21 +08:00
lyswhut
b496e3c667 更换songmid的id值 2020-01-10 22:13:53 +08:00
lyswhut
d10434285f 更新关于软件说明 2020-01-10 22:13:10 +08:00
lyswhut
d6c8886fdb 更新“软件启动后,界面无法显示”的问题解决方案 2020-01-07 13:11:36 +08:00
lyswhut
51e3c8605c 调整列表字体颜色深度 2020-01-06 12:01:33 +08:00
lyswhut
d4d6b9c9aa 修复咪咕源无法搜索的问题 2020-01-06 00:30:52 +08:00
lyswhut
0c9c3c61fc 更新关于软件说明 2020-01-03 15:47:51 +08:00
lyswhut
0228850d6d 新增各大平台歌单热门标签显示 2019-12-31 16:12:46 +08:00
lyswhut
529078dc67 当歌曲有无损音质时隐藏高品质标签 2019-12-29 13:53:54 +08:00
lyswhut
aadb68ba08 减淡各个主题的歌曲列表分隔线颜色 2019-12-28 17:26:23 +08:00
lyswhut
c81171a39e 监听所有未捕获错误事件并记录到日志中 2019-12-27 21:42:19 +08:00
lyswhut
a50ecff189 将软件设置与播放列表分离存储成两个文件 2019-12-23 19:24:35 +08:00
lyswhut
73321829ae 给代理添加提示 2019-12-23 16:09:52 +08:00
lyswhut
e88c837482 添加软件无法联网帮助 2019-12-22 14:34:52 +08:00
lyswhut
2b263cae87 修复更新弹窗底部文字颜色适配问题 2019-12-17 12:56:25 +08:00
lyswhut
e93052f0cb 发布0.13.1版本 2019-12-16 21:19:27 +08:00
lyswhut
9539083f7e 降级electron到7.1.2 2019-12-16 21:04:22 +08:00
lyswhut
8f26eb1c69 修复全局更新弹窗无法遮盖搜索框的问题 2019-12-16 00:24:32 +08:00
lyswhut
a126e5b4c8 发布0.13.0版本 2019-12-15 21:33:46 +08:00
lyswhut
033c3cd8e9 多修复选框不定状态到选中的Bug 2019-12-15 21:23:52 +08:00
lyswhut
50d029c671 移除Q音源的试听与下载 2019-12-15 21:03:19 +08:00
lyswhut
6a3f7e6150 修复搜索建议列表被弹出层覆盖的问题 2019-12-15 19:18:31 +08:00
lyswhut
aadfbefbe9 更新electron及vue到最新 2019-12-14 14:01:53 +08:00
lyswhut
edbcaf0f90 优化“信口雌黄”皮肤配色 2019-12-14 13:54:22 +08:00
lyswhut
207427e993 新增“离开搜索界面时清空搜索列表”设置 2019-12-13 13:34:35 +08:00
lyswhut
e109dd876a 修正缓存描述 2019-12-13 13:09:44 +08:00
lyswhut
64ac69c48b 聚合搜索新增音源显示 2019-12-11 16:05:07 +08:00
lyswhut
652b06c116 更新依赖到最新 2019-12-06 20:55:12 +08:00
lyswhut
654035a469 update issue template 2019-12-04 10:45:31 +08:00
lyswhut
cd50e0086b update issue template 2019-12-03 13:03:09 +08:00
lyswhut
66a119e9dc 新增搜索框搜索建议键盘上下方向键选择功能 2019-12-02 20:46:27 +08:00
lyswhut
14ec7d48f6 更新接口文字描述 2019-12-01 14:29:26 +08:00
lyswhut
5ad5b211e9 发布0.12.1版本 2019-12-01 13:51:13 +08:00
lyswhut
aac4b6ccfe 将所有外部链接从默认浏览器打开 2019-12-01 13:45:48 +08:00
lyswhut
cfc6967fdc 优化链接点击效果 2019-12-01 13:42:16 +08:00
lyswhut
8a0b960985 更新依赖到最新 2019-12-01 12:38:54 +08:00
lyswhut
bd260c3dc5 移除多余的字 2019-12-01 12:34:48 +08:00
lyswhut
203dff8d98 修复酷我源排行榜、歌单详情列表里的歌曲音质匹配问题 2019-11-30 18:36:44 +08:00
lyswhut
ca56089a3e 取消对导出数据的格式化 2019-11-29 21:47:13 +08:00
lyswhut
a012d1b927 更新依赖到最新 2019-11-29 21:35:42 +08:00
lyswhut
0af322a3a8 优化tab布局 2019-11-29 21:33:11 +08:00
lyswhut
8d743803c8 优化滚动方法 2019-11-29 00:01:04 +08:00
lyswhut
63fed77c5b 更新安装失败、缺少dll帮助 2019-11-25 16:58:16 +08:00
lyswhut
f2077dca04 新增数据传输结束时文件下载完成情况的判断 2019-11-25 11:44:31 +08:00
lyswhut
cccfb6a08a 歌曲无封面时下载报错的问题 2019-11-25 11:41:51 +08:00
lyswhut
fa6dead83d 更新依赖到最新 2019-11-24 19:38:45 +08:00
lyswhut
605418d750 更新electron到7.1.2 2019-11-21 20:20:31 +08:00
lyswhut
8aa869b2e4 更新appImage包的分类 2019-11-20 13:19:26 +08:00
53 changed files with 3589 additions and 2340 deletions

View File

@@ -1,5 +1,5 @@
---
name: 功能请求
name: 功能请求(请先查看常见问题及搜索issue列表中有无你要提的问题)
about: 为这个项目提出一个想法
title: 例如添加xxx功能、优化xxx功能
labels: ''

View File

@@ -1,5 +1,5 @@
---
name: 报告Bug
name: 报告Bug(请先查看常见问题及搜索issue列表中有无你要提的问题)
about: 创建报告以帮助我们改进
title: 例如:音乐无法播放
labels: ''

View File

@@ -6,6 +6,96 @@ 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/).
## [0.14.1](https://github.com/lyswhut/lx-music-desktop/compare/v0.14.0...v0.14.1) - 2020-01-22
洛雪提前祝大家新年快乐、身体健康、阖家幸福!
### 修复
- 修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题
## [0.14.0](https://github.com/lyswhut/lx-music-desktop/compare/v0.13.1...v0.14.0) - 2020-01-22
洛雪提前祝大家新年快乐、身体健康、阖家幸福!
### 新增
- 新增各大平台歌单热门标签显示(显示在歌单界面的第一个下拉标签菜单中)
- 恢复QQ音乐源128k音质试听
- 新增不强制win7开启透明效果即可使用但要配置运行参数`-nt`,例如:`.\lx-music-desktop.exe -nt`,添加方法可自行百度“给快捷方式加参数”
- 新增“新年快乐”主题,可自行切换体验
### 优化
- 减淡各个主题的歌曲列表分隔线颜色
- 在线音乐列表音质标签优化,当歌曲有无损音质时隐藏高品质标签
- 更新改进的歌词播放插件,现在歌词的播放显示将更准确
### 修复
- 修复咪咕源无法搜索的问题
- 修复更新弹窗底部文字颜色没有适配当前主题颜色的问题
- 修复导入设置窗口大小、代理设置不立即生效的问题
- 修复在线音乐列表获取失败时无限循环请求的问题
### 其他
- 将软件设置与播放列表分离存储成两个文件
- 更新 Electron 到 7.1.9
## [0.13.1](https://github.com/lyswhut/lx-music-desktop/compare/v0.13.0...v0.13.1) - 2019-12-16
### 修复
- 修复全局更新弹窗无法遮盖搜索框的问题
### 其他
- 由于electron 7.1.3 - 7.1.5 的自动更新功能存在Bug现降级到7.1.2
## [0.13.0](https://github.com/lyswhut/lx-music-desktop/compare/v0.12.1...v0.13.0) - 2019-12-15
### 新增
- 新增搜索框搜索建议键盘上下方向键选择功能
- 聚合搜索新增音源显示
- 新增“离开搜索界面时清空搜索列表”设置选项,默认关闭,可到设置-强迫症设置开启
### 优化
- 优化“信口雌黄”皮肤配色
### 修复
- 修复存在弹出层时,搜索建议列表被弹出层覆盖的问题
- 修复搜索、排行榜、歌单列表多选框从不定状态到选中的Bug
### 移除
- 因Q音接口失效移除Q音源的试听与下载
### 其他
- 更新electron到7.1.5
- 更新vue到2.6.11
## [0.12.1](https://github.com/lyswhut/lx-music-desktop/compare/v0.12.0...v0.12.1) - 2019-12-01
### 优化
- 优化定位歌曲时的列表滚动机制
- 优化链接点击效果
### 修复
- 修复使用酷我源下载歌曲时,当歌曲无封面时下载报错的问题
- 修复酷我源排行榜、歌单详情列表里的歌曲音质匹配问题(原来无论歌曲有无高品、无损都会显示有)
- 禁止外部链接在软件内打开,将所有外部链接从默认浏览器打开
### 其他
- 更新electron到7.1.2
## [0.12.0](https://github.com/lyswhut/lx-music-desktop/compare/v0.11.0...v0.12.0) - 2019-11-17
由于新下载库仍然没有完成但下载功能已经可用so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!

33
FAQ.md
View File

@@ -48,14 +48,23 @@
## Windows 7 下界面异常
当 win7 没有开启**透明效果**时界面将会显示异常,开启方法请自行百度。<br>
由于软件默认使用了透明窗口根据Electron官方文档的[说明](https://electronjs.org/docs/api/frameless-window#%E5%B1%80%E9%99%90%E6%80%A7)
> 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。
因此,当 win7 没有开启**透明效果**时界面将会显示异常,开启方法请自行百度(开启后可看到任务栏变透明)。<br>
`0.14.0`版本起不再强制要求开启透明效果,若你实在不想开启(若非电脑配置太低,墙裂建议开启!),可通过添加运行参数`-nt`来运行程序即可,例如:`.\lx-music-desktop.exe -nt`,添加方法可自行百度“给快捷方式加参数”,该参数的作用是用来控制程序是否使用非透明窗口运行。
对于一些完全无法正常显示界面的情况,请阅读下面的 **软件启动后,界面无法显示**
## 软件启动后,界面无法显示
软件启动后,可以在任务栏看到软件,但软件界面在桌面上无任何显示这一般是显卡驱动异常导致的由于软件默认使用GUP渲染界面当驱动异常时可能出现该情况可以用驱动管理软件检测下驱动尝试更新显卡驱动试试。
软件启动后,可以在任务栏看到软件,但软件界面在桌面上无任何显示<br>
解决办法:下载`.NET Framework 4.7.1`或更高版本安装即可。<br>
原始问题看:<https://github.com/electron/electron/issues/19569#issuecomment-522231083>
## 安装版安装失败,提示应用未安装
若还是不行可尝试更新显卡驱动。
## 安装版安装失败,提示安装程序并未成功地运行完成
对于部分电脑出现安装失败的问题,可以做出以下尝试:
@@ -66,12 +75,22 @@
## 缺少`xxx.dll`
这个是电脑缺少某些dll导致的正常的系统是没有这个问题的解决办法需自行百度弹出的错误信息看下别人是怎么解决的。
这个是电脑缺少某些dll导致的正常的系统是没有这个问题的可以尝试如下几个解决办法:
- 以管理员权限打开`cmd`,输入`sfc /scannow`回车等待检查完成重启电脑
- 若上面的方法**修复、重启**电脑后仍然不行,就自行百度弹出的**错误信息**看下别人是怎么解决的
## 杀毒软件提示有病毒或恶意行为
本人只能保证我写的代码不包含任何**恶意代码**、**集用户信息**的行为并且软件代码已开源请自行查阅软件安装包也是由CI拉取源代码构建构建日志[windows包](https://ci.appveyor.com/project/lyswhut/lx-music-desktop)、[Mac/Linux包](https://travis-ci.org/lyswhut/lx-music-desktop)<br>
尽管如此但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时,软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。<br>
当然,以上说明建立的前提是在你所用的安装包是从**官方渠道**下载的,或者有相关能力者还可以下载源代码自己构建安装包。
本人只能保证我写的代码不包含任何**恶意代码**、**集用户信息**的行为并且软件代码已开源请自行查阅软件安装包也是由CI拉取源代码构建构建日志[windows包](https://ci.appveyor.com/project/lyswhut/lx-music-desktop)、[Mac/Linux包](https://travis-ci.org/lyswhut/lx-music-desktop)<br>
尽管如此但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时(供应链攻击),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。<br>
当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。
最后,若出现杀毒软件报毒,请自行判断选择是否继续使用本软件!
## 软件无法联网
软件的排行榜、歌单、搜索列表**都**无法加载:
- 检查是否在设置界面开启了代理(当代理乱设置时软件将无法联网)
- 检查软件是否被第三方软件/防火墙阻止联网

4764
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
"version": "0.12.0",
"version": "0.14.1",
"description": "一个免费的音乐下载助手",
"main": "./dist/electron/main.js",
"productName": "lx-music-desktop",
@@ -49,7 +49,7 @@
"lint:fix": "eslint --ext .js,.vue -f ./node_modules/eslint-formatter-friendly --fix src"
},
"browserslist": [
"Chrome >= 76"
"Electron 7.1.9"
],
"engines": {
"node": ">= 12"
@@ -110,7 +110,7 @@
},
"appImage": {
"license": "./licenses/license_zh.txt",
"category": "Audio"
"category": "Utility;AudioVideo;Audio;Player;Music;"
},
"publish": [
{
@@ -139,80 +139,80 @@
},
"homepage": "https://github.com/lyswhut/lx-music-desktop#readme",
"devDependencies": {
"@babel/core": "^7.7.2",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/polyfill": "^7.7.0",
"@babel/preset-env": "^7.7.1",
"autoprefixer": "^9.7.1",
"@babel/core": "^7.8.3",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/polyfill": "^7.8.3",
"@babel/preset-env": "^7.8.3",
"autoprefixer": "^9.7.4",
"babel-eslint": "^10.0.3",
"babel-loader": "^8.0.6",
"babel-minify-webpack-plugin": "^0.3.1",
"babel-preset-minify": "^0.5.1",
"cfonts": "^2.4.5",
"browserslist": "^4.8.5",
"cfonts": "^2.4.8",
"chalk": "^3.0.0",
"changelog-parser": "^2.8.0",
"copy-webpack-plugin": "^5.0.5",
"core-js": "^3.4.1",
"copy-webpack-plugin": "^5.1.1",
"core-js": "^3.6.4",
"cos-nodejs-sdk-v5": "^2.5.14",
"cross-env": "^6.0.3",
"css-loader": "^3.2.0",
"css-loader": "^3.4.2",
"del": "^5.1.0",
"electron": "^7.1.1",
"electron-builder": "^22.1.0",
"electron": "^7.1.9",
"electron-builder": "^22.2.0",
"electron-debug": "^3.0.1",
"electron-devtools-installer": "^2.2.4",
"eslint": "^6.6.0",
"eslint": "^6.8.0",
"eslint-config-standard": "^14.1.0",
"eslint-formatter-friendly": "^7.0.0",
"eslint-loader": "^3.0.2",
"eslint-loader": "^3.0.3",
"eslint-plugin-html": "^6.0.0",
"eslint-plugin-import": "^2.18.2",
"eslint-plugin-node": "^10.0.0",
"eslint-plugin-import": "^2.20.0",
"eslint-plugin-node": "^11.0.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.1",
"file-loader": "^4.2.0",
"file-loader": "^5.0.2",
"friendly-errors-webpack-plugin": "^1.7.0",
"html-webpack-plugin": "^3.2.0",
"less": "^3.10.3",
"less-loader": "^5.0.0",
"markdown-it": "^10.0.0",
"mini-css-extract-plugin": "^0.8.0",
"mini-css-extract-plugin": "^0.9.0",
"multispinner": "^0.2.1",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"postcss-loader": "^3.0.0",
"pug": "^2.0.4",
"pug-loader": "^2.4.0",
"pug-plain-loader": "^1.0.0",
"raw-loader": "^3.1.0",
"raw-loader": "^4.0.0",
"rimraf": "^3.0.0",
"stylus": "^0.54.7",
"stylus-loader": "^3.0.2",
"terser-webpack-plugin": "^2.2.1",
"url-loader": "^2.2.0",
"vue-loader": "^15.7.2",
"terser-webpack-plugin": "^2.3.2",
"url-loader": "^3.0.0",
"vue-loader": "^15.8.3",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.6.10",
"webpack": "^4.41.2",
"vue-template-compiler": "^2.6.11",
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.9.0",
"webpack-dev-server": "^3.10.1",
"webpack-hot-middleware": "^2.25.0",
"webpack-merge": "^4.2.2"
},
"dependencies": {
"axios": "^0.19.0",
"crypto-js": "^3.1.9-1",
"dnscache": "^1.0.2",
"electron-log": "^3.0.9",
"electron-log": "^4.0.3",
"electron-store": "^5.1.0",
"electron-updater": "^4.2.0",
"flac-metadata": "^0.1.1",
"js-htmlencode": "^0.3.0",
"lrc-file-parser": "^0.1.14",
"node-id3": "^0.1.12",
"lrc-file-parser": "^1.0.0",
"node-id3": "^0.1.13",
"request": "^2.88.0",
"vue": "^2.6.10",
"vue": "^2.6.11",
"vue-electron": "^1.0.6",
"vue-router": "^3.1.3",
"vue-router": "^3.1.5",
"vuex": "^3.1.2",
"vuex-electron": "^1.0.3",
"vuex-router-sync": "^5.0.0"

View File

@@ -1,17 +1,5 @@
由于新下载库仍然没有完成但下载功能已经可用so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈
### 新增
- 新增下载功能对代理设置的支持,现在若在软件设置了代理服务器,下载功能也将会走代理网络了
### 优化
- 新下载模块将对恢复下载的任务进行字节校验用于解决下载进度超过100%后仍然下载的问题
- 注意:目前仍然无法暂停处于**链接获取**状态中的任务
洛雪提前祝大家新年快乐、身体健康、阖家幸福
### 修复
- 修复Linux deb版本`.desktop`桌面文件缺少图标的问题,新增中文名称显示、软件分类,感谢@lowy的反馈
- 修复下载列表歌曲状态分类列表操作Bug
- 修复歌曲封面下载失败时仍然执行嵌入封面操作导致报错的问题
- 跳过重复添加**相同歌曲名与扩展名的歌曲**例如你之前下载了A歌曲的128k音质现在想要下载它的320k音质但由于两者都是MP3格式会因为重名导致之前的128k音质被覆盖但列表中仍然显示两种音质的问题但实际上都是指向后面的320k音质
- 修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题

View File

@@ -1,7 +1,27 @@
{
"version": "0.12.0",
"desc": "<p>由于新下载库仍然没有完成但下载功能已经可用so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!</p>\n<h3>新增</h3>\n<ul>\n<li>新增下载功能对代理设置的支持,现在若在软件设置了代理服务器,下载功能也将会走代理网络了</li>\n</ul>\n<h3>优化</h3>\n<ul>\n<li>新下载模块将对恢复下载的任务进行字节校验用于解决下载进度超过100%后仍然下载的问题</li>\n<li>注意:目前仍然无法暂停处于<strong>链接获取</strong>状态中的任务</li>\n</ul>\n<h3>修复</h3>\n<ul>\n<li>修复Linux deb版本<code>.desktop</code>桌面文件缺少图标的问题,新增中文名称显示、软件分类,感谢@lowy的反馈</li>\n<li>修复下载列表歌曲状态分类列表操作Bug</li>\n<li>修复歌曲封面下载失败时仍然执行嵌入封面操作导致报错的问题</li>\n<li>跳过重复添加<strong>相同歌曲名与扩展名的歌曲</strong>例如你之前下载了A歌曲的128k音质现在想要下载它的320k音质但由于两者都是MP3格式会因为重名导致之前的128k音质被覆盖但列表中仍然显示两种音质的问题但实际上都是指向后面的320k音质</li>\n</ul>\n",
"version": "0.14.1",
"desc": "<p>洛雪提前祝大家新年快乐、身体健康、阖家幸福!</p>\n<h3>修复</h3>\n<ul>\n<li>修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题</li>\n</ul>\n",
"history": [
{
"version": "0.14.0",
"desc": "<p>洛雪提前祝大家新年快乐、身体健康、阖家幸福!</p>\n<h3>新增</h3>\n<ul>\n<li>新增各大平台歌单热门标签显示(显示在歌单界面的第一个下拉标签菜单中)</li>\n<li>恢复QQ音乐源128k音质试听</li>\n<li>新增不强制win7开启透明效果即可使用但要配置运行参数<code>-nt</code>,例如:<code>.\\lx-music-desktop.exe -nt</code>,添加方法可自行百度“给快捷方式加参数”</li>\n<li>新增“新年快乐”主题,可自行切换体验</li>\n</ul>\n<h3>优化</h3>\n<ul>\n<li>减淡各个主题的歌曲列表分隔线颜色</li>\n<li>在线音乐列表音质标签优化,当歌曲有无损音质时隐藏高品质标签</li>\n<li>更新改进的歌词播放插件,现在歌词的播放显示将更准确</li>\n</ul>\n<h3>修复</h3>\n<ul>\n<li>修复咪咕源无法搜索的问题</li>\n<li>修复更新弹窗底部文字颜色没有适配当前主题颜色的问题</li>\n<li>修复导入设置窗口大小、代理设置不立即生效的问题</li>\n<li>修复在线音乐列表获取失败时无限循环请求的问题</li>\n</ul>\n<h3>其他</h3>\n<ul>\n<li>将软件设置与播放列表分离存储成两个文件</li>\n<li>更新 Electron 到 7.1.9</li>\n</ul>\n"
},
{
"version": "0.13.1",
"desc": "<h3>修复</h3>\n<ul>\n<li>修复全局更新弹窗无法遮盖搜索框的问题</li>\n</ul>\n<h3>其他</h3>\n<ul>\n<li>由于electron 7.1.3 - 7.1.5 的自动更新功能存在Bug现降级到7.1.2</li>\n</ul>\n"
},
{
"version": "0.13.0",
"desc": "<h3>新增</h3>\n<ul>\n<li>新增搜索框搜索建议键盘上下方向键选择功能</li>\n<li>聚合搜索新增音源显示</li>\n<li>新增“离开搜索界面时清空搜索列表”设置选项,默认关闭,可到设置-强迫症设置开启</li>\n</ul>\n<h3>优化</h3>\n<ul>\n<li>优化“信口雌黄”皮肤配色</li>\n</ul>\n<h3>修复</h3>\n<ul>\n<li>修复存在弹出层时,搜索建议列表被弹出层覆盖的问题</li>\n<li>修复搜索、排行榜、歌单列表多选框从不定状态到选中的Bug</li>\n</ul>\n<h3>移除</h3>\n<ul>\n<li>因Q音接口失效移除Q音源的试听与下载</li>\n</ul>\n<h3>其他</h3>\n<ul>\n<li>更新electron到7.1.5</li>\n<li>更新vue到2.6.11</li>\n</ul>\n"
},
{
"version": "0.12.1",
"desc": "<h3>优化</h3>\n<ul>\n<li>优化定位歌曲时的列表滚动机制</li>\n<li>优化链接点击效果</li>\n</ul>\n<h3>修复</h3>\n<ul>\n<li>修复使用酷我源下载歌曲时,当歌曲无封面时下载报错的问题</li>\n<li>修复酷我源排行榜、歌单详情列表里的歌曲音质匹配问题(原来无论歌曲有无高品、无损都会显示有)</li>\n<li>禁止外部链接在软件内打开,将所有外部链接从默认浏览器打开</li>\n</ul>\n<h3>其他</h3>\n<ul>\n<li>更新electron到7.1.2</li>\n</ul>\n"
},
{
"version": "0.12.0",
"desc": "<p>由于新下载库仍然没有完成但下载功能已经可用so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!</p>\n<h3>新增</h3>\n<ul>\n<li>新增下载功能对代理设置的支持,现在若在软件设置了代理服务器,下载功能也将会走代理网络了</li>\n</ul>\n<h3>优化</h3>\n<ul>\n<li>新下载模块将对恢复下载的任务进行字节校验用于解决下载进度超过100%后仍然下载的问题</li>\n<li>注意:目前仍然无法暂停处于<strong>链接获取</strong>状态中的任务</li>\n</ul>\n<h3>修复</h3>\n<ul>\n<li>修复Linux deb版本<code>.desktop</code>桌面文件缺少图标的问题,新增中文名称显示、软件分类,感谢@lowy的反馈</li>\n<li>修复下载列表歌曲状态分类列表操作Bug</li>\n<li>修复歌曲封面下载失败时仍然执行嵌入封面操作导致报错的问题</li>\n<li>跳过重复添加<strong>相同歌曲名与扩展名的歌曲</strong>例如你之前下载了A歌曲的128k音质现在想要下载它的320k音质但由于两者都是MP3格式会因为重名导致之前的128k音质被覆盖但列表中仍然显示两种音质的问题但实际上都是指向后面的320k音质</li>\n</ul>\n"
},
{
"version": "0.11.0",
"desc": "<h3>新增</h3>\n<ul>\n<li>新增歌曲缓冲定时器,尝试用于解决网络正常但是歌曲缓冲过久的问题</li>\n<li>新增下载管理的任务状态分类</li>\n<li>添加<strong>杀毒软件提示有病毒或恶意行为</strong>的说明,可到<strong>常见问题</strong>拉到最后查看(常见问题可在开源地址找到)</li>\n</ul>\n<h3>优化</h3>\n<ul>\n<li>优化更新弹窗机制及其内容描述,对于可以自动更新的版本,现在可以看到软件的下载进度了</li>\n</ul>\n"

12
src/common/error.js Normal file
View File

@@ -0,0 +1,12 @@
const { log } = require('./utils')
process.on('uncaughtException', function(err) {
console.error('An uncaught error occurred!')
console.error(err)
log.error(err)
})
process.on('unhandledRejection', (reason, p) => {
console.error('Unhandled Rejection at: Promise ', p)
console.error(' reason: ', reason)
log.error(reason)
})

View File

@@ -0,0 +1,6 @@
const { mainHandle } = require('../../common/ipc')
mainHandle('getEnvParams', async(event, options) => {
return global.envParams
})

View File

@@ -10,3 +10,4 @@ require('./showSaveDialog')
require('./clearCache')
require('./getCacheSize')
require('./setIgnoreMouseEvent')
require('./getEnvParams')

View File

@@ -15,10 +15,14 @@ app.on('second-instance', (event, argv, cwd) => {
}
})
const { getWindowSizeInfo, parseEnv } = require('./utils')
global.envParams = parseEnv()
require('../common/error')
require('./events')
const autoUpdate = require('./utils/autoUpdate')
const { isLinux, isMac } = require('../common/utils')
const { getWindowSizeInfo } = require('./utils')
const isDev = process.env.NODE_ENV !== 'production'
@@ -49,7 +53,7 @@ function createWindow() {
useContentSize: true,
width: windowSizeInfo.width,
frame: false,
transparent: !isLinux,
transparent: !isLinux && !global.envParams.nt,
enableRemoteModule: false,
// icon: path.join(global.__static, isWin ? 'icons/256x256.ico' : 'icons/512x512.png'),
resizable: false,

View File

@@ -6,3 +6,20 @@ exports.getWindowSizeInfo = () => {
const { windowSizeId = 1 } = electronStore.get('setting') || {}
return windowSizeList.find(i => i.id === windowSizeId) || windowSizeList[0]
}
exports.parseEnv = () => {
const params = {}
const rx = /^-\w+/
for (let param of process.argv) {
if (!rx.test(param)) continue
param = param.substring(1)
let index = param.indexOf('=')
if (index < 0) {
params[param] = true
} else {
params[param.substring(0, index)] = param.substring(index + 1)
}
}
return params
}

View File

@@ -6,6 +6,10 @@ const extReg = /^(\.(?:jpe?g|png)).*$/
module.exports = (filePath, meta) => {
if (!meta.APIC) return NodeID3.write(meta, filePath)
if (!/^http/.test(meta.APIC)) {
delete meta.APIC
return NodeID3.write(meta, filePath)
}
let picPath = filePath.replace(/\.mp3$/, '') + path.extname(meta.APIC).replace(extReg, '$1')
request(meta.APIC)
.on('response', respones => {
@@ -17,8 +21,12 @@ module.exports = (filePath, meta) => {
respones
.pipe(fs.createWriteStream(picPath))
.on('finish', () => {
meta.APIC = picPath
NodeID3.write(meta, filePath)
if (respones.complete) {
meta.APIC = picPath
NodeID3.write(meta, filePath)
} else {
delete meta.APIC
}
fs.unlink(picPath, err => {
if (err) console.log(err.message)
})

View File

@@ -1,5 +1,5 @@
<template lang="pug">
#container(v-if="isProd && !isLinux" :class="theme" @mouseenter="enableIgnoreMouseEvents" @mouseleave="dieableIgnoreMouseEvents")
#container(v-if="isProd && !isNt" :class="theme" @mouseenter="enableIgnoreMouseEvents" @mouseleave="dieableIgnoreMouseEvents")
core-aside#left
#right
core-toolbar#toolbar
@@ -20,10 +20,10 @@
<script>
import dnscache from 'dnscache'
import { mapMutations, mapGetters, mapActions } from 'vuex'
import { rendererOn, rendererSend } from '../common/ipc'
import { rendererOn, rendererSend, rendererInvoke } from '../common/ipc'
import { isLinux } from '../common/utils'
import music from './utils/music'
import { throttle } from './utils'
import { throttle, openUrl } from './utils'
window.ELECTRON_DISABLE_SECURITY_WARNINGS = process.env.ELECTRON_DISABLE_SECURITY_WARNINGS
dnscache({
enable: true,
@@ -35,16 +35,19 @@ export default {
data() {
return {
isProd: process.env.NODE_ENV === 'production',
isLinux,
isNt: false,
globalObj: {
apiSource: 'test',
proxy: {},
},
updateTimeout: null,
envParams: {
nt: false,
},
}
},
computed: {
...mapGetters(['electronStore', 'setting', 'theme', 'version']),
...mapGetters(['setting', 'theme', 'version']),
...mapGetters('list', ['defaultList', 'loveList']),
...mapGetters('download', {
downloadList: 'list',
@@ -53,20 +56,20 @@ export default {
},
created() {
this.saveSetting = throttle(n => {
this.electronStore.set('setting', n)
window.electronStore_config.set('setting', n)
})
this.saveDefaultList = throttle(n => {
this.electronStore.set('list.defaultList', n)
window.electronStore_list.set('defaultList', n)
}, 500)
this.saveLoveList = throttle(n => {
this.electronStore.set('list.loveList', n)
window.electronStore_list.set('loveList', n)
}, 500)
this.saveDownloadList = throttle(n => {
this.electronStore.set('download.list', n)
window.electronStore_list.set('downloadList', n)
}, 1000)
},
mounted() {
document.body.classList.add(this.isLinux ? 'noTransparent' : 'transparent')
document.body.classList.add(this.isNt ? 'noTransparent' : 'transparent')
this.init()
},
watch: {
@@ -109,10 +112,19 @@ export default {
...mapMutations('download', ['updateDownloadList']),
...mapMutations(['setSetting']),
init() {
if (this.isProd && !isLinux) {
document.body.addEventListener('mouseenter', this.dieableIgnoreMouseEvents)
document.body.addEventListener('mouseleave', this.enableIgnoreMouseEvents)
}
rendererInvoke('getEnvParams').then(envParams => {
this.envParams = envParams
this.isNt = isLinux || this.envParams.nt
if (this.isNt) {
document.body.classList.remove('transparent')
document.body.classList.add('noTransparent')
}
if (this.isProd && !this.isNt) {
document.body.addEventListener('mouseenter', this.dieableIgnoreMouseEvents)
document.body.addEventListener('mouseleave', this.enableIgnoreMouseEvents)
}
})
document.body.addEventListener('click', this.handleBodyClick, true)
rendererOn('update-available', (e, info) => {
// this.showUpdateModal(true)
// console.log(info)
@@ -172,12 +184,12 @@ export default {
music.init()
},
enableIgnoreMouseEvents() {
if (isLinux) return
if (!this.isNt) return
rendererSend('setIgnoreMouseEvents', false)
// console.log('content enable')
},
dieableIgnoreMouseEvents() {
if (isLinux) return
if (!this.isNt) return
// console.log('content disable')
rendererSend('setIgnoreMouseEvents', true)
},
@@ -187,12 +199,12 @@ export default {
this.initDownloadList() // 初始化下载列表
},
initPlayList() {
let defaultList = this.electronStore.get('list.defaultList')
let loveList = this.electronStore.get('list.loveList')
let defaultList = window.electronStore_list.get('defaultList')
let loveList = window.electronStore_list.get('loveList')
this.initList({ defaultList, loveList })
},
initDownloadList() {
let downloadList = this.electronStore.get('download.list')
let downloadList = window.electronStore_list.get('download.list')
if (downloadList) {
downloadList.forEach(item => {
if (item.status == this.downloadStatus.RUN || item.status == this.downloadStatus.WAITING) {
@@ -208,6 +220,7 @@ export default {
this.setNewVersion(body)
return body
})).catch(() => {
if (this.version.newVersion) return this.version.newVersion
this.setVersionModalVisible({ isUnknow: true })
let result = {
version: '0.0.0',
@@ -216,7 +229,7 @@ export default {
this.setNewVersion(result)
return result
}).then(result => {
if (result.version === this.version.version) return
if (result.version === this.version.version || result.version === this.setting.ignoreVersion) return
// console.log(this.version)
this.$nextTick(() => {
this.setVersionModalVisible({ isShow: true })
@@ -228,6 +241,12 @@ export default {
clearTimeout(this.updateTimeout)
this.updateTimeout = null
},
handleBodyClick(event) {
if (event.target.tagName != 'A') return
if (event.target.host == window.location.host) return
event.preventDefault()
if (/^https?:\/\//.test(event.target.href)) openUrl(event.target.href)
},
},
beforeDestroy() {
this.clearUpdateTimeout()
@@ -235,6 +254,7 @@ export default {
document.body.removeEventListener('mouseenter', this.dieableIgnoreMouseEvents)
document.body.removeEventListener('mouseleave', this.enableIgnoreMouseEvents)
}
document.body.removeEventListener('click', this.handleBodyClick)
},
}
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 KiB

View File

@@ -25,7 +25,7 @@ table {
border-spacing: 0;
border-collapse: collapse;
overflow: hidden;
color: rgba(0, 0, 0, 0.87);
color: rgba(0, 0, 0, 0.95);
th {
font-size: 12px;
text-align: left;
@@ -57,6 +57,10 @@ table {
}
}
a {
color: #000;
}
.badge {
display: inline-block;
padding: 0.25em 0.4em;
@@ -91,6 +95,14 @@ table {
color: #fff;
background-color: #32bc63;
}
&.badge-theme-success {
color: @color-badge-success-font;
background-color: @color-badge-success;
}
&.badge-theme-info {
color: @color-badge-info-font;
background-color: @color-badge-info;
}
}
small {
@@ -112,7 +124,13 @@ svg {
transition-property: fill;
}
.hover {
input, textarea {
&::placeholder {
color: @color-theme_2-font-label;
}
}
.hover, a {
cursor: pointer;
transition: color .2s ease;
&:hover {
@@ -150,7 +168,7 @@ svg {
each(@themes, {
#container.@{value} {
.hover {
.hover, a {
&:hover {
color: ~'@{color-@{value}-theme}';
}
@@ -182,5 +200,22 @@ each(@themes, {
}
}
}
input, textarea {
&::placeholder {
color: ~'@{color-@{value}-theme_2-font-label}';
}
}
.badge {
&.badge-theme-success {
color: ~'@{color-@{value}-badge-success-font}';
background-color: ~'@{color-@{value}-badge-success}';
}
&.badge-theme-info {
color: ~'@{color-@{value}-badge-info-font}';
background-color: ~'@{color-@{value}-badge-info}';
}
}
}
})

View File

@@ -1,13 +1,13 @@
@import './colors.less';
@themes: green, yellow, blue, red, purple, orange, grey, midAutumn, dhHyrz;
@themes: green, yellow, blue, red, purple, orange, grey, midAutumn, dhHyrz, happyNewYear;
// Colors
// @color-theme: #03a678;
@color-theme: #4daf7c;
@color-theme-bgimg: none;
@color-theme-bgposition: center center;
@color-theme-bgposition: center;
@color-theme-bgsize: auto auto;
@color-theme-hover: fadeout(lighten(@color-theme, 10%), 30%);
@color-theme-active: fadeout(darken(@color-theme, 20%), 60%);
@@ -20,7 +20,7 @@
@color-theme_2-hover: fadeout(lighten(@color-theme, 10%), 70%);
@color-theme_2-active: fadeout(darken(@color-theme, 5%), 70%);
@color-theme_2-font: darken(@color-theme_2, 70%);
@color-theme_2-font-label: fadeout(@color-theme_2-font, 50%);
@color-theme_2-font-label: fadeout(@color-theme_2-font, 40%);
@color-theme_2-line: lighten(@color-theme, 35%);
@color-theme-sidebar: @color-theme;
@color-btn: fadeout(darken(@color-theme, 5%), 15%);
@@ -51,15 +51,25 @@
@color-tab-btn-background-hover: @color-theme_2-hover;
@color-tab-border-top: fadeout(lighten(@color-theme, 5%), 50%);
@color-tab-border-bottom: lighten(@color-theme, 5%);
@color-minBtn: #85c43b;
@color-maxBtn: #e7aa36;
@color-closeBtn: #ea6e4d;
@color-minBtn-hover: fadeout(@color-minBtn, 10%);
@color-maxBtn-hover: fadeout(@color-maxBtn, 10%);
@color-closeBtn-hover: fadeout(@color-closeBtn, 10%);
@color-green-badge-success: #32bc63;
@color-green-badge-success-font: #fff;
@color-green-badge-info: #4baed5;
@color-green-badge-info-font: #fff;
@color-badge-success: #32bc63;
@color-badge-success-font: #fff;
@color-badge-info: #4baed5;
@color-badge-info-font: #fff;
@color-green-theme: #4daf7c;
@color-green-theme-bgimg: none;
@color-green-theme-bgposition: center center;
@color-green-theme-bgposition: center;
@color-green-theme-bgsize: auto auto;
@color-green-theme-hover: fadeout(lighten(@color-green-theme, 10%), 30%);
@color-green-theme-active: fadeout(darken(@color-green-theme, 20%), 60%);
@@ -71,8 +81,8 @@
@color-green-theme_2-hover: fadeout(lighten(@color-green-theme, 10%), 70%);
@color-green-theme_2-active: fadeout(darken(@color-green-theme, 5%), 70%);
@color-green-theme_2-font: darken(@color-green-theme_2, 70%);
@color-green-theme_2-font-label: fadeout(@color-green-theme_2-font, 50%);
@color-green-theme_2-line: lighten(@color-green-theme, 35%);
@color-green-theme_2-font-label: fadeout(@color-green-theme_2-font, 40%);
@color-green-theme_2-line: lighten(@color-green-theme, 45%);
@color-green-theme-sidebar: @color-green-theme;
@color-green-btn: fadeout(darken(@color-green-theme, 5%), 15%);
@color-green-btn-background: fadeout(lighten(@color-green-theme, 35%), 70%);
@@ -95,11 +105,21 @@
@color-green-tab-btn-background-hover: @color-green-theme_2-hover;
@color-green-tab-border-top: fadeout(lighten(@color-green-theme, 5%), 50%);
@color-green-tab-border-bottom: lighten(@color-green-theme, 5%);
@color-green-minBtn: #85c43b;
@color-green-maxBtn: #e7aa36;
@color-green-closeBtn: #ea6e4d;
@color-green-minBtn-hover: fadeout(@color-green-minBtn, 10%);
@color-green-maxBtn-hover: fadeout(@color-green-maxBtn, 10%);
@color-green-closeBtn-hover: fadeout(@color-green-closeBtn, 10%);
@color-green-badge-success: #32bc63;
@color-green-badge-success-font: #fff;
@color-green-badge-info: #4baed5;
@color-green-badge-info-font: #fff;
@color-yellow-theme: #f2d35b;
@color-yellow-theme: #e9d460;
@color-yellow-theme-bgimg: none;
@color-yellow-theme-bgposition: center center;
@color-yellow-theme-bgposition: center;
@color-yellow-theme-bgsize: auto auto;
@color-yellow-theme-hover: fadeout(lighten(@color-yellow-theme, 10%), 30%);
@color-yellow-theme-active: fadeout(darken(@color-yellow-theme, 20%), 60%);
@@ -108,37 +128,47 @@
@color-yellow-theme_2: #fff;
@color-yellow-theme_2-background_1: #fff;
@color-yellow-theme_2-background_2: fadeout(@color-yellow-theme_2-background_1, 2%);
@color-yellow-theme_2-hover: fadeout(lighten(@color-yellow-theme, 10%), 70%);
@color-yellow-theme_2-active: fadeout(darken(@color-yellow-theme, 5%), 70%);
@color-yellow-theme_2-hover: fadeout(lighten(@color-yellow-theme, 10%), 60%);
@color-yellow-theme_2-active: fadeout(darken(@color-yellow-theme, 5%), 60%);
@color-yellow-theme_2-font: darken(@color-yellow-theme_2, 70%);
@color-yellow-theme_2-font-label: fadeout(@color-yellow-theme_2-font, 50%);
@color-yellow-theme_2-line: lighten(@color-yellow-theme, 35%);
@color-yellow-theme_2-font-label: fadeout(@color-yellow-theme_2-font, 40%);
@color-yellow-theme_2-line: lighten(@color-yellow-theme, 28%);
@color-yellow-theme-sidebar: @color-yellow-theme;
@color-yellow-btn: fadeout(darken(@color-yellow-theme, 5%), 15%);
@color-yellow-btn-background: fadeout(lighten(@color-yellow-theme, 25%), 70%);
@color-yellow-btn: fadeout(darken(@color-yellow-theme, 5%), 5%);
@color-yellow-btn-background: fadeout(lighten(@color-yellow-theme, 25%), 60%);
@color-yellow-pagination-background: fadeout(lighten(@color-yellow-theme, 30%), 30%);
@color-yellow-pagination-hover: fadeout(lighten(@color-yellow-theme, 5%), 70%);
@color-yellow-pagination-active: fadeout(darken(@color-yellow-theme, 5%), 70%);
@color-yellow-pagination-select: fadeout(lighten(@color-yellow-theme, 5%), 50%);
@color-yellow-search-form-background: fadeout(lighten(@color-yellow-theme, 35%), 10%);
@color-yellow-search-list-hover: fadeout(darken(@color-yellow-theme, 10%), 70%);
@color-yellow-scrollbar-track: fadeout(@color-yellow-theme, 80%);
@color-yellow-scrollbar-thumb: fadeout(@color-yellow-theme, 60%);
@color-yellow-scrollbar-thumb-hover: fadeout(@color-yellow-theme, 40%);
@color-yellow-search-form-background: fadeout(lighten(@color-yellow-theme, 25%), 10%);
@color-yellow-search-list-hover: fadeout(darken(@color-yellow-theme, 10%), 60%);
@color-yellow-scrollbar-track: fadeout(@color-yellow-theme, 60%);
@color-yellow-scrollbar-thumb: fadeout(@color-yellow-theme, 45%);
@color-yellow-scrollbar-thumb-hover: fadeout(@color-yellow-theme, 30%);
@color-yellow-player-pic-c1: fadeout(@color-yellow-theme_2, 50%);
@color-yellow-player-pic-c2: darken(@color-yellow-theme_2, 30%);
@color-yellow-player-progress: darken(@color-yellow-theme_2, 6%);
@color-yellow-player-progress-bar1: darken(@color-yellow-theme_2, 12%);
@color-yellow-player-progress-bar2: lighten(@color-yellow-theme, 12%);
@color-yellow-player-progress-bar2: lighten(@color-yellow-theme, 2%);
@color-yellow-player-status-text: lighten(@color-yellow-theme_2-font, 10%);
@color-yellow-tab-btn-background: fadeout(lighten(@color-yellow-theme, 10%), 80%);
@color-yellow-tab-btn-background: fadeout(lighten(@color-yellow-theme, 10%), 70%);
@color-yellow-tab-btn-background-hover: @color-yellow-theme_2-hover;
@color-yellow-tab-border-top: fadeout(lighten(@color-yellow-theme, 5%), 50%);
@color-yellow-tab-border-bottom: lighten(@color-yellow-theme, 5%);
@color-yellow-tab-border-top: fadeout(lighten(@color-yellow-theme, 5%), 40%);
@color-yellow-tab-border-bottom: @color-yellow-theme;
@color-yellow-minBtn: #85c43b;
@color-yellow-maxBtn: #e7aa36;
@color-yellow-closeBtn: #ea6e4d;
@color-yellow-minBtn-hover: fadeout(@color-yellow-minBtn, 10%);
@color-yellow-maxBtn-hover: fadeout(@color-yellow-maxBtn, 10%);
@color-yellow-closeBtn-hover: fadeout(@color-yellow-closeBtn, 10%);
@color-yellow-badge-success: #32bc63;
@color-yellow-badge-success-font: #fff;
@color-yellow-badge-info: #4baed5;
@color-yellow-badge-info-font: #fff;
@color-orange-theme: #f5ab35;
@color-orange-theme-bgimg: none;
@color-orange-theme-bgposition: center center;
@color-orange-theme-bgposition: center;
@color-orange-theme-bgsize: auto auto;
@color-orange-theme-hover: fadeout(lighten(@color-orange-theme, 10%), 30%);
@color-orange-theme-active: fadeout(darken(@color-orange-theme, 20%), 60%);
@@ -150,8 +180,8 @@
@color-orange-theme_2-hover: fadeout(lighten(@color-orange-theme, 10%), 70%);
@color-orange-theme_2-active: fadeout(darken(@color-orange-theme, 5%), 70%);
@color-orange-theme_2-font: darken(@color-orange-theme_2, 70%);
@color-orange-theme_2-font-label: fadeout(@color-orange-theme_2-font, 50%);
@color-orange-theme_2-line: lighten(@color-orange-theme, 35%);
@color-orange-theme_2-font-label: fadeout(@color-orange-theme_2-font, 40%);
@color-orange-theme_2-line: lighten(@color-orange-theme, 36%);
@color-orange-theme-sidebar: @color-orange-theme;
@color-orange-btn: fadeout(darken(@color-orange-theme, 5%), 15%);
@color-orange-btn-background: fadeout(lighten(@color-orange-theme, 35%), 70%);
@@ -174,10 +204,20 @@
@color-orange-tab-btn-background-hover: @color-orange-theme_2-hover;
@color-orange-tab-border-top: fadeout(lighten(@color-orange-theme, 5%), 50%);
@color-orange-tab-border-bottom: lighten(@color-orange-theme, 5%);
@color-orange-minBtn: #85c43b;
@color-orange-maxBtn: #e7aa36;
@color-orange-closeBtn: #ea6e4d;
@color-orange-minBtn-hover: fadeout(@color-orange-minBtn, 10%);
@color-orange-maxBtn-hover: fadeout(@color-orange-maxBtn, 10%);
@color-orange-closeBtn-hover: fadeout(@color-orange-closeBtn, 10%);
@color-orange-badge-success: #32bc63;
@color-orange-badge-success-font: #fff;
@color-orange-badge-info: #4baed5;
@color-orange-badge-info-font: #fff;
@color-blue-theme: #3498db;
@color-blue-theme-bgimg: none;
@color-blue-theme-bgposition: center center;
@color-blue-theme-bgposition: center;
@color-blue-theme-bgsize: auto auto;
@color-blue-theme-hover: fadeout(lighten(@color-blue-theme, 10%), 30%);
@color-blue-theme-active: fadeout(darken(@color-blue-theme, 20%), 60%);
@@ -189,8 +229,8 @@
@color-blue-theme_2-hover: fadeout(lighten(@color-blue-theme, 10%), 70%);
@color-blue-theme_2-active: fadeout(darken(@color-blue-theme, 5%), 70%);
@color-blue-theme_2-font: darken(@color-blue-theme_2, 70%);
@color-blue-theme_2-font-label: fadeout(@color-blue-theme_2-font, 50%);
@color-blue-theme_2-line: lighten(@color-blue-theme, 35%);
@color-blue-theme_2-font-label: fadeout(@color-blue-theme_2-font, 40%);
@color-blue-theme_2-line: lighten(@color-blue-theme, 42%);
@color-blue-theme-sidebar: @color-blue-theme;
@color-blue-btn: fadeout(darken(@color-blue-theme, 5%), 15%);
@color-blue-btn-background: fadeout(lighten(@color-blue-theme, 35%), 70%);
@@ -213,10 +253,20 @@
@color-blue-tab-btn-background-hover: @color-blue-theme_2-hover;
@color-blue-tab-border-top: fadeout(lighten(@color-blue-theme, 5%), 50%);
@color-blue-tab-border-bottom: lighten(@color-blue-theme, 5%);
@color-blue-minBtn: #85c43b;
@color-blue-maxBtn: #e7aa36;
@color-blue-closeBtn: #ea6e4d;
@color-blue-minBtn-hover: fadeout(@color-blue-minBtn, 10%);
@color-blue-maxBtn-hover: fadeout(@color-blue-maxBtn, 10%);
@color-blue-closeBtn-hover: fadeout(@color-blue-closeBtn, 10%);
@color-blue-badge-success: #32bc63;
@color-blue-badge-success-font: #fff;
@color-blue-badge-info: #4baed5;
@color-blue-badge-info-font: #fff;
@color-red-theme: #d64541;
@color-red-theme-bgimg: none;
@color-red-theme-bgposition: center center;
@color-red-theme-bgposition: center;
@color-red-theme-bgsize: auto auto;
@color-red-theme-hover: fadeout(lighten(@color-red-theme, 10%), 30%);
@color-red-theme-active: fadeout(darken(@color-red-theme, 20%), 60%);
@@ -228,8 +278,8 @@
@color-red-theme_2-background_1: #fff;
@color-red-theme_2-background_2: fadeout(@color-red-theme_2-background_1, 2%);
@color-red-theme_2-font: darken(@color-red-theme_2, 70%);
@color-red-theme_2-font-label: fadeout(@color-red-theme_2-font, 50%);
@color-red-theme_2-line: lighten(@color-red-theme, 35%);
@color-red-theme_2-font-label: fadeout(@color-red-theme_2-font, 40%);
@color-red-theme_2-line: lighten(@color-red-theme, 42%);
@color-red-theme-sidebar: @color-red-theme;
@color-red-btn: fadeout(darken(@color-red-theme, 5%), 15%);
@color-red-btn-background: fadeout(lighten(@color-red-theme, 35%), 70%);
@@ -254,10 +304,20 @@
@color-red-tab-btn-background-hover: @color-red-theme_2-hover;
@color-red-tab-border-top: fadeout(lighten(@color-red-theme, 5%), 50%);
@color-red-tab-border-bottom: lighten(@color-red-theme, 5%);
@color-red-minBtn: #85c43b;
@color-red-maxBtn: #e7aa36;
@color-red-closeBtn: #ea6e4d;
@color-red-minBtn-hover: fadeout(@color-red-minBtn, 10%);
@color-red-maxBtn-hover: fadeout(@color-red-maxBtn, 10%);
@color-red-closeBtn-hover: fadeout(@color-red-closeBtn, 10%);
@color-red-badge-success: #32bc63;
@color-red-badge-success-font: #fff;
@color-red-badge-info: #4baed5;
@color-red-badge-info-font: #fff;
@color-purple-theme: #9b59b6;
@color-purple-theme-bgimg: none;
@color-purple-theme-bgposition: center center;
@color-purple-theme-bgposition: center;
@color-purple-theme-bgsize: auto auto;
@color-purple-theme-hover: fadeout(lighten(@color-purple-theme, 10%), 30%);
@color-purple-theme-active: fadeout(darken(@color-purple-theme, 20%), 60%);
@@ -269,8 +329,8 @@
@color-purple-theme_2-hover: fadeout(lighten(@color-purple-theme, 10%), 70%);
@color-purple-theme_2-active: fadeout(darken(@color-purple-theme, 5%), 70%);
@color-purple-theme_2-font: darken(@color-purple-theme_2, 70%);
@color-purple-theme_2-font-label: fadeout(@color-purple-theme_2-font, 50%);
@color-purple-theme_2-line: lighten(@color-purple-theme, 35%);
@color-purple-theme_2-font-label: fadeout(@color-purple-theme_2-font, 40%);
@color-purple-theme_2-line: lighten(@color-purple-theme, 43%);
@color-purple-theme-sidebar: @color-purple-theme;
@color-purple-btn: fadeout(darken(@color-purple-theme, 5%), 15%);
@color-purple-btn-background: fadeout(lighten(@color-purple-theme, 35%), 70%);
@@ -293,10 +353,20 @@
@color-purple-tab-btn-background-hover: @color-purple-theme_2-hover;
@color-purple-tab-border-top: fadeout(lighten(@color-purple-theme, 5%), 50%);
@color-purple-tab-border-bottom: lighten(@color-purple-theme, 5%);
@color-purple-minBtn: #85c43b;
@color-purple-maxBtn: #e7aa36;
@color-purple-closeBtn: #ea6e4d;
@color-purple-minBtn-hover: fadeout(@color-purple-minBtn, 10%);
@color-purple-maxBtn-hover: fadeout(@color-purple-maxBtn, 10%);
@color-purple-closeBtn-hover: fadeout(@color-purple-closeBtn, 10%);
@color-purple-badge-success: #32bc63;
@color-purple-badge-success-font: #fff;
@color-purple-badge-info: #4baed5;
@color-purple-badge-info-font: #fff;
@color-grey-theme: #6c7a89;
@color-grey-theme-bgimg: none;
@color-grey-theme-bgposition: center center;
@color-grey-theme-bgposition: center;
@color-grey-theme-bgsize: auto auto;
@color-grey-theme-hover: fadeout(lighten(@color-grey-theme, 10%), 30%);
@color-grey-theme-active: fadeout(darken(@color-grey-theme, 20%), 60%);
@@ -308,8 +378,8 @@
@color-grey-theme_2-hover: fadeout(lighten(@color-grey-theme, 10%), 70%);
@color-grey-theme_2-active: fadeout(darken(@color-grey-theme, 5%), 70%);
@color-grey-theme_2-font: darken(@color-grey-theme_2, 70%);
@color-grey-theme_2-font-label: fadeout(@color-grey-theme_2-font, 50%);
@color-grey-theme_2-line: lighten(@color-grey-theme, 35%);
@color-grey-theme_2-font-label: fadeout(@color-grey-theme_2-font, 40%);
@color-grey-theme_2-line: lighten(@color-grey-theme, 47%);
@color-grey-theme-sidebar: @color-grey-theme;
@color-grey-btn: fadeout(darken(@color-grey-theme, 5%), 15%);
@color-grey-btn-background: fadeout(lighten(@color-grey-theme, 35%), 70%);
@@ -332,10 +402,20 @@
@color-grey-tab-btn-background-hover: @color-grey-theme_2-hover;
@color-grey-tab-border-top: fadeout(lighten(@color-grey-theme, 5%), 50%);
@color-grey-tab-border-bottom: lighten(@color-grey-theme, 5%);
@color-grey-minBtn: #85c43b;
@color-grey-maxBtn: #e7aa36;
@color-grey-closeBtn: #ea6e4d;
@color-grey-minBtn-hover: fadeout(@color-grey-minBtn, 10%);
@color-grey-maxBtn-hover: fadeout(@color-grey-maxBtn, 10%);
@color-grey-closeBtn-hover: fadeout(@color-grey-closeBtn, 10%);
@color-grey-badge-success: #32bc63;
@color-grey-badge-success-font: #fff;
@color-grey-badge-info: #4baed5;
@color-grey-badge-info-font: #fff;
@color-midAutumn-theme: rgba(74, 55, 82, 1);
@color-midAutumn-theme-bgimg: url(../images/jqbg.jpg);
@color-midAutumn-theme-bgposition: center center;
@color-midAutumn-theme-bgposition: center;
@color-midAutumn-theme-bgsize: auto 100%;
@color-midAutumn-theme-hover: fadeout(lighten(@color-midAutumn-theme, 10%), 30%);
@color-midAutumn-theme-active: fadeout(lighten(@color-midAutumn-theme, 15%), 60%);
@@ -347,10 +427,10 @@
@color-midAutumn-theme_2-hover: fadeout(lighten(@color-midAutumn-theme, 10%), 65%);
@color-midAutumn-theme_2-active: fadeout(darken(@color-midAutumn-theme, 5%), 70%);
@color-midAutumn-theme_2-font: darken(@color-midAutumn-theme_2, 70%);
@color-midAutumn-theme_2-font-label: lighten(@color-midAutumn-theme, 40%);
@color-midAutumn-theme_2-line: lighten(@color-midAutumn-theme, 54%);
@color-midAutumn-theme_2-font-label: desaturate(lighten(@color-midAutumn-theme, 30%), 45%);
@color-midAutumn-theme_2-line: lighten(@color-midAutumn-theme, 63%);
@color-midAutumn-theme-sidebar: rgba(255, 255, 255, 0);
@color-midAutumn-btn: fadeout(darken(@color-midAutumn-theme, 5%), 15%);
@color-midAutumn-btn: fadeout(darken(@color-midAutumn-theme, 5%), 27%);
@color-midAutumn-btn-background: fadeout(lighten(@color-midAutumn-theme, 35%), 70%);
@color-midAutumn-pagination-background: fadeout(lighten(@color-midAutumn-theme, 45%), 50%);
@color-midAutumn-pagination-hover: fadeout(lighten(@color-midAutumn-theme, 10%), 70%);
@@ -363,7 +443,7 @@
@color-midAutumn-scrollbar-thumb-hover: fadeout(@color-midAutumn-theme, 40%);
@color-midAutumn-player-pic-c1: fadeout(@color-midAutumn-theme_2, 50%);
@color-midAutumn-player-pic-c2: darken(@color-midAutumn-theme_2, 30%);
@color-midAutumn-player-progress: darken(@color-midAutumn-theme_2, 6%);
@color-midAutumn-player-progress: darken(@color-midAutumn-theme_2, 10%);
@color-midAutumn-player-progress-bar1: darken(@color-midAutumn-theme_2, 12%);
@color-midAutumn-player-progress-bar2: lighten(@color-midAutumn-theme, 12%);
@color-midAutumn-player-status-text: lighten(@color-midAutumn-theme_2-font, 10%);
@@ -371,10 +451,20 @@
@color-midAutumn-tab-btn-background-hover: @color-midAutumn-theme_2-hover;
@color-midAutumn-tab-border-top: fadeout(lighten(@color-midAutumn-theme, 5%), 50%);
@color-midAutumn-tab-border-bottom: lighten(@color-midAutumn-theme, 5%);
@color-midAutumn-minBtn: #85c43b;
@color-midAutumn-maxBtn: #e7aa36;
@color-midAutumn-closeBtn: #ea6e4d;
@color-midAutumn-minBtn-hover: fadeout(@color-midAutumn-minBtn, 10%);
@color-midAutumn-maxBtn-hover: fadeout(@color-midAutumn-maxBtn, 10%);
@color-midAutumn-closeBtn-hover: fadeout(@color-midAutumn-closeBtn, 10%);
@color-midAutumn-badge-success: #32bc63;
@color-midAutumn-badge-success-font: #fff;
@color-midAutumn-badge-info: #4baed5;
@color-midAutumn-badge-info-font: #fff;
@color-dhHyrz-theme: rgb(87, 144, 167);
@color-dhHyrz-theme-bgimg: url(../images/hzwbg.jpeg);
@color-dhHyrz-theme-bgposition: center center;
@color-dhHyrz-theme-bgposition: center;
@color-dhHyrz-theme-bgsize: auto 100%;
@color-dhHyrz-theme-hover: fadeout(lighten(@color-dhHyrz-theme, 10%), 45%);
@color-dhHyrz-theme-active: fadeout(lighten(@color-dhHyrz-theme, 15%), 60%);
@@ -386,8 +476,8 @@
@color-dhHyrz-theme_2-hover: fadeout(lighten(@color-dhHyrz-theme, 10%), 65%);
@color-dhHyrz-theme_2-active: fadeout(darken(@color-dhHyrz-theme, 5%), 70%);
@color-dhHyrz-theme_2-font: darken(@color-dhHyrz-theme_2, 80%);
@color-dhHyrz-theme_2-font-label: lighten(@color-dhHyrz-theme, 10%);
@color-dhHyrz-theme_2-line: lighten(@color-dhHyrz-theme, 36%);
@color-dhHyrz-theme_2-font-label: desaturate(lighten(@color-dhHyrz-theme, 10%), 45%);
@color-dhHyrz-theme_2-line: fadeout(lighten(@color-dhHyrz-theme, 36%), 70%);
@color-dhHyrz-theme-sidebar: rgba(255, 255, 255, .3);
@color-dhHyrz-btn: fadeout(darken(@color-dhHyrz-theme, 5%), 15%);
@color-dhHyrz-btn-background: fadeout(lighten(@color-dhHyrz-theme, 35%), 70%);
@@ -402,7 +492,7 @@
@color-dhHyrz-scrollbar-thumb-hover: fadeout(@color-dhHyrz-theme, 40%);
@color-dhHyrz-player-pic-c1: fadeout(@color-dhHyrz-theme_2, 50%);
@color-dhHyrz-player-pic-c2: darken(@color-dhHyrz-theme_2, 30%);
@color-dhHyrz-player-progress: darken(@color-dhHyrz-theme_2, 6%);
@color-dhHyrz-player-progress: darken(@color-dhHyrz-theme_2, 10%);
@color-dhHyrz-player-progress-bar1: darken(@color-dhHyrz-theme_2, 12%);
@color-dhHyrz-player-progress-bar2: lighten(@color-dhHyrz-theme, 12%);
@color-dhHyrz-player-status-text: lighten(@color-dhHyrz-theme_2-font, 10%);
@@ -410,6 +500,66 @@
@color-dhHyrz-tab-btn-background-hover: @color-dhHyrz-theme_2-hover;
@color-dhHyrz-tab-border-top: fadeout(lighten(@color-dhHyrz-theme, 5%), 50%);
@color-dhHyrz-tab-border-bottom: lighten(@color-dhHyrz-theme, 5%);
@color-dhHyrz-minBtn: #85c43b;
@color-dhHyrz-maxBtn: #e7aa36;
@color-dhHyrz-closeBtn: #ea6e4d;
@color-dhHyrz-minBtn-hover: fadeout(@color-dhHyrz-minBtn, 10%);
@color-dhHyrz-maxBtn-hover: fadeout(@color-dhHyrz-maxBtn, 10%);
@color-dhHyrz-closeBtn-hover: fadeout(@color-dhHyrz-closeBtn, 10%);
@color-dhHyrz-badge-success: #32bc63;
@color-dhHyrz-badge-success-font: #fff;
@color-dhHyrz-badge-info: #4baed5;
@color-dhHyrz-badge-info-font: #fff;
@color-happyNewYear-theme: rgb(252, 57, 57);
@color-happyNewYear-theme-bgimg: url(../images/xnkl.jpg);
@color-happyNewYear-theme-bgposition: center;
@color-happyNewYear-theme-bgsize: auto 100%;
@color-happyNewYear-theme-hover: fadeout(lighten(@color-happyNewYear-theme, 10%), 45%);
@color-happyNewYear-theme-active: fadeout(lighten(@color-happyNewYear-theme, 15%), 60%);
@color-happyNewYear-theme-font: rgba(255, 255, 255, 0.9);
@color-happyNewYear-theme-font-label: fadeout(lighten(@color-happyNewYear-theme, 20%), 20%);
@color-happyNewYear-theme_2: rgba(255, 199, 199, 0.8);
@color-happyNewYear-theme_2-background_1: #f2a4a4;
@color-happyNewYear-theme_2-background_2: fadeout(@color-happyNewYear-theme_2-background_1, 2%);
@color-happyNewYear-theme_2-hover: fadeout(lighten(@color-happyNewYear-theme, 10%), 55%);
@color-happyNewYear-theme_2-active: fadeout(darken(@color-happyNewYear-theme, 5%), 70%);
@color-happyNewYear-theme_2-font: darken(@color-happyNewYear-theme_2, 90%);
@color-happyNewYear-theme_2-font-label: desaturate(darken(@color-happyNewYear-theme, 5%), 50%);
@color-happyNewYear-theme_2-line: fadeout(lighten(@color-happyNewYear-theme, 16%), 70%);
@color-happyNewYear-theme-sidebar: rgba(119, 37, 18, 0.1);
@color-happyNewYear-btn: fadeout(darken(@color-happyNewYear-theme, 5%), 15%);
@color-happyNewYear-btn-background: fadeout(lighten(@color-happyNewYear-theme, 15%), 60%);
@color-happyNewYear-pagination-background: fadeout(lighten(@color-happyNewYear-theme, 15%), 40%);
@color-happyNewYear-pagination-hover: fadeout(lighten(@color-happyNewYear-theme, 10%), 70%);
@color-happyNewYear-pagination-active: fadeout(darken(@color-happyNewYear-theme, 10%), 70%);
@color-happyNewYear-pagination-select: fadeout(lighten(@color-happyNewYear-theme, 10%), 55%);
@color-happyNewYear-search-form-background: fadeout(lighten(@color-happyNewYear-theme, 15%), 20%);
@color-happyNewYear-search-list-hover: fadeout(darken(@color-happyNewYear-theme, 10%), 50%);
@color-happyNewYear-scrollbar-track: fadeout(@color-happyNewYear-theme, 80%);
@color-happyNewYear-scrollbar-thumb: fadeout(@color-happyNewYear-theme, 60%);
@color-happyNewYear-scrollbar-thumb-hover: fadeout(@color-happyNewYear-theme, 40%);
@color-happyNewYear-player-pic-c1: fadeout(@color-happyNewYear-theme_2, 50%);
@color-happyNewYear-player-pic-c2: darken(@color-happyNewYear-theme_2, 30%);
@color-happyNewYear-player-progress: darken(@color-happyNewYear-theme_2, 10%);
@color-happyNewYear-player-progress-bar1: darken(@color-happyNewYear-theme_2, 12%);
@color-happyNewYear-player-progress-bar2: lighten(@color-happyNewYear-theme, 9%);
@color-happyNewYear-player-status-text: lighten(@color-happyNewYear-theme_2-font, 10%);
@color-happyNewYear-tab-btn-background: fadeout(lighten(@color-happyNewYear-theme, 10%), 80%);
@color-happyNewYear-tab-btn-background-hover: @color-happyNewYear-theme_2-hover;
@color-happyNewYear-tab-border-top: fadeout(lighten(@color-happyNewYear-theme, 5%), 50%);
@color-happyNewYear-tab-border-bottom: lighten(@color-happyNewYear-theme, 5%);
@color-happyNewYear-minBtn: #c4943b;
@color-happyNewYear-maxBtn: #e7aa36;
@color-happyNewYear-closeBtn: #ea6e4d;
@color-happyNewYear-minBtn-hover: fadeout(@color-happyNewYear-minBtn, 10%);
@color-happyNewYear-maxBtn-hover: fadeout(@color-happyNewYear-maxBtn, 10%);
@color-happyNewYear-closeBtn-hover: fadeout(@color-happyNewYear-closeBtn, 10%);
@color-happyNewYear-badge-success: @color-happyNewYear-theme;
@color-happyNewYear-badge-success-font: #fff;
@color-happyNewYear-badge-info: #c4943b;
@color-happyNewYear-badge-info-font: #fff;
// Width

View File

@@ -115,6 +115,9 @@ export default {
&:hover:not(.active) {
background-color: @color-theme-hover;
}
&:hover:not(.active) {
background-color: @color-theme-active;
}
}
}
}
@@ -141,6 +144,9 @@ each(@themes, {
&:hover:not(.active) {
background-color: ~'@{color-@{value}-theme-hover}';
}
&:active:not(.active) {
background-color: ~'@{color-@{value}-theme-active}';
}
}
}
}

View File

@@ -339,7 +339,7 @@ export default {
} else if (this.isAPITemp) {
list = this.list.filter(s => s.source == 'kw')
} else {
list = this.list
list = [...this.list]
}
if (!list.length) return this.setPlayIndex(-1)
let playIndex = this.list === list ? this.playIndex : list.indexOf(this.list[this.playIndex])

View File

@@ -13,7 +13,7 @@
<script>
import { rendererSend } from 'common/ipc'
import { mapGetters } from 'vuex'
import { mapGetters, mapMutations } from 'vuex'
import music from '../../utils/music'
import { debounce } from '../../utils'
export default {
@@ -34,15 +34,21 @@ export default {
source() {
return this.setting.search.tempSearchSource
},
isAutoClearInput() {
isAutoClearSearchInput() {
return this.setting.odc.isAutoClearSearchInput
},
isAutoClearSearchList() {
return this.setting.odc.isAutoClearSearchList
},
},
watch: {
route(n) {
if (this.isAutoClearInput && n.name != 'search' && this.searchText) this.searchText = ''
if (n.name != 'search') {
if (this.isAutoClearSearchInput && this.searchText) this.searchText = ''
if (this.isAutoClearSearchList) this.clearSearchList()
}
},
'storeSearchText'(n) {
storeSearchText(n) {
if (n !== this.searchText) this.searchText = n
},
searchText(n) {
@@ -62,6 +68,9 @@ export default {
}, 50)
},
methods: {
...mapMutations('search', {
clearSearchList: 'clearList',
}),
handleEvent({ action, data }) {
switch (action) {
case 'focus':
@@ -127,7 +136,7 @@ export default {
align-items: center;
padding-left: 15px;
-webkit-app-region: drag;
z-index: 1;
z-index: 2;
position: relative;
}
.input {
@@ -199,14 +208,14 @@ export default {
}
&.min:hover:after {
background-color: lighten(@color-minBtn, 10%);
background-color: @color-minBtn-hover;
opacity: 1;
}
&.max:hover:after {
background-color: lighten(@color-maxBtn, 10%);
background-color: @color-maxBtn-hover;
}
&.close:hover:after {
background-color: lighten(@color-closeBtn, 10%);
background-color: @color-closeBtn-hover;
}
}
}
@@ -231,4 +240,31 @@ export default {
color: #fff;
}
}
each(@themes, {
:global(#container.@{value}) {
.control {
button {
&.min:after {
background-color: ~'@{color-@{value}-minBtn}';
}
&.max:after {
background-color: ~'@{color-@{value}-maxBtn}';
}
&.close:after {
background-color: ~'@{color-@{value}-closeBtn}';
}
&.min:hover:after {
background-color: ~'@{color-@{value}-minBtn-hover}';
}
&.max:hover:after {
background-color: ~'@{color-@{value}-maxBtn-hover}';
}
&.close:hover:after {
background-color: ~'@{color-@{value}-closeBtn-hover}';
}
}
}
}
})
</style>

View File

@@ -13,6 +13,7 @@ div(:class="$style.view")
.view {
position: relative;
z-index: 1;
> * {
position: absolute;
width: 100%;

View File

@@ -71,9 +71,9 @@ export default {
let bool = this.bool
if (this.indeterminate) {
bool = true
// this.$nextTick(() => {
this.bool = true
// })
this.$nextTick(() => {
this.bool = bool
})
}
checked = bool
} else {

View File

@@ -4,7 +4,9 @@ div(:class="[$style.search, focus ? $style.active : '', big ? $style.big : '', s
input(:placeholder="placeholder" v-model.trim="text"
@focus="handleFocus" @blur="handleBlur" @input="$emit('input', text)"
@change="sendEvent('change')"
@keyup.enter="handleSearch")
@keyup.enter="handleSearch"
@keyup.40.prevent="handleKeyDown"
@keyup.38.prevent="handleKeyUp")
button(type="button" @click="handleSearch")
slot
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 30.239 30.239' space='preserve')
@@ -14,7 +16,7 @@ div(:class="[$style.search, focus ? $style.active : '', big ? $style.big : '', s
//- leave-active-class="animated flipOutX")
div(v-if="list" :class="$style.list" :style="listStyle")
ul(ref="dom_list")
li(v-for="(item, index) in list" :key="item" @click="handleTemplistClick(index)")
li(v-for="(item, index) in list" :key="item" :class="selectIndex === index ? $style.select : null" @mouseenter="selectIndex = index" @click="handleTemplistClick(index)")
span {{item}}
</template>
@@ -49,7 +51,7 @@ export default {
return {
isShow: false,
text: '',
index: null,
selectIndex: -1,
focus: false,
listStyle: {
height: 0,
@@ -59,6 +61,7 @@ export default {
watch: {
list(n) {
if (!this.visibleList) return
if (this.selectIndex > -1) this.selectIndex = -1
this.$nextTick(() => {
this.listStyle.height = this.$refs.dom_list.scrollHeight + 'px'
})
@@ -84,7 +87,8 @@ export default {
},
handleSearch() {
this.hideList()
this.sendEvent('submit')
if (this.selectIndex < 0) return this.sendEvent('submit')
this.sendEvent('listClick', this.selectIndex)
},
showList() {
this.isShow = true
@@ -93,6 +97,9 @@ export default {
hideList() {
this.isShow = false
this.listStyle.height = 0
this.$nextTick(() => {
this.selectIndex = -1
})
},
sendEvent(action, data) {
this.$emit('event', {
@@ -100,6 +107,12 @@ export default {
data,
})
},
handleKeyDown() {
this.selectIndex = this.selectIndex + 1 < this.list.length ? this.selectIndex + 1 : 0
},
handleKeyUp() {
this.selectIndex = this.selectIndex - 1 < -1 ? this.list.length - 1 : this.selectIndex - 1
},
},
}
</script>
@@ -187,7 +200,7 @@ export default {
.mixin-ellipsis-2;
}
&:hover {
&.select {
background-color: @color-search-list-hover;
}
&:last-child {
@@ -239,7 +252,7 @@ each(@themes, {
}
.list {
li {
&:hover {
&.select {
background-color: ~'@{color-@{value}-search-list-hover}';
}
}

View File

@@ -22,16 +22,16 @@ div(:class="$style.songList")
material-checkbox(:id="index.toString()" v-model="selectdList" @change="handleChangeSelect" :value="item")
td.break(style="width: 25%;")
| {{item.name}}
span.badge.badge-info(v-if="item._types['320k']") 高品质
span.badge.badge-success(v-if="item._types.ape || item._types.flac") 无损
span.badge.badge-theme-info(v-if="!(item._types.ape || item._types.flac) && item._types['320k']") 高品质
span.badge.badge-theme-success(v-if="item._types.ape || item._types.flac") 无损
td.break(style="width: 20%;") {{item.singer}}
td.break(style="width: 20%;") {{item.albumName}}
td(style="width: 20%; padding-left: 0; padding-right: 0;")
material-list-buttons(:index="index" :search-btn="true"
:remove-btn="false" @btn-click="handleListBtnClick"
:listAdd-btn="item.source == 'kw' || (!isAPITemp)"
:play-btn="item.source == 'kw' || (!isAPITemp)"
:download-btn="item.source == 'kw' || (!isAPITemp)")
:listAdd-btn="item.source == 'kw' || !isAPITemp"
:play-btn="item.source == 'kw' || !isAPITemp"
:download-btn="item.source == 'kw' || !isAPITemp")
//- button.btn-info(type='button' v-if="item._types['128k'] || item._types['192k'] || item._types['320k'] || item._types.flac" @click.stop='openDownloadModal(index)') 下载
//- button.btn-secondary(type='button' v-if="item._types['128k'] || item._types['192k'] || item._types['320k']" @click.stop='testPlay(index)') 试听
//- button.btn-success(type='button' v-if="(item._types['128k'] || item._types['192k'] || item._types['320k']) && userInfo" @click.stop='showListModal(index)')
@@ -206,6 +206,9 @@ export default {
}
}
}
:global(.badge) {
opacity: .85;
}
}
.pagination {
text-align: center;

View File

@@ -110,13 +110,13 @@ export default {
display: inline-block;
border: none;
cursor: pointer;
padding: 5px 10px 7px;
padding: 0 10px;
font-size: 12px;
// color: @color-btn;
outline: none;
transition: background-color @transition-theme;
background-color: @color-tab-btn-background;
line-height: 28px;
}
&:hover {
// border-left-color: @color-theme_2-hover;

View File

@@ -173,7 +173,7 @@ export default {
.type {
padding-top: 10px;
padding-bottom: 3px;
color: #999;
color: @color-theme_2-font-label;
}
.tag {
@@ -233,6 +233,10 @@ each(@themes, {
background-color: ~'@{color-@{value}-theme_2-active}';
}
}
.type {
color: ~'@{color-@{value}-theme_2-font-label}';
}
}
})

View File

@@ -256,12 +256,12 @@ export default {
padding-top: 10px;
font-size: 12px;
color: @color-theme;
line-height: 1.2;
line-height: 1.25;
p {
font-size: 12px;
color: @color-theme;
line-height: 1.2;
line-height: 1.25;
}
}
}
@@ -281,6 +281,9 @@ each(@themes, {
.footer {
.desc {
color: ~'@{color-@{value}-theme}';
p {
color: ~'@{color-@{value}-theme}';
}
}
}
}

View File

@@ -11,6 +11,8 @@ import App from './App'
import router from './route'
import store from './store'
import '../common/error'
sync(store, router)
if (!process.env.IS_WEB) {

View File

@@ -9,7 +9,21 @@ export default {
timeout: 20000,
}, (err, resp, body) => {
if (err) {
return ++retryNum > 3 ? reject() : this.dispatch('getVersionInfo', retryNum).then(ver => resolve(ver)).catch(err => reject(err))
return ++retryNum > 3
? this.dispatch('getVersionInfo2').then(ver => resolve(ver)).catch(err => reject(err))
: this.dispatch('getVersionInfo', retryNum).then(ver => resolve(ver)).catch(err => reject(err))
}
resolve(body)
})
})
},
getVersionInfo2(state, retryNum = 0) {
return new Promise((resolve, reject) => {
httpGet('https://cdn.stsky.cn/lx-music/desktop/version.json', {
timeout: 20000,
}, (err, resp, body) => {
if (err) {
return ++retryNum > 3 ? reject() : this.dispatch('getVersionInfo2', retryNum).then(ver => resolve(ver)).catch(err => reject(err))
}
resolve(body)
})

View File

@@ -25,8 +25,8 @@ export default {
setting(state) {
return state.setting
},
electronStore(state) {
return state.electronStore
settingVersion(state) {
return state.settingVersion
},
version(state) {
return state.version

View File

@@ -88,7 +88,7 @@ const getUrl = (downloadInfo, isRefresh) => {
* 设置歌曲meta信息
* @param {*} downloadInfo
* @param {*} filePath
* @param {*} isEmbedPic
* @param {*} isEmbedPic // 是否嵌入图片
*/
const saveMeta = (downloadInfo, filePath, isEmbedPic) => {
if (downloadInfo.type === 'ape' || downloadInfo.type === 'flac') return

View File

@@ -9,6 +9,9 @@ export default {
setSetting(state, val) {
state.setting = val
},
setSettingVersion(state, val) {
state.settingVersion = val
},
setLeaderboard(state, { tabId, source }) {
if (tabId != null) state.setting.leaderboard.tabId = tabId
if (source != null) state.setting.leaderboard.source = source

View File

@@ -4,9 +4,26 @@ import Store from 'electron-store'
import { updateSetting } from '../utils'
import { windowSizeList } from '../../common/config'
import { version } from '../../../package.json'
let electronStore = new Store()
const setting = updateSetting(electronStore.get('setting'))
electronStore.set('setting', setting)
const electronStore_list = window.electronStore_list = new Store({
name: 'playList',
})
const electronStore_config = window.electronStore_config = new Store({
name: 'config',
})
if (!electronStore_config.get('version') && electronStore_config.get('setting')) { // 迁移配置
electronStore_config.set('version', electronStore_config.get('setting.version'))
electronStore_config.delete('setting.version')
const list = electronStore_config.get('list')
if (list) {
if (list.defaultList) electronStore_list.set('defaultList', list.defaultList)
if (list.loveList) electronStore_list.set('loveList', list.loveList)
electronStore_config.delete('list')
}
if (electronStore_config.get('download')) electronStore_config.delete('download')
}
const { version: settingVersion, setting } = updateSetting(electronStore_config.get('setting'), electronStore_config.get('version'))
electronStore_config.set('version', settingVersion)
electronStore_config.set('setting', setting)
process.versions.app = version
export default {
@@ -56,6 +73,11 @@ export default {
name: '木叶之村',
class: 'dhHyrz',
},
{
id: 9,
name: '新年快乐',
class: 'happyNewYear',
},
],
version: {
version,
@@ -70,6 +92,7 @@ export default {
},
userInfo: null,
setting,
electronStore,
settingVersion,
windowSizeList,
}

View File

@@ -126,7 +126,13 @@ class Task extends EventEmitter {
response
.on('data', this.__handleWriteData.bind(this))
.on('error', err => this.__handleError(err))
.on('end', () => this.__handleComplete())
.on('end', () => {
if (response.complete) {
this.__handleComplete()
} else {
this.__handleError(new Error('The connection was terminated while the message was still being sent'))
}
})
})
.on('error', err => this.__handleError(err))
.on('close', () => this.__closeWriteStream())

View File

@@ -42,22 +42,35 @@ export const b64DecodeUnicode = str => {
export const decodeName = str => str.replace(/&apos;/g, '\'')
export const scrollTo = (element, to, duration = 300, fn = function() {}) => {
const easeInOutQuad = (t, b, c, d) => {
t /= d / 2
if (t < 1) return (c / 2) * t * t + b
t--
return (-c / 2) * (t * (t - 2) - 1) + b
}
/**
* 设置滚动条位置
* @param {*} element 要设置滚动的容器 dom
* @param {*} to 滚动的目标位置
* @param {*} duration 滚动完成时间 ms
* @param {*} fn 滚动完成后的回调
*/
export const scrollTo = (element, to, duration = 300, fn = () => {}) => {
if (!element) return
const start = element.scrollTop || element.scrollY || 0
if (to > start) {
let maxScrollTop = element.scrollHeight - element.clientHeight
if (to > maxScrollTop) to = maxScrollTop
} else if (to < start) {
if (to < 0) to = 0
} else return fn()
const change = to - start
const increment = 10
if (!change) {
fn()
return
}
let currentTime = 0; let val
const easeInOutQuad = (t, b, c, d) => {
t /= d / 2
if (t < 1) return (c / 2) * t * t + b
t--
return (-c / 2) * (t * (t - 2) - 1) + b
}
if (!change) return fn()
let currentTime = 0
let val
const animateScroll = () => {
currentTime += increment
val = parseInt(easeInOutQuad(currentTime, start, change, duration))
@@ -83,13 +96,13 @@ export const checkPath = path => fs.existsSync(path)
/**
* 在资源管理器中打开目录
* 选择路径
* @param {*} 选项
*/
export const selectDir = options => rendererInvoke('selectDir', options)
/**
* 在资源管理器中打开目录
* 打开保存对话框
* @param {*} 选项
*/
export const openSaveDir = options => rendererInvoke('showSaveDialog', options)
@@ -163,10 +176,15 @@ export const isChildren = (parent, children) => {
* 升级设置
* @param {*} setting
*/
export const updateSetting = setting => {
const defaultVersion = '1.0.13'
export const updateSetting = (setting, version) => {
const defaultVersion = '1.0.15'
if (!version) {
if (setting) {
version = setting.version
delete setting.version
}
}
const defaultSetting = {
version: defaultVersion,
player: {
togglePlayMethod: 'listLoop',
highQuality: false,
@@ -202,6 +220,7 @@ export const updateSetting = setting => {
},
odc: {
isAutoClearSearchInput: false,
isAutoClearSearchList: false,
},
search: {
searchSource: 'kw',
@@ -221,21 +240,26 @@ export const updateSetting = setting => {
sourceId: 'kw',
apiSource: 'temp',
randomAnimate: true,
ignoreVersion: null,
}
// 使用新年皮肤
if (new Date().getMonth() < 2) defaultSetting.themeId = 9
const overwriteSetting = {
version: defaultVersion,
}
if (!setting) {
setting = defaultSetting
} else if (checkVersion(setting.version, defaultSetting.version)) {
} else if (checkVersion(version, defaultVersion)) {
objectDeepMerge(defaultSetting, setting)
objectDeepMerge(defaultSetting, overwriteSetting)
setting = defaultSetting
}
if (setting.apiSource != 'temp') setting.apiSource = 'test' // 强制设置回 test 接口源
return setting
return { setting, version: defaultVersion }
}
/**
@@ -250,8 +274,8 @@ export const openUrl = url => {
* 设置标题
*/
let dom_title = document.getElementsByTagName('title')[0]
export const setTitle = title => {
dom_title.innerText = title || '洛雪音乐助手'
export const setTitle = (title = '洛雪音乐助手') => {
dom_title.innerText = title
}

View File

@@ -64,14 +64,15 @@ export default {
})
return list
},
search(str, page = 1, { limit } = {}) {
search(str, page = 1, { limit } = {}, retryNum = 0) {
if (++retryNum > 3) return Promise.reject(new Error('try max num'))
if (limit != null) this.limit = limit
return this.musicSearch(str, page).then(result => {
if (!result || result.error_code !== 22000) return this.search(str, page, { limit })
if (!result || result.error_code !== 22000) return this.search(str, page, { limit }, retryNum)
let list = this.handleResult(result.result.song_info.song_list)
if (list == null) return this.search(str, page, { limit })
if (list == null) return this.search(str, page, { limit }, retryNum)
this.total = result.result.song_info.total
this.page = page

View File

@@ -68,14 +68,15 @@ export default {
})
return list
},
search(str, page = 1, { limit } = {}) {
search(str, page = 1, { limit } = {}, retryNum = 0) {
if (++retryNum > 3) return Promise.reject(new Error('try max num'))
if (limit != null) this.limit = limit
// http://newlyric.kuwo.cn/newlyric.lrc?62355680
return this.musicSearch(str, page).then(result => {
if (!result || result.errcode !== 0) return this.search(str, page, { limit })
if (!result || result.errcode !== 0) return this.search(str, page, { limit }, retryNum)
let list = this.handleResult(result.data.info)
if (list == null) return this.search(str, page, { limit })
if (list == null) return this.search(str, page, { limit }, retryNum)
this.total = result.data.total
this.page = page

View File

@@ -67,6 +67,7 @@ export default {
result.push({
id: tag.id,
name: tag.special_name,
source: 'kg',
})
}
return result
@@ -95,7 +96,7 @@ export default {
this.getSongListUrl(sortId, tagId, page),
)
return this._requestObj_list.promise.then(({ body }) => {
if (body.status !== 1) return this.getSongList(sortId, tagId, page, ++tryNum)
if (!body || body.status !== 1) return this.getSongList(sortId, tagId, page, ++tryNum)
return this.filterList(body.special_db)
})
},

View File

@@ -116,36 +116,37 @@ export default {
})
},
filterData(rawList, rawList2) {
// console.log(rawList)
// console.log(rawList.length, rawList2.length)
return rawList.map((item, inedx) => {
let formats = item.formats.split('|')
let types = []
let _types = {}
if (formats.indexOf('MP3128')) {
if (formats.includes('MP3128')) {
types.push({ type: '128k', size: null })
_types['128k'] = {
size: null,
}
}
// if (formats.indexOf('MP3192')) {
// if (formats.includes('MP3192')) {
// types.push({ type: '192k', size: null })
// _types['192k'] = {
// size: null,
// }
// }
if (formats.indexOf('MP3H')) {
if (formats.includes('MP3H')) {
types.push({ type: '320k', size: null })
_types['320k'] = {
size: null,
}
}
// if (formats.indexOf('AL')) {
// if (formats.includes('AL')) {
// types.push({ type: 'ape', size: null })
// _types.ape = {
// size: null,
// }
// }
if (formats.indexOf('ALFLAC')) {
if (formats.includes('ALFLAC')) {
types.push({ type: 'flac', size: null })
_types.flac = {
size: null,
@@ -168,17 +169,18 @@ export default {
}
})
},
loadData(p1, p2, page, bangid) {
loadData(p1, p2, page, bangid, retryNum = 0) {
if (++retryNum > 3) return Promise.reject(new Error('try max num'))
return Promise.all([p1, p2]).then(([data1, data2]) => {
// console.log(data1, data2)
if (!data1.musiclist.length) {
return this.loadData(this.getData(this.getUrl(page, this.limit, bangid)),
data2.data.musicList.length
? Promise.resolve(data2)
: this.getData2(this.getUrl2(page, this.limit, bangid)), page, bangid)
: this.getData2(this.getUrl2(page, this.limit, bangid)), page, bangid, retryNum)
}
if (!data2.data.musicList.length) {
return this.loadData(Promise.resolve(data1), this.getData2(this.getUrl2(page, this.limit, bangid)), page, bangid)
return this.loadData(Promise.resolve(data1), this.getData2(this.getUrl2(page, this.limit, bangid)), page, bangid, retryNum)
}
return Promise.resolve([data1, data2])
})

View File

@@ -121,11 +121,13 @@ export default {
}
return result
},
search(str, page = 1, { limit } = {}) {
search(str, page = 1, { limit } = {}, retryNum = 0) {
if (retryNum > 2) return Promise.reject(new Error('try max num'))
if (limit != null) this.limit = limit
// http://newlyric.kuwo.cn/newlyric.lrc?62355680
return this.musicSearch(str, page).then(result => {
if (!result || (result.TOTAL !== '0' && result.SHOW === '0')) return this.search(str, page, { limit })
// console.log(result)
if (!result || (result.TOTAL !== '0' && result.SHOW === '0')) return this.search(str, page, { limit }, ++retryNum)
let list = this.handleResult(result.abslist)
if (list == null) return this.search(str, page, { limit })

View File

@@ -3,7 +3,7 @@ import { httpFetch } from '../../request'
export default {
getPic({ songmid }) {
const requestObj = httpFetch(`http://artistpicserver.kuwo.cn/pic.web?corp=kuwo&type=rid_pic&pictype=500&size=500&rid=${songmid}`)
requestObj.promise = requestObj.promise.then(({ body }) => body)
requestObj.promise = requestObj.promise.then(({ body }) => /^http/.test(body) ? body : null)
return requestObj
},
}

View File

@@ -93,7 +93,7 @@ export default {
this._requestObj_list = httpFetch(this.getListUrl({ sortId, id, type, page }))
return this._requestObj_list.promise.then(({ body }) => {
if (!id || type == '10000') {
if (body.code !== this.successCode) return this.getList(sortId, id, type, page, ++tryNum)
if (body.code !== this.successCode) return this.getList(sortId, tagId, page, ++tryNum)
return {
list: this.filterList(body.data.data),
total: body.data.total,
@@ -186,19 +186,19 @@ export default {
let formats = item.formats.split('|')
let types = []
let _types = {}
if (formats.indexOf('MP3128')) {
if (formats.includes('MP3128')) {
types.push({ type: '128k', size: null })
_types['128k'] = {
size: null,
}
}
if (formats.indexOf('MP3H')) {
if (formats.includes('MP3H')) {
types.push({ type: '320k', size: null })
_types['320k'] = {
size: null,
}
}
if (formats.indexOf('ALFLAC')) {
if (formats.includes('ALFLAC')) {
types.push({ type: 'flac', size: null })
_types.flac = {
size: null,

View File

@@ -67,9 +67,12 @@ export default {
},
filterData(rawList) {
// console.log(rawList)
let ids = new Set()
const list = []
rawList.forEach(({ songData }) => {
if (!songData) return
if (ids.has(songData.copyrightId)) return
ids.add(songData.copyrightId)
const types = []
const _types = {}
@@ -100,7 +103,7 @@ export default {
// albumId: songData.album_id,
source: 'mg',
interval: null,
songmid: songData.songId,
songmid: songData.copyrightId,
copyrightId: songData.copyrightId,
img: songData.picL || songData.M || songData.picS,
lrc: null,

View File

@@ -13,7 +13,19 @@ export default {
allPage: 1,
musicSearch(str, page) {
if (searchRequest && searchRequest.cancelHttp) searchRequest.cancelHttp()
searchRequest = httpFetch(`https://app.c.nf.migu.cn/MIGUM2.0/v1.0/content/search_all.do?isCopyright=1&isCorrect=1&pageNo=${page}&pageSize=${this.limit}&searchSwitch={%22song%22:1,%22album%22:0,%22singer%22:0,%22tagSong%22:0,%22mvSong%22:0,%22songlist%22:0,%22bestShow%22:0}&sort=0&text=${encodeURIComponent(str)}`)
searchRequest = httpFetch(`http://jadeite.migu.cn:7090/music_search/v2/search/searchAll?sid=4f87090d01c84984a11976b828e2b02c18946be88a6b4c47bcdc92fbd40762db&isCorrect=1&isCopyright=1&searchSwitch=%7B%22song%22%3A1%2C%22album%22%3A0%2C%22singer%22%3A0%2C%22tagSong%22%3A1%2C%22mvSong%22%3A0%2C%22bestShow%22%3A1%2C%22songlist%22%3A0%2C%22lyricSong%22%3A0%7D&pageSize=${this.limit}&text=${encodeURIComponent(str)}&pageNo=${page}&sort=0`, {
headers: {
sign: 'c3b7ae985e2206e97f1b2de8f88691e2',
timestamp: 1578225871982,
appId: 'yyapp2',
mode: 'android',
ua: 'Android_migu',
version: '6.9.4',
osVersion: 'android 7.0',
'User-Agent': 'okhttp/3.9.1',
},
})
// searchRequest = httpFetch(`https://app.c.nf.migu.cn/MIGUM2.0/v1.0/content/search_all.do?isCopyright=1&isCorrect=1&pageNo=${page}&pageSize=${this.limit}&searchSwitch={%22song%22:1,%22album%22:0,%22singer%22:0,%22tagSong%22:0,%22mvSong%22:0,%22songlist%22:0,%22bestShow%22:0}&sort=0&text=${encodeURIComponent(str)}`)
return searchRequest.promise.then(({ body }) => body)
},
getSinger(singers) {
@@ -83,16 +95,19 @@ export default {
})
return list
},
search(str, page = 1, { limit } = {}) {
search(str, page = 1, { limit } = {}, retryNum = 0) {
if (++retryNum > 3) return Promise.reject(new Error('try max num'))
if (limit != null) this.limit = limit
// http://newlyric.kuwo.cn/newlyric.lrc?62355680
return this.musicSearch(str, page).then(result => {
if (!result || result.code !== '000000') return this.search(str, page, { limit })
let list = this.handleResult(result.songResultData.resultList.flat())
// console.log(result)
if (!result || result.code !== '000000') return Promise.reject(new Error(result ? result.info : '搜索失败'))
const songResultData = result.songResultData || { resultList: [], totalCount: 0 }
if (list == null) return this.search(str, page, { limit })
let list = this.handleResult(songResultData.resultList.flat())
if (list == null) return this.search(str, page, { limit }, retryNum)
this.total = parseInt(result.songResultData.totalCount)
this.total = parseInt(songResultData.totalCount)
this.page = page
this.allPage = Math.ceil(this.total / this.limit)

View File

@@ -120,7 +120,7 @@ export default {
name: item.songName,
albumName: item.album,
albumId: item.albumId,
songmid: item.songId,
songmid: item.copyrightId,
copyrightId: item.copyrightId,
source: 'mg',
interval: null,

View File

@@ -4,7 +4,7 @@ import { headers, timeout } from '../options'
const api_messoer = {
getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`http://ts.tempmusic.tk/url/tx/${songInfo.strMediaMid}/${type}`, {
const requestObj = httpFetch(`http://ts.tempmusic.tk/url/tx/${songInfo.songmid}/${type}`, {
method: 'get',
timeout,
headers,

View File

@@ -261,7 +261,7 @@ export default {
})
},
getTags() {
return Promise.all([this.getTag(), this.getHotTag()]).then(([tags, hotTag]) => ({ tags, hotTag }))
return Promise.all([this.getTag(), this.getHotTag()]).then(([tags, hotTag]) => ({ tags, hotTag, source: 'tx' }))
},
}

View File

@@ -77,14 +77,15 @@ export default {
}
})
},
search(str, page = 1, { limit } = {}) {
search(str, page = 1, { limit } = {}, retryNum = 0) {
if (++retryNum > 3) return Promise.reject(new Error('try max num'))
if (limit != null) this.limit = limit
return this.musicSearch(str, page).then(result => {
// console.log(JSON.stringify(result))
if (!result || result.code !== 200) return this.search(str, page, { limit })
if (!result || result.code !== 200) return this.search(str, page, { limit }, retryNum)
let list = this.handleResult(result.result.songs)
if (list == null) return this.search(str, page, { limit })
if (list == null) return this.search(str, page, { limit }, retryNum)
this.total = result.result.songCount
this.page = page

View File

@@ -27,8 +27,8 @@
//- span.badge.badge-light(v-if="item._types['128k']") 128K
//- span.badge.badge-light(v-if="item._types['192k']") 192K
//- span.badge.badge-secondary(v-if="item._types['320k']") 320K
//- span.badge.badge-info(v-if="item._types.ape") APE
//- span.badge.badge-success(v-if="item._types.flac") FLAC
//- span.badge.badge-theme-info(v-if="item._types.ape") APE
//- span.badge.badge-theme-success(v-if="item._types.flac") FLAC
td.break(style="width: 20%;") {{item.singer}}
td.break(style="width: 20%;") {{item.albumName}}
td(style="width: 20%; padding-left: 0; padding-right: 0;")

View File

@@ -24,8 +24,9 @@
material-checkbox(:id="index.toString()" v-model="selectdData" :value="item")
td.break(style="width: 25%;")
| {{item.name}}
span.badge.badge-info(v-if="item._types['320k']") 高品质
span.badge.badge-success(v-if="item._types.ape || item._types.flac") 无损
span.badge.badge-theme-info(v-if="!(item._types.ape || item._types.flac) && item._types['320k']") 高品质
span.badge.badge-theme-success(v-if="item._types.ape || item._types.flac") 无损
span(:class="$style.labelSource" v-if="searchSourceId == 'all'") {{item.source}}
td.break(style="width: 20%;") {{item.singer}}
td.break(style="width: 25%;") {{item.albumName}}
td(style="width: 15%; padding-left: 0; padding-right: 0;")
@@ -287,10 +288,20 @@ export default {
}
}
}
:global(.badge) {
opacity: .85;
}
}
.listBtn {
min-height: 24px;
}
.labelSource {
color: @color-theme;
padding: 5px;
font-size: .8em;
line-height: 1;
opacity: .75;
}
.pagination {
text-align: center;
padding: 15px 0;

View File

@@ -78,7 +78,7 @@ div.scroll(:class="$style.setting")
material-checkbox(id="setting_download_isDownloadLrc" v-model="current_setting.download.isDownloadLrc" label="是否启用")
dt 网络设置
dd
h3 代理设置
h3 代理设置乱设置软件将无法联网
div
p
material-checkbox(id="setting_network_proxy_enable" v-model="current_setting.network.proxy.enable" @change="handleProxyChange('enable')" label="是否启用")
@@ -93,6 +93,10 @@ div.scroll(:class="$style.setting")
h3 离开搜索界面时清空搜索框
div
material-checkbox(id="setting_odc_isAutoClearSearchInput" v-model="current_setting.odc.isAutoClearSearchInput" label="是否启用")
dd
h3 离开搜索界面时清空搜索列表
div
material-checkbox(id="setting_odc_isAutoClearSearchList" v-model="current_setting.odc.isAutoClearSearchList" label="是否启用")
dt 备份与恢复
dd
h3 部分数据
@@ -108,7 +112,7 @@ div.scroll(:class="$style.setting")
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleExportAllData") 导出
dt 其他
dd
h3 缓存大小清理缓存后图片等资源将需要重新下载不建议清软件会自动将大小维持在200M左右
h3 缓存大小清理缓存后图片等资源将需要重新下载不建议清软件会根据磁盘空间动态管理缓存大小
div
p
| 软件已使用缓存大小
@@ -141,33 +145,42 @@ div.scroll(:class="$style.setting")
p.small
| 软件的常见问题可转至
span.hover.underline(title="点击打开" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md')") 常见问题
//- p.small
| 怀念曾经的
strong @messoer
| 非常感谢曾经为本软件提供数据源
p.small
| 阅读常见问题后仍有问题可 mail to
span.hover(title="点击复制" @click="clipboardWriteText('lyswhut@qq.com')") lyswhut@qq.com
| &nbsp;或到 GitHub 提交&nbsp;
span.hover.underline(title="点击打开" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/issues')") issue
br
p.small
| 若觉得好用的话可以去 GitHub 点个
strong star
| 支持作者哦~~🍻
p
span 如果你资金充裕还可以
span 如果你资金充裕或许可以
material-btn(@click="handleOpenUrl('https://cdn.stsky.cn/qrc.png')" min title="土豪,你好 🙂") 捐赠下作者
span 以帮我分担点服务器费用~
span ~捐赠完全是一种
strong 用户自愿
| 的行为
p.small 捐赠不会获得任何特权并且你可能还要做好前一秒捐赠下一秒软件将不可用的心理准备
p.small
| 本软件仅用于学习交流使用禁止将本软件用于
| 由于软件开发的初衷仅是为了
span(:class="$style.delLine") 自用
| 学习研究因此软件直至停止维护都将会一直保持纯净
br
p.small
| 使用本软件可能产生的
strong 任何涉及版权相关的数据
| 请于
strong 24小时内删除
|
p.small
| 本软件仅用于学习与交流使用禁止将本软件用于
strong 非法用途
|
strong 商业用途
|
p.small
| 使用本软件造成的一切后果由
strong 使用者
| 承担
| 使用本软件造成的一切后果由
strong 使用者
| 承担
p
small By
| 落雪无痕
@@ -193,7 +206,7 @@ import fs from 'fs'
export default {
name: 'Setting',
computed: {
...mapGetters(['setting', 'themes', 'version', 'windowSizeList']),
...mapGetters(['setting', 'settingVersion', 'themes', 'version', 'windowSizeList']),
...mapGetters('list', ['defaultList', 'loveList']),
isLatestVer() {
return this.version.newVersion && this.version.version === this.version.newVersion.version
@@ -210,7 +223,6 @@ export default {
data() {
return {
current_setting: {
version: null,
player: {
togglePlayMethod: 'random',
highQuality: false,
@@ -241,6 +253,7 @@ export default {
},
odc: {
isAutoClearSearchInput: false,
isAutoClearSearchList: false,
},
windowSizeId: 1,
themeId: 0,
@@ -267,25 +280,14 @@ export default {
},
],
apiSources: [
// {
// id: 'messoer',
// // label: '由 messoer 提供的接口(推荐,软件的所有功能都可用)',
// label: '由 messoer 提供的接口(该接口已关闭)',
// disabled: true,
// },
// {
// id: 'internal',
// label: '内置接口只能试听或下载128k音质该接口支持软件的所有功能',
// disabled: false,
// },
{
id: 'test',
label: '测试接口(几乎软件的所有功能都可用,该接口访问速度略慢',
label: '测试接口(几乎软件的所有功能都可用)',
disabled: false,
},
{
id: 'temp',
label: '临时接口(软件的某些功能不可用,该接口比测试接口快一些,建议测试接口不可用再使用本接口)',
label: '临时接口(软件的某些功能不可用,建议测试接口不可用再使用本接口)',
disabled: false,
},
],
@@ -309,7 +311,7 @@ export default {
watch: {
current_setting: {
handler(n, o) {
if (!o.version) return
if (!this.settingVersion) return
this.setSetting(JSON.parse(JSON.stringify(n)))
},
deep: true,
@@ -328,7 +330,7 @@ export default {
this.init()
},
methods: {
...mapMutations(['setSetting', 'setVersionModalVisible']),
...mapMutations(['setSetting', 'setSettingVersion', 'setVersionModalVisible']),
...mapMutations('list', ['setList']),
init() {
this.current_setting = JSON.parse(JSON.stringify(this.setting))
@@ -349,21 +351,21 @@ export default {
openDirInExplorer(dir)
},
importSetting(path) {
let setting
let settingData
try {
setting = JSON.parse(fs.readFileSync(path, 'utf8'))
settingData = JSON.parse(fs.readFileSync(path, 'utf8'))
} catch (error) {
return
}
if (setting.type !== 'setting') return
this.setSetting(updateSetting(setting.data))
this.init()
if (settingData.type !== 'setting') return
const { version: settingVersion, setting } = updateSetting(settingData.data)
this.refreshSetting(setting, settingVersion)
},
exportSetting(path) {
console.log(path)
const data = {
type: 'setting',
data: this.setting,
data: Object.assign({ version: this.settingVersion }, this.setting),
}
fs.writeFile(path, JSON.stringify(data, null, 2), 'utf8', err => {
console.log(err)
@@ -407,9 +409,8 @@ export default {
return
}
if (allData.type !== 'allData') return
this.setSetting(updateSetting(allData.setting))
this.init()
if (allData.defaultList) return this.setList({ id: 'default', list: allData.defaultList.list })
const { version: settingVersion, setting } = updateSetting(allData.setting)
this.refreshSetting(setting, settingVersion)
for (const list of allData.playList) {
this.setList({ id: list.id, list: list.list })
@@ -418,7 +419,7 @@ export default {
exportAllData(path) {
let allData = {
type: 'allData',
setting: this.setting,
setting: Object.assign({ version: this.settingVersion }, this.setting),
playList: [
this.defaultList,
this.loveList,
@@ -521,10 +522,19 @@ export default {
this.getCacheSize()
})
},
handleWindowSizeChange(index) {
let info = this.windowSizeList[index]
handleWindowSizeChange(index, id) {
let info = id == null ? this.windowSizeList[index] : this.windowSizeList.find(s => s.id == id)
setWindowSize(info.width, info.height)
},
refreshSetting(setting, version) {
this.setSetting(setting)
this.setSettingVersion(version)
if (setting.windowSizeId != null) this.handleWindowSizeChange(null, setting.windowSizeId)
for (let key of Object.keys(setting.network.proxy)) {
window.globalObj.proxy[key] = setting.network.proxy[key]
}
this.init()
},
},
}
</script>
@@ -654,6 +664,36 @@ export default {
font-size: 12px;
}
.del-line {
position: relative;
&:before {
display: block;
height: 1px;
position: absolute;
width: 110%;
content: ' ';
left: 0;
background-color: #000;
transform: rotate(-24deg);
transform-origin: 0;
top: 83%;
z-index: 1;
}
&:after {
display: block;
height: 1px;
position: absolute;
width: 110%;
content: ' ';
left: 0;
background-color: #000;
transform: rotate(23deg);
transform-origin: 0px;
top: 2px;
z-index: 1;
}
}
each(@themes, {
:global(#container.@{value}) {
.tbody {

View File

@@ -96,7 +96,8 @@ export default {
return this.setting.apiSource == 'temp'
},
tagList() {
return this.tags[this.source] ? this.tags[this.source].tags : []
let tagInfo = this.tags[this.source]
return tagInfo ? [{ name: '热门标签', list: [...tagInfo.hotTag] }, ...tagInfo.tags] : []
},
},
watch: {
@@ -183,10 +184,11 @@ export default {
let targetSong
if (index == null) {
targetSong = this.selectdData[0]
this.listAddMultiple({ id: 'default', list: this.selectdData })
this.listAddMultiple({ id: 'default', list: this.filterList(this.selectdData) })
this.resetSelect()
} else {
targetSong = this.listDetail.list[index]
if (this.isAPITemp && targetSong.source != 'kw') return
this.listAdd({ id: 'default', musicInfo: targetSong })
}
let targetIndex = this.defaultList.list.findIndex(
@@ -234,7 +236,7 @@ export default {
case 'wy':
type = '128k'
}
this.createDownloadMultiple({ list: [...this.selectdData], type })
this.createDownloadMultiple({ list: this.filterList(this.selectdData), type })
this.resetSelect()
this.isShowDownloadMultiple = false
},
@@ -345,6 +347,9 @@ export default {
}
this.importSongListText = text.replace(regx, '$1')
},
filterList(list) {
return this.setting.apiSource == 'temp' ? list.filter(s => s.source == 'kw') : [...list]
},
/* addSongListDetail() {
// this.detailLoading = true
// this.getListDetailAll(this.selectListInfo.id).then(() => {
@@ -514,7 +519,7 @@ export default {
line-height: 1.2;
// text-indent: 24px;
color: #888;
color: @color-theme_2-font-label;
}
}
.pagination {
@@ -523,4 +528,19 @@ export default {
// left: 50%;
// transform: translateX(-50%);
}
each(@themes, {
:global(#container.@{value}) {
.song-list-header-middle {
p {
color: ~'@{color-@{value}-theme_2-font-label}';
}
}
.right {
p {
color: ~'@{color-@{value}-theme_2-font-label}';
}
}
}
})
</style>