chore: reset version to v0.0.1

This commit is contained in:
miao-moe
2026-06-20 12:48:28 +08:00
parent cf5d093f0b
commit 42ff3bde8e
16 changed files with 1687 additions and 2017 deletions

View File

@@ -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 网易云搜索 APIhttps://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`
- 网易云私人 FMweapi`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: []