import datetime from sqlalchemy import ( Column, Integer, String, Float, Text, DateTime, ForeignKey, Enum as SAEnum, ) from sqlalchemy.orm import relationship from .database import Base import enum class VideoStatus(str, enum.Enum): uploaded = "uploaded" queued = "queued" processing = "processing" review = "review" generating = "generating" done = "done" error = "error" class JobType(str, enum.Enum): process = "process" generate = "generate" class JobStatus(str, enum.Enum): pending = "pending" running = "running" done = "done" failed = "failed" class Video(Base): __tablename__ = "videos" id = Column(Integer, primary_key=True, autoincrement=True) filename = Column(String(512), nullable=False) filepath = Column(String(1024), nullable=False) duration = Column(Float, nullable=True) status = Column(String(32), default=VideoStatus.uploaded.value) output_path = Column(String(1024), nullable=True) error_message = Column(Text, nullable=True) created_at = Column(DateTime, default=datetime.datetime.utcnow) updated_at = Column( DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow ) segments = relationship( "Segment", back_populates="video", cascade="all, delete-orphan" ) jobs = relationship("Job", back_populates="video", cascade="all, delete-orphan") class Segment(Base): __tablename__ = "segments" id = Column(Integer, primary_key=True, autoincrement=True) video_id = Column(Integer, ForeignKey("videos.id"), nullable=False) speaker_label = Column(String(32), nullable=True) start_time = Column(Float, nullable=False) end_time = Column(Float, nullable=False) english_text = Column(Text, nullable=True) danish_text = Column(Text, nullable=True) status = Column(String(32), default="pending") video = relationship("Video", back_populates="segments") class Job(Base): __tablename__ = "jobs" id = Column(Integer, primary_key=True, autoincrement=True) video_id = Column(Integer, ForeignKey("videos.id"), nullable=False) job_type = Column(String(32), nullable=False) status = Column(String(32), default=JobStatus.pending.value) progress = Column(Float, default=0.0) error_message = Column(Text, nullable=True) celery_task_id = Column(String(256), nullable=True) created_at = Column(DateTime, default=datetime.datetime.utcnow) updated_at = Column( DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow ) video = relationship("Video", back_populates="jobs")