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/core/config.py
T
snowy-yang c2a8da3e43 refactor(core): 抽出框架无关核心层 core/,为 FastAPI 迁移铺路
第一步模块拆分(纯搬运,零行为变化):
- 新增 core/ 包:config(常量/配置) + state(运行时状态) + utils(纯函数) + security(音频签名)
- main.py 改为从 core 导入并以原下划线名再导出,250+ 既有调用点零改动

关键设计:
- 状态全部原地修改,import 即共享同一对象(21 项身份断言 + 10 项冒烟全绿)
- 音频签名密钥由启动时 _init_audio_secret(app.secret_key) 注入,
  解除 core.security 对 Flask app 的依赖,新老应用可互认 token

验证:py_compile 通过;冒烟 10/10 PASS;对象身份 22/22 PASS;
waitress 真实启动 /health 200 version=2.4.0。main.py 减 229 行。
2026-09-26 00:16:04 +08:00

68 lines
3.1 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 -*-
"""集中配置与常量(框架无关)。
自 main.py 原样迁出,语义不变:仅常量、配置类与路径定义。
不导入 flask/fastapi,不持有任何运行时可变状态(运行时状态见 core.state)。
"""
import os
from dataclasses import dataclass
# 站点统一版本号(P3-12/P3-22:/health、/api/info、前端 CHANGELOG 全部以此为准,别处不得硬编码)
APP_VERSION = '2.4.0'
# 交付结果保留期(P1-3/D-1:服务端与前端「领取」入口统一 35 分钟——前端入口保留 35 分钟,
# 原 30 分钟会在最后 5 分钟让领取必 404)。终态任务记录、任务目录、下载缓存均按此回收。
RESULT_RETENTION_SECONDS = 35 * 60
@dataclass
class Settings:
"""服务配置类(原 main.APIConfig;迁移期保留 APIConfig 别名以兼容既有引用)"""
host: str = '0.0.0.0'
port: int = 5000
debug: bool = False
downloads_dir: str = 'downloads'
# 第 98 条:max_file_size/request_timeout 两个架空字段已删除——请求体上限真实
# 生效点是 _body_size_limit(业务 2MB/备份 200MB),上游超时在 music_api 各调用点
log_level: str = 'INFO'
cors_origins: str = (os.environ.get('CORS_ORIGINS') or '*').strip() or '*' # 第 100 条:可经环境变量收敛同源(空值回落默认)
# 向后兼容别名:既有代码/文档沿用 APIConfig 名称
APIConfig = Settings
# 游客个人登录使用的独立 Cookie 文件(与管理员全局 Cookie 分离)。
# 第 100 条:这是有意的隔离——QRLoginClient 的默认值恰是全局 cookie.txt,
# 显式传参防误写全局文件;第 91 条起本站任何路径都不再写它(仅构造参数)
USER_COOKIE_FILE = 'user_cookie.txt'
# 设备心跳时序:超时未上线则暂停其批量任务让出排队名额;超过取消窗口则取消并删文件
PAUSE_AFTER_SECONDS = 40
CANCEL_AFTER_SECONDS = 30 * 60
HEARTBEAT_INTERVAL = 15
# 每用户同时在途(排队/运行/暂停)任务上限与全站任务表上限(F20:资源上限)
MAX_ACTIVE_TASKS_PER_USER = 5
MAX_TOTAL_TASKS = 200
# 第 97 条(P2-2):终态任务要留表 35 分钟供领取,容量闸只数在途任务——旧口径把
# 终态记录计入 200 上限会把全站吞吐封顶在约 5.7 任务/分钟;终态另设更大的滞留
# 上限保内存有界(1000 ≈ 28 任务/分钟的领取窗口,远高于在途处理能力)
MAX_TERMINAL_TASKS = 1000
# 全局批量打包并发上限(同时构建的 ZIP 数量)
BATCH_ZIP_CONCURRENCY = 3
# 音频直链多重防护(HMAC 签名 + 时效 + 代理流)
AUDIO_TOKEN_TTL = RESULT_RETENTION_SECONDS + 60 # 第 93 条(P2-4):= 36 分钟——原 30 分钟
# 大于交付/解析结果 35 分钟保留期 60 秒:交付窗口末段试听不再 403(旧 30 分钟口径矛盾已修)
AUDIO_URL_KEYS = {'url', 'audioUrl'}
AUDIO_HOST_MARKS = ('126.net', 'music.126.net', '.netease')
# 可解析音质档位(顺序即前端展示顺序)
VALID_QUALITY_LEVELS = ['standard', 'exhigh', 'lossless', 'hires', 'sky', 'jyeffect', 'jymaster', 'dolby']