chore: reset version to v0.0.1
This commit is contained in:
@@ -1,55 +1,38 @@
|
||||
# Koneko 插件开发踩坑与最终代码文档
|
||||
|
||||
> 版本:0.0.3
|
||||
> 作者:云汀(Miao-moe)
|
||||
> 整理日期:2026-06-19
|
||||
> 用途:汇总与 QZ Music v2 拓展插件开发相关的全部踩坑点、最终代码、链接/API,便于迁移到其他 AI/工具继续迭代。
|
||||
|
||||
# Koneko 鎻掍欢寮€鍙戣俯鍧戜笌鏈€缁堜唬鐮佹枃妗?
|
||||
> 鐗堟湰锛?.0.3
|
||||
> 浣滆€咃細浜戞眬(Miao-moe)
|
||||
> 鏁寸悊鏃ユ湡锛?026-06-19
|
||||
> 鐢ㄩ€旓細姹囨€讳笌 QZ Music v2 鎷撳睍鎻掍欢寮€鍙戠浉鍏崇殑鍏ㄩ儴韪╁潙鐐广€佹渶缁堜唬鐮併€侀摼鎺?API锛屼究浜庤縼绉诲埌鍏朵粬 AI/宸ュ叿缁х画杩唬銆?
|
||||
---
|
||||
|
||||
## 一、项目背景与目标
|
||||
|
||||
为 QZ Music v2 编写 6 个音乐平台拓展插件:QQ音乐、酷狗音乐、酷我音乐、网易云音乐、咪咕音乐、GIT音源。
|
||||
|
||||
核心需求:
|
||||
- 官方搜索可用
|
||||
- 多 API 音源测速容灾
|
||||
- 环境变量读取 `global.env`
|
||||
- 版本号从 0.0.1 开始,每次修改统一升版
|
||||
- 仅支持单 `.js` 文件格式(QZ Music v2 实际加载的是 `.js` 文件,`plugin.json` 内嵌在代码里)
|
||||
## 涓€銆侀」鐩儗鏅笌鐩爣
|
||||
|
||||
涓?QZ Music v2 缂栧啓 6 涓煶涔愬钩鍙版嫇灞曟彃浠讹細QQ闊充箰銆侀叿鐙楅煶涔愩€侀叿鎴戦煶涔愩€佺綉鏄撲簯闊充箰銆佸挭鍜曢煶涔愩€丟IT闊虫簮銆?
|
||||
鏍稿績闇€姹傦細
|
||||
- 瀹樻柟鎼滅储鍙敤
|
||||
- 澶?API 闊虫簮娴嬮€熷鐏?- 鐜鍙橀噺璇诲彇 `global.env`
|
||||
- 鐗堟湰鍙蜂粠 0.0.1 寮€濮嬶紝姣忔淇敼缁熶竴鍗囩増
|
||||
- 浠呮敮鎸佸崟 `.js` 鏂囦欢鏍煎紡锛圦Z Music v2 瀹為檯鍔犺浇鐨勬槸 `.js` 鏂囦欢锛宍plugin.json` 鍐呭祵鍦ㄤ唬鐮侀噷锛?
|
||||
---
|
||||
|
||||
## 二、重大踩坑点(按时间顺序)
|
||||
|
||||
### 1. axios 不可用
|
||||
QZ Music v2 运行环境没有 `axios`,必须用 Node.js 内置 `http`/`https` 模块。
|
||||
|
||||
### 2. 插件格式演变
|
||||
- 最初直接写 `module.exports = { ... }`,后来发现 app 期望 `plugin.musicSearch.search(...)` 这样的对象方法格式。
|
||||
- 12-4 版本之前尝试过 folder + plugin.json + index.js 结构,但用户最终确认只要单 `.js` 文件。
|
||||
- `pluginInfo` 必须内嵌在 `module.exports` 里,包含 `info`、`env`、`ext`、`quality`、`supportFunc`。
|
||||
|
||||
### 3. 环境变量读取
|
||||
用 `global.env`,不是 `process.env`。
|
||||
|
||||
## 浜屻€侀噸澶ц俯鍧戠偣锛堟寜鏃堕棿椤哄簭锛?
|
||||
### 1. axios 涓嶅彲鐢?QZ Music v2 杩愯鐜娌℃湁 `axios`锛屽繀椤荤敤 Node.js 鍐呯疆 `http`/`https` 妯″潡銆?
|
||||
### 2. 鎻掍欢鏍煎紡婕斿彉
|
||||
- 鏈€鍒濈洿鎺ュ啓 `module.exports = { ... }`锛屽悗鏉ュ彂鐜?app 鏈熸湜 `plugin.musicSearch.search(...)` 杩欐牱鐨勫璞℃柟娉曟牸寮忋€?- 12-4 鐗堟湰涔嬪墠灏濊瘯杩?folder + plugin.json + index.js 缁撴瀯锛屼絾鐢ㄦ埛鏈€缁堢‘璁ゅ彧瑕佸崟 `.js` 鏂囦欢銆?- `pluginInfo` 蹇呴』鍐呭祵鍦?`module.exports` 閲岋紝鍖呭惈 `info`銆乣env`銆乣ext`銆乣quality`銆乣supportFunc`銆?
|
||||
### 3. 鐜鍙橀噺璇诲彇
|
||||
鐢?`global.env`锛屼笉鏄?`process.env`銆?
|
||||
```js
|
||||
var env = global.env || {}
|
||||
var CERU_KEY = env.ceru_key || ''
|
||||
```
|
||||
|
||||
### 4. Javet / V8 语法兼容性(导致"闪退")
|
||||
必须使用最保守的 ES5 风格语法:
|
||||
- `var` 代替 `let/const`
|
||||
- 传统 `function` 声明,不用箭头函数
|
||||
- 不用 `async/await`,只用 Promise 链式调用
|
||||
- `catch` 必须带参数:`catch (e) { }`,不能写 `catch { }`
|
||||
- 不用 `Promise.allSettled`,自己用 `Promise.all + .then/.catch` 包装
|
||||
- 不用对象解构等现代语法
|
||||
|
||||
### 5. 搜索结果字段必须严格匹配
|
||||
app 的 `MusicListResponse` 要求返回:
|
||||
|
||||
### 4. Javet / V8 璇硶鍏煎鎬э紙瀵艰嚧"闂€€"锛?蹇呴』浣跨敤鏈€淇濆畧鐨?ES5 椋庢牸璇硶锛?- `var` 浠f浛 `let/const`
|
||||
- 浼犵粺 `function` 澹版槑锛屼笉鐢ㄧ澶村嚱鏁?- 涓嶇敤 `async/await`锛屽彧鐢?Promise 閾惧紡璋冪敤
|
||||
- `catch` 蹇呴』甯﹀弬鏁帮細`catch (e) { }`锛屼笉鑳藉啓 `catch { }`
|
||||
- 涓嶇敤 `Promise.allSettled`锛岃嚜宸辩敤 `Promise.all + .then/.catch` 鍖呰
|
||||
- 涓嶇敤瀵硅薄瑙f瀯绛夌幇浠h娉?
|
||||
### 5. 鎼滅储缁撴灉瀛楁蹇呴』涓ユ牸鍖归厤
|
||||
app 鐨?`MusicListResponse` 瑕佹眰杩斿洖锛?
|
||||
```js
|
||||
{
|
||||
list: [...],
|
||||
@@ -60,24 +43,17 @@ app 的 `MusicListResponse` 要求返回:
|
||||
}
|
||||
```
|
||||
|
||||
单首歌曲字段要包含:
|
||||
- `id`:歌曲唯一标识
|
||||
- `name`:歌名
|
||||
- `artists`:歌手名(用 `/` 或 `、`分隔)
|
||||
- `albumName` / `albumId`
|
||||
- `pic`、`mPic`、`sPic`:封面图
|
||||
- `interval`:时长字符串 `m:ss`
|
||||
- `qualities`:音质大小映射
|
||||
- `source`:平台标识
|
||||
|
||||
网易云搜索之前用 `{ songs: [], total: 0 }` 导致报错:`Field 'list' is required for type ...`。
|
||||
|
||||
### 6. 音质参数格式
|
||||
HUIBQ 等第三方 API 要求音质参数带 `k`,如 `320k`、`128k`、`999k`。
|
||||
`mapBr` 返回 `'320'` 时返回的是 fallback 无效 URL,导致所有平台播放失败。
|
||||
|
||||
### 7. 网易云封面图
|
||||
网易云搜索 API 返回的 `album.picId` 是数字,需要 Base64 编码后拼接:
|
||||
鍗曢姝屾洸瀛楁瑕佸寘鍚細
|
||||
- `id`锛氭瓕鏇插敮涓€鏍囪瘑
|
||||
- `name`锛氭瓕鍚?- `artists`锛氭瓕鎵嬪悕锛堢敤 `/` 鎴?`銆乣鍒嗛殧锛?- `albumName` / `albumId`
|
||||
- `pic`銆乣mPic`銆乣sPic`锛氬皝闈㈠浘
|
||||
- `interval`锛氭椂闀垮瓧绗︿覆 `m:ss`
|
||||
- `qualities`锛氶煶璐ㄥぇ灏忔槧灏?- `source`锛氬钩鍙版爣璇?
|
||||
缃戞槗浜戞悳绱箣鍓嶇敤 `{ songs: [], total: 0 }` 瀵艰嚧鎶ラ敊锛歚Field 'list' is required for type ...`銆?
|
||||
### 6. 闊宠川鍙傛暟鏍煎紡
|
||||
HUIBQ 绛夌涓夋柟 API 瑕佹眰闊宠川鍙傛暟甯?`k`锛屽 `320k`銆乣128k`銆乣999k`銆?`mapBr` 杩斿洖 `'320'` 鏃惰繑鍥炵殑鏄?fallback 鏃犳晥 URL锛屽鑷存墍鏈夊钩鍙版挱鏀惧け璐ャ€?
|
||||
### 7. 缃戞槗浜戝皝闈㈠浘
|
||||
缃戞槗浜戞悳绱?API 杩斿洖鐨?`album.picId` 鏄暟瀛楋紝闇€瑕?Base64 缂栫爜鍚庢嫾鎺ワ細
|
||||
|
||||
```js
|
||||
var picIdStr = String(s.album.picId)
|
||||
@@ -85,14 +61,9 @@ var picIdB64 = Buffer.from(picIdStr).toString('base64').replace(/=/g, '')
|
||||
var pic = 'https://p2.music.126.net/' + picIdB64 + '/' + picIdStr + '.jpg'
|
||||
```
|
||||
|
||||
### 8. 酷狗搜索接口字段名
|
||||
`mobilecdn.kugou.com` 接口返回的字段是 `errcode` 不是 `error_code`,且歌曲信息字段为 `hash`、`songname`、`singername`、`imgurl`。
|
||||
|
||||
### 9. 酷狗封面图
|
||||
最初错误地用了酷我的 `img2.kuwo.cn` 域名。应使用酷狗搜索接口返回的 `imgurl`,替换 `{size}` 为 `400`。
|
||||
|
||||
### 10. 测速容灾模式
|
||||
所有平台 `getUrl` 采用并发请求多个 API,取第一个成功结果:
|
||||
### 8. 閰风嫍鎼滅储鎺ュ彛瀛楁鍚?`mobilecdn.kugou.com` 鎺ュ彛杩斿洖鐨勫瓧娈垫槸 `errcode` 涓嶆槸 `error_code`锛屼笖姝屾洸淇℃伅瀛楁涓?`hash`銆乣songname`銆乣singername`銆乣imgurl`銆?
|
||||
### 9. 閰风嫍灏侀潰鍥?鏈€鍒濋敊璇湴鐢ㄤ簡閰锋垜鐨?`img2.kuwo.cn` 鍩熷悕銆傚簲浣跨敤閰风嫍鎼滅储鎺ュ彛杩斿洖鐨?`imgurl`锛屾浛鎹?`{size}` 涓?`400`銆?
|
||||
### 10. 娴嬮€熷鐏炬ā寮?鎵€鏈夊钩鍙?`getUrl` 閲囩敤骞跺彂璇锋眰澶氫釜 API锛屽彇绗竴涓垚鍔熺粨鏋滐細
|
||||
|
||||
```js
|
||||
Promise.all(promises.map(function(p) {
|
||||
@@ -106,124 +77,116 @@ Promise.all(promises.map(function(p) {
|
||||
})
|
||||
```
|
||||
|
||||
### 11. 版本号管理
|
||||
每次修改所有插件统一升级版本号。当前最终版本:**0.0.3**。
|
||||
|
||||
### 11. 鐗堟湰鍙风鐞?姣忔淇敼鎵€鏈夋彃浠剁粺涓€鍗囩骇鐗堟湰鍙枫€傚綋鍓嶆渶缁堢増鏈細**0.0.3**銆?
|
||||
---
|
||||
|
||||
## 三、环境变量说明
|
||||
|
||||
| key | 用途 | 必填 |
|
||||
## 涓夈€佺幆澧冨彉閲忚鏄?
|
||||
| key | 鐢ㄩ€?| 蹇呭~ |
|
||||
|-----|------|------|
|
||||
| `ceru_key` | 聆澜音源 API 密钥 | 否 |
|
||||
| `playlist_url` | 网易云个人主页链接,用于 `userPlaylist` | 否 |
|
||||
| `cookie` | 网易云 Cookie,用于搜索和 ext 功能 | 否 |
|
||||
| `ceru_key` | 鑱嗘緶闊虫簮 API 瀵嗛挜 | 鍚?|
|
||||
| `playlist_url` | 缃戞槗浜戜釜浜轰富椤甸摼鎺ワ紝鐢ㄤ簬 `userPlaylist` | 鍚?|
|
||||
| `cookie` | 缃戞槗浜?Cookie锛岀敤浜庢悳绱㈠拰 ext 鍔熻兘 | 鍚?|
|
||||
|
||||
---
|
||||
|
||||
## 四、所有相关链接/API
|
||||
## 鍥涖€佹墍鏈夌浉鍏抽摼鎺?API
|
||||
|
||||
### 4.1 文档/参考链接
|
||||
- QZ Music v2 插件文档(用户自维护,非公开链接)
|
||||
- CSDN 网易云搜索 API:https://blog.csdn.net/2301_79279502/article/details/135568447
|
||||
- CSDN 酷狗 API 整理:https://blog.csdn.net/2301_78245299/article/details/140352615
|
||||
- 旧版插件参考:`Koneko_酷狗音乐_v1.0.9.js`
|
||||
- 旧日志:`log_2026-06-19_0.txt`
|
||||
### 4.1 鏂囨。/鍙傝€冮摼鎺?- QZ Music v2 鎻掍欢鏂囨。锛堢敤鎴疯嚜缁存姢锛岄潪鍏紑閾炬帴锛?- CSDN 缃戞槗浜戞悳绱?API锛歨ttps://blog.csdn.net/2301_79279502/article/details/135568447
|
||||
- CSDN 閰风嫍 API 鏁寸悊锛歨ttps://blog.csdn.net/2301_78245299/article/details/140352615
|
||||
- 鏃х増鎻掍欢鍙傝€冿細`Koneko_閰风嫍闊充箰_v1.0.9.js`
|
||||
- 鏃ф棩蹇楋細`log_2026-06-19_0.txt`
|
||||
|
||||
### 4.2 QQ音乐相关 API
|
||||
- QQ音乐搜索签名接口:`https://u.y.qq.com/cgi-bin/musics.fcg?sign={zzcSign}`
|
||||
- QQ音乐搜索 POST:`https://u.y.qq.com/cgi-bin/musics.fcg?sign=`
|
||||
- QQ音乐热词:`https://u.y.qq.com/cgi-bin/musicu.fcg`
|
||||
- QQ音乐搜索建议:`https://c.y.qq.com/splcloud/fcgi-bin/smartbox_new.fcg`
|
||||
- QQ音乐歌手封面:`https://y.gtimg.cn/music/photo_new/T001R500x500M000{singerMid}.jpg`
|
||||
- QQ音乐专辑封面:`https://y.gtimg.cn/music/photo_new/T002R500x500M000{albumMid}.jpg`
|
||||
- 聆澜 QQ 音源:`https://source.shiqianjiang.cn/api/music/url?source=tx&songId={id}&quality={q}`
|
||||
- HUIBQ QQ 音源:`https://lxmusicapi.onrender.com/url/tx/{id}/{q}`
|
||||
- 忆音 QQ 音源:`https://music.3e0.cn/?server=tencent&type=url&id={id}`
|
||||
- 星海 QQ 音源:`https://music-api.gdstudio.xyz/api.php?types=url&source=tencent&id={id}&br={br}`
|
||||
- 收集 QQ 音源:`https://cyapi.top/API/qq_music.php?apikey=...&type=json&mid={id}`
|
||||
- 念心 QQ 音源:`https://music.nxinxz.com/kgqq/tx.php?id={id}&level={q}&type=mp3`
|
||||
- 长青 QQ 音源:`http://175.27.166.236/kgqq/qq.php?type=mp3&id={id}&level={q}`
|
||||
- 星海备 QQ 音源:`https://music-dl.sayqz.com/api/?source=qq&id={id}&type=url&br={q}`
|
||||
- fish QQ 音源:`https://m-api.ceseet.me/url/tx/{id}/{q}`
|
||||
- HYW QQ 音源:`https://music.bxa241d4.shop/api/music/url?source=tx&songId={id}&quality={q}`
|
||||
### 4.2 QQ闊充箰鐩稿叧 API
|
||||
- QQ闊充箰鎼滅储绛惧悕鎺ュ彛锛歚https://u.y.qq.com/cgi-bin/musics.fcg?sign={zzcSign}`
|
||||
- QQ闊充箰鎼滅储 POST锛歚https://u.y.qq.com/cgi-bin/musics.fcg?sign=`
|
||||
- QQ闊充箰鐑瘝锛歚https://u.y.qq.com/cgi-bin/musicu.fcg`
|
||||
- QQ闊充箰鎼滅储寤鸿锛歚https://c.y.qq.com/splcloud/fcgi-bin/smartbox_new.fcg`
|
||||
- QQ闊充箰姝屾墜灏侀潰锛歚https://y.gtimg.cn/music/photo_new/T001R500x500M000{singerMid}.jpg`
|
||||
- QQ闊充箰涓撹緫灏侀潰锛歚https://y.gtimg.cn/music/photo_new/T002R500x500M000{albumMid}.jpg`
|
||||
- 鑱嗘緶 QQ 闊虫簮锛歚https://source.shiqianjiang.cn/api/music/url?source=tx&songId={id}&quality={q}`
|
||||
- HUIBQ QQ 闊虫簮锛歚https://lxmusicapi.onrender.com/url/tx/{id}/{q}`
|
||||
- 蹇嗛煶 QQ 闊虫簮锛歚https://music.3e0.cn/?server=tencent&type=url&id={id}`
|
||||
- 鏄熸捣 QQ 闊虫簮锛歚https://music-api.gdstudio.xyz/api.php?types=url&source=tencent&id={id}&br={br}`
|
||||
- 鏀堕泦 QQ 闊虫簮锛歚https://cyapi.top/API/qq_music.php?apikey=...&type=json&mid={id}`
|
||||
- 蹇靛績 QQ 闊虫簮锛歚https://music.nxinxz.com/kgqq/tx.php?id={id}&level={q}&type=mp3`
|
||||
- 闀块潚 QQ 闊虫簮锛歚http://175.27.166.236/kgqq/qq.php?type=mp3&id={id}&level={q}`
|
||||
- 鏄熸捣澶?QQ 闊虫簮锛歚https://music-dl.sayqz.com/api/?source=qq&id={id}&type=url&br={q}`
|
||||
- fish QQ 闊虫簮锛歚https://m-api.ceseet.me/url/tx/{id}/{q}`
|
||||
- HYW QQ 闊虫簮锛歚https://music.bxa241d4.shop/api/music/url?source=tx&songId={id}&quality={q}`
|
||||
|
||||
### 4.3 酷狗音乐相关 API
|
||||
- 酷狗搜索(mobilecdn):`http://mobilecdn.kugou.com/api/v3/search/song?format=json&keyword={kw}&page={p}&pagesize={n}`
|
||||
- 酷狗搜索(songsearch):`https://songsearch.kugou.com/song_search_v2?keyword={kw}&page={p}&pagesize={n}&...`
|
||||
- 酷狗搜索建议:`https://searchtip.kugou.com/getSearchTip?MusicTipCount=10&keyword={kw}`
|
||||
- 酷狗热词:`http://gateway.kugou.com/api/v3/search/hot_tab?...`
|
||||
- 聆澜 酷狗音源:`https://source.shiqianjiang.cn/api/music/url?source=kg&songId={id}&quality={q}`
|
||||
- HUIBQ 酷狗音源:`https://lxmusicapi.onrender.com/url/kg/{id}/{q}`
|
||||
- 星海 酷狗音源:`https://music-api.gdstudio.xyz/api.php?types=url&source=kugou&id={id}&br={br}`
|
||||
- 念心 酷狗音源:`https://music.nxinxz.com/kgqq/kg.php?id={id}&level={q}&type=mp3`
|
||||
- 长青 酷狗音源:`https://music.haitangw.cc/kgqq/kg.php?id={id}&level={q}&type=mp3`
|
||||
- 星海备 酷狗音源:`https://music-dl.sayqz.com/api/?source=kugou&id={id}&type=url&br={q}`
|
||||
- fish 酷狗音源:`https://m-api.ceseet.me/url/kg/{id}/{q}`
|
||||
- HYW 酷狗音源:`https://music.bxa241d4.shop/api/music/url?source=kg&songId={id}&quality={q}`
|
||||
### 4.3 閰风嫍闊充箰鐩稿叧 API
|
||||
- 閰风嫍鎼滅储锛坢obilecdn锛夛細`http://mobilecdn.kugou.com/api/v3/search/song?format=json&keyword={kw}&page={p}&pagesize={n}`
|
||||
- 閰风嫍鎼滅储锛坰ongsearch锛夛細`https://songsearch.kugou.com/song_search_v2?keyword={kw}&page={p}&pagesize={n}&...`
|
||||
- 閰风嫍鎼滅储寤鸿锛歚https://searchtip.kugou.com/getSearchTip?MusicTipCount=10&keyword={kw}`
|
||||
- 閰风嫍鐑瘝锛歚http://gateway.kugou.com/api/v3/search/hot_tab?...`
|
||||
- 鑱嗘緶 閰风嫍闊虫簮锛歚https://source.shiqianjiang.cn/api/music/url?source=kg&songId={id}&quality={q}`
|
||||
- HUIBQ 閰风嫍闊虫簮锛歚https://lxmusicapi.onrender.com/url/kg/{id}/{q}`
|
||||
- 鏄熸捣 閰风嫍闊虫簮锛歚https://music-api.gdstudio.xyz/api.php?types=url&source=kugou&id={id}&br={br}`
|
||||
- 蹇靛績 閰风嫍闊虫簮锛歚https://music.nxinxz.com/kgqq/kg.php?id={id}&level={q}&type=mp3`
|
||||
- 闀块潚 閰风嫍闊虫簮锛歚https://music.haitangw.cc/kgqq/kg.php?id={id}&level={q}&type=mp3`
|
||||
- 鏄熸捣澶?閰风嫍闊虫簮锛歚https://music-dl.sayqz.com/api/?source=kugou&id={id}&type=url&br={q}`
|
||||
- fish 閰风嫍闊虫簮锛歚https://m-api.ceseet.me/url/kg/{id}/{q}`
|
||||
- HYW 閰风嫍闊虫簮锛歚https://music.bxa241d4.shop/api/music/url?source=kg&songId={id}&quality={q}`
|
||||
|
||||
### 4.4 酷我音乐相关 API
|
||||
- 酷我搜索:`http://search.kuwo.cn/r.s?client=kt&all={kw}&pn={p}&rn={n}&...`
|
||||
- 酷我搜索建议:`https://tips.kuwo.cn/t.s?...&w={kw}&...`
|
||||
- 酷我热词:`http://hotword.kuwo.cn/hotword.s?...`
|
||||
- 酷我专辑封面:`https://img2.kuwo.cn/star/albumcover/300/{albumId}.jpg`
|
||||
- 酷我歌手封面:`http://artistpicserver.kuwo.cn/pic.web?...&rid={rid}`
|
||||
- 聆澜 酷我音源:`https://source.shiqianjiang.cn/api/music/url?source=kw&songId={id}&quality={q}`
|
||||
- HUIBQ 酷我音源:`https://lxmusicapi.onrender.com/url/kw/{id}/{q}`
|
||||
- 星海 酷我音源:`https://music-api.gdstudio.xyz/api.php?types=url&source=kuwo&id={id}&br={br}`
|
||||
- 收集 KW 音源:`https://kw-api.cenguigui.cn/api/song/url?id={id}&quality={q}`
|
||||
- 念心 酷我音源:`https://music.nxinxz.com/kgqq/kw.php?id={id}&level={q}&type=mp3`
|
||||
- 长青 酷我音源:`https://musicapi.haitangw.net/music/kw.php?id={id}&level={q}&type=mp3`
|
||||
- 星海备 酷我音源:`https://music-dl.sayqz.com/api/?source=kuwo&id={id}&type=url&br={q}`
|
||||
- fish 酷我音源:`https://m-api.ceseet.me/url/kw/{id}/{q}`
|
||||
- HYW 酷我音源:`https://music.bxa241d4.shop/api/music/url?source=kw&songId={id}&quality={q}`
|
||||
### 4.4 閰锋垜闊充箰鐩稿叧 API
|
||||
- 閰锋垜鎼滅储锛歚http://search.kuwo.cn/r.s?client=kt&all={kw}&pn={p}&rn={n}&...`
|
||||
- 閰锋垜鎼滅储寤鸿锛歚https://tips.kuwo.cn/t.s?...&w={kw}&...`
|
||||
- 閰锋垜鐑瘝锛歚http://hotword.kuwo.cn/hotword.s?...`
|
||||
- 閰锋垜涓撹緫灏侀潰锛歚https://img2.kuwo.cn/star/albumcover/300/{albumId}.jpg`
|
||||
- 閰锋垜姝屾墜灏侀潰锛歚http://artistpicserver.kuwo.cn/pic.web?...&rid={rid}`
|
||||
- 鑱嗘緶 閰锋垜闊虫簮锛歚https://source.shiqianjiang.cn/api/music/url?source=kw&songId={id}&quality={q}`
|
||||
- HUIBQ 閰锋垜闊虫簮锛歚https://lxmusicapi.onrender.com/url/kw/{id}/{q}`
|
||||
- 鏄熸捣 閰锋垜闊虫簮锛歚https://music-api.gdstudio.xyz/api.php?types=url&source=kuwo&id={id}&br={br}`
|
||||
- 鏀堕泦 KW 闊虫簮锛歚https://kw-api.cenguigui.cn/api/song/url?id={id}&quality={q}`
|
||||
- 蹇靛績 閰锋垜闊虫簮锛歚https://music.nxinxz.com/kgqq/kw.php?id={id}&level={q}&type=mp3`
|
||||
- 闀块潚 閰锋垜闊虫簮锛歚https://musicapi.haitangw.net/music/kw.php?id={id}&level={q}&type=mp3`
|
||||
- 鏄熸捣澶?閰锋垜闊虫簮锛歚https://music-dl.sayqz.com/api/?source=kuwo&id={id}&type=url&br={q}`
|
||||
- fish 閰锋垜闊虫簮锛歚https://m-api.ceseet.me/url/kw/{id}/{q}`
|
||||
- HYW 閰锋垜闊虫簮锛歚https://music.bxa241d4.shop/api/music/url?source=kw&songId={id}&quality={q}`
|
||||
|
||||
### 4.5 网易云音乐相关 API
|
||||
- 网易云搜索(GET):`https://music.163.com/api/search/get/web?csrf_token=&hlposttag=&s={kw}&type=1&offset={o}&total=true&limit={n}`
|
||||
- 网易云搜索(weapi POST,备用):`https://music.163.com/weapi/cloudsearch/get/web`
|
||||
- 网易云热词(weapi):`https://music.163.com/weapi/search/hot`
|
||||
- 网易云官方播放链接(weapi):`https://music.163.com/weapi/song/enhance/player/url`
|
||||
- 网易云用户歌单(weapi):`https://music.163.com/weapi/user/playlist`
|
||||
- 网易云每日推荐(weapi):`https://music.163.com/weapi/v1/discovery/recommend/songs`
|
||||
- 网易云私人 FM(weapi):`https://music.163.com/weapi/v1/radio/get`
|
||||
- 网易云喜欢歌曲(weapi):`https://music.163.com/weapi/song/like/get`
|
||||
- 网易云歌曲详情(weapi):`https://music.163.com/weapi/v3/song/detail`
|
||||
- 网易云封面图:`https://p2.music.126.net/{base64(picId)}/{picId}.jpg`
|
||||
- 聆澜 网易云音源:`https://ceruapi.lol/meting-api-0/?server=netease&type=url&id={id}&auth={key}&br={br}`
|
||||
- bb 网易云音源:`https://api.bbdcz.cn/music/netease/url?id={id}&br={br}`
|
||||
- lx 网易云音源:`https://lxmusicapi.onrender.com/url/wy/{id}/{br}`
|
||||
- ymc 网易云音源:`https://api.ymusic.icu/netease/song?id={id}&quality={br}`
|
||||
- unms 网易云音源:`https://unms.zeabur.app/netease/url?id={id}&br={br}`
|
||||
### 4.5 缃戞槗浜戦煶涔愮浉鍏?API
|
||||
- 缃戞槗浜戞悳绱紙GET锛夛細`https://music.163.com/api/search/get/web?csrf_token=&hlposttag=&s={kw}&type=1&offset={o}&total=true&limit={n}`
|
||||
- 缃戞槗浜戞悳绱紙weapi POST锛屽鐢級锛歚https://music.163.com/weapi/cloudsearch/get/web`
|
||||
- 缃戞槗浜戠儹璇嶏紙weapi锛夛細`https://music.163.com/weapi/search/hot`
|
||||
- 缃戞槗浜戝畼鏂规挱鏀鹃摼鎺ワ紙weapi锛夛細`https://music.163.com/weapi/song/enhance/player/url`
|
||||
- 缃戞槗浜戠敤鎴锋瓕鍗曪紙weapi锛夛細`https://music.163.com/weapi/user/playlist`
|
||||
- 缃戞槗浜戞瘡鏃ユ帹鑽愶紙weapi锛夛細`https://music.163.com/weapi/v1/discovery/recommend/songs`
|
||||
- 缃戞槗浜戠浜?FM锛坵eapi锛夛細`https://music.163.com/weapi/v1/radio/get`
|
||||
- 缃戞槗浜戝枩娆㈡瓕鏇诧紙weapi锛夛細`https://music.163.com/weapi/song/like/get`
|
||||
- 缃戞槗浜戞瓕鏇茶鎯咃紙weapi锛夛細`https://music.163.com/weapi/v3/song/detail`
|
||||
- 缃戞槗浜戝皝闈㈠浘锛歚https://p2.music.126.net/{base64(picId)}/{picId}.jpg`
|
||||
- 鑱嗘緶 缃戞槗浜戦煶婧愶細`https://ceruapi.lol/meting-api-0/?server=netease&type=url&id={id}&auth={key}&br={br}`
|
||||
- bb 缃戞槗浜戦煶婧愶細`https://api.bbdcz.cn/music/netease/url?id={id}&br={br}`
|
||||
- lx 缃戞槗浜戦煶婧愶細`https://lxmusicapi.onrender.com/url/wy/{id}/{br}`
|
||||
- ymc 缃戞槗浜戦煶婧愶細`https://api.ymusic.icu/netease/song?id={id}&quality={br}`
|
||||
- unms 缃戞槗浜戦煶婧愶細`https://unms.zeabur.app/netease/url?id={id}&br={br}`
|
||||
|
||||
### 4.6 咪咕音乐相关 API
|
||||
- 咪咕搜索:`https://jadeite.migu.cn/music_search/v3/search/searchAll?...`
|
||||
- 聆澜 咪咕音源:`https://source.shiqianjiang.cn/api/music/url?source=mg&songId={id}&quality={q}`
|
||||
- HUIBQ 咪咕音源:`https://lxmusicapi.onrender.com/url/mg/{id}/{q}`
|
||||
- 星海 咪咕音源:`https://music-api.gdstudio.xyz/api.php?types=url&source=migu&id={id}&br={br}`
|
||||
- 念心 咪咕音源:`https://music.nxinxz.com/kgqq/mg.php?id={id}&level={q}&type=mp3`
|
||||
- 长青 咪咕音源:`https://music.haitangw.cc/musicapi/mg.php?id={id}&level={q}&type=mp3`
|
||||
- 星海备 咪咕音源:`https://music-dl.sayqz.com/api/?source=migu&id={id}&type=url&br={q}`
|
||||
- fish 咪咕音源:`https://m-api.ceseet.me/url/mg/{id}/{q}`
|
||||
- HYW 咪咕音源:`https://music.bxa241d4.shop/api/music/url?source=mg&songId={id}&quality={q}`
|
||||
### 4.6 鍜挄闊充箰鐩稿叧 API
|
||||
- 鍜挄鎼滅储锛歚https://jadeite.migu.cn/music_search/v3/search/searchAll?...`
|
||||
- 鑱嗘緶 鍜挄闊虫簮锛歚https://source.shiqianjiang.cn/api/music/url?source=mg&songId={id}&quality={q}`
|
||||
- HUIBQ 鍜挄闊虫簮锛歚https://lxmusicapi.onrender.com/url/mg/{id}/{q}`
|
||||
- 鏄熸捣 鍜挄闊虫簮锛歚https://music-api.gdstudio.xyz/api.php?types=url&source=migu&id={id}&br={br}`
|
||||
- 蹇靛績 鍜挄闊虫簮锛歚https://music.nxinxz.com/kgqq/mg.php?id={id}&level={q}&type=mp3`
|
||||
- 闀块潚 鍜挄闊虫簮锛歚https://music.haitangw.cc/musicapi/mg.php?id={id}&level={q}&type=mp3`
|
||||
- 鏄熸捣澶?鍜挄闊虫簮锛歚https://music-dl.sayqz.com/api/?source=migu&id={id}&type=url&br={q}`
|
||||
- fish 鍜挄闊虫簮锛歚https://m-api.ceseet.me/url/mg/{id}/{q}`
|
||||
- HYW 鍜挄闊虫簮锛歚https://music.bxa241d4.shop/api/music/url?source=mg&songId={id}&quality={q}`
|
||||
|
||||
### 4.7 GIT音源相关 API
|
||||
- 聆澜 GIT 音源:`https://source.shiqianjiang.cn/api/music/url?source=git&songId={id}&quality={q}`
|
||||
- HUIBQ GIT 音源:`https://lxmusicapi.onrender.com/url/git/{id}/{q}`
|
||||
### 4.7 GIT闊虫簮鐩稿叧 API
|
||||
- 鑱嗘緶 GIT 闊虫簮锛歚https://source.shiqianjiang.cn/api/music/url?source=git&songId={id}&quality={q}`
|
||||
- HUIBQ GIT 闊虫簮锛歚https://lxmusicapi.onrender.com/url/git/{id}/{q}`
|
||||
|
||||
### 4.8 其他提及但未使用/备用
|
||||
- `https://music.163.com/weapi` 系列(weapi 备用)
|
||||
- `https://m.kugou.com/rank/list&json=true`
|
||||
### 4.8 鍏朵粬鎻愬強浣嗘湭浣跨敤/澶囩敤
|
||||
- `https://music.163.com/weapi` 绯诲垪锛坵eapi 澶囩敤锛?- `https://m.kugou.com/rank/list&json=true`
|
||||
- `http://mobilecdnbj.kugou.com/api/v3/tag/list?pid=0&apiver=2&plat=0`
|
||||
|
||||
---
|
||||
|
||||
## 五、最终代码
|
||||
|
||||
> 以下 6 个文件版本号均为 0.0.3,是截至 2026-06-19 的最终可用代码。
|
||||
|
||||
## 浜斻€佹渶缁堜唬鐮?
|
||||
> 浠ヤ笅 6 涓枃浠剁増鏈彿鍧囦负 0.0.3锛屾槸鎴嚦 2026-06-19 鐨勬渶缁堝彲鐢ㄤ唬鐮併€?
|
||||
---
|
||||
|
||||
## Koneko_QQ音乐_v0.0.3
|
||||
## Koneko_QQ闊充箰_v0.0.3
|
||||
|
||||
```js
|
||||
'use strict'
|
||||
@@ -325,7 +288,7 @@ function formatSingerName(singers) {
|
||||
for (var i = 0; i < singers.length; i++) {
|
||||
if (singers[i].name) names.push(singers[i].name)
|
||||
}
|
||||
return names.join('、')
|
||||
return names.join('銆?)
|
||||
}
|
||||
|
||||
function formatSize(bytes) {
|
||||
@@ -343,7 +306,7 @@ var musicSearch = {
|
||||
musicSearch: function(str, page, limit, retryNum) {
|
||||
var self = this
|
||||
if (retryNum === undefined) retryNum = 0
|
||||
if (retryNum > 3) return Promise.reject(new Error('搜索失败'))
|
||||
if (retryNum > 3) return Promise.reject(new Error('鎼滅储澶辫触'))
|
||||
var data = {
|
||||
comm: {
|
||||
ct: '11', cv: '14090508', v: '14090508', tmeAppID: 'qqmusic',
|
||||
@@ -380,7 +343,7 @@ var musicSearch = {
|
||||
var albumName = ''
|
||||
if (item.album) { albumName = item.album.name; albumId = item.album.mid }
|
||||
var picUrl = ''
|
||||
if (albumId === '' || albumId === '空') {
|
||||
if (albumId === '' || albumId === '绌?) {
|
||||
if (item.singer && item.singer.length) {
|
||||
picUrl = 'https://y.gtimg.cn/music/photo_new/T001R500x500M000' + item.singer[0].mid + '.jpg'
|
||||
}
|
||||
@@ -490,7 +453,7 @@ function buildApis(songId, q) {
|
||||
var apis = []
|
||||
if (CERU_KEY) {
|
||||
apis.push({
|
||||
name: '聆澜',
|
||||
name: '鑱嗘緶',
|
||||
url: 'https://source.shiqianjiang.cn/api/music/url?source=tx&songId=' + songId + '&quality=' + q,
|
||||
headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-API-Key': CERU_KEY },
|
||||
extract: function(res) { return res && res.code === 200 && res.url ? res.url : null }
|
||||
@@ -504,7 +467,7 @@ function buildApis(songId, q) {
|
||||
extract: function(res) { return res && res.code === 0 && res.url ? res.url : null }
|
||||
},
|
||||
{
|
||||
name: '忆音',
|
||||
name: '蹇嗛煶',
|
||||
url: 'https://music.3e0.cn/?server=tencent&type=url&id=' + songId,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -514,7 +477,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '星海',
|
||||
name: '鏄熸捣',
|
||||
url: 'https://music-api.gdstudio.xyz/api.php?types=url&source=tencent&id=' + songId + '&br=' + br,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -524,7 +487,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '收集QQ',
|
||||
name: '鏀堕泦QQ',
|
||||
url: 'https://cyapi.top/API/qq_music.php?apikey=4d6f7369632d6170692e63656e6775696769692e636f6d&type=json&mid=' + songId,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -534,7 +497,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '念心',
|
||||
name: '蹇靛績',
|
||||
url: 'https://music.nxinxz.com/kgqq/tx.php?id=' + songId + '&level=' + q + '&type=mp3',
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -544,7 +507,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '长青',
|
||||
name: '闀块潚',
|
||||
url: 'http://175.27.166.236/kgqq/qq.php?type=mp3&id=' + songId + '&level=' + q,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -554,7 +517,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '星海备',
|
||||
name: '鏄熸捣澶?,
|
||||
url: 'https://music-dl.sayqz.com/api/?source=qq&id=' + songId + '&type=url&br=' + q,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -597,12 +560,12 @@ function getUrl(songId, quality) {
|
||||
httpGet(api.url, api.headers, 8000).then(function(res) {
|
||||
var url = api.extract(res)
|
||||
if (url) {
|
||||
console.log('[Koneko QQ音乐] ' + api.name + ' 成功')
|
||||
console.log('[Koneko QQ闊充箰] ' + api.name + ' 鎴愬姛')
|
||||
return { name: api.name, url: url }
|
||||
}
|
||||
throw new Error(api.name + ' 无有效URL')
|
||||
throw new Error(api.name + ' 鏃犳湁鏁圲RL')
|
||||
}).catch(function(err) {
|
||||
console.error('[Koneko QQ音乐] ' + api.name + ' 失败: ' + err.message)
|
||||
console.error('[Koneko QQ闊充箰] ' + api.name + ' 澶辫触: ' + err.message)
|
||||
throw err
|
||||
})
|
||||
)
|
||||
@@ -614,7 +577,7 @@ function getUrl(songId, quality) {
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
if (results[i].status === 'fulfilled') return results[i].value.url
|
||||
}
|
||||
console.error('[Koneko QQ音乐] 所有API均失败')
|
||||
console.error('[Koneko QQ闊充箰] 鎵€鏈堿PI鍧囧け璐?)
|
||||
return ''
|
||||
})
|
||||
}
|
||||
@@ -639,13 +602,13 @@ function musicDetail(id) { return Promise.resolve(null) }
|
||||
function musicInfo(id) { return Promise.resolve(null) }
|
||||
|
||||
var pluginInfo = {
|
||||
info: { id: 'koneko_tx', name: 'QQ音乐 - Koneko', version: '0.0.3', description: 'QQ音乐聚合音源插件,官方搜索+多API音源,自动测速容灾切换' },
|
||||
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥,留空则跳过聆澜音源' }],
|
||||
info: { id: 'koneko_tx', name: 'QQ闊充箰 - Koneko', version: '0.0.3', description: 'QQ闊充箰鑱氬悎闊虫簮鎻掍欢锛屽畼鏂规悳绱?澶欰PI闊虫簮锛岃嚜鍔ㄦ祴閫熷鐏惧垏鎹? },
|
||||
env: [{ key: 'ceru_key', name: '鑱嗘緶API Key', description: '鑱嗘緶闊虫簮API瀵嗛挜锛岀暀绌哄垯璺宠繃鑱嗘緶闊虫簮' }],
|
||||
ext: [],
|
||||
quality: [
|
||||
{ name: '标准音质', ui: '标', id: 'standard' },
|
||||
{ name: '高品音质', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '无损音质', ui: 'SQ', id: 'lossless' },
|
||||
{ name: '鏍囧噯闊宠川', ui: '鏍?, id: 'standard' },
|
||||
{ name: '楂樺搧闊宠川', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '鏃犳崯闊宠川', ui: 'SQ', id: 'lossless' },
|
||||
{ name: 'Hi-Res', ui: 'HR', id: 'hires' }
|
||||
],
|
||||
supportFunc: []
|
||||
@@ -671,7 +634,7 @@ module.exports = {
|
||||
|
||||
---
|
||||
|
||||
## Koneko_酷狗音乐_v0.0.3
|
||||
## Koneko_閰风嫍闊充箰_v0.0.3
|
||||
|
||||
```js
|
||||
'use strict'
|
||||
@@ -721,7 +684,7 @@ var musicSearch = {
|
||||
search: function(str, page, limit, retryNum) {
|
||||
var self = this
|
||||
if (retryNum === undefined) retryNum = 0
|
||||
if (++retryNum > 3) return Promise.reject(new Error('搜索失败'))
|
||||
if (++retryNum > 3) return Promise.reject(new Error('鎼滅储澶辫触'))
|
||||
if (!page) page = 1
|
||||
if (limit == null) limit = this.limit
|
||||
return httpGet(
|
||||
@@ -813,7 +776,7 @@ function buildApis(songId, q) {
|
||||
var apis = []
|
||||
if (CERU_KEY) {
|
||||
apis.push({
|
||||
name: '聆澜',
|
||||
name: '鑱嗘緶',
|
||||
url: 'https://source.shiqianjiang.cn/api/music/url?source=kg&songId=' + songId + '&quality=' + q,
|
||||
headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-API-Key': CERU_KEY },
|
||||
extract: function(res) { return res && res.code === 200 && res.url ? res.url : null }
|
||||
@@ -827,7 +790,7 @@ function buildApis(songId, q) {
|
||||
extract: function(res) { return res && res.code === 0 && res.url ? res.url : null }
|
||||
},
|
||||
{
|
||||
name: '星海',
|
||||
name: '鏄熸捣',
|
||||
url: 'https://music-api.gdstudio.xyz/api.php?types=url&source=kugou&id=' + songId + '&br=' + br,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -837,7 +800,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '念心',
|
||||
name: '蹇靛績',
|
||||
url: 'https://music.nxinxz.com/kgqq/kg.php?id=' + songId + '&level=' + q + '&type=mp3',
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -847,7 +810,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '长青',
|
||||
name: '闀块潚',
|
||||
url: 'https://music.haitangw.cc/kgqq/kg.php?id=' + songId + '&level=' + q + '&type=mp3',
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -857,7 +820,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '星海备',
|
||||
name: '鏄熸捣澶?,
|
||||
url: 'https://music-dl.sayqz.com/api/?source=kugou&id=' + songId + '&type=url&br=' + q,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -900,12 +863,12 @@ function getUrl(songId, quality) {
|
||||
httpGet(api.url, api.headers, 8000).then(function(res) {
|
||||
var url = api.extract(res)
|
||||
if (url) {
|
||||
console.log('[Koneko 酷狗音乐] ' + api.name + ' 成功')
|
||||
console.log('[Koneko 閰风嫍闊充箰] ' + api.name + ' 鎴愬姛')
|
||||
return { name: api.name, url: url }
|
||||
}
|
||||
throw new Error(api.name + ' 无有效URL')
|
||||
throw new Error(api.name + ' 鏃犳湁鏁圲RL')
|
||||
}).catch(function(err) {
|
||||
console.error('[Koneko 酷狗音乐] ' + api.name + ' 失败: ' + err.message)
|
||||
console.error('[Koneko 閰风嫍闊充箰] ' + api.name + ' 澶辫触: ' + err.message)
|
||||
throw err
|
||||
})
|
||||
)
|
||||
@@ -917,7 +880,7 @@ function getUrl(songId, quality) {
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
if (results[i].status === 'fulfilled') return results[i].value.url
|
||||
}
|
||||
console.error('[Koneko 酷狗音乐] 所有API均失败')
|
||||
console.error('[Koneko 閰风嫍闊充箰] 鎵€鏈堿PI鍧囧け璐?)
|
||||
return ''
|
||||
})
|
||||
}
|
||||
@@ -942,13 +905,13 @@ function musicDetail(id) { return Promise.resolve(null) }
|
||||
function musicInfo(id) { return Promise.resolve(null) }
|
||||
|
||||
var pluginInfo = {
|
||||
info: { id: 'koneko_kg', name: '酷狗音乐 - Koneko', version: '0.0.3', description: '酷狗音乐聚合音源插件,官方搜索+多API音源,自动测速容灾切换' },
|
||||
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥,留空则跳过聆澜音源' }],
|
||||
info: { id: 'koneko_kg', name: '閰风嫍闊充箰 - Koneko', version: '0.0.3', description: '閰风嫍闊充箰鑱氬悎闊虫簮鎻掍欢锛屽畼鏂规悳绱?澶欰PI闊虫簮锛岃嚜鍔ㄦ祴閫熷鐏惧垏鎹? },
|
||||
env: [{ key: 'ceru_key', name: '鑱嗘緶API Key', description: '鑱嗘緶闊虫簮API瀵嗛挜锛岀暀绌哄垯璺宠繃鑱嗘緶闊虫簮' }],
|
||||
ext: [],
|
||||
quality: [
|
||||
{ name: '标准音质', ui: '标', id: 'standard' },
|
||||
{ name: '高品音质', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '无损音质', ui: 'SQ', id: 'lossless' },
|
||||
{ name: '鏍囧噯闊宠川', ui: '鏍?, id: 'standard' },
|
||||
{ name: '楂樺搧闊宠川', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '鏃犳崯闊宠川', ui: 'SQ', id: 'lossless' },
|
||||
{ name: 'Hi-Res', ui: 'HR', id: 'hires' }
|
||||
],
|
||||
supportFunc: []
|
||||
@@ -974,7 +937,7 @@ module.exports = {
|
||||
|
||||
---
|
||||
|
||||
## Koneko_酷我音乐_v0.0.3
|
||||
## Koneko_閰锋垜闊充箰_v0.0.3
|
||||
|
||||
```js
|
||||
'use strict'
|
||||
@@ -1024,7 +987,7 @@ var musicSearch = {
|
||||
search: function(str, page, limit, retryNum) {
|
||||
var self = this
|
||||
if (retryNum === undefined) retryNum = 0
|
||||
if (++retryNum > 3) return Promise.reject(new Error('搜索失败'))
|
||||
if (++retryNum > 3) return Promise.reject(new Error('鎼滅储澶辫触'))
|
||||
if (!page) page = 1
|
||||
if (limit == null) limit = this.limit
|
||||
return httpGet(
|
||||
@@ -1059,7 +1022,7 @@ var musicSearch = {
|
||||
picUrl = 'http://artistpicserver.kuwo.cn/pic.web?corp=kuwo&type=rid_pic&pictype=500&size=500&rid=' + songId
|
||||
}
|
||||
var artistStr = ''
|
||||
if (info.ARTIST) artistStr = info.ARTIST.replace(/&/g, '、')
|
||||
if (info.ARTIST) artistStr = info.ARTIST.replace(/&/g, '銆?)
|
||||
var duration = parseInt(info.DURATION)
|
||||
list.push({
|
||||
id: String(songId),
|
||||
@@ -1124,7 +1087,7 @@ function buildApis(songId, q) {
|
||||
var apis = []
|
||||
if (CERU_KEY) {
|
||||
apis.push({
|
||||
name: '聆澜',
|
||||
name: '鑱嗘緶',
|
||||
url: 'https://source.shiqianjiang.cn/api/music/url?source=kw&songId=' + songId + '&quality=' + q,
|
||||
headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-API-Key': CERU_KEY },
|
||||
extract: function(res) { return res && res.code === 200 && res.url ? res.url : null }
|
||||
@@ -1138,7 +1101,7 @@ function buildApis(songId, q) {
|
||||
extract: function(res) { return res && res.code === 0 && res.url ? res.url : null }
|
||||
},
|
||||
{
|
||||
name: '星海',
|
||||
name: '鏄熸捣',
|
||||
url: 'https://music-api.gdstudio.xyz/api.php?types=url&source=kuwo&id=' + songId + '&br=' + br,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -1148,7 +1111,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '收集KW',
|
||||
name: '鏀堕泦KW',
|
||||
url: 'https://kw-api.cenguigui.cn/api/song/url?id=' + songId + '&quality=' + q,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -1158,7 +1121,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '念心',
|
||||
name: '蹇靛績',
|
||||
url: 'https://music.nxinxz.com/kgqq/kw.php?id=' + songId + '&level=' + q + '&type=mp3',
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -1168,7 +1131,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '长青',
|
||||
name: '闀块潚',
|
||||
url: 'https://musicapi.haitangw.net/music/kw.php?id=' + songId + '&level=' + q + '&type=mp3',
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -1178,7 +1141,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '星海备',
|
||||
name: '鏄熸捣澶?,
|
||||
url: 'https://music-dl.sayqz.com/api/?source=kuwo&id=' + songId + '&type=url&br=' + q,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -1221,12 +1184,12 @@ function getUrl(songId, quality) {
|
||||
httpGet(api.url, api.headers, 8000).then(function(res) {
|
||||
var url = api.extract(res)
|
||||
if (url) {
|
||||
console.log('[Koneko 酷我音乐] ' + api.name + ' 成功')
|
||||
console.log('[Koneko 閰锋垜闊充箰] ' + api.name + ' 鎴愬姛')
|
||||
return { name: api.name, url: url }
|
||||
}
|
||||
throw new Error(api.name + ' 无有效URL')
|
||||
throw new Error(api.name + ' 鏃犳湁鏁圲RL')
|
||||
}).catch(function(err) {
|
||||
console.error('[Koneko 酷我音乐] ' + api.name + ' 失败: ' + err.message)
|
||||
console.error('[Koneko 閰锋垜闊充箰] ' + api.name + ' 澶辫触: ' + err.message)
|
||||
throw err
|
||||
})
|
||||
)
|
||||
@@ -1238,7 +1201,7 @@ function getUrl(songId, quality) {
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
if (results[i].status === 'fulfilled') return results[i].value.url
|
||||
}
|
||||
console.error('[Koneko 酷我音乐] 所有API均失败')
|
||||
console.error('[Koneko 閰锋垜闊充箰] 鎵€鏈堿PI鍧囧け璐?)
|
||||
return ''
|
||||
})
|
||||
}
|
||||
@@ -1263,13 +1226,13 @@ function musicDetail(id) { return Promise.resolve(null) }
|
||||
function musicInfo(id) { return Promise.resolve(null) }
|
||||
|
||||
var pluginInfo = {
|
||||
info: { id: 'koneko_kw', name: '酷我音乐 - Koneko', version: '0.0.3', description: '酷我音乐聚合音源插件,官方搜索+多API音源,自动测速容灾切换' },
|
||||
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥,留空则跳过聆澜音源' }],
|
||||
info: { id: 'koneko_kw', name: '閰锋垜闊充箰 - Koneko', version: '0.0.3', description: '閰锋垜闊充箰鑱氬悎闊虫簮鎻掍欢锛屽畼鏂规悳绱?澶欰PI闊虫簮锛岃嚜鍔ㄦ祴閫熷鐏惧垏鎹? },
|
||||
env: [{ key: 'ceru_key', name: '鑱嗘緶API Key', description: '鑱嗘緶闊虫簮API瀵嗛挜锛岀暀绌哄垯璺宠繃鑱嗘緶闊虫簮' }],
|
||||
ext: [],
|
||||
quality: [
|
||||
{ name: '标准音质', ui: '标', id: 'standard' },
|
||||
{ name: '高品音质', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '无损音质', ui: 'SQ', id: 'lossless' },
|
||||
{ name: '鏍囧噯闊宠川', ui: '鏍?, id: 'standard' },
|
||||
{ name: '楂樺搧闊宠川', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '鏃犳崯闊宠川', ui: 'SQ', id: 'lossless' },
|
||||
{ name: 'Hi-Res', ui: 'HR', id: 'hires' }
|
||||
],
|
||||
supportFunc: []
|
||||
@@ -1295,7 +1258,7 @@ module.exports = {
|
||||
|
||||
---
|
||||
|
||||
## Koneko_网易云音乐_v0.0.3
|
||||
## Koneko_缃戞槗浜戦煶涔恄v0.0.3
|
||||
|
||||
```js
|
||||
'use strict'
|
||||
@@ -1484,7 +1447,7 @@ function wySearch(keyword, page, limit) {
|
||||
list.push({
|
||||
id: s.id ? String(s.id) : '',
|
||||
name: s.name || '',
|
||||
artists: artists.join('、'),
|
||||
artists: artists.join('銆?),
|
||||
albumName: album,
|
||||
albumId: albumId,
|
||||
source: 'wy',
|
||||
@@ -1514,7 +1477,7 @@ function wyTipSearch(keyword) {
|
||||
var tips = []
|
||||
for (var i = 0; i < res.result.songs.length; i++) {
|
||||
var s = res.result.songs[i]
|
||||
tips.push(s.name + ' - ' + (s.artists && s.artists[0] ? s.artists[0].name : '未知'))
|
||||
tips.push(s.name + ' - ' + (s.artists && s.artists[0] ? s.artists[0].name : '鏈煡'))
|
||||
}
|
||||
return tips
|
||||
}).catch(function(e) {
|
||||
@@ -1779,26 +1742,26 @@ function musicDetail(id) { return Promise.resolve(null) }
|
||||
function musicInfo(id) { return Promise.resolve(null) }
|
||||
|
||||
var pluginInfo = {
|
||||
info: { id: 'koneko_wy', name: '网易云音乐 - Koneko', version: '0.0.3', description: '网易云音乐聚合音源插件,官方搜索+多API音源,自动测速容灾切换' },
|
||||
info: { id: 'koneko_wy', name: '缃戞槗浜戦煶涔?- Koneko', version: '0.0.3', description: '缃戞槗浜戦煶涔愯仛鍚堥煶婧愭彃浠讹紝瀹樻柟鎼滅储+澶欰PI闊虫簮锛岃嚜鍔ㄦ祴閫熷鐏惧垏鎹? },
|
||||
env: [
|
||||
{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥,留空则跳过聆澜音源' },
|
||||
{ key: 'playlist_url', name: '个人主页链接', description: '网易云音乐个人主页链接,用于获取个人歌单' },
|
||||
{ key: 'cookie', name: 'Cookie', description: '网易云音乐Cookie,用于搜索/每日推荐/私人FM/我喜欢的音乐' }
|
||||
{ key: 'ceru_key', name: '鑱嗘緶API Key', description: '鑱嗘緶闊虫簮API瀵嗛挜锛岀暀绌哄垯璺宠繃鑱嗘緶闊虫簮' },
|
||||
{ key: 'playlist_url', name: '涓汉涓婚〉閾炬帴', description: '缃戞槗浜戦煶涔愪釜浜轰富椤甸摼鎺ワ紝鐢ㄤ簬鑾峰彇涓汉姝屽崟' },
|
||||
{ key: 'cookie', name: 'Cookie', description: '缃戞槗浜戦煶涔怌ookie锛岀敤浜庢悳绱?姣忔棩鎺ㄨ崘/绉佷汉FM/鎴戝枩娆㈢殑闊充箰' }
|
||||
],
|
||||
ext: [
|
||||
{ name: '个人歌单', description: '通过分享链接获取个人歌单', entry: 'plugin.userPlaylist()', type: 'playlists' },
|
||||
{ name: '每日推荐', description: '获取每日推荐歌曲', entry: 'plugin.dailyRecommend()', type: 'songs' },
|
||||
{ name: '私人FM', description: '获取私人FM歌曲', entry: 'plugin.personalFm()', type: 'songs' },
|
||||
{ name: '我喜欢的音乐', description: '获取我喜欢的音乐列表', entry: 'plugin.myLikedSongs()', type: 'songs' }
|
||||
{ name: '涓汉姝屽崟', description: '閫氳繃鍒嗕韩閾炬帴鑾峰彇涓汉姝屽崟', entry: 'plugin.userPlaylist()', type: 'playlists' },
|
||||
{ name: '姣忔棩鎺ㄨ崘', description: '鑾峰彇姣忔棩鎺ㄨ崘姝屾洸', entry: 'plugin.dailyRecommend()', type: 'songs' },
|
||||
{ name: '绉佷汉FM', description: '鑾峰彇绉佷汉FM姝屾洸', entry: 'plugin.personalFm()', type: 'songs' },
|
||||
{ name: '鎴戝枩娆㈢殑闊充箰', description: '鑾峰彇鎴戝枩娆㈢殑闊充箰鍒楄〃', entry: 'plugin.myLikedSongs()', type: 'songs' }
|
||||
],
|
||||
quality: [
|
||||
{ name: '标准音质', ui: '标', id: 'standard' },
|
||||
{ name: '高品音质', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '无损音质', ui: 'SQ', id: 'lossless' },
|
||||
{ name: '鏍囧噯闊宠川', ui: '鏍?, id: 'standard' },
|
||||
{ name: '楂樺搧闊宠川', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '鏃犳崯闊宠川', ui: 'SQ', id: 'lossless' },
|
||||
{ name: 'Hi-Res', ui: 'HR', id: 'hires' },
|
||||
{ name: '高清环绕声', ui: 'DB', id: 'jyeffect' },
|
||||
{ name: '沉浸环绕声', ui: 'SK', id: 'sky' },
|
||||
{ name: '超清母带', ui: 'MT', id: 'jymaster' }
|
||||
{ name: '楂樻竻鐜粫澹?, ui: 'DB', id: 'jyeffect' },
|
||||
{ name: '娌夋蹈鐜粫澹?, ui: 'SK', id: 'sky' },
|
||||
{ name: '瓒呮竻姣嶅甫', ui: 'MT', id: 'jymaster' }
|
||||
],
|
||||
supportFunc: []
|
||||
}
|
||||
@@ -1877,7 +1840,7 @@ module.exports = {
|
||||
|
||||
---
|
||||
|
||||
## Koneko_咪咕音乐_v0.0.3
|
||||
## Koneko_鍜挄闊充箰_v0.0.3
|
||||
|
||||
```js
|
||||
'use strict'
|
||||
@@ -1942,7 +1905,7 @@ var musicSearch = {
|
||||
search: function(str, page, limit, retryNum) {
|
||||
var self = this
|
||||
if (retryNum === undefined) retryNum = 0
|
||||
if (++retryNum > 3) return Promise.reject(new Error('搜索失败'))
|
||||
if (++retryNum > 3) return Promise.reject(new Error('鎼滅储澶辫触'))
|
||||
if (!page) page = 1
|
||||
if (limit == null) limit = this.limit
|
||||
var time = Date.now().toString()
|
||||
@@ -1992,7 +1955,7 @@ var musicSearch = {
|
||||
for (var k = 0; k < data.singerList.length; k++) {
|
||||
if (data.singerList[k].name) names.push(data.singerList[k].name)
|
||||
}
|
||||
artists = names.join('、')
|
||||
artists = names.join('銆?)
|
||||
}
|
||||
list.push({
|
||||
artists: artists,
|
||||
@@ -2027,7 +1990,7 @@ function buildApis(songId, q) {
|
||||
var apis = []
|
||||
if (CERU_KEY) {
|
||||
apis.push({
|
||||
name: '聆澜',
|
||||
name: '鑱嗘緶',
|
||||
url: 'https://source.shiqianjiang.cn/api/music/url?source=mg&songId=' + songId + '&quality=' + q,
|
||||
headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-API-Key': CERU_KEY },
|
||||
extract: function(res) { return res && res.code === 200 && res.url ? res.url : null }
|
||||
@@ -2041,7 +2004,7 @@ function buildApis(songId, q) {
|
||||
extract: function(res) { return res && res.code === 0 && res.url ? res.url : null }
|
||||
},
|
||||
{
|
||||
name: '星海',
|
||||
name: '鏄熸捣',
|
||||
url: 'https://music-api.gdstudio.xyz/api.php?types=url&source=migu&id=' + songId + '&br=' + br,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -2051,7 +2014,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '念心',
|
||||
name: '蹇靛績',
|
||||
url: 'https://music.nxinxz.com/kgqq/mg.php?id=' + songId + '&level=' + q + '&type=mp3',
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -2061,7 +2024,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '长青',
|
||||
name: '闀块潚',
|
||||
url: 'https://music.haitangw.cc/musicapi/mg.php?id=' + songId + '&level=' + q + '&type=mp3',
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -2071,7 +2034,7 @@ function buildApis(songId, q) {
|
||||
}
|
||||
},
|
||||
{
|
||||
name: '星海备',
|
||||
name: '鏄熸捣澶?,
|
||||
url: 'https://music-dl.sayqz.com/api/?source=migu&id=' + songId + '&type=url&br=' + q,
|
||||
headers: HEADERS_COMMON,
|
||||
extract: function(res) {
|
||||
@@ -2114,12 +2077,12 @@ function getUrl(songId, quality) {
|
||||
httpGet(api.url, api.headers, 8000).then(function(res) {
|
||||
var url = api.extract(res)
|
||||
if (url) {
|
||||
console.log('[Koneko 咪咕音乐] ' + api.name + ' 成功')
|
||||
console.log('[Koneko 鍜挄闊充箰] ' + api.name + ' 鎴愬姛')
|
||||
return { name: api.name, url: url }
|
||||
}
|
||||
throw new Error(api.name + ' 无有效URL')
|
||||
throw new Error(api.name + ' 鏃犳湁鏁圲RL')
|
||||
}).catch(function(err) {
|
||||
console.error('[Koneko 咪咕音乐] ' + api.name + ' 失败: ' + err.message)
|
||||
console.error('[Koneko 鍜挄闊充箰] ' + api.name + ' 澶辫触: ' + err.message)
|
||||
throw err
|
||||
})
|
||||
)
|
||||
@@ -2131,7 +2094,7 @@ function getUrl(songId, quality) {
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
if (results[i].status === 'fulfilled') return results[i].value.url
|
||||
}
|
||||
console.error('[Koneko 咪咕音乐] 所有API均失败')
|
||||
console.error('[Koneko 鍜挄闊充箰] 鎵€鏈堿PI鍧囧け璐?)
|
||||
return ''
|
||||
})
|
||||
}
|
||||
@@ -2156,13 +2119,13 @@ function musicDetail(id) { return Promise.resolve(null) }
|
||||
function musicInfo(id) { return Promise.resolve(null) }
|
||||
|
||||
var pluginInfo = {
|
||||
info: { id: 'koneko_mg', name: '咪咕音乐 - Koneko', version: '0.0.3', description: '咪咕音乐聚合音源插件,官方搜索+多API音源,自动测速容灾切换' },
|
||||
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥,留空则跳过聆澜音源' }],
|
||||
info: { id: 'koneko_mg', name: '鍜挄闊充箰 - Koneko', version: '0.0.3', description: '鍜挄闊充箰鑱氬悎闊虫簮鎻掍欢锛屽畼鏂规悳绱?澶欰PI闊虫簮锛岃嚜鍔ㄦ祴閫熷鐏惧垏鎹? },
|
||||
env: [{ key: 'ceru_key', name: '鑱嗘緶API Key', description: '鑱嗘緶闊虫簮API瀵嗛挜锛岀暀绌哄垯璺宠繃鑱嗘緶闊虫簮' }],
|
||||
ext: [],
|
||||
quality: [
|
||||
{ name: '标准音质', ui: '标', id: 'standard' },
|
||||
{ name: '高品音质', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '无损音质', ui: 'SQ', id: 'lossless' },
|
||||
{ name: '鏍囧噯闊宠川', ui: '鏍?, id: 'standard' },
|
||||
{ name: '楂樺搧闊宠川', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '鏃犳崯闊宠川', ui: 'SQ', id: 'lossless' },
|
||||
{ name: 'Hi-Res', ui: 'HR', id: 'hires' }
|
||||
],
|
||||
supportFunc: []
|
||||
@@ -2188,7 +2151,7 @@ module.exports = {
|
||||
|
||||
---
|
||||
|
||||
## Koneko_GIT音源_v0.0.3
|
||||
## Koneko_GIT闊虫簮_v0.0.3
|
||||
|
||||
```js
|
||||
'use strict'
|
||||
@@ -2221,7 +2184,7 @@ function buildApis(songId, q) {
|
||||
var apis = []
|
||||
if (CERU_KEY) {
|
||||
apis.push({
|
||||
name: '聆澜',
|
||||
name: '鑱嗘緶',
|
||||
url: 'https://source.shiqianjiang.cn/api/music/url?source=git&songId=' + songId + '&quality=' + q,
|
||||
headers: { 'User-Agent': HEADERS_COMMON['User-Agent'], 'X-API-Key': CERU_KEY },
|
||||
extract: function(res) { return res && res.code === 200 && res.url ? res.url : null }
|
||||
@@ -2246,12 +2209,12 @@ function getUrl(songId, quality) {
|
||||
httpGet(api.url, api.headers, 8000).then(function(res) {
|
||||
var url = api.extract(res)
|
||||
if (url) {
|
||||
console.log('[Koneko GIT音源] ' + api.name + ' 成功')
|
||||
console.log('[Koneko GIT闊虫簮] ' + api.name + ' 鎴愬姛')
|
||||
return { name: api.name, url: url }
|
||||
}
|
||||
throw new Error(api.name + ' 无有效URL')
|
||||
throw new Error(api.name + ' 鏃犳湁鏁圲RL')
|
||||
}).catch(function(err) {
|
||||
console.error('[Koneko GIT音源] ' + api.name + ' 失败: ' + err.message)
|
||||
console.error('[Koneko GIT闊虫簮] ' + api.name + ' 澶辫触: ' + err.message)
|
||||
throw err
|
||||
})
|
||||
)
|
||||
@@ -2263,7 +2226,7 @@ function getUrl(songId, quality) {
|
||||
for (var i = 0; i < results.length; i++) {
|
||||
if (results[i].status === 'fulfilled') return results[i].value.url
|
||||
}
|
||||
console.error('[Koneko GIT音源] 所有API均失败')
|
||||
console.error('[Koneko GIT闊虫簮] 鎵€鏈堿PI鍧囧け璐?)
|
||||
return ''
|
||||
})
|
||||
}
|
||||
@@ -2295,13 +2258,13 @@ function musicDetail(id) { return Promise.resolve(null) }
|
||||
function musicInfo(id) { return Promise.resolve(null) }
|
||||
|
||||
var pluginInfo = {
|
||||
info: { id: 'koneko_git', name: 'GIT音源 - Koneko', version: '0.0.3', description: 'GIT音源聚合插件,聚合2+API音源,自动测速容灾切换' },
|
||||
env: [{ key: 'ceru_key', name: '聆澜API Key', description: '聆澜音源API密钥,留空则跳过聆澜音源' }],
|
||||
info: { id: 'koneko_git', name: 'GIT闊虫簮 - Koneko', version: '0.0.3', description: 'GIT闊虫簮鑱氬悎鎻掍欢锛岃仛鍚?+API闊虫簮锛岃嚜鍔ㄦ祴閫熷鐏惧垏鎹? },
|
||||
env: [{ key: 'ceru_key', name: '鑱嗘緶API Key', description: '鑱嗘緶闊虫簮API瀵嗛挜锛岀暀绌哄垯璺宠繃鑱嗘緶闊虫簮' }],
|
||||
ext: [],
|
||||
quality: [
|
||||
{ name: '标准音质', ui: '标', id: 'standard' },
|
||||
{ name: '高品音质', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '无损音质', ui: 'SQ', id: 'lossless' },
|
||||
{ name: '鏍囧噯闊宠川', ui: '鏍?, id: 'standard' },
|
||||
{ name: '楂樺搧闊宠川', ui: 'HQ', id: 'exhigh' },
|
||||
{ name: '鏃犳崯闊宠川', ui: 'SQ', id: 'lossless' },
|
||||
{ name: 'Hi-Res', ui: 'HR', id: 'hires' }
|
||||
],
|
||||
supportFunc: []
|
||||
|
||||
Reference in New Issue
Block a user