animedex.backends.kitsu.models
Rich Kitsu dataclasses (one per JSON:API resource type).
Kitsu serves data in the JSON:API shape: every resource is wrapped
as {id, type, attributes, relationships, links} and listings
come back as {data: [...], meta, links}. The high-level
_fetch helper extracts the inner data block, and these
classes model the resources directly.
Per the project’s lossless rich-model contract every class inherits
from BackendRichModel (extra='allow',
populate_by_name=True, frozen=True). Only the fields the
high-level API touches are spelled out as typed attributes; the
JSON:API attributes block carries dozens more fields that
upstream may add or remove between releases, and they round-trip
through model_dump(by_alias=True) via extra='allow'.
The KitsuAnime.to_common() and KitsuManga.to_common()
projections map onto Anime and
Manga so a downstream pipeline that
already speaks the cross-source common shape doesn’t need to know
JSON:API.
KitsuAnimeAttributes
- class animedex.backends.kitsu.models.KitsuAnimeAttributes(*, canonicalTitle: str | None = None, titles: Dict[str, str | None] | None = None, abbreviatedTitles: List[str] | None = None, synopsis: str | None = None, description: str | None = None, averageRating: str | None = None, userCount: int | None = None, favoritesCount: int | None = None, startDate: str | None = None, endDate: str | None = None, ageRating: str | None = None, ageRatingGuide: str | None = None, subtype: str | None = None, status: str | None = None, episodeCount: int | None = None, episodeLength: int | None = None, showType: str | None = None, youtubeVideoId: str | None = None, nsfw: bool | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelThe
attributesblock on an/anime/{id}resource.
KitsuMangaAttributes
- class animedex.backends.kitsu.models.KitsuMangaAttributes(*, canonicalTitle: str | None = None, titles: Dict[str, str | None] | None = None, abbreviatedTitles: List[str] | None = None, synopsis: str | None = None, description: str | None = None, averageRating: str | None = None, userCount: int | None = None, favoritesCount: int | None = None, startDate: str | None = None, endDate: str | None = None, status: str | None = None, chapterCount: int | None = None, volumeCount: int | None = None, mangaType: str | None = None, serialization: str | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelThe
attributesblock on a/manga/{id}resource.
KitsuMappingAttributes
KitsuStreamingLinkAttributes
KitsuCategoryAttributes
KitsuCharacterAttributes
- class animedex.backends.kitsu.models.KitsuCharacterAttributes(*, slug: str | None = None, name: str | None = None, description: str | None = None, malId: Any | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelThe
attributesblock on a/charactersrow.Note that some upstream fields are deprecated and now carry explanatory strings instead of their original values (e.g.
malIdmay be a string"Moved to mappings relationship."rather than an int). They surface asAnyso the lossless contract still validates regardless of upstream’s chosen deprecation marker.
KitsuPersonAttributes
KitsuProducerAttributes
KitsuGenreAttributes
KitsuStreamerAttributes
KitsuFranchiseAttributes
KitsuUserAttributes
- class animedex.backends.kitsu.models.KitsuUserAttributes(*, name: str | None = None, pastNames: List[str] | None = None, slug: str | None = None, about: str | None = None, location: str | None = None, waifuOrHusbando: str | None = None, followersCount: int | None = None, followingCount: int | None = None, lifeSpentOnAnime: int | None = None, birthday: str | None = None, gender: str | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelThe
attributesblock on a/usersrow (public read).
KitsuAnime
- class animedex.backends.kitsu.models.KitsuAnime(*, id: str, type: str = 'anime', attributes: KitsuAnimeAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API anime resource from
/anime/{id}or/anime?filter[text]=....- Variables:
id (str) – Kitsu numeric ID (as a string per JSON:API convention).
type (str) – JSON:API type tag — always
"anime".attributes (KitsuAnimeAttributes or None) – Typed anime attributes.
relationships (dict or None) – JSON:API relationships block (link descriptors for
genres/categories/streamingLinks/mappings/ etc.).links (dict or None) – JSON:API links block.
source_tag (SourceTag or None) – Provenance tag.
- attributes: KitsuAnimeAttributes | None
KitsuManga
- class animedex.backends.kitsu.models.KitsuManga(*, id: str, type: str = 'manga', attributes: KitsuMangaAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API manga resource from
/manga/{id}or/manga?filter[text]=....- attributes: KitsuMangaAttributes | None
- to_common() Manga[source]
Project this resource onto the cross-source
Mangashape.Note that the common
Mangamodelschaptersas a list ofChapterrecords (not a count); Kitsu’s/manga/{id}only carries the count, so the projection setschapters=[]. Use the rich shape’sattributes.chapterCountfor the integer.- Returns:
Cross-source projection.
- Return type:
KitsuMapping
- class animedex.backends.kitsu.models.KitsuMapping(*, id: str, type: str = 'mappings', attributes: KitsuMappingAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API mapping resource from
/anime/{id}/mappings.Each mapping row carries an
externalSite+externalIdpair, identifying the anime on a peer upstream (e.g.externalSite='myanimelist/anime',externalId='52991').- attributes: KitsuMappingAttributes | None
KitsuStreamingLink
- class animedex.backends.kitsu.models.KitsuStreamingLink(*, id: str, type: str = 'streamingLinks', attributes: KitsuStreamingLinkAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API streaming-link resource from
/anime/{id}/streaming-links.The
urlattribute points at the streaming destination (Crunchyroll / Funimation / Hulu / etc.);subs/dubslist the available language tracks.- attributes: KitsuStreamingLinkAttributes | None
- to_common() AnimeStreamingLink[source]
Project this resource onto the cross-source
AnimeStreamingLinkshape.The cross-source common shape has only
providerandurl; the rich shape preservessubs/dubsfor callers that want them.
KitsuCategory
- class animedex.backends.kitsu.models.KitsuCategory(*, id: str, type: str = 'categories', attributes: KitsuCategoryAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API category resource from
/categories.- attributes: KitsuCategoryAttributes | None
KitsuCharacter
- class animedex.backends.kitsu.models.KitsuCharacter(*, id: str, type: str = 'characters', attributes: KitsuCharacterAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API character resource from
/characters/{id}and/characters?filter[name]=....- attributes: KitsuCharacterAttributes | None
KitsuPerson
- class animedex.backends.kitsu.models.KitsuPerson(*, id: str, type: str = 'people', attributes: KitsuPersonAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API person resource from
/people/{id}and/people?filter[name]=....- attributes: KitsuPersonAttributes | None
KitsuProducer
- class animedex.backends.kitsu.models.KitsuProducer(*, id: str, type: str = 'producers', attributes: KitsuProducerAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API producer resource from
/producers.- attributes: KitsuProducerAttributes | None
KitsuGenre
- class animedex.backends.kitsu.models.KitsuGenre(*, id: str, type: str = 'genres', attributes: KitsuGenreAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API genre resource from
/genres.- attributes: KitsuGenreAttributes | None
KitsuStreamer
- class animedex.backends.kitsu.models.KitsuStreamer(*, id: str, type: str = 'streamers', attributes: KitsuStreamerAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API streamer resource from
/streamers.- attributes: KitsuStreamerAttributes | None
KitsuFranchise
- class animedex.backends.kitsu.models.KitsuFranchise(*, id: str, type: str = 'franchises', attributes: KitsuFranchiseAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API franchise resource from
/franchises.- attributes: KitsuFranchiseAttributes | None
KitsuUser
- class animedex.backends.kitsu.models.KitsuUser(*, id: str, type: str = 'users', attributes: KitsuUserAttributes | None = None, relationships: Dict[str, Any] | None = None, links: Dict[str, Any] | None = None, source_tag: SourceTag | None = None, **extra_data: Any)[source]
Bases:
BackendRichModelJSON:API user resource from
/users/{id}(public read).- attributes: KitsuUserAttributes | None