def is_gif(file): # ngl this should be fixed, telethon.utils.is_gif but working # lazy to go to github and make an issue kek if not is_video(file): return False return DocumentAttributeAnimated() in getattr(file, "document", file).attributes
class File: is_video: Filter = Filter(lambda event: is_video(event.media)) is_image: Filter = Filter(lambda event: is_image(event.media)) is_gif: Filter = Filter(lambda event: is_gif(event.document)) is_audio: Filter = Filter(lambda event: is_audio(event.media)) # generated by extensions # Image extensions png: Filter = _FilterVar() jpeg: Filter = _FilterVar() webp: Filter = _FilterVar() gif: Filter = _FilterVar() bmp: Filter = _FilterVar() tga: Filter = _FilterVar() tiff: Filter = _FilterVar() psd: Filter = _FilterVar() # Video extensions mp4: Filter = _FilterVar() mov: Filter = _FilterVar() avi: Filter = _FilterVar() # Audio extensions mp2: Filter = _FilterVar() # a.k.a. ISO/IEC 13818-2 mp3: Filter = _FilterVar() m4a: Filter = _FilterVar() aac: Filter = _FilterVar() ogg: Filter = _FilterVar() flac: Filter = _FilterVar() # Win executable extension exe: Filter = _FilterVar()
async def areverse(e): media = e.media if not media: r = await e.get_reply_message() media = getattr(r, 'media', None) if not media: await e.edit('err \\\nMedia required') return ig = is_gif(media) or is_video(media) if not is_image(media) and not ig: await e.edit('err \\\nMedia must be an image or gif or video') return filename = 'file.jpg' if not ig and isinstance(media, MessageMediaDocument): attribs = media.document.attributes for i in attribs: if isinstance(i, DocumentAttributeFilename): filename = i.file_name break await e.edit('`Downloading image...`') content = await e.client.download_media(media, bytes, thumb=-1 if ig else None) await e.edit('`Searching for result...`') file = memory_file(filename, content) async with aiohttp.ClientSession() as session: url = 'https://trace.moe/api/search' async with session.post(url, data={'image': file}) as raw_resp0: resp0 = await raw_resp0.text() js0 = json.loads(resp0)['docs'] if not js0: await e.edit('err \\\nNo results found') return js0 = js0[0] text = f'<b>{html.escape(js0["title_romaji"])}' if js0['title_native']: text += f' ({html.escape(js0["title_native"])})' text += '</b>\n' if js0['episode']: text += f'<b>Episode:</b> {html.escape(str(js0["episode"]))}\n' percent = round(js0['similarity'] * 100, 2) text += f'<b>Similarity:</b> {percent}%\n' dt = pendulum.from_timestamp(js0['at']) text += f'<b>At:</b> {html.escape(dt.to_time_string())}' await e.edit(text, parse_mode='html') dt0 = pendulum.from_timestamp(js0['from']) dt1 = pendulum.from_timestamp(js0['to']) ctext = f'{html.escape(dt0.to_time_string())} - {html.escape(dt1.to_time_string())}' url = ('https://trace.moe/preview.php' f'?anilist_id={urlencode(str(js0["anilist_id"]))}' f'&file={urlencode(js0["filename"])}' f'&t={urlencode(str(js0["at"]))}' f'&token={urlencode(js0["tokenthumb"])}') async with session.get(url) as raw_resp1: file = memory_file('preview.mp4', await raw_resp1.read()) try: await e.reply(ctext, file=file, parse_mode='html') except FilePartsInvalidError: await e.reply('`Cannot send preview :/`')
async def whatanime(e): media = e.media if not media: r = await e.get_reply_message() media = getattr(r, "media", None) if not media: await edit_delete(e, "`Media required`") return ig = is_gif(media) or is_video(media) if not is_image(media) and not ig: await edit_delete(e, "`Media must be an image or gif or video`") return filename = "file.jpg" if not ig and isinstance(media, MessageMediaDocument): attribs = media.document.attributes for i in attribs: if isinstance(i, DocumentAttributeFilename): filename = i.file_name break xx = await edit_or_reply(e, "`Downloading image..`") content = await e.client.download_media(media, bytes, thumb=-1 if ig else None) await xx.edit("`Searching for result..`") file = memory_file(filename, content) async with aiohttp.ClientSession() as session: url = "https://api.trace.moe/search?anilistInfo" async with session.post(url, data={"image": file}) as raw_resp0: resp0 = await raw_resp0.json() js0 = resp0.get("result") if not js0: await xx.edit("`No results found.`") return js0 = js0[0] text = f'<b>{html.escape(js0["anilist"]["title"]["romaji"])}' if js0["anilist"]["title"]["native"]: text += f' ({html.escape(js0["anilist"]["title"]["native"])})' text += "</b>\n" if js0["episode"]: text += f'<b>Episode:</b> {html.escape(str(js0["episode"]))}\n' percent = round(js0["similarity"] * 100, 2) text += f"<b>Similarity:</b> {percent}%\n" at = re.findall(r"t=(.+)&", js0["video"])[0] dt = pendulum.from_timestamp(float(at)) text += f"<b>At:</b> {html.escape(dt.to_time_string())}" await e.edit(text, parse_mode="html") dt0 = pendulum.from_timestamp(js0["from"]) dt1 = pendulum.from_timestamp(js0["to"]) ctext = ( f"{html.escape(dt0.to_time_string())} - {html.escape(dt1.to_time_string())}" ) async with session.get(js0["video"]) as raw_resp1: file = memory_file("preview.mp4", await raw_resp1.read()) try: await xx.edit(ctext, file=file, parse_mode="html") except FilePartsInvalidError: await xx.edit("`Cannot send preview.`")
class File: """ Namespace for file extension filters. Usage: >>> from garnet.filters import File ... >>> @router.message(File.is_video & (File.mp4 | File.mov)) ... async def handle_video(event): pass >>> >>> @router.message(File.is_audio) ... async def handle_audio(): pass """ is_video: FE = Filter(lambda event: is_video(event.media)) is_image: FE = Filter(lambda event: is_image(event.media)) is_gif: FE = Filter(lambda event: is_gif(event.document)) is_audio: FE = Filter(lambda event: is_audio(event.media)) # generated by extensions # Image extensions png: FE = _FilterVar() jpeg: FE = _FilterVar() webp: FE = _FilterVar() gif: FE = _FilterVar() bmp: FE = _FilterVar() tga: FE = _FilterVar() tiff: FE = _FilterVar() psd: FE = _FilterVar() # Video extensions mp4: FE = _FilterVar() mov: FE = _FilterVar() avi: FE = _FilterVar() # Audio extensions mp2: FE = _FilterVar() # a.k.a. ISO/IEC 13818-2 mp3: FE = _FilterVar() m4a: FE = _FilterVar() aac: FE = _FilterVar() ogg: FE = _FilterVar() flac: FE = _FilterVar() # Win executable extension exe: FE = _FilterVar()
async def whatnime(e): media = e.media if not media: r = await e.get_reply_message() media = getattr(r, "media", None) if not media: await e.edit("`Media required`") return ig = is_gif(media) or is_video(media) if not is_image(media) and not ig: await e.edit("`Media must be an image or gif or video`") return filename = "file.jpg" if not ig and isinstance(media, MessageMediaDocument): attribs = media.document.attributes for i in attribs: if isinstance(i, DocumentAttributeFilename): filename = i.file_name break await e.edit("`Mencari Judul Anime...`") content = await e.client.download_media(media, bytes, thumb=-1 if ig else None) await e.edit("`Mencari Hasil..`") file = memory_file(filename, content) async with aiohttp.ClientSession() as session: url = "https://trace.moe/api/search" async with session.post(url, data={"image": file}) as raw_resp0: resp0 = await raw_resp0.text() js0 = json.loads(resp0)["docs"] if not js0: await e.edit("`No results found.`") return js0 = js0[0] text = f'<b>{html.escape(js0["title_romaji"])}' if js0["title_native"]: text += f' ({html.escape(js0["title_native"])})' text += "</b>\n" if js0["episode"]: text += f'<b>Episode:</b> {html.escape(str(js0["episode"]))}\n' percent = round(js0["similarity"] * 100, 2) text += f"<b>Similarity:</b> {percent}%\n" dt = pendulum.from_timestamp(js0["at"]) text += f"<b>At:</b> {html.escape(dt.to_time_string())}" await e.edit(text, parse_mode="html") dt0 = pendulum.from_timestamp(js0["from"]) dt1 = pendulum.from_timestamp(js0["to"]) ctext = ( f"{html.escape(dt0.to_time_string())} - {html.escape(dt1.to_time_string())}" ) url = ("https://trace.moe/preview.php" f'?anilist_id={urlencode(str(js0["anilist_id"]))}' f'&file={urlencode(js0["filename"])}' f'&t={urlencode(str(js0["at"]))}' f'&token={urlencode(js0["tokenthumb"])}') async with session.get(url) as raw_resp1: file = memory_file("preview.mp4", await raw_resp1.read()) try: await e.reply(ctext, file=file, parse_mode="html") except FilePartsInvalidError: await e.reply("`Cannot send preview.`")
async def whatanime(e): media = e.media if not media: r = await e.get_reply_message() media = getattr(r, "media", None) if not media: await e.edit("`Mídia necessária`") return ig = is_gif(media) or is_video(media) if not is_image(media) and not ig: await e.edit("`A mídia deve ser uma imagem ou gif ou vídeo`") return filename = "file.jpg" if not ig and isinstance(media, MessageMediaDocument): attribs = media.document.attributes for i in attribs: if isinstance(i, DocumentAttributeFilename): filename = i.file_name break await e.edit("`Baixando imagem..`") content = await e.client.download_media(media, bytes, thumb=-1 if ig else None) await e.edit("`Procurando resultados..`") file = memory_file(filename, content) async with aiohttp.ClientSession() as session: url = "https://trace.moe/api/search" async with session.post(url, data={"image": file}) as raw_resp0: resp0 = await raw_resp0.text() js0 = json.loads(resp0)["docs"] if not js0: await e.edit("`Nenhum resultado encontrado.`") return js0 = js0[0] text = f'<b>{html.escape(js0["title_romaji"])}' if js0["title_native"]: text += f' ({html.escape(js0["title_native"])})' text += "</b>\n" if js0["episode"]: text += f'<b>Episódio:</b> {html.escape(str(js0["episode"]))}\n' percent = round(js0["similarity"] * 100, 2) text += f"<b>Semelhança:</b> {percent}%\n" dt = pendulum.from_timestamp(js0["at"]) text += f"<b>Em:</b> {html.escape(dt.to_time_string())}" await e.edit(text, parse_mode="html") dt0 = pendulum.from_timestamp(js0["from"]) dt1 = pendulum.from_timestamp(js0["to"]) ctext = ( f"{html.escape(dt0.to_time_string())} - {html.escape(dt1.to_time_string())}" ) url = ("https://media.trace.moe/video/" f'{urlencode(str(js0["anilist_id"]))}' + "/" f'{urlencode(js0["filename"])}' f'?t={urlencode(str(js0["at"]))}' f'&token={urlencode(js0["tokenthumb"])}') async with session.get(url) as raw_resp1: file = memory_file("preview.mp4", await raw_resp1.read()) try: await e.reply(ctext, file=file, parse_mode="html") except FilePartsInvalidError: await e.reply("`Não foi possível enviar visualização.`")
async def whatanime(e): media = e.media if not media: r = await e.get_reply_message() media = getattr(r, "media", None) if not media: await e.edit("`Dibutuhkan media`") return ig = is_gif(media) or is_video(media) if not is_image(media) and not ig: await e.edit("`Media harus berupa gambar, gif atau video`") return filename = "file.jpg" if not ig and isinstance(media, MessageMediaDocument): attribs = media.document.attributes for i in attribs: if isinstance(i, DocumentAttributeFilename): filename = i.file_name break await e.edit("`Mengunduh gambar...`") content = await e.client.download_media(media, bytes, thumb=-1 if ig else None) await e.edit("`Mencari hasil...`") file = memory_file(filename, content) async with aiohttp.ClientSession() as session: url = "https://trace.moe/api/search" async with session.post(url, data={"image": file}) as raw_resp0: resp0 = await raw_resp0.text() js0 = json.loads(resp0)["docs"] if not js0: await e.edit("`Tidak ada hasil yang ditemukan.`") return js0 = js0[0] text = f'<b>{html.escape(js0["title_romaji"])}' if js0["title_native"]: text += f' ({html.escape(js0["title_native"])})' text += "</b>\n" if js0["episode"]: text += f'<b>Episode :</b> {html.escape(str(js0["episode"]))}\n' percent = round(js0["similarity"] * 100, 2) text += f"<b>Kesamaan :</b> {percent}%\n" dt = pendulum.from_timestamp(js0["at"]) text += f"<b>Di :</b> {html.escape(dt.to_time_string())}" await e.edit(text, parse_mode="html") dt0 = pendulum.from_timestamp(js0["from"]) dt1 = pendulum.from_timestamp(js0["to"]) ctext = ( f"{html.escape(dt0.to_time_string())} - {html.escape(dt1.to_time_string())}" ) url = ("https://media.trace.moe/video/" f'{urlencode(str(js0["anilist_id"]))}' + "/" f'{urlencode(js0["filename"])}' f'?t={urlencode(str(js0["at"]))}' f'&token={urlencode(js0["tokenthumb"])}') async with session.get(url) as raw_resp1: file = memory_file("preview.mp4", await raw_resp1.read()) try: await e.reply(ctext, file=file, parse_mode="html") except FilePartsInvalidError: await e.reply("`Tidak dapat mengirim pratinjau.`")