import os import aiofiles import requests from pyrogram import Client, enums, filters from pyrogram.errors import MediaCaptionTooLong from pyrogram.types import InputMediaPhoto, Message from utils.misc import modules_help, prefix from utils.scripts import format_exc url = 'https://api.safone.co' headers = { 'Accept-Language': 'en-US,en;q=0.9', 'Connection': 'keep-alive', 'DNT': '1', 'Referer': 'https://api.safone.co/docs', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', 'accept': 'application/json', 'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Linux"', } @Client.on_message(filters.command('anime_search', prefix) & filters.me) async def anime_search(client: Client, message: Message): try: chat_id = message.chat.id await message.edit_text('Processing...') if len(message.command) > 1: query = message.text.split(maxsplit=1)[1] else: message.edit_text("What should i search? You didn't provided me with any value to search") response = requests.get(url=f'{url}/anime/search?query={query}', headers=headers, timeout=5) if response.status_code != 200: await message.edit_text('Something went wrong') return result = response.json() averageScore = result['averageScore'] try: coverImage_url = result['imageUrl'] coverImage = requests.get(url=coverImage_url, timeout=10).content async with aiofiles.open('coverImage.jpg', mode='wb') as f: await f.write(coverImage) except Exception: coverImage = None title = result['title']['english'] trailer = result['trailer']['id'] description = result['description'] episodes = result['episodes'] genres = ', '.join(result['genres']) isAdult = result['isAdult'] status = result['status'] studios = ', '.join(result['studios']) await message.delete() await client.send_media_group( chat_id, [ InputMediaPhoto( 'coverImage.jpg', caption=f"Title: {title}\nAverage Score: {averageScore}\nStatus: {status}\nGenres: {genres}\nEpisodes: {episodes}\nIs Adult: {isAdult}\nStudios: {studios}\nDescription: {description}\nTrailer: Click Here", ) ], ) except MediaCaptionTooLong: description = description[:850] await message.delete() await client.send_media_group( chat_id, [ InputMediaPhoto( 'coverImage.jpg', caption=f"Title: {title}\nAverage Score: {averageScore}\nStatus: {status}\nGenres: {genres}\nEpisodes: {episodes}\nIs Adult: {isAdult}\nStudios: {studios}\nDescription: {description}\nTrailer: Click Here", ) ], ) except Exception as e: await message.edit_text(format_exc(e)) finally: if os.path.exists('coverImage.jpg'): os.remove('coverImage.jpg') @Client.on_message(filters.command('manga_search', prefix) & filters.me) async def manga_search(client: Client, message: Message): try: chat_id = message.chat.id await message.edit_text('Processing...') if len(message.command) > 1: query = message.text.split(maxsplit=1)[1] else: message.edit_text("What should i search? You didn't provided me with any value to search") response = requests.get(url=f'{url}/anime/manga?query={query}', headers=headers, timeout=5) if response.status_code != 200: await message.edit_text('Something went wrong') return result = response.json() averageScore = result['averageScore'] try: coverImage_url = result['imageUrl'] coverImage = requests.get(url=coverImage_url, timeout=10).content async with aiofiles.open('coverImage.jpg', mode='wb') as f: await f.write(coverImage) except Exception: coverImage = None title = result['title']['english'] trailer = result['trailer']['id'] description = result['description'] chapters = result['chapters'] genres = ', '.join(result['genres']) isAdult = result['isAdult'] status = result['status'] studios = ', '.join(result['studios']) await message.delete() await client.send_media_group( chat_id, [ InputMediaPhoto( 'coverImage.jpg', caption=f"Title: {title}\nAverage Score: {averageScore}\nStatus: {status}\nGenres: {genres}\nChapters: {chapters}\nIs Adult: {isAdult}\nStudios: {studios}\nDescription: {description}\nTrailer: Click Here", ) ], ) except MediaCaptionTooLong: description = description[:850] await message.delete() await client.send_media_group( chat_id, [ InputMediaPhoto( 'coverImage.jpg', caption=f"Title: {title}\nAverage Score: {averageScore}\nStatus: {status}\nGenres: {genres}\nChapters: {chapters}\nIs Adult: {isAdult}\nStudios: {studios}\nDescription: {description}\nTrailer: Click Here", ) ], ) except Exception as e: await message.edit_text(format_exc(e)) finally: if os.path.exists('coverImage.jpg'): os.remove('coverImage.jpg') @Client.on_message(filters.command('character', prefix) & filters.me) async def character(client: Client, message: Message): try: chat_id = message.chat.id await message.edit_text('Processing...') if len(message.command) > 1: query = message.text.split(maxsplit=1)[1] else: message.edit_text("What should i search? You didn't provided me with any value to search") response = requests.get(url=f'{url}/anime/character?query={query}', headers=headers, timeout=5) if response.status_code != 200: await message.edit_text('Something went wrong') return result = response.json() try: coverImage_url = result['image']['large'] coverImage = requests.get(url=coverImage_url, timeout=10).content async with aiofiles.open('coverImage.jpg', mode='wb') as f: await f.write(coverImage) except Exception: coverImage = None age = result['age'] description = result['description'] height = result['height'] name = result['name']['full'] native_name = result['name']['native'] read_more = result['siteUrl'] await message.delete() await client.send_media_group( chat_id, [ InputMediaPhoto( 'coverImage.jpg', caption=f'**Name:** `{name}`\n**Native Name:** `{native_name}`\n**Age:** `{age}`\n**Height:** {height}\n**Description:** `{description}`[read more...]({read_more})', parse_mode=enums.ParseMode.MARKDOWN, ) ], ) except MediaCaptionTooLong: description = description[:850] await message.delete() await client.send_media_group( chat_id, [ InputMediaPhoto( 'coverImage.jpg', caption=f'**Name:** `{name}`\n**Native Name:** `{native_name}`\n**Age:** `{age}`\n**Height:** {height}\n**Description:** `{description}`[read more...]({read_more})', parse_mode=enums.ParseMode.MARKDOWN, ) ], ) except Exception as e: await message.edit_text(format_exc(e)) finally: if os.path.exists('coverImage.jpg'): os.remove('coverImage.jpg') modules_help['anilist'] = { 'anime_search': 'Search for anime on Anilist', 'manga_search': 'Search for manga on Anilist', 'character': 'Search for character on Anilist', }