from datetime import datetime from uuid import UUID from typing import Optional, List from pydantic import BaseModel, ConfigDict class VideoStreamSchema(BaseModel): model_config = ConfigDict(from_attributes=True) stream_index: Optional[int] = None codec_name: Optional[str] = None codec_long_name: Optional[str] = None profile: Optional[str] = None level: Optional[int] = None width: Optional[int] = None height: Optional[int] = None coded_width: Optional[int] = None coded_height: Optional[int] = None aspect_ratio: Optional[str] = None pix_fmt: Optional[str] = None field_order: Optional[str] = None frame_rate: Optional[str] = None start_time: Optional[float] = None duration: Optional[float] = None bit_rate: Optional[int] = None nb_frames: Optional[int] = None color_range: Optional[str] = None color_space: Optional[str] = None has_b_frames: Optional[int] = None sample_aspect_ratio: Optional[str] = None class AudioStreamSchema(BaseModel): model_config = ConfigDict(from_attributes=True) stream_index: Optional[int] = None codec_name: Optional[str] = None codec_long_name: Optional[str] = None profile: Optional[str] = None channels: Optional[int] = None channel_layout: Optional[str] = None sample_rate: Optional[int] = None sample_fmt: Optional[str] = None bit_rate: Optional[int] = None duration: Optional[float] = None language: Optional[str] = None class SubtitleStreamSchema(BaseModel): model_config = ConfigDict(from_attributes=True) stream_index: Optional[int] = None codec_name: Optional[str] = None language: Optional[str] = None class VideoSchema(BaseModel): model_config = ConfigDict(from_attributes=True) id: UUID file_path: str file_name: str file_extension: Optional[str] = None file_size: Optional[int] = None format_name: Optional[str] = None format_long_name: Optional[str] = None duration: Optional[float] = None bit_rate: Optional[int] = None nb_streams: Optional[int] = None start_time: Optional[float] = None title: Optional[str] = None artist: Optional[str] = None description: Optional[str] = None probed_at: Optional[datetime] = None registered_at: Optional[datetime] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None video_streams: List[VideoStreamSchema] = [] audio_streams: List[AudioStreamSchema] = [] subtitle_streams: List[SubtitleStreamSchema] = [] class VideoListResponse(BaseModel): total: int videos: List[VideoSchema] class VideoSearchQuery(BaseModel): title: Optional[str] = None artist: Optional[str] = None codec_name: Optional[str] = None min_width: Optional[int] = None max_width: Optional[int] = None min_height: Optional[int] = None max_height: Optional[int] = None format_name: Optional[str] = None skip: int = 0 limit: int = 20 class RegisterRequest(BaseModel): probe_json_path: str absolute_file_path: str