This commit is contained in:
Folltoshe 2022-07-25 05:44:02 +00:00 committed by GitHub
commit e7c0ff7def
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 201 additions and 175 deletions

111
FAQ.md
View File

@ -1,12 +1,12 @@
# lx-music-desktop 常见问题 # lx-music-desktop 常见问题
本文档已迁移到:<https://lyswhut.github.io/lx-music-doc/desktop/faq> ## 建议使用文档(经常维护更新的为文档,这个文档不会经常更新)
国内文档地址:<https://lxmusic.huiyi.art/desktop>
文档地址:<https://lyswhut.github.io/lx-music-doc/desktop/faq>
在阅读本常见问题后,仍然无法解决你的问题,请提交 issue 或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题! 在阅读本常见问题后,仍然无法解决你的问题,请提交 issue 或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题!
反馈注意事项:<https://lxmusic.huiyi.art/report>
## ~~软件为什么没有桌面歌词与自定义列表功能~~
洛雪音乐的最初定位不是作为播放器开发的,它主要用于**查找歌曲**,软件的播放功能仅用于试听,不建议用作为常用播放器使用。
## 音乐播放列表机制 ## 音乐播放列表机制
@ -113,6 +113,7 @@
### 打开网易源“我喜欢”歌单 ### 打开网易源“我喜欢”歌单
由于网易源的“我喜欢”歌单需要登录才能打开,从 v1.13.0 起提供了可以以注入 token 的方式打开网易源“我喜欢”歌单的功能,现若想要打开此类歌单,需要在歌单链接或 id 后面拼上 `###` 再加上有效的 token拼接格式`[id|url]###token`,例子(最后面的 xxxxxx 替换成你的 token 由于网易源的“我喜欢”歌单需要登录才能打开,从 v1.13.0 起提供了可以以注入 token 的方式打开网易源“我喜欢”歌单的功能,现若想要打开此类歌单,需要在歌单链接或 id 后面拼上 `###` 再加上有效的 token拼接格式`[id|url]###token`,例子(最后面的 xxxxxx 替换成你的 token
- `https://music.163.com/#/playlist?id=11332&userid=123456###xxxxxx` - `https://music.163.com/#/playlist?id=11332&userid=123456###xxxxxx`
- `11332###xxxxxx` - `11332###xxxxxx`
@ -181,6 +182,7 @@
### Windows 7 下界面异常 ### Windows 7 下界面异常
由于软件默认使用了透明窗口,根据 Electron 官方文档的[说明](https://www.electronjs.org/docs/latest/tutorial/window-customization#limitations) 由于软件默认使用了透明窗口,根据 Electron 官方文档的[说明](https://www.electronjs.org/docs/latest/tutorial/window-customization#limitations)
> 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。 > 在 windows 操作系统上, 当 DWM 被禁用时, 透明窗口将无法工作。
因此,当 win7 没有使用**Aero**主题时界面将会显示异常,开启 AERO 的方法请自行百度:`win7开启Aero效果`(开启后可看到任务栏变透明)。<br> 因此,当 win7 没有使用**Aero**主题时界面将会显示异常,开启 AERO 的方法请自行百度:`win7开启Aero效果`(开启后可看到任务栏变透明)。<br>
@ -363,21 +365,21 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看上面的
以经过 URL 编码的 JSON 数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过 URL 编码后的 JSON 数据JSON 数据内容取决于下表的参数部分 以经过 URL 编码的 JSON 数据传参,例:`lxmusic://music/play?data=xxxx`,其中`xxxx`为经过 URL 编码后的 JSON 数据JSON 数据内容取决于下表的参数部分
| 描述 | URL | 参数 | 描述 | URL | 参数 |
| --- | --- | --- | -------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 打开歌单 | `songlist/open` | `source<String>`(源,必须)<br>`id<String/Number>`歌单ID可选<br>`url<String>`歌单URL可选其中ID与URL必需传一个 | 打开歌单 | `songlist/open` | `source<String>`(源,必须)<br>`id<String/Number>`(歌单 ID可选<br>`url<String>`(歌单 URL可选其中 ID URL 必需传一个 |
| 播放歌单 | `songlist/play` | `source<String>`(源,必须)<br>`id<String/Number>`歌单ID可选<br>`url<String>`歌单URL可选其中`id`与`url`必需传一个<br>`index<Number>`播放第几首歌可选从0开始 | 播放歌单 | `songlist/play` | `source<String>`(源,必须)<br>`id<String/Number>`(歌单 ID可选<br>`url<String>`(歌单 URL可选其中`id`与`url`必需传一个<br>`index<Number>`(播放第几首歌,可选,从 0 开始) |
| 搜索歌曲 | `music/search` | `keywords<String/Number>`(要搜索的内容,必须)<br>`source<String>`(源,可选) | 搜索歌曲 | `music/search` | `keywords<String/Number>`(要搜索的内容,必须)<br>`source<String>`(源,可选) |
| 播放歌曲 | `music/play` | `name<String>`(歌曲名,必传)<br>`singer<String>`(艺术家名,必传)<br>`source<String>`(源,必传)<br>`songmid<String/Number>`歌曲ID必传<br>`img<String>`(歌曲图片链接,选传)<br>`albumId<String/Number>`歌曲专辑ID选传<br>`interval<String>`(格式化后的歌曲时长,选传,例:`03:55`<br>`albumName<String>`(歌曲专辑名称,选传)<br>`types<Object>`(歌曲可用音质数组,必传,<br>数组格式:`[{"type": "<音质>", size: "<格式化后的文件大小选传>", hash: "<kg源必传>"}]`<br>例:`[{"type": "128k", size: "3.56M"}, {"type": "320k", size: null}]`<br><br>以下为平台特定参数:<br>`hash<String>`歌曲hashkg源必传<br>`strMediaMid<String>`歌曲strMediaMidtx源必传<br>`albumMid<String>`歌曲albumMidtx源专用选传<br>`copyrightId<String>`歌曲copyrightIdmg源必传<br>`lrcUrl<String>`歌曲lrcUrlmg源专用选传 | 播放歌曲 | `music/play` | `name<String>`(歌曲名,必传)<br>`singer<String>`(艺术家名,必传)<br>`source<String>`(源,必传)<br>`songmid<String/Number>`(歌曲 ID必传<br>`img<String>`(歌曲图片链接,选传)<br>`albumId<String/Number>`(歌曲专辑 ID选传<br>`interval<String>`(格式化后的歌曲时长,选传,例:`03:55`<br>`albumName<String>`(歌曲专辑名称,选传)<br>`types<Object>`(歌曲可用音质数组,必传,<br>数组格式:`[{"type": "<音质>", size: "<格式化后的文件大小选传>", hash: "<kg源必传>"}]`<br>例:`[{"type": "128k", size: "3.56M"}, {"type": "320k", size: null}]`<br><br>以下为平台特定参数:<br>`hash<String>`(歌曲 hashkg 源必传)<br>`strMediaMid<String>`(歌曲 strMediaMidtx 源必传)<br>`albumMid<String>`(歌曲 albumMidtx 源专用,选传)<br>`copyrightId<String>`(歌曲 copyrightIdmg 源必传)<br>`lrcUrl<String>`(歌曲 lrcUrlmg 源专用,选传) |
### `URL`方式传参 ### `URL`方式传参
由于 URL 传参只适用于简单传参场景,所以目前只支持以下功能的调用: 由于 URL 传参只适用于简单传参场景,所以目前只支持以下功能的调用:
| 描述 | URL | 参数 | 描述 | URL | 参数 |
| --- | --- | --- | -------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------- |
| 搜索歌曲 | `music/search/{source}/{keywords}` | `source`(源,可选)<br>`keywords`(要搜索的内容,必须)<br>例:`music/search/kw/xxx`、`music/search/xxx` | 搜索歌曲 | `music/search/{source}/{keywords}` | `source`(源,可选)<br>`keywords`(要搜索的内容,必须)<br>例:`music/search/kw/xxx`、`music/search/xxx` |
| 打开歌单 | `songlist/open/{source}/{id/url}` | `source`(源,必须)<br>`id/url`歌单ID或歌单URL必须<br>例:`songlist/open/kw/123456` | 打开歌单 | `songlist/open/{source}/{id/url}` | `source`(源,必须)<br>`id/url`(歌单 ID 或歌单 URL必须<br>例:`songlist/open/kw/123456` |
## 自定义源脚本编写说明 ## 自定义源脚本编写说明
@ -392,32 +394,32 @@ Windows 7 未开启 Aero 效果时桌面歌词会有问题,详情看上面的
* @homepage http://xxx * @homepage http://xxx
*/ */
const { EVENT_NAMES, request, on, send } = window.lx;
const { EVENT_NAMES, request, on, send } = window.lx
const qualitys = { const qualitys = {
kw: { kw: {
'128k': '128', "128k": "128",
'320k': '320', "320k": "320",
flac: 'flac', flac: "flac",
}, },
} };
const httpRequest = (url, options) => new Promise((resolve, reject) => { const httpRequest = (url, options) =>
new Promise((resolve, reject) => {
request(url, options, (err, resp) => { request(url, options, (err, resp) => {
if (err) return reject(err) if (err) return reject(err);
resolve(resp.body) resolve(resp.body);
}) });
}) });
const apis = { const apis = {
kw: { kw: {
musicUrl({ songmid }, quality) { musicUrl({ songmid }, quality) {
return httpRequest('http://xxx').then(data => { return httpRequest("http://xxx").then((data) => {
return data.url return data.url;
}) });
}, },
}, },
} };
// 注册应用API请求事件 // 注册应用API请求事件
// source 音乐源可能的值取决于初始化时传入的sources对象的源key值 // source 音乐源可能的值取决于初始化时传入的sources对象的源key值
@ -430,28 +432,31 @@ on(EVENT_NAMES.request, ({ source, action, info }) => {
// 回调必须返回 Promise 对象 // 回调必须返回 Promise 对象
switch (action) { switch (action) {
// action 为 musicUrl 时需要在 Promise 返回歌曲 url // action 为 musicUrl 时需要在 Promise 返回歌曲 url
case 'musicUrl': case "musicUrl":
return apis[source].musicUrl(info.musicInfo, qualitys[source][info.type]).catch(err => { return apis[source]
console.log(err) .musicUrl(info.musicInfo, qualitys[source][info.type])
return Promise.reject(err) .catch((err) => {
}) console.log(err);
return Promise.reject(err);
});
} }
}) });
// 脚本初始化完成后需要发送inited事件告知应用 // 脚本初始化完成后需要发送inited事件告知应用
send(EVENT_NAMES.inited, { send(EVENT_NAMES.inited, {
status: true, // 初始化成功 or 失败 status: true, // 初始化成功 or 失败
openDevTools: false, // 是否打开开发者工具,方便用于调试脚本 openDevTools: false, // 是否打开开发者工具,方便用于调试脚本
sources: { // 当前脚本支持的源 sources: {
kw: { // 支持的源对象可用key值kw/kg/tx/wy/mg // 当前脚本支持的源
name: '酷我音乐', kw: {
type: 'music', // 目前固定为 music // 支持的源对象可用key值kw/kg/tx/wy/mg
actions: ['musicUrl'], // 目前固定为 ['musicUrl'] name: "酷我音乐",
qualitys: ['128k', '320k', 'flac'], // 当前脚本的该源所支持获取的Url音质有效的值有['128k', '320k', 'flac'] type: "music", // 目前固定为 music
actions: ["musicUrl"], // 目前固定为 ['musicUrl']
qualitys: ["128k", "320k", "flac"], // 当前脚本的该源所支持获取的Url音质有效的值有['128k', '320k', 'flac']
}, },
}, },
}) });
``` ```
### 自定义源信息 ### 自定义源信息
@ -466,7 +471,6 @@ send(EVENT_NAMES.inited, {
* @author xxx * @author xxx
* @homepage http://xxx * @homepage http://xxx
*/ */
``` ```
- `@name `源的名字建议不要过长24 个字符以内 - `@name `源的名字建议不要过长24 个字符以内
@ -487,12 +491,11 @@ send(EVENT_NAMES.inited, {
常量事件名称对象,发送、注册事件时传入事件名时使用,可用值: 常量事件名称对象,发送、注册事件时传入事件名时使用,可用值:
| 事件名 | 描述 | 事件名 | 描述 |
| --- | --- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `inited` | 脚本初始化完成后发送给应用的事件名,发送该事件时需要传入以下信息:`{status, sources, openDevTools}`<br>`status`:初始化结果(`true`成功,`false`失败)<br>`openDevTools`是否打开DevTools此选项可用于开发脚本时的调试<br>`sources`:支持的源信息对象,<br>`sources[kw/kg/tx/wy/mg].name`:源的名字(目前非必须)<br>`sources[kw/kg/tx/wy/mg].type`:源类型,目前固定值需为`music`<br>`sources[kw/kg/tx/wy/mg].actions`支持的actions由于目前只支持`musicUrl`,所以固定传`['musicUrl']`即可<br>`sources[kw/kg/tx/wy/mg].qualitys`:该源支持的音质列表,有效的值为`['128k', '320k', 'flac']`,该字段用于控制应用可用的音质类型 | `inited` | 脚本初始化完成后发送给应用的事件名,发送该事件时需要传入以下信息:`{status, sources, openDevTools}`<br>`status`:初始化结果(`true`成功,`false`失败)<br>`openDevTools`:是否打开 DevTools此选项可用于开发脚本时的调试<br>`sources`:支持的源信息对象,<br>`sources[kw/kg/tx/wy/mg].name`:源的名字(目前非必须)<br>`sources[kw/kg/tx/wy/mg].type`:源类型,目前固定值需为`music`<br>`sources[kw/kg/tx/wy/mg].actions`:支持的 actions由于目前只支持`musicUrl`,所以固定传`['musicUrl']`即可<br>`sources[kw/kg/tx/wy/mg].qualitys`:该源支持的音质列表,有效的值为`['128k', '320k', 'flac']`,该字段用于控制应用可用的音质类型 |
| `request` | 应用API请求事件名回调入参`handler({ source, action, info})`,回调必须返回`Promise`对象<br>`source`:音乐源,可能的值取决于初始化时传入的`sources`对象的源key值<br>`info`:请求附加信息,内容根据`action`变化<br>`action`:请求操作类型,目前只有`musicUrl`即获取音乐URL链接需要在 Promise 返回歌曲 url`info`的结构:`{type, musicInfo}``info.type`:音乐质量,可能的值有`128k` / `320k` / `flac`(取决于初始化时对应源传入的`qualitys`值中的一个),`info.musicInfo`音乐信息对象里面有音乐ID、名字等信息 | `request` | 应用 API 请求事件名,回调入参:`handler({ source, action, info})`,回调必须返回`Promise`对象<br>`source`:音乐源,可能的值取决于初始化时传入的`sources`对象的源 key 值<br>`info`:请求附加信息,内容根据`action`变化<br>`action`:请求操作类型,目前只有`musicUrl`,即获取音乐 URL 链接,需要在 Promise 返回歌曲 url`info`的结构:`{type, musicInfo}``info.type`:音乐质量,可能的值有`128k` / `320k` / `flac`(取决于初始化时对应源传入的`qualitys`值中的一个),`info.musicInfo`:音乐信息对象,里面有音乐 ID、名字等信息 |
| `updateAlert` | 显示源更新弹窗,发送该事件时的参数:`{log, updateUrl}`<br>`log`:更新日志,必传,字符串类型,内容可以使用`\n`换行最大长度1024超过此长度后将被截取超出的部分<br>`updateUrl`更新地址用于引导用户去该地址更新源选传需为http协议的url地址最大长度1024<br>此事件每次运行脚本只能调用一次源版本v1.2.0新增)<br>例子:`lx.send(lx.EVENT_NAMES.updateAlert, { log: 'hello world', updateUrl: 'https://xxx.com' })` | `updateAlert` | 显示源更新弹窗,发送该事件时的参数:`{log, updateUrl}`<br>`log`:更新日志,必传,字符串类型,内容可以使用`\n`换行,最大长度 1024超过此长度后将被截取超出的部分<br>`updateUrl`:更新地址,用于引导用户去该地址更新源,选传,需为 http 协议的 url 地址,最大长度 1024<br>此事件每次运行脚本只能调用一次(源版本 v1.2.0 新增)<br>例子:`lx.send(lx.EVENT_NAMES.updateAlert, { log: 'hello world', updateUrl: 'https://xxx.com' })` |
#### `window.lx.on` #### `window.lx.on`
@ -503,7 +506,7 @@ send(EVENT_NAMES.inited, {
* @param event_name 事件名 * @param event_name 事件名
* @param handler 事件处理回调 -- 注意:注册的回调必须返回 Promise 对象 * @param handler 事件处理回调 -- 注意:注册的回调必须返回 Promise 对象
*/ */
window.lx.on(event_name, handler) window.lx.on(event_name, handler);
``` ```
**注意:** 注册的回调必须返回 `Promise` 对象。 **注意:** 注册的回调必须返回 `Promise` 对象。
@ -517,7 +520,7 @@ window.lx.on(event_name, handler)
* @param event_name 事件名 * @param event_name 事件名
* @param datas 要传给应用的数据 * @param datas 要传给应用的数据
*/ */
window.lx.send(event_name, datas) window.lx.send(event_name, datas);
``` ```
#### `window.lx.request` #### `window.lx.request`
@ -531,7 +534,7 @@ HTTP请求方法用于发送HTTP请求此HTTP请求方法不受跨域规
* @param callback 请求结果的回调 入参err, resp, body * @param callback 请求结果的回调 入参err, resp, body
* @return 返回一个方法调用此方法可以终止HTTP请求 * @return 返回一个方法调用此方法可以终止HTTP请求
*/ */
const cancelHttp = window.lx.request(url, options, callback) const cancelHttp = window.lx.request(url, options, callback);
``` ```
#### `window.lx.utils` #### `window.lx.utils`

View File

@ -45,48 +45,44 @@
- Mac OS - Mac OS
- Linux - Linux
软件变化请查看:[更新日志](https://github.com/lyswhut/lx-music-desktop/blob/master/CHANGELOG.md)<br> **软件变化:**
软件下载请转到:[发布页面](https://github.com/lyswhut/lx-music-desktop/releases)<br>
或者到网盘下载网盘内有MAC、windows版`https://www.lanzoui.com/b0bf2cfa/` 密码:`glqw`(若链接无法打开请百度:蓝奏云链接打不开)<br>
使用常见问题请转至:[常见问题](https://lyswhut.github.io/lx-music-doc/desktop/faq)<br>
移动版项目地址:<https://github.com/lyswhut/lx-music-mobile>
#### Scheme URL支持 - [更新日志](https://github.com/lyswhut/lx-music-desktop/blob/master/CHANGELOG.md)
从v1.17.0起支持 Scheme URL可以使用此功能从浏览器等场景下调用LX Music我们开发了一个[油猴脚本](https://github.com/lyswhut/lx-music-script#readme)配套使用,<br> <br>
脚本安装地址:<https://greasyfork.org/zh-CN/scripts/438148><br>
若你想自己调用LX Music可以看[Scheme URL支持](https://lyswhut.github.io/lx-music-doc/desktop/scheme-url) **软件下载:**
#### 启动参数 - [发布页面](https://github.com/lyswhut/lx-music-desktop/releases)
目前软件已支持的启动参数如下: - [网盘下载链接](https://www.lanzoui.com/b0bf2cfa/) 密码:`glqw`
- `-proxy-server` 设置代理服务器,代理应用的所有流量 - [国内文档链接](https://lxmusic.huiyi.art/download)
- `-proxy-bypass-list` 以分号分隔的主机列表绕过代理服务器
- `-play` 启动时播放指定列表的音乐
- `-search` 启动软件时自动在搜索框搜索指定的内容
- `-dha` 禁用硬件加速启动Disable Hardware Acceleration
- `-dt` 以非透明模式启动Disable Transparent
- `-dhmkh` 禁用硬件媒体密钥处理Disable Hardware Media Key Handling
启动参数的详细说明请看[启动参数说明](https://lyswhut.github.io/lx-music-doc/desktop/run-params) - [文档链接](https://lxmusic.toside.cn/download)
#### 数据存储路径 <br>
默认情况下,软件的数据存储在: **常见问题:**
- Windows`%APPDATA%/lx-music-desktop` - [国内文档链接](https://lxmusic.huiyi.art/desktop)
- Linux`$XDG_CONFIG_HOME/lx-music-desktop` 或 `~/.config/lx-music-desktop`
- macOS`~/Library/Application Support/lx-music-desktop`
在Windows平台下若程序目录下存在`portable`目录则自动使用此目录作为数据存储目录v1.17.0新增)。 - [文档链接](https://lxmusic.toside.cn/desktop/faq)
- [FAQ](./FAQ.md)
<br>
**移动版项目地址:**<https://github.com/lyswhut/lx-music-mobile>
### 源码使用方法 ### 源码使用方法
环境要求Node.js 16+ 环境要求Node.js 16+
```bash ```bash
# 安装依赖(如报错请自行百度报错信息)
npm install
# 开发模式 # 开发模式
npm run dev npm run dev
@ -104,13 +100,40 @@ npm run pack:linux
``` ```
#### Scheme URL 支持
从 v1.17.0 起支持 Scheme URL可以使用此功能从浏览器等场景下调用 LX Music我们开发了一个[油猴脚本](https://github.com/lyswhut/lx-music-script#readme)配套使用,<br>
脚本安装地址:<https://greasyfork.org/zh-CN/scripts/438148><br>
若你想自己调用 LX Music可以看[Scheme URL 支持](https://lxmusic.toside.cn/desktop/scheme-url)
#### 启动参数
目前软件已支持的启动参数如下:
- `-proxy-server` 设置代理服务器,代理应用的所有流量
- `-proxy-bypass-list` 以分号分隔的主机列表绕过代理服务器
- `-play` 启动时播放指定列表的音乐
- `-search` 启动软件时自动在搜索框搜索指定的内容
- `-dha` 禁用硬件加速启动Disable Hardware Acceleration
- `-dt` 以非透明模式启动Disable Transparent
- `-dhmkh` 禁用硬件媒体密钥处理Disable Hardware Media Key Handling
启动参数的详细说明请看[启动参数说明](https://lxmusic.toside.cn/desktop/run-params)
#### 数据存储路径
默认情况下,软件的数据存储在:
- Windows`%APPDATA%/lx-music-desktop`
- Linux`$XDG_CONFIG_HOME/lx-music-desktop` 或 `~/.config/lx-music-desktop`
- macOS`~/Library/Application Support/lx-music-desktop`
在 Windows 平台下,若程序目录下存在`portable`目录则自动使用此目录作为数据存储目录v1.17.0 新增)。
### UI 界面 ### UI 界面
<p><a href="https://github.com/lyswhut/lx-music-desktop"><img width="100%" src="https://github.com/lyswhut/lx-music-desktop/blob/master/doc/images/app.png" alt="lx-music UI"></a></p> <p><a href="https://github.com/lyswhut/lx-music-desktop"><img width="100%" src="https://github.com/lyswhut/lx-music-desktop/blob/master/doc/images/apps.png" alt="lx-music UI"></a></p>
### 常见问题
常见问题已移至:<https://lyswhut.github.io/lx-music-doc/desktop/faq>
### 项目协议 ### 项目协议

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

BIN
doc/images/apps.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB