_images/logo.svg

A peaceful and fully typed MAL / Jikan Python API wrapper with caching and proper rate limiting.

Examples ⚗️

Anmoku is probably the simplest Jikan API wrapper you’ll ever use. All you need is a client and a resource. 🌊

from anmoku import Anmoku, AnimeCharacters

client = Anmoku(debug = True)

anime_characters = client.get(AnimeCharacters, id = 28851) # ID for the anime film "A Silent Voice".

for character in anime_characters:
   print(f"{character.name} ({character.url})")

client.close()

We also have an async client:

import asyncio
from anmoku import AsyncAnmoku, AnimeCharacters

async def main():

   client = AsyncAnmoku(debug = True)

   anime_characters = await client.get(AnimeCharacters, id = 28851) # ID for the anime film "A Silent Voice".

   for character in anime_characters:
      print(f"{character.name} ({character.url})")

   await client.close()

asyncio.run(main())

Output:

[DEBUG] (anmoku) - [AsyncAnmoku] GET --> https://api.jikan.moe/v4/anime/28851/characters
Ishida, Shouya (https://myanimelist.net/character/80491/Shouya_Ishida)
Nishimiya, Shouko (https://myanimelist.net/character/80243/Shouko_Nishimiya)
Headteacher (https://myanimelist.net/character/214351/Headteacher)
Hirose, Keisuke (https://myanimelist.net/character/97569/Keisuke_Hirose)
Ishida, Maria (https://myanimelist.net/character/97943/Maria_Ishida)
Ishida, Sister (https://myanimelist.net/character/118723/Sister_Ishida)
# ... more characters below but I cut them off for the convenience of this readme

Searching! 🤩

Here are some searching examples you can try:

from anmoku import Anmoku, Character

client = Anmoku(debug = True)

characters = client.search(Character, "anya forger")

for character in characters:
   print(f"{character.name} ({character.image.url})")

client.close()

Errors

exception anmoku.errors.HTTPError(resp: ErrorResponseDict)[source]

Bases: AnmokuException

message: str
report_url: str | None
status: int
type: str
exception anmoku.errors.NotFoundError(resp: ErrorResponseDict)[source]

Bases: HTTPError

exception anmoku.errors.RatelimitError(resp: ErrorResponseDict)[source]

Bases: HTTPError

exception anmoku.errors.ResourceNotSupportedError(resource: Type[JikanResource], not_supported: str, logger: Logger = None)[source]

Bases: AnmokuException

exception anmoku.errors.ServerError(resp: ErrorResponseDict)[source]

Bases: HTTPError

Indices and tables