File size: 6,154 Bytes
a8e9b84 dc00de0 a8e9b84 dc00de0 a8e9b84 dc00de0 a8e9b84 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
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
|