Spaces:
Running
Running
# This file is part of the AutoAnime distribution. | |
# Copyright (c) 2025 Kaif_00z | |
# | |
# This program is free software: you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation, version 3. | |
# | |
# This program is distributed in the hope that it will be useful, but | |
# WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
# General Public License for more details. | |
# | |
# License can be found in < | |
# https://github.com/kaif-00z/AutoAnimeBot/blob/main/LICENSE > . | |
# if you are using this following code then don't forgot to give proper | |
# credit to t.me/kAiF_00z (github.com/kaif-00z) | |
import aiohttp | |
from AnilistPython import Anilist | |
class RawAnimeInfo: | |
def __init__(self): | |
self.anilist = Anilist() | |
async def search(self, query: str): | |
raw_data = ((await self.searcher(query)) or {}).get("data") or {} | |
try: | |
_raw_data = await self.search_anilist(raw_data.get("id")) | |
except BaseException: | |
_raw_data = {} | |
if not raw_data: | |
data = {} # self.alt_anilist(query) | |
return data | |
data = {} | |
data["anime_id"] = raw_data.get("id") | |
data["english_title"] = raw_data.get("attributes", {}).get("titles", {}).get( | |
"en" | |
) or raw_data.get("attributes", {}).get("titles", {}).get("en_jp") | |
data["japanese_title"] = ( | |
raw_data.get("attributes", {}).get("titles", {}).get("ja_jp") | |
) | |
data["description"] = raw_data.get("attributes", {}).get("description") | |
data["total_eps"] = raw_data.get("attributes", {}).get("episodeCount") or "N/A" | |
data["poster_img"] = ( | |
raw_data.get("attributes", {}).get("posterImage", {}).get("original") | |
) | |
# anilist score will be better i guess | |
# data["score"] = raw_data.get("attributes", {}).get("averageRating") or "N/A" | |
data["type"] = raw_data.get("attributes", {}).get("showType") or "TV" | |
data["runtime"] = raw_data.get("attributes", {}).get("episodeLength") or 24 | |
return {**(data if data else {}), **(_raw_data if _raw_data else {})} | |
async def searcher( | |
self, | |
query: str, | |
): | |
async with aiohttp.ClientSession() as client: | |
try: | |
data = await client.get( | |
f"https://kitsu.io/api/edge/anime?filter%5Btext%5D={query.replace(' ', '%20')}" | |
) | |
links = (await data.json())["data"] | |
for index in range(len(links)): | |
res_data = await self.re_searcher(links[index]["links"]["self"]) | |
if res_data["data"]["attributes"]["status"] == "tba": | |
continue | |
if "current" != res_data["data"]["attributes"]["status"]: | |
if ( | |
res_data["data"]["attributes"]["endDate"] | |
or res_data["data"]["attributes"]["startDate"] | |
): | |
if "2025" not in ( | |
res_data["data"]["attributes"]["endDate"] or "" | |
): | |
if all( | |
year | |
not in ( | |
res_data["data"]["attributes"]["startDate"] | |
or "" | |
) | |
for year in ["2024", "2025"] | |
): | |
continue | |
return res_data | |
except BaseException: | |
raise ValueError("Kitsu: Search Link Not Found") | |
async def re_searcher(self, link: str): | |
if not link: | |
raise ValueError("Kitsu: Link Not Found") | |
async with aiohttp.ClientSession() as client: | |
try: | |
data = await client.get(link) | |
return await data.json() | |
except BaseException: | |
raise ValueError("Kitsu: Link Not Found") | |
async def search_anilist(self, kitsu_id): | |
if not kitsu_id: | |
raise ValueError("Kitsu: ID Not Found") | |
async with aiohttp.ClientSession() as client: | |
try: | |
_data = {} | |
res = await client.get( | |
f"https://kitsu.io/api/edge/anime/{kitsu_id}/mappings" | |
) | |
data = (await res.json())["data"] | |
for maps in data: | |
if ( | |
maps.get("attributes", {}).get("externalSite") | |
== "anilist/anime" | |
): | |
_data["anilist_id"] = maps.get("attributes", {}).get( | |
"externalId" | |
) | |
_data["anilist_poster"] = ( | |
f"https://img.anili.st/media/{_data['anilist_id']}" | |
) | |
__data = self.anilist_result(_data["anilist_id"]) | |
return {**_data, **__data} | |
except BaseException: | |
raise ValueError("Kitsu: Mapping Failed") | |
def anilist_result(self, anilist_id): | |
try: | |
data = self.anilist.get_anime_with_id(anilist_id) | |
return { | |
"genres": data.get("genres"), | |
"next_airing_ep": data.get("next_airing_ep"), | |
"season": data.get("season"), | |
"starting_time": data.get("starting_time"), | |
"ending_time": data.get("ending_time"), | |
"score": data.get("average_score") or "N/A", | |
} | |
except BaseException: | |
return {} | |
def alt_anilist(self, anime_name): | |
data = self.anilist.get_anime(anime_name) | |
_id = self.anilist.get_anime_id(anime_name) | |
return { | |
"anilist_id": _id, | |
"genres": data.get("genres"), | |
"next_airing_ep": data.get("next_airing_ep") or {}, | |
"season": data.get("season"), | |
"starting_time": data.get("starting_time"), | |
"ending_time": data.get("ending_time"), | |
"score": data.get("average_score") or "N/A", | |
"english_title": data.get("name_english"), | |
"japanese_title": data.get("name_romaji"), | |
"description": data.get("desc"), | |
"total_eps": data.get("airing_episodes") or "N/A", | |
"poster_img": data.get("banner_image"), | |
"type": data.get("airing_format") or "TV", | |
"runtime": 24, | |
"anilist_poster": f"https://img.anili.st/media/{_id}", | |
} | |