91 lines
2.6 KiB
Python
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")
|