Archived
模板/样式/脚本的注释里散落着「第 N 条」「F59」「P3-43」这类编号,它们指向的 修复验收台账与交接文档已在本轮删除——留着既检索不到、也对不上号,还让后来读 注释的人以为存在一份可查的编号清单。本次只动注释,正文零改动。 覆盖范围(全仓一致): - templates/index.html 163 处、static/site_auth.js 55 处,共 218 处编号整段摘除 (含「第 N 条(Px):」前缀与「(Fxx 短标签)」括号)。 - 容器/配置 16 处:docker-compose.yml、entrypoint.sh(F59 / 第 93 条 / 第 97 条)、 Dockerfile(T7 / 第 97 条)、.dockerignore(T1 / 第 97 条 / 第 55 条 / P2-9)、 .env.example(F59 / 第 100 条 / 「详见交接文档 F11」这条失效指引)、.gitignore(P3-41)。 - Python 4 处:core/config.py(D-1)、services/tasks.py(O-5×2)、services/_shared.py(O-5) ——上一轮 Python 侧清理的漏网。 为什么规则要收窄(两类误伤,实测踩到): 1. 标签首字母不能用泛化的 [A-Z]:X5 是 QQ 浏览器内核、ES5 是 JS 版本,都不是编号。 泛化后会把「微信 XWeb/X5、QQ 内置」改成「微信 XWeb/、QQ 内置」,把 「Chromium <87 的老 X5 不识别 inset」改成「老 不识别」。现按本仓真实用过的 任务族白名单收窄(A B C D F O P R S T U),X5/ES5 原样保留。 2. 括号内「编号 + 长说明」不能整段删:「(F51 只防了切歌,这里补同歌翻页)」 整段删掉会连说明一起丢;现只摘编号、保留说明文字。 为什么同步改黄金契约快照:题头注释属于模板内容,改了注释首页字节数必然变 (466261 → 464333),tests/golden/responses.json 的 index 条目按既定流程刷新 html_len/html_sha256;并在 tests/test_golden.py 补一段说明,写清该条目记的是 「当前模板」而非 Flask 期数值、以及有意改模板后如何重算 (html_len = 文件字节数 - 1,sha256 = 文件去掉末尾换行后的哈希)。 验证(全部通过): - 与 HEAD 比对:剥离全部注释后的正文逐行一致(唯一差异是删掉了一处行尾空注释), 行数不变、每行半角括号/引号数量不变 → 代码与字符串零改动; - node --check 通过(静态 JS + index.html 内联脚本),<style> 块花括号平衡; - 真实 uvicorn 冒烟:/health /user/status /api/topen → 200、/admin/site/backup/list → 403, /static/site_auth.js 响应体与本地文件 sha1 相同,/ 无「第 N 条」残留; - ruff All checks passed;pyright 0 errors / 0 warnings;pytest 144 passed。
71 lines
2.9 KiB
Python
71 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""集中配置与常量(框架无关)。
|
||
|
||
仅常量、配置类与路径定义;分层重构未改变任何取值。
|
||
不导入 fastapi,不持有任何运行时可变状态(运行时状态见 core.state)。
|
||
"""
|
||
|
||
import os
|
||
from dataclasses import dataclass
|
||
|
||
# 站点统一版本号(/health、/api/info、前端 CHANGELOG 全部以此为准,别处不得硬编码)
|
||
APP_VERSION = '2.4.0'
|
||
|
||
# 交付结果保留期(服务端与前端「领取」入口统一 35 分钟——前端入口保留 35 分钟,
|
||
# 原 30 分钟会在最后 5 分钟让领取必 404)。终态任务记录、任务目录、下载缓存均按此回收。
|
||
RESULT_RETENTION_SECONDS = 35 * 60
|
||
|
||
|
||
@dataclass
|
||
class Settings:
|
||
"""服务配置类(保留 APIConfig 别名以兼容既有引用)"""
|
||
|
||
host: str = '0.0.0.0'
|
||
port: int = 5000
|
||
debug: bool = False
|
||
downloads_dir: str = 'downloads'
|
||
# 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 '*' # 可经环境变量收敛同源(空值回落默认)
|
||
|
||
|
||
# 向后兼容别名:既有代码/文档沿用 APIConfig 名称
|
||
APIConfig = Settings
|
||
|
||
|
||
# 游客个人登录使用的独立 Cookie 文件(与管理员全局 Cookie 分离)。
|
||
# 这是有意的隔离——QRLoginClient 的默认值恰是全局 cookie.txt,
|
||
# 显式传参防误写全局文件;起本站任何路径都不再写它(仅构造参数)
|
||
USER_COOKIE_FILE = 'user_cookie.txt'
|
||
|
||
|
||
# 设备心跳时序:超时未上线则暂停其批量任务让出排队名额;超过取消窗口则取消并删文件
|
||
PAUSE_AFTER_SECONDS = 40
|
||
CANCEL_AFTER_SECONDS = 30 * 60
|
||
HEARTBEAT_INTERVAL = 15
|
||
|
||
# 每用户同时在途(排队/运行/暂停)任务上限与全站任务表上限(资源上限)
|
||
MAX_ACTIVE_TASKS_PER_USER = 5
|
||
MAX_TOTAL_TASKS = 200
|
||
# 终态任务要留表 35 分钟供领取,容量闸只数在途任务——旧口径把
|
||
# 终态记录计入 200 上限会把全站吞吐封顶在约 5.7 任务/分钟;终态另设更大的滞留
|
||
# 上限保内存有界(1000 ≈ 28 任务/分钟的领取窗口,远高于在途处理能力)
|
||
MAX_TERMINAL_TASKS = 1000
|
||
|
||
# 全局批量打包并发上限(同时构建的 ZIP 数量)
|
||
BATCH_ZIP_CONCURRENCY = 3
|
||
|
||
|
||
# 音频直链多重防护(HMAC 签名 + 时效 + 代理流)
|
||
AUDIO_TOKEN_TTL = RESULT_RETENTION_SECONDS + 60 # = 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']
|