添加完整的网易云音乐同步到Navidrome的功能实现,包括: 1. 新增Docker支持与相关配置文件 2. 实现歌单同步逻辑与Navidrome API集成 3. 改进前端UI界面与交互体验 4. 添加状态监控与错误处理机制 5. 实现定时同步功能与进度显示
14 KiB
14 KiB
TuneHub API 文档
TuneHub 是一个统一的音乐信息解析服务。它打破了不同音乐平台之间的壁垒,提供了一套标准化的 API 接口。
Base URL: https://music-dl.sayqz.com
Version: 1.0.0
核心 API
1. 获取歌曲基本信息
获取歌曲的名称、歌手、专辑等基本元数据信息。
- Method:
GET - Endpoint:
/api/ - Query Parameters:
source:string- 必需. 平台标识 (例如:netease,kuwo,qq).id:string- 必需. 歌曲 ID.type:string- 必需. 固定为info.
- Response Example (200 OK):
{ "code": 200, "message": "success", "data": { "name": "歌曲名称", "artist": "歌手名称", "album": "专辑名称", "url": "https://music-dl.sayqz.com/api/?source=netease&id=123456&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=123456&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=123456&type=lrc" }, "timestamp": "2025-11-23T12:00:00.000+08:00" }
2. 获取音乐文件链接
获取音乐文件链接。成功时返回 302 Redirect 到实际的音乐文件 URL。
- Method:
GET - Endpoint:
/api/ - Query Parameters:
source:string- 必需. 平台标识.id:string- 必需. 歌曲 ID.type:string- 必需. 固定为url.br:string- 可选. 音质 (默认:320k). 可选值:128k,320k,flac,flac24bit.
3. 获取专辑封面
获取歌曲的专辑封面图片。成功时返回 302 Redirect 到图片 URL。
- Method:
GET - Endpoint:
/api/ - Query Parameters:
source:string- 必需. 平台标识.id:string- 必需. 歌曲 ID.type:string- 必需. 固定为pic.
4. 获取歌词
获取LRC格式的歌词。
- Method:
GET - Endpoint:
/api/ - Query Parameters:
source:string- 必需. 平台标识.id:string- 必需. 歌曲 ID.type:string- 必需. 固定为lrc.
- Response Example (200 OK, text/plain):
[00:00.00]歌词第一行 [00:05.50]歌词第二行
5. 搜索歌曲
- Method:
GET - Endpoint:
/api/ - Query Parameters:
source:string- 必需. 平台标识.type:string- 必需. 固定为search.keyword:string- 必需. 搜索关键词.limit:integer- 可选. 返回数量 (默认: 20).
- Response Example (200 OK):
{ "code": 200, "message": "success", "data": { "keyword": "周杰伦", "total": 10, "results": [ { "id": "123456", "name": "歌曲名称", "artist": "周杰伦", "album": "专辑名称", "url": "https://music-dl.sayqz.com/api/?...", "platform": "netease" } ] } }
6. 聚合搜索
一次性并发请求所有启用的平台,并对结果进行智能混合排列。
- Method:
GET - Endpoint:
/api/ - Query Parameters:
type:string- 必需. 固定为aggregateSearch.keyword:string- 必需. 搜索关键词.
- Response Example (200 OK):
{ "code": 200, "message": "success", "data": { "keyword": "周杰伦", "results": [ { "id": "123456", "name": "歌曲名称", "artist": "周杰伦", "platform": "netease" }, { "id": "789012", "name": "另一首歌", "artist": "周杰伦", "platform": "kuwo" } ] } }
7. 获取歌单详情
- Method:
GET - Endpoint:
/api/ - Query Parameters:
source:string- 必需. 平台标识.id:string- 必需. 歌单 ID.type:string- 必需. 固定为playlist. 结果示例: { "code": 200, "message": "success", "data": { "list": [ { "id": "2722391361", "name": "天后 (live)", "artist": "李佳薇", "album": "歌手2025 第8期", "info": "https://music-dl.sayqz.com/api/?source=netease&id=2722391361&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=2722391361&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=2722391361&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=2722391361&type=lrc", "types": [ "flac24bit", "flac", "320k", "128k" ] }, { "id": "1368753797", "name": "法兰西多士", "artist": "告五人", "album": "我肯定在几百年前就说过爱你", "info": "https://music-dl.sayqz.com/api/?source=netease&id=1368753797&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=1368753797&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=1368753797&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=1368753797&type=lrc", "types": [ "flac24bit", "flac", "320k", "128k" ] }, { "id": "155886", "name": "光明", "artist": "汪峰", "album": "信仰在空中飘扬", "info": "https://music-dl.sayqz.com/api/?source=netease&id=155886&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=155886&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=155886&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=155886&type=lrc", "types": [ "flac", "320k", "128k" ] }, { "id": "569214247", "name": "平凡的一天", "artist": "毛不易", "album": "平凡的一天", "info": "https://music-dl.sayqz.com/api/?source=netease&id=569214247&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=569214247&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=569214247&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=569214247&type=lrc", "types": [ "flac", "320k", "128k" ] }, { "id": "1810392410", "name": "回音", "artist": "神秘的小鸡蛋", "album": "感觉", "info": "https://music-dl.sayqz.com/api/?source=netease&id=1810392410&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=1810392410&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=1810392410&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=1810392410&type=lrc", "types": [ "flac", "320k", "128k" ] }, { "id": "569200213", "name": "消愁", "artist": "毛不易", "album": "平凡的一天", "info": "https://music-dl.sayqz.com/api/?source=netease&id=569200213&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=569200213&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=569200213&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=569200213&type=lrc", "types": [ "flac", "320k", "128k" ] }, { "id": "2083191501", "name": "郁郁而终", "artist": "马英杰", "album": "郁郁而终(重制版)", "info": "https://music-dl.sayqz.com/api/?source=netease&id=2083191501&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=2083191501&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=2083191501&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=2083191501&type=lrc", "types": [ "flac24bit", "flac", "320k", "128k" ] }, { "id": "1838919030", "name": "王招君", "artist": "任素汐", "album": "TA·说", "info": "https://music-dl.sayqz.com/api/?source=netease&id=1838919030&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=1838919030&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=1838919030&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=1838919030&type=lrc", "types": [ "flac24bit", "flac", "320k", "128k" ] }, { "id": "2105734399", "name": "风过千里", "artist": "雪域任运", "album": "风过千里", "info": "https://music-dl.sayqz.com/api/?source=netease&id=2105734399&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=2105734399&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=2105734399&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=2105734399&type=lrc", "types": [ "flac", "320k", "128k" ] }, { "id": "1974443814", "name": "我记得", "artist": "赵雷", "album": "署前街少年", "info": "https://music-dl.sayqz.com/api/?source=netease&id=1974443814&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=1974443814&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=1974443814&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=1974443814&type=lrc", "types": [ "flac", "320k", "128k" ] }, { "id": "155899", "name": "勇敢的心", "artist": "汪峰", "album": "勇敢的心", "info": "https://music-dl.sayqz.com/api/?source=netease&id=155899&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=155899&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=155899&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=155899&type=lrc", "types": [ "flac", "320k", "128k" ] }, { "id": "1308081071", "name": "作曲家 (Live)", "artist": "刘郡格", "album": "2018中国好声音 第8期", "info": "https://music-dl.sayqz.com/api/?source=netease&id=1308081071&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=1308081071&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=1308081071&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=1308081071&type=lrc", "types": [ "flac", "320k", "128k" ] }, { "id": "488641876", "name": "有一个地方叫远方", "artist": "曾昭玮", "album": "有一个地方叫远方", "info": "https://music-dl.sayqz.com/api/?source=netease&id=488641876&type=info", "url": "https://music-dl.sayqz.com/api/?source=netease&id=488641876&type=url", "pic": "https://music-dl.sayqz.com/api/?source=netease&id=488641876&type=pic", "lrc": "https://music-dl.sayqz.com/api/?source=netease&id=488641876&type=lrc", "types": [ "flac", "320k", "128k" ] } ], "total": 13, "source": "netease", "info": { "name": "为你降次元喜欢的音乐", "pic": "https://p1.music.126.net/Qara552B1Q3VBJnwggJA2A==/109951171404861681.jpg", "desc": "", "author": "为你降次元", "playCount": 1 } }, "timestamp": "2026-01-12T18:32:10.516+08:00" }
8. 获取排行榜列表
- Method:
GET - Endpoint:
/api/ - Query Parameters:
source:string- 必需. 平台标识.type:string- 必需. 固定为toplists.
9. 获取排行榜歌曲
- Method:
GET - Endpoint:
/api/ - Query Parameters:
source:string- 必需. 平台标识.id:string- 必需. 排行榜 ID.type:string- 必需. 固定为toplist.
系统 API
10. 系统状态
- Method:
GET - Endpoint:
/status
11. 健康检查
- Method:
GET - Endpoint:
/health
统计 API
12. 获取统计数据
- Method:
GET - Endpoint:
/stats - Query Parameters:
period:string- 可选. 时间段 (默认:today).groupBy:string- 可选. 分组依据 (默认:platform).
13. 获取统计摘要
- Method:
GET - Endpoint:
/stats/summary
14. 平台统计概览
- Method:
GET - Endpoint:
/stats/platforms - Query Parameters:
period:string- 可选. 时间段 (默认:today).
15. QPS 统计
- Method:
GET - Endpoint:
/stats/qps - Query Parameters:
period:string- 可选. 时间段 (默认:today).
16. 趋势数据
- Method:
GET - Endpoint:
/stats/trends - Query Parameters:
period:string- 可选. 时间段 (默认:week).
17. 请求类型统计
- Method:
GET - Endpoint:
/stats/types - Query Parameters:
period:string- 可选. 时间段 (默认:today).