This repository has been archived on 2026-10-02. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
NeteaseUrl/web/routers/system.py
T
snowy-yang 41356e89c4 feat(web): FastAPI 脚手架(strangler 迁移起点)
新增 web/ 包,与 Flask 应用并存、共享 core/:
- web/app.py     create_app 工厂;已迁移路由挂 /api/v1,可挂遗留 Flask 兜底
- web/main.py    uvicorn 入口(sys.path 补项目根)
- web/response.py 响应工具,与 Flask APIResponse 的 JSON 契约逐字段对齐
- web/routers/system.py 迁移样板:/api/v1/health、/api/v1/api/info
- requirements-fastapi.txt 迁移目标依赖(不影响当前生产 Flask 部署)

验证:
- 奇偶校验(.zcode/refactor/parity.py)Flask /health vs FastAPI /api/v1/health、
  /api/info vs /api/v1/api/info —— 状态码/顶层键/响应体全一致
- uvicorn 真实启动 200;Flask fallback 挂载下 /api/v1/* 走 FastAPI、/* 走 Flask 同为 200

当前仅样板端点;生产服务器切换与状态统一见后续迁移阶段。
2026-09-26 00:17:56 +08:00

81 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""系统端点(迁移样板):/health、/api/info。
/flask 侧的这两个端点无鉴权、无状态、无任务依赖,是最安全的迁移起点。
此处实现与 main.py 的 health_check / api_info **响应契约逐字段对齐**,
用于验证双框架一致性(见 .zcode/refactor/parity.py)。
"""
import sys
import time
from fastapi import APIRouter
from core.config import APP_VERSION
from web.response import error, success
router = APIRouter()
# 与 main.py api_info 的 endpoints 表保持一致(迁移期以 Flask 侧为准,逐字对齐)
_ENDPOINTS = {
'/health': 'GET - 健康检查',
'/song': 'GET/POST - 获取歌曲信息',
'/search': 'GET/POST - 搜索音乐',
'/playlist': 'GET/POST - 获取歌单详情',
'/album': 'GET/POST - 获取专辑详情',
'/download': 'POST - 下载音乐(付费动作仅接受 POST)',
'/podcast/parse': 'GET/POST - 播客解析(电台/单集)',
'/podcast/programs': 'GET/POST - 播客单集列表(分页)',
'/podcast/search': 'GET/POST - 播客搜索',
'/podcast/hot': 'GET/POST - 热门播客与分类',
'/podcast/download': 'POST - 播客单集下载',
'/podcast/download/batch_zip': 'POST - 整台播客打包ZIP',
'/global/playlists': 'GET/POST - 全局账号歌单列表',
'/global/playlist': 'GET/POST - 全局账号歌单详情',
'/api/playlist/play': 'GET/POST - 公开歌单播放API(id/level/limit)',
'/api/info': 'GET - API信息',
}
@router.get('/health')
def health_check():
"""健康检查API(对应 Flask health_check)"""
try:
from music_api import load_cookies
cookies = load_cookies()
cookie_status = 'valid' if cookies else 'invalid'
health_info = {
'service': 'running',
'timestamp': int(time.time()) if 'time' in sys.modules else None,
'cookie_status': cookie_status,
'cookie_count': len(cookies),
'downloads_dir': 'configured', # R5-P3:不向匿名访客回显服务器绝对路径
'version': APP_VERSION,
}
return success(health_info, "API服务运行正常")
except Exception:
return error("服务暂时不可用,请稍后再试", 500)
@router.get('/api/info')
def api_info():
"""API信息接口(对应 Flask api_info)"""
try:
info = {
'name': '云村小助手API服务',
'version': APP_VERSION,
'description': '云村小助手 · 网易云音乐解析/下载服务',
'endpoints': dict(_ENDPOINTS),
'supported_qualities': [
'standard', 'exhigh', 'lossless',
'hires', 'sky', 'jyeffect', 'jymaster', 'dolby'
],
'config': {
'downloads_dir': 'configured',
'max_body_bytes': '2MB(备份上传 200MB)',
},
}
return success(info, "API信息获取成功")
except Exception:
return error("服务暂时不可用,请稍后再试", 500)