"""Task ORM:一个上传完成的视频对应一个转写任务,承载状态机。""" from __future__ import annotations from datetime import datetime, timezone from sqlalchemy import DateTime, Float, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column from ..database import Base def _now() -> datetime: return datetime.now(timezone.utc) # 任务状态枚举(单一真源,供 scheduler / cache_cleaner / views 引用) STATUS_UPLOADING = "uploading" # 虚拟状态:分片上传中(不在 Task 表,由 UploadSession 映射) STATUS_QUEUED = "queued" STATUS_EXTRACTING = "extracting" STATUS_TRANSCRIBING = "transcribing" STATUS_SEGMENTING = "segmenting" STATUS_TRANSLATING = "translating" STATUS_DONE = "done" STATUS_FAILED = "failed" class Task(Base): __tablename__ = "task" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) # 原始视频文件名(用户上传时的名字) filename: Mapped[str] = mapped_column(String(512), nullable=False) # 视频在 upload_dir 下的相对路径(提取音频前后可能被删) source_path: Mapped[str] = mapped_column(String(1024), nullable=False) # 状态机:queued → extracting → transcribing → segmenting → translating → done | failed status: Mapped[str] = mapped_column(String(32), nullable=False, default=STATUS_QUEUED, index=True) # 0-100 进度 progress: Mapped[float] = mapped_column(Float, nullable=False, default=0.0) # 失败原因 error: Mapped[str | None] = mapped_column(Text, nullable=True) # 输出字幕路径(双语合并 / 英文 / 中文) bilingual_srt_path: Mapped[str | None] = mapped_column(String(1024), nullable=True) en_srt_path: Mapped[str | None] = mapped_column(String(1024), nullable=True) zh_srt_path: Mapped[str | None] = mapped_column(String(1024), nullable=True) # ---- 流水线阶段间传递的中间数据(scheduler 调度用)---- # ffmpeg 提取出的 wav 绝对路径(extract 阶段写,asr 阶段读) wav_path: Mapped[str | None] = mapped_column(String(1024), nullable=True) # ASR + 断句结果(asr 阶段写 JSON,translate 阶段读)。JSON 序列化的 list[Subtitle] segments_json: Mapped[str | None] = mapped_column(Text, nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime, default=_now, index=True) updated_at: Mapped[datetime] = mapped_column(DateTime, default=_now, onupdate=_now) def __repr__(self) -> str: return f""