diff --git a/modules/anime_etl/models.py b/modules/anime_etl/models.py new file mode 100644 index 0000000..a65516f --- /dev/null +++ b/modules/anime_etl/models.py @@ -0,0 +1,82 @@ +# anime_etl/models.py +from __future__ import annotations +from enum import Enum +from typing import Dict, List, Optional +from pydantic import BaseModel + + +class Source(str, Enum): + ANILIST = "anilist" + JIKAN = "jikan" + SHIKIMORI = "shikimori" + + +class Studio(BaseModel): + id: Optional[int] = None + name: str + poster: Optional["Image"] = None + description: Optional[str] = None + + +class Image(BaseModel): + id: Optional[int] = None + storage_type: Optional[str] = None # для БД: storage_type_t + image_path: str # для внешнего постера – URL + + +class Tag(BaseModel): + # локализованный тег, как в Tag.yaml: { "en": "Shojo", "ru": "Сёдзё", ... } + names: Dict[str, str] + + +class SourceTitle(BaseModel): + """ + Нормализованная инфа из одного источника (AniList/Jikan/...). + """ + source: Source + external_id: str + + title_names: Dict[str, List[str]] + studio: Optional[Studio] = None + tags: List[Tag] = [] + + poster: Optional[Image] = None + + title_status: Optional[str] = None + rating: Optional[float] = None + rating_count: Optional[int] = None + + release_year: Optional[int] = None + release_season: Optional[str] = None + + season: Optional[int] = None + + episodes_aired: Optional[int] = None + episodes_all: Optional[int] = None + episodes_len: Optional[Dict[str, float]] = None + + +class CanonicalTitle(BaseModel): + """ + То, что пойдёт в нашу БД + будет соответствовать Title.yaml. + """ + id: Optional[int] = None + + title_names: Dict[str, List[str]] + + studio: Optional[Studio] = None + tags: List[Tag] = [] + + poster: Optional[Image] = None + + title_status: Optional[str] = None + rating: Optional[float] = None + rating_count: Optional[int] = None + + release_year: Optional[int] = None + release_season: Optional[str] = None + + season: Optional[int] = None + episodes_aired: Optional[int] = None + episodes_all: Optional[int] = None + episodes_len: Optional[Dict[str, float]] = None