56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
# 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
|