diff --git a/app/plugins/files/download.py b/app/plugins/files/download.py new file mode 100644 index 0000000..3e68564 --- /dev/null +++ b/app/plugins/files/download.py @@ -0,0 +1,96 @@ +import asyncio +import os +import time + +from app import BOT, bot +from app.core import Message +from app.utils.downloader import Download, DownloadedFile +from app.utils.helpers import progress +from app.utils.media_helper import get_tg_media_details + + +@bot.add_cmd(cmd="download") +async def down_load(bot: BOT, message: Message): + """ + CMD: DOWNLOAD + INFO: Download Files/TG Media to Bot server. + FLAGS: "-f" for custom filename + USAGE: + .download URL | Reply to Media + .download -f file.ext URL | Reply to Media + """ + response = await message.reply("Checking Input...") + if (not message.replied or not message.replied.media) and not message.input: + await response.edit( + "Invalid input...\nReply to a message containing media or give a link with cmd." + ) + return + dl_path = os.path.join("downloads", str(time.time())) + await response.edit("Input verified....Starting Download...") + file_name = None + if message.replied and message.replied.media: + if "-f" in message.flags: + file_name = message.input + download_coro = telegram_download( + message=message.replied, + response=response, + path=dl_path, + file_name=file_name, + ) + else: + if "-f" in message.flags: + file_name, url = message.flt_input.split() + else: + file_name, url = None, message.input + dl_obj: Download = await Download.setup( + url=url, path=dl_path, message_to_edit=response, custom_file_name=file_name + ) + download_coro = dl_obj.download() + try: + downloaded_file: DownloadedFile = await download_coro + await response.edit( + f"Download Completed" + f"\n
"
+ f"\nfile={downloaded_file.name}"
+ f"\npath={downloaded_file.full_path}"
+ f"\nsize={downloaded_file.size}mb"
+ )
+ return downloaded_file
+
+ except asyncio.exceptions.CancelledError:
+ await response.edit("Cancelled....")
+ except TimeoutError:
+ await response.edit("Download Timeout...")
+ except Exception as e:
+ await response.edit(str(e))
+
+
+async def telegram_download(
+ message: Message, response: Message, path: str, file_name: str | None = None
+) -> DownloadedFile:
+ """
+ :param message: Message Containing Media
+ :param response: Response to Edit
+ :param path: Download path
+ :param file_name: Custom File Name
+ :return: DownloadedFile
+ """
+ tg_media = get_tg_media_details(message)
+ tg_media.file_name = file_name or tg_media.file_name
+ media_obj: DownloadedFile = DownloadedFile(
+ name=tg_media.file_name,
+ path=path,
+ size=round(tg_media.file_size / 1048576, 1),
+ full_path=os.path.join(path, tg_media.file_name),
+ )
+ progress_args = (
+ response,
+ "Downloading...",
+ media_obj.name,
+ media_obj.full_path)
+ await message.download(
+ file_name=media_obj.full_path,
+ progress=progress,
+ progress_args=progress_args,
+ )
+ return media_obj