from datetime import datetime from typing import Optional from uuid import UUID from pydantic import BaseModel, Field # --- Job Schemas --- class JobCreate(BaseModel): source_type: str = Field(..., pattern="^(youtube|upload)$") source_url: Optional[str] = None class JobResponse(BaseModel): id: UUID source_type: str source_url: Optional[str] source_filename: Optional[str] title: Optional[str] duration: Optional[float] status: str progress: float stage_message: Optional[str] error_message: Optional[str] created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class JobProgress(BaseModel): status: str progress: float stage_message: Optional[str] # --- Clip Schemas --- class ClipResponse(BaseModel): id: UUID job_id: UUID title: str start_time: float end_time: float duration: Optional[float] = None virality_score: float category: Optional[str] reasoning: Optional[str] transcript_segment: Optional[str] thumbnail_path: Optional[str] raw_clip_path: Optional[str] created_at: datetime model_config = {"from_attributes": True} # --- Render Schemas --- class RenderCreate(BaseModel): aspect_ratio: str = Field(default="9:16", pattern="^(16:9|9:16|1:1|4:5)$") subtitle_style: str = Field(default="tiktok") class RenderResponse(BaseModel): id: UUID clip_id: UUID aspect_ratio: str subtitle_style: str status: str progress: float output_path: Optional[str] error_message: Optional[str] created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class BulkRenderCreate(BaseModel): clip_ids: list[UUID] aspect_ratio: str = Field(default="9:16", pattern="^(16:9|9:16|1:1|4:5)$") subtitle_style: str = Field(default="tiktok")