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:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user