clip-forge/backend/app/schemas.py

84 lines
1.9 KiB
Python

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", pattern="^(tiktok|hormozi|karaoke|minimal|none)$")
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", pattern="^(tiktok|hormozi|karaoke|minimal|none)$")