53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
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
|
|
image_filename: Optional[str] = Field(default=None)
|
|
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())
|