animedex.backends.jikan.models
Rich Jikan dataclasses (one per response shape).
Jikan exposes ~91 endpoints. Many share response shapes (every
/anime/{id}/... returning a list of records uses the same row
type). the high-level backend layer captures distinct shapes once and reuses them across
endpoints; the mapper layer picks the right shape per call.
The JikanAnime to_common() projects MAL data onto
Anime, including a duration parser
(“24 min per ep” → 24), an aired ISO-string parser, and a
status normaliser (“Currently Airing” → “airing”).
JikanImageJpg
JikanImages
- class animedex.backends.jikan.models.JikanImages(*, jpg: JikanImageJpg | None = None, webp: JikanImageJpg | None = None, **extra_data: Any)[source]
Bases:
BackendRichModel- jpg: JikanImageJpg | None
- webp: JikanImageJpg | None
JikanTrailerImages
JikanTrailer
- class animedex.backends.jikan.models.JikanTrailer(*, youtube_id: str | None = None, url: str | None = None, embed_url: str | None = None, images: JikanTrailerImages | None = None, **extra_data: Any)[source]
Bases:
BackendRichModel- images: JikanTrailerImages | None
JikanTitleEntry
JikanAiredProp
JikanAiredFromTo
- class animedex.backends.jikan.models.JikanAiredFromTo(*, from_: JikanAiredProp | None = None, to: JikanAiredProp | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelaired.prop/published.propsub-block.fromis a Python keyword, so it’s stored asfrom_withalias="from".populate_by_name=True(inherited fromBackendRichModel) lets pydantic accept either name on input;model_dump(by_alias=True)re-emitsfrom.- from_: JikanAiredProp | None
- to: JikanAiredProp | None
JikanAired
- class animedex.backends.jikan.models.JikanAired(*, from_: str | None = None, to: str | None = None, prop: JikanAiredFromTo | None = None, string: str | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelaired/publishedblock on Jikan anime / manga.- prop: JikanAiredFromTo | None
JikanBroadcast
JikanEntity
- class animedex.backends.jikan.models.JikanEntity(*, mal_id: int, type: str | None = None, name: str | None = None, url: str | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelGeneric
{ mal_id, type, name, url }entity reference used across Jikan responses (producers, licensors, studios, genres, themes, etc.).Some upstream rows omit
namefor archival entries; the field is leftOptionalso the mapper tolerates them rather than raising mid-replay.
JikanThemes
JikanExternal
JikanRelation
- class animedex.backends.jikan.models.JikanRelation(*, relation: str, entry: List[JikanEntity] = [], **extra_data: Any)[source]
Bases:
BackendRichModel- entry: List[JikanEntity]
JikanAnime
- class animedex.backends.jikan.models.JikanAnime(*, mal_id: int, url: str | None = None, images: JikanImages | None = None, trailer: JikanTrailer | None = None, approved: bool | None = None, titles: List[JikanTitleEntry] = [], title: str | None = None, title_english: str | None = None, title_japanese: str | None = None, title_synonyms: List[str] = [], type: str | None = None, source: str | None = None, episodes: int | None = None, status: str | None = None, airing: bool | None = None, aired: JikanAired | None = None, duration: str | None = None, rating: str | None = None, score: float | None = None, scored_by: int | None = None, rank: int | None = None, popularity: int | None = None, members: int | None = None, favorites: int | None = None, synopsis: str | None = None, background: str | None = None, season: str | None = None, year: int | None = None, broadcast: JikanBroadcast | None = None, producers: List[JikanEntity] = [], licensors: List[JikanEntity] = [], studios: List[JikanEntity] = [], genres: List[JikanEntity] = [], explicit_genres: List[JikanEntity] = [], themes: List[JikanEntity] = [], demographics: List[JikanEntity] = [], relations: List[JikanRelation] = [], theme: JikanThemes | None = None, external: List[JikanExternal] = [], streaming: List[JikanExternal] = [], source_tag: SourceTag, **extra_data: Any)[source]
Bases:
BackendRichModelFull Jikan
/anime/{id}/fullresponse payload (rich).- images: JikanImages | None
- trailer: JikanTrailer | None
- titles: List[JikanTitleEntry]
- aired: JikanAired | None
- broadcast: JikanBroadcast | None
- producers: List[JikanEntity]
- licensors: List[JikanEntity]
- studios: List[JikanEntity]
- genres: List[JikanEntity]
- explicit_genres: List[JikanEntity]
- themes: List[JikanEntity]
- demographics: List[JikanEntity]
- relations: List[JikanRelation]
- theme: JikanThemes | None
- external: List[JikanExternal]
- streaming: List[JikanExternal]
JikanManga
- class animedex.backends.jikan.models.JikanManga(*, mal_id: int, url: str | None = None, images: JikanImages | None = None, approved: bool | None = None, titles: List[JikanTitleEntry] = [], title: str, title_english: str | None = None, title_japanese: str | None = None, title_synonyms: List[str] = [], type: str | None = None, chapters: int | None = None, volumes: int | None = None, status: str | None = None, publishing: bool | None = None, published: JikanAired | None = None, score: float | None = None, scored_by: int | None = None, rank: int | None = None, popularity: int | None = None, members: int | None = None, favorites: int | None = None, synopsis: str | None = None, background: str | None = None, authors: List[JikanEntity] = [], serializations: List[JikanEntity] = [], genres: List[JikanEntity] = [], explicit_genres: List[JikanEntity] = [], themes: List[JikanEntity] = [], demographics: List[JikanEntity] = [], relations: List[JikanRelation] = [], external: List[JikanExternal] = [], source_tag: SourceTag, **extra_data: Any)[source]
Bases:
BackendRichModel/manga/{id}/fullresponse. Same shape as JikanAnime minus a few anime-specific fields plus chapter/volume counts.- images: JikanImages | None
- titles: List[JikanTitleEntry]
- published: JikanAired | None
- authors: List[JikanEntity]
- serializations: List[JikanEntity]
- genres: List[JikanEntity]
- explicit_genres: List[JikanEntity]
- themes: List[JikanEntity]
- demographics: List[JikanEntity]
- relations: List[JikanRelation]
- external: List[JikanExternal]
JikanCharacterAnimeRole
- class animedex.backends.jikan.models.JikanCharacterAnimeRole(*, role: str | None = None, anime: JikanEntity | None = None, **extra_data: Any)[source]
Bases:
BackendRichModel- anime: JikanEntity | None
JikanCharacterMangaRole
- class animedex.backends.jikan.models.JikanCharacterMangaRole(*, role: str | None = None, manga: JikanEntity | None = None, **extra_data: Any)[source]
Bases:
BackendRichModel- manga: JikanEntity | None
JikanCharacterVoiceActor
- class animedex.backends.jikan.models.JikanCharacterVoiceActor(*, language: str | None = None, person: JikanEntity | None = None, **extra_data: Any)[source]
Bases:
BackendRichModel- person: JikanEntity | None
JikanCharacter
- class animedex.backends.jikan.models.JikanCharacter(*, mal_id: int, url: str | None = None, images: JikanImages | None = None, name: str, name_kanji: str | None = None, nicknames: List[str] = [], favorites: int | None = None, about: str | None = None, anime: List[JikanCharacterAnimeRole] = [], manga: List[JikanCharacterMangaRole] = [], voices: List[JikanCharacterVoiceActor] = [], source_tag: SourceTag, **extra_data: Any)[source]
Bases:
BackendRichModel/characters/{id}/fulland/characters/{id}.- images: JikanImages | None
- anime: List[JikanCharacterAnimeRole]
- manga: List[JikanCharacterMangaRole]
- voices: List[JikanCharacterVoiceActor]
JikanPerson
- class animedex.backends.jikan.models.JikanPerson(*, mal_id: int, url: str | None = None, website_url: str | None = None, images: JikanImages | None = None, name: str, given_name: str | None = None, family_name: str | None = None, alternate_names: List[str] = [], birthday: str | None = None, favorites: int | None = None, about: str | None = None, source_tag: SourceTag, **extra_data: Any)[source]
Bases:
BackendRichModel/people/{id}/fulland/people/{id}.- images: JikanImages | None
JikanProducer
- class animedex.backends.jikan.models.JikanProducer(*, mal_id: int, url: str | None = None, titles: List[JikanTitleEntry] = [], images: JikanImages | None = None, favorites: int | None = None, established: str | None = None, about: str | None = None, count: int | None = None, external: List[JikanExternal] = [], source_tag: SourceTag, **extra_data: Any)[source]
Bases:
BackendRichModel- titles: List[JikanTitleEntry]
- images: JikanImages | None
- external: List[JikanExternal]
JikanMagazine
JikanGenre
JikanClub
- class animedex.backends.jikan.models.JikanClub(*, mal_id: int, name: str, url: str | None = None, images: JikanImages | None = None, members: int | None = None, category: str | None = None, created: str | None = None, access: str | None = None, source_tag: SourceTag, **extra_data: Any)[source]
Bases:
BackendRichModel- images: JikanImages | None
JikanUser
- class animedex.backends.jikan.models.JikanUser(*, mal_id: int | None = None, username: str, url: str | None = None, images: JikanImages | None = None, last_online: str | None = None, gender: str | None = None, birthday: str | None = None, location: str | None = None, joined: str | None = None, about: str | None = None, source_tag: SourceTag, **extra_data: Any)[source]
Bases:
BackendRichModel- images: JikanImages | None
JikanGenericRow
- class animedex.backends.jikan.models.JikanGenericRow(**extra_data: Any)[source]
Bases:
BackendRichModelPydantic-loose row used by long-tail endpoints (news, forum, pictures, statistics, moreinfo, recommendations, userupdates, reviews, relations, themes, external, streaming, episodes, videos, schedules, watch, recommendations).
Allows arbitrary upstream fields by setting
extra='allow'.- model_config: ClassVar[ConfigDict] = {'extra': 'allow', 'frozen': True, 'populate_by_name': True, 'validate_by_alias': True, 'validate_by_name': True}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
JikanGenericResponse
- class animedex.backends.jikan.models.JikanGenericResponse(*, rows: List[JikanGenericRow] = [], pagination: JikanGenericRow | None = None, source_tag: SourceTag, **extra_data: Any)[source]
Bases:
BackendRichModelWrapper for any Jikan endpoint whose payload is too large / unstable to map field-by-field. Carries the parsed
dataarray as a list of permissive rows + the source tag.Use sites:
/anime/{id}/news,/anime/{id}/forum,/anime/{id}/videos,/anime/{id}/pictures,/anime/{id}/statistics,/anime/{id}/moreinfo,/anime/{id}/recommendations,/anime/{id}/userupdates,/anime/{id}/reviews,/anime/{id}/relations,/anime/{id}/themes,/anime/{id}/external,/anime/{id}/streaming,/anime/{id}/episodes, schedules, watch endpoints, club sub-endpoints, user sub-endpoints, recommendations, reviews, top-reviews, etc.- rows: List[JikanGenericRow]
- pagination: JikanGenericRow | None