import uuid from datetime import datetime, timezone from typing import Dict, List, Optional from pydantic import BaseModel, Field from settings import settings REPO_DATA_FILENAME = settings.directory / "data.json" class Episode(BaseModel): id: str = Field(default_factory=lambda: str(uuid.uuid4())) name: str duration: Optional[float] = Field(default=None) description: Optional[str] = Field(default=None) file_hash: str file_size: int publish_date: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class Podcast(BaseModel): name: str description: str explicit: bool episodes: List[Episode] = list() class PodcastRepository(BaseModel): podcasts: Dict[str, Podcast] = dict() def load_repository() -> PodcastRepository: settings.directory.mkdir(parents=True, exist_ok=True) if not REPO_DATA_FILENAME.is_file(): new_repo = PodcastRepository( podcasts={ str(uuid.uuid4()): Podcast(name=name, description=name, explicit=True) for name in settings.feeds } ) save_repository(new_repo) return new_repo with open(REPO_DATA_FILENAME, "r") as f: return PodcastRepository.model_validate_json(f.read()) def save_repository(repository: PodcastRepository) -> None: with open(REPO_DATA_FILENAME, "w") as f: f.write(repository.model_dump_json())