Merge branch 'dev' of github.com:lyswhut/lx-music-desktop into dev

pull/733/head
lyswhut 2021-09-07 22:20:06 +08:00
commit 431605e793
38 changed files with 2304 additions and 1207 deletions

View File

@ -1,7 +1,8 @@
module.exports = { module.exports = {
upgrade: true, upgrade: true,
reject: [ reject: [
'vue-loader' 'vue-loader',
'webpack-dev-server',
// 'eslint-config-standard' // 'eslint-config-standard'
] ]
} }

View File

@ -6,6 +6,27 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/).
Commit convention is based on [Conventional Commits](http://conventionalcommits.org). Commit convention is based on [Conventional Commits](http://conventionalcommits.org).
Change log format is based on [Keep a Changelog](http://keepachangelog.com/). Change log format is based on [Keep a Changelog](http://keepachangelog.com/).
## [1.13.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.12.2...v1.13.0) - 2021-09-05
如果你喜欢并经常使用洛雪音乐并想要第一时间尝鲜洛雪的新功能可以加入测试企鹅群768786588
注意:测试版的功可能会不稳定,打算潜水的勿加。
### 新增
- 歌曲搜索框新增清理按钮,点击此按钮可以清理搜索框并返回初始搜索界面
- 新增“下载的歌词文件编码格式”设置,默认下载的歌词编码仍是`UTF-8`,对于某些在设备(如车机)上出现歌词中文乱码的用户可以尝试选择以`GBK`编码格式保存歌词文件
- 新增设置-桌面歌词-歌词字体设置此设置可用于设置桌面歌词的字体已知的问题Windows 7 下可能会出现字体列表为空的情况,这是当前系统的 Powershell 版本小于5.1导致的,请自行**尝试**看常见解决)
### 优化
- 支持网易源“我喜欢”歌单以注入token的方式打开。由于网易源的“我喜欢”歌单需要登录才能打开若你看不懂后半句就去阅读 常见问题-无法打开外部歌单),现若想要打开此类歌单,需要在歌单链接后面拼上 `###` 再加上有效的token拼接格式`[id|url]###token`例子最后面的xxxxxx替换成你的token`https://music.163.com/#/playlist?id=123456&userid=123456###xxxxxx`
- 软件内快捷键的最小化触发时,如果已启用托盘,则隐藏程序,否则最小化程序
### 修复
- 修复某些情况下同步功能会导致切歌混乱的问题
- 修复从电脑浏览器复制的企鹅歌单链接无法打开的问题
## [1.12.2](https://github.com/lyswhut/lx-music-desktop/compare/v1.12.1...v1.12.2) - 2021-08-11 ## [1.12.2](https://github.com/lyswhut/lx-music-desktop/compare/v1.12.1...v1.12.2) - 2021-08-11
### 修复 ### 修复

63
FAQ.md
View File

