feat(routes): 迁移个人中心/公开播放/前端错误端点 + 修 QR 异步回归

迁移(/api/v1/*,与 Flask 逐字段对齐):
- user/qr/create、user/qr/check、user/status、user/logout、user/playlists、
  user/playlist、user/collect、user/comment
- api/playlist/play(密钥校验 + 逐曲直链解析:ThreadPoolExecutor(4) → asyncio.gather(4))
- fe_error(前端错误上报,10/分/IP + 字段清洗)

修复我此前引入的异步回归(重要):
- music_api.QRLoginManager 异步化后,main.py 4 处 Flask 同步路由仍当同步调用,
  返回协程 → Flask 侧扫码登录必坏。已改经 run_sync 桥接,实测两栈均返回 SVG。
- web/routers/user.py 同样改为 await。

契约奇偶校验:33 项(新增 user:status/logout/playlists401/playlist401/play:badkey);
ruff All checks passed;pyright 0 errors;冒烟 10/10。
This commit is contained in:
snowy-yang committed 2026-09-26 09:57:42 +08:00
1 parent 91c032a1c3
commit b7616e9831
3 files changed
+455 -4

No files matched your search

+2
View File
@@ -34,6 +34,7 @@ from web.routers import site as site_router
from web.routers import stream as stream_router
from web.routers import system as system_router
from web.routers import tasks as tasks_router
from web.routers import user as user_router
@asynccontextmanager
@@ -91,6 +92,7 @@ def create_app(serve_flask_fallback: bool = False) -> FastAPI:
app.include_router(stream_router.router, prefix='/api/v1', tags=['stream'])
app.include_router(auth_status_router.router, prefix='/api/v1', tags=['auth'])
app.include_router(auth_router.router, prefix='/api/v1', tags=['auth'])
app.include_router(user_router.router, prefix='/api/v1', tags=['user'])
# 首页与静态资源(迁移完成形态;fallback 模式下同路径也能由 Flask 提供)
app.include_router(index_router.router, tags=['index'])