ubot1 / plugins /dl_button.py
sahanind's picture
Upload 96 files
e7ef6c8 verified
raw
history blame
10.4 kB
"""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()