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()
average_score = result['average_score']
try:
cover_image_url = result['imageUrl']
cover_image = requests.get(url=cover_image_url, timeout=10).content
async with aiofiles.open('coverImage.jpg', mode='wb') as f:
await f.write(cover_image)
except Exception:
cover_image = None
title = result['title']['english']
trailer = result['trailer']['id']
description = result['description']
episodes = result['episodes']
genres = ', '.join(result['genres'])
is_adult = result['is_adult']
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: {average_score}\nStatus: {status}\nGenres: {genres}\nEpisodes: {episodes}\nIs Adult: {is_adult}\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: {average_score}\nStatus: {status}\nGenres: {genres}\nEpisodes: {episodes}\nIs Adult: {is_adult}\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()
average_score = result['average_score']
try:
cover_image_url = result['imageUrl']
cover_image = requests.get(url=cover_image_url, timeout=10).content
async with aiofiles.open('coverImage.jpg', mode='wb') as f:
await f.write(cover_image)
except Exception:
cover_image = None
title = result['title']['english']
trailer = result['trailer']['id']
description = result['description']
chapters = result['chapters']
genres = ', '.join(result['genres'])
is_adult = result['is_adult']
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: {average_score}\nStatus: {status}\nGenres: {genres}\nChapters: {chapters}\nIs Adult: {is_adult}\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: {average_score}\nStatus: {status}\nGenres: {genres}\nChapters: {chapters}\nIs Adult: {is_adult}\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:
cover_image_url = result['image']['large']
cover_image = requests.get(url=cover_image_url, timeout=10).content
async with aiofiles.open('coverImage.jpg', mode='wb') as f:
await f.write(cover_image)
except Exception:
cover_image = 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',
}