# 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")