@ -19,7 +19,7 @@
若网页无法打开或打开来不是404则可能是DNS的问题可以尝试以下办法 若网页无法打开或打开来不是404则可能是DNS的问题可以尝试以下办法
1. 将DNS改成自动获取试试改完可能需要清理下系统DNS缓存才生效 1. 将DNS改成自动获取试试改完可能需要清理下系统DNS缓存才生效
2. 手动把DNS改一下不要用360的DNS可以把DNS改成`114.114.114.114`、`8.8.8.8`改完可能需要清理下系统DNS缓存才生效 2. 手动把DNS改一下不要用360的DNS可以把DNS改成`223.6.6.6`、`8.8.8.8`改完可能需要清理下系统DNS缓存才生效
改完DNS后可能需要重启软件才生效 改完DNS后可能需要重启软件才生效
@ -38,7 +38,7 @@
若网页无法打开或打来不是404则应该是DNS的问题可以尝试以下办法 若网页无法打开或打来不是404则应该是DNS的问题可以尝试以下办法
1. 将DNS改成自动获取试试 1. 将DNS改成自动获取试试
2. 手动把DNS改一下不要用360的DNS可以把DNS改成`114.114.114.114`、`8.8.8.8` 2. 手动把DNS改一下不要用360的DNS可以把DNS改成`223.6.6.6`、`8.8.8.8`
## 列表多选 ## 列表多选
@ -64,6 +64,35 @@
注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开 注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开
### 打开网易源“我喜欢”歌单
由于网易源的“我喜欢”歌单需要登录才能打开从v1.13.0起提供了可以以注入token的方式打开网易源“我喜欢”歌单的功能现若想要打开此类歌单需要在歌单链接或id后面拼上 `###` 再加上有效的token拼接格式`[id|url]###token`例子最后面的xxxxxx替换成你的token
- `https://music.163.com/#/playlist?id=11332&userid=123456###xxxxxx`
- `11332###xxxxxx`
即:将 `歌单链接或者歌单ID`、`###`、`token` 这三者拼到一起。
#### `token`的获取方法
**注:`token`是你账号的临时身份令牌,不要随便泄露给他人**<br>
在浏览器打开登录网易云音乐并**登录**后,按`F12`,此时将会打开开发者窗口,然后按你使用的浏览器操作:
##### Chrome、360、QQ等浏览器
这些浏览器打开此窗口时界面可能是中文也可能是英文,英文的话按括号里的来
1. 点击窗口顶部`应用程序(application)`
2. 展开左侧 `Cookies`
3. 点击 `https://music.163.com`
4. 在右侧窗口找到 `名称(Name)``MUSIC_U` 的这行,这行的第二列(`值(Value)`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制
##### 火狐浏览器
1. 点击窗口顶部`存储`
2. 展开左侧 `Cookie`
3. 点击 `https://music.163.com`
4. 在右侧窗口找到 `名称``MUSIC_U` 的这行,这行的最后一列(`值`)内的那串内容就是`token`,双击它进入编辑状态,然后按`ctrl + c`键就可以将它复制
## 更新已收藏的在线歌单 ## 更新已收藏的在线歌单
该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“更新”使用该功能, 该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“更新”使用该功能,
@ -81,12 +110,16 @@
3. 输入完这两项后点击“启动同步” 3. 输入完这两项后点击“启动同步”
4. 若连接成功对于首次同步时若两边的设备的列表不为空则PC端会弹出选择列表同步方式的弹窗同步方式的说明弹窗下面有介绍 4. 若连接成功对于首次同步时若两边的设备的列表不为空则PC端会弹出选择列表同步方式的弹窗同步方式的说明弹窗下面有介绍
对于连接同步服务失败的可能原因: #### 关于同步弹窗的说明
对于首次同步时若两边的设备的列表不为空则PC端会弹出选择列表同步方式的弹窗此弹窗内的同步方式仅针对**首次同步**<br>
第一次同步成功后,以后再同步时将会自动根据两边设备的列表内容合并同步,不信你可以在同步完成后断开两边的连接,然后在两边增删一些歌曲或列表后再同步试试看~😉
#### 连接同步服务失败的可能原因
- 此功能需要PC端与移动端都连接在同一个路由器下的网络才能使用 - 此功能需要PC端与移动端都连接在同一个路由器下的网络才能使用
- 路由器若开启了AP隔离则此功能无法使用
- 检查防火墙是否拦截了PC端的服务端口 - 检查防火墙是否拦截了PC端的服务端口
- 路由器若开启了AP隔离则此功能无法使用
## 界面异常(界面显示不完整) ## 界面异常(界面显示不完整)
@ -123,6 +156,14 @@
- 添加启动参数`-dha`运行(添加的方法请自行百度“给快捷方式加参数”) - 添加启动参数`-dha`运行(添加的方法请自行百度“给快捷方式加参数”)
- 尝试将绿色版的软件放在**桌面**或**我的文档**运行 - 尝试将绿色版的软件放在**桌面**或**我的文档**运行
## Windows 7 下桌面歌词字体列表为空
Windows 7 系统系统需要安装 Powershell 5.1及以上版本才可正常获取系统字体列表。
想要查看当前 Powershell 版本可以在 Powershell 窗口输入命令:`Get-Host`
最新 Powershell 安装包可以去官方 [Github releases](https://github.com/PowerShell/PowerShell/releases) 页下载,安装过程中若出现错误,请自行按照提示或者百度/Google解决。
## 安装版安装失败,提示安装程序并未成功地运行完成 ## 安装版安装失败,提示安装程序并未成功地运行完成
对于部分电脑出现安装失败的问题,可以做出以下尝试: 对于部分电脑出现安装失败的问题,可以做出以下尝试:
@ -178,9 +219,9 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看上面的
**`.dmg`** 结尾的文件为 MAC 版本; **`.dmg`** 结尾的文件为 MAC 版本;
**`.AppImage`**、**`.deb`** 结尾的为 Linux 版本。 **`.AppImage`**、**`.deb`**、**`.rpm`**、**`.pacman`** 结尾的为 Linux 版本。
带有`x64`的为64位的系统版本带`x86`的为32位的系统版本若两个都带有的则为集合版安装时会自动根据系统位数选择对应的版本安装。 带有`x64`的为64位的系统版本带`x86`的为32位的系统版本若两个都带有的则为集合版安装时会自动根据系统位数选择对应的版本安装;带有`arm`的为arm架构系统的版本
## 软件更新 ## 软件更新
@ -188,13 +229,13 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看上面的
若下载未完成时软件被关闭,下次启动软件会再次自动下载。<br> 若下载未完成时软件被关闭,下次启动软件会再次自动下载。<br>
若还是**更新失败**可能是无法访问GitHub导致的这时需要手动更新即下载最新安装包直接覆盖安装即可。<br> 若还是**更新失败**可能是无法访问GitHub导致的这时需要手动更新即下载最新安装包直接覆盖安装即可。<br>
注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!<br> 注意:**绿色版**的软件自动更新功能**不可用**,建议使用安装版!!<br>
注意:**Mac版**、**Linux deb**版不支持自动更新! 注意:**Mac版**、**Linux**版不支持自动更新!
## 更新已收藏的在线歌单 ### Windows 安装版在升级后,卸载了旧版本,但没有安装新版本
该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“同步”使用该功能, 出现这个问题的原因一般是你当初在安装本软件的时候是以管理员身份安装的,运行软件的时候没有以管理员身份运行,所以卸载后无法再装上。
需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表 安装本软件时建议选择 `为当前用户安装`,并安装在当前用户目录或者安装在不需要管理员权限的目录(即其他分区下),不要选`为所有用户安装`
## 缺少`xxx.dll` ## 缺少`xxx.dll`

View File

@ -29,11 +29,10 @@ module.exports = {
exclude: /node_modules/, exclude: /node_modules/,
enforce: 'pre', enforce: 'pre',
}, },
// { {
// test: /\.js$/, test: /\.node$/,
// loader: 'babel-loader', use: 'node-loader',
// exclude: /node_modules/, },
// },
], ],
}, },
performance: { performance: {

View File

@ -15,6 +15,7 @@ module.exports = merge(baseConfig, {
}, },
externals: [ externals: [
...Object.keys(dependencies || {}), ...Object.keys(dependencies || {}),
// 'font-list',
], ],
node: { node: {
__dirname: false, __dirname: false,

View File

@ -44,6 +44,10 @@ module.exports = {
exclude: /node_modules/, exclude: /node_modules/,
enforce: 'pre', enforce: 'pre',
}, },
{
test: /\.node$/,
use: 'node-loader',
},
{ {
test: /\.vue$/, test: /\.vue$/,
loader: 'vue-loader', loader: 'vue-loader',
@ -72,15 +76,6 @@ module.exports = {
}, },
}), }),
}, },
{
test: /\.styl(:?us)?$/,
oneOf: mergeCSSLoader({
loader: 'stylus-loader',
options: {
sourceMap: true,
},
}),
},
{ {
test: /\.pug$/, test: /\.pug$/,
oneOf: [ oneOf: [

View File

@ -44,6 +44,10 @@ module.exports = {
exclude: /node_modules/, exclude: /node_modules/,
enforce: 'pre', enforce: 'pre',
}, },
{
test: /\.node$/,
use: 'node-loader',
},
{ {
test: /\.vue$/, test: /\.vue$/,
loader: 'vue-loader', loader: 'vue-loader',
@ -72,15 +76,6 @@ module.exports = {
}, },
}), }),
}, },
{
test: /\.styl(:?us)?$/,
oneOf: mergeCSSLoader({
loader: 'stylus-loader',
options: {
sourceMap: true,
},
}),
},
{ {
test: /\.pug$/, test: /\.pug$/,
oneOf: [ oneOf: [

View File

@ -16,7 +16,8 @@ const rendererLyricConfig = require('./renderer-lyric/webpack.config.dev')
let electronProcess = null let electronProcess = null
let manualRestart = false let manualRestart = false
let hotMiddleware let hotMiddlewareRenderer
let hotMiddlewareRendererLyric
function startRenderer() { function startRenderer() {
@ -24,7 +25,7 @@ function startRenderer() {
// rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer) // rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
// rendererConfig.mode = 'development' // rendererConfig.mode = 'development'
const compiler = webpack(rendererConfig) const compiler = webpack(rendererConfig)
hotMiddleware = webpackHotMiddleware(compiler, { hotMiddlewareRenderer = webpackHotMiddleware(compiler, {
log: false, log: false,
heartbeat: 2500, heartbeat: 2500,
}) })
@ -32,15 +33,15 @@ function startRenderer() {
compiler.hooks.compilation.tap('compilation', compilation => { compiler.hooks.compilation.tap('compilation', compilation => {
// console.log(Object.keys(compilation.hooks)) // console.log(Object.keys(compilation.hooks))
HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => { HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
hotMiddleware.publish({ action: 'reload' }) hotMiddlewareRenderer.publish({ action: 'reload' })
cb() cb()
}) })
}) })
compiler.hooks.done.tap('done', stats => { // compiler.hooks.done.tap('done', stats => {
// logStats('Renderer', 'Compile done') // // logStats('Renderer', 'Compile done')
// logStats('Renderer', stats) // // logStats('Renderer', stats)
}) // })
const server = new WebpackDevServer( const server = new WebpackDevServer(
compiler, compiler,
@ -54,7 +55,7 @@ function startRenderer() {
errors: true, errors: true,
}, },
before(app, ctx) { before(app, ctx) {
app.use(hotMiddleware) app.use(hotMiddlewareRenderer)
ctx.middleware.waitUntilValid(() => { ctx.middleware.waitUntilValid(() => {
resolve() resolve()
}) })
@ -71,7 +72,7 @@ function startRendererLyric() {
// rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer) // rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
// rendererConfig.mode = 'development' // rendererConfig.mode = 'development'
const compiler = webpack(rendererLyricConfig) const compiler = webpack(rendererLyricConfig)
hotMiddleware = webpackHotMiddleware(compiler, { hotMiddlewareRendererLyric = webpackHotMiddleware(compiler, {
log: false, log: false,
heartbeat: 2500, heartbeat: 2500,
}) })
@ -79,15 +80,15 @@ function startRendererLyric() {
compiler.hooks.compilation.tap('compilation', compilation => { compiler.hooks.compilation.tap('compilation', compilation => {
// console.log(Object.keys(compilation.hooks)) // console.log(Object.keys(compilation.hooks))
HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => { HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
hotMiddleware.publish({ action: 'reload' }) hotMiddlewareRendererLyric.publish({ action: 'reload' })
cb() cb()
}) })
}) })
compiler.hooks.done.tap('done', stats => { // compiler.hooks.done.tap('done', stats => {
// logStats('Renderer', 'Compile done') // // logStats('Renderer', 'Compile done')
// logStats('Renderer', stats) // // logStats('Renderer', stats)
}) // })
const server = new WebpackDevServer( const server = new WebpackDevServer(
compiler, compiler,
@ -101,7 +102,7 @@ function startRendererLyric() {
errors: true, errors: true,
}, },
before(app, ctx) { before(app, ctx) {
app.use(hotMiddleware) app.use(hotMiddlewareRendererLyric)
ctx.middleware.waitUntilValid(() => { ctx.middleware.waitUntilValid(() => {
resolve() resolve()
}) })
@ -120,7 +121,8 @@ function startMain() {
const compiler = webpack(mainConfig) const compiler = webpack(mainConfig)
compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => { compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
hotMiddleware.publish({ action: 'compiling' }) hotMiddlewareRenderer.publish({ action: 'compiling' })
hotMiddlewareRendererLyric.publish({ action: 'compiling' })
done() done()
}) })

3088
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "lx-music-desktop", "name": "lx-music-desktop",
"version": "1.12.2", "version": "1.13.0",
"description": "一个免费的音乐查找助手", "description": "一个免费的音乐查找助手",
"main": "./dist/electron/main.js", "main": "./dist/electron/main.js",
"productName": "lx-music-desktop", "productName": "lx-music-desktop",
@ -70,7 +70,7 @@
"up": "cross-env ELECTRON_GET_USE_PROXY=true GLOBAL_AGENT_HTTPS_PROXY=http://localhost:1081 npm i" "up": "cross-env ELECTRON_GET_USE_PROXY=true GLOBAL_AGENT_HTTPS_PROXY=http://localhost:1081 npm i"
}, },
"browserslist": [ "browserslist": [
"Electron 13.1.7" "Electron 13.3.0"
], ],
"engines": { "engines": {
"node": ">= 14" "node": ">= 14"
@ -83,6 +83,9 @@
"files": [ "files": [
"dist/electron/**/*" "dist/electron/**/*"
], ],
"asar": {
"smartUnpack": false
},
"extraResources": [ "extraResources": [
"./licenses" "./licenses"
], ],
@ -163,37 +166,37 @@
}, },
"homepage": "https://github.com/lyswhut/lx-music-desktop#readme", "homepage": "https://github.com/lyswhut/lx-music-desktop#readme",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.15.0", "@babel/core": "^7.15.5",
"@babel/plugin-proposal-class-properties": "^7.14.5", "@babel/plugin-proposal-class-properties": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-modules-umd": "^7.14.5", "@babel/plugin-transform-modules-umd": "^7.14.5",
"@babel/plugin-transform-runtime": "^7.15.0", "@babel/plugin-transform-runtime": "^7.15.0",
"@babel/polyfill": "^7.12.1", "@babel/polyfill": "^7.12.1",
"@babel/preset-env": "^7.15.0", "@babel/preset-env": "^7.15.4",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"babel-loader": "^8.2.2", "babel-loader": "^8.2.2",
"babel-preset-minify": "^0.5.1", "babel-preset-minify": "^0.5.1",
"browserslist": "^4.16.7", "browserslist": "^4.16.8",
"cfonts": "^2.9.3", "cfonts": "^2.9.3",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"changelog-parser": "^2.8.0", "changelog-parser": "^2.8.0",
"copy-webpack-plugin": "^9.0.1", "copy-webpack-plugin": "^9.0.1",
"core-js": "^3.16.1", "core-js": "^3.17.2",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"css-loader": "^6.2.0", "css-loader": "^6.2.0",
"css-minimizer-webpack-plugin": "^3.0.2", "css-minimizer-webpack-plugin": "^3.0.2",
"del": "^6.0.0", "del": "^6.0.0",
"electron": "^13.1.9", "electron": "^13.3.0",
"electron-builder": "^22.11.7", "electron-builder": "^22.11.7",
"electron-debug": "^3.2.0", "electron-debug": "^3.2.0",
"electron-devtools-installer": "^3.2.0", "electron-devtools-installer": "^3.2.0",
"electron-to-chromium": "^1.3.801", "electron-to-chromium": "^1.3.830",
"eslint": "^7.32.0", "eslint": "^7.32.0",
"eslint-config-standard": "^16.0.3", "eslint-config-standard": "^16.0.3",
"eslint-formatter-friendly": "^7.0.0", "eslint-formatter-friendly": "^7.0.0",
"eslint-loader": "^4.0.2", "eslint-loader": "^4.0.2",
"eslint-plugin-html": "^6.1.2", "eslint-plugin-html": "^6.1.2",
"eslint-plugin-import": "^2.24.0", "eslint-plugin-import": "^2.24.2",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0", "eslint-plugin-promise": "^5.1.0",
"eslint-plugin-standard": "^4.1.0", "eslint-plugin-standard": "^4.1.0",
@ -204,7 +207,8 @@
"less-loader": "^10.0.1", "less-loader": "^10.0.1",
"less-plugin-clean-css": "^1.5.1", "less-plugin-clean-css": "^1.5.1",
"markdown-it": "^12.2.0", "markdown-it": "^12.2.0",
"mini-css-extract-plugin": "^2.2.0", "mini-css-extract-plugin": "^2.2.2",
"node-loader": "^2.0.0",
"postcss": "^8.3.6", "postcss": "^8.3.6",
"postcss-loader": "^6.1.1", "postcss-loader": "^6.1.1",
"postcss-pxtorem": "^6.0.0", "postcss-pxtorem": "^6.0.0",
@ -214,35 +218,33 @@
"raw-loader": "^4.0.2", "raw-loader": "^4.0.2",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"spinnies": "^0.5.1", "spinnies": "^0.5.1",
"stylus": "^0.54.8", "terser-webpack-plugin": "^5.2.3",
"stylus-loader": "^6.1.0",
"terser-webpack-plugin": "^5.1.4",
"url-loader": "^4.1.1", "url-loader": "^4.1.1",
"vue-loader": "^15.9.8", "vue-loader": "^15.9.8",
"vue-template-compiler": "^2.6.14", "vue-template-compiler": "^2.6.14",
"webpack": "^5.50.0", "webpack": "^5.52.0",
"webpack-cli": "^4.7.2", "webpack-cli": "^4.8.0",
"webpack-dev-server": "^3.11.2", "webpack-dev-server": "^3.11.2",
"webpack-hot-middleware": "^2.25.0", "webpack-hot-middleware": "^2.25.0",
"webpack-merge": "^5.8.0" "webpack-merge": "^5.8.0"
}, },
"dependencies": { "dependencies": {
"bufferutil": "^4.0.3",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
"electron-log": "^4.4.1", "electron-log": "^4.4.1",
"bufferutil": "^4.0.3",
"eiows": "^3.6.1",
"electron-store": "^8.0.0", "electron-store": "^8.0.0",
"electron-updater": "^4.3.9", "electron-updater": "^4.3.9",
"font-list": "git+https://github.com/lyswhut/node-font-list.git#c6caf4060e471afe143a4aca30d554644522966d",
"http-terminator": "^3.0.0", "http-terminator": "^3.0.0",
"iconv-lite": "^0.6.3", "iconv-lite": "^0.6.3",
"image-size": "^1.0.0", "image-size": "^1.0.0",
"koa": "^2.13.1", "koa": "^2.13.1",
"long": "^4.0.0", "long": "^4.0.0",
"lrc-file-parser": "^1.1.2", "lrc-file-parser": "^1.1.2",
"needle": "^2.8.0", "needle": "^3.0.0",
"node-id3": "^0.2.3", "node-id3": "^0.2.3",
"request": "^2.88.2", "request": "^2.88.2",
"socket.io": "^4.1.3", "socket.io": "^4.2.0",
"utf-8-validate": "^5.0.5", "utf-8-validate": "^5.0.5",
"vue": "^2.6.14", "vue": "^2.6.14",
"vue-i18n": "^8.25.0", "vue-i18n": "^8.25.0",

View File

@ -1,6 +1,18 @@
如果你喜欢并经常使用洛雪音乐并想要第一时间尝鲜洛雪的新功能可以加入测试企鹅群768786588
注意:测试版的功可能会不稳定,打算潜水的勿加。
### 新增
- 歌曲搜索框新增清理按钮,点击此按钮可以清理搜索框并返回初始搜索界面
- 新增“下载的歌词文件编码格式”设置,默认下载的歌词编码仍是`UTF-8`,对于某些在设备(如车机)上出现歌词中文乱码的用户可以尝试选择以`GBK`编码格式保存歌词文件
- 新增设置-桌面歌词-歌词字体设置此设置可用于设置桌面歌词的字体已知的问题Windows 7 下可能会出现字体列表为空的情况,这是当前系统的 Powershell 版本小于5.1导致的,请自行**尝试**看常见解决)
### 优化
- 支持网易源“我喜欢”歌单以注入token的方式打开。由于网易源的“我喜欢”歌单需要登录才能打开若你看不懂后半句就去阅读 常见问题-无法打开外部歌单),现若想要打开此类歌单,需要在歌单链接后面拼上 `###` 再加上有效的token拼接格式`[id|url]###token`例子最后面的xxxxxx替换成你的token`https://music.163.com/#/playlist?id=123456&userid=123456###xxxxxx`
- 软件内快捷键的最小化触发时,如果已启用托盘,则隐藏程序,否则最小化程序
### 修复 ### 修复
- 修复播放下载列表的歌曲时切歌的问题 - 修复某些情况下同步功能会导致切歌混乱的问题
- 修复播放下载列表的歌曲时歌词无法显示的问题 - 修复从电脑浏览器复制的企鹅歌单链接无法打开的问题
- 修复下载列表稍后播放功能无效的问题
- 修复同步服务器启动失败时,关闭同步服务不会清空失败信息的问题

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@ const path = require('path')
const os = require('os') const os = require('os')
const defaultSetting = { const defaultSetting = {
version: '1.0.43', version: '1.0.45',
player: { player: {
togglePlayMethod: 'listLoop', togglePlayMethod: 'listLoop',
highQuality: false, highQuality: false,
@ -26,6 +26,7 @@ const defaultSetting = {
theme: 0, theme: 0,
isLockScreen: true, isLockScreen: true,
style: { style: {
font: '',
fontSize: 120, fontSize: 120,
opacity: 95, opacity: 95,
isZoomActiveLrc: true, isZoomActiveLrc: true,
@ -44,6 +45,7 @@ const defaultSetting = {
fileName: '歌名 - 歌手', fileName: '歌名 - 歌手',
maxDownloadNum: 3, maxDownloadNum: 3,
isDownloadLrc: false, isDownloadLrc: false,
lrcFormat: 'utf8',
isEmbedPic: true, isEmbedPic: true,
isEmbedLyric: false, isEmbedLyric: false,
isUseOtherSource: false, isUseOtherSource: false,

View File

@ -22,6 +22,7 @@ const names = {
set_app_setting: 'set_app_setting', set_app_setting: 'set_app_setting',
set_window_size: 'set_window_size', set_window_size: 'set_window_size',
show_save_dialog: 'show_save_dialog', show_save_dialog: 'show_save_dialog',
get_system_fonts: 'get_system_fonts',
handle_request: 'handle_request', handle_request: 'handle_request',
cancel_request: 'cancel_request', cancel_request: 'cancel_request',

View File

@ -47,8 +47,16 @@ exports.createWindow = async userApi => {
show: false, show: false,
webPreferences: { webPreferences: {
contextIsolation: true, contextIsolation: true,
worldSafeExecuteJavaScript: true, // worldSafeExecuteJavaScript: true,
nodeIntegration: false, nodeIntegration: false,
spellcheck: false,
autoplayPolicy: 'document-user-activation-required',
enableWebSQL: false,
disableDialogs: true,
webgl: false,
images: false,
preload: path.join(dir, 'renderer/preload.js'), preload: path.join(dir, 'renderer/preload.js'),
}, },
}) })

View File

@ -19,6 +19,7 @@ require('./playList')
require('./data') require('./data')
require('./lyric') require('./lyric')
require('./musicUrl') require('./musicUrl')
require('./systemFonts')
require('./kw_decodeLyric') require('./kw_decodeLyric')

View File

@ -0,0 +1,5 @@
const { mainHandle, NAMES: { mainWindow: ipcMainWindowNames } } = require('@common/ipc')
const { getFonts } = require('@main/utils/fontManage')
mainHandle(ipcMainWindowNames.get_system_fonts, getFonts)

View File

@ -0,0 +1,9 @@
// const { getAvailableFontFamilies } = require('electron-font-manager')
// exports.getAvailableFontFamilies = getAvailableFontFamilies
const fontList = require('font-list')
exports.getFonts = fontList.getFonts

View File

@ -39,6 +39,7 @@ export default {
y: -1, y: -1,
theme: 0, theme: 0,
style: { style: {
font: '',
fontSize: 125, fontSize: 125,
opacity: 80, opacity: 80,
isZoomActiveLrc: true, isZoomActiveLrc: true,

View File

@ -21,6 +21,7 @@ export default {
default() { default() {
return { return {
style: { style: {
font: '',
fontSize: 125, fontSize: 125,
opacity: 80, opacity: 80,
isZoomActiveLrc: true, isZoomActiveLrc: true,
@ -77,6 +78,7 @@ export default {
computed: { computed: {
lrcStyles() { lrcStyles() {
return { return {
fontFamily: this.lrcConfig.style.font,
fontSize: this.lrcConfig.style.fontSize / 100 + 'rem', fontSize: this.lrcConfig.style.fontSize / 100 + 'rem',
opacity: this.lrcConfig.style.opacity / 100, opacity: this.lrcConfig.style.opacity / 100,
} }

View File

@ -123,6 +123,7 @@ export default {
setting: { setting: {
handler(n, o) { handler(n, o) {
saveSetting(n) saveSetting(n)
global.appSetting = n
}, },
deep: true, deep: true,
}, },
@ -287,7 +288,7 @@ export default {
}) })
rendererOn(NAMES.mainWindow.set_config, (event, config) => { rendererOn(NAMES.mainWindow.set_config, (event, config) => {
console.log(config) // console.log(config)
// this.setDesktopLyricConfig(config) // this.setDesktopLyricConfig(config)
// console.log('set_config', JSON.stringify(this.setting) === JSON.stringify(config)) // console.log('set_config', JSON.stringify(this.setting) === JSON.stringify(config))
this.setSetting(Object.assign({}, this.setting, config)) this.setSetting(Object.assign({}, this.setting, config))

View File

@ -268,7 +268,7 @@ export default {
'setting.player.togglePlayMethod'(n) { 'setting.player.togglePlayMethod'(n) {
audio.loop = n === 'singleLoop' audio.loop = n === 'singleLoop'
if (this.playedList.length) this.clearPlayedList() if (this.playedList.length) this.clearPlayedList()
if (n == 'random' && !this.playMusicInfo.isTempPlay) this.setPlayedList(this.playMusicInfo) if (n == 'random' && this.playMusicInfo && !this.playMusicInfo.isTempPlay) this.setPlayedList(this.playMusicInfo)
}, },
'setting.player.isMute'(n) { 'setting.player.isMute'(n) {
audio.muted = n audio.muted = n

View File

@ -9,6 +9,10 @@ div(:class="$style.container")
@keyup.40.prevent="handleKeyDown" @keyup.40.prevent="handleKeyDown"
@keyup.38.prevent="handleKeyUp" @keyup.38.prevent="handleKeyUp"
@contextmenu="handleContextMenu") @contextmenu="handleContextMenu")
transition(enter-active-class="animated zoomIn" leave-active-class="animated zoomOut")
button(type="button" @click="handleClearList" v-show="text")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 24 24' space='preserve')
use(xlink:href='#icon-window-close')
button(type="button" @click="handleSearch") button(type="button" @click="handleSearch")
slot 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') 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')
@ -144,6 +148,11 @@ export default {
this.text = `${this.text.substring(0, dom_input.selectionStart)}${str}${this.text.substring(dom_input.selectionEnd, this.text.length)}` this.text = `${this.text.substring(0, dom_input.selectionStart)}${str}${this.text.substring(dom_input.selectionEnd, this.text.length)}`
this.$emit('input', this.text) this.$emit('input', this.text)
}, },
handleClearList() {
this.text = ''
this.$emit('input', this.text)
this.sendEvent('submit')
},
}, },
} }
</script> </script>
@ -210,14 +219,17 @@ export default {
// background-color: @color-search-form-background; // background-color: @color-search-form-background;
background-color: transparent; background-color: transparent;
outline: none; outline: none;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
cursor: pointer; cursor: pointer;
height: 100%; height: 100%;
padding: 6px 7px; padding: 6px 7px;
color: @color-btn; color: @color-btn;
transition: background-color .2s ease; transition: background-color .2s ease;
&:last-child {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
&:hover { &:hover {
background-color: @color-theme-hover; background-color: @color-theme-hover;
} }

View File

@ -45,8 +45,8 @@ export default {
}, },
computed: { computed: {
label() { label() {
if (!this.value) return '' if (this.value == null) return ''
if (!this.itemName) return this.value if (this.itemName == null) return this.value
const item = this.list.find(l => l[this.itemKey] == this.value) const item = this.list.find(l => l[this.itemKey] == this.value)
if (!item) return '' if (!item) return ''
return item[this.itemName] return item[this.itemName]

View File

@ -25,6 +25,14 @@ eventHub.$on(baseName.bindKey, () => {
// console.log(event, key) // console.log(event, key)
if (!window.isEditingHotKey && appHotKeyConfig.local.enable && appHotKeyConfig.local.keys[key]) { if (!window.isEditingHotKey && appHotKeyConfig.local.enable && appHotKeyConfig.local.keys[key]) {
if (type == 'up') return if (type == 'up') return
// 软件内快捷键的最小化触发时
// 如果已启用托盘,则隐藏程序,否则最小化程序 https://github.com/lyswhut/lx-music-desktop/issues/603
if (appHotKeyConfig.local.keys[key].action == hotKeyNamesCommon.min.action && global.appSetting.tray.isToTray) {
eventHub.$emit(hotKeyNamesCommon.hide_toggle.action)
return
}
eventHub.$emit(appHotKeyConfig.local.keys[key].action) eventHub.$emit(appHotKeyConfig.local.keys[key].action)
return return
} }

View File

@ -4,7 +4,7 @@
"lists_rename": "Rename", "lists_rename": "Rename",
"lists_moveup": "Move Up", "lists_moveup": "Move Up",
"lists_movedown": "Move Down", "lists_movedown": "Move Down",
"lists_sync": "Sync", "lists_sync": "Update",
"lists_remove": "Remove", "lists_remove": "Remove",
"list_play": "Play", "list_play": "Play",
"list_play_later": "Play later", "list_play_later": "Play later",

View File

@ -51,6 +51,8 @@
"desktop_lyric": "Desktop Lyric Settings", "desktop_lyric": "Desktop Lyric Settings",
"desktop_lyric_always_on_top": "Make the lyrics always above other windows", "desktop_lyric_always_on_top": "Make the lyrics always above other windows",
"desktop_lyric_enable": "Display lyrics", "desktop_lyric_enable": "Display lyrics",
"desktop_lyric_font": "Lyric font",
"desktop_lyric_font_default": "Default",
"desktop_lyric_lock": "Lock lyrics", "desktop_lyric_lock": "Lock lyrics",
"desktop_lyric_lock_screen": "It is not allowed to drag the lyrics window out of the main screen", "desktop_lyric_lock_screen": "It is not allowed to drag the lyrics window out of the main screen",
"download": "Download", "download": "Download",
@ -59,6 +61,9 @@
"download_embed_pic": "Embedding cover", "download_embed_pic": "Embedding cover",
"download_enable": "Whether to enable download function", "download_enable": "Whether to enable download function",
"download_lyric": "Lyrics download", "download_lyric": "Lyrics download",
"download_lyric_format": "Downloaded lyrics file encoding format",
"download_lyric_format_gbk": "GBK (Try to select this format when Chinese garbled characters appear on some devices)",
"download_lyric_format_utf8": "UTF-8",
"download_lyric_title": "Select whether to download the lyrics file", "download_lyric_title": "Select whether to download the lyrics file",
"download_name": "Music file naming", "download_name": "Music file naming",
"download_name1": "Title - Artist", "download_name1": "Title - Artist",

View File

@ -4,7 +4,7 @@
"lists_rename": "重命名", "lists_rename": "重命名",
"lists_moveup": "上移", "lists_moveup": "上移",
"lists_movedown": "下移", "lists_movedown": "下移",
"lists_sync": "同步", "lists_sync": "更新",
"lists_remove": "删除", "lists_remove": "删除",
"list_play": "播放", "list_play": "播放",
"list_play_later": "稍后播放", "list_play_later": "稍后播放",

View File

@ -51,6 +51,8 @@
"desktop_lyric": "桌面歌词设置", "desktop_lyric": "桌面歌词设置",
"desktop_lyric_always_on_top": "使歌词总是在其他窗口之上", "desktop_lyric_always_on_top": "使歌词总是在其他窗口之上",
"desktop_lyric_enable": "显示歌词", "desktop_lyric_enable": "显示歌词",
"desktop_lyric_font": "歌词字体",
"desktop_lyric_font_default": "默认",
"desktop_lyric_lock": "锁定歌词", "desktop_lyric_lock": "锁定歌词",
"desktop_lyric_lock_screen": "不允许歌词窗口拖出主屏幕之外", "desktop_lyric_lock_screen": "不允许歌词窗口拖出主屏幕之外",
"download": "下载设置", "download": "下载设置",
@ -59,6 +61,9 @@
"download_embed_pic": "封面嵌入", "download_embed_pic": "封面嵌入",
"download_enable": "是否启用下载功能", "download_enable": "是否启用下载功能",
"download_lyric": "歌词下载", "download_lyric": "歌词下载",
"download_lyric_format": "下载的歌词文件编码格式",
"download_lyric_format_gbk": "GBK在某些设备上出现中文乱码时可尝试选择此格式",
"download_lyric_format_utf8": "UTF-8",
"download_lyric_title": "是否同时下载歌词文件", "download_lyric_title": "是否同时下载歌词文件",
"download_name": "文件命名方式", "download_name": "文件命名方式",
"download_name1": "歌名 - 歌手", "download_name1": "歌名 - 歌手",

View File

@ -4,7 +4,7 @@
"lists_rename": "重命名", "lists_rename": "重命名",
"lists_moveup": "上移", "lists_moveup": "上移",
"lists_movedown": "下移", "lists_movedown": "下移",
"lists_sync": "同步", "lists_sync": "更新",
"lists_remove": "刪除", "lists_remove": "刪除",
"list_play": "播放", "list_play": "播放",
"list_play_later": "稍後播放", "list_play_later": "稍後播放",

View File

@ -51,6 +51,8 @@
"desktop_lyric": "桌面歌詞設置", "desktop_lyric": "桌面歌詞設置",
"desktop_lyric_always_on_top": "使歌詞總是在其他窗口之上", "desktop_lyric_always_on_top": "使歌詞總是在其他窗口之上",
"desktop_lyric_enable": "顯示歌詞", "desktop_lyric_enable": "顯示歌詞",
"desktop_lyric_font": "歌詞字體",
"desktop_lyric_font_default": "默認",
"desktop_lyric_lock": "鎖定歌詞", "desktop_lyric_lock": "鎖定歌詞",
"desktop_lyric_lock_screen": "不允許歌詞窗口拖出主屏幕之外", "desktop_lyric_lock_screen": "不允許歌詞窗口拖出主屏幕之外",
"download": "下載設置", "download": "下載設置",
@ -59,6 +61,9 @@
"download_embed_pic": "封面嵌入", "download_embed_pic": "封面嵌入",
"download_enable": "是否啟用下載功能", "download_enable": "是否啟用下載功能",
"download_lyric": "歌詞下載", "download_lyric": "歌詞下載",
"download_lyric_format": "下載的歌詞文件編碼格式",
"download_lyric_format_gbk": "GBK在某些設備上出現中文亂碼時可嘗試選擇此格式",
"download_lyric_format_utf8": "UTF-8",
"download_lyric_title": "是否同時下載歌詞文件", "download_lyric_title": "是否同時下載歌詞文件",
"download_name": "文件命名方式", "download_name": "文件命名方式",
"download_name1": "歌名 - 歌手", "download_name1": "歌名 - 歌手",

View File

@ -26,6 +26,7 @@ Vue.config.productionTip = false
Vue.config.devtools = process.env.NODE_ENV === 'development' Vue.config.devtools = process.env.NODE_ENV === 'development'
getSetting().then(({ setting, version }) => { getSetting().then(({ setting, version }) => {
global.appSetting = setting
// Set language automatically // Set language automatically
if (!window.i18n.availableLocales.includes(setting.langId)) { if (!window.i18n.availableLocales.includes(setting.langId)) {
let langId = null let langId = null

View File

@ -307,7 +307,7 @@ const saveMeta = function(downloadInfo, filePath, isUseOtherSource, isEmbedPic,
* @param {*} downloadInfo * @param {*} downloadInfo
* @param {*} filePath * @param {*} filePath
*/ */
const downloadLyric = (downloadInfo, filePath) => { const downloadLyric = (downloadInfo, filePath, lrcFormat) => {
const promise = getLyric(downloadInfo.musicInfo).then(lrcInfo => { const promise = getLyric(downloadInfo.musicInfo).then(lrcInfo => {
return lrcInfo.lyric return lrcInfo.lyric
? Promise.resolve({ lyric: lrcInfo.lyric, tlyric: lrcInfo.tlyric || '' }) ? Promise.resolve({ lyric: lrcInfo.lyric, tlyric: lrcInfo.tlyric || '' })
@ -319,7 +319,7 @@ const downloadLyric = (downloadInfo, filePath) => {
promise.then(lrcs => { promise.then(lrcs => {
if (lrcs.lyric) { if (lrcs.lyric) {
lrcs.lyric = fixKgLyric(lrcs.lyric) lrcs.lyric = fixKgLyric(lrcs.lyric)
saveLrc(filePath.replace(/(mp3|flac|ape|wav)$/, 'lrc'), lrcs.lyric) saveLrc(filePath.replace(/(mp3|flac|ape|wav)$/, 'lrc'), lrcs.lyric, lrcFormat)
} }
}) })
} }
@ -436,7 +436,7 @@ const actions = {
dispatch('startTask') dispatch('startTask')
saveMeta.call(_this, downloadInfo, downloadInfo.filePath, rootState.setting.download.isUseOtherSource, rootState.setting.download.isEmbedPic, rootState.setting.download.isEmbedLyric) saveMeta.call(_this, downloadInfo, downloadInfo.filePath, rootState.setting.download.isUseOtherSource, rootState.setting.download.isEmbedPic, rootState.setting.download.isEmbedLyric)
if (rootState.setting.download.isDownloadLrc) downloadLyric(downloadInfo, downloadInfo.filePath) if (rootState.setting.download.isDownloadLrc) downloadLyric(downloadInfo, downloadInfo.filePath, rootState.setting.download.lrcFormat)
console.log('on complate') console.log('on complate')
}, },
onError(err) { onError(err) {

View File

@ -82,20 +82,29 @@ const mutations = {
setSyncListData(state, { defaultList, loveList, userList }) { setSyncListData(state, { defaultList, loveList, userList }) {
state.defaultList.list.splice(0, state.defaultList.list.length, ...defaultList.list) state.defaultList.list.splice(0, state.defaultList.list.length, ...defaultList.list)
state.loveList.list.splice(0, state.loveList.list.length, ...loveList.list) state.loveList.list.splice(0, state.loveList.list.length, ...loveList.list)
for (let index = 0; index < userList.length; index++) {
const list = userList[index]
const targetList = allList[list.id]
if (targetList) {
userList.splice(index, 1, targetList)
targetList.name = list.name
targetList.list.splice(0, targetList.list.length, ...list.list)
}
}
console.log()
state.userList = userList state.userList = userList
allListInit(state.defaultList, state.loveList, state.userList) allListInit(state.defaultList, state.loveList, state.userList)
}, },
setList(state, { id, list, name, location, source, sourceListId, isSync }) { setList(state, { id, list, name, location, source, sourceListId, isSync }) {
if (!isSync) {
window.eventHub.$emit(eventSyncName.send_action_list, {
action: 'set_list',
data: { id, list, name, location, source, sourceListId },
})
}
const targetList = allList[id] const targetList = allList[id]
if (targetList) { if (targetList) {
if (name && targetList.name === name) { if (name && targetList.name === name) {
if (!isSync) {
window.eventHub.$emit(eventSyncName.send_action_list, {
action: 'set_list',
data: { id, list, name, location, source, sourceListId },
})
}
targetList.list.splice(0, targetList.list.length, ...list) targetList.list.splice(0, targetList.list.length, ...list)
targetList.location = location targetList.location = location
return return
@ -103,6 +112,12 @@ const mutations = {
id += '_' + Math.random() id += '_' + Math.random()
} }
if (!isSync) {
window.eventHub.$emit(eventSyncName.send_action_list, {
action: 'set_list',
data: { id, list, name, location, source, sourceListId },
})
}
let newList = { let newList = {
name, name,
id, id,

View File

@ -3,6 +3,7 @@ import path from 'path'
import { shell, clipboard } from 'electron' import { shell, clipboard } from 'electron'
import crypto from 'crypto' import crypto from 'crypto'
import { rendererSend, rendererInvoke, NAMES } from '../../common/ipc' import { rendererSend, rendererInvoke, NAMES } from '../../common/ipc'
import iconv from 'iconv-lite'
/** /**
* 获取两个数之间的随机整数大于等于min小于max * 获取两个数之间的随机整数大于等于min小于max
@ -276,11 +277,22 @@ export const setMeta = (filePath, meta) => {
* 保存歌词文件 * 保存歌词文件
* @param {*} filePath * @param {*} filePath
* @param {*} lrc * @param {*} lrc
* @param {*} format
*/ */
export const saveLrc = (filePath, lrc) => { export const saveLrc = (filePath, lrc, format) => {
fs.writeFile(filePath, lrc, 'utf8', err => { switch (format) {
if (err) console.log(err) case 'gbk':
}) fs.writeFile(filePath, iconv.encode(lrc, 'gbk', { addBOM: true }), err => {
if (err) console.log(err)
})
break
case 'utf8':
default:
fs.writeFile(filePath, lrc, 'utf8', err => {
if (err) console.log(err)
})
break
}
} }
/** /**

View File

@ -26,7 +26,7 @@ export default {
// https://y.qq.com/n/yqq/playlist/7217720898.html // https://y.qq.com/n/yqq/playlist/7217720898.html
// https://i.y.qq.com/n2/m/share/details/taoge.html?platform=11&appshare=android_qq&appversion=9050006&id=7217720898&ADTAG=qfshare // https://i.y.qq.com/n2/m/share/details/taoge.html?platform=11&appshare=android_qq&appversion=9050006&id=7217720898&ADTAG=qfshare
listDetailLink1: /^.+(?:\?|&)id=(\d+)(?:&.*$|#.*$|$)/, listDetailLink1: /^.+(?:(?:\?|&)id=|ryqq\/playlist\/)(\d+)(?:&.*$|#.*$|$)/,
listDetailLink2: /^.+\/(\d+)\.html(?:\?.*|&.*$|#.*$|$)/, listDetailLink2: /^.+\/(\d+)\.html(?:\?.*|&.*$|#.*$|$)/,
}, },
tagsUrl: 'https://u.y.qq.com/cgi-bin/musicu.fcg?loginUin=0&hostUin=0&format=json&inCharset=utf-8&outCharset=utf-8&notice=0&platform=wk_v15.json&needNewCode=0&data=%7B%22tags%22%3A%7B%22method%22%3A%22get_all_categories%22%2C%22param%22%3A%7B%22qq%22%3A%22%22%7D%2C%22module%22%3A%22playlist.PlaylistAllCategoriesServer%22%7D%7D', tagsUrl: 'https://u.y.qq.com/cgi-bin/musicu.fcg?loginUin=0&hostUin=0&format=json&inCharset=utf-8&outCharset=utf-8&notice=0&platform=wk_v15.json&needNewCode=0&data=%7B%22tags%22%3A%7B%22method%22%3A%22get_all_categories%22%2C%22param%22%3A%7B%22qq%22%3A%22%22%7D%2C%22module%22%3A%22playlist.PlaylistAllCategoriesServer%22%7D%7D',

View File

@ -17,6 +17,7 @@ export default {
limit_list: 30, limit_list: 30,
limit_song: 100000, limit_song: 100000,
successCode: 200, successCode: 200,
cookie: 'MUSIC_U=',
sortList: [ sortList: [
{ {
name: '最热', name: '最热',
@ -63,6 +64,11 @@ export default {
if (this._requestObj_listDetail) this._requestObj_listDetail.cancelHttp() if (this._requestObj_listDetail) this._requestObj_listDetail.cancelHttp()
if (tryNum > 2) return Promise.reject(new Error('try max num')) if (tryNum > 2) return Promise.reject(new Error('try max num'))
if (/###/.test(id)) {
const [url, token] = id.split('###')
id = url
this.cookie = `MUSIC_U=${token}`
}
if ((/[?&:/]/.test(id))) { if ((/[?&:/]/.test(id))) {
if (this.regExps.listDetailLink.test(id)) { if (this.regExps.listDetailLink.test(id)) {
id = id.replace(this.regExps.listDetailLink, '$1') id = id.replace(this.regExps.listDetailLink, '$1')
@ -76,7 +82,10 @@ export default {
this._requestObj_listDetail = httpFetch('https://music.163.com/api/linux/forward', { this._requestObj_listDetail = httpFetch('https://music.163.com/api/linux/forward', {
method: 'post', method: 'post',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36', headers: {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
Cookie: this.cookie,
},
form: linuxapi({ form: linuxapi({
method: 'POST', method: 'POST',
url: 'https://music.163.com/api/v3/playlist/detail', url: 'https://music.163.com/api/v3/playlist/detail',

View File

@ -91,6 +91,10 @@ div(:class="$style.main")
material-checkbox(id="setting_desktop_lyric_alwaysOnTop" v-model="current_setting.desktopLyric.isAlwaysOnTop" :label="$t('view.setting.desktop_lyric_always_on_top')") material-checkbox(id="setting_desktop_lyric_alwaysOnTop" v-model="current_setting.desktopLyric.isAlwaysOnTop" :label="$t('view.setting.desktop_lyric_always_on_top')")
div(:class="$style.gapTop") div(:class="$style.gapTop")
material-checkbox(id="setting_desktop_lyric_lockScreen" v-model="current_setting.desktopLyric.isLockScreen" :label="$t('view.setting.desktop_lyric_lock_screen')") material-checkbox(id="setting_desktop_lyric_lockScreen" v-model="current_setting.desktopLyric.isLockScreen" :label="$t('view.setting.desktop_lyric_lock_screen')")
dd
h3#desktop_lyric_font {{$t('view.setting.desktop_lyric_font')}}
div
material-selection(:list="fontList" :class="$style.gapLeft" v-model="current_setting.desktopLyric.style.font" item-key="id" item-name="label")
dt#search {{$t('view.setting.search')}} dt#search {{$t('view.setting.search')}}
dd dd
@ -130,7 +134,7 @@ div(:class="$style.main")
p p
material-btn(:class="$style.btn" min @click="handleChangeSavePath") {{$t('view.setting.download_path_change_btn')}} material-btn(:class="$style.btn" min @click="handleChangeSavePath") {{$t('view.setting.download_path_change_btn')}}
dd dd
h3#download_name {{$t('view.setting.download_use_other_source')}} h3#download_use_other_source {{$t('view.setting.download_use_other_source')}}
div div
material-checkbox(id="setting_download_isUseOtherSource" v-model="current_setting.download.isUseOtherSource" :label="$t('view.setting.is_enable')") material-checkbox(id="setting_download_isUseOtherSource" v-model="current_setting.download.isUseOtherSource" :label="$t('view.setting.is_enable')")
div div
@ -149,6 +153,11 @@ div(:class="$style.main")
h3#download_lyric {{$t('view.setting.download_lyric')}} h3#download_lyric {{$t('view.setting.download_lyric')}}
div div
material-checkbox(id="setting_download_isDownloadLrc" v-model="current_setting.download.isDownloadLrc" :label="$t('view.setting.is_enable')") material-checkbox(id="setting_download_isDownloadLrc" v-model="current_setting.download.isDownloadLrc" :label="$t('view.setting.is_enable')")
dd
h3#download_lyric {{$t('view.setting.download_lyric_format')}}
div
material-checkbox(v-for="item in lrcFormatList" :key="item.id" :class="$style.gapLeft" :id="`setting_download_lrcFormat_${item.id}`"
name="setting_basic_control_btn_position" need v-model="current_setting.download.lrcFormat" :value="item.id" :label="item.name")
dt#sync {{$t('view.setting.sync')}} dt#sync {{$t('view.setting.sync')}}
dd dd
@ -278,6 +287,17 @@ div(:class="$style.main")
| 或到 GitHub 提交&nbsp; | 或到 GitHub 提交&nbsp;
span.hover.underline(:tips="$t('view.setting.click_open')" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/issues')") issue span.hover.underline(:tips="$t('view.setting.click_open')" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/issues')") issue
br
p.small
| 如果你喜欢并经常使用洛雪音乐并想要第一时间尝鲜洛雪的新功能&nbsp;
span(style="text-decoration: line-through;") 当小白鼠
|
p
| 可以加入测试企鹅群&nbsp;
span.hover(:tips="$t('view.setting.click_open')" @click="handleOpenUrl('https://qm.qq.com/cgi-bin/qm/qr?k=zR6aYosQoKb07g4FGFZdO9n9zL1dhFpE&jump_from=webapi')") 768786588
| &nbsp;注意测试版的功可能会不稳定
strong 打算潜水的勿加
br br
p.small 由于软件开发的初衷仅是为了对新技术的学习与研究因此软件直至停止维护都将会一直保持纯净 p.small 由于软件开发的初衷仅是为了对新技术的学习与研究因此软件直至停止维护都将会一直保持纯净
@ -413,6 +433,18 @@ export default {
}, },
] ]
}, },
lrcFormatList() {
return [
{
name: this.$t('view.setting.download_lyric_format_utf8'),
id: 'utf8',
},
{
name: this.$t('view.setting.download_lyric_format_gbk'),
id: 'gbk',
},
]
},
trayThemeList() { trayThemeList() {
return [ return [
{ {
@ -440,6 +472,9 @@ export default {
? this.sync.status.devices.map(d => `${d.deviceName} (${d.clientId.substring(0, 5)})`).join(', ') ? this.sync.status.devices.map(d => `${d.deviceName} (${d.clientId.substring(0, 5)})`).join(', ')
: '' : ''
}, },
fontList() {
return [{ id: '', label: this.$t('view.setting.desktop_lyric_font_default') }, ...this.systemFontList]
},
}, },
data() { data() {
return { return {
@ -461,6 +496,7 @@ export default {
y: -1, y: -1,
theme: '', theme: '',
style: { style: {
font: '',
fontSize: 125, fontSize: 125,
opacity: 80, opacity: 80,
isZoomActiveLrc: true, isZoomActiveLrc: true,
@ -483,6 +519,7 @@ export default {
savePath: '', savePath: '',
fileName: '歌名 - 歌手', fileName: '歌名 - 歌手',
isDownloadLrc: false, isDownloadLrc: false,
lrcFormat: 'utf8',
isEmbedPic: true, isEmbedPic: true,
isEmbedLyric: true, isEmbedLyric: true,
}, },
@ -651,6 +688,7 @@ export default {
devices: [], devices: [],
}, },
}, },
systemFontList: [],
} }
}, },
watch: { watch: {
@ -724,6 +762,7 @@ export default {
if (!window.currentWindowSizeId) window.currentWindowSizeId = this.setting.windowSizeId if (!window.currentWindowSizeId) window.currentWindowSizeId = this.setting.windowSizeId
// this.initTOC() // this.initTOC()
this.getCacheSize() this.getCacheSize()
this.getSystemFonts()
this.getMediaDevice() this.getMediaDevice()
this.current_hot_key = window.appHotKeyConfig this.current_hot_key = window.appHotKeyConfig
this.initHotKeyConfig() this.initHotKeyConfig()
@ -1232,6 +1271,13 @@ export default {
handleRefreshSyncCode() { handleRefreshSyncCode() {
rendererInvoke(NAMES.mainWindow.sync_generate_code) rendererInvoke(NAMES.mainWindow.sync_generate_code)
}, },
getSystemFonts() {
rendererInvoke(NAMES.mainWindow.get_system_fonts).then(fonts => {
this.systemFontList = fonts.map(f => ({ id: f, label: f.replace(/(^"|"$)/g, '') }))
}).catch(() => {
this.systemFontList = []
})
},
}, },
} }
</script> </script>