- scheduler: ffmpeg 异步线程 + GPU 串行调度 + 模型复用(2N→2 次加载) - pipeline: 阶段拆分(extract/asr/translate),中间数据存 Task 字段 - translate_service: 长度排序批处理,padding 浪费减少 91% - model_manager: ASR/翻译不共驻,BatchedInferencePipeline 批量解码 - 日志分级: INFO=任务流转里程碑,DEBUG=进度详情;默认 INFO - 前端: 日志最新在上+滚动感知+退避轮询;24h 时间;上传中状态显示 - /health: 返回完整 Whisper/NLLB 配置 - upload_service: 单事务 complete + 扩展名白名单 - task_router: 合并 UploadSession 虚拟任务到列表 - Dockerfile: CPU/GPU 独立构建链,deps 缓存稳定 - prefetch_models: 安装时预下载模型权重
28 lines
1010 B
Python
28 lines
1010 B
Python
"""/docs Basic Auth:明文密码,常量时间比较。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import secrets
|
||
|
||
from fastapi import Depends, HTTPException, status
|
||
from fastapi.security import HTTPBasic, HTTPBasicCredentials
|
||
|
||
from .config import get_settings
|
||
|
||
security = HTTPBasic()
|
||
|
||
|
||
def require_docs_auth(credentials: HTTPBasicCredentials = Depends(security)) -> str:
|
||
s = get_settings()
|
||
if not s.docs.enabled or not s.docs.password:
|
||
raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="docs disabled")
|
||
ok_user = secrets.compare_digest(credentials.username.encode(), s.docs.username.encode())
|
||
ok_pass = secrets.compare_digest(credentials.password.encode(), s.docs.password.encode())
|
||
if not (ok_user and ok_pass):
|
||
raise HTTPException(
|
||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||
detail="invalid credentials",
|
||
headers={"WWW-Authenticate": f'Basic realm="{s.docs.realm}"'},
|
||
)
|
||
return credentials.username
|