You've already forked lx-music-desktop
Compare commits
67 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bc4912416 | ||
|
|
474f0d8291 | ||
|
|
231fe54408 | ||
|
|
78bef70735 | ||
|
|
ce7247e209 | ||
|
|
1d807e2a89 | ||
|
|
749141c10e | ||
|
|
e2c7c0596c | ||
|
|
392cd72f83 | ||
|
|
340a9d937b | ||
|
|
5d7ad836db | ||
|
|
f8e449b017 | ||
|
|
bb0b59080a | ||
|
|
95b08c2406 | ||
|
|
3ef5e0e55a | ||
|
|
ae9b4bc2f5 | ||
|
|
914e738931 | ||
|
|
e4c19c0f2a | ||
|
|
54354518d0 | ||
|
|
d36e21ab56 | ||
|
|
b496e3c667 | ||
|
|
d10434285f | ||
|
|
d6c8886fdb | ||
|
|
51e3c8605c | ||
|
|
d4d6b9c9aa | ||
|
|
0c9c3c61fc | ||
|
|
0228850d6d | ||
|
|
529078dc67 | ||
|
|
aadb68ba08 | ||
|
|
c81171a39e | ||
|
|
a50ecff189 | ||
|
|
73321829ae | ||
|
|
e88c837482 | ||
|
|
2b263cae87 | ||
|
|
e93052f0cb | ||
|
|
9539083f7e | ||
|
|
8f26eb1c69 | ||
|
|
a126e5b4c8 | ||
|
|
033c3cd8e9 | ||
|
|
50d029c671 | ||
|
|
6a3f7e6150 | ||
|
|
aadfbefbe9 | ||
|
|
edbcaf0f90 | ||
|
|
207427e993 | ||
|
|
e109dd876a | ||
|
|
64ac69c48b | ||
|
|
652b06c116 | ||
|
|
654035a469 | ||
|
|
cd50e0086b | ||
|
|
66a119e9dc | ||
|
|
14ec7d48f6 | ||
|
|
5ad5b211e9 | ||
|
|
aac4b6ccfe | ||
|
|
cfc6967fdc | ||
|
|
8a0b960985 | ||
|
|
bd260c3dc5 | ||
|
|
203dff8d98 | ||
|
|
ca56089a3e | ||
|
|
a012d1b927 | ||
|
|
0af322a3a8 | ||
|
|
8d743803c8 | ||
|
|
63fed77c5b | ||
|
|
f2077dca04 | ||
|
|
cccfb6a08a | ||
|
|
fa6dead83d | ||
|
|
605418d750 | ||
|
|
8aa869b2e4 |
2
.github/ISSUE_TEMPLATE/----.md
vendored
2
.github/ISSUE_TEMPLATE/----.md
vendored
@@ -1,5 +1,5 @@
|
||||
---
|
||||
name: 功能请求
|
||||
name: 功能请求(请先查看常见问题及搜索issue列表中有无你要提的问题)
|
||||
about: 为这个项目提出一个想法
|
||||
title: 例如:添加xxx功能、优化xxx功能
|
||||
labels: ''
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/--bug.md
vendored
2
.github/ISSUE_TEMPLATE/--bug.md
vendored
@@ -1,5 +1,5 @@
|
||||
---
|
||||
name: 报告Bug
|
||||
name: 报告Bug(请先查看常见问题及搜索issue列表中有无你要提的问题)
|
||||
about: 创建报告以帮助我们改进
|
||||
title: 例如:音乐无法播放
|
||||
labels: ''
|
||||
|
||||
90
CHANGELOG.md
90
CHANGELOG.md
@@ -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
33
FAQ.md
@@ -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
4764
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
66
package.json
66
package.json
@@ -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"
|
||||
|
||||
@@ -1,17 +1,5 @@
|
||||
由于新下载库仍然没有完成,但下载功能已经可用,so 移除之前使用的第三方下载库,暂时把新下载库的下载模块直接加入本程序,若出现下载问题欢迎反馈!
|
||||
|
||||
### 新增
|
||||
|
||||
- 新增下载功能对代理设置的支持,现在若在软件设置了代理服务器,下载功能也将会走代理网络了
|
||||
|
||||
### 优化
|
||||
|
||||
- 新下载模块将对恢复下载的任务进行字节校验,用于解决下载进度超过100%后仍然下载的问题
|
||||
- 注意:目前仍然无法暂停处于**链接获取**状态中的任务
|
||||
洛雪提前祝大家新年快乐、身体健康、阖家幸福!
|
||||
|
||||
### 修复
|
||||
|
||||
- 修复Linux deb版本`.desktop`桌面文件缺少图标的问题,新增中文名称显示、软件分类,感谢@lowy的反馈!
|
||||
- 修复下载列表歌曲状态分类列表操作Bug
|
||||
- 修复歌曲封面下载失败时仍然执行嵌入封面操作导致报错的问题
|
||||
- 跳过重复添加**相同歌曲名与扩展名的歌曲**,例如你之前下载了A歌曲的128k音质,现在想要下载它的320k音质,但由于两者都是MP3格式,会因为重名导致之前的128k音质被覆盖但列表中仍然显示两种音质的问题(但实际上都是指向后面的320k音质)
|
||||
- 修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题
|
||||
|
||||
@@ -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
12
src/common/error.js
Normal 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)
|
||||
})
|
||||
6
src/main/events/getEnvParams.js
Normal file
6
src/main/events/getEnvParams.js
Normal file
@@ -0,0 +1,6 @@
|
||||
const { mainHandle } = require('../../common/ipc')
|
||||
|
||||
mainHandle('getEnvParams', async(event, options) => {
|
||||
return global.envParams
|
||||
})
|
||||
|
||||
@@ -10,3 +10,4 @@ require('./showSaveDialog')
|
||||
require('./clearCache')
|
||||
require('./getCacheSize')
|
||||
require('./setIgnoreMouseEvent')
|
||||
require('./getEnvParams')
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
|
||||
@@ -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>
|
||||
|
||||
BIN
src/renderer/assets/images/xnkl.jpg
Normal file
BIN
src/renderer/assets/images/xnkl.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 262 KiB |
@@ -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}';
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -13,6 +13,7 @@ div(:class="$style.view")
|
||||
|
||||
.view {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
> * {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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}';
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -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}';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -42,22 +42,35 @@ export const b64DecodeUnicode = str => {
|
||||
|
||||
export const decodeName = str => str.replace(/'/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
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
},
|
||||
|
||||
@@ -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])
|
||||
})
|
||||
|
||||
@@ -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 })
|
||||
|
||||
@@ -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
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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' }))
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;")
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
| 或到 GitHub 提交
|
||||
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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user