| """Module for handling download callback and related functions""" | |
| import asyncio | |
| from datetime import datetime | |
| import logging | |
| import os | |
| import time | |
| import aiohttp | |
| from plugins.functions.display_progress import ( | |
| progress_for_pyrogram, | |
| humanbytes, | |
| TimeFormatter, | |
| ) | |
| from plugins.script import Translation | |
| from plugins.utitles import Mdata01, Mdata02, Mdata03 | |
| from config import Config | |
| logging.basicConfig( | |
| level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" | |
| ) | |
| logger = logging.getLogger(__name__) | |
| logging.getLogger("pyrogram").setLevel(logging.WARNING) | |
| async def ddl_call_back(bot, update): | |
| cb_data = update.data | |
| tg_send_type, youtube_dl_format, youtube_dl_ext = cb_data.split("=") | |
| youtube_dl_url = update.message.reply_to_message.text | |
| custom_file_name = os.path.basename(youtube_dl_url) | |
| if " " in youtube_dl_url: | |
| url_parts = youtube_dl_url.split(" * ") | |
| if len(url_parts) == 2: | |
| youtube_dl_url = url_parts[0] | |
| custom_file_name = url_parts[1] | |
| else: | |
| for entity in update.message.reply_to_message.entities: | |
| if entity.type == "text_link": | |
| youtube_dl_url = entity.url | |
| elif entity.type == "url": | |
| o = entity.offset | |
| length = entity.length | |
| youtube_dl_url = youtube_dl_url[o: o + length] | |
| if youtube_dl_url is not None: | |
| youtube_dl_url = youtube_dl_url.strip() | |
| if custom_file_name is not None: | |
| custom_file_name = custom_file_name.strip() | |
| else: | |
| for entity in update.message.reply_to_message.entities: | |
| if entity.type == "text_link": | |
| youtube_dl_url = entity.url | |
| elif entity.type == "url": | |
| o = entity.offset | |
| length = entity.length | |
| youtube_dl_url = youtube_dl_url[o: o + length] | |
| description = custom_file_name | |
| if f".{youtube_dl_ext}" not in custom_file_name: | |
| custom_file_name += f".{youtube_dl_ext}" | |
| logger.info(youtube_dl_url) | |
| logger.info(custom_file_name) | |
| start = datetime.now() | |
| await bot.edit_message_text( | |
| text=Translation.DOWNLOAD_START.format(custom_file_name), | |
| chat_id=update.message.chat.id, | |
| message_id=update.message.id, | |
| ) | |
| tmp_directory_for_each_user = ( | |
| f"{Config.DOWNLOAD_LOCATION}/{str(update.from_user.id)}" | |
| ) | |
| if not os.path.isdir(tmp_directory_for_each_user): | |
| os.makedirs(tmp_directory_for_each_user) | |
| download_directory = f"{tmp_directory_for_each_user}/{custom_file_name}" | |
| async with aiohttp.ClientSession() as session: | |
| c_time = time.time() | |
| try: | |
| await download_coroutine( | |
| bot, | |
| session, | |
| youtube_dl_url, | |
| download_directory, | |
| update.message.chat.id, | |
| update.message.id, | |
| c_time, | |
| ) | |
| except asyncio.TimeoutError: | |
| await bot.edit_message_text( | |
| text=Translation.SLOW_URL_DECED, | |
| chat_id=update.message.chat.id, | |
| message_id=update.message.id, | |
| ) | |
| return False | |
| if os.path.exists(download_directory): | |
| save_ytdl_json_path = ( | |
| f"{Config.DOWNLOAD_LOCATION}/{str(update.message.chat.id)}.json" | |
| ) | |
| download_location = f"{Config.DOWNLOAD_LOCATION}/{update.from_user.id}.jpg" | |
| thumb = download_location if os.path.isfile(download_location) else None | |
| if os.path.exists(save_ytdl_json_path): | |
| os.remove(save_ytdl_json_path) | |
| end_one = datetime.now() | |
| await bot.edit_message_text( | |
| text=Translation.UPLOAD_START, | |
| chat_id=update.message.chat.id, | |
| message_id=update.message.id, | |
| ) | |
| file_size = Config.TG_MAX_FILE_SIZE + 1 | |
| try: | |
| file_size = os.stat(download_directory).st_size | |
| except FileNotFoundError: | |
| download_directory = f"{os.path.splitext(download_directory)[0]}.mkv" | |
| file_size = os.stat(download_directory).st_size | |
| if file_size > Config.TG_MAX_FILE_SIZE: | |
| await bot.edit_message_text( | |
| chat_id=update.message.chat.id, | |
| text=Translation.RCHD_TG_API_LIMIT, | |
| message_id=update.message.id, | |
| ) | |
| else: | |
| start_time = time.time() | |
| if tg_send_type == "video": | |
| width, height, duration = await Mdata01(download_directory) | |
| await bot.send_video( | |
| chat_id=update.message.chat.id, | |
| video=download_directory, | |
| thumb=thumb, | |
| caption=description, | |
| duration=duration, | |
| width=width, | |
| height=height, | |
| supports_streaming=True, | |
| reply_to_message_id=update.message.reply_to_message.id, | |
| progress=progress_for_pyrogram, | |
| progress_args=( | |
| Translation.UPLOAD_START, | |
| update.message, | |
| start_time, | |
| ), | |
| ) | |
| elif tg_send_type == "audio": | |
| duration = await Mdata03(download_directory) | |
| await bot.send_audio( | |
| chat_id=update.message.chat.id, | |
| audio=download_directory, | |
| thumb=thumb, | |
| caption=description, | |
| duration=duration, | |
| reply_to_message_id=update.message.reply_to_message.id, | |
| progress=progress_for_pyrogram, | |
| progress_args=( | |
| Translation.UPLOAD_START, | |
| update.message, | |
| start_time, | |
| ), | |
| ) | |
| elif tg_send_type == "vm": | |
| width, duration = await Mdata02(download_directory) | |
| await bot.send_video_note( | |
| chat_id=update.message.chat.id, | |
| video_note=download_directory, | |
| thumb=thumb, | |
| duration=duration, | |
| length=width, | |
| reply_to_message_id=update.message.reply_to_message.id, | |
| progress=progress_for_pyrogram, | |
| progress_args=( | |
| Translation.UPLOAD_START, | |
| update.message, | |
| start_time, | |
| ), | |
| ) | |
| else: | |
| await bot.send_document( | |
| chat_id=update.message.chat.id, | |
| document=download_directory, | |
| thumb=thumb, | |
| caption=description, | |
| reply_to_message_id=update.message.reply_to_message.id, | |
| progress=progress_for_pyrogram, | |
| progress_args=( | |
| Translation.UPLOAD_START, | |
| update.message, | |
| start_time, | |
| ), | |
| ) | |
| end_two = datetime.now() | |
| try: | |
| os.remove(download_directory) | |
| except Exception: | |
| pass | |
| time_taken_for_download = (end_one - start).seconds | |
| time_taken_for_upload = (end_two - end_one).seconds | |
| await bot.edit_message_text( | |
| text=Translation.AFTER_SUCCESSFUL_UPLOAD_MSG_WITH_TS.format( | |
| time_taken_for_download, time_taken_for_upload | |
| ), | |
| chat_id=update.message.chat.id, | |
| message_id=update.message.id, | |
| disable_web_page_preview=True, | |
| ) | |
| logger.info("Downloaded in: %s", str(time_taken_for_download)) | |
| logger.info("Uploaded in: %s", str(time_taken_for_upload)) | |
| else: | |
| await bot.edit_message_text( | |
| text=Translation.NO_VOID_FORMAT_FOUND.format("Incorrect Link"), | |
| chat_id=update.message.chat.id, | |
| message_id=update.message.id, | |
| disable_web_page_preview=True, | |
| ) | |
| async def download_coroutine(bot, session, url, file_name, chat_id, message_id, start): | |
| downloaded = 0 | |
| display_message = "" | |
| async with session.get(url, timeout=Config.PROCESS_MAX_TIMEOUT) as response: | |
| total_length = int(response.headers["Content-Length"]) | |
| content_type = response.headers["Content-Type"] | |
| if "text" in content_type and total_length < 500: | |
| return await response.release() | |
| with open(file_name, "wb") as f_handle: | |
| while True: | |
| chunk = await response.content.read(Config.CHUNK_SIZE) | |
| if not chunk: | |
| break | |
| f_handle.write(chunk) | |
| downloaded += Config.CHUNK_SIZE | |
| now = time.time() | |
| diff = now - start | |
| if round(diff % 5.0) == 0 or downloaded == total_length: | |
| percentage = downloaded * 100 / total_length | |
| speed = downloaded / diff | |
| elapsed_time = round(diff) * 1000 | |
| time_to_completion = ( | |
| round((total_length - downloaded) / speed) * 1000 | |
| ) | |
| estimated_total_time = elapsed_time + time_to_completion | |
| try: | |
| current_message = """**Download Status** | |
| Percentage : {} | |
| URL: {} | |
| File Size: {} | |
| Downloaded: {} | |
| ETA: {}""".format( | |
| percentage, | |
| url, | |
| humanbytes(total_length), | |
| humanbytes(downloaded), | |
| TimeFormatter(estimated_total_time), | |
| ) | |
| if current_message != display_message: | |
| await bot.edit_message_text( | |
| chat_id, message_id, text=current_message | |
| ) | |
| display_message = current_message | |
| except Exception as e: | |
| logger.info(str(e)) | |
| return await response.release() | |