feat: 设置页调 batch_size + 删除任务 + /docs 去认证 + 离线模式

设置页(/settings):
- 新增 Setting DB 模型(键值存储,持久化运行时覆盖)
- config.py 加 _apply_overrides:get_settings() 合并 DB 覆盖值
  (_applying_overrides 标志防递归:DB 初始化回调 get_settings 时不重入)
- save_setting() 写 DB + 清 lru_cache,后续任务读到新值
- settings_router.py: GET/PUT /api/settings
- settings_html.py: 设置页表单(batch_size/beam_size/sort_by_length)
  + 设备只读信息 + 保存后 reload 确认
- 验证:改 asr_batch_size=16 beam_size=1 -> 任务 ASR 日志确认生效
- 验证:重启容器后设置从 DB 恢复(持久化)

删除任务:
- task_router.py: DELETE /api/tasks/{id},仅 done/failed 可删
  删字幕/音频/视频产物 + UploadSession + Task DB 记录
- home_html.py + history_html.py: done/failed 任务显示删除按钮
  + confirm 确认 + 调用 DELETE API + 刷新列表
- 验证:删除 task 15 成功,删除进行中 task 返回 409

/docs 去认证:
- 移除 require_docs_auth 依赖,/docs /redoc /openapi.json 直接公开

离线模式:
- Dockerfile dev/final 加 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1
  (模型已缓存在 ./models volume,无需联网验证)
- 验证:离线模式完整跑通 ASR+翻译(task 15 done)
This commit is contained in:
audio2text dev
2026-07-11 11:33:34 +08:00
parent 78b87bfb24
commit 7635e5e766
12 changed files with 523 additions and 15 deletions

View File

@@ -1,7 +1,9 @@
"""任务路由:列表 / 状态 / 下载字幕。"""
"""任务路由:列表 / 状态 / 下载字幕 / 删除"""
from __future__ import annotations
import logging
import shutil
from datetime import datetime, timezone
from pathlib import Path
@@ -11,10 +13,11 @@ from sqlalchemy.orm import Session
from ..config import get_settings
from ..database import get_db
from ..models.task import Task, STATUS_UPLOADING
from ..models.task import Task, STATUS_UPLOADING, STATUS_DONE, STATUS_FAILED
from ..models.upload_session import UploadSession
from ..schemas.task import TaskListResponse, TaskResponse
logger = logging.getLogger("audio2text.tasks")
router = APIRouter(prefix="/api/tasks", tags=["task"])
@@ -129,3 +132,47 @@ def download_subtitle(
media_type="application/x-subrip",
filename=download_name,
)
@router.delete("/{task_id}", summary="删除任务(仅允许已完成/失败)")
def delete_task(task_id: int, db: Session = Depends(get_db)) -> dict:
"""删除任务及其产物(字幕 / 中间音频 / 保留的原始视频)+ DB 记录。
仅允许删除已完成done或失败failed的任务进行中的任务不可删。
"""
task = db.get(Task, task_id)
if task is None:
raise HTTPException(404, f"任务不存在:{task_id}")
if task.status not in (STATUS_DONE, STATUS_FAILED):
raise HTTPException(409, f"任务进行中,无法删除(当前状态:{task.status}")
s = get_settings()
deleted: list[str] = []
# 删字幕输出目录
out_dir = s.output_dir() / f"task_{task.id}"
if out_dir.is_dir():
shutil.rmtree(out_dir, ignore_errors=True)
deleted.append("outputs")
# 删中间音频
if task.wav_path:
wav = Path(task.wav_path)
if wav.is_file():
wav.unlink(missing_ok=True)
deleted.append("audio")
# 删保留的原始视频
if task.source_path:
src = s.upload_dir() / task.source_path
if src.is_file():
src.unlink(missing_ok=True)
deleted.append("video")
# 删 DB 记录(先删关联的 UploadSession再删 Task
db.query(UploadSession).filter(UploadSession.task_id == task.id).delete()
db.delete(task)
db.commit()
logger.info("删除任务 %d%s%s", task_id, task.filename, ", ".join(deleted) or "无产物")
return {"status": "deleted", "task_id": task_id, "cleaned": deleted}