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