# -*- coding: utf-8 -*- """系统端点:/health、/api/info。 两个端点无鉴权、无状态、无任务依赖。 响应契约与历史快照逐字段对齐, 由 tests/golden/responses.json 兜住回归。 """ import sys import time from fastapi import APIRouter from core.config import APP_VERSION from web.response import error, success router = APIRouter() # 与 api_info 的 endpoints 表保持一致(逐字对齐历史契约) _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', # 不向匿名访客回显服务器绝对路径 '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)