# models.py from pydantic import BaseModel, Field, validator from typing import Optional, List import db class Video(BaseModel): file_name: str raw_file: str = Field(..., description="Identifiant unique de la vidéo") duration: Optional[float] = None mp4_file: Optional[str] = None mp4_file_name: Optional[str] = None rotated_file: Optional[str] = None thumbnail_file: Optional[str] = None record_datetime: Optional[str] = None day_of_week: Optional[str] = None lat: Optional[float] = None long: Optional[float] = None address: Optional[str] = None difficulty_level: Optional[str] = Field("Tout niveau", description="Niveau de difficulté") # --- propriétés pratiques --- @property def id(self) -> str: """Identifiant unique (basé sur file_name).""" return self.file_name @property def title(self) -> str: """Nom court à afficher.""" return self.mp4_file_name or self.file_name @property def difficulty_display(self) -> str: return self.difficulty_level or "Tout niveau" # --- Méthodes métiers --- def load_labels(self) -> List[str]: return db.load_video_labels(self.file_name) def save_labels(self, label_names: List[str]): db.save_video_labels(self.file_name, label_names) # --- Validation optionnelle --- @validator("raw_file") def validate_raw_file(cls, v): if not v or not isinstance(v, str): raise ValueError("raw_file doit être une chaîne non vide") return v @validator("duration") def validate_duration(cls, v): if v is not None and v < 0: raise ValueError("duration ne peut pas être négative") return v