diff --git a/.ncurc.js b/.ncurc.js index cb0cc795..290c89ee 100644 --- a/.ncurc.js +++ b/.ncurc.js @@ -2,7 +2,6 @@ module.exports = { upgrade: true, reject: [ 'electron', - 'electron-builder', 'chalk', ], // target: 'newest', diff --git a/CHANGELOG.md b/CHANGELOG.md index b8d55e4a..eafb7a47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,38 @@ Project versioning adheres to [Semantic Versioning](http://semver.org/). Commit convention is based on [Conventional Commits](http://conventionalcommits.org). Change log format is based on [Keep a Changelog](http://keepachangelog.com/). +## [1.18.0](https://github.com/lyswhut/lx-music-desktop/compare/v1.17.1...v1.18.0) - 2022-02-26 + +### 新增 + +- 新增“双击列表里的歌曲时自动切换到当前列表播放”设置,此功能仅对歌单、排行榜有效,默认关闭 +- 新增打开收藏的在线列表的对应平台详情页功能,可以在我的列表-列表右键菜单中使用 +- 新增定时暂停播放功能,由于此功能大多数人可能不常用,所以将其放在设置-基本设置中 +- 新增任务栏缩略图工具栏控制按钮(此功能仅在Windows平台可用),按钮分别为收藏/取消收藏(将歌曲添加到“我的收藏”列表)、上一曲、播放/暂停、下一曲 +- 新增设置-基本设置-软件字体设置,此设置可用于设置主界面的字体(已知的问题:Windows 7 下可能会出现字体列表为空的情况,这是当前系统的 Powershell 版本小于5.1导致的,请自行尝试看常见解决) +- 新增Scheme URL对音乐搜索的调用支持,详情看常见问题-Scheme URL支持 +- 新增Scheme URL以url传参的方式调用,详情看常见问题-Scheme URL支持 +- 自定义源新增更新弹窗方法,同时自定义源管理新增是否允许源显示更新弹窗设置(出于防止滥用考虑),当源作者想要通知用户源已更新时,可以调用此方法弹窗告诉用户,调用说明看常见问题-自定义源部分 + +### 优化 + +- 过滤tx源某些不支持播放的歌曲,解决播放此类内容会导致意外的问题 +- 把歌曲的热门评论与最新评论拆分成两个列表显示 + +### 修复 + +- 修复排行榜名字右击菜单的播放功能在播放非激活的列表时的列表获取问题 +- 修复修改列表名时无法使用`Ctrl`键的问题 +- 修复wy源某些歌曲获取歌词翻译的问题处理 +- 修复下载功能的歌词换源时会进入死循环的问题 +- 修复某些歌曲无法下载的问题 +- 修复windows平台下软件目录存在`portable`文件夹时,仍会创建`C:\Users\\AppData\Roaming\lx-music-desktop\Dictionaries\en-US-9-0.bdic`文件的问题,现在不会再创建文件,但仍会创建空目录(Electron的问题,目前暂无解决方法) +- 修复播放器的停止逻辑问题 + +### 其他 + +- 更新electron到v13.6.9 + ## [1.17.1](https://github.com/lyswhut/lx-music-desktop/compare/v1.17.0...v1.17.1) - 2022-01-28 ### 优化 diff --git a/FAQ.md b/FAQ.md index 7557d5a6..9a2b1685 100644 --- a/FAQ.md +++ b/FAQ.md @@ -6,6 +6,15 @@ 洛雪音乐的最初定位不是作为播放器开发的,它主要用于**查找歌曲**,软件的播放功能仅用于试听,不建议用作为常用播放器使用。 +## LX Music中的音乐播放列表机制 + +1. 默认情况下,播放搜索列表、歌单列表、排行榜列表的歌曲时会自动将该歌曲添加到“我的列表”的试听列表后再播放,手动将歌曲添加到试听列表,再去试听列表找到这首歌点播放是等价的 +2. 如果你想要播放多首歌曲,需要使用多选功能(若不知道如何多选请看常见问题)多选后,将歌曲这些歌曲添加到“我的列表”播放,或使用稍后播放功能播放 +3. 第2条适用于搜索列表、歌单列表、排行榜列表、我的列表中的歌曲 +4. 对于歌单详情列表,除了可以使用第2条的方式播放外,你可以点击详情页上面的播放按钮临时播放当前歌单,或点击收藏将当前歌单收藏到“我的列表”后再去播放 +5. 对于排行榜详情列表,除了可以使用第2条的方式播放外,你可以在右击排行榜名字后弹出的菜单中,播放或收藏整个排行榜,这与第四条的歌单中的播放、与收藏按钮功能一致 +6. v1.18.0及之后新增了“双击列表里的歌曲时自动切换到当前列表播放”设置,默认关闭,此功能仅对歌单、排行榜有效 + ## 歌曲无法试听与下载 ### 所有歌曲都提示 `请求异常😮,可以多试几次,若还是不行就换一首吧。。。` @@ -101,6 +110,9 @@ 需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。 +## 调整我的列表的列表顺序 + +按住Ctrl键(Mac上对应Command键)的时候将进入“拖动模式”,此时可以拖动列表的位置来调整顺序。 ## 同步功能的使用(实验性,首次使用前建议先备份一次列表) @@ -305,16 +317,34 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看上面的 - URL统一以`lxmusic://`开头 - 此技术目前只支持 Windows、Mac系统 -- URL传参以经过URL编码的JSON数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据 - 若无特别说明,源的可用值为:`kw/kg/tx/wy/mg` - 若无特别说明,音质的可用值为:`128k/320k/flac/flac32bit` +目前支持两种传参方式: + +- 通过`data`传参,以经过URL编码的JSON数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据,支持复杂的参数调用 +- 通过`URL`传参,适用于简单传参的调用,不需要转成JSON格式,例:`lxmusic://music/search/xxxx`,但仍然需要对数据进行URL编码,只适应于简单参数调用(v1.18.0新增) + +### `data`方式传参 + +以经过URL编码的JSON数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过URL编码后的JSON数据,JSON数据内容取决于下表的参数部分 + | 描述 | URL | 参数 | --- | --- | --- | 打开歌单 | `songlist/open` | `source`(源,必须)
`id`(歌单ID,可选)
`url`(歌单URL,可选)其中ID与URL必需传一个 | 播放歌单 | `songlist/play` | `source`(源,必须)
`id`(歌单ID,可选)
`url`(歌单URL,可选)其中`id`与`url`必需传一个
`index`(播放第几首歌,可选,从0开始) +| 搜索歌曲 | `music/search` | `keywords`(要搜索的内容,必须)
`source`(源,可选) | 播放歌曲 | `music/play` | `name`(歌曲名,必传)
`singer`(艺术家名,必传)
`source`(源,必传)
`songmid`(歌曲ID,必传)
`img`(歌曲图片链接,选传)
`albumId`(歌曲专辑ID,选传)
`interval`(格式化后的歌曲时长,选传,例:`03:55`)
`albumName`(歌曲专辑名称,选传)
`types`(歌曲可用音质数组,必传,
数组格式:`[{"type": "<音质>", size: "<格式化后的文件大小,选传>", hash: ""}]`,
例:`[{"type": "128k", size: "3.56M"}, {"type": "320k", size: null}]`)

以下为平台特定参数:
`hash`(歌曲hash,kg源必传)
`strMediaMid`(歌曲strMediaMid,tx源必传)
`albumMid`(歌曲albumMid,tx源专用,选传)
`copyrightId`(歌曲copyrightId,mg源必传)
`lrcUrl`(歌曲lrcUrl,mg源专用,选传) +### `URL`方式传参 + +由于URL传参只适用于简单传参场景,所以目前只支持以下功能的调用: + +| 描述 | URL | 参数 +| --- | --- | --- +| 搜索歌曲 | `music/search/{source}/{keywords}` | `source`(源,可选)
`keywords`(要搜索的内容,必须)
例:`music/search/kw/xxx`、`music/search/xxx` +| 打开歌单 | `songlist/open/{source}/{id/url}` | `source`(源,必须)
`id/url`(歌单ID或歌单URL,必须)
例:`songlist/open/kw/123456` + ## 自定义源脚本编写说明 文件请使用UTF-8编码格式编写,脚本所用编程语言为JavaScript,可以使用ES6+语法,脚本与应用的交互是使用类似事件收发的方式进行,这是一个基本的脚本例子: @@ -427,6 +457,7 @@ send(EVENT_NAMES.inited, { | --- | --- | `inited` | 脚本初始化完成后发送给应用的事件名,发送该事件时需要传入以下信息:`{status, sources, openDevTools}`
`status`:初始化结果(`true`成功,`false`失败)
`openDevTools`:是否打开DevTools,此选项可用于开发脚本时的调试
`sources`:支持的源信息对象,
`sources[kw/kg/tx/wy/mg].name`:源的名字(目前非必须)
`sources[kw/kg/tx/wy/mg].type`:源类型,目前固定值需为`music`
`sources[kw/kg/tx/wy/mg].actions`:支持的actions,由于目前只支持`musicUrl`,所以固定传`['musicUrl']`即可
`sources[kw/kg/tx/wy/mg].qualitys`:该源支持的音质列表,有效的值为`['128k', '320k', 'flac']`,该字段用于控制应用可用的音质类型 | `request` | 应用API请求事件名,回调入参:`handler({ source, action, info})`,回调必须返回`Promise`对象
`source`:音乐源,可能的值取决于初始化时传入的`sources`对象的源key值
`info`:请求附加信息,内容根据`action`变化
`action`:请求操作类型,目前只有`musicUrl`,即获取音乐URL链接,需要在 Promise 返回歌曲 url,`info`的结构:`{type, musicInfo}`,`info.type`:音乐质量,可能的值有`128k` / `320k` / `flac`(取决于初始化时对应源传入的`qualitys`值中的一个),`info.musicInfo`:音乐信息对象,里面有音乐ID、名字等信息 +| `updateAlert` | 显示源更新弹窗,发送该事件时的参数:`{log, updateUrl}`
`log`:更新日志,必传,字符串类型,内容可以使用`\n`换行,最大长度1024,超过此长度后将被截取超出的部分
`updateUrl`:更新地址,用于引导用户去该地址更新源,选传,需为http协议的url地址,最大长度1024
此事件每次运行脚本只能调用一次(源版本v1.2.0新增)
例子:`lx.send(lx.EVENT_NAMES.updateAlert, { log: 'hello world', updateUrl: 'https://xxx.com' })` #### `window.lx.on` diff --git a/README.md b/README.md index f3d8d4f1..f8a9dcc1 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ 软件变化请查看:[更新日志](https://github.com/lyswhut/lx-music-desktop/blob/master/CHANGELOG.md)
软件下载请转到:[发布页面](https://github.com/lyswhut/lx-music-desktop/releases)
或者到网盘下载(网盘内有MAC、windows版):`https://www.lanzoui.com/b0bf2cfa/` 密码:`glqw`(若链接无法打开请百度:蓝奏云链接打不开)
-使用常见问题请转至:[常见问题](https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md) +使用常见问题请转至:[常见问题](https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md)
+移动版项目地址: #### Scheme URL支持 diff --git a/package-lock.json b/package-lock.json index 69dc40d0..c39654eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.17.0", + "version": "1.18.0-beta4", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -10,6 +10,15 @@ "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", "dev": true }, + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -26,26 +35,26 @@ "dev": true }, "@babel/core": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", - "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "version": "7.17.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", + "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", "dev": true, "requires": { + "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", + "@babel/generator": "^7.17.3", "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.12", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.3", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "dependencies": { "@babel/code-frame": { @@ -57,6 +66,17 @@ "@babel/highlight": "^7.16.7" } }, + "@babel/generator": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", + "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", @@ -75,15 +95,33 @@ } }, "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", "dev": true }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -104,9 +142,9 @@ } }, "@babel/eslint-parser": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", - "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", + "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", "dev": true, "requires": { "eslint-scope": "^5.1.1", @@ -1016,31 +1054,97 @@ } }, "@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", + "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", + "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } } } }, @@ -2017,9 +2121,9 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", - "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", + "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.16.7", @@ -2541,14 +2645,14 @@ } }, "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.0.tgz", + "integrity": "sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -2579,9 +2683,9 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -2608,9 +2712,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2625,30 +2729,30 @@ "dev": true }, "@intlify/core-base": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.29.tgz", - "integrity": "sha512-4HzfpBC0pBjud26vWXhy+HRrcJR+KsQPpGbIbS/FVbqeUTOX90+RsBC5HOpIVmdeVPpzQUyzKAZdj+hkTQYQ3Q==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.30.tgz", + "integrity": "sha512-tnOuI8gs4S7vv4WjG8oFL7vbZ4PM7Is/Ld3lRHQlBO7UjpnCVcQ94AgP/4F0cUPFn9JSPMQRN0aOOahW1BXvSA==", "requires": { - "@intlify/devtools-if": "9.2.0-beta.29", - "@intlify/message-compiler": "9.2.0-beta.29", - "@intlify/shared": "9.2.0-beta.29", - "@intlify/vue-devtools": "9.2.0-beta.29" + "@intlify/devtools-if": "9.2.0-beta.30", + "@intlify/message-compiler": "9.2.0-beta.30", + "@intlify/shared": "9.2.0-beta.30", + "@intlify/vue-devtools": "9.2.0-beta.30" } }, "@intlify/devtools-if": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.29.tgz", - "integrity": "sha512-AEF+K/VYTR1FkakCi8ZQOARcla2wOdX4khS5X4zEcUwl06VSaN0ilBnLX4727zcVU5jh8YkOM0uERLLyf2lxeg==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.30.tgz", + "integrity": "sha512-3OxGFi6ooya9DFqX/JsxFjrj9nGYcDoo4CRGYSDqnC+xv4bnsyB5ekmaYBiVZtagCdZdSUMxbTFphl1WbtgNLQ==", "requires": { - "@intlify/shared": "9.2.0-beta.29" + "@intlify/shared": "9.2.0-beta.30" } }, "@intlify/message-compiler": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.29.tgz", - "integrity": "sha512-FvMDwe57VvupujvNYUY90J8wv26wKu6j7I93dLwBOo/PTg7nQqFrmYQAF23UfDAdXO4FTdgHfFyb5ecYrN+n3g==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.30.tgz", + "integrity": "sha512-2kj/0nLIFrgiO86f9VifcUUcV8LdzXt4YYPIujx/LkTEQOuSFUo/bNiMaG1hyfiU/8mfq6tsaWKjoOZjeao1eQ==", "requires": { - "@intlify/shared": "9.2.0-beta.29", + "@intlify/shared": "9.2.0-beta.30", "source-map": "0.6.1" }, "dependencies": { @@ -2660,17 +2764,39 @@ } }, "@intlify/shared": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.29.tgz", - "integrity": "sha512-blMW14WBr3fiCEk/XO4IbSxM8WMAhQOzEgWzP1aqbkeXbIMiHeyFI0ZexwyTKsvDZz0wEWlhupQi+9udrJsozA==" + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.30.tgz", + "integrity": "sha512-E1WHRTIlUEse3d/6t1pAagSXRxmeVeNIhx5kT80dfpYxw8lOnCWV9wLve2bq9Fkv+3TD2I5j+CdN7jvSl3LdsA==" }, "@intlify/vue-devtools": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.29.tgz", - "integrity": "sha512-VkeSxU4RLiY89MT5POET+szYJbfmRG1rR2Ndw7Rgqgl7UqiL4ayTdT/VN6I9lw41nK98deK0QXv/FqWmUOyJGg==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.30.tgz", + "integrity": "sha512-hcqDfwP/oXVmVCaJ0RA+uv1WSCcd42/Y13S0bySmWZv2KamLcxiD7wYxp/MaECG/D4KZcSLkq/wDHTG7lhYf5Q==", "requires": { - "@intlify/core-base": "9.2.0-beta.29", - "@intlify/shared": "9.2.0-beta.29" + "@intlify/core-base": "9.2.0-beta.30", + "@intlify/shared": "9.2.0-beta.30" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@malept/cross-spawn-promise": { @@ -3053,20 +3179,20 @@ "dev": true }, "@vue/compiler-core": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.29.tgz", - "integrity": "sha512-RePZ/J4Ub3sb7atQw6V6Rez+/5LCRHGFlSetT3N4VMrejqJnNPXKUt5AVm/9F5MJriy2w/VudEIvgscCfCWqxw==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz", + "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==", "requires": { "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.29", + "@vue/shared": "3.2.31", "estree-walker": "^2.0.2", "source-map": "^0.6.1" }, "dependencies": { "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==" }, "source-map": { "version": "0.6.1", @@ -3076,25 +3202,25 @@ } }, "@vue/compiler-dom": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.29.tgz", - "integrity": "sha512-y26vK5khdNS9L3ckvkqJk/78qXwWb75Ci8iYLb67AkJuIgyKhIOcR1E8RIt4mswlVCIeI9gQ+fmtdhaiTAtrBQ==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz", + "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==", "requires": { - "@vue/compiler-core": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/compiler-sfc": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.29.tgz", - "integrity": "sha512-X9+0dwsag2u6hSOP/XsMYqFti/edvYvxamgBgCcbSYuXx1xLZN+dS/GvQKM4AgGS4djqo0jQvWfIXdfZ2ET68g==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz", + "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.29", - "@vue/compiler-dom": "3.2.29", - "@vue/compiler-ssr": "3.2.29", - "@vue/reactivity-transform": "3.2.29", - "@vue/shared": "3.2.29", + "@vue/compiler-core": "3.2.31", + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-ssr": "3.2.31", + "@vue/reactivity-transform": "3.2.31", + "@vue/shared": "3.2.31", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", @@ -3102,9 +3228,9 @@ }, "dependencies": { "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==" }, "source-map": { "version": "0.6.1", @@ -3114,12 +3240,12 @@ } }, "@vue/compiler-ssr": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.29.tgz", - "integrity": "sha512-LrvQwXlx66uWsB9/VydaaqEpae9xtmlUkeSKF6aPDbzx8M1h7ukxaPjNCAXuFd3fUHblcri8k42lfimHfzMICA==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz", + "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==", "requires": { - "@vue/compiler-dom": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/compiler-dom": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/devtools-api": { @@ -3128,64 +3254,64 @@ "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" }, "@vue/reactivity": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.29.tgz", - "integrity": "sha512-Ryhb6Gy62YolKXH1gv42pEqwx7zs3n8gacRVZICSgjQz8Qr8QeCcFygBKYfJm3o1SccR7U+bVBQDWZGOyG1k4g==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz", + "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==", "requires": { - "@vue/shared": "3.2.29" + "@vue/shared": "3.2.31" } }, "@vue/reactivity-transform": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.29.tgz", - "integrity": "sha512-YF6HdOuhdOw6KyRm59+3rML8USb9o8mYM1q+SH0G41K3/q/G7uhPnHGKvspzceD7h9J3VR1waOQ93CUZj7J7OA==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz", + "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==", "requires": { "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.29", - "@vue/shared": "3.2.29", + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" }, "dependencies": { "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", + "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==" } } }, "@vue/runtime-core": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.29.tgz", - "integrity": "sha512-VMvQuLdzoTGmCwIKTKVwKmIL0qcODIqe74JtK1pVr5lnaE0l25hopodmPag3RcnIcIXe+Ye3B2olRCn7fTCgig==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz", + "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==", "requires": { - "@vue/reactivity": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/reactivity": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/runtime-dom": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.29.tgz", - "integrity": "sha512-YJgLQLwr+SQyORzTsBQLL5TT/5UiV83tEotqjL7F9aFDIQdFBTCwpkCFvX9jqwHoyi9sJqM9XtTrMcc8z/OjPA==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz", + "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==", "requires": { - "@vue/runtime-core": "3.2.29", - "@vue/shared": "3.2.29", + "@vue/runtime-core": "3.2.31", + "@vue/shared": "3.2.31", "csstype": "^2.6.8" } }, "@vue/server-renderer": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.29.tgz", - "integrity": "sha512-lpiYx7ciV7rWfJ0tPkoSOlLmwqBZ9FTmQm33S+T4g0j1fO/LmhJ9b9Ctl1o5xvIFVDk9QkSUWANZn7H2pXuxVw==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz", + "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==", "requires": { - "@vue/compiler-ssr": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/compiler-ssr": "3.2.31", + "@vue/shared": "3.2.31" } }, "@vue/shared": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.29.tgz", - "integrity": "sha512-BjNpU8OK6Z0LVzGUppEk0CMYm/hKDnZfYdjSmPOs0N+TR1cLKJAkDwW8ASZUvaaSLEi6d3hVM7jnWnX+6yWnHw==" + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz", + "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==" }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -3461,6 +3587,12 @@ "string-width": "^4.1.0" } }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -4488,16 +4620,24 @@ } }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", + "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", + "dev": true + } } }, "buffer": { @@ -4932,9 +5072,9 @@ } }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -5527,9 +5667,9 @@ "dev": true }, "copy-webpack-plugin": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", - "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", "dev": true, "requires": { "fast-glob": "^3.2.7", @@ -5547,9 +5687,9 @@ "dev": true }, "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5664,9 +5804,9 @@ } }, "core-js": { - "version": "3.20.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", - "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", + "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==", "dev": true }, "core-js-compat": { @@ -5765,21 +5905,27 @@ } }, "css-loader": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", - "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.6.0.tgz", + "integrity": "sha512-FK7H2lisOixPT406s5gZM1S3l8GrfhEBT3ZiL2UX1Ng1XWs0y2GPllz/OTyvbaHe12VgQrIXIzuEGVlbUhodqg==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.2.15", + "postcss": "^8.4.5", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", + "postcss-value-parser": "^4.2.0", "semver": "^7.3.5" }, "dependencies": { + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -6426,9 +6572,9 @@ } }, "electron": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.8.tgz", - "integrity": "sha512-e1wEPTzbPXwUlIdayqeTHYeq+HHPx0X2zZZfjnzD1H5EujmPvOg84TBw7meNctk9d/yLz+GTRySydUNS9ZdY9A==", + "version": "13.6.9", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.9.tgz", + "integrity": "sha512-Es/sBy85NIuqsO9MW41PUCpwIkeinlTQ7g0ainfnmRAM2rmog3GBxVCaoV5dzEjwTF7TKG1Yr/E7Z3qHmlfWAg==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -6437,9 +6583,9 @@ }, "dependencies": { "@types/node": { - "version": "14.18.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.9.tgz", - "integrity": "sha512-j11XSuRuAlft6vLDEX4RvhqC0KxNxx6QIyMXNb0vHHSNPXTPeiy3algESWmOOIzEtiEL0qiowPU3ewW9hHVa7Q==", + "version": "14.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", + "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", "dev": true } } @@ -6631,9 +6777,9 @@ } }, "electron-log": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.5.tgz", - "integrity": "sha512-Cfa2CKnwBhlUfIl/qr2GF5SCqfoA9yPBqTJ6/wPs+PEn36M2+EZ3RpGSaOhYQ1BZpolL1CWyeu3gMG8epLl3Ng==" + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.6.tgz", + "integrity": "sha512-nirYgRdY+F+vclr8ijdwy2vW03IzFpDHTaKNWu76dEN21Y76+smcES5knS7cgHUUB0qNLOi8vZO36taakjbSXA==" }, "electron-publish": { "version": "22.11.7", @@ -6769,9 +6915,9 @@ } }, "electron-to-chromium": { - "version": "1.4.56", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz", - "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==", + "version": "1.4.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.73.tgz", + "integrity": "sha512-RlCffXkE/LliqfA5m29+dVDPB2r72y2D2egMMfIy3Le8ODrxjuZNVo4NIC2yPL01N4xb4nZQLwzi6Z5tGIGLnA==", "dev": true }, "electron-updater": { @@ -6894,9 +7040,9 @@ } }, "enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz", + "integrity": "sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -7051,12 +7197,12 @@ "dev": true }, "eslint": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", - "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.10.0.tgz", + "integrity": "sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.2.0", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -7064,10 +7210,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7115,9 +7261,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -7125,9 +7271,15 @@ } }, "eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "fast-deep-equal": { @@ -7137,9 +7289,9 @@ "dev": true }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.12.1", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", + "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -7513,9 +7665,9 @@ "dev": true }, "eslint-plugin-vue": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.4.0.tgz", - "integrity": "sha512-Ga96QRG8GA9AyzKtEDxqYRCMt/VJM4SLkcNmm4FvUiFBE4jpaBr25unRBi9iVmHLYhA9EZ/4I+jD8n1vfWzyAA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.5.0.tgz", + "integrity": "sha512-i1uHCTAKOoEj12RDvdtONWrGzjFm/djkzqfhmQ0d6M/W8KM81mhswd/z+iTZ0jCpdUedW3YRgcVfQ37/J4zoYQ==", "dev": true, "requires": { "eslint-utils": "^3.0.0", @@ -7543,14 +7695,6 @@ "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } } }, "eslint-utils": { @@ -7643,14 +7787,14 @@ } }, "espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "requires": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "eslint-visitor-keys": "^3.3.0" }, "dependencies": { "acorn": { @@ -7660,9 +7804,9 @@ "dev": true }, "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true } } @@ -7674,6 +7818,14 @@ "dev": true, "requires": { "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "esrecurse": { @@ -7683,12 +7835,20 @@ "dev": true, "requires": { "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "estree-walker": { @@ -8321,9 +8481,9 @@ } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "flatten": { @@ -8941,12 +9101,12 @@ } }, "http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", + "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", "dev": true, "requires": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -10429,9 +10589,9 @@ "dev": true }, "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" }, "nanomatch": { "version": "1.2.13", @@ -10578,9 +10738,9 @@ } }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, "normalize-path": { @@ -11141,13 +11301,13 @@ "dev": true }, "postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", + "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", "requires": { - "nanoid": "^3.1.30", + "nanoid": "^3.3.1", "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.2" } }, "postcss-calc": { @@ -11389,9 +11549,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -12597,9 +12757,9 @@ } }, "regexp.prototype.flags": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.2.tgz", - "integrity": "sha512-uaro52GSI5be7+ssxjxxnLlleDBN3VHIWQHvBhfeeSXRQkuV/0Jo/hBU+omYH6NUkM+LYpTHnRRf2W/v+x7LzQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -13469,9 +13629,9 @@ "dev": true }, "source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-resolve": { "version": "0.5.3", @@ -14263,12 +14423,12 @@ } }, "terser-webpack-plugin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", - "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "requires": { - "jest-worker": "^27.4.1", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", @@ -14306,9 +14466,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", - "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", + "version": "27.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.0.tgz", + "integrity": "sha512-8OEHiPNOPTfaWnJ2SUHM8fmgeGq37uuGsQBvGKQJl1f+6WIy6g7G3fE2ruI5294bUKUI9FaCWt5hDvO8HSwsSg==", "dev": true, "requires": { "@types/node": "*", @@ -15010,21 +15170,21 @@ "dev": true }, "vue": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.29.tgz", - "integrity": "sha512-cFIwr7LkbtCRanjNvh6r7wp2yUxfxeM2yPpDQpAfaaLIGZSrUmLbNiSze9nhBJt5MrZ68Iqt0O5scwAMEVxF+Q==", + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz", + "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==", "requires": { - "@vue/compiler-dom": "3.2.29", - "@vue/compiler-sfc": "3.2.29", - "@vue/runtime-dom": "3.2.29", - "@vue/server-renderer": "3.2.29", - "@vue/shared": "3.2.29" + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-sfc": "3.2.31", + "@vue/runtime-dom": "3.2.31", + "@vue/server-renderer": "3.2.31", + "@vue/shared": "3.2.31" } }, "vue-eslint-parser": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.2.0.tgz", - "integrity": "sha512-hvl8OVT8imlKk/lQyhkshqwQQChzHETcBd5abiO4ePw7ib7QUZLfW+2TUrJHKUvFOCFRJrDin5KJO9OHzB5bRQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", + "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==", "dev": true, "requires": { "debug": "^4.3.2", @@ -15046,9 +15206,9 @@ } }, "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -15056,9 +15216,15 @@ } }, "eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "semver": { @@ -15073,13 +15239,13 @@ } }, "vue-i18n": { - "version": "9.2.0-beta.29", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.29.tgz", - "integrity": "sha512-Cbs7qwlTXI/B5XjueGFLUYoS7Mh+9ZB3RgV1pQYYHVC1xPVbWDaskOB/YkLiyff2ZdssViX93xQ/KLkcZ3DhFw==", + "version": "9.2.0-beta.30", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.30.tgz", + "integrity": "sha512-5DqrgG9ffgC7j3RRAfViC0WUcdz0C3Ix1qq1AyQItpF7UkSB6iSJGEjBG6KdspbRQq/8t1YzDx4JRXbL05l6ow==", "requires": { - "@intlify/core-base": "9.2.0-beta.29", - "@intlify/shared": "9.2.0-beta.29", - "@intlify/vue-devtools": "9.2.0-beta.29", + "@intlify/core-base": "9.2.0-beta.30", + "@intlify/shared": "9.2.0-beta.30", + "@intlify/vue-devtools": "9.2.0-beta.30", "@vue/devtools-api": "^6.0.0-beta.13" } }, @@ -15153,13 +15319,13 @@ } }, "webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.69.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.69.1.tgz", + "integrity": "sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -15184,6 +15350,12 @@ "webpack-sources": "^3.2.3" }, "dependencies": { + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -15269,13 +15441,13 @@ } }, "webpack-dev-middleware": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", - "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", "dev": true, "requires": { "colorette": "^2.0.10", - "memfs": "^3.2.2", + "memfs": "^3.4.1", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" @@ -15288,9 +15460,9 @@ "dev": true }, "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -15352,19 +15524,20 @@ } }, "webpack-dev-server": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", - "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz", + "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/sockjs": "^0.3.33", "@types/ws": "^8.2.2", "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", @@ -15384,8 +15557,8 @@ "sockjs": "^0.3.21", "spdy": "^4.0.2", "strip-ansi": "^7.0.0", - "webpack-dev-middleware": "^5.3.0", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "dependencies": { "@types/json-schema": { @@ -15395,9 +15568,9 @@ "dev": true }, "ajv": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", - "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -15423,12 +15596,6 @@ } } }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -15680,9 +15847,9 @@ } }, "ws": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.1.tgz", - "integrity": "sha512-6eqQ4yN2y2xv8b+BgbkUzPPyfo/PDl3VOWb06ZE0jIFYwuHMsMQN6F7o84yxJYCblfCRAxzpU59We4Rr4w0Luw==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "dev": true }, "xdg-basedir": { diff --git a/package.json b/package.json index 0a43ccc8..38cd6725 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "1.17.1", + "version": "1.18.0", "description": "一个免费的音乐查找助手", "main": "./dist/electron/main.js", "productName": "lx-music-desktop", @@ -173,32 +173,32 @@ }, "homepage": "https://github.com/lyswhut/lx-music-desktop#readme", "devDependencies": { - "@babel/core": "^7.16.12", - "@babel/eslint-parser": "^7.16.5", + "@babel/core": "^7.17.5", + "@babel/eslint-parser": "^7.17.0", "@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-modules-umd": "^7.16.7", - "@babel/plugin-transform-runtime": "^7.16.10", + "@babel/plugin-transform-runtime": "^7.17.0", "@babel/polyfill": "^7.12.1", "@babel/preset-env": "^7.16.11", "babel-loader": "^8.2.3", "babel-preset-minify": "^0.5.1", - "browserslist": "^4.19.1", + "browserslist": "^4.19.3", "cfonts": "^2.10.0", "chalk": "^4.1.2", "changelog-parser": "^2.8.0", - "copy-webpack-plugin": "^10.2.1", - "core-js": "^3.20.3", + "copy-webpack-plugin": "^10.2.4", + "core-js": "^3.21.1", "cross-env": "^7.0.3", - "css-loader": "^6.5.1", + "css-loader": "^6.6.0", "css-minimizer-webpack-plugin": "^3.4.1", "del": "^6.0.0", - "electron": "^13.6.8", - "electron-builder": "^22.11.7", + "electron": "^13.6.9", + "electron-builder": "^22.14.13", "electron-debug": "^3.2.0", "electron-devtools-installer": "^3.2.0", - "electron-to-chromium": "^1.4.56", - "eslint": "^8.7.0", + "electron-to-chromium": "^1.4.73", + "eslint": "^8.10.0", "eslint-config-standard": "^16.0.3", "eslint-formatter-friendly": "^7.0.0", "eslint-plugin-html": "^6.2.0", @@ -206,7 +206,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.0.0", "eslint-plugin-standard": "^4.1.0", - "eslint-plugin-vue": "^8.4.0", + "eslint-plugin-vue": "^8.5.0", "eslint-webpack-plugin": "^3.1.1", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.5.0", @@ -215,7 +215,7 @@ "markdown-it": "^12.3.2", "mini-css-extract-plugin": "^2.5.3", "node-loader": "^2.0.0", - "postcss": "^8.4.5", + "postcss": "^8.4.7", "postcss-loader": "^6.2.1", "postcss-pxtorem": "^6.0.0", "pug": "^3.0.2", @@ -227,22 +227,22 @@ "svg-sprite-loader": "^6.0.11", "svg-transform-loader": "^2.0.13", "svgo-loader": "^3.0.0", - "terser-webpack-plugin": "^5.3.0", + "terser-webpack-plugin": "^5.3.1", "url-loader": "^4.1.1", "vue-loader": "^17.0.0", "vue-template-compiler": "^2.6.14", - "webpack": "^5.67.0", + "webpack": "^5.69.1", "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.7.3", + "webpack-dev-server": "^4.7.4", "webpack-hot-middleware": "github:lyswhut/webpack-hot-middleware#329c4375134b89d39da23a56a94db651247c74a1", "webpack-merge": "^5.8.0" }, "dependencies": { "bufferutil": "^4.0.6", "crypto-js": "^4.1.1", - "electron-log": "^4.4.5", + "electron-log": "^4.4.6", "electron-store": "^8.0.1", - "electron-updater": "^4.6.1", + "electron-updater": "^4.6.5", "font-list": "github:lyswhut/node-font-list#4edbb1933b49a9bac1eedd63a31da16b487fe57d", "http-terminator": "^3.0.4", "iconv-lite": "^0.6.3", @@ -256,8 +256,8 @@ "socket.io": "^4.4.1", "sortablejs": "^1.14.0", "utf-8-validate": "^5.0.8", - "vue": "^3.2.29", - "vue-i18n": "^9.2.0-beta.29", + "vue": "^3.2.31", + "vue-i18n": "^9.2.0-beta.30", "vue-router": "^4.0.12", "vuex": "^4.0.2" } diff --git a/publish/changeLog.md b/publish/changeLog.md index ac15941d..96ea2948 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,12 +1,29 @@ +### 新增 + +- 新增“双击列表里的歌曲时自动切换到当前列表播放”设置,此功能仅对歌单、排行榜有效,默认关闭 +- 新增打开收藏的在线列表的对应平台详情页功能,可以在我的列表-列表右键菜单中使用 +- 新增定时暂停播放功能,由于此功能大多数人可能不常用,所以将其放在设置-基本设置中 +- 新增任务栏缩略图工具栏控制按钮(此功能仅在Windows平台可用),按钮分别为收藏/取消收藏(将歌曲添加到“我的收藏”列表)、上一曲、播放/暂停、下一曲 +- 新增设置-基本设置-软件字体设置,此设置可用于设置主界面的字体(已知的问题:Windows 7 下可能会出现字体列表为空的情况,这是当前系统的 Powershell 版本小于5.1导致的,请自行尝试看常见解决) +- 新增Scheme URL对音乐搜索的调用支持,详情看常见问题-Scheme URL支持 +- 新增Scheme URL以url传参的方式调用,详情看常见问题-Scheme URL支持 +- 自定义源新增更新弹窗方法,同时自定义源管理新增是否允许源显示更新弹窗设置(出于防止滥用考虑),当源作者想要通知用户源已更新时,可以调用此方法弹窗告诉用户,调用说明看常见问题-自定义源部分 + ### 优化 -- 优化kw源英文与翻译歌词的匹配 +- 过滤tx源某些不支持播放的歌曲,解决播放此类内容会导致意外的问题 +- 把歌曲的热门评论与最新评论拆分成两个列表显示 ### 修复 -- 修复快捷键与默认按键行为冲突的问题,现在若将某些有默认行为的按键(如在列表中上、下箭头、Home、End等键可以使列表滚动)设置为快捷键时,将禁用其默认行为 -- 修复列表的聚焦问题,现在在列表中使用上、下箭头、空格等键滚动列表时不会导致滚动到一定距离后丢失焦点的问题 +- 修复排行榜名字右击菜单的播放功能在播放非激活的列表时的列表获取问题 +- 修复修改列表名时无法使用`Ctrl`键的问题 +- 修复wy源某些歌曲获取歌词翻译的问题处理 +- 修复下载功能的歌词换源时会进入死循环的问题 +- 修复某些歌曲无法下载的问题 +- 修复windows平台下软件目录存在`portable`文件夹时,仍会创建`C:\Users\\AppData\Roaming\lx-music-desktop\Dictionaries\en-US-9-0.bdic`文件的问题,现在不会再创建文件,但仍会创建空目录(Electron的问题,目前暂无解决方法) +- 修复播放器的停止逻辑问题 ### 其他 -- 更新electron到v13.6.8 +- 更新electron到v13.6.9 diff --git a/publish/version.json b/publish/version.json index 3094be15..4b1120bc 100644 --- a/publish/version.json +++ b/publish/version.json @@ -1 +1 @@ -{"version":"1.17.1","desc":"优化\n- 优化kw源英文与翻译歌词的匹配\n\n修复\n- 修复快捷键与默认按键行为冲突的问题,现在若将某些有默认行为的按键(如在列表中上、下箭头、Home、End等键可以使列表滚动)设置为快捷键时,将禁用其默认行为\n- 修复列表的聚焦问题,现在在列表中使用上、下箭头、空格等键滚动列表时不会导致滚动到一定距离后丢失焦点的问题\n\n其他\n- 更新electron到v13.6.8","history":[{"version":"1.17.0","desc":"新增\n- 新增“便携”功能,在Windows平台下,若程序目录下存在 portable 目录,则自动使用此目录作为数据存储目录\n- 新增 Scheme URL 支持,同时发布lx-music-script项目配合使用(一个油猴脚本,可以在浏览器中的官方平台网页直接调用LX Music),Scheme URL的调用说明看Readme.md文档的Scheme URL支持部分\n- 新增启动参数`-proxy-server`与`-proxy-bypass-list`,详细介绍看Readme.md文档的启动参数部分\n- 新增桌面歌词是否延迟滚动设置,默认开启,若你不想要桌面歌词延迟滚动可以去设置-桌面歌词设置关掉\n\n优化\n- 为可视化音频的频谱整体添加频谱均值加成,使频谱显示更有节奏感\n- 优化程序初始化逻辑,修复无网络的情况下的初始化问题\n- 我的列表-列表名的右击菜单更新已收藏的在线列表时,将始终重新加载,不再使用缓存,解决在原平台更新歌单后,在LX点击更新可能看到的还是在原平台更新前的歌单的问题\n\n修复\n- 修复代理不生效的问题\n- 修复`openDevTools`选项无效的问题\n- 修复播放状态的提示问题\n- 修复tx源无搜索结果的问题\n\n其他\n- 更新 Electron 到 v13.6.7"},{"version":"1.16.0","desc":"这算是一个大版本,对主窗口部分的代码逻辑做了较大改动,但由于界面的改动不大,所以没有更新大版本号。\n虽然经过一个月的测试与问题修复,但可能仍然存在未发现的问题,若你发现某些界面异常、某些行为与旧版本存在差异等问题,欢迎反馈!\n另外祝大家元旦快乐~!\n\n新增\n- 播放详情页新增音量控制条\n- 播放详情页新增桌面歌词切换按钮\n- 新增将我的列表保存为TXT、CSV格式,可以去设置-备份与恢复中使用(注意:此类格式的备份目前不支持恢复到LX Music中)\n- 新增根据歌曲名、歌手名等字段对列表自动排序的功能,可以在我的列表右击列表名弹出的菜单中使用\n- 新增将播放与下载的歌词转换为繁体中文选项,默认关闭,可在设置-播放设置中开启\n- 现在已允许进入临时播放列表,即:使用歌单详情页、排行榜名称右键菜单的“播放”按钮播放歌曲时,可右击播放封面进入此临时列表\n- 播放详情页新增音频可视化功能(实验性)\n- 我的列表新增拖动调整位置功能,按住Ctrl键(Mac上对应Command键)的时候将进入“拖动模式”,此时可以拖动列表的位置来调整顺序\n\n优化\n- 优化列表性能,软件整体性能\n- 调整Mac平台下的图标大小\n- 同步功能添加对列表顺序调整的控制,确保手动调整位置后的列表与不同的电脑同步时,列表位置不会被还原\n- 优化歌单详情、排行榜名右键的播放按钮的播放机制,现在不用等待整个列表(多页时)加载完成才能播放了\n- 为播放详情页、桌面歌词添加延迟滚动,播放详情页略微减小已激活歌词的缩放大小及桌面歌词翻译大小\n- 修改右边控制按钮为windows风格\n- 更新了新年皮肤的背景与配色,欢迎体验~\n\n修复\n- 修复kw源某些歌曲的歌词提取异常的问题\n\n变更\n- 现在使用繁体中文语言时将不再自动转换歌词,转换行为将由上面新增的转换开关控制\n\n移除\n- 移除我的列表右键菜单的“上移、下移列表”功能,调整改用新增的拖动功能去调整位置\n\n其他\n- 升级vue到 3.x"},{"version":"1.15.3","desc":"修复\n- 修复设置-控制按钮位置选项与下载歌词编码格式选项命名冲突导致选项显示异常的问题\n- 修复播放下载列表时存在失效的歌曲会导致切歌不准确的问题\n- 修复潜在的音乐加载超时不会切歌的问题\n- 修复因kw源歌词接口停用导致该源歌词获取失败的问题"},{"version":"1.15.2","desc":"其他\n- 降级electron到v13.4.0(这修复了windows 7下播放歌曲时软件会崩溃的问题)"},{"version":"1.15.1","desc":"优化\n- 优化我的列表、下载列表等列表的滚动流畅度\n- 优化下载功能的批量添加、删除、暂停任务时的流畅度,现在进行这些操作应该不会再觉得卡顿了\n- 支持启动软件时恢复播放下载列表里的歌曲\n- 添加媒体播放进度条的信息设置\n\n修复\n- 修复某些情况下获取URL失败时会意外切歌的问题\n- 修复了某些情况下会列表同步失败,导致连接断开无限重连或一直卡在 `syncing...` 的问题\n- 修复列表数据过大导致同步失败的问题\n\n其他\n- 更新electron到v15.3.1(这修复了媒体控制失效的问题)"},{"version":"1.15.0","desc":"新增\n- 添加黑色托盘图标\n- 自定义源新增`version`字段,新增`utils.buffer.bufToString`方法\n\n优化\n- 大幅优化我的列表、下载、歌单、排行榜列表性能,现在即使同一列表内的歌曲很多时也不会卡顿了\n- 优化列表同步代码逻辑\n- 优化开关评论时的动画性能\n- 优化进入、离开播放详情页的性能\n- 兼容桌面歌词以触摸的方式移动、调整大小\n- 调整图标尺寸\n\n修复\n- 修复kg源的歌单链接无法打开的问题\n- 修复同一首歌的URL、歌词等同时需要换源时的处理问题\n\n其他\n- 更新 Electron 到 v15.3.0"},{"version":"1.14.1","desc":"修复\n- 修复我的列表搜索无法搜索小括号、中括号等字符的问题\n- 修复v1.14.0出现的备份与恢复功能备份的数据无法恢复的问题,同时兼容使用v1.14.0导出的存在问题的数据"},{"version":"1.14.0","desc":"新增\n- 新增歌词简体中文转繁体中文,当软件语言被设置为繁体中文后,播放歌曲的歌词也将自动转成繁体中文显示\n- 新增单个列表导入/导出功能,可以方便分享歌曲列表,可在右击“我的列表”里的列表名后弹出的菜单中使用\n- 新增删除列表前的确认弹窗,防止误删列表\n- 新增歌词文本选择复制功能,可在详情页进度条上方的歌词文本选择按钮进入歌词文本选择模式,选择完成后可鼠标右击或者使用系统快捷键复制\n- 新增重复歌曲列表,可以方便移除我的列表中的重复歌曲,此列表会列出目标列表里歌曲名相同的歌曲,可在右击“我的列表”里的列表名后弹出的菜单中使用\n\n修复\n- 修复mg排行榜无法加载的问题\n- 修复点击播放详情页的进度条跳进度时会出现偏移的问题\n- 修复在有提示信息的地方长按鼠标按键时提示信息会闪烁的问题\n- 修复下载歌曲时的歌词下载不尝试获取缓存歌词的问题\n- 修复GNOME等桌面下每次打开应用时需重新设置歌词窗口置顶的问题"},{"version":"1.13.0","desc":"如果你喜欢并经常使用洛雪音乐,并想要第一时间尝鲜洛雪的新功能,可以加入测试企鹅群768786588,\n注意:测试版的功可能会不稳定,打算潜水的勿加。\n\n新增\n- 歌曲搜索框新增清理按钮,点击此按钮可以清理搜索框并返回初始搜索界面\n- 新增“下载的歌词文件编码格式”设置,默认下载的歌词编码仍是`UTF-8`,对于某些在设备(如车机)上出现歌词中文乱码的用户可以尝试选择以`GBK`编码格式保存歌词文件\n- 新增设置-桌面歌词-歌词字体设置,此设置可用于设置桌面歌词的字体(已知的问题:Windows 7 下可能会出现字体列表为空的情况,这是当前系统的 Powershell 版本小于5.1导致的,请自行**尝试**看常见解决)\n\n优化\n- 支持网易源“我喜欢”歌单以注入token的方式打开。由于网易源的“我喜欢”歌单需要登录才能打开(若你看不懂后半句就去阅读 常见问题-无法打开外部歌单),现若想要打开此类歌单,需要在歌单链接后面拼上 `###` 再加上有效的token,拼接格式:`[id|url]###token`,例子(最后面的xxxxxx替换成你的token):`https://music.163.com/#/playlist?id=123456&userid=123456###xxxxxx`\n- 软件内快捷键的最小化触发时,如果已启用托盘,则隐藏程序,否则最小化程序\n\n修复\n- 修复某些情况下同步功能会导致切歌混乱的问题\n- 修复从电脑浏览器复制的企鹅歌单链接无法打开的问题"},{"version":"1.12.2","desc":"修复\n- 修复播放下载列表的歌曲时切歌的问题\n- 修复播放下载列表的歌曲时歌词无法显示的问题\n- 修复下载列表稍后播放功能无效的问题\n- 修复同步服务器启动失败时,关闭同步服务不会清空失败信息的问题"},{"version":"1.12.1","desc":"修复\n- 修复随机播放下无法切歌的问题"},{"version":"1.12.0","desc":"新增\n- 新增局域网同步功能(实验性,首次使用前建议先备份一次列表),此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用问题请看\"常见问题\"。\n\n优化\n- 添加播放器对系统媒体控制与显示的兼容处理,现在在windows下的锁屏界面可以正确显示当前播放的音乐信息及切换歌曲了\n\n修复\n- 修复导入kg歌单最多只能加载100、500首歌曲的问题。注:现在可以加载1000+首歌曲的歌单,但出于未知原因会导致部分歌曲无法加载(可能是无版权导致的),目前酷狗码仍然最多只能加载500首歌\n- 修复某些情况下所显示的歌词、封面图片与当前正在播放的歌曲不一致的问题"},{"version":"1.11.0","desc":"新增\n- 添加 win arm64 架构的安装包构建\n- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”\n\n优化\n- 优化网络请求,尝试去解决无法连接服务器的问题\n- 优化mg源打开歌单的链接兼容\n\n修复\n- 修复mg源搜索失效的问题\n\n移除\n- 因wy源的歌单列表已没有“最新”排序的选项,所以现跟随移除wy源歌单列表按“最新”排序的按钮\n\n变更\n- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌,然后再点击列表的第一首歌,完成倒序选中,最后随便右击列表的任意一首歌,在弹出的菜单中选择调整顺序,在弹出框输入1后确定即可反转列表。\n若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。\n\n其他\n- 更新electron到v13.1.7"},{"version":"1.10.2","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题"},{"version":"1.10.1","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题\n- 修复播放在空的歌单列表点击播放全部时报错的问题"},{"version":"1.10.0","desc":"lx music移动端已经发布了,使用习惯仍跟桌面版一样,不过功能、界面仍比较简单,有兴趣的可以去体检一下,项目地址:\nhttps://github.com/lyswhut/lx-music-mobile#readme\n\n新增\n- 排行榜界面添加播放、收藏整个排行榜功能,可以右击排行榜名字后,在弹出的右键菜单中使用。注:收藏、播放存在分页的排行榜时需等待操作完成后才能切换排行榜,不然会导致操作中断。\n- 新增Mac arm64位dmg包的构建\n\n修复\n- 修复全局快捷键对桌面歌词无效的问题\n- 修复快捷键设置框内的提示问题\n- 修复在当前正常播放的列表中使用稍后播放功能时,播放完后稍后播放的歌曲后不会恢复原来播放位置播放的问题\n- 修复kw部分歌单无法打开的问题\n- 修复wy源的歌曲音质匹配问题\n- 修复mg源歌单标签、排行榜歌曲列表无法加载的问题\n- 修复了一个歌曲下载失败时不会跳过任务的问题\n\n其他\n- 更新 Electron 到 12.0.8"},{"version":"1.9.0","desc":"新增\n- 新增启动参数`-dhmkh`,此参数将禁用Chromium的Hardware Media Key Handling特性,用于解决漫步者部分型号耳机与本程序冲突导致耳机意外关机的问题\n- 新增Windows arm64位免安装版的构建\n- 新增黑色皮肤“黑灯瞎火”,有关于皮肤配色的建议欢迎反馈\n- 新增自动换源下载功能,默认关闭,当无法从歌曲的原始源下载时,将尝试切换到其他源下载,注:此功能不100%保证换源后的歌曲版本与原版一致\n\n优化\n- 程序启动时对数据文件做读取校验,数据出现损坏时自动备份损坏的数据,若出现数据读取错误的弹窗并出现我的列表丢失时可到GitHub或加群反馈\n- 当设置-代理启用,但主机地址为空的时,将不再使用代理配置进行网络连接,并且在离开设置界面时自动禁用代理\n- 优化歌曲自动换源匹配\n- 分离歌词与歌曲列表信息的保存,以减小列表列表文件损坏的几率\n- 兼容打开咪咕移动端分享的歌单链接,添加打开歌单的信息显示\n\n修复\n- 修复备份与恢复功能在恢复数据时某些设置不立即生效的问题\n- 修正设置页“搜索设置”部分内容的缩进显示问题\n- 修复正在播放“稍后播放”的歌曲时,对“稍后播放”前播放的列表进行添加、删除操作会导致切歌的问题"},{"version":"1.8.2","desc":"### 修复\r\n\r\n- 修复歌曲ID存储变更导致酷狗图片获取失败的问题\n- 修复收藏的在线列表id迁移保存出错的问题"},{"version":"1.8.1","desc":"修复\n- 修复歌词翻译的主题颜色适配问题"},{"version":"1.8.0","desc":"新增\n- 新增设置-其他-列表缓存信息清理功能,注:此功能一般情况下不要使用\n- 新增启动参数`-play`,可以在启动软件时播放指定歌单,使用方法看Readme.md的\"启动参数\"部分\n- 新增逐字歌词播放,默认开启,可到设置界面关闭,注:本功能目前仅对酷狗源的歌曲有效\n- 新增自定义源功能,源编写规则可以去常见问题查看\n\n优化\n- 允许播放除了搜索列表以外的所有歌曲,即原来没有播放按钮或者灰色的歌曲都可以去尝试点击播放。注:该功能的原理是尝试自动切换到其他源播放,所以不一定会播放成功,特别是对于那些独家的资源\n- 优化单首歌曲的“添加到列表”弹窗歌曲列表状态的显示;现在在收藏单首歌曲时,若列表存在本歌曲则列表名字将变成灰色不可点击状态。总的来说,在添加单首歌曲时若列表名是灰色,则证明当前歌曲已在那个列表中\n- 将歌词翻译放到原文的下方,同时新增当前播放翻译的高亮功能\n\n移除\n- 移除虾米源。注:虽然已移除该源,但仍可尝试去播放之前添加的歌曲,虽然不一定会成功\n\n修复\n- 修复音乐搜索列表的稍后播放功能无效的问题\n- 修复搜索列表双击不支持播放的源时会导致切歌的问题\n- 修复歌单列表加载失败时无法进入歌单打开界面的问题\n- 修复mg源歌单列表无法加载的问题\n- 修复kg跳转到官方歌曲详情页的歌曲无法播放的问题\n- 修复我的列表的歌曲添加到其他列表时不排除当前列表的问题\n- 修复在下载列表右击未下载完成的歌曲弹出的右击菜单中没有开始下载选项的问题\n\n变更\n- 歌词翻译显示功能修改为默认关闭,注:此变更仅影响首次安装软件的用户\n\n其他\n- 更新electron到v9.4.4"},{"version":"1.7.1","desc":"修复\n- 修复非透明模式下右侧滚动条无法拖动的问题\n- 修复MAC下xm音乐滑块验证问题"},{"version":"1.7.0","desc":"

新增

\n
    \n
  • 搜索界面新增搜索状态的提示
  • \n
  • 新增“稍后播放”功能,可在歌曲列表右键菜单使用
  • \n
  • 新增“记住播放进度”功能的控制,该功能默认不再开启,可到播放设置-记住播放进度开启
  • \n
\n

优化

\n
    \n
  • 优化播放歌曲换源匹配
  • \n
  • 优化设置界面设置项的展示
  • \n
\n

修复

\n
    \n
  • 修复快速切换歌曲时, 会出现播放的歌曲和界面展示的歌曲不一致的问题
  • \n
  • 修复了一个由版本更新日志显示导致的潜在远程代码执行攻击漏洞,该漏洞影响v1.6.1及之前的所有版本,请务必更新到最新版本
  • \n
  • 修复xm搜索源验证问题
  • \n
\n

其他

\n
    \n
  • 更新electron到9.4.2
  • \n
\n"},{"version":"1.6.1","desc":"

优化

\n
    \n
  • 改进自动换源时的歌曲匹配
  • \n
\n

修复

\n
    \n
  • 修复某些情况下自动换源的时间过长时会终止换源自动切歌的问题
  • \n
  • 修复自动换源导致的搜索列表每页变成10条数据的问题
  • \n
  • 降级electron到9.3.3修复部分系统没有声音的问题
  • \n
\n"},{"version":"1.6.0","desc":"

新增

\n
    \n
  • 我的列表右键菜单新增列表排序功能,可调整单曲、多选后的歌曲的顺序。注意:多选排序还将会按照选中歌曲时的顺序排序
  • \n
  • 添加鼠标提示的自动关闭功能,鼠标长时间(目前是10秒)不动时鼠标提示将会自动关闭
  • \n
  • 添加鼠标指向歌曲封面的提示(对于进度条左边的歌曲封面,你可能不知道的操作->右击在“我的列表”定位当前播放的歌曲)
  • \n
  • 隐藏播放详情页按钮添加快速隐藏详情页提示(你可能不知道的操作->在播放详情页内的任意非窗口可拖动区域右键双击可以快速隐藏详情页)
  • \n
  • 添加桌面歌词字体、透明度调整按钮微调提示(你可能不知道的操作->对于字体、透明度可右击微调)
  • \n
  • 我的列表右键菜单添加搜索当前歌曲功能
  • \n
  • 新增-dha参数,添加此启动参数将禁用硬件加速启动(Disable Hardware Acceleration),窗口显示有问题时可以尝试添加此参数启动,Linux系统的界面显示有问题时可尝试添加此参数启动,若不行可尝试添加-dt参数启动
  • \n
  • 新增播放自动换源功能~
  • \n
\n

变更

\n
    \n
  • -nt参数更名为-dt(Disable Transparent),目前原来的-nt参数仍然可用,但将在后续的版本中移除
  • \n
\n

修复

\n
    \n
  • 修复恢复上次播放的歌曲时在随机播放模式下不把恢复播放的歌曲放入已播放队列的问题(该问题会导致随机模式下会导致未播放完整个列表前就会再次随机到该歌曲,以及无法通过上一曲切回该歌曲)
  • \n
  • 修复音乐嵌入的封面在 Mac 系统无法显示的问题
  • \n
  • 修复-dt(原来的-nt)启动参数不真正生效的问题
  • \n
\n"},{"version":"1.5.0","desc":"

新增

\n
    \n
  • 直接从歌单详情收藏的列表新增同步功能。注意:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表
  • \n
\n

优化

\n
    \n
  • 优化软件启动时恢复上一次播放的歌曲进度功能
  • \n
\n

修复

\n
    \n
  • 修复MAC平台上下载歌曲封面嵌入无法显示的问题
  • \n
  • 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题
  • \n
  • 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题
  • \n
  • 修复某些酷狗源歌单链接无法打开的问题
  • \n
\n"},{"version":"1.4.1","desc":"

修复

\n
    \n
  • 修复有歌词翻译与无歌词的音乐间切换会导致歌词翻译残留显示的问题
  • \n
  • 修复歌曲URL过期时,等待刷新URL的自动切换歌曲时间间隔太短的问题
  • \n
  • 修复某些电脑上的某些歌曲没有声音的问题(升级Electron9.3.4导致的,现降级到9.3.3)
  • \n
\n"},{"version":"1.4.0","desc":"

新增

\n
    \n
  • 托盘菜单新增显示、隐藏主界面选项,为Linux、MAC版添加托盘菜单
  • \n
  • 新增播放进度信息保存
  • \n
\n

优化

\n
    \n
  • 移除kg源的歌词文件开头的空白字符串
  • \n
\n

修复

\n
    \n
  • 修复专辑图片无法嵌入的问题
  • \n
  • 修复播放状态栏切换“上一首”歌曲按钮提示错误的问题
  • \n
  • 修复移动单首歌曲时,如果目标列表存在该歌曲,会导致将源列表与目标列表里的目标歌曲移除
  • \n
  • 修复kg源歌曲信息带有单引号等特殊字符被转义的问题
  • \n
\n"},{"version":"1.3.0","desc":"

新增

\n
    \n
  • 播放详情页新增歌曲评论加载显示(某些平台暂不支持显示子评论)
  • \n
\n

优化

\n
    \n
  • 修改播放详情页的歌曲图片的显示效果
  • \n
\n

修复

\n
    \n
  • 修复小芸源音乐搜索结果最多只有20条搜索结果的问题
  • \n
\n"},{"version":"1.2.2","desc":"

修复

\n
    \n
  • 降级 Electron 到 9.x.x 版本修复 Linux 版桌面歌词窗口变白的问题
  • \n
\n"},{"version":"1.2.1","desc":"

优化

\n
    \n
  • Linux版的软件界面默认使用圆角与阴影,顺便修复了桌面歌词窗口变白的问题,已在Ubuntu 18.10测试正常,若显示异常可尝试添加-nt参数启动
  • \n
\n

修复

\n
    \n
  • 修复聚合搜索的分页问题
  • \n
  • 修复代理输入框输入的内容不生效的问题
  • \n
\n"},{"version":"1.2.0","desc":"

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

\n

新增

\n
    \n
  • 播放控制栏开启/关闭桌面歌词按钮 新增右击按钮时锁定/解锁桌面歌词功能
  • \n
\n

优化

\n
    \n
  • 优化我的列表滚动条位置的保存逻辑
  • \n
  • 更新设置-备份与恢复功能的描述
  • \n
  • 优化软件内鼠标悬停的提示界面
  • \n
\n

修复

\n
    \n
  • 修复桌面歌词窗口不允许拖出桌面之外的位置计算偏移Bug
  • \n
  • 修复网易云KTV嗨榜无法加载的问题
  • \n
  • 修复初始化搜索历史列表功能
  • \n
  • 修复重启软件后试听列表与收藏列表无法恢复上次的滚动位置的问题
  • \n
  • 修复歌曲封面无法嵌入的Bug
  • \n
  • 修复酷狗歌词格式问题
  • \n
  • 修复关闭切换动画时从搜索候选列表点击内容无效的问题
  • \n
\n

其他

\n
    \n
  • 更新 Electron 到 v10.1.3
  • \n
\n"},{"version":"1.1.1","desc":"

修复

\n
    \n
  • 修复某些情况下桌面歌词不会播放的问题
  • \n
\n"},{"version":"1.1.0","desc":"

新增

\n
    \n
  • 在歌单详情界面新增播放当前歌单按钮、收藏歌单按钮,注:播放歌单不会将歌曲添加到试听列表
  • \n
  • 新增不允许将歌词窗口拖出主屏幕之外的设置项,默认开启,在连接多个屏幕时想要拖动到其他屏幕时可关闭此设置
  • \n
  • 新增大部分平台的歌词翻译,感谢 @InoriHimea 提供的krc解码算法
  • \n
  • 新增显示歌词翻译设置,默认开启,仅支持某些平台,注:无论该设置是否开启,嵌入或下载歌词时都不会带上翻译
  • \n
  • 新增显示切换动画设置,默认开启,关闭时将基本禁用软件内的所有切换动画
  • \n
  • 播放状态栏新增桌面歌词的开关、播放模式的切换、歌曲的收藏按钮,Thanks to @andylow for the icon!
  • \n
\n

修复

\n
    \n
  • 修复使用全局快捷键还原窗口时,窗口没有获取焦点的问题
  • \n
  • 修复我的列表搜索对最后一个字符的匹配问题
  • \n
  • 修复窗口在较小模式下最小化/关闭按钮不居中的问题
  • \n
\n

优化

\n
    \n
  • 桌面歌词当前播放行改为上下居中
  • \n
  • 为区分静音状态,静音时音量条会变淡,调整音量条时将会取消静音
  • \n
  • 优化随机播放机制,现在通过下一曲切换歌曲时,直到播放完整个列表之前将不会再随机到之前播放过的歌曲,并且通过上一曲可以正确播放上一首歌曲
  • \n
  • 当下载目录没有写入权限时将显示没有写入权限的提示
  • \n
\n

移除

\n
    \n
  • 移除默认的全局声音媒体快捷键接管
  • \n
  • 移除对百度音乐的支持,因百度音乐原有的大部分API失效,而且该平台相对其他平台来说音乐太少了,可有可无,以后再看情况恢复
  • \n
\n

其他

\n
    \n
  • 更新electron到 10.1.2
  • \n
\n"},{"version":"1.0.1","desc":"

优化

\n
    \n
  • 对我的列表歌曲搜索结果进行相似度排序
  • \n
\n

修复

\n
    \n
  • 修复在 Windows 系统下缩放比非100%时,拖动桌面歌词会自动加大桌面歌词窗口的问题
  • \n
\n"},{"version":"1.0.0","desc":"

新增

\n
    \n
  • 新增rpmpacman包的构建(未测试可用性)
  • \n
  • 新增因系统音频设备列表改变导致的当前音频输出设备改变时是否暂停播放的设置,默认关闭
  • \n
  • 新增歌曲列表右击菜单
  • \n
  • 新增自定义列表,创建列表的按钮在表头#左侧,鼠标移上去才会显示;编辑列表名字时,按ESC键可快速取消编辑,按回车键或使输入框失去焦点即可保存列表名字,右击列表可编辑已创建的列表,“试听列表”与“我的收藏”两个列表固定不可编辑
  • \n
  • 改变排行榜布局,新增更多排行榜
  • \n
  • 新增我的列表右键菜单复制歌曲名选项
  • \n
  • 新增桌面歌词,默认关闭,可到设置或者托盘菜单开启(建议使用全局快捷键控制);调整字体大小、透明度时,鼠标左击按钮正常调整,右击微调;Windows 7未开启Aero效果时桌面歌词会有问题,详情看常见问题解决;Linux版桌面歌词有问题,以后再尝试优化;
  • \n
  • 新增“清热板蓝”皮肤
  • \n
  • 新增软件最小化、关闭按钮位置设置,MAC版默认为左边,非MAC为右边,不想用默认的可到设置修改
  • \n
  • 新增快捷键设置,软件内快捷键默认开启,全局快捷键默认关闭(注:若想开启蓝牙耳机切歌需开启全局快捷键,当快捷键被中划线划掉时,表示当前快捷键被其他程序占用导致注册失败)
  • \n
  • 新增首次运行时自动根据当前系统使用的语言设置软件显示的语言
  • \n
  • 新增歌词区域的触摸板、鼠标滚轮等对歌词滚动的支持
  • \n
  • 为了方便支持正版资源,歌曲列表右击菜单新增跳转到当前歌曲源官方详情页菜单(注意:在本版本之前添加的虾米源歌曲无法跳转详情页,需要移除后重新搜索添加)
  • \n
  • 新增我的列表内歌曲搜索,在我的列表按ctrl+f将显示搜索框;鼠标滑过或键盘上下方向键选择搜索结果;鼠标点击或按回车键定位选中的歌曲;按ctrl键的情况下鼠标点击或按回车键确认定位歌曲时,将会在定位歌曲结束后播放该歌曲(搜索框激活的情况下按esc可快速清空搜索框/关闭搜索框)
  • \n
  • 新增托盘图标样式设置,可到设置-其他切换
  • \n
  • 新增开关下载功能控制,默认关闭,可到设置-下载设置开启
  • \n
  • 新增将歌词嵌入音频文件中,默认关闭,可到设置-下载设置开启
  • \n
  • 新增当列表文件损坏时对损坏文件的备份,若出现该情况可打开%HOMEPATH%\\AppData\\Roaming\\lx-music-desktop找到playList.json.bak尝试手动修复列表文件,列表文件以JSON格式存储
  • \n
  • 新增在歌单详情列表按退格(Backspace)键可快速返回歌单列表
  • \n
\n

优化

\n
    \n
  • 改进歌曲切换时的歌词滚动效果
  • \n
  • 优化批量添加、删除播放列表的歌曲操作逻辑,大幅提升批量添加、删除列表歌曲的流畅度
  • \n
  • 改进歌单列表展示
  • \n
  • 改进聚合搜索的搜索结果排序,修复当某些源搜索失败时导致其他源无法显示结果的问题,现在聚合搜索已达到最初的理想效果,为了使排序更精确,建议同时输入 歌曲名 歌手名 搜索(歌曲名在前歌手名在后),欢迎体验~!
  • \n
  • 压缩备份数据文件大小
  • \n
\n

修复

\n
    \n
  • 修复按住Ctrl等键触发多选机制时不松开按键的情况下切换到其他窗口后再松开按键,这时切回软件不按按键都处在多选模式的问题
  • \n
  • 修复Linux版开启托盘无法退出的问题
  • \n
  • 修复某些情况下可能导致的音源输出问题
  • \n
  • 修复某些情况下无法开始下载任务的问题
  • \n
  • 修复 tab 组件边框溢出问题
  • \n
  • 修复错误更新试听列表外的歌曲时间的问题
  • \n
  • 修复网易音乐源歌单、排行榜歌曲列表加载显示的数量与实际不对的问题,同时支持加载大于1000首歌的歌单(歌曲大于1000首会分页),注意:目前软件一下子显示太多歌曲时会卡顿,不建议在同一列表内添加太多歌曲
  • \n
  • 修复歌曲图片链接没有扩展名的情况下无法嵌入图片的问题
  • \n
  • 修复无法检测最新版本时弹窗提示的显示
  • \n
  • 修复某些情况下从托盘还原窗口后无法操作的问题
  • \n
  • 修复Linux下无法ctrl+a全选的问题
  • \n
  • 修复主题背景图片覆盖不全的问题
  • \n
  • 修复聚合搜索音源标签的皮肤配色问题
  • \n
\n

更变

\n
    \n
  • 修改设置-列表-是否显示歌曲源的默认设置为选中(该变更不影响之前的设置)
  • \n
  • 移除浮动按钮,现在在多选完成后可鼠标右击随意一项在弹出的右键菜单中进行原来悬浮按钮的操作
  • \n
  • 为了避免出现误会,现在下载弹窗中不可用的音质将直接隐藏
  • \n
  • 更改初始设置的搜索设置为聚合搜索(该变更不影响之前的设置)
  • \n
\n

其他

\n
    \n
  • 更新 Electron 到 9.1.1
  • \n
\n"},{"version":"0.18.2","desc":"

修复

\n
    \n
  • 修复开启托盘时,可能导致无法自动更新的问题
  • \n
\n"},{"version":"0.18.1","desc":"

优化

\n
    \n
  • win下的托盘图标使用更大的图片
  • \n
  • 加长软件协议的强制停留时间
  • \n
\n

修复

\n
    \n
  • 修复导入设置某些设置未立即生效的问题
  • \n
\n"},{"version":"0.18.0","desc":"

新增

\n
    \n
  • 新增FLAC格式音乐标签信息写入与封面嵌入(因128k以外的音质已失效,目前该功能用不上了)
  • \n
  • 添加软件启动时是否自动聚焦搜索框的设置
  • \n
  • 新增托盘设置,默认关闭,可到设置开启,感谢 @LasyIsLazy 提交的PR
  • \n
  • 新增打开酷狗源用户歌单
  • \n
  • 新增使用协议
  • \n
  • 新增虾米音源
  • \n
  • 新增新皮肤“粉妆玉琢”、“青出于黑”,可去体验下~
  • \n
  • 新增“超大”、“巨大”窗口尺寸
  • \n
  • 新增播放详情页(退出详情页可点击右上角退出按钮或者在播放详情页任意地方鼠标快速右击两次
  • \n
\n

优化

\n
    \n
  • 略微加深音量条底色
  • \n
  • 优化其他界面细节
  • \n
  • 优化英语翻译,感谢 @CPCer
  • \n
  • 优化程序的流畅度
  • \n
\n

更变

\n
    \n
  • 下载列表的歌曲下载、播放将随设置中的保存路径改变而改变,不再固定指向其初始位置
  • \n
  • 移除列表多选框,现在多选需要键盘配合,想要多选前需按下ShiftCtrl键然后再鼠标点击想要选中的内容即可触发多选机制,其中Shift键用于连续选择,Ctrl键用于不连续选择,Ctrl+a用于快速全选。例子一:想要选中1-5项,则先按下Shift键后,鼠标点击第一项,再点击第五项即可完成选择;例子二:想要选中1项与第3项,则先按下Ctrl键后,鼠标点击第一项,再点击第三项即可完成选择;例子三:想要选中当前列表的全部内容,键盘先按下Ctrl键不放,然后按a键,即可完成选择。用ShiftCtrl选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按ShiftAlt键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S:Ctrl键对应Mac OS上的Command键)
  • \n
  • 现在进度条的封面图左击改为打开播放详情页,在列表定位歌曲改为右击
  • \n
\n

修复

\n
    \n
  • 修复网易源某些歌曲提示没有可播放的音质的问题
  • \n
  • 修复下载管理刷新URL失败时不标记任务下载失败的问题
  • \n
  • 修复列表导出的文字描述,感谢 @CPCer
  • \n
  • 修复歌曲切换方式无法取消勾选的问题
  • \n
  • 修复打开歌单详情的情况下切到其他界面再切回来报错的问题
  • \n
  • 修正播放列表浮动按钮错误的文字提示
  • \n
\n

移除

\n
    \n
  • 因128k以外的音质失效,So 禁止所有128k外的音质下载
  • \n
\n

其他

\n

更新 Electron 到 8.2.5

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

新增

\n
    \n
  • 新增多语言设置,目前软件内置了简体中文、繁体中文、英语三种语言,欢迎提交PR翻译更多语言!
  • \n
  • 新增无法打开外部歌单FAQ
  • \n
  • 新增启动参数search,使用例子:.\\lx-music-desktop.exe -search="突然的自我 - 伍佰"
  • \n
  • 新增音频输出设置
  • \n
  • 新增软件内的包括字体在内的界面内容大小调整,现在当窗口大小切换到“较小/大/较大”时,软件内的元素将会适当减小或加大,窗口大小的“小”与“中”内的元素将保持之前的大小暂不做改变
  • \n
  • 新增音源别名,默认将显示别名,想要显示回原名可到设置切换(免责声明:别名仅是本软件用于描述各音源的标签,其名字归版权方所有)
  • \n
  • 新增发现新版本更新失败弹窗的忽略提醒按钮,忽略提醒后,以后同一个版本再失败时将不会弹窗提醒,但仍可到设置-版本更新手动点开更新弹窗查看或恢复提醒
  • \n
  • 新增热搜词,默认关闭,可到设置开启
  • \n
  • 新增历史搜索记录,默认关闭,可到设置开启(右击单个历史记录标签可移除所点击的记录)
  • \n
\n

优化

\n
    \n
  • 优化月里嫦娥皮肤侧栏鼠标悬浮颜色
  • \n
  • 优化播放进度条的动画效果
  • \n
  • 现在添加下载任务时,后面添加的任务会在列表顶部插入
  • \n
  • 优化歌单打开机制,现在歌单加载失败时会提示加载失败了,并且支持直接打开企鹅、酷我手机分享出来的歌单了
  • \n
  • 优化右上角最小化/关闭按钮布局
  • \n
\n

修复

\n
    \n
  • 修复歌单详情处于加载状态时无法返回的问题
  • \n
  • 修复鼠标右击复制列表内容时会复制音质标签的问题
  • \n
  • 修复0.6.2及以前的版本导出的“所有数据”内的歌曲列表无法导入的问题
  • \n
  • 修复下载列表在某些情况下无法取消全选的问题
  • \n
\n

其他

\n
    \n
  • 更新Electron到 8.1.1
  • \n
\n"},{"version":"0.16.0","desc":"

新增

\n
    \n
  • 允许选中列表内歌曲名、歌手名、专辑名内的文字,选中后可使用键盘快捷键进行复制
  • \n
  • 新增在列表可选内容区域鼠标右击时自动复制列表已选文字的功能
  • \n
  • 新增在搜索框鼠标右击时自动粘贴剪贴板的文本到搜索框中
  • \n
  • 任务下载失败时将显示搜索按钮,方便在其他源搜索该歌曲
  • \n
\n

优化

\n
    \n
  • 优化木叶之村主题翻页器背景颜色
  • \n
  • 优化各个主题音质标签颜色
  • \n
  • 优化其他一些界面细节及用户交互效果
  • \n
\n

修复

\n
    \n
  • 修复启用透明窗口鼠标不穿透的bug
  • \n
  • 修复大窗口时设置的音乐来源选项不换行的问题
  • \n
  • 修复某些情况下暂停任务会自动开始任务的问题
  • \n
  • 修复移除暂停、错误的任务时不删除未下载完成的文件的问题
  • \n
  • 修复酷狗源歌单热门标签歌单列表无法加载问题
  • \n
  • 修复QQ源歌单热门标签歌单列表无法加载问题
  • \n
\n

其他

\n
    \n
  • 更新electron到 8.0.1
  • \n
\n"},{"version":"0.15.0","desc":"

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

\n

修复

\n
    \n
  • 修复歌曲下载列表无法加载的问题
  • \n
  • 修复歌曲下载任务数大于最大下载任务数的问题
  • \n
  • 修复某些情况下歌曲下载错误的问题
  • \n
  • 修复下载列表数据没有被迁移直接被丢弃的问题
  • \n
\n"},{"version":"0.14.1","desc":"

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

\n

修复

\n
    \n
  • 修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题
  • \n
\n"},{"version":"0.14.0","desc":"

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

\n

新增

\n
    \n
  • 新增各大平台歌单热门标签显示(显示在歌单界面的第一个下拉标签菜单中)
  • \n
  • 恢复QQ音乐源128k音质试听
  • \n
  • 新增不强制win7开启透明效果即可使用,但要配置运行参数-nt,例如:.\\lx-music-desktop.exe -nt,添加方法可自行百度“给快捷方式加参数”
  • \n
  • 新增“新年快乐”主题,可自行切换体验
  • \n
\n

优化

\n
    \n
  • 减淡各个主题的歌曲列表分隔线颜色
  • \n
  • 在线音乐列表音质标签优化,当歌曲有无损音质时隐藏高品质标签
  • \n
  • 更新改进的歌词播放插件,现在歌词的播放显示将更准确
  • \n
\n

修复

\n
    \n
  • 修复咪咕源无法搜索的问题
  • \n
  • 修复更新弹窗底部文字颜色没有适配当前主题颜色的问题
  • \n
  • 修复导入设置窗口大小、代理设置不立即生效的问题
  • \n
  • 修复在线音乐列表获取失败时无限循环请求的问题
  • \n
\n

其他

\n
    \n
  • 将软件设置与播放列表分离存储成两个文件
  • \n
  • 更新 Electron 到 7.1.9
  • \n
\n"},{"version":"0.13.1","desc":"

修复

\n
    \n
  • 修复全局更新弹窗无法遮盖搜索框的问题
  • \n
\n

其他

\n
    \n
  • 由于electron 7.1.3 - 7.1.5 的自动更新功能存在Bug,现降级到7.1.2
  • \n
\n"},{"version":"0.13.0","desc":"

新增

\n
    \n
  • 新增搜索框搜索建议键盘上下方向键选择功能
  • \n
  • 聚合搜索新增音源显示
  • \n
  • 新增“离开搜索界面时清空搜索列表”设置选项,默认关闭,可到设置-强迫症设置开启
  • \n
\n

优化

\n
    \n
  • 优化“信口雌黄”皮肤配色
  • \n
\n

修复

\n
    \n
  • 修复存在弹出层时,搜索建议列表被弹出层覆盖的问题
  • \n
  • 修复搜索、排行榜、歌单列表多选框从不定状态到选中的Bug
  • \n
\n

移除

\n
    \n
  • 因Q音接口失效,移除Q音源的试听与下载
  • \n
\n

其他

\n
    \n
  • 更新electron到7.1.5
  • \n
  • 更新vue到2.6.11
  • \n
\n"},{"version":"0.12.1","desc":"

优化

\n
    \n
  • 优化定位歌曲时的列表滚动机制
  • \n
  • 优化链接点击效果
  • \n
\n

修复

\n
    \n
  • 修复使用酷我源下载歌曲时,当歌曲无封面时下载报错的问题
  • \n
  • 修复酷我源排行榜、歌单详情列表里的歌曲音质匹配问题(原来无论歌曲有无高品、无损都会显示有)
  • \n
  • 禁止外部链接在软件内打开,将所有外部链接从默认浏览器打开
  • \n
\n

其他

\n
    \n
  • 更新electron到7.1.2
  • \n
\n"},{"version":"0.12.0","desc":"

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

\n

新增

\n
    \n
  • 新增下载功能对代理设置的支持,现在若在软件设置了代理服务器,下载功能也将会走代理网络了
  • \n
\n

优化

\n
    \n
  • 新下载模块将对恢复下载的任务进行字节校验,用于解决下载进度超过100%后仍然下载的问题
  • \n
  • 注意:目前仍然无法暂停处于链接获取状态中的任务
  • \n
\n

修复

\n
    \n
  • 修复Linux deb版本.desktop桌面文件缺少图标的问题,新增中文名称显示、软件分类,感谢@lowy的反馈!
  • \n
  • 修复下载列表歌曲状态分类列表操作Bug
  • \n
  • 修复歌曲封面下载失败时仍然执行嵌入封面操作导致报错的问题
  • \n
  • 跳过重复添加相同歌曲名与扩展名的歌曲,例如你之前下载了A歌曲的128k音质,现在想要下载它的320k音质,但由于两者都是MP3格式,会因为重名导致之前的128k音质被覆盖但列表中仍然显示两种音质的问题(但实际上都是指向后面的320k音质)
  • \n
\n"},{"version":"0.11.0","desc":"

新增

\n
    \n
  • 新增歌曲缓冲定时器,尝试用于解决网络正常但是歌曲缓冲过久的问题
  • \n
  • 新增下载管理的任务状态分类
  • \n
  • 添加杀毒软件提示有病毒或恶意行为的说明,可到常见问题拉到最后查看(常见问题可在开源地址找到)
  • \n
\n

优化

\n
    \n
  • 优化更新弹窗机制及其内容描述,对于可以自动更新的版本,现在可以看到软件的下载进度了
  • \n
\n"},{"version":"0.10.0","desc":"

优化

\n
    \n
  • 大幅减少程序播放时对CPU与GPU的使用,经测试CPU使用减少60%以上,GPU使用减少90%以上,这应该能解决MAC系统上的温度上涨的问题
  • \n
\n

修复

\n
    \n
  • 修复酷我源搜索提示排行榜无法获取的问题
  • \n
  • 修复咪咕源无法播放的问题
  • \n
\n"},{"version":"0.9.1","desc":"

修复

\n
    \n
  • 修复没有配置文件时程序启动出错的问题
  • \n
\n"},{"version":"0.9.0","desc":"

新增

\n
    \n
  • 新增窗口大小设置,若觉得软件窗口小可以到设置页调大点
  • \n
  • 新增定位当前播放歌曲,点击播放栏左侧的歌曲图片可在播放列表定位当前播放的歌曲(该功能对播放下载列表的歌曲无效)
  • \n
\n

修复

\n
    \n
  • 修复搜索提示失效的问题
  • \n
  • 修复从歌单或列表点击搜索按钮搜索目标歌曲时,搜索框未聚焦仍然弹出候选搜索列表的问题
  • \n
\n"},{"version":"0.8.2","desc":"

修复

\n
    \n
  • 兼容旧版酷我源搜索列表过滤128k音质的bug(注:0.8.1版本仅修复了酷我源的歌曲过滤问题,该修复仅对以后添加的歌曲有效,如果是之前添加的歌曲仍会出现这个问题,现修复对之前旧列表数据的兼容处理)
  • \n
\n"},{"version":"0.8.1","desc":"

修复

\n
    \n
  • 修复酷我源搜索歌曲结果未添加128k音质导致播放128k音质时显示“该歌曲没有可播放的音频”的问题
  • \n
\n"},{"version":"0.8.0","desc":"

新增

\n
    \n
  • 新增网易云源歌曲搜索
  • \n
  • 新增网易云源歌单
  • \n
  • 新增各平台通过输入歌单链接或歌单ID打开歌单详情列表,目前只适配了网页版歌单链接,其他方式的歌单链接可能无法解析,但你可想办法获取歌单ID后输入打开。注:各平台歌单ID均为纯数字,若遇到链接里存在歌单ID但无法解析的歌单链接,可以到GitHub提交issue或发送邮件或加群830125506反馈!
  • \n
  • 新增音量调整滑动功能,现在支持鼠标左右拖动调整音量了
  • \n
\n

优化

\n
    \n
  • 优化搜索框搜索体验
  • \n
  • 优化音量条交互视觉效果
  • \n
  • 缓存歌单详情列表数据
  • \n
\n

修复

\n
    \n
  • 修复QQ源歌单无法翻页Bug
  • \n
  • 修复默认列表没有创建时无法显示收藏列表的Bug
  • \n
  • 修复网易云128k直接试听
  • \n
  • 修复歌曲音质不存在时仍然播放或下载的Bug
  • \n
  • 修复调整音量时,调整的位置与鼠标点击的位置不一致的问题
  • \n
\n"},{"version":"0.7.0","desc":"

新增

\n
    \n
  • 新增“我的收藏”本地播放列表
  • \n
  • 新增缓存清理功能,可到设置-其他查看与清理软件缓存
  • \n
  • 新增QQ音乐源搜索
  • \n
  • 新增咪咕源搜索
  • \n
  • 新增咪咕源歌单
  • \n
  • 新增咪咕源排行榜
  • \n
  • 新增我的音乐列表歌曲源显示,默认关闭,可到设置-列表设置开启
  • \n
\n

优化

\n
    \n
  • 优化选择框动画效果
  • \n
  • 尝试优化选我的音乐列表内容很多时多选的卡顿问题
  • \n
\n

修复

\n
    \n
  • 修复列表延迟显示的Bug
  • \n
  • 修复QQ音源128k音质试听
  • \n
\n"},{"version":"0.6.2","desc":"

祝贺祖国成立70周年~!

\n

新增

\n
    \n
  • 新增QQ音乐源歌单
  • \n
\n

修复

\n
    \n
  • 修正火影皮肤名字
  • \n
  • 修复当试听列表为空时,无法切到其他界面的Bug
  • \n
  • 修复百度源搜索结果为空时的接口处理Bug
  • \n
  • 恢复酷狗其他音质播放
  • \n
\n"},{"version":"0.6.1","desc":"

新增

\n
    \n
  • 新增试听列表滚动条位置恢复设置(可自动恢复到上次离开时的列表滚动位置),本功能默认开启,若不需要可到设置-列表设置将其关闭
  • \n
  • 新增 《海贼王》 皮肤,喜欢个性化的可以试试~
  • \n
\n

优化

\n
    \n
  • 新增DNS解析缓存,加快请求速度
  • \n
  • 优化代码逻辑,减少软件对系统资源的占用
  • \n
  • 优化新版本信息检测,尽量减少弹出版本获取失败弹窗弹出的概率
  • \n
  • 优化下拉列表动画效果
  • \n
\n

修复

\n
    \n
  • 修复请求超时的逻辑处理Bug,尝试修复请求无法取消导致的正在播放的歌曲与界面显示的信息不一致的问题
  • \n
  • 修复其他一些小Bug
  • \n
\n

移除

\n
    \n
  • 移除 192k 音质
  • \n
  • 移除酷我音源 ape 音质,无损推荐 flac 格式
  • \n
\n"},{"version":"0.6.0","desc":"

新增

\n
    \n
  • 新增音乐聚合搜索,目前支持酷我、酷狗、百度源搜索
  • \n
  • 新增代理功能
  • \n
\n

优化

\n
    \n
  • 优化从《梦里嫦娥》皮肤切换到其他皮肤时侧栏动画的切换效果
  • \n
\n

修复

\n
    \n
  • 修复试听列表没有歌曲时会显示列表加载中的Bug
  • \n
  • 修复切换歌单列表详情时的UI Bug
  • \n
\n"},{"version":"0.5.5","desc":"

新增

\n
    \n
  • 月是故乡明,祝大家中秋快乐🥮~~新增个性皮肤**《月里嫦娥》**,时间仓促,皮肤还不是很完善,可以试试喜不喜欢~😉
  • \n
  • 新增 MAC 版本退出快捷键支持
  • \n
  • 新增点击播放器中的歌曲标题可以复制标题的功能(遇到好听的歌曲方便分享)
  • \n
\n

修复

\n
    \n
  • 修复 MAC 系统下软件关闭时再次从 dock 打开时报错的Bug
  • \n
  • 修复下载的歌曲文件名中包含命名规则不允许的符号时下载失败的问题(若歌曲名包含这些符号会自动将其移除)
  • \n
  • 修复 MAC 版本不能复制粘贴的问题
  • \n
\n"},{"version":"0.5.4","desc":"

移除

\n
    \n
  • 下载的FLAC文件在修改歌曲信息后,软件无法播放,但使用本地播放器可以播放
  • \n
  • 为了稳妥起见,暂时移除FLAC格式的meta信息修改
  • \n
  • MP3格式无此问题
  • \n
\n"},{"version":"0.5.3","desc":"

优化

\n
    \n
  • 更新所有依赖包到最新
  • \n
\n

修复

\n
    \n
  • 修复试听酷狗源的音乐仍然获取320k音质导致获取失败的Bug
  • \n
\n"},{"version":"0.5.2","desc":"

新增

\n
    \n
  • 新增强迫症设置-离开搜索界面时是否清空搜索框
  • \n
  • 设置-关于板块新增常见问题链接
  • \n
  • 歌单左上角的分类按钮添加一个向下图标,方便识别该按钮为下拉框(该按钮可选择歌单类型,请自行尝试)
  • \n
\n

优化

\n
    \n
  • 略微优化最小化按钮字符
  • \n
  • 优化试听列表的加载体验,当歌曲数过多时列表将延迟加载
  • \n
\n

修复

\n
    \n
  • 修复下载管理的一些Bug
  • \n
\n

移除

\n
    \n
  • 因接口失效,移除网易云音源,酷狗音源仅支持播放128k音质
  • \n
\n"},{"version":"0.5.1","desc":"

新增

\n
    \n
  • 新增右上角最小化/关闭按钮鼠标滑过符号
  • \n
  • 新增下载列表定位文件按钮
  • \n
\n

修复

\n
    \n
  • 修复百度源歌单全部分类无法加载的问题
  • \n
  • 修复更新弹窗无法弹出的问题
  • \n
\n"},{"version":"0.5.0","desc":"

新增

\n
    \n
  • 新增封面嵌入(默认开启,可到设置-下载设置关闭)
  • \n
  • 新增歌词下载(默认关闭,可到设置-下载设置开启)
  • \n
  • 新增单例应用功能(实现软件单开功能,禁止软件多开)
  • \n
\n

优化

\n
    \n
  • 优化歌单列表动画
  • \n
\n

修复

\n
    \n
  • 修复歌单无法翻页的问题
  • \n
  • 修复在某些情况下,添加下载歌曲导致下载列表崩溃的问题
  • \n
  • 修复版本更新弹窗Bug
  • \n
  • 修复酷狗歌单推荐歌单出现在其他分类中的Bug
  • \n
\n"},{"version":"0.4.0","desc":"

新增

\n
    \n
  • 新增歌单功能,目前支持酷我、酷狗、百度源歌单
  • \n
  • 在设置界面-关于洛雪音乐说明部分新增最新版网盘下载地址打赏地址
  • \n
  • 新增酷狗 电音热歌榜、DJ热歌榜
  • \n
  • 新增版本更新超时功能,对于部分无法访问GitHub的用户做更新超时提醒
  • \n
\n

移除

\n
    \n
  • 注意:0.4.0以前的版本即将失效,请更新到0.4.0版本
  • \n
\n"},{"version":"0.3.5","desc":"

新增

\n
    \n
  • 新增测试接口,该接口同样速度较慢,但软件的大部分功能可用,请自行切换到该接口,找接口辛苦,且用且珍惜!
  • \n
\n

优化

\n
    \n
  • 取消需要刷新URL时windows任务栏进度显示错误状态(现显示为暂停状态)
  • \n
\n

修复

\n
    \n
  • 修复使用临时接口时在试听列表双击灰色歌曲仍然会进行播放的Bug
  • \n
  • 修复歌词加载Bug
  • \n
\n"},{"version":"0.3.4","desc":"

优化

\n
    \n
  • 减少接口不稳定带来的影响,适当增加请求等待时间
  • \n
\n

修复

\n
    \n
  • 修复播放过程中URL过期不会刷新URL的问题
  • \n
\n"},{"version":"0.3.3","desc":"

修复

\n
    \n
  • messoer的接口已经关闭,暂时切换到临时接口使用,部分功能受限。。。
  • \n
  • 修复设置界面更新出错时仍然显示更新下载中的问题
  • \n
  • 修复手动定位播放进度条时存在偏差的问题
  • \n
  • 屏蔽播放器中没有歌曲时对进度条的点击
  • \n
\n"},{"version":"0.3.2","desc":"

新增

\n
    \n
  • 新增酷狗排行榜其他音质下载
  • \n
\n"},{"version":"0.3.1","desc":"

修复

\n
    \n
  • 修复音量条主题适配
  • \n
\n"},{"version":"0.3.0","desc":"

新增

\n
    \n
  • 新增MACLinux版本(需要的可自行下载)
  • \n
  • 新增音量调整
  • \n
  • 新增任务栏播放进度条控制选项(现在可在设置界面关闭在任务栏显示的播放进度)
  • \n
  • 新增更新出错时的弹窗提示
  • \n
  • 从该版本起,非安装版也会有更新弹窗提醒了,但仍然需要手动下载新版本更新,版本信息可到设置页面查看
  • \n
\n

修复

\n
    \n
  • 强制把临时接口设置回 messoer 接口
  • \n
\n"},{"version":"0.2.3","desc":"

新增

\n
    \n
  • 新增任务栏程序标题改变功能(播放歌曲时任务栏标题将显示当前播放的歌曲)
  • \n
\n

修复

\n
    \n
  • 使用临时接口时,试听列表中的下载按钮仍然能点击的Bug
  • \n
  • 修复某些情况下歌曲链接未能缓存的问题
  • \n
\n

移除

\n
    \n
  • 移除临时接口(因服务器被攻击,本接口已关闭)
  • \n
  • 移除列表栏设置的隐藏专辑栏选项(感觉这个设置并没有什么luan用,并且还会打破布局)
  • \n
\n"},{"version":"0.2.2","desc":"

修复

\n
    \n
  • 修复下载过程中出错重试5次都失败后不会自动开始下一个任务的Bug
  • \n
  • 修复播放到一半URL过期时不会刷新URL直接播放下一首的问题
  • \n
\n"},{"version":"0.2.1","desc":"

优化

\n
    \n
  • 新增歌曲URL存储,当URL无效时才重新获取,以减少接口不稳定的影响
  • \n
\n

修复

\n
    \n
  • 修复歌曲加载无法加载时自动切换混乱的Bug
  • \n
  • 修复移除列表最后一首歌曲时播放器不停止播放的问题
  • \n
\n"},{"version":"0.2.0","desc":"

新增

\n
    \n
  • 新增百度音乐排行榜及其音乐直接试听与下载
  • \n
  • 新增网易云排行榜音乐直接试听与下载(目前仅支持128k音质)
  • \n
  • 新增酷狗排行榜音乐直接试听与下载(目前仅支持128k音质)
  • \n
\n

修复

\n
    \n
  • 修复更新弹窗历史版本描述多余的换行问题
  • \n
  • 修复歌曲无法播放的情况下歌词仍会播放的问题
  • \n
\n"},{"version":"0.1.6","desc":"

修复

\n
    \n
  • 修复列表多选音源限制Bug
  • \n
\n"},{"version":"0.1.5","desc":"

新增

\n
    \n
  • 新增搜索列表批量试听与下载功能
  • \n
  • 新增排行榜列表批量试听与下载功能
  • \n
  • 新增试听列表批量移除与下载功能
  • \n
  • 新增下载列表批量开始、暂停与移除功能
  • \n
\n

优化

\n
    \n
  • 优化歌曲切换机制
  • \n
\n"},{"version":"0.1.4","desc":"

新增

\n
    \n
  • 新增音乐来源切换,可到设置页面-基本设置 look look !
  • \n
  • 为搜索结果列表添加多选功能。
    \nP.S:暂时没想好多选后的操作按钮放哪…
  • \n
\n

优化

\n
    \n
  • 重构与改进checkbox组件,使其支持不定选中状态
  • \n
  • 完善上一个版本的http请求封装并切换部分请求到该方法上
  • \n
  • 优化其他一些细节
  • \n
\n"},{"version":"0.1.3","desc":"

新增

\n
    \n
  • 新增win32应用构建
  • \n
\n

修复

\n
    \n
  • 修复安装包许可协议乱码问题
  • \n
  • messoer 提供的接口已挂,暂时切换到临时接口!
  • \n
\n

移除

\n
    \n
  • 由于messoer接口无法使用,QQ音乐排行榜直接播放/下载功能暂时关闭
  • \n
\n"},{"version":"0.1.2","desc":"

修复

\n
    \n
  • 修复更新弹窗的内容显示问题
  • \n
\n"},{"version":"0.1.1","desc":"

新增

\n
    \n
  • QQ音乐排行榜直接试听与下载(该接口貌似不太稳定,且用且珍惜!)
  • \n
\n

优化

\n
    \n
  • 优化http请求机制
  • \n
  • 更新关于本软件说明
  • \n
\n

修复

\n
    \n
  • 修复当上一个歌曲链接正在获取时切换歌曲请求不会取消的问题
  • \n
  • 修复切换歌曲时仍然播放上一首歌曲的问题
  • \n
\n"},{"version":"0.1.0","desc":"0.1.0版本发布"}]} +{"version":"1.18.0","desc":"新增\n- 新增“双击列表里的歌曲时自动切换到当前列表播放”设置,此功能仅对歌单、排行榜有效,默认关闭\n- 新增打开收藏的在线列表的对应平台详情页功能,可以在我的列表-列表右键菜单中使用\n- 新增定时暂停播放功能,由于此功能大多数人可能不常用,所以将其放在设置-基本设置中\n- 新增任务栏缩略图工具栏控制按钮(此功能仅在Windows平台可用),按钮分别为收藏/取消收藏(将歌曲添加到“我的收藏”列表)、上一曲、播放/暂停、下一曲\n- 新增设置-基本设置-软件字体设置,此设置可用于设置主界面的字体(已知的问题:Windows 7 下可能会出现字体列表为空的情况,这是当前系统的 Powershell 版本小于5.1导致的,请自行尝试看常见解决)\n- 新增Scheme URL对音乐搜索的调用支持,详情看常见问题-Scheme URL支持\n- 新增Scheme URL以url传参的方式调用,详情看常见问题-Scheme URL支持\n- 自定义源新增更新弹窗方法,同时自定义源管理新增是否允许源显示更新弹窗设置(出于防止滥用考虑),当源作者想要通知用户源已更新时,可以调用此方法弹窗告诉用户,调用说明看常见问题-自定义源部分\n\n优化\n- 过滤tx源某些不支持播放的歌曲,解决播放此类内容会导致意外的问题\n- 把歌曲的热门评论与最新评论拆分成两个列表显示\n\n修复\n- 修复排行榜名字右击菜单的播放功能在播放非激活的列表时的列表获取问题\n- 修复修改列表名时无法使用`Ctrl`键的问题\n- 修复wy源某些歌曲获取歌词翻译的问题处理\n- 修复下载功能的歌词换源时会进入死循环的问题\n- 修复某些歌曲无法下载的问题\n- 修复windows平台下软件目录存在`portable`文件夹时,仍会创建`C:\\Users\\\\AppData\\Roaming\\lx-music-desktop\\Dictionaries\\en-US-9-0.bdic`文件的问题,现在不会再创建文件,但仍会创建空目录(Electron的问题,目前暂无解决方法)\n- 修复播放器的停止逻辑问题\n\n其他\n- 更新electron到v13.6.9","history":[{"version":"1.17.1","desc":"优化\n- 优化kw源英文与翻译歌词的匹配\n\n修复\n- 修复快捷键与默认按键行为冲突的问题,现在若将某些有默认行为的按键(如在列表中上、下箭头、Home、End等键可以使列表滚动)设置为快捷键时,将禁用其默认行为\n- 修复列表的聚焦问题,现在在列表中使用上、下箭头、空格等键滚动列表时不会导致滚动到一定距离后丢失焦点的问题\n\n其他\n- 更新electron到v13.6.8"},{"version":"1.17.0","desc":"新增\n- 新增“便携”功能,在Windows平台下,若程序目录下存在 portable 目录,则自动使用此目录作为数据存储目录\n- 新增 Scheme URL 支持,同时发布lx-music-script项目配合使用(一个油猴脚本,可以在浏览器中的官方平台网页直接调用LX Music),Scheme URL的调用说明看Readme.md文档的Scheme URL支持部分\n- 新增启动参数`-proxy-server`与`-proxy-bypass-list`,详细介绍看Readme.md文档的启动参数部分\n- 新增桌面歌词是否延迟滚动设置,默认开启,若你不想要桌面歌词延迟滚动可以去设置-桌面歌词设置关掉\n\n优化\n- 为可视化音频的频谱整体添加频谱均值加成,使频谱显示更有节奏感\n- 优化程序初始化逻辑,修复无网络的情况下的初始化问题\n- 我的列表-列表名的右击菜单更新已收藏的在线列表时,将始终重新加载,不再使用缓存,解决在原平台更新歌单后,在LX点击更新可能看到的还是在原平台更新前的歌单的问题\n\n修复\n- 修复代理不生效的问题\n- 修复`openDevTools`选项无效的问题\n- 修复播放状态的提示问题\n- 修复tx源无搜索结果的问题\n\n其他\n- 更新 Electron 到 v13.6.7"},{"version":"1.16.0","desc":"这算是一个大版本,对主窗口部分的代码逻辑做了较大改动,但由于界面的改动不大,所以没有更新大版本号。\n虽然经过一个月的测试与问题修复,但可能仍然存在未发现的问题,若你发现某些界面异常、某些行为与旧版本存在差异等问题,欢迎反馈!\n另外祝大家元旦快乐~!\n\n新增\n- 播放详情页新增音量控制条\n- 播放详情页新增桌面歌词切换按钮\n- 新增将我的列表保存为TXT、CSV格式,可以去设置-备份与恢复中使用(注意:此类格式的备份目前不支持恢复到LX Music中)\n- 新增根据歌曲名、歌手名等字段对列表自动排序的功能,可以在我的列表右击列表名弹出的菜单中使用\n- 新增将播放与下载的歌词转换为繁体中文选项,默认关闭,可在设置-播放设置中开启\n- 现在已允许进入临时播放列表,即:使用歌单详情页、排行榜名称右键菜单的“播放”按钮播放歌曲时,可右击播放封面进入此临时列表\n- 播放详情页新增音频可视化功能(实验性)\n- 我的列表新增拖动调整位置功能,按住Ctrl键(Mac上对应Command键)的时候将进入“拖动模式”,此时可以拖动列表的位置来调整顺序\n\n优化\n- 优化列表性能,软件整体性能\n- 调整Mac平台下的图标大小\n- 同步功能添加对列表顺序调整的控制,确保手动调整位置后的列表与不同的电脑同步时,列表位置不会被还原\n- 优化歌单详情、排行榜名右键的播放按钮的播放机制,现在不用等待整个列表(多页时)加载完成才能播放了\n- 为播放详情页、桌面歌词添加延迟滚动,播放详情页略微减小已激活歌词的缩放大小及桌面歌词翻译大小\n- 修改右边控制按钮为windows风格\n- 更新了新年皮肤的背景与配色,欢迎体验~\n\n修复\n- 修复kw源某些歌曲的歌词提取异常的问题\n\n变更\n- 现在使用繁体中文语言时将不再自动转换歌词,转换行为将由上面新增的转换开关控制\n\n移除\n- 移除我的列表右键菜单的“上移、下移列表”功能,调整改用新增的拖动功能去调整位置\n\n其他\n- 升级vue到 3.x"},{"version":"1.15.3","desc":"修复\n- 修复设置-控制按钮位置选项与下载歌词编码格式选项命名冲突导致选项显示异常的问题\n- 修复播放下载列表时存在失效的歌曲会导致切歌不准确的问题\n- 修复潜在的音乐加载超时不会切歌的问题\n- 修复因kw源歌词接口停用导致该源歌词获取失败的问题"},{"version":"1.15.2","desc":"其他\n- 降级electron到v13.4.0(这修复了windows 7下播放歌曲时软件会崩溃的问题)"},{"version":"1.15.1","desc":"优化\n- 优化我的列表、下载列表等列表的滚动流畅度\n- 优化下载功能的批量添加、删除、暂停任务时的流畅度,现在进行这些操作应该不会再觉得卡顿了\n- 支持启动软件时恢复播放下载列表里的歌曲\n- 添加媒体播放进度条的信息设置\n\n修复\n- 修复某些情况下获取URL失败时会意外切歌的问题\n- 修复了某些情况下会列表同步失败,导致连接断开无限重连或一直卡在 `syncing...` 的问题\n- 修复列表数据过大导致同步失败的问题\n\n其他\n- 更新electron到v15.3.1(这修复了媒体控制失效的问题)"},{"version":"1.15.0","desc":"新增\n- 添加黑色托盘图标\n- 自定义源新增`version`字段,新增`utils.buffer.bufToString`方法\n\n优化\n- 大幅优化我的列表、下载、歌单、排行榜列表性能,现在即使同一列表内的歌曲很多时也不会卡顿了\n- 优化列表同步代码逻辑\n- 优化开关评论时的动画性能\n- 优化进入、离开播放详情页的性能\n- 兼容桌面歌词以触摸的方式移动、调整大小\n- 调整图标尺寸\n\n修复\n- 修复kg源的歌单链接无法打开的问题\n- 修复同一首歌的URL、歌词等同时需要换源时的处理问题\n\n其他\n- 更新 Electron 到 v15.3.0"},{"version":"1.14.1","desc":"修复\n- 修复我的列表搜索无法搜索小括号、中括号等字符的问题\n- 修复v1.14.0出现的备份与恢复功能备份的数据无法恢复的问题,同时兼容使用v1.14.0导出的存在问题的数据"},{"version":"1.14.0","desc":"新增\n- 新增歌词简体中文转繁体中文,当软件语言被设置为繁体中文后,播放歌曲的歌词也将自动转成繁体中文显示\n- 新增单个列表导入/导出功能,可以方便分享歌曲列表,可在右击“我的列表”里的列表名后弹出的菜单中使用\n- 新增删除列表前的确认弹窗,防止误删列表\n- 新增歌词文本选择复制功能,可在详情页进度条上方的歌词文本选择按钮进入歌词文本选择模式,选择完成后可鼠标右击或者使用系统快捷键复制\n- 新增重复歌曲列表,可以方便移除我的列表中的重复歌曲,此列表会列出目标列表里歌曲名相同的歌曲,可在右击“我的列表”里的列表名后弹出的菜单中使用\n\n修复\n- 修复mg排行榜无法加载的问题\n- 修复点击播放详情页的进度条跳进度时会出现偏移的问题\n- 修复在有提示信息的地方长按鼠标按键时提示信息会闪烁的问题\n- 修复下载歌曲时的歌词下载不尝试获取缓存歌词的问题\n- 修复GNOME等桌面下每次打开应用时需重新设置歌词窗口置顶的问题"},{"version":"1.13.0","desc":"如果你喜欢并经常使用洛雪音乐,并想要第一时间尝鲜洛雪的新功能,可以加入测试企鹅群768786588,\n注意:测试版的功可能会不稳定,打算潜水的勿加。\n\n新增\n- 歌曲搜索框新增清理按钮,点击此按钮可以清理搜索框并返回初始搜索界面\n- 新增“下载的歌词文件编码格式”设置,默认下载的歌词编码仍是`UTF-8`,对于某些在设备(如车机)上出现歌词中文乱码的用户可以尝试选择以`GBK`编码格式保存歌词文件\n- 新增设置-桌面歌词-歌词字体设置,此设置可用于设置桌面歌词的字体(已知的问题:Windows 7 下可能会出现字体列表为空的情况,这是当前系统的 Powershell 版本小于5.1导致的,请自行**尝试**看常见解决)\n\n优化\n- 支持网易源“我喜欢”歌单以注入token的方式打开。由于网易源的“我喜欢”歌单需要登录才能打开(若你看不懂后半句就去阅读 常见问题-无法打开外部歌单),现若想要打开此类歌单,需要在歌单链接后面拼上 `###` 再加上有效的token,拼接格式:`[id|url]###token`,例子(最后面的xxxxxx替换成你的token):`https://music.163.com/#/playlist?id=123456&userid=123456###xxxxxx`\n- 软件内快捷键的最小化触发时,如果已启用托盘,则隐藏程序,否则最小化程序\n\n修复\n- 修复某些情况下同步功能会导致切歌混乱的问题\n- 修复从电脑浏览器复制的企鹅歌单链接无法打开的问题"},{"version":"1.12.2","desc":"修复\n- 修复播放下载列表的歌曲时切歌的问题\n- 修复播放下载列表的歌曲时歌词无法显示的问题\n- 修复下载列表稍后播放功能无效的问题\n- 修复同步服务器启动失败时,关闭同步服务不会清空失败信息的问题"},{"version":"1.12.1","desc":"修复\n- 修复随机播放下无法切歌的问题"},{"version":"1.12.0","desc":"新增\n- 新增局域网同步功能(实验性,首次使用前建议先备份一次列表),此功能需要配合PC端使用,移动端与PC端处在同一个局域网(路由器的网络)下时,可以多端实时同步歌曲列表,使用问题请看\"常见问题\"。\n\n优化\n- 添加播放器对系统媒体控制与显示的兼容处理,现在在windows下的锁屏界面可以正确显示当前播放的音乐信息及切换歌曲了\n\n修复\n- 修复导入kg歌单最多只能加载100、500首歌曲的问题。注:现在可以加载1000+首歌曲的歌单,但出于未知原因会导致部分歌曲无法加载(可能是无版权导致的),目前酷狗码仍然最多只能加载500首歌\n- 修复某些情况下所显示的歌词、封面图片与当前正在播放的歌曲不一致的问题"},{"version":"1.11.0","desc":"新增\n- 添加 win arm64 架构的安装包构建\n- 新增“添加歌曲到列表时的位置”设置,可选项为列表的“顶部”与“底部”\n\n优化\n- 优化网络请求,尝试去解决无法连接服务器的问题\n- 优化mg源打开歌单的链接兼容\n\n修复\n- 修复mg源搜索失效的问题\n\n移除\n- 因wy源的歌单列表已没有“最新”排序的选项,所以现跟随移除wy源歌单列表按“最新”排序的按钮\n\n变更\n- 添加歌曲到列表时从原来的底部改为顶部,若你想要将你的列表歌曲顺序反转以适应这一变更,可先按住`shift`键的情况下点击列表的最后一首歌,然后再点击列表的第一首歌,完成倒序选中,最后随便右击列表的任意一首歌,在弹出的菜单中选择调整顺序,在弹出框输入1后确定即可反转列表。\n若你想要恢复原来的行为则可以去更改“添加歌曲到列表时的位置”设置项。\n\n其他\n- 更新electron到v13.1.7"},{"version":"1.10.2","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题"},{"version":"1.10.1","desc":"修复\n- 修复企鹅音乐搜索歌曲没有结果的问题\n- 修复播放在空的歌单列表点击播放全部时报错的问题"},{"version":"1.10.0","desc":"lx music移动端已经发布了,使用习惯仍跟桌面版一样,不过功能、界面仍比较简单,有兴趣的可以去体检一下,项目地址:\nhttps://github.com/lyswhut/lx-music-mobile#readme\n\n新增\n- 排行榜界面添加播放、收藏整个排行榜功能,可以右击排行榜名字后,在弹出的右键菜单中使用。注:收藏、播放存在分页的排行榜时需等待操作完成后才能切换排行榜,不然会导致操作中断。\n- 新增Mac arm64位dmg包的构建\n\n修复\n- 修复全局快捷键对桌面歌词无效的问题\n- 修复快捷键设置框内的提示问题\n- 修复在当前正常播放的列表中使用稍后播放功能时,播放完后稍后播放的歌曲后不会恢复原来播放位置播放的问题\n- 修复kw部分歌单无法打开的问题\n- 修复wy源的歌曲音质匹配问题\n- 修复mg源歌单标签、排行榜歌曲列表无法加载的问题\n- 修复了一个歌曲下载失败时不会跳过任务的问题\n\n其他\n- 更新 Electron 到 12.0.8"},{"version":"1.9.0","desc":"新增\n- 新增启动参数`-dhmkh`,此参数将禁用Chromium的Hardware Media Key Handling特性,用于解决漫步者部分型号耳机与本程序冲突导致耳机意外关机的问题\n- 新增Windows arm64位免安装版的构建\n- 新增黑色皮肤“黑灯瞎火”,有关于皮肤配色的建议欢迎反馈\n- 新增自动换源下载功能,默认关闭,当无法从歌曲的原始源下载时,将尝试切换到其他源下载,注:此功能不100%保证换源后的歌曲版本与原版一致\n\n优化\n- 程序启动时对数据文件做读取校验,数据出现损坏时自动备份损坏的数据,若出现数据读取错误的弹窗并出现我的列表丢失时可到GitHub或加群反馈\n- 当设置-代理启用,但主机地址为空的时,将不再使用代理配置进行网络连接,并且在离开设置界面时自动禁用代理\n- 优化歌曲自动换源匹配\n- 分离歌词与歌曲列表信息的保存,以减小列表列表文件损坏的几率\n- 兼容打开咪咕移动端分享的歌单链接,添加打开歌单的信息显示\n\n修复\n- 修复备份与恢复功能在恢复数据时某些设置不立即生效的问题\n- 修正设置页“搜索设置”部分内容的缩进显示问题\n- 修复正在播放“稍后播放”的歌曲时,对“稍后播放”前播放的列表进行添加、删除操作会导致切歌的问题"},{"version":"1.8.2","desc":"### 修复\r\n\r\n- 修复歌曲ID存储变更导致酷狗图片获取失败的问题\n- 修复收藏的在线列表id迁移保存出错的问题"},{"version":"1.8.1","desc":"修复\n- 修复歌词翻译的主题颜色适配问题"},{"version":"1.8.0","desc":"新增\n- 新增设置-其他-列表缓存信息清理功能,注:此功能一般情况下不要使用\n- 新增启动参数`-play`,可以在启动软件时播放指定歌单,使用方法看Readme.md的\"启动参数\"部分\n- 新增逐字歌词播放,默认开启,可到设置界面关闭,注:本功能目前仅对酷狗源的歌曲有效\n- 新增自定义源功能,源编写规则可以去常见问题查看\n\n优化\n- 允许播放除了搜索列表以外的所有歌曲,即原来没有播放按钮或者灰色的歌曲都可以去尝试点击播放。注:该功能的原理是尝试自动切换到其他源播放,所以不一定会播放成功,特别是对于那些独家的资源\n- 优化单首歌曲的“添加到列表”弹窗歌曲列表状态的显示;现在在收藏单首歌曲时,若列表存在本歌曲则列表名字将变成灰色不可点击状态。总的来说,在添加单首歌曲时若列表名是灰色,则证明当前歌曲已在那个列表中\n- 将歌词翻译放到原文的下方,同时新增当前播放翻译的高亮功能\n\n移除\n- 移除虾米源。注:虽然已移除该源,但仍可尝试去播放之前添加的歌曲,虽然不一定会成功\n\n修复\n- 修复音乐搜索列表的稍后播放功能无效的问题\n- 修复搜索列表双击不支持播放的源时会导致切歌的问题\n- 修复歌单列表加载失败时无法进入歌单打开界面的问题\n- 修复mg源歌单列表无法加载的问题\n- 修复kg跳转到官方歌曲详情页的歌曲无法播放的问题\n- 修复我的列表的歌曲添加到其他列表时不排除当前列表的问题\n- 修复在下载列表右击未下载完成的歌曲弹出的右击菜单中没有开始下载选项的问题\n\n变更\n- 歌词翻译显示功能修改为默认关闭,注:此变更仅影响首次安装软件的用户\n\n其他\n- 更新electron到v9.4.4"},{"version":"1.7.1","desc":"修复\n- 修复非透明模式下右侧滚动条无法拖动的问题\n- 修复MAC下xm音乐滑块验证问题"},{"version":"1.7.0","desc":"

新增

\n
    \n
  • 搜索界面新增搜索状态的提示
  • \n
  • 新增“稍后播放”功能,可在歌曲列表右键菜单使用
  • \n
  • 新增“记住播放进度”功能的控制,该功能默认不再开启,可到播放设置-记住播放进度开启
  • \n
\n

优化

\n
    \n
  • 优化播放歌曲换源匹配
  • \n
  • 优化设置界面设置项的展示
  • \n
\n

修复

\n
    \n
  • 修复快速切换歌曲时, 会出现播放的歌曲和界面展示的歌曲不一致的问题
  • \n
  • 修复了一个由版本更新日志显示导致的潜在远程代码执行攻击漏洞,该漏洞影响v1.6.1及之前的所有版本,请务必更新到最新版本
  • \n
  • 修复xm搜索源验证问题
  • \n
\n

其他

\n
    \n
  • 更新electron到9.4.2
  • \n
\n"},{"version":"1.6.1","desc":"

优化

\n
    \n
  • 改进自动换源时的歌曲匹配
  • \n
\n

修复

\n
    \n
  • 修复某些情况下自动换源的时间过长时会终止换源自动切歌的问题
  • \n
  • 修复自动换源导致的搜索列表每页变成10条数据的问题
  • \n
  • 降级electron到9.3.3修复部分系统没有声音的问题
  • \n
\n"},{"version":"1.6.0","desc":"

新增

\n
    \n
  • 我的列表右键菜单新增列表排序功能,可调整单曲、多选后的歌曲的顺序。注意:多选排序还将会按照选中歌曲时的顺序排序
  • \n
  • 添加鼠标提示的自动关闭功能,鼠标长时间(目前是10秒)不动时鼠标提示将会自动关闭
  • \n
  • 添加鼠标指向歌曲封面的提示(对于进度条左边的歌曲封面,你可能不知道的操作->右击在“我的列表”定位当前播放的歌曲)
  • \n
  • 隐藏播放详情页按钮添加快速隐藏详情页提示(你可能不知道的操作->在播放详情页内的任意非窗口可拖动区域右键双击可以快速隐藏详情页)
  • \n
  • 添加桌面歌词字体、透明度调整按钮微调提示(你可能不知道的操作->对于字体、透明度可右击微调)
  • \n
  • 我的列表右键菜单添加搜索当前歌曲功能
  • \n
  • 新增-dha参数,添加此启动参数将禁用硬件加速启动(Disable Hardware Acceleration),窗口显示有问题时可以尝试添加此参数启动,Linux系统的界面显示有问题时可尝试添加此参数启动,若不行可尝试添加-dt参数启动
  • \n
  • 新增播放自动换源功能~
  • \n
\n

变更

\n
    \n
  • -nt参数更名为-dt(Disable Transparent),目前原来的-nt参数仍然可用,但将在后续的版本中移除
  • \n
\n

修复

\n
    \n
  • 修复恢复上次播放的歌曲时在随机播放模式下不把恢复播放的歌曲放入已播放队列的问题(该问题会导致随机模式下会导致未播放完整个列表前就会再次随机到该歌曲,以及无法通过上一曲切回该歌曲)
  • \n
  • 修复音乐嵌入的封面在 Mac 系统无法显示的问题
  • \n
  • 修复-dt(原来的-nt)启动参数不真正生效的问题
  • \n
\n"},{"version":"1.5.0","desc":"

新增

\n
    \n
  • 直接从歌单详情收藏的列表新增同步功能。注意:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表
  • \n
\n

优化

\n
    \n
  • 优化软件启动时恢复上一次播放的歌曲进度功能
  • \n
\n

修复

\n
    \n
  • 修复MAC平台上下载歌曲封面嵌入无法显示的问题
  • \n
  • 修复MAC平台首次运行软件最小化、关闭控制按钮默认在右边的问题
  • \n
  • 修复酷狗源的某些歌曲没有专辑字段导致的列表加载失败问题
  • \n
  • 修复某些酷狗源歌单链接无法打开的问题
  • \n
\n"},{"version":"1.4.1","desc":"

修复

\n
    \n
  • 修复有歌词翻译与无歌词的音乐间切换会导致歌词翻译残留显示的问题
  • \n
  • 修复歌曲URL过期时,等待刷新URL的自动切换歌曲时间间隔太短的问题
  • \n
  • 修复某些电脑上的某些歌曲没有声音的问题(升级Electron9.3.4导致的,现降级到9.3.3)
  • \n
\n"},{"version":"1.4.0","desc":"

新增

\n
    \n
  • 托盘菜单新增显示、隐藏主界面选项,为Linux、MAC版添加托盘菜单
  • \n
  • 新增播放进度信息保存
  • \n
\n

优化

\n
    \n
  • 移除kg源的歌词文件开头的空白字符串
  • \n
\n

修复

\n
    \n
  • 修复专辑图片无法嵌入的问题
  • \n
  • 修复播放状态栏切换“上一首”歌曲按钮提示错误的问题
  • \n
  • 修复移动单首歌曲时,如果目标列表存在该歌曲,会导致将源列表与目标列表里的目标歌曲移除
  • \n
  • 修复kg源歌曲信息带有单引号等特殊字符被转义的问题
  • \n
\n"},{"version":"1.3.0","desc":"

新增

\n
    \n
  • 播放详情页新增歌曲评论加载显示(某些平台暂不支持显示子评论)
  • \n
\n

优化

\n
    \n
  • 修改播放详情页的歌曲图片的显示效果
  • \n
\n

修复

\n
    \n
  • 修复小芸源音乐搜索结果最多只有20条搜索结果的问题
  • \n
\n"},{"version":"1.2.2","desc":"

修复

\n
    \n
  • 降级 Electron 到 9.x.x 版本修复 Linux 版桌面歌词窗口变白的问题
  • \n
\n"},{"version":"1.2.1","desc":"

优化

\n
    \n
  • Linux版的软件界面默认使用圆角与阴影,顺便修复了桌面歌词窗口变白的问题,已在Ubuntu 18.10测试正常,若显示异常可尝试添加-nt参数启动
  • \n
\n

修复

\n
    \n
  • 修复聚合搜索的分页问题
  • \n
  • 修复代理输入框输入的内容不生效的问题
  • \n
\n"},{"version":"1.2.0","desc":"

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

\n

新增

\n
    \n
  • 播放控制栏开启/关闭桌面歌词按钮 新增右击按钮时锁定/解锁桌面歌词功能
  • \n
\n

优化

\n
    \n
  • 优化我的列表滚动条位置的保存逻辑
  • \n
  • 更新设置-备份与恢复功能的描述
  • \n
  • 优化软件内鼠标悬停的提示界面
  • \n
\n

修复

\n
    \n
  • 修复桌面歌词窗口不允许拖出桌面之外的位置计算偏移Bug
  • \n
  • 修复网易云KTV嗨榜无法加载的问题
  • \n
  • 修复初始化搜索历史列表功能
  • \n
  • 修复重启软件后试听列表与收藏列表无法恢复上次的滚动位置的问题
  • \n
  • 修复歌曲封面无法嵌入的Bug
  • \n
  • 修复酷狗歌词格式问题
  • \n
  • 修复关闭切换动画时从搜索候选列表点击内容无效的问题
  • \n
\n

其他

\n
    \n
  • 更新 Electron 到 v10.1.3
  • \n
\n"},{"version":"1.1.1","desc":"

修复

\n
    \n
  • 修复某些情况下桌面歌词不会播放的问题
  • \n
\n"},{"version":"1.1.0","desc":"

新增

\n
    \n
  • 在歌单详情界面新增播放当前歌单按钮、收藏歌单按钮,注:播放歌单不会将歌曲添加到试听列表
  • \n
  • 新增不允许将歌词窗口拖出主屏幕之外的设置项,默认开启,在连接多个屏幕时想要拖动到其他屏幕时可关闭此设置
  • \n
  • 新增大部分平台的歌词翻译,感谢 @InoriHimea 提供的krc解码算法
  • \n
  • 新增显示歌词翻译设置,默认开启,仅支持某些平台,注:无论该设置是否开启,嵌入或下载歌词时都不会带上翻译
  • \n
  • 新增显示切换动画设置,默认开启,关闭时将基本禁用软件内的所有切换动画
  • \n
  • 播放状态栏新增桌面歌词的开关、播放模式的切换、歌曲的收藏按钮,Thanks to @andylow for the icon!
  • \n
\n

修复

\n
    \n
  • 修复使用全局快捷键还原窗口时,窗口没有获取焦点的问题
  • \n
  • 修复我的列表搜索对最后一个字符的匹配问题
  • \n
  • 修复窗口在较小模式下最小化/关闭按钮不居中的问题
  • \n
\n

优化

\n
    \n
  • 桌面歌词当前播放行改为上下居中
  • \n
  • 为区分静音状态,静音时音量条会变淡,调整音量条时将会取消静音
  • \n
  • 优化随机播放机制,现在通过下一曲切换歌曲时,直到播放完整个列表之前将不会再随机到之前播放过的歌曲,并且通过上一曲可以正确播放上一首歌曲
  • \n
  • 当下载目录没有写入权限时将显示没有写入权限的提示
  • \n
\n

移除

\n
    \n
  • 移除默认的全局声音媒体快捷键接管
  • \n
  • 移除对百度音乐的支持,因百度音乐原有的大部分API失效,而且该平台相对其他平台来说音乐太少了,可有可无,以后再看情况恢复
  • \n
\n

其他

\n
    \n
  • 更新electron到 10.1.2
  • \n
\n"},{"version":"1.0.1","desc":"

优化

\n
    \n
  • 对我的列表歌曲搜索结果进行相似度排序
  • \n
\n

修复

\n
    \n
  • 修复在 Windows 系统下缩放比非100%时,拖动桌面歌词会自动加大桌面歌词窗口的问题
  • \n
\n"},{"version":"1.0.0","desc":"

新增

\n
    \n
  • 新增rpmpacman包的构建(未测试可用性)
  • \n
  • 新增因系统音频设备列表改变导致的当前音频输出设备改变时是否暂停播放的设置,默认关闭
  • \n
  • 新增歌曲列表右击菜单
  • \n
  • 新增自定义列表,创建列表的按钮在表头#左侧,鼠标移上去才会显示;编辑列表名字时,按ESC键可快速取消编辑,按回车键或使输入框失去焦点即可保存列表名字,右击列表可编辑已创建的列表,“试听列表”与“我的收藏”两个列表固定不可编辑
  • \n
  • 改变排行榜布局,新增更多排行榜
  • \n
  • 新增我的列表右键菜单复制歌曲名选项
  • \n
  • 新增桌面歌词,默认关闭,可到设置或者托盘菜单开启(建议使用全局快捷键控制);调整字体大小、透明度时,鼠标左击按钮正常调整,右击微调;Windows 7未开启Aero效果时桌面歌词会有问题,详情看常见问题解决;Linux版桌面歌词有问题,以后再尝试优化;
  • \n
  • 新增“清热板蓝”皮肤
  • \n
  • 新增软件最小化、关闭按钮位置设置,MAC版默认为左边,非MAC为右边,不想用默认的可到设置修改
  • \n
  • 新增快捷键设置,软件内快捷键默认开启,全局快捷键默认关闭(注:若想开启蓝牙耳机切歌需开启全局快捷键,当快捷键被中划线划掉时,表示当前快捷键被其他程序占用导致注册失败)
  • \n
  • 新增首次运行时自动根据当前系统使用的语言设置软件显示的语言
  • \n
  • 新增歌词区域的触摸板、鼠标滚轮等对歌词滚动的支持
  • \n
  • 为了方便支持正版资源,歌曲列表右击菜单新增跳转到当前歌曲源官方详情页菜单(注意:在本版本之前添加的虾米源歌曲无法跳转详情页,需要移除后重新搜索添加)
  • \n
  • 新增我的列表内歌曲搜索,在我的列表按ctrl+f将显示搜索框;鼠标滑过或键盘上下方向键选择搜索结果;鼠标点击或按回车键定位选中的歌曲;按ctrl键的情况下鼠标点击或按回车键确认定位歌曲时,将会在定位歌曲结束后播放该歌曲(搜索框激活的情况下按esc可快速清空搜索框/关闭搜索框)
  • \n
  • 新增托盘图标样式设置,可到设置-其他切换
  • \n
  • 新增开关下载功能控制,默认关闭,可到设置-下载设置开启
  • \n
  • 新增将歌词嵌入音频文件中,默认关闭,可到设置-下载设置开启
  • \n
  • 新增当列表文件损坏时对损坏文件的备份,若出现该情况可打开%HOMEPATH%\\AppData\\Roaming\\lx-music-desktop找到playList.json.bak尝试手动修复列表文件,列表文件以JSON格式存储
  • \n
  • 新增在歌单详情列表按退格(Backspace)键可快速返回歌单列表
  • \n
\n

优化

\n
    \n
  • 改进歌曲切换时的歌词滚动效果
  • \n
  • 优化批量添加、删除播放列表的歌曲操作逻辑,大幅提升批量添加、删除列表歌曲的流畅度
  • \n
  • 改进歌单列表展示
  • \n
  • 改进聚合搜索的搜索结果排序,修复当某些源搜索失败时导致其他源无法显示结果的问题,现在聚合搜索已达到最初的理想效果,为了使排序更精确,建议同时输入 歌曲名 歌手名 搜索(歌曲名在前歌手名在后),欢迎体验~!
  • \n
  • 压缩备份数据文件大小
  • \n
\n

修复

\n
    \n
  • 修复按住Ctrl等键触发多选机制时不松开按键的情况下切换到其他窗口后再松开按键,这时切回软件不按按键都处在多选模式的问题
  • \n
  • 修复Linux版开启托盘无法退出的问题
  • \n
  • 修复某些情况下可能导致的音源输出问题
  • \n
  • 修复某些情况下无法开始下载任务的问题
  • \n
  • 修复 tab 组件边框溢出问题
  • \n
  • 修复错误更新试听列表外的歌曲时间的问题
  • \n
  • 修复网易音乐源歌单、排行榜歌曲列表加载显示的数量与实际不对的问题,同时支持加载大于1000首歌的歌单(歌曲大于1000首会分页),注意:目前软件一下子显示太多歌曲时会卡顿,不建议在同一列表内添加太多歌曲
  • \n
  • 修复歌曲图片链接没有扩展名的情况下无法嵌入图片的问题
  • \n
  • 修复无法检测最新版本时弹窗提示的显示
  • \n
  • 修复某些情况下从托盘还原窗口后无法操作的问题
  • \n
  • 修复Linux下无法ctrl+a全选的问题
  • \n
  • 修复主题背景图片覆盖不全的问题
  • \n
  • 修复聚合搜索音源标签的皮肤配色问题
  • \n
\n

更变

\n
    \n
  • 修改设置-列表-是否显示歌曲源的默认设置为选中(该变更不影响之前的设置)
  • \n
  • 移除浮动按钮,现在在多选完成后可鼠标右击随意一项在弹出的右键菜单中进行原来悬浮按钮的操作
  • \n
  • 为了避免出现误会,现在下载弹窗中不可用的音质将直接隐藏
  • \n
  • 更改初始设置的搜索设置为聚合搜索(该变更不影响之前的设置)
  • \n
\n

其他

\n
    \n
  • 更新 Electron 到 9.1.1
  • \n
\n"},{"version":"0.18.2","desc":"

修复

\n
    \n
  • 修复开启托盘时,可能导致无法自动更新的问题
  • \n
\n"},{"version":"0.18.1","desc":"

优化

\n
    \n
  • win下的托盘图标使用更大的图片
  • \n
  • 加长软件协议的强制停留时间
  • \n
\n

修复

\n
    \n
  • 修复导入设置某些设置未立即生效的问题
  • \n
\n"},{"version":"0.18.0","desc":"

新增

\n
    \n
  • 新增FLAC格式音乐标签信息写入与封面嵌入(因128k以外的音质已失效,目前该功能用不上了)
  • \n
  • 添加软件启动时是否自动聚焦搜索框的设置
  • \n
  • 新增托盘设置,默认关闭,可到设置开启,感谢 @LasyIsLazy 提交的PR
  • \n
  • 新增打开酷狗源用户歌单
  • \n
  • 新增使用协议
  • \n
  • 新增虾米音源
  • \n
  • 新增新皮肤“粉妆玉琢”、“青出于黑”,可去体验下~
  • \n
  • 新增“超大”、“巨大”窗口尺寸
  • \n
  • 新增播放详情页(退出详情页可点击右上角退出按钮或者在播放详情页任意地方鼠标快速右击两次
  • \n
\n

优化

\n
    \n
  • 略微加深音量条底色
  • \n
  • 优化其他界面细节
  • \n
  • 优化英语翻译,感谢 @CPCer
  • \n
  • 优化程序的流畅度
  • \n
\n

更变

\n
    \n
  • 下载列表的歌曲下载、播放将随设置中的保存路径改变而改变,不再固定指向其初始位置
  • \n
  • 移除列表多选框,现在多选需要键盘配合,想要多选前需按下ShiftCtrl键然后再鼠标点击想要选中的内容即可触发多选机制,其中Shift键用于连续选择,Ctrl键用于不连续选择,Ctrl+a用于快速全选。例子一:想要选中1-5项,则先按下Shift键后,鼠标点击第一项,再点击第五项即可完成选择;例子二:想要选中1项与第3项,则先按下Ctrl键后,鼠标点击第一项,再点击第三项即可完成选择;例子三:想要选中当前列表的全部内容,键盘先按下Ctrl键不放,然后按a键,即可完成选择。用ShiftCtrl选择时,鼠标点击未选中的内容会将其选中,点击已选择的内容会将其取消选择,若想全部取消选择,在不按ShiftAlt键的情况下,随意点击列表里的一项内容即可全部取消选择。(P.S:Ctrl键对应Mac OS上的Command键)
  • \n
  • 现在进度条的封面图左击改为打开播放详情页,在列表定位歌曲改为右击
  • \n
\n

修复

\n
    \n
  • 修复网易源某些歌曲提示没有可播放的音质的问题
  • \n
  • 修复下载管理刷新URL失败时不标记任务下载失败的问题
  • \n
  • 修复列表导出的文字描述,感谢 @CPCer
  • \n
  • 修复歌曲切换方式无法取消勾选的问题
  • \n
  • 修复打开歌单详情的情况下切到其他界面再切回来报错的问题
  • \n
  • 修正播放列表浮动按钮错误的文字提示
  • \n
\n

移除

\n
    \n
  • 因128k以外的音质失效,So 禁止所有128k外的音质下载
  • \n
\n

其他

\n

更新 Electron 到 8.2.5

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

新增

\n
    \n
  • 新增多语言设置,目前软件内置了简体中文、繁体中文、英语三种语言,欢迎提交PR翻译更多语言!
  • \n
  • 新增无法打开外部歌单FAQ
  • \n
  • 新增启动参数search,使用例子:.\\lx-music-desktop.exe -search="突然的自我 - 伍佰"
  • \n
  • 新增音频输出设置
  • \n
  • 新增软件内的包括字体在内的界面内容大小调整,现在当窗口大小切换到“较小/大/较大”时,软件内的元素将会适当减小或加大,窗口大小的“小”与“中”内的元素将保持之前的大小暂不做改变
  • \n
  • 新增音源别名,默认将显示别名,想要显示回原名可到设置切换(免责声明:别名仅是本软件用于描述各音源的标签,其名字归版权方所有)
  • \n
  • 新增发现新版本更新失败弹窗的忽略提醒按钮,忽略提醒后,以后同一个版本再失败时将不会弹窗提醒,但仍可到设置-版本更新手动点开更新弹窗查看或恢复提醒
  • \n
  • 新增热搜词,默认关闭,可到设置开启
  • \n
  • 新增历史搜索记录,默认关闭,可到设置开启(右击单个历史记录标签可移除所点击的记录)
  • \n
\n

优化

\n
    \n
  • 优化月里嫦娥皮肤侧栏鼠标悬浮颜色
  • \n
  • 优化播放进度条的动画效果
  • \n
  • 现在添加下载任务时,后面添加的任务会在列表顶部插入
  • \n
  • 优化歌单打开机制,现在歌单加载失败时会提示加载失败了,并且支持直接打开企鹅、酷我手机分享出来的歌单了
  • \n
  • 优化右上角最小化/关闭按钮布局
  • \n
\n

修复

\n
    \n
  • 修复歌单详情处于加载状态时无法返回的问题
  • \n
  • 修复鼠标右击复制列表内容时会复制音质标签的问题
  • \n
  • 修复0.6.2及以前的版本导出的“所有数据”内的歌曲列表无法导入的问题
  • \n
  • 修复下载列表在某些情况下无法取消全选的问题
  • \n
\n

其他

\n
    \n
  • 更新Electron到 8.1.1
  • \n
\n"},{"version":"0.16.0","desc":"

新增

\n
    \n
  • 允许选中列表内歌曲名、歌手名、专辑名内的文字,选中后可使用键盘快捷键进行复制
  • \n
  • 新增在列表可选内容区域鼠标右击时自动复制列表已选文字的功能
  • \n
  • 新增在搜索框鼠标右击时自动粘贴剪贴板的文本到搜索框中
  • \n
  • 任务下载失败时将显示搜索按钮,方便在其他源搜索该歌曲
  • \n
\n

优化

\n
    \n
  • 优化木叶之村主题翻页器背景颜色
  • \n
  • 优化各个主题音质标签颜色
  • \n
  • 优化其他一些界面细节及用户交互效果
  • \n
\n

修复

\n
    \n
  • 修复启用透明窗口鼠标不穿透的bug
  • \n
  • 修复大窗口时设置的音乐来源选项不换行的问题
  • \n
  • 修复某些情况下暂停任务会自动开始任务的问题
  • \n
  • 修复移除暂停、错误的任务时不删除未下载完成的文件的问题
  • \n
  • 修复酷狗源歌单热门标签歌单列表无法加载问题
  • \n
  • 修复QQ源歌单热门标签歌单列表无法加载问题
  • \n
\n

其他

\n
    \n
  • 更新electron到 8.0.1
  • \n
\n"},{"version":"0.15.0","desc":"

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

\n

修复

\n
    \n
  • 修复歌曲下载列表无法加载的问题
  • \n
  • 修复歌曲下载任务数大于最大下载任务数的问题
  • \n
  • 修复某些情况下歌曲下载错误的问题
  • \n
  • 修复下载列表数据没有被迁移直接被丢弃的问题
  • \n
\n"},{"version":"0.14.1","desc":"

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

\n

修复

\n
    \n
  • 修复由于旧版配置文件迁移出错导致的软件界面无法显示的问题
  • \n
\n"},{"version":"0.14.0","desc":"

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

\n

新增

\n
    \n
  • 新增各大平台歌单热门标签显示(显示在歌单界面的第一个下拉标签菜单中)
  • \n
  • 恢复QQ音乐源128k音质试听
  • \n
  • 新增不强制win7开启透明效果即可使用,但要配置运行参数-nt,例如:.\\lx-music-desktop.exe -nt,添加方法可自行百度“给快捷方式加参数”
  • \n
  • 新增“新年快乐”主题,可自行切换体验
  • \n
\n

优化

\n
    \n
  • 减淡各个主题的歌曲列表分隔线颜色
  • \n
  • 在线音乐列表音质标签优化,当歌曲有无损音质时隐藏高品质标签
  • \n
  • 更新改进的歌词播放插件,现在歌词的播放显示将更准确
  • \n
\n

修复

\n
    \n
  • 修复咪咕源无法搜索的问题
  • \n
  • 修复更新弹窗底部文字颜色没有适配当前主题颜色的问题
  • \n
  • 修复导入设置窗口大小、代理设置不立即生效的问题
  • \n
  • 修复在线音乐列表获取失败时无限循环请求的问题
  • \n
\n

其他

\n
    \n
  • 将软件设置与播放列表分离存储成两个文件
  • \n
  • 更新 Electron 到 7.1.9
  • \n
\n"},{"version":"0.13.1","desc":"

修复

\n
    \n
  • 修复全局更新弹窗无法遮盖搜索框的问题
  • \n
\n

其他

\n
    \n
  • 由于electron 7.1.3 - 7.1.5 的自动更新功能存在Bug,现降级到7.1.2
  • \n
\n"},{"version":"0.13.0","desc":"

新增

\n
    \n
  • 新增搜索框搜索建议键盘上下方向键选择功能
  • \n
  • 聚合搜索新增音源显示
  • \n
  • 新增“离开搜索界面时清空搜索列表”设置选项,默认关闭,可到设置-强迫症设置开启
  • \n
\n

优化

\n
    \n
  • 优化“信口雌黄”皮肤配色
  • \n
\n

修复

\n
    \n
  • 修复存在弹出层时,搜索建议列表被弹出层覆盖的问题
  • \n
  • 修复搜索、排行榜、歌单列表多选框从不定状态到选中的Bug
  • \n
\n

移除

\n
    \n
  • 因Q音接口失效,移除Q音源的试听与下载
  • \n
\n

其他

\n
    \n
  • 更新electron到7.1.5
  • \n
  • 更新vue到2.6.11
  • \n
\n"},{"version":"0.12.1","desc":"

优化

\n
    \n
  • 优化定位歌曲时的列表滚动机制
  • \n
  • 优化链接点击效果
  • \n
\n

修复

\n
    \n
  • 修复使用酷我源下载歌曲时,当歌曲无封面时下载报错的问题
  • \n
  • 修复酷我源排行榜、歌单详情列表里的歌曲音质匹配问题(原来无论歌曲有无高品、无损都会显示有)
  • \n
  • 禁止外部链接在软件内打开,将所有外部链接从默认浏览器打开
  • \n
\n

其他

\n
    \n
  • 更新electron到7.1.2
  • \n
\n"},{"version":"0.12.0","desc":"

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

\n

新增

\n
    \n
  • 新增下载功能对代理设置的支持,现在若在软件设置了代理服务器,下载功能也将会走代理网络了
  • \n
\n

优化

\n
    \n
  • 新下载模块将对恢复下载的任务进行字节校验,用于解决下载进度超过100%后仍然下载的问题
  • \n
  • 注意:目前仍然无法暂停处于链接获取状态中的任务
  • \n
\n

修复

\n
    \n
  • 修复Linux deb版本.desktop桌面文件缺少图标的问题,新增中文名称显示、软件分类,感谢@lowy的反馈!
  • \n
  • 修复下载列表歌曲状态分类列表操作Bug
  • \n
  • 修复歌曲封面下载失败时仍然执行嵌入封面操作导致报错的问题
  • \n
  • 跳过重复添加相同歌曲名与扩展名的歌曲,例如你之前下载了A歌曲的128k音质,现在想要下载它的320k音质,但由于两者都是MP3格式,会因为重名导致之前的128k音质被覆盖但列表中仍然显示两种音质的问题(但实际上都是指向后面的320k音质)
  • \n
\n"},{"version":"0.11.0","desc":"

新增

\n
    \n
  • 新增歌曲缓冲定时器,尝试用于解决网络正常但是歌曲缓冲过久的问题
  • \n
  • 新增下载管理的任务状态分类
  • \n
  • 添加杀毒软件提示有病毒或恶意行为的说明,可到常见问题拉到最后查看(常见问题可在开源地址找到)
  • \n
\n

优化

\n
    \n
  • 优化更新弹窗机制及其内容描述,对于可以自动更新的版本,现在可以看到软件的下载进度了
  • \n
\n"},{"version":"0.10.0","desc":"

优化

\n
    \n
  • 大幅减少程序播放时对CPU与GPU的使用,经测试CPU使用减少60%以上,GPU使用减少90%以上,这应该能解决MAC系统上的温度上涨的问题
  • \n
\n

修复

\n
    \n
  • 修复酷我源搜索提示排行榜无法获取的问题
  • \n
  • 修复咪咕源无法播放的问题
  • \n
\n"},{"version":"0.9.1","desc":"

修复

\n
    \n
  • 修复没有配置文件时程序启动出错的问题
  • \n
\n"},{"version":"0.9.0","desc":"

新增

\n
    \n
  • 新增窗口大小设置,若觉得软件窗口小可以到设置页调大点
  • \n
  • 新增定位当前播放歌曲,点击播放栏左侧的歌曲图片可在播放列表定位当前播放的歌曲(该功能对播放下载列表的歌曲无效)
  • \n
\n

修复

\n
    \n
  • 修复搜索提示失效的问题
  • \n
  • 修复从歌单或列表点击搜索按钮搜索目标歌曲时,搜索框未聚焦仍然弹出候选搜索列表的问题
  • \n
\n"},{"version":"0.8.2","desc":"

修复

\n
    \n
  • 兼容旧版酷我源搜索列表过滤128k音质的bug(注:0.8.1版本仅修复了酷我源的歌曲过滤问题,该修复仅对以后添加的歌曲有效,如果是之前添加的歌曲仍会出现这个问题,现修复对之前旧列表数据的兼容处理)
  • \n
\n"},{"version":"0.8.1","desc":"

修复

\n
    \n
  • 修复酷我源搜索歌曲结果未添加128k音质导致播放128k音质时显示“该歌曲没有可播放的音频”的问题
  • \n
\n"},{"version":"0.8.0","desc":"

新增

\n
    \n
  • 新增网易云源歌曲搜索
  • \n
  • 新增网易云源歌单
  • \n
  • 新增各平台通过输入歌单链接或歌单ID打开歌单详情列表,目前只适配了网页版歌单链接,其他方式的歌单链接可能无法解析,但你可想办法获取歌单ID后输入打开。注:各平台歌单ID均为纯数字,若遇到链接里存在歌单ID但无法解析的歌单链接,可以到GitHub提交issue或发送邮件或加群830125506反馈!
  • \n
  • 新增音量调整滑动功能,现在支持鼠标左右拖动调整音量了
  • \n
\n

优化

\n
    \n
  • 优化搜索框搜索体验
  • \n
  • 优化音量条交互视觉效果
  • \n
  • 缓存歌单详情列表数据
  • \n
\n

修复

\n
    \n
  • 修复QQ源歌单无法翻页Bug
  • \n
  • 修复默认列表没有创建时无法显示收藏列表的Bug
  • \n
  • 修复网易云128k直接试听
  • \n
  • 修复歌曲音质不存在时仍然播放或下载的Bug
  • \n
  • 修复调整音量时,调整的位置与鼠标点击的位置不一致的问题
  • \n
\n"},{"version":"0.7.0","desc":"

新增

\n
    \n
  • 新增“我的收藏”本地播放列表
  • \n
  • 新增缓存清理功能,可到设置-其他查看与清理软件缓存
  • \n
  • 新增QQ音乐源搜索
  • \n
  • 新增咪咕源搜索
  • \n
  • 新增咪咕源歌单
  • \n
  • 新增咪咕源排行榜
  • \n
  • 新增我的音乐列表歌曲源显示,默认关闭,可到设置-列表设置开启
  • \n
\n

优化

\n
    \n
  • 优化选择框动画效果
  • \n
  • 尝试优化选我的音乐列表内容很多时多选的卡顿问题
  • \n
\n

修复

\n
    \n
  • 修复列表延迟显示的Bug
  • \n
  • 修复QQ音源128k音质试听
  • \n
\n"},{"version":"0.6.2","desc":"

祝贺祖国成立70周年~!

\n

新增

\n
    \n
  • 新增QQ音乐源歌单
  • \n
\n

修复

\n
    \n
  • 修正火影皮肤名字
  • \n
  • 修复当试听列表为空时,无法切到其他界面的Bug
  • \n
  • 修复百度源搜索结果为空时的接口处理Bug
  • \n
  • 恢复酷狗其他音质播放
  • \n
\n"},{"version":"0.6.1","desc":"

新增

\n
    \n
  • 新增试听列表滚动条位置恢复设置(可自动恢复到上次离开时的列表滚动位置),本功能默认开启,若不需要可到设置-列表设置将其关闭
  • \n
  • 新增 《海贼王》 皮肤,喜欢个性化的可以试试~
  • \n
\n

优化

\n
    \n
  • 新增DNS解析缓存,加快请求速度
  • \n
  • 优化代码逻辑,减少软件对系统资源的占用
  • \n
  • 优化新版本信息检测,尽量减少弹出版本获取失败弹窗弹出的概率
  • \n
  • 优化下拉列表动画效果
  • \n
\n

修复

\n
    \n
  • 修复请求超时的逻辑处理Bug,尝试修复请求无法取消导致的正在播放的歌曲与界面显示的信息不一致的问题
  • \n
  • 修复其他一些小Bug
  • \n
\n

移除

\n
    \n
  • 移除 192k 音质
  • \n
  • 移除酷我音源 ape 音质,无损推荐 flac 格式
  • \n
\n"},{"version":"0.6.0","desc":"

新增

\n
    \n
  • 新增音乐聚合搜索,目前支持酷我、酷狗、百度源搜索
  • \n
  • 新增代理功能
  • \n
\n

优化

\n
    \n
  • 优化从《梦里嫦娥》皮肤切换到其他皮肤时侧栏动画的切换效果
  • \n
\n

修复

\n
    \n
  • 修复试听列表没有歌曲时会显示列表加载中的Bug
  • \n
  • 修复切换歌单列表详情时的UI Bug
  • \n
\n"},{"version":"0.5.5","desc":"

新增

\n
    \n
  • 月是故乡明,祝大家中秋快乐🥮~~新增个性皮肤**《月里嫦娥》**,时间仓促,皮肤还不是很完善,可以试试喜不喜欢~😉
  • \n
  • 新增 MAC 版本退出快捷键支持
  • \n
  • 新增点击播放器中的歌曲标题可以复制标题的功能(遇到好听的歌曲方便分享)
  • \n
\n

修复

\n
    \n
  • 修复 MAC 系统下软件关闭时再次从 dock 打开时报错的Bug
  • \n
  • 修复下载的歌曲文件名中包含命名规则不允许的符号时下载失败的问题(若歌曲名包含这些符号会自动将其移除)
  • \n
  • 修复 MAC 版本不能复制粘贴的问题
  • \n
\n"},{"version":"0.5.4","desc":"

移除

\n
    \n
  • 下载的FLAC文件在修改歌曲信息后,软件无法播放,但使用本地播放器可以播放
  • \n
  • 为了稳妥起见,暂时移除FLAC格式的meta信息修改
  • \n
  • MP3格式无此问题
  • \n
\n"},{"version":"0.5.3","desc":"

优化

\n
    \n
  • 更新所有依赖包到最新
  • \n
\n

修复

\n
    \n
  • 修复试听酷狗源的音乐仍然获取320k音质导致获取失败的Bug
  • \n
\n"},{"version":"0.5.2","desc":"

新增

\n
    \n
  • 新增强迫症设置-离开搜索界面时是否清空搜索框
  • \n
  • 设置-关于板块新增常见问题链接
  • \n
  • 歌单左上角的分类按钮添加一个向下图标,方便识别该按钮为下拉框(该按钮可选择歌单类型,请自行尝试)
  • \n
\n

优化

\n
    \n
  • 略微优化最小化按钮字符
  • \n
  • 优化试听列表的加载体验,当歌曲数过多时列表将延迟加载
  • \n
\n

修复

\n
    \n
  • 修复下载管理的一些Bug
  • \n
\n

移除

\n
    \n
  • 因接口失效,移除网易云音源,酷狗音源仅支持播放128k音质
  • \n
\n"},{"version":"0.5.1","desc":"

新增

\n
    \n
  • 新增右上角最小化/关闭按钮鼠标滑过符号
  • \n
  • 新增下载列表定位文件按钮
  • \n
\n

修复

\n
    \n
  • 修复百度源歌单全部分类无法加载的问题
  • \n
  • 修复更新弹窗无法弹出的问题
  • \n
\n"},{"version":"0.5.0","desc":"

新增

\n
    \n
  • 新增封面嵌入(默认开启,可到设置-下载设置关闭)
  • \n
  • 新增歌词下载(默认关闭,可到设置-下载设置开启)
  • \n
  • 新增单例应用功能(实现软件单开功能,禁止软件多开)
  • \n
\n

优化

\n
    \n
  • 优化歌单列表动画
  • \n
\n

修复

\n
    \n
  • 修复歌单无法翻页的问题
  • \n
  • 修复在某些情况下,添加下载歌曲导致下载列表崩溃的问题
  • \n
  • 修复版本更新弹窗Bug
  • \n
  • 修复酷狗歌单推荐歌单出现在其他分类中的Bug
  • \n
\n"},{"version":"0.4.0","desc":"

新增

\n
    \n
  • 新增歌单功能,目前支持酷我、酷狗、百度源歌单
  • \n
  • 在设置界面-关于洛雪音乐说明部分新增最新版网盘下载地址打赏地址
  • \n
  • 新增酷狗 电音热歌榜、DJ热歌榜
  • \n
  • 新增版本更新超时功能,对于部分无法访问GitHub的用户做更新超时提醒
  • \n
\n

移除

\n
    \n
  • 注意:0.4.0以前的版本即将失效,请更新到0.4.0版本
  • \n
\n"},{"version":"0.3.5","desc":"

新增

\n
    \n
  • 新增测试接口,该接口同样速度较慢,但软件的大部分功能可用,请自行切换到该接口,找接口辛苦,且用且珍惜!
  • \n
\n

优化

\n
    \n
  • 取消需要刷新URL时windows任务栏进度显示错误状态(现显示为暂停状态)
  • \n
\n

修复

\n
    \n
  • 修复使用临时接口时在试听列表双击灰色歌曲仍然会进行播放的Bug
  • \n
  • 修复歌词加载Bug
  • \n
\n"},{"version":"0.3.4","desc":"

优化

\n
    \n
  • 减少接口不稳定带来的影响,适当增加请求等待时间
  • \n
\n

修复

\n
    \n
  • 修复播放过程中URL过期不会刷新URL的问题
  • \n
\n"},{"version":"0.3.3","desc":"

修复

\n
    \n
  • messoer的接口已经关闭,暂时切换到临时接口使用,部分功能受限。。。
  • \n
  • 修复设置界面更新出错时仍然显示更新下载中的问题
  • \n
  • 修复手动定位播放进度条时存在偏差的问题
  • \n
  • 屏蔽播放器中没有歌曲时对进度条的点击
  • \n
\n"},{"version":"0.3.2","desc":"

新增

\n
    \n
  • 新增酷狗排行榜其他音质下载
  • \n
\n"},{"version":"0.3.1","desc":"

修复

\n
    \n
  • 修复音量条主题适配
  • \n
\n"},{"version":"0.3.0","desc":"

新增

\n
    \n
  • 新增MACLinux版本(需要的可自行下载)
  • \n
  • 新增音量调整
  • \n
  • 新增任务栏播放进度条控制选项(现在可在设置界面关闭在任务栏显示的播放进度)
  • \n
  • 新增更新出错时的弹窗提示
  • \n
  • 从该版本起,非安装版也会有更新弹窗提醒了,但仍然需要手动下载新版本更新,版本信息可到设置页面查看
  • \n
\n

修复

\n
    \n
  • 强制把临时接口设置回 messoer 接口
  • \n
\n"},{"version":"0.2.3","desc":"

新增

\n
    \n
  • 新增任务栏程序标题改变功能(播放歌曲时任务栏标题将显示当前播放的歌曲)
  • \n
\n

修复

\n
    \n
  • 使用临时接口时,试听列表中的下载按钮仍然能点击的Bug
  • \n
  • 修复某些情况下歌曲链接未能缓存的问题
  • \n
\n

移除

\n
    \n
  • 移除临时接口(因服务器被攻击,本接口已关闭)
  • \n
  • 移除列表栏设置的隐藏专辑栏选项(感觉这个设置并没有什么luan用,并且还会打破布局)
  • \n
\n"},{"version":"0.2.2","desc":"

修复

\n
    \n
  • 修复下载过程中出错重试5次都失败后不会自动开始下一个任务的Bug
  • \n
  • 修复播放到一半URL过期时不会刷新URL直接播放下一首的问题
  • \n
\n"},{"version":"0.2.1","desc":"

优化

\n
    \n
  • 新增歌曲URL存储,当URL无效时才重新获取,以减少接口不稳定的影响
  • \n
\n

修复

\n
    \n
  • 修复歌曲加载无法加载时自动切换混乱的Bug
  • \n
  • 修复移除列表最后一首歌曲时播放器不停止播放的问题
  • \n
\n"},{"version":"0.2.0","desc":"

新增

\n
    \n
  • 新增百度音乐排行榜及其音乐直接试听与下载
  • \n
  • 新增网易云排行榜音乐直接试听与下载(目前仅支持128k音质)
  • \n
  • 新增酷狗排行榜音乐直接试听与下载(目前仅支持128k音质)
  • \n
\n

修复

\n
    \n
  • 修复更新弹窗历史版本描述多余的换行问题
  • \n
  • 修复歌曲无法播放的情况下歌词仍会播放的问题
  • \n
\n"},{"version":"0.1.6","desc":"

修复

\n
    \n
  • 修复列表多选音源限制Bug
  • \n
\n"},{"version":"0.1.5","desc":"

新增

\n
    \n
  • 新增搜索列表批量试听与下载功能
  • \n
  • 新增排行榜列表批量试听与下载功能
  • \n
  • 新增试听列表批量移除与下载功能
  • \n
  • 新增下载列表批量开始、暂停与移除功能
  • \n
\n

优化

\n
    \n
  • 优化歌曲切换机制
  • \n
\n"},{"version":"0.1.4","desc":"

新增

\n
    \n
  • 新增音乐来源切换,可到设置页面-基本设置 look look !
  • \n
  • 为搜索结果列表添加多选功能。
    \nP.S:暂时没想好多选后的操作按钮放哪…
  • \n
\n

优化

\n
    \n
  • 重构与改进checkbox组件,使其支持不定选中状态
  • \n
  • 完善上一个版本的http请求封装并切换部分请求到该方法上
  • \n
  • 优化其他一些细节
  • \n
\n"},{"version":"0.1.3","desc":"

新增

\n
    \n
  • 新增win32应用构建
  • \n
\n

修复

\n
    \n
  • 修复安装包许可协议乱码问题
  • \n
  • messoer 提供的接口已挂,暂时切换到临时接口!
  • \n
\n

移除

\n
    \n
  • 由于messoer接口无法使用,QQ音乐排行榜直接播放/下载功能暂时关闭
  • \n
\n"},{"version":"0.1.2","desc":"

修复

\n
    \n
  • 修复更新弹窗的内容显示问题
  • \n
\n"},{"version":"0.1.1","desc":"

新增

\n
    \n
  • QQ音乐排行榜直接试听与下载(该接口貌似不太稳定,且用且珍惜!)
  • \n
\n

优化

\n
    \n
  • 优化http请求机制
  • \n
  • 更新关于本软件说明
  • \n
\n

修复

\n
    \n
  • 修复当上一个歌曲链接正在获取时切换歌曲请求不会取消的问题
  • \n
  • 修复切换歌曲时仍然播放上一首歌曲的问题
  • \n
\n"},{"version":"0.1.0","desc":"0.1.0版本发布"}]} diff --git a/src/common/defaultSetting.js b/src/common/defaultSetting.js index 306a30f4..4f6374b9 100644 --- a/src/common/defaultSetting.js +++ b/src/common/defaultSetting.js @@ -2,7 +2,7 @@ const path = require('path') const os = require('os') const defaultSetting = { - version: '1.0.48', + version: '1.0.51', player: { togglePlayMethod: 'listLoop', highQuality: false, @@ -16,6 +16,8 @@ const defaultSetting = { isPlayLxlrc: true, isSavePlayTime: false, audioVisualization: false, + waitPlayEndStop: true, + waitPlayEndStopTime: '', }, desktopLyric: { enable: false, @@ -36,6 +38,7 @@ const defaultSetting = { }, }, list: { + isClickPlayList: false, isShowAlbumName: true, isShowSource: true, isSaveScrollLocation: true, @@ -99,6 +102,7 @@ const defaultSetting = { sourceId: 'kw', apiSource: 'temp', sourceNameType: 'alias', + font: '', isShowAnimation: true, randomAnimate: true, ignoreVersion: null, diff --git a/src/common/ipcNames.js b/src/common/ipcNames.js index 7586e083..e5827046 100644 --- a/src/common/ipcNames.js +++ b/src/common/ipcNames.js @@ -11,6 +11,9 @@ const names = { clear_env_params_deeplink: 'clear_env_params_deeplink', wait: 'wait', wait_cancel: 'wait_cancel', + interval: 'interval', + interval_callback: 'interval_callback', + interval_cancel: 'interval_cancel', open_dev_tools: 'open_dev_tools', set_music_meta: 'set_music_meta', @@ -66,6 +69,8 @@ const names = { request_user_api_cancel: 'request_user_api_cancel', get_user_api_status: 'get_user_api_status', user_api_status: 'user_api_status', + user_api_show_update_alert: 'user_api_show_update_alert', + user_api_set_allow_update_alert: 'user_api_set_allow_update_alert', get_lyric: 'get_lyric', save_lyric: 'save_lyric', @@ -81,6 +86,9 @@ const names = { sync_action_list: 'sync_action_list', sync_list: 'sync_list', + taskbar_set_thumbar_buttons: 'taskbar_set_thumbar_buttons', + taskbar_set_thumbnail_clip: 'taskbar_set_thumbnail_clip', + taskbar_on_thumbar_button_click: 'taskbar_on_thumbar_button_click', }, winLyric: { close: 'close', diff --git a/src/lang/en-us.json b/src/lang/en-us.json index efa873e6..e0b2f8b6 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -118,6 +118,7 @@ "lists__remove_tip_button": "Yes, that's right", "lists__rename": "Rename", "lists__sort_list": "Sort songs", + "lists__source_detail": "Playlist Page", "lists__sync": "Update", "load_list_file_error_detail": "We have helped you back up the old list file to {path}\nIt is stored in JSON format, you can try to repair and restore it manually\n\nError details: {detail}", "load_list_file_error_title": "Error loading playlist data", @@ -139,9 +140,18 @@ "my_list": "Your Library", "no_item": "Nothing's here...", "not_agree": "Not accept", + "ok": "OK", "pagination__next": "Next page", "pagination__page": "Page {num}", "pagination__prev": "Previous page", + "play_timeout": "Timed pause", + "play_timeout_close": "Close", + "play_timeout_confirm": "Confirm", + "play_timeout_end": "Wait for the song to finish before pausing", + "play_timeout_stop": "Cancel timer", + "play_timeout_tip": "Pause after {time}", + "play_timeout_unit": "minute", + "play_timeout_update": "Update timing", "player__add_music_to": "Add the current song to...", "player__buffering": "Buffering...", "player__desktop_lyric_lock": "Right click to lock lyrics", @@ -200,6 +210,7 @@ "setting__basic_control_btn_position": "Control Button Position", "setting__basic_control_btn_position_left": "Left", "setting__basic_control_btn_position_right": "Right", + "setting__basic_font": "Font", "setting__basic_lang": "Language", "setting__basic_lang_title": "The language displayed in the software", "setting__basic_show_animation": "Show switching animation", @@ -284,6 +295,7 @@ "setting__list_add_music_location_type": "Position when adding a song to the list", "setting__list_add_music_location_type_bottom": "Bottom", "setting__list_add_music_location_type_top": "Top", + "setting__list_click_action": "Automatically switch to the current list when double-clicking a song in the list (only valid for playlists and rankings)", "setting__list_scroll": "Remember the position of the scroll bar of the playlist (only valid for my music classification)", "setting__list_source": "Show song source (only valid for my music category)", "setting__network": "Network", @@ -320,6 +332,7 @@ "setting__play_quality": "Play 320K quality songs first (if supported)", "setting__play_save_play_time": "Remember playback progress", "setting__play_task_bar": "Show playing progress on the taskbar", + "setting__play_timeout": "Timed pause", "setting__search": "Search", "setting__search_focus_search_box": "Automatically focus the search box on startup", "setting__search_history": "Search history", @@ -398,12 +411,16 @@ "theme_purple": "Purple", "theme_red": "Red", "theme_yellow": "Yellow", + "user_api__allow_show_update_alert": "Allow update popup to show", "user_api__btn_export": "Export", "user_api__btn_import": "Import", "user_api__btn_remove": "Remove", "user_api__import_file": "Select music API script file", + "user_api__max_tip": "There can only be a maximum of 20 sources at the same time🤪\nIf you want to continue importing, please remove some old sources to make room", "user_api__noitem": "There is nothing here...😲", "user_api__note": "Tip: Although we have isolated the script's running environment as much as possible, importing scripts containing malicious behaviors may still affect your system. Please import them carefully.", "user_api__readme": "Source writing instructions: ", - "user_api__title": "Custom Source Management" + "user_api__title": "Custom Source Management", + "user_api__update_alert": "Custom source [{name}] found new version:", + "user_api__update_alert_open_url": "Open update address" } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index 0a4f33b4..1440e3aa 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -118,6 +118,7 @@ "lists__remove_tip_button": "是的 没错", "lists__rename": "重命名", "lists__sort_list": "排序歌曲", + "lists__source_detail": "歌单详情页", "lists__sync": "更新", "load_list_file_error_detail": "我们已经帮你把旧的列表文件备份到{path}\n它以 JSON 格式存储,你可以尝试手动修复并恢复它\n\n错误详情:{detail}", "load_list_file_error_title": "播放列表数据加载错误(建议到GitHub或加群反馈)", @@ -139,9 +140,18 @@ "my_list": "我的列表", "no_item": "列表竟然是空的...", "not_agree": "不接受", + "ok": "我知道了", "pagination__next": "下一页", "pagination__page": "第 {num} 页", "pagination__prev": "上一页", + "play_timeout": "定时暂停", + "play_timeout_close": "关闭", + "play_timeout_confirm": "确认", + "play_timeout_end": "等待歌曲播放完毕再暂停", + "play_timeout_stop": "取消定时", + "play_timeout_tip": "{time} 后暂停播放", + "play_timeout_unit": "分钟", + "play_timeout_update": "更新定时", "player__add_music_to": "添加当前歌曲到...", "player__buffering": "缓冲中...", "player__desktop_lyric_lock": "右击锁定歌词", @@ -200,6 +210,7 @@ "setting__basic_control_btn_position": "控制按钮位置", "setting__basic_control_btn_position_left": "左边", "setting__basic_control_btn_position_right": "右边", + "setting__basic_font": "字体", "setting__basic_lang": "语言", "setting__basic_lang_title": "软件显示的语言", "setting__basic_show_animation": "显示切换动画", @@ -284,6 +295,7 @@ "setting__list_add_music_location_type": "添加歌曲到列表时的位置", "setting__list_add_music_location_type_bottom": "底部", "setting__list_add_music_location_type_top": "顶部", + "setting__list_click_action": "双击列表里的歌曲时自动切换到当前列表播放(仅对歌单、排行榜有效)", "setting__list_scroll": "记住播放列表滚动条位置(仅对我的音乐分类有效)", "setting__list_source": "显示歌曲源(仅对我的音乐分类有效)", "setting__network": "网络设置", @@ -320,6 +332,7 @@ "setting__play_quality": "优先播放320K品质的歌曲(如果支持)", "setting__play_save_play_time": "记住播放进度", "setting__play_task_bar": "在任务栏上显示当前歌曲播放进度", + "setting__play_timeout": "定时暂停", "setting__search": "搜索设置", "setting__search_focus_search_box": "启动时自动聚焦搜索框", "setting__search_history": "显示历史搜索记录", @@ -398,12 +411,16 @@ "theme_purple": "重斤球紫", "theme_red": "热情似火", "theme_yellow": "信口雌黄", + "user_api__allow_show_update_alert": "允许显示更新弹窗", "user_api__btn_export": "导出", "user_api__btn_import": "导入", "user_api__btn_remove": "移除", "user_api__import_file": "选择音乐API脚本文件", + "user_api__max_tip": "最多只能同时存在20个源哦🤪\n想要继续导入的话,请先移除一些旧的源腾出位置吧", "user_api__noitem": "这里竟然是空的 😲", "user_api__note": "提示:虽然我们已经尽可能地隔离了脚本的运行环境,但导入包含恶意行为的脚本仍可能会影响你的系统,请谨慎导入。", "user_api__readme": "源编写说明:", - "user_api__title": "自定义源管理" + "user_api__title": "自定义源管理", + "user_api__update_alert": "自定义源 [{name}] 发现新版本:", + "user_api__update_alert_open_url": "打开更新地址" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index bd2f2660..bbb48883 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -118,6 +118,7 @@ "lists__remove_tip_button": "是的 沒錯", "lists__rename": "重命名", "lists__sort_list": "排序歌曲", + "lists__source_detail": "歌單詳情頁", "lists__sync": "更新", "load_list_file_error_detail": "我們已經幫你把舊的列表文件備份到{path}\n它以 JSON 格式存儲,你可以嘗試手動修復並恢復它\n\n錯誤詳情:{detail}", "load_list_file_error_title": "播放列表數據加載錯誤", @@ -139,9 +140,18 @@ "my_list": "我的列表", "no_item": "列表竟然是空的...", "not_agree": "不接受", + "ok": "我知道了", "pagination__next": "下一頁", "pagination__page": "第 {num} 頁", "pagination__prev": "上一頁", + "play_timeout": "定時暫停", + "play_timeout_close": "關閉", + "play_timeout_confirm": "確認", + "play_timeout_end": "等待歌曲播放完畢再暫停", + "play_timeout_stop": "取消定時", + "play_timeout_tip": "{time} 後暫停播放", + "play_timeout_unit": "分鐘", + "play_timeout_update": "更新定時", "player__add_music_to": "添加當前歌曲到...", "player__album": "專輯名:", "player__buffering": "緩衝中...", @@ -200,6 +210,7 @@ "setting__basic_control_btn_position": "控制按鈕位置", "setting__basic_control_btn_position_left": "左邊", "setting__basic_control_btn_position_right": "右邊", + "setting__basic_font": "字體", "setting__basic_lang": "語言", "setting__basic_lang_title": "軟件顯示的語言", "setting__basic_show_animation": "顯示切換動畫", @@ -284,6 +295,7 @@ "setting__list_add_music_location_type": "添加歌曲到列表時的位置", "setting__list_add_music_location_type_bottom": "底部", "setting__list_add_music_location_type_top": "頂部", + "setting__list_click_action": "雙擊列表裡的歌曲時自動切換到當前列表播放(僅對歌單、排行榜有效)", "setting__list_scroll": "記住播放列表滾動條位置(僅對我的音樂分類有效)", "setting__list_source": "顯示歌曲源(僅對我的音樂分類有效)", "setting__network": "網絡設置", @@ -320,6 +332,7 @@ "setting__play_quality": "優先播放320K品質的歌曲(如果支持)", "setting__play_save_play_time": "記住播放進度", "setting__play_task_bar": "在任務欄上顯示當前歌曲播放進度", + "setting__play_timeout": "定時暫停", "setting__search": "搜索設置", "setting__search_focus_search_box": "啟動時自動聚焦搜索框", "setting__search_history": "顯示歷史搜索記錄", @@ -398,12 +411,16 @@ "theme_purple": "重斤球紫", "theme_red": "熱情似火", "theme_yellow": "信口雌黃", + "user_api__allow_show_update_alert": "允許顯示更新彈窗", "user_api__btn_export": "導出", "user_api__btn_import": "導入", "user_api__btn_remove": "移除", "user_api__import_file": "選擇音樂API腳本文件", + "user_api__max_tip": "最多只能同時存在20個源哦🤪\n想要繼續導入的話,請先移除一些舊的源騰出位置吧", "user_api__noitem": "這裡竟然是空的 😲", "user_api__note": "提示:雖然我們已經盡可能地隔離了腳本的運行環境,但導入包含惡意行為的腳本仍可能會影響你的系統,請謹慎導入。", "user_api__readme": "源編寫說明:", - "user_api__title": "自定義源管理" + "user_api__title": "自定義源管理", + "user_api__update_alert": "自定義源 [{name}] 發現新版本:", + "user_api__update_alert_open_url": "打開更新地址" } diff --git a/src/main/events/index.js b/src/main/events/index.js index 9b543697..96352005 100644 --- a/src/main/events/index.js +++ b/src/main/events/index.js @@ -6,6 +6,7 @@ const Tray = require('./Tray') const WinLyric = require('./WinLyric') const HotKey = require('./HotKey') +const { Event: TaskBar } = require('../modules/taskbar') const { Event: UserApi } = require('../modules/userApi') const { Event: Sync } = require('../modules/sync') @@ -15,5 +16,6 @@ if (!global.lx_event.tray) global.lx_event.tray = new Tray() if (!global.lx_event.winLyric) global.lx_event.winLyric = new WinLyric() if (!global.lx_event.hotKey) global.lx_event.hotKey = new HotKey() +if (!global.lx_event.taskbar) global.lx_event.taskbar = new TaskBar() if (!global.lx_event.userApi) global.lx_event.userApi = new UserApi() if (!global.lx_event.sync) global.lx_event.sync = new Sync() diff --git a/src/main/index.js b/src/main/index.js index 9da5bba4..848e05a2 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -129,6 +129,10 @@ app.on('web-contents-created', (event, contents) => { event.preventDefault() } }) + + // disable create dictionary + // https://github.com/lyswhut/lx-music-desktop/issues/773 + contents.session.setSpellCheckerDictionaryDownloadURL('http://0.0.0.0') }) diff --git a/src/main/modules/index.js b/src/main/modules/index.js index b73a9c7e..362fe83d 100644 --- a/src/main/modules/index.js +++ b/src/main/modules/index.js @@ -2,4 +2,3 @@ require('./appMenu') require('./winLyric') require('./tray') require('./hotKey') -require('./userApi') diff --git a/src/main/modules/taskbar/event/event.js b/src/main/modules/taskbar/event/event.js new file mode 100644 index 00000000..fbf26aa8 --- /dev/null +++ b/src/main/modules/taskbar/event/event.js @@ -0,0 +1,11 @@ +const { EventEmitter } = require('events') +const TASKBAR_EVENT_NAME = require('./name') + +class TaskBar extends EventEmitter { + thumbarButtonClick(type) { + this.emit(TASKBAR_EVENT_NAME.thumbarButtonClick, type) + } +} + +module.exports = TaskBar + diff --git a/src/main/modules/taskbar/event/name.js b/src/main/modules/taskbar/event/name.js new file mode 100644 index 00000000..822f5456 --- /dev/null +++ b/src/main/modules/taskbar/event/name.js @@ -0,0 +1,3 @@ +module.exports = { + thumbarButtonClick: 'thumbarButtonClick', +} diff --git a/src/main/modules/taskbar/index.js b/src/main/modules/taskbar/index.js new file mode 100644 index 00000000..05a3694f --- /dev/null +++ b/src/main/modules/taskbar/index.js @@ -0,0 +1,92 @@ +const path = require('path') +const Event = require('./event/event') +const eventNames = require('./event/name') + +exports.Event = Event +exports.eventNames = eventNames + +exports.setThumbnailClip = (region = { x: 0, y: 0, width: 0, height: 0 }) => { + if (!global.modules.mainWindow) return + return global.modules.mainWindow.setThumbnailClip(region) +} + +const getIconPath = name => { + return path.join(global.__static, 'images/taskbar', name + '.png') +} + +const buttonsFlags = { + empty: true, + collect: false, + play: false, + next: true, + prev: true, +} +const createButtons = ({ empty = false, collect = false, play = false, next = true, prev = true }) => { + const buttons = [ + collect + ? { + icon: getIconPath('collected'), + click() { + global.lx_event.taskbar.thumbarButtonClick('unCollect') + }, + tooltip: '取消收藏', + flags: ['nobackground'], + } + : { + icon: getIconPath('collect'), + click() { + global.lx_event.taskbar.thumbarButtonClick('collect') + }, + tooltip: '收藏', + flags: ['nobackground'], + }, + { + icon: getIconPath('prev'), + click() { + global.lx_event.taskbar.thumbarButtonClick('prev') + }, + tooltip: '上一曲', + flags: prev ? ['nobackground'] : ['nobackground', 'disabled'], + }, + play + ? { + icon: getIconPath('pause'), + click() { + global.lx_event.taskbar.thumbarButtonClick('pause') + }, + tooltip: '暂停', + flags: ['nobackground'], + } + : { + icon: getIconPath('play'), + click() { + global.lx_event.taskbar.thumbarButtonClick('play') + }, + tooltip: '播放', + flags: ['nobackground'], + }, + { + icon: getIconPath('next'), + click() { + global.lx_event.taskbar.thumbarButtonClick('next') + }, + tooltip: '下一曲', + flags: next ? ['nobackground'] : ['nobackground', 'disabled'], + }, + ] + if (empty) { + for (const button of buttons) { + button.flags = ['nobackground', 'disabled'] + } + } + return buttons +} +exports.setThumbarButtons = ({ empty, collect, play, next, prev } = buttonsFlags) => { + if (!global.modules.mainWindow) return + buttonsFlags.empty = empty + buttonsFlags.collect = collect + buttonsFlags.play = play + buttonsFlags.next = next + buttonsFlags.prev = prev + global.modules.mainWindow.setThumbarButtons(createButtons(buttonsFlags)) +} diff --git a/src/main/modules/userApi/event/event.js b/src/main/modules/userApi/event/event.js index b0c3a2cc..ff384904 100644 --- a/src/main/modules/userApi/event/event.js +++ b/src/main/modules/userApi/event/event.js @@ -5,6 +5,10 @@ class UserApi extends EventEmitter { status(info) { this.emit(USER_API_EVENT_NAME.status, info) } + + showUpdateAlert(info) { + this.emit(USER_API_EVENT_NAME.showUpdateAlert, info) + } } module.exports = UserApi diff --git a/src/main/modules/userApi/event/name.js b/src/main/modules/userApi/event/name.js index 5e57ccbf..865ce773 100644 --- a/src/main/modules/userApi/event/name.js +++ b/src/main/modules/userApi/event/name.js @@ -1,3 +1,4 @@ module.exports = { status: 'status', + showUpdateAlert: 'showUpdateAlert', } diff --git a/src/main/modules/userApi/index.js b/src/main/modules/userApi/index.js index 261675df..3a9bba72 100644 --- a/src/main/modules/userApi/index.js +++ b/src/main/modules/userApi/index.js @@ -1,8 +1,8 @@ const Event = require('./event/event') const eventNames = require('./event/name') const { closeWindow } = require('./main') -const { getUserApis, importApi, removeApi } = require('./utils') -const { request, cancelRequest, getStatus, loadApi } = require('./rendererEvent/rendererEvent') +const { getUserApis, importApi, removeApi, setAllowShowUpdateAlert: saveAllowShowUpdateAlert } = require('./utils') +const { request, cancelRequest, getStatus, loadApi, setAllowShowUpdateAlert } = require('./rendererEvent/rendererEvent') // const { getApiList, importApi, removeApi, setApi, getStatus, request, eventNames } let userApiId @@ -41,4 +41,7 @@ exports.setApi = async id => { await loadApi(id) } - +exports.setAllowShowUpdateAlert = (id, enable) => { + saveAllowShowUpdateAlert(id, enable) + setAllowShowUpdateAlert(id, enable) +} diff --git a/src/main/modules/userApi/main.js b/src/main/modules/userApi/main.js index f844eace..7b30f679 100644 --- a/src/main/modules/userApi/main.js +++ b/src/main/modules/userApi/main.js @@ -15,7 +15,6 @@ fs.readFile(path.join(dir, 'renderer/user-api.html'), 'utf8', (err, data) => { }) const denyEvents = [ - 'new-window', 'will-navigate', 'will-redirect', 'will-attach-webview', @@ -49,11 +48,13 @@ exports.createWindow = async userApi => { contextIsolation: true, // worldSafeExecuteJavaScript: true, nodeIntegration: false, + nodeIntegrationInWorker: false, spellcheck: false, autoplayPolicy: 'document-user-activation-required', enableWebSQL: false, disableDialogs: true, + nativeWindowOpen: false, webgl: false, images: false, @@ -70,6 +71,9 @@ exports.createWindow = async userApi => { // eslint-disable-next-line node/no-callback-literal callback(false) }) + global.modules.userApiWindow.webContents.setWindowOpenHandler(() => { + return { action: 'deny' } + }) winEvent(global.modules.userApiWindow) diff --git a/src/main/modules/userApi/renderer/preload.js b/src/main/modules/userApi/renderer/preload.js index 8e520e4c..18e2c3f5 100644 --- a/src/main/modules/userApi/renderer/preload.js +++ b/src/main/modules/userApi/renderer/preload.js @@ -3,14 +3,16 @@ const needle = require('needle') const { createCipheriv, publicEncrypt, constants, randomBytes, createHash } = require('crypto') const USER_API_RENDERER_EVENT_NAME = require('../rendererEvent/name') -const sendMessage = (action, status, data, message) => { - ipcRenderer.send(action, { status, data, message }) +const sendMessage = (action, data, status, message) => { + ipcRenderer.send(action, { data, status, message }) } let isInitedApi = false +let isShowedUpdateAlert = false const EVENT_NAMES = { request: 'request', inited: 'inited', + updateAlert: 'updateAlert', } const eventNames = Object.values(EVENT_NAMES) const events = { @@ -35,7 +37,7 @@ const supportActions = { const handleRequest = (context, { requestKey, data }) => { // console.log(data) - if (!events.request) return sendMessage(USER_API_RENDERER_EVENT_NAME.response, false, { requestKey }, 'Request event is not defined') + if (!events.request) return sendMessage(USER_API_RENDERER_EVENT_NAME.response, { requestKey }, false, 'Request event is not defined') try { events.request.call(context, { source: data.source, action: data.action, info: data.info }).then(response => { let sendData = { @@ -53,12 +55,12 @@ const handleRequest = (context, { requestKey, data }) => { } break } - sendMessage(USER_API_RENDERER_EVENT_NAME.response, true, sendData) + sendMessage(USER_API_RENDERER_EVENT_NAME.response, sendData, true) }).catch(err => { - sendMessage(USER_API_RENDERER_EVENT_NAME.response, false, { requestKey }, err.message) + sendMessage(USER_API_RENDERER_EVENT_NAME.response, { requestKey }, false, err.message) }) } catch (err) { - sendMessage(USER_API_RENDERER_EVENT_NAME.response, false, { requestKey }, err.message) + sendMessage(USER_API_RENDERER_EVENT_NAME.response, { requestKey }, false, err.message) } } @@ -80,7 +82,7 @@ const handleRequest = (context, { requestKey, data }) => { */ const handleInit = (context, info) => { if (!info) { - sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, 'Init failed') + sendMessage(USER_API_RENDERER_EVENT_NAME.init, null, false, 'Init failed') // sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, typeof info.message === 'string' ? info.message.substring(0, 100) : '') return } @@ -88,7 +90,7 @@ const handleInit = (context, info) => { sendMessage(USER_API_RENDERER_EVENT_NAME.openDevTools) } if (!info.status) { - sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, 'Init failed') + sendMessage(USER_API_RENDERER_EVENT_NAME.init, null, false, 'Init failed') // sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, typeof info.message === 'string' ? info.message.substring(0, 100) : '') return } @@ -109,16 +111,28 @@ const handleInit = (context, info) => { } } catch (error) { console.log(error) - sendMessage(USER_API_RENDERER_EVENT_NAME.init, false, null, error.message) + sendMessage(USER_API_RENDERER_EVENT_NAME.init, null, false, error.message) return } - sendMessage(USER_API_RENDERER_EVENT_NAME.init, true, sourceInfo) + sendMessage(USER_API_RENDERER_EVENT_NAME.init, sourceInfo, true) ipcRenderer.on(USER_API_RENDERER_EVENT_NAME.request, (event, data) => { handleRequest(context, data) }) } +const handleShowUpdateAlert = (data, resolve, reject) => { + if (!data || typeof data != 'object') return reject(new Error('parameter format error.')) + if (!data.log || typeof data.log != 'string') return reject(new Error('log is required.')) + if (data.updateUrl && !/^https?:\/\/[^\s$.?#].[^\s]*$/.test(data.updateUrl) && data.updateUrl.length > 1024) delete data.updateUrl + if (data.log.length > 1024) data.log = data.log.substring(0, 1024) + '...' + sendMessage(USER_API_RENDERER_EVENT_NAME.showUpdateAlert, { + log: data.log, + updateUrl: data.updateUrl, + }) + resolve() +} + contextBridge.exposeInMainWorld('lx', { EVENT_NAMES, request(url, { method = 'get', timeout, headers, body, form, formData }, callback) { @@ -165,12 +179,18 @@ contextBridge.exposeInMainWorld('lx', { if (!eventNames.includes(eventName)) return reject(new Error('The event is not supported: ' + eventName)) switch (eventName) { case EVENT_NAMES.inited: - if (isInitedApi) return + if (isInitedApi) return reject(new Error('Script is inited')) isInitedApi = true handleInit(this, data) + resolve() + break + case EVENT_NAMES.updateAlert: + if (isShowedUpdateAlert) return reject(new Error('The update alert can only be called once.')) + isShowedUpdateAlert = true + handleShowUpdateAlert(data, resolve, reject) break default: - resolve(new Error('Unknown event name: ' + eventName)) + reject(new Error('Unknown event name: ' + eventName)) } }) }, @@ -180,7 +200,9 @@ contextBridge.exposeInMainWorld('lx', { case EVENT_NAMES.request: events.request = handler break + default: return Promise.reject(new Error('The event is not supported: ' + eventName)) } + return Promise.resolve() }, utils: { crypto: { @@ -208,7 +230,7 @@ contextBridge.exposeInMainWorld('lx', { }, }, }, - version: '1.1.0', + version: '1.2.0', // removeEvent(eventName, handler) { // if (!eventNames.includes(eventName)) return Promise.reject(new Error('The event is not supported: ' + eventName)) // let handlers diff --git a/src/main/modules/userApi/rendererEvent/name.js b/src/main/modules/userApi/rendererEvent/name.js index c95c019e..d3040c7f 100644 --- a/src/main/modules/userApi/rendererEvent/name.js +++ b/src/main/modules/userApi/rendererEvent/name.js @@ -3,6 +3,7 @@ const names = { request: '', response: '', openDevTools: '', + showUpdateAlert: '', } diff --git a/src/main/modules/userApi/rendererEvent/rendererEvent.js b/src/main/modules/userApi/rendererEvent/rendererEvent.js index 076a80bb..e57088cc 100644 --- a/src/main/modules/userApi/rendererEvent/rendererEvent.js +++ b/src/main/modules/userApi/rendererEvent/rendererEvent.js @@ -3,6 +3,7 @@ const { mainOn, mainSend } = require('@common/ipc') const USER_API_RENDERER_EVENT_NAME = require('../rendererEvent/name') const { createWindow } = require('../main') const { getUserApis } = require('../utils') +const { openDevTools } = require('@main/utils') let userApi let status = { status: true } @@ -32,14 +33,22 @@ const handleResponse = (event, { status, data: { requestKey, result }, message } } const handleOpenDevTools = () => { if (global.modules.userApiWindow) { - global.modules.userApiWindow.webContents.openDevTools({ - mode: 'undocked', - }) + openDevTools(global.modules.userApiWindow.webContents) } } +const handleShowUpdateAlert = (event, { data }) => { + if (!userApi.allowShowUpdateAlert) return + global.lx_event.userApi.showUpdateAlert({ + name: userApi.name, + description: userApi.description, + log: data.log, + updateUrl: data.updateUrl, + }) +} mainOn(USER_API_RENDERER_EVENT_NAME.init, handleInit) mainOn(USER_API_RENDERER_EVENT_NAME.response, handleResponse) mainOn(USER_API_RENDERER_EVENT_NAME.openDevTools, handleOpenDevTools) +mainOn(USER_API_RENDERER_EVENT_NAME.showUpdateAlert, handleShowUpdateAlert) exports.loadApi = async apiId => { if (!apiId) return global.lx_event.userApi.status(status = { status: false, message: 'api id is null' }) @@ -82,3 +91,8 @@ exports.request = ({ requestKey, data }) => new Promise((resolve, reject) => { }) exports.getStatus = () => status + +exports.setAllowShowUpdateAlert = (id, enable) => { + if (!userApi || userApi.id != id) return + userApi.allowShowUpdateAlert = enable +} diff --git a/src/main/modules/userApi/utils/index.js b/src/main/modules/userApi/utils/index.js index 27aa183e..7d8de509 100644 --- a/src/main/modules/userApi/utils/index.js +++ b/src/main/modules/userApi/utils/index.js @@ -11,6 +11,9 @@ exports.getUserApis = () => { userApis = defaultUserApis electronStore_userApi.set('userApis', userApis) } + for (const api of userApis) { + if (api.allowShowUpdateAlert == null) api.allowShowUpdateAlert = false + } return userApis } @@ -27,6 +30,7 @@ exports.importApi = script => { name, description, script, + allowShowUpdateAlert: true, } userApis.push(apiInfo) getStore('userApi').set('userApis', userApis) @@ -42,3 +46,10 @@ exports.removeApi = ids => { } getStore('userApi').set('userApis', userApis) } + +exports.setAllowShowUpdateAlert = (id, enable) => { + const targetApi = userApis.find(api => api.id == id) + if (!targetApi) return + targetApi.allowShowUpdateAlert = enable + getStore('userApi').set('userApis', userApis) +} diff --git a/src/main/rendererEvents/index.js b/src/main/rendererEvents/index.js index ef0960f1..c5f870e4 100644 --- a/src/main/rendererEvents/index.js +++ b/src/main/rendererEvents/index.js @@ -1,4 +1,4 @@ - +const { isWin } = require('@common/utils') // require('./request') // require('./appName') require('./progressBar') @@ -23,6 +23,8 @@ require('./systemFonts') require('./wait') require('./openDevtools') +if (isWin) require('./taskbar') + // require('./kw_decodeLyric') require('./userApi') diff --git a/src/main/rendererEvents/openDevtools.js b/src/main/rendererEvents/openDevtools.js index 20d6626d..cb8bee00 100644 --- a/src/main/rendererEvents/openDevtools.js +++ b/src/main/rendererEvents/openDevtools.js @@ -1,13 +1,12 @@ const { mainOn, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc') +const { openDevTools } = require('@main/utils') mainOn(ipcMainWindowNames.open_dev_tools, event => { if (global.modules.mainWindow) { if (global.modules.mainWindow.isDevToolsOpened()) { global.modules.mainWindow.webContents.closeDevTools() } else { - global.modules.mainWindow.webContents.openDevTools({ - mode: 'undocked', - }) + openDevTools(global.modules.mainWindow.webContents) } } }) diff --git a/src/main/rendererEvents/taskbar.js b/src/main/rendererEvents/taskbar.js new file mode 100644 index 00000000..c128a3ec --- /dev/null +++ b/src/main/rendererEvents/taskbar.js @@ -0,0 +1,18 @@ +const { mainSend, mainOn, NAMES: { mainWindow: ipcMainWindowNames }, mainHandle } = require('@common/ipc') +const { setThumbnailClip, setThumbarButtons, eventNames } = require('../modules/taskbar') +const { mainWindow: MAIN_WINDOW_EVENT_NAME } = require('@main/events/_name') + +const handleThumbarButtonClick = action => { + mainSend(global.modules.mainWindow, ipcMainWindowNames.taskbar_on_thumbar_button_click, action) +} + +global.lx_event.taskbar.on(eventNames.thumbarButtonClick, handleThumbarButtonClick) +global.lx_event.mainWindow.on(MAIN_WINDOW_EVENT_NAME.show, setThumbarButtons) + +mainHandle(ipcMainWindowNames.taskbar_set_thumbnail_clip, (event, clip) => { + return setThumbnailClip(clip) +}) + +mainOn(ipcMainWindowNames.taskbar_set_thumbar_buttons, (event, buttons) => { + setThumbarButtons(buttons) +}) diff --git a/src/main/rendererEvents/userApi.js b/src/main/rendererEvents/userApi.js index 0f1599b6..559386c0 100644 --- a/src/main/rendererEvents/userApi.js +++ b/src/main/rendererEvents/userApi.js @@ -1,11 +1,15 @@ const { mainSend, mainHandle, NAMES: { mainWindow: ipcMainWindowNames } } = require('@common/ipc') -const { getApiList, importApi, removeApi, setApi, getStatus, request, cancelRequest, eventNames } = require('../modules/userApi') +const { getApiList, importApi, removeApi, setApi, getStatus, request, cancelRequest, eventNames, setAllowShowUpdateAlert } = require('../modules/userApi') const handleStatusChange = status => { mainSend(global.modules.mainWindow, ipcMainWindowNames.user_api_status, status) } +const handleShowUpdateAlert = info => { + mainSend(global.modules.mainWindow, ipcMainWindowNames.user_api_show_update_alert, info) +} global.lx_event.userApi.on(eventNames.status, handleStatusChange) +global.lx_event.userApi.on(eventNames.showUpdateAlert, handleShowUpdateAlert) mainHandle(ipcMainWindowNames.import_user_api, async(event, script) => { return importApi(script) @@ -27,6 +31,10 @@ mainHandle(ipcMainWindowNames.get_user_api_status, event => { return getStatus() }) +mainHandle(ipcMainWindowNames.user_api_set_allow_update_alert, (event, { id, enable }) => { + return setAllowShowUpdateAlert(id, enable) +}) + mainHandle(ipcMainWindowNames.request_user_api, (event, musicInfo) => { return request(musicInfo) }) diff --git a/src/main/rendererEvents/wait.js b/src/main/rendererEvents/wait.js index a6d99368..ca8d842d 100644 --- a/src/main/rendererEvents/wait.js +++ b/src/main/rendererEvents/wait.js @@ -1,4 +1,4 @@ -const { mainOn, mainHandle, NAMES: { mainWindow: ipcMainWindowNames } } = require('@common/ipc') +const { mainOn, mainHandle, mainSend, NAMES: { mainWindow: ipcMainWindowNames } } = require('@common/ipc') const timeoutMap = new Map() @@ -23,3 +23,24 @@ mainOn(ipcMainWindowNames.wait_cancel, (event, id) => { clearTimeout(timeout.timeout) timeout.reject('cancelled') }) + +mainOn(ipcMainWindowNames.interval, (event, { time, id }) => { + if (timeoutMap.has(id)) return + const timeout = setInterval(() => { + if (global.modules.mainWindow) mainSend(global.modules.mainWindow, ipcMainWindowNames.interval_callback, id) + }, time) + + timeoutMap.set(id, { + timeout, + type: 'interval', + time, + }) +}) + +mainOn(ipcMainWindowNames.interval_cancel, (event, id) => { + if (!timeoutMap.has(id)) return + const timeout = timeoutMap.get(id) + timeoutMap.delete(id) + if (timeout.type != 'interval') return + clearInterval(timeout.timeout) +}) diff --git a/src/main/rendererEvents/winEvent.js b/src/main/rendererEvents/winEvent.js index 89fad810..6e983023 100644 --- a/src/main/rendererEvents/winEvent.js +++ b/src/main/rendererEvents/winEvent.js @@ -1,4 +1,5 @@ const { isWin } = require('../../common/utils') +const { openDevTools } = require('@main/utils') const { mainSend, NAMES: { mainWindow: ipcMainWindowNames } } = require('../../common/ipc') global.isQuitting = false global.isTrafficLightClose = false // 是否点击软件上的关闭按钮关闭 @@ -30,6 +31,7 @@ module.exports = mainWindow => { mainWindow.once('ready-to-show', () => { mainWindow.show() global.lx_event.mainWindow.readyToShow() + if (global.envParams.cmdParams.debug) openDevTools(global.modules.mainWindow.webContents) }) mainWindow.on('show', () => { diff --git a/src/main/utils/index.js b/src/main/utils/index.js index 53c974bc..ac83ce72 100644 --- a/src/main/utils/index.js +++ b/src/main/utils/index.js @@ -41,3 +41,9 @@ exports.initSetting = (isShowErrorAlert = true) => { global.appSetting = info.setting global.appSettingVersion = info.version } + +exports.openDevTools = webContents => { + webContents.openDevTools({ + mode: 'undocked', + }) +} diff --git a/src/renderer-lyric/assets/styles/reset.less b/src/renderer-lyric/assets/styles/reset.less index 0e5f2e0c..7a1ea2bc 100644 --- a/src/renderer-lyric/assets/styles/reset.less +++ b/src/renderer-lyric/assets/styles/reset.less @@ -23,6 +23,9 @@ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } +html { + font-family: "Microsoft YaHei", "Microsoft Jhenghei", "PingFang SC", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans", "Noto Sans CJK Sc", sans-serif; +} body { line-height: 1; } @@ -41,3 +44,6 @@ table { border-collapse: collapse; border-spacing: 0; } +button { + font-family: inherit; +} diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 73495798..651b6168 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -20,13 +20,20 @@ import useApp from '@renderer/core/useApp' export default { setup() { const theme = useRefGetter('theme') + const font = useRefGetter('font') const dom_root = document.getElementById('root') watch(theme, (val) => { dom_root.className = val + }, { + immediate: true, + }) + watch(font, (val) => { + document.documentElement.style.fontFamily = val + }, { + immediate: true, }) - dom_root.className = theme.value useApp() diff --git a/src/renderer/assets/styles/reset.less b/src/renderer/assets/styles/reset.less index 0e5f2e0c..7a1ea2bc 100644 --- a/src/renderer/assets/styles/reset.less +++ b/src/renderer/assets/styles/reset.less @@ -23,6 +23,9 @@ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } +html { + font-family: "Microsoft YaHei", "Microsoft Jhenghei", "PingFang SC", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Source Han Sans", "Noto Sans CJK Sc", sans-serif; +} body { line-height: 1; } @@ -41,3 +44,6 @@ table { border-collapse: collapse; border-spacing: 0; } +button { + font-family: inherit; +} diff --git a/src/renderer/assets/styles/variables.less b/src/renderer/assets/styles/variables.less index 0b271fb8..e13dc2c3 100644 --- a/src/renderer/assets/styles/variables.less +++ b/src/renderer/assets/styles/variables.less @@ -49,7 +49,7 @@ @color-player-pic-c2: darken(@color-theme_2, 30%); @color-player-progress: darken(@color-theme_2, 6%); @color-player-progress-bar1: darken(@color-theme_2, 12%); -@color-player-progress-bar2: lighten(@color-theme, 12%); +@color-player-progress-bar2: fadeout(lighten(@color-theme, 12%), 20%); @color-player-status-text: lighten(@color-theme_2-font, 32%); @color-player-detail-lyric: fadeout(@color-theme_2-font, 40%); @color-player-detail-lyric-active: darken(@color-theme, 2%); @@ -114,7 +114,7 @@ @color-green-player-pic-c2: darken(@color-green-theme_2, 30%); @color-green-player-progress: darken(@color-green-theme_2, 6%); @color-green-player-progress-bar1: darken(@color-green-theme_2, 12%); -@color-green-player-progress-bar2: lighten(@color-green-theme, 12%); +@color-green-player-progress-bar2: fadeout(lighten(@color-green-theme, 12%), 20%); @color-green-player-status-text: lighten(@color-green-theme_2-font, 32%); @color-green-player-detail-lyric: fadeout(@color-green-theme_2-font, 40%); @color-green-player-detail-lyric-active: darken(@color-green-theme, 2%); @@ -174,7 +174,7 @@ @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, 2%); +@color-yellow-player-progress-bar2: fadeout(lighten(@color-yellow-theme, 2%), 20%); @color-yellow-player-status-text: lighten(@color-yellow-theme_2-font, 32%); @color-yellow-player-detail-lyric: fadeout(@color-yellow-theme_2-font, 40%); @color-yellow-player-detail-lyric-active: darken(@color-yellow-theme, 7%); @@ -233,7 +233,7 @@ @color-orange-player-pic-c2: darken(@color-orange-theme_2, 30%); @color-orange-player-progress: darken(@color-orange-theme_2, 6%); @color-orange-player-progress-bar1: darken(@color-orange-theme_2, 12%); -@color-orange-player-progress-bar2: lighten(@color-orange-theme, 12%); +@color-orange-player-progress-bar2: fadeout(lighten(@color-orange-theme, 12%), 20%); @color-orange-player-status-text: lighten(@color-orange-theme_2-font, 32%); @color-orange-player-detail-lyric: fadeout(@color-orange-theme_2-font, 40%); @color-orange-player-detail-lyric-active: darken(@color-orange-theme, 7%); @@ -292,7 +292,7 @@ @color-blue-player-pic-c2: darken(@color-blue-theme_2, 30%); @color-blue-player-progress: darken(@color-blue-theme_2, 6%); @color-blue-player-progress-bar1: darken(@color-blue-theme_2, 12%); -@color-blue-player-progress-bar2: lighten(@color-blue-theme, 12%); +@color-blue-player-progress-bar2: fadeout(lighten(@color-blue-theme, 12%), 20%); @color-blue-player-status-text: lighten(@color-blue-theme_2-font, 32%); @color-blue-player-detail-lyric: fadeout(@color-blue-theme_2-font, 40%); @color-blue-player-detail-lyric-active: darken(@color-blue-theme, 2%); @@ -351,7 +351,7 @@ @color-red-player-pic-c2: darken(@color-red-theme_2, 30%); @color-red-player-progress: darken(@color-red-theme_2, 6%); @color-red-player-progress-bar1: darken(@color-red-theme_2, 12%); -@color-red-player-progress-bar2: lighten(@color-red-theme, 12%); +@color-red-player-progress-bar2: fadeout(lighten(@color-red-theme, 12%), 20%); @color-red-player-status-text: lighten(@color-red-theme_2-font, 32%); @color-red-player-detail-lyric: fadeout(@color-red-theme_2-font, 40%); @color-red-player-detail-lyric-active: lighten(@color-red-theme, 2%); @@ -412,7 +412,7 @@ @color-pink-player-pic-c2: darken(@color-pink-theme_2, 30%); @color-pink-player-progress: darken(@color-pink-theme_2, 6%); @color-pink-player-progress-bar1: darken(@color-pink-theme_2, 12%); -@color-pink-player-progress-bar2: lighten(@color-pink-theme, 2%); +@color-pink-player-progress-bar2: fadeout(lighten(@color-pink-theme, 2%), 20%); @color-pink-player-status-text: lighten(@color-pink-theme_2-font, 32%); @color-pink-player-detail-lyric: fadeout(@color-pink-theme_2-font, 40%); @color-pink-player-detail-lyric-active: darken(@color-pink-theme, 2%); @@ -471,7 +471,7 @@ @color-purple-player-pic-c2: darken(@color-purple-theme_2, 30%); @color-purple-player-progress: darken(@color-purple-theme_2, 6%); @color-purple-player-progress-bar1: darken(@color-purple-theme_2, 12%); -@color-purple-player-progress-bar2: lighten(@color-purple-theme, 12%); +@color-purple-player-progress-bar2: fadeout(lighten(@color-purple-theme, 12%), 20%); @color-purple-player-status-text: lighten(@color-purple-theme_2-font, 32%); @color-purple-player-detail-lyric: fadeout(@color-purple-theme_2-font, 40%); @color-purple-player-detail-lyric-active: darken(@color-purple-theme, 2%); @@ -530,7 +530,7 @@ @color-grey-player-pic-c2: darken(@color-grey-theme_2, 30%); @color-grey-player-progress: darken(@color-grey-theme_2, 6%); @color-grey-player-progress-bar1: darken(@color-grey-theme_2, 12%); -@color-grey-player-progress-bar2: lighten(@color-grey-theme, 12%); +@color-grey-player-progress-bar2: fadeout(lighten(@color-grey-theme, 12%), 20%); @color-grey-player-status-text: lighten(@color-grey-theme_2-font, 32%); @color-grey-player-detail-lyric: fadeout(@color-grey-theme_2-font, 55%); @color-grey-player-detail-lyric-active: darken(@color-grey-theme, 3%); @@ -590,7 +590,7 @@ @color-ming-player-pic-c2: darken(@color-ming-theme_2, 30%); @color-ming-player-progress: darken(@color-ming-theme_2, 6%); @color-ming-player-progress-bar1: darken(@color-ming-theme_2, 12%); -@color-ming-player-progress-bar2: lighten(@color-ming-theme, 12%); +@color-ming-player-progress-bar2: fadeout(lighten(@color-ming-theme, 12%), 20%); @color-ming-player-status-text: lighten(@color-ming-theme_2-font, 32%); @color-ming-player-detail-lyric: fadeout(@color-ming-theme_2-font, 50%); @color-ming-player-detail-lyric-active: lighten(@color-ming-theme, 2%); @@ -652,7 +652,7 @@ @color-blue2-player-pic-c2: darken(@color-blue2-theme_2, 30%); @color-blue2-player-progress: darken(@color-blue2-theme_2, 6%); @color-blue2-player-progress-bar1: darken(@color-blue2-theme_2, 12%); -@color-blue2-player-progress-bar2: lighten(@color-blue2-theme, 12%); +@color-blue2-player-progress-bar2: fadeout(lighten(@color-blue2-theme, 12%), 20%); @color-blue2-player-status-text: lighten(@color-blue2-theme_2-font, 32%); @color-blue2-player-detail-lyric: fadeout(@color-blue2-theme_2-font, 50%); @color-blue2-player-detail-lyric-active: darken(@color-blue2-theme, 2%); @@ -712,7 +712,7 @@ @color-black-player-pic-c2: lighten(@color-black-theme_2, 30%); @color-black-player-progress: lighten(@color-black-theme_2, 6%); @color-black-player-progress-bar1: lighten(@color-black-theme_2, 12%); -@color-black-player-progress-bar2: lighten(@color-black-theme, 12%); +@color-black-player-progress-bar2: fadeout(lighten(@color-black-theme, 12%), 20%); @color-black-player-status-text: darken(@color-black-theme_2-font, 20%); @color-black-player-detail-lyric: fadeout(darken(@color-black-theme_2-font, 30%), 10%); @color-black-player-detail-lyric-active: lighten(@color-black-theme, 50%); @@ -772,7 +772,7 @@ @color-mid_autumn-player-pic-c2: darken(@color-mid_autumn-theme_2, 30%); @color-mid_autumn-player-progress: darken(@color-mid_autumn-theme_2, 10%); @color-mid_autumn-player-progress-bar1: darken(@color-mid_autumn-theme_2, 12%); -@color-mid_autumn-player-progress-bar2: lighten(@color-mid_autumn-theme, 12%); +@color-mid_autumn-player-progress-bar2: fadeout(lighten(@color-mid_autumn-theme, 12%), 20%); @color-mid_autumn-player-status-text: lighten(@color-mid_autumn-theme_2-font, 32%); @color-mid_autumn-player-detail-lyric: fadeout(@color-mid_autumn-theme_2-font, 40%); @color-mid_autumn-player-detail-lyric-active: lighten(@color-mid_autumn-theme, 7%); @@ -832,7 +832,7 @@ @color-mid_autumn-player-pic-c2: darken(@color-mid_autumn-theme_2, 30%); @color-mid_autumn-player-progress: darken(@color-mid_autumn-theme_2, 10%); @color-mid_autumn-player-progress-bar1: darken(@color-mid_autumn-theme_2, 12%); -@color-mid_autumn-player-progress-bar2: lighten(@color-mid_autumn-theme, 12%); +@color-mid_autumn-player-progress-bar2: fadeout(lighten(@color-mid_autumn-theme, 12%), 20%); @color-mid_autumn-player-status-text: lighten(@color-mid_autumn-theme_2-font, 32%); @color-mid_autumn-player-detail-lyric: lighten(@color-mid_autumn-theme, 7%); @color-mid_autumn-player-detail-lyric-active: lighten(@color-mid_autumn-theme, 7%); @@ -891,7 +891,7 @@ @color-naruto-player-pic-c2: darken(@color-naruto-theme_2, 30%); @color-naruto-player-progress: darken(@color-naruto-theme_2, 10%); @color-naruto-player-progress-bar1: darken(@color-naruto-theme_2, 12%); -@color-naruto-player-progress-bar2: lighten(@color-naruto-theme, 12%); +@color-naruto-player-progress-bar2: fadeout(lighten(@color-naruto-theme, 12%), 20%); @color-naruto-player-status-text: lighten(@color-naruto-theme_2-font, 32%); @color-naruto-player-detail-lyric: fadeout(@color-naruto-theme_2-font, 36%); @color-naruto-player-detail-lyric-active: darken(@color-naruto-theme, 7%); @@ -950,7 +950,7 @@ @color-happy_new_year-player-pic-c2: darken(@color-happy_new_year-theme_2, 30%); @color-happy_new_year-player-progress: darken(@color-happy_new_year-theme_2, 10%); @color-happy_new_year-player-progress-bar1: darken(@color-happy_new_year-theme_2, 5%); -@color-happy_new_year-player-progress-bar2: lighten(@color-happy_new_year-theme, 5%); +@color-happy_new_year-player-progress-bar2: fadeout(lighten(@color-happy_new_year-theme, 5%), 20%); @color-happy_new_year-player-status-text: lighten(@color-happy_new_year-theme_2-font, 32%); @color-happy_new_year-player-detail-lyric: fadeout(@color-happy_new_year-theme_2-font, 36%); @color-happy_new_year-player-detail-lyric-active: darken(@color-happy_new_year-theme, 7%); diff --git a/src/renderer/components/base/Checkbox.vue b/src/renderer/components/base/Checkbox.vue index dfbe0af4..b80cc807 100644 --- a/src/renderer/components/base/Checkbox.vue +++ b/src/renderer/components/base/Checkbox.vue @@ -41,6 +41,7 @@ export default { default: false, }, }, + emits: ['update:modelValue', 'change'], data() { return { bool: false, diff --git a/src/renderer/components/base/Input.vue b/src/renderer/components/base/Input.vue index ec3a5a22..9ae89be4 100644 --- a/src/renderer/components/base/Input.vue +++ b/src/renderer/components/base/Input.vue @@ -24,7 +24,7 @@ export default { default: false, }, modelValue: { - type: String, + type: [String, Number], default: '', }, type: { diff --git a/src/renderer/components/common/ProgressBar.vue b/src/renderer/components/common/ProgressBar.vue index 93c3c6fc..0dfe2c3b 100644 --- a/src/renderer/components/common/ProgressBar.vue +++ b/src/renderer/components/common/ProgressBar.vue @@ -125,14 +125,13 @@ export default { .progress-bar2 { background-color: @color-player-progress-bar2; - box-shadow: 0 0 2px rgba(0, 0, 0, 0.3); - opacity: 0.8; + will-change: transform; } .progress-bar3 { background-color: @color-player-progress-bar2; box-shadow: 0 0 2px rgba(0, 0, 0, 0.3); - opacity: 0.3; + opacity: 0.5; } .bar-transition { diff --git a/src/renderer/components/core/PlayBar/index.vue b/src/renderer/components/core/PlayBar/index.vue index 3b6568fb..169f7c4f 100644 --- a/src/renderer/components/core/PlayBar/index.vue +++ b/src/renderer/components/core/PlayBar/index.vue @@ -10,12 +10,13 @@ div(:class="$style.player") div(:class="$style.title" @click="handleCopy(title)" :tips="title + $t('copy_tip')") {{title}} control-btns div(:class="$style.column2") - common-progress-bar(:progress="progress" :handleTransitionEnd="handleTransitionEnd" :isActiveTransition="isActiveTransition") + common-progress-bar(:progress="progress" :handleTransitionEnd="handleTransitionEnd" :isActiveTransition="isActiveTransition" v-if="!isShowPlayerDetail") div(:class="$style.column3") - span(:class="$style.statusText") {{statusText}} - span {{nowPlayTimeStr}} - span(style="margin: 0 5px;") / - span {{maxPlayTimeStr}} + template(v-if="!isShowPlayerDetail") + span(:class="$style.statusText") {{statusText}} + span {{nowPlayTimeStr}} + span(style="margin: 0 5px;") / + span {{maxPlayTimeStr}} div(:class="$style.right") div(:class="$style.playBtn" @click='playPrev' :tips="$t('player__prev')" style="transform: rotate(180deg);") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve') @@ -48,7 +49,17 @@ import { player as eventPlayerNames } from '@renderer/event/names' import ControlBtns from './ControlBtns' import usePlayProgress from '@renderer/utils/compositions/usePlayProgress' // import { lyric } from '@renderer/core/share/lyric' -import { statusText, musicInfo, setMusicInfo, setShowPlayerDetail, isPlay, musicInfoItem, playInfo, playMusicInfo } from '@renderer/core/share/player' +import { + statusText, + musicInfo, + setMusicInfo, + isShowPlayerDetail, + setShowPlayerDetail, + isPlay, + musicInfoItem, + playInfo, + playMusicInfo, +} from '@renderer/core/share/player' export default { name: 'CorePlayBar', @@ -138,6 +149,7 @@ export default { playNext, playPrev, handleToMusicLocation, + isShowPlayerDetail, } }, } diff --git a/src/renderer/components/core/PlayDetail/LyricPlayer.vue b/src/renderer/components/core/PlayDetail/LyricPlayer.vue index e62d2552..1db3cb57 100644 --- a/src/renderer/components/core/PlayDetail/LyricPlayer.vue +++ b/src/renderer/components/core/PlayDetail/LyricPlayer.vue @@ -2,11 +2,11 @@
-
+
-
+
{{info.text}}
diff --git a/src/renderer/components/core/PlayDetail/PlayBar.vue b/src/renderer/components/core/PlayDetail/PlayBar.vue index 2384efd3..6e25628a 100644 --- a/src/renderer/components/core/PlayDetail/PlayBar.vue +++ b/src/renderer/components/core/PlayDetail/PlayBar.vue @@ -6,11 +6,10 @@ div(:class="$style.footer") div(:class="$style.progressContent") common-progress-bar(:class-name="$style.progress" :progress="progress" :handleTransitionEnd="handleTransitionEnd" :isActiveTransition="isActiveTransition") div(:class="$style.timeLabel") - span(style="margin-left: 15px") {{status}} - div - span {{nowPlayTimeStr}} - span(style="margin: 0 5px;") / - span {{maxPlayTimeStr}} + span(:class="$style.status" style="margin-left: 15px") {{status}} + span {{nowPlayTimeStr}} + span(style="margin: 0 5px;") / + span {{maxPlayTimeStr}} div(:class="$style.playControl") div(:class="$style.playBtn" @click="playPrev" style="transform: rotate(180deg);" :tips="$t('player__prev')") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve') @@ -91,7 +90,7 @@ export default { .progress-content { position: relative; - height: 15px; + height: 16px; padding: 5px 0; width: 100%; } @@ -108,11 +107,13 @@ export default { width: 100%; height: 18px; display: flex; - justify-content: space-between; span { font-size: 13px; } } +.status { + flex: auto; +} .play-control { flex: none; diff --git a/src/renderer/components/core/PlayDetail/components/MusicComment/index.vue b/src/renderer/components/core/PlayDetail/components/MusicComment/index.vue index b7d8be22..8b29c141 100644 --- a/src/renderer/components/core/PlayDetail/components/MusicComment/index.vue +++ b/src/renderer/components/core/PlayDetail/components/MusicComment/index.vue @@ -1,5 +1,5 @@ diff --git a/src/renderer/views/Search.vue b/src/renderer/views/Search.vue index 315b075e..edfffd6d 100644 --- a/src/renderer/views/Search.vue +++ b/src/renderer/views/Search.vue @@ -2,7 +2,7 @@ div(:class="$style.search") //- transition div(:class="$style.header") - base-tab(:class="$style.tab" :list="sources" align="left" item-key="id" item-name="name" v-model="searchSourceId") + base-tab(:class="$style.tab" :list="sources" align="left" item-key="id" item-name="name" @change="handleSourceChange" v-model="searchSourceId") div(:class="$style.main") div(:class="$style.list" v-show="isLoading || listInfo.list.length") div.thead(:class="$style.thead") @@ -109,12 +109,28 @@ export default { isLoading: false, } }, - beforeRouteUpdate(to, from, next) { - if (to.query.text === undefined) return - this.text = to.query.text - this.page = 1 - this.handleSearch(this.text, this.page) - next() + beforeRouteUpdate(to, from) { + if (to.query.source && (this.sourceList[to.query.source] || to.query.source == 'all')) { + if (this.setting.search.searchSource != to.query.source) { + this.setSearchSource({ + searchSource: to.query.source, + }) + } + if (this.searchSourceId != to.query.source) { + this.searchSourceId = to.query.source + } + this.$nextTick(() => { + this.handleGetHotSearch() + }) + } + if (to.query.text != null && this.text != to.query.text) { + this.text = to.query.text + } + + this.$nextTick(() => { + this.page = 1 + this.handleSearch(this.text, this.page) + }) }, created() { this.listenEvent() @@ -124,18 +140,20 @@ export default { }, mounted() { // console.log('mounted') - - // 处理搜索源不存在时页面报错的问题 - if (!this.sourceList[this.setting.search.searchSource] && this.setting.search.searchSource != 'all') { + if (this.$route.query.source && (this.sourceList[this.$route.query.source] || this.$route.query.source == 'all')) { + this.setSearchSource({ + searchSource: this.$route.query.source, + }) + } else if (!this.sourceList[this.setting.search.searchSource] && this.setting.search.searchSource != 'all') { // 处理搜索源不存在时页面报错的问题 this.setSearchSource({ searchSource: 'kw', }) } this.searchSourceId = this.setting.search.searchSource - if (this.$route.query.text === undefined) { + if (this.$route.query.text == null) { this.text = this.$store.getters['search/searchText'] this.page = this.listInfo.page - } else if (this.$route.query.text === '') { + } else if (this.$route.query.text == '') { this.clearList() } else { this.text = this.$route.query.text @@ -156,18 +174,6 @@ export default { 'listInfo.list'() { this.removeAllSelect() }, - searchSourceId(n) { - if (n === this.setting.search.searchSource) return - if (this.text !== '') this.isLoading = true - this.$nextTick(() => { - this.page = 1 - this.handleSearch(this.text, this.page) - this.handleGetHotSearch() - }) - this.setSearchSource({ - searchSource: n, - }) - }, }, computed: { ...mapGetters(['userInfo', 'setting']), @@ -417,7 +423,7 @@ export default { this.getHotSearch(this.setting.search.searchSource) }, handleNoitemSearch(text) { - this.$router.push({ + this.$router.replace({ path: 'search', query: { text, @@ -512,6 +518,15 @@ export default { break } }, + handleSourceChange(source) { + this.$router.replace({ + path: 'search', + query: { + text: this.text, + source, + }, + }) + }, }, } diff --git a/src/renderer/views/list/components/MyLists.vue b/src/renderer/views/list/components/MyLists.vue index c083a66c..733ec502 100644 --- a/src/renderer/views/list/components/MyLists.vue +++ b/src/renderer/views/list/components/MyLists.vue @@ -19,7 +19,7 @@ {{loveList.name}}
  • {{item.name}} @@ -41,7 +41,7 @@ + + + diff --git a/src/renderer/views/setting/components/SettingBasic.vue b/src/renderer/views/setting/components/SettingBasic.vue index d5724a3f..9843a748 100644 --- a/src/renderer/views/setting/components/SettingBasic.vue +++ b/src/renderer/views/setting/components/SettingBasic.vue @@ -9,12 +9,15 @@ dd label {{$t('theme_' + theme.className)}} dd - .gap-top.top - base-checkbox(id="setting_show_animate" v-model="currentStting.isShowAnimation" :label="$t('setting__basic_show_animation')") - .gap-top - base-checkbox(id="setting_animate" v-model="currentStting.randomAnimate" :label="$t('setting__basic_animation')") - .gap-top - base-checkbox(id="setting_to_tray" v-model="currentStting.tray.isShow" :label="$t('setting__basic_to_tray')") + div + .gap-top.top + base-checkbox(id="setting_show_animate" v-model="currentStting.isShowAnimation" :label="$t('setting__basic_show_animation')") + .gap-top + base-checkbox(id="setting_animate" v-model="currentStting.randomAnimate" :label="$t('setting__basic_animation')") + .gap-top + base-checkbox(id="setting_to_tray" v-model="currentStting.tray.isShow" :label="$t('setting__basic_to_tray')") + p.gap-top + base-btn.btn(min @click="isShowPlayTimeoutModal = true") {{$t('setting__play_timeout')}} {{ timeLabel ? ` (${timeLabel})` : '' }} dd(:tips="$t('setting__basic_source_title')") h3#basic_source {{$t('setting__basic_source')}} @@ -42,12 +45,17 @@ dd(:tips="$t('setting__basic_sourcename_title')") div base-checkbox.gap-left(v-for="item in sourceNameTypes" :key="item.id" :id="`setting_abasic_sourcename_${item.id}`" name="setting_basic_sourcename" need v-model="currentStting.sourceNameType" :value="item.id" :label="item.label") - dd h3#basic_control_btn_position {{$t('setting__basic_control_btn_position')}} div base-checkbox.gap-left(v-for="item in controlBtnPositionList" :key="item.id" :id="`setting_basic_control_btn_position_${item.id}`" name="setting_basic_control_btn_position" need v-model="currentStting.controlBtnPosition" :value="item.id" :label="item.name") +dd + h3#basic_font {{$t('setting__basic_font')}} + div + base-selection.gap-teft(:list="fontList" v-model="currentStting.font" item-key="id" item-name="label") + +play-timeout-modal(v-model="isShowPlayTimeoutModal") user-api-modal(v-model="isShowUserApiModal") @@ -58,12 +66,17 @@ import { langList } from '@/lang' import { currentStting } from '../setting' import { setWindowSize } from '@renderer/utils' import apiSourceInfo from '@renderer/utils/music/api-source-info' +import { useTimeout } from '@renderer/utils/timeoutStop' +import { getSystemFonts } from '@renderer/utils/tools' +import PlayTimeoutModal from './PlayTimeoutModal' import UserApiModal from './UserApiModal' + export default { name: 'SettingBasic', components: { + PlayTimeoutModal, UserApiModal, }, setup() { @@ -81,6 +94,9 @@ export default { apiSource.value = visible }) + const isShowPlayTimeoutModal = ref(false) + const { timeLabel } = useTimeout() + const isShowUserApiModal = ref(false) const getApiStatus = () => { let status @@ -134,16 +150,26 @@ export default { ] }) + const systemFontList = ref([]) + const fontList = computed(() => { + return [{ id: '', label: t('setting__desktop_lyric_font_default') }, ...systemFontList.value] + }) + getSystemFonts().then(fonts => { + systemFontList.value = fonts.map(f => ({ id: f, label: f.replace(/(^"|"$)/g, '') })) + }) return { currentStting, themes, + isShowPlayTimeoutModal, + timeLabel, apiSources, isShowUserApiModal, windowSizeList, langList, sourceNameTypes, controlBtnPositionList, + fontList, } }, } diff --git a/src/renderer/views/setting/components/SettingList.vue b/src/renderer/views/setting/components/SettingList.vue index ce4416fe..3e39325e 100644 --- a/src/renderer/views/setting/components/SettingList.vue +++ b/src/renderer/views/setting/components/SettingList.vue @@ -5,6 +5,8 @@ dd base-checkbox(id="setting_list_showSource_enable" v-model="currentStting.list.isShowSource" :label="$t('setting__list_source')") .gap-top base-checkbox(id="setting_list_scroll_enable" v-model="currentStting.list.isSaveScrollLocation" :label="$t('setting__list_scroll')") + .gap-top + base-checkbox(id="setting_list_clickAction_enable" v-model="currentStting.list.isClickPlayList" :label="$t('setting__list_click_action')") dd(:tips="$t('setting__basic_sourcename_title')") h3#list_addMusicLocationType {{$t('setting__list_add_music_location_type')}} div diff --git a/src/renderer/views/setting/components/UserApiModal.vue b/src/renderer/views/setting/components/UserApiModal.vue index a8862999..37030acb 100644 --- a/src/renderer/views/setting/components/UserApiModal.vue +++ b/src/renderer/views/setting/components/UserApiModal.vue @@ -7,6 +7,8 @@ material-modal(:show="modelValue" bg-close @close="handleClose" teleport="#view" div(:class="$style.listLeft") h3 {{api.name}} p {{api.description}} + div + base-checkbox(:class="$style.checkbox" :id="`user_api_${api.id}`" v-model="api.allowShowUpdateAlert" @change="handleChangeAllowUpdateAlert(api, $event)" :label="$t('user_api__allow_show_update_alert')") base-btn(:class="$style.listBtn" outline :tips="$t('user_api__btn_remove')" @click.stop="handleRemove(index)") svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' viewBox='0 0 212.982 212.982' space='preserve' v-once) use(xlink:href='#icon-delete') @@ -29,6 +31,7 @@ import { promises as fsPromises } from 'fs' import { selectDir, openUrl } from '@renderer/utils' import apiSourceInfo from '@renderer/utils/music/api-source-info' import { userApi, apiSource } from '@renderer/core/share' +import { setAllowShowUserApiUpdateAlert } from '@renderer/utils/tools' export default { props: { @@ -50,6 +53,13 @@ export default { }, methods: { handleImport() { + if (this.userApi.list.length > 20) { + this.$dialog({ + message: this.$t('user_api__max_tip'), + confirmButtonText: this.$t('ok'), + }) + return + } selectDir({ title: this.$t('user_api__import_file'), properties: ['openFile'], @@ -84,6 +94,9 @@ export default { handleOpenUrl(url) { openUrl(url) }, + handleChangeAllowUpdateAlert(api, enable) { + setAllowShowUserApiUpdateAlert(api.id, enable) + }, }, } @@ -114,6 +127,12 @@ export default { color: @color-theme; } +.checkbox { + margin-top: 3px; + font-size: 14px; + opacity: .86; +} + .content { flex: auto; min-height: 100px; diff --git a/src/renderer/views/setting/setting.js b/src/renderer/views/setting/setting.js index 8b007922..0f7c9567 100644 --- a/src/renderer/views/setting/setting.js +++ b/src/renderer/views/setting/setting.js @@ -8,6 +8,8 @@ export const currentStting = ref({ volume: 1, mediaDeviceId: 'default', isMediaDeviceRemovedStopPlay: false, + waitPlayEndStop: true, + waitPlayEndStopTime: 0, }, desktopLyric: { enable: false, @@ -73,6 +75,7 @@ export const currentStting = ref({ langId: 'cns', themeId: 0, sourceId: 0, + font: '', isShowAnimation: true, randomAnimate: true, isAgreePact: false, diff --git a/src/renderer/views/songList/SongList.vue b/src/renderer/views/songList/SongList.vue index 1350566e..bb22252e 100644 --- a/src/renderer/views/songList/SongList.vue +++ b/src/renderer/views/songList/SongList.vue @@ -11,10 +11,10 @@ div(:class="$style.container") h3(:title="listDetail.info.name || selectListInfo.name") {{listDetail.info.name || selectListInfo.name}} p(:title="listDetail.info.desc || selectListInfo.desc") {{listDetail.info.desc || selectListInfo.desc}} div(:class="$style.songListHeaderRight") - base-btn(:class="$style.headerRightBtn" :disabled="detailLoading" @click="playSongListDetail") {{$t('list__play')}} + base-btn(:class="$style.headerRightBtn" :disabled="detailLoading" @click="playSongListDetail()") {{$t('list__play')}} base-btn(:class="$style.headerRightBtn" :disabled="detailLoading" @click="addSongListDetail") {{$t('list__collect')}} base-btn(:class="$style.headerRightBtn" @click="hideListDetail") {{$t('back')}} - material-online-list(ref="songList" @toggle-page="handleToggleListDetailPage" :page="listDetail.page" :limit="listDetail.limit" :total="listDetail.total" + material-online-list(ref="songList" @play-list="playSongListDetail" @toggle-page="handleToggleListDetailPage" :page="listDetail.page" :limit="listDetail.limit" :total="listDetail.total" :list="listDetail.list" :noItem="isGetDetailFailed ? $t('list__load_failed') : $t('list__loading')") transition(enter-active-class="animated-fast fadeIn" leave-active-class="animated-fast fadeOut") div(:class="$style.songListContainer" v-show="!isVisibleListDetail") @@ -315,14 +315,14 @@ export default { sourceListId: this.listDetail.id, }) }, - async playSongListDetail() { + async playSongListDetail(index = 0) { if (!this.listDetail.info.name) return const id = `${this.listDetail.source}__${this.listDetail.id}` let isPlayingList = false if (this.listDetail.list?.length) { this.setTempList({ list: [...this.listDetail.list], - index: 0, + index, id, }) isPlayingList = true @@ -339,7 +339,7 @@ export default { } else { this.setTempList({ list, - index: 0, + index, id, }) } diff --git a/src/static/images/taskbar/collect.png b/src/static/images/taskbar/collect.png new file mode 100644 index 00000000..389b4683 Binary files /dev/null and b/src/static/images/taskbar/collect.png differ diff --git a/src/static/images/taskbar/collected.png b/src/static/images/taskbar/collected.png new file mode 100644 index 00000000..bb5d1073 Binary files /dev/null and b/src/static/images/taskbar/collected.png differ diff --git a/src/static/images/taskbar/lrc-off.png b/src/static/images/taskbar/lrc-off.png new file mode 100644 index 00000000..395d9cbd Binary files /dev/null and b/src/static/images/taskbar/lrc-off.png differ diff --git a/src/static/images/taskbar/lrc.png b/src/static/images/taskbar/lrc.png new file mode 100644 index 00000000..4bcedb59 Binary files /dev/null and b/src/static/images/taskbar/lrc.png differ diff --git a/src/static/images/taskbar/next.png b/src/static/images/taskbar/next.png new file mode 100644 index 00000000..0c6192f4 Binary files /dev/null and b/src/static/images/taskbar/next.png differ diff --git a/src/static/images/taskbar/pause.png b/src/static/images/taskbar/pause.png new file mode 100644 index 00000000..e8b8c988 Binary files /dev/null and b/src/static/images/taskbar/pause.png differ diff --git a/src/static/images/taskbar/play.png b/src/static/images/taskbar/play.png new file mode 100644 index 00000000..cf2ec48c Binary files /dev/null and b/src/static/images/taskbar/play.png differ diff --git a/src/static/images/taskbar/prev.png b/src/static/images/taskbar/prev.png new file mode 100644 index 00000000..6739fdb8 Binary files /dev/null and b/src/static/images/taskbar/prev.png differ