Spaces:
Running
Running
import asyncio | |
import os | |
import time | |
import tempfile | |
from typing import Union | |
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Voice | |
import config | |
from DragMusic import app | |
from DragMusic.utils.formatters import ( | |
check_duration, | |
convert_bytes, | |
get_readable_time, | |
seconds_to_min, | |
) | |
class TeleAPI: | |
def __init__(self): | |
self.chars_limit = 4096 | |
self.sleep = 5 | |
async def send_split_text(self, message, string): | |
n = self.chars_limit | |
out = [(string[i : i + n]) for i in range(0, len(string), n)] | |
j = 0 | |
for x in out: | |
if j <= 2: | |
j += 1 | |
await message.reply_text(x, disable_web_page_preview=True) | |
return True | |
async def get_link(self, message): | |
return message.link | |
async def get_filename(self, file, audio: Union[bool, str] = None): | |
try: | |
file_name = file.file_name | |
if file_name is None: | |
file_name = "ᴛᴇʟᴇɢʀᴀᴍ ᴀᴜᴅɪᴏ" if audio else "ᴛᴇʟᴇɢʀᴀᴍ ᴠɪᴅᴇᴏ" | |
except: | |
file_name = "ᴛᴇʟᴇɢʀᴀᴍ ᴀᴜᴅɪᴏ" if audio else "ᴛᴇʟᴇɢʀᴀᴍ ᴠɪᴅᴇᴏ" | |
return file_name | |
async def get_duration(self, file): | |
try: | |
dur = seconds_to_min(file.duration) | |
except: | |
dur = "Unknown" | |
return dur | |
async def get_duration(self, filex, file_path): | |
try: | |
dur = seconds_to_min(filex.duration) | |
except: | |
try: | |
dur = await asyncio.get_event_loop().run_in_executor( | |
None, check_duration, file_path | |
) | |
dur = seconds_to_min(dur) | |
except: | |
return "Unknown" | |
return dur | |
async def get_filepath( | |
self, | |
audio: Union[bool, str] = None, | |
video: Union[bool, str] = None, | |
): | |
if audio: | |
try: | |
file_name = ( | |
audio.file_unique_id | |
+ "." | |
+ ( | |
(audio.file_name.split(".")[-1]) | |
if (not isinstance(audio, Voice)) | |
else "ogg" | |
) | |
) | |
except: | |
file_name = audio.file_unique_id + "." + "ogg" | |
file_name = os.path.join(tempfile.gettempdir(), file_name) | |
if video: | |
try: | |
file_name = ( | |
video.file_unique_id + "." + (video.file_name.split(".")[-1]) | |
) | |
except: | |
file_name = video.file_unique_id + "." + "mp4" | |
file_name = os.path.join(tempfile.gettempdir(), file_name) | |
return file_name | |
async def download(self, _, message, mystic, fname): | |
lower = [0, 8, 17, 38, 64, 77, 96] | |
higher = [5, 10, 20, 40, 66, 80, 99] | |
checker = [5, 10, 20, 40, 66, 80, 99] | |
speed_counter = {} | |
if os.path.exists(fname): | |
return True | |
async def down_load(): | |
async def progress(current, total): | |
if current == total: | |
return | |
current_time = time.time() | |
start_time = speed_counter.get(message.id) | |
check_time = current_time - start_time | |
upl = InlineKeyboardMarkup( | |
[ | |
[ | |
InlineKeyboardButton( | |
text="ᴄᴀɴᴄᴇʟ", | |
callback_data="stop_downloading", | |
), | |
] | |
] | |
) | |
percentage = current * 100 / total | |
percentage = str(round(percentage, 2)) | |
speed = current / check_time | |
eta = int((total - current) / speed) | |
eta = get_readable_time(eta) | |
if not eta: | |
eta = "0 sᴇᴄᴏɴᴅs" | |
total_size = convert_bytes(total) | |
completed_size = convert_bytes(current) | |
speed = convert_bytes(speed) | |
percentage = int((percentage.split("."))[0]) | |
for counter in range(7): | |
low = int(lower[counter]) | |
high = int(higher[counter]) | |
check = int(checker[counter]) | |
if low < percentage <= high: | |
if high == check: | |
try: | |
await mystic.edit_text( | |
text=_["tg_1"].format( | |
app.mention, | |
total_size, | |
completed_size, | |
percentage[:5], | |
speed, | |
eta, | |
), | |
reply_markup=upl, | |
) | |
checker[counter] = 100 | |
except: | |
pass | |
speed_counter[message.id] = time.time() | |
try: | |
await app.download_media( | |
message.reply_to_message, | |
file_name=fname, | |
progress=progress, | |
) | |
try: | |
elapsed = get_readable_time( | |
int(int(time.time()) - int(speed_counter[message.id])) | |
) | |
except: | |
elapsed = "0 sᴇᴄᴏɴᴅs" | |
await mystic.edit_text(_["tg_2"].format(elapsed)) | |
except: | |
await mystic.edit_text(_["tg_3"]) | |
task = asyncio.create_task(down_load()) | |
config.lyrical[mystic.id] = task | |
await task | |
verify = config.lyrical.get(mystic.id) | |
if not verify: | |
return False | |
config.lyrical.pop(mystic.id) | |
return True | |