""" PagerMaid module for adding captions to image. """ from os import remove from magic import Magic from pygments import highlight as syntax_highlight from pygments.formatters import img from pygments.lexers import guess_lexer from telethon.errors import PhotoInvalidDimensionsError from pagermaid import log, module_dir, silent from pagermaid.listener import listener from pagermaid.utils import execute, upload_attachment, lang, alias_command @listener(is_plugin=False, outgoing=True, command=alias_command("convert"), description=lang('convert_des')) async def convert(context): """ Converts image to png. """ reply = await context.get_reply_message() if not silent: await context.edit(lang('convert_process')) target_file_path = await context.download_media() reply_id = context.reply_to_msg_id if reply: target_file_path = await context.client.download_media( await context.get_reply_message() ) if target_file_path is None: await context.edit(lang('convert_no_file')) return try: result = await execute(f"{module_dir}/assets/caption.sh \"" + target_file_path + "\" result.png" + " \"" + str("") + "\" " + "\"" + str("") + "\"") except TypeError: await context.edit(lang('convert_error')) return if not result: await handle_failure(context, target_file_path, 'convert_error') return try: if not await upload_attachment("result.png", context.chat_id, reply_id): await context.edit(lang('convert_error')) remove(target_file_path) return except PhotoInvalidDimensionsError: await handle_failure(context, target_file_path, 'convert_invalid') return await context.delete() remove(target_file_path) remove("result.png") @listener(is_plugin=False, outgoing=True, command=alias_command("caption"), description=lang('caption_des'), parameters=", ") async def caption(context): """ Generates images with captions. """ if not silent: await context.edit(lang('caption_process')) if context.arguments: if ',' in context.arguments: string_1, string_2 = context.arguments.split(',', 1) else: string_1 = context.arguments string_2 = " " else: await context.edit(lang('caption_error_grammer')) return reply = await context.get_reply_message() target_file_path = await context.download_media() reply_id = context.reply_to_msg_id if reply: target_file_path = await context.client.download_media( await context.get_reply_message() ) if target_file_path is None: await context.edit(lang('caption_no_file')) return if not target_file_path.endswith(".mp4"): result = await execute(f"{module_dir}/assets/caption.sh \"{target_file_path}\" " f"{module_dir}/assets/Impact-Regular.ttf " f"\"{str(string_1)}\" \"{str(string_2)}\"") result_file = "result.png" else: result = await execute(f"{module_dir}/assets/caption-gif.sh \"{target_file_path}\" " f"{module_dir}/assets/Impact-Regular.ttf " f"\"{str(string_1)}\" \"{str(string_2)}\"") result_file = "result.gif" if not result: await handle_failure(context, target_file_path, 'convert_error') return try: if not await upload_attachment(result_file, context.chat_id, reply_id): await context.edit(lang('caption_error')) remove(target_file_path) return except PhotoInvalidDimensionsError: await handle_failure(context, target_file_path, 'convert_invalid') return await context.delete() if string_2 != " ": message = string_1 + "` 和 `" + string_2 else: message = string_1 remove(target_file_path) remove(result_file) await log(f"{lang('caption_success1')} `{message}` {lang('caption_success2')}") @listener(is_plugin=False, outgoing=True, command=alias_command('ocr'), description=lang('ocr_des')) async def ocr(context): """ Extracts texts from images. """ args = context.parameter psm = 3 if len(context.parameter) >= 1: try: psm = int(args[0]) except ValueError: pass if not 0 <= int(psm) <= 13: await context.edit(lang('ocr_psm_len_error')) return reply = await context.get_reply_message() if not silent: await context.edit(lang('ocr_processing')) if reply: target_file_path = await context.client.download_media( await context.get_reply_message() ) else: target_file_path = await context.download_media() if target_file_path is None: await context.edit(lang('ocr_no_file')) return result = await execute(f"tesseract {target_file_path} stdout") if not result: await context.edit(lang('ocr_no_result')) try: remove(target_file_path) except FileNotFoundError: pass return result = await execute(f"tesseract -c preserve_interword_spaces=1 -l chi_sim --psm {psm} \"{target_file_path}\" stdout 2>/dev/null", False) await context.edit(f"**{lang('ocr_result_hint')}: **\n{result}") success = True remove(target_file_path) @listener(is_plugin=False, outgoing=True, command=alias_command('highlight'), description=lang('highlight_des'), parameters="") async def highlight(context): """ Generates syntax highlighted images. """ if context.fwd_from: return reply = await context.get_reply_message() reply_id = None if not silent: await context.edit(lang('highlight_processing')) if reply: reply_id = reply.id target_file_path = await context.client.download_media( await context.get_reply_message() ) if target_file_path is None: message = reply.text else: if Magic(mime=True).from_file(target_file_path) != 'text/plain': message = reply.text else: with open(target_file_path, 'r') as file: message = file.read() remove(target_file_path) else: if context.arguments: message = context.arguments else: await context.edit(lang('highlight_no_file')) return lexer = guess_lexer(message) try: formatter = img.JpgImageFormatter(style="colorful") except img.FontNotFound: await context.edit(lang('caption_error')) return except FileNotFoundError: await context.edit(lang('caption_error')) return try: result = syntax_highlight(message, lexer, formatter, outfile=None) except OSError: await context.edit(lang('caption_error')) return if not silent: await context.edit(lang('highlight_uploading')) try: await context.client.send_file( context.chat_id, result, reply_to=reply_id ) except PhotoInvalidDimensionsError: await context.edit(lang('caption_error')) return await context.delete() async def handle_failure(context, target_file_path, name): await context.edit(lang(name)) try: remove("result.png") remove(target_file_path) except FileNotFoundError: pass