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
snowy-yang da3d013e9c chore: 清理前端与容器脚本中指向已删台账的过时编号
模板/样式/脚本的注释里散落着「第 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。
2026-09-26 13:18:44 +08:00

71 lines
2.9 KiB
Python
Raw Permalink 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 -*-
"""集中配置与常量(框架无关)。
仅常量、配置类与路径定义;分层重构未改变任何取值。
不导入 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']