/anmoku

🌸 Python's future Jikan API wrapper! With proper rate limiting! [WIP]

Primary LanguagePythonMIT LicenseMIT

🌸 Anmoku 安黙

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

Pypi Version Python Versions Pypi Downloads


Note

Anmoku is currently a work in progress so the features below may not be complete yet or experimental.

Features ✨

  • Rate limiting 🎀 (with actual waiting).
  • Supports caching. ⚡
  • Fully type hinted. 🌌 yes you heard me correctly

Examples ⚗️

Anmoku is probably the simplest Jikan API wrapper you'll ever use. All you need is the client and the 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()

Merge that with gradio and you have a GUI.

import gradio # pip install gradio
from anmoku import Anime, Anmoku, RatelimitError
client = Anmoku(debug = True)
def search_anime(query: str):
anime_list = []
try:
anime_list = client.search(Anime, query)
except RatelimitError as e: # NOTE: This is here because rate limiting hasn't been implemented yet in this version.
raise gradio.Error(e.message)
return [(x.image.get_image(), str(x.name)) for x in anime_list]
demo = gradio.Interface(
search_anime,
inputs = "text",
outputs = gradio.Gallery(height = 600)
)
if __name__ == "__main__":
demo.launch(show_api = False)

gradio_gui.mp4

Type hinting support! 🌌

API responses in our library are strongly typed.

On top of that, we even provide class interfaces if you wish for stability and ease of use.


Python's future Jikan API wrapper.