"""Video presentation schemas for API responses.""" from datetime import datetime from enum import StrEnum from typing import Any from pydantic import BaseModel class VideoPresentationStatusEnum(StrEnum): PENDING = "pending" GENERATING = "generating" READY = "ready" FAILED = "failed" class VideoPresentationBase(BaseModel): """Base video presentation schema.""" title: str slides: list[dict[str, Any]] | None = None scene_codes: list[dict[str, Any]] | None = None search_space_id: int class VideoPresentationCreate(VideoPresentationBase): """Schema for creating a video presentation.""" pass class VideoPresentationUpdate(BaseModel): """Schema for updating a video presentation.""" title: str | None = None slides: list[dict[str, Any]] | None = None scene_codes: list[dict[str, Any]] | None = None class VideoPresentationRead(VideoPresentationBase): """Schema for reading a video presentation.""" id: int status: VideoPresentationStatusEnum = VideoPresentationStatusEnum.READY created_at: datetime slide_count: int | None = None class Config: from_attributes = True @classmethod def from_orm_with_slides(cls, obj): """Create VideoPresentationRead with slide_count computed. Replaces raw server file paths in `audio_file` with API streaming URLs so the frontend can use them directly in Remotion