Files
bornetime/backend/app/models/tables.py
T

91 lines
2.6 KiB
Python

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")