fix(server): 修复路由遮蔽、流式背压与鉴权限流顺序
- 专辑搜索静态路由优先注册,避免被 /album/{source}/{id}/{page} 捕获
- mg 流改为异步背压队列,慢客户端不再 QueueFull 悬挂,错误中断响应
- 限流移到鉴权外层,401 爆破计入限流
- 酷我 token 重试移出锁,修复 asyncio.Lock 递归死锁
- 补 CORS、5sing 音质、parse _kind、wy 首次登录 cookie、stream 签名溢出
- mg 流直连、lifespan 关闭 aiohttp 会话、cookie 登录路由与 auth_store 健壮性
- 测试改用 aiohttp + 进程内 uvicorn,移除 httpx/TestClient
- 更新 start.bat 与文档
This commit is contained in:
1 parent
39565a3913
commit
0df18f048b
19 files changed
+534
-241
No files matched your search
+5
-3
@@ -65,7 +65,7 @@
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| GET | `/url/:source/:id` | 播放地址;`?quality=`(64k/128k/320k/flac/flac24bit,默认 128k)。取流链:外部音源(启用时)→ SDK 直连 → 酷我兜底(响应 `via` 标记实际命中通道) |
|
||||
| GET | `/url/:source/:id` | 播放地址;`?quality=`(通用 64k/128k/320k/flac/flac24bit,5sing 另有 sq/hq/lq,默认 128k)。取流链:SDK 直连 → 酷我兜底(响应 `via` 标记实际命中通道) |
|
||||
| GET | `/stream/:source/:id` | 加密流解密代理(`mg` 咪咕 Z3D 加密流)。供 `/url` 返回的相对地址使用,不接受自行构造 |
|
||||
| GET | `/lyric/:source/:id` | 歌词;可带 `?name=` `?interval=`(部分平台搜索歌词时需要) |
|
||||
| GET | `/pic/:source/:id` | 封面;可带 `?albumId=`(kg 需要) |
|
||||
@@ -125,11 +125,13 @@
|
||||
| DELETE | `/login/lr` | 退出懒人听书 |
|
||||
| POST | `/login/bili/qr` → `/login/bili/qr/check` | 哔哩哔哩扫码(解锁大会员音质) |
|
||||
| DELETE | `/login/bili` | 退出哔哩哔哩 |
|
||||
| POST | `/login/{mg,bd,joox,apple,5sing}` | 绑定对应平台 cookie(body `{"cookie": "..."}`,服务端不做在线校验) |
|
||||
| DELETE | `/login/{mg,bd,joox,apple,5sing}` | 退出对应平台 |
|
||||
| POST | `/login/refresh` | 手动触发登录态续期(kg/tx) |
|
||||
| GET | `/login/status` | 登录状态总览(各平台 `logged` 与账号资料) |
|
||||
|
||||
- 凭据持久化于 `data/auth.json`(不入库,文件权限 0600),登录后取流与平台请求自动携带。
|
||||
- 自动续期:启动 10s 后对 kg/tx 执行一次,此后每 24h 一次(音源模式下不参与取流,自动续期不启动)。
|
||||
- 凭据持久化于 `data/auth.json`(不入库,文件权限 0600),登录后取流与平台请求自动携带;文件被外部修改时会自动重载。
|
||||
- 自动续期:启动 10s 后对 kg/tx 执行一次,此后每 24h 一次。
|
||||
|
||||
## 响应示例
|
||||
|
||||
|
||||
+15
-15
@@ -31,13 +31,13 @@ from app.sdk.platforms.kw import album, hot_search, leaderboard, lyric, music_se
|
||||
MODULE = Platform(
|
||||
id="kw",
|
||||
name="酷我音乐",
|
||||
music_search=music_search, # 子模块对象(有 .search 方法)
|
||||
leaderboard=leaderboard, # .get_boards() / .get_list(bangid, page)
|
||||
song_list=song_list, # .get_list(sort_id, tag_id, page) / .sort_list
|
||||
hot_search=hot_search, # .get_list()
|
||||
music_search=music_search, # 子模块对象(有 .search 方法)
|
||||
leaderboard=leaderboard, # .get_boards() / .get_list(bangid, page)
|
||||
song_list=song_list, # .get_list(sort_id, tag_id, page) / .sort_list
|
||||
hot_search=hot_search, # .get_list()
|
||||
album=album,
|
||||
playlist=playlist,
|
||||
get_lyric=lyric.get_lyric, # 顶层方法直接挂函数
|
||||
get_lyric=lyric.get_lyric, # 顶层方法直接挂函数
|
||||
get_pic=pic.get_pic,
|
||||
)
|
||||
```
|
||||
@@ -118,14 +118,14 @@ async def handle_music_info(song_info: dict) -> dict # 可选:补全 name/
|
||||
```python
|
||||
from app.sdk.common.request import http_fetch
|
||||
|
||||
resp = await http_fetch(url, headers={...}) # 默认 GET
|
||||
resp = await http_fetch(url, method="POST", form={...}) # urlencoded
|
||||
resp = await http_fetch(url, method="POST", body={...}) # JSON
|
||||
resp = await http_fetch(url, timeout=10_000) # 毫秒,与原文一致
|
||||
resp = await http_fetch(url, headers={...}) # 默认 GET
|
||||
resp = await http_fetch(url, method="POST", form={...}) # urlencoded
|
||||
resp = await http_fetch(url, method="POST", body={...}) # JSON
|
||||
resp = await http_fetch(url, timeout=10_000) # 毫秒,与原文一致
|
||||
|
||||
resp.status_code # int(Node 的 statusCode)
|
||||
resp.body # 已解析:JSON → dict/list,否则 str
|
||||
resp.raw # 原始 bytes
|
||||
resp.status_code # int(Node 的 statusCode)
|
||||
resp.body # 已解析:JSON → dict/list,否则 str
|
||||
resp.raw # 原始 bytes
|
||||
resp.header("set-cookie")
|
||||
```
|
||||
|
||||
@@ -175,9 +175,9 @@ from app.sdk.common.utils import size_formate
|
||||
```python
|
||||
from app.sdk.auth_store import get_credentials, set_credentials, get_kg_auth, get_tx_auth, get_cookie
|
||||
|
||||
get_cookie("xm") # 空字符串表示未登录
|
||||
get_kg_auth() # {"token", "userid"} 或 None
|
||||
get_tx_auth() # {"cookie", "uin"} 或 None
|
||||
get_cookie("xm") # 空字符串表示未登录
|
||||
get_kg_auth() # {"token", "userid"} 或 None
|
||||
get_tx_auth() # {"cookie", "uin"} 或 None
|
||||
```
|
||||
|
||||
## 8. 错误
|
||||
|
||||
Reference in new issue
Block a user