Rovin / backend /models.py
Dyen's picture
Deploy Rovin: Dockerized App
0a0a57b
"""
LocalShortsLab Pydantic Models
Data models for API requests and responses.
"""
from pydantic import BaseModel
from typing import Optional, List
from enum import Enum
class JobStatusEnum(str, Enum):
"""Job processing status."""
QUEUED = "queued"
PROCESSING = "processing"
DONE = "done"
ERROR = "error"
CANCELLED = "cancelled"
class ShortStatusEnum(str, Enum):
"""Individual short status."""
PENDING = "pending"
PROCESSING = "processing"
READY = "ready"
ERROR = "error"
class JobCreateResponse(BaseModel):
"""Response for job creation."""
job_id: str
status: JobStatusEnum
class JobStatus(BaseModel):
"""Full job status with metadata."""
job_id: str
overall_status: JobStatusEnum
progress_percent: float = 0.0
duration: Optional[float] = None
resolution: Optional[str] = None
fps: Optional[float] = None
error_message: Optional[str] = None
class ShortMetadata(BaseModel):
"""Metadata for a single short clip."""
short_id: str
start_time: float
end_time: float
duration: float
score: float
tagline: str
status: ShortStatusEnum
thumbnail_url: Optional[str] = None
class ShortsList(BaseModel):
"""List of all shorts for a job."""
job_id: str
shorts: List[ShortMetadata]
class ShortFiles(BaseModel):
"""Download URLs for a short's files."""
short_id: str
video_url: str
srt_url: Optional[str] = None
subtitled_video_url: Optional[str] = None
class SceneInfo(BaseModel):
"""Information about a detected scene."""
scene_id: int
start_time: float
end_time: float
duration: float
score: Optional[float] = None
tagline: Optional[str] = None
frame_path: Optional[str] = None
class TranscriptSegment(BaseModel):
"""A segment of the transcript with timing."""
start_time: float
end_time: float
text: str