"""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) 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="queued") # 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) created_at: Mapped[datetime] = mapped_column(DateTime, default=_now) updated_at: Mapped[datetime] = mapped_column(DateTime, default=_now, onupdate=_now) def __repr__(self) -> str: return f""