""" Pydantic schemas for Video-Service API """ from datetime import datetime from enum import Enum from pydantic import BaseModel, Field class VideoStatus(str, Enum): """Video processing status.""" PENDING = "pending" UPLOADING = "uploading" PROCESSING = "processing" READY = "ready" ERROR = "error" class VideoQuality(str, Enum): """Available video qualities.""" Q360P = "360p" Q720P = "720p" Q1080P = "1080p" class VideoMetadata(BaseModel): """Video metadata extracted from file.""" duration_seconds: float = 0 width: int = 0 height: int = 0 fps: float = 0 codec: str = "" bitrate: int = 0 file_size_bytes: int = 0 class VideoUploadRequest(BaseModel): """Request to initiate video upload.""" kurs_id: int = Field(..., description="WordPress Kurs Post ID") title: str = Field(..., min_length=1, max_length=255) description: str | None = None class VideoUploadResponse(BaseModel): """Response after initiating upload.""" video_id: str upload_url: str expires_at: datetime class VideoStatusResponse(BaseModel): """Video status response.""" video_id: str kurs_id: int title: str status: VideoStatus progress: int = Field(0, ge=0, le=100) metadata: VideoMetadata | None = None thumbnail_url: str | None = None available_qualities: list[VideoQuality] = [] created_at: datetime updated_at: datetime error_message: str | None = None class VideoListResponse(BaseModel): """List of videos response.""" videos: list[VideoStatusResponse] total: int class StreamTokenRequest(BaseModel): """Request for stream token.""" video_id: str buchung_id: int class WebhookPayload(BaseModel): """Payload sent to WordPress webhook.""" event: str # video.ready, video.error, video.progress video_id: str kurs_id: int status: VideoStatus progress: int = 0 metadata: VideoMetadata | None = None thumbnail_url: str | None = None error_message: str | None = None timestamp: datetime class HealthResponse(BaseModel): """Health check response.""" status: str version: str environment: str redis_connected: bool storage_writable: bool ffmpeg_available: bool