# meta pic: https://static.whypodg.me/mods!animetools.png
# meta banner: https://mods.whypodg.me/badges/animetools.jpg
# meta developer: @idiotcoders
# scope: hikka_only
# scope: hikka_min 1.2.10
from deep_translator import GoogleTranslator
from typing import Optional
import mimetypes
import os
import requests
from io import BytesIO
from telethon.tl.types import Message
from .. import loader, utils
@loader.tds
class animetoolsMod(loader.Module):
"""AnimeTools"""
strings = {
"name": "AnimeTools",
"no_results": "❌ No results found!",
"character": "\n👤 Character: {}",
"quote": "\n💬 Quote: {}",
"anime": "\n🍿 Anime: {}",
"enter_name": "❗ You must specify a character name!",
"description": "\nℹ️ Description: {}",
"genres": "\n🎭 Genres: {}",
"reply": "❌ You must reply to a some media or add it on your message!",
"loading": "⏳ Loading...",
"findanime": "ℹ️ Anime: {}\n🤨 Similar to: {}%\n🍿 Episode: {}",
"error": "❎ An error has occurred, please try again",
"no_desc": "❌ No description!",
"no_photo": "❎ Need a picture"
}
strings_ru = {
"name": "AnimeTools",
"no_results": "❌ Результатов не найдено!",
"character": "\n👤 Персонаж: {}",
"quote": "\n💬 Цитата: {}",
"anime": "\n🍿 Аниме: {}",
"description": "\nℹ️ Описание: {}",
"genres": "\n🎭 Жанры: {}",
"enter_name": "❗ Вы должны указать имя персонажа!",
"loading": "⏳ Загрузка ...",
"error": "❎ Произошла ошибка, попробуйте снова",
"reply": "❌ Нужно ответить на фото/видео или прикрепить его!",
"findanime": "ℹ️ Аниме: {}\n🤨 Похоже на: {}%\n🍿 Эпизод: {}",
"_cmd_doc_findanime": "Ищет по картинке что за аниме",
"_cmd_doc_animequote": "Отправляет аниме цитатки",
"_cmd_doc_animechar": "Отправляет аниме цитатки определенного персонажа",
"_cmd_doc_animeavailable": "Отправляет список всех доступных аниме на данный момент",
"_cmd_doc_randomanime": "Отправляет случайное аниме",
"_cmd_doc_characteravailable": "Отправляет список всех доступных персонажей на данный момент",
"no_desc": "❌ Без описания!"
}
@loader.command(alias="fa")
async def findanimecmd(self, message):
"""Search by picture for what anime"""
loading = await utils.answer(message, self.strings["loading"])
reply_msg = await message.get_reply_message()
msg = reply_msg or message
media = msg.media
if media:
if msg.photo:
filename = "photo.png"
elif msg.video:
filename = "video.mp4"
elif msg.gif:
filename = "gif.gif"
else:
filename = "photo.png"
filename = await self.client.download_media(media, file=filename)
typem, encoding = mimetypes.guess_type(filename)
r = requests.post(
"https://api.trace.moe/search",
data=open(filename, "rb"),
headers={"Content-Type": typem}
).json()
res = r['result'][0]
episode = res['episode']
video = res['video']
name = res['filename'].split('.')[0]
simil = res['similarity']
await loading.delete()
await utils.answer_file(
message,
file=video,
caption=self.strings["findanime"].format(name, simil*100, episode)
)
os.remove(filename)
else:
await utils.answer(message, self.strings['reply'])
@loader.command(alias="aq")
async def animequotecmd(self, message: Message):
"""Sends anime quotes"""
args = utils.get_args_raw(message)
link = "https://animechan.vercel.app/api/random"
if args:
link += "/anime?title={args}"
qdata = (await utils.run_sync(requests.get, link)).json()
try:
qdata["quote"] = GoogleTranslator(source="auto", target="ru").translate(qdata["quote"])
except KeyError:
qdata = {"quote": "no_results", "character": "no_results", "anime": "no_results"}
quote, chr, anime = qdata["quote"], qdata["character"], qdata["anime"]
if not qdata.get("quote") or "no_results" in [qdata.get("quote"), qdata.get("character"), qdata.get("anime")]:
await utils.answer(message, self.strings["no_results"])
return
quote = (
self.strings['quote'].format(quote) +
self.strings['character'].format(chr) +
self.strings['anime'].format(anime)
)
await utils.answer(message, quote)
@loader.command(alias="ac")
async def animechar(self, message):
"""Sends anime quotes for specific character"""
character_name = utils.get_args_raw(message)
if not character_name:
await utils.answer(message, self.strings['enter_name'])
return
link = f"https://animechan.vercel.app/api/random/character?name={character_name}"
qdata = (await utils.run_sync(requests.get, link)).json()
try:
qdata["quote"] = GoogleTranslator(source="auto", target="ru").translate(qdata["quote"])
except KeyError:
qdata = {"quote": "no_results", "character": "no_results", "anime": "no_results"}
quote, chr, anime = qdata["quote"], qdata["character"], qdata["anime"]
if not qdata.get("quote") or "no_results" in [qdata.get("quote"), qdata.get("character"), qdata.get("anime")]:
await utils.answer(message, self.strings["no_results"])
return
quote = (
self.strings['quote'].format(quote) +
self.strings['character'].format(chr) +
self.strings['anime'].format(anime)
)
await utils.answer(message, quote)
@loader.command(alias="aa")
async def animeavailable(self, message: Message):
"""Sends a list of available anime"""
args = utils.get_args_raw(message)
link = "https://animechan.vercel.app/api/available/anime"
response = await utils.run_sync(requests.get, link)
available_anime = response.json()
if args:
matching_anime = [anime for anime in available_anime if args.lower() in anime.lower()]
if matching_anime:
anime_message = "\n".join(matching_anime)
else:
await utils.answer(message, self.strings["no_results"])
return
else:
anime_message = "\n".join(available_anime)
await utils.answer(message, anime_message)
@loader.command(alias="ca")
async def characteravailable(self, message: Message):
"""Sends a list of available characters"""
args = utils.get_args_raw(message)
link = "https://animechan.vercel.app/api/available/character"
response = await utils.run_sync(requests.get, link)
available_anime = response.json()
if args:
matching_anime = [anime for anime in available_anime if args.lower() in anime.lower()]
if matching_anime:
anime_message = "\n".join(matching_anime)
else:
await utils.answer(message, self.strings["no_results"])
return
else:
anime_message = "\n".join(available_anime)
await utils.answer(message, anime_message)
@loader.command(alias="ra")
async def randomanime(self, message: Message):
"""Sends a random anime"""
a = await utils.answer(message, self.strings["loading"])
try:
link = "https://anime777.ru/api/rand"
adata = (await utils.run_sync(requests.get, link)).json()
anime_kind = adata["material_data"]["anime_kind"]
if anime_kind == "ova":
return await self.randomanime(message)
title = adata["title"]
genres = ", ".join(adata["material_data"]["anime_genres"])
description = adata["material_data"]["description"]
screenshots = adata["material_data"]["screenshots"]
anime_message = (
self.strings['anime'].format(title) +
self.strings['genres'].format(genres) +
self.strings['description'].format(description)
)
await a.delete()
await utils.answer_file(message, screenshots[0], anime_message)
except:
await utils.answer(message, "error")