taslim19
Use tempfile.gettempdir() for downloads in Telegram.py to avoid permission errors
dc00de0
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