Spaces:
Running
Running
# Ultroid - UserBot | |
# Copyright (C) 2021-2023 TeamUltroid | |
# | |
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ > | |
# PLease read the GNU Affero General Public License in | |
# <https://www.github.com/TeamUltroid/Ultroid/blob/main/LICENSE/>. | |
from . import get_help | |
__doc__ = get_help("help_downloadupload") | |
import asyncio | |
import glob | |
import os | |
import time | |
from datetime import datetime as dt | |
from aiohttp.client_exceptions import InvalidURL | |
from telethon.errors.rpcerrorlist import MessageNotModifiedError | |
from pyUltroid.fns.helper import time_formatter | |
from pyUltroid.fns.tools import get_chat_and_msgid, set_attributes | |
from . import ( | |
LOGS, | |
ULTConfig, | |
downloader, | |
eor, | |
fast_download, | |
get_all_files, | |
get_string, | |
progress, | |
time_formatter, | |
ultroid_cmd, | |
) | |
async def down(event): | |
matched = event.pattern_match.group(1).strip() | |
msg = await event.eor(get_string("udl_4")) | |
if not matched: | |
return await eor(msg, get_string("udl_5"), time=5) | |
try: | |
splited = matched.split(" | ") | |
link = splited[0] | |
filename = splited[1] | |
except IndexError: | |
filename = None | |
s_time = time.time() | |
try: | |
filename, d = await fast_download( | |
link, | |
filename, | |
progress_callback=lambda d, t: asyncio.get_event_loop().create_task( | |
progress( | |
d, | |
t, | |
msg, | |
s_time, | |
f"Downloading from {link}", | |
) | |
), | |
) | |
except InvalidURL: | |
return await msg.eor("`Invalid URL provided :(`", time=5) | |
await msg.eor(f"`{filename}` `downloaded in {time_formatter(d*1000)}.`") | |
async def download(event): | |
match = event.pattern_match.group(1).strip() | |
if match and "t.me/" in match: | |
chat, msg = get_chat_and_msgid(match) | |
if not (chat and msg): | |
return await event.eor(get_string("gms_1")) | |
match = "" | |
ok = await event.client.get_messages(chat, ids=msg) | |
elif event.reply_to_msg_id: | |
ok = await event.get_reply_message() | |
else: | |
return await event.eor(get_string("cvt_3"), time=8) | |
xx = await event.eor(get_string("com_1")) | |
if not (ok and ok.media): | |
return await xx.eor(get_string("udl_1"), time=5) | |
s = dt.now() | |
k = time.time() | |
if hasattr(ok.media, "document"): | |
file = ok.media.document | |
mime_type = file.mime_type | |
filename = match or ok.file.name | |
if not filename: | |
if "audio" in mime_type: | |
filename = "audio_" + dt.now().isoformat("_", "seconds") + ".ogg" | |
elif "video" in mime_type: | |
filename = "video_" + dt.now().isoformat("_", "seconds") + ".mp4" | |
try: | |
result = await downloader( | |
f"resources/downloads/{filename}", | |
file, | |
xx, | |
k, | |
f"Downloading {filename}...", | |
) | |
except MessageNotModifiedError as err: | |
return await xx.edit(str(err)) | |
file_name = result.name | |
else: | |
d = "resources/downloads/" | |
file_name = await event.client.download_media( | |
ok, | |
d, | |
progress_callback=lambda d, t: asyncio.get_event_loop().create_task( | |
progress( | |
d, | |
t, | |
xx, | |
k, | |
get_string("com_5"), | |
), | |
), | |
) | |
e = dt.now() | |
t = time_formatter(((e - s).seconds) * 1000) | |
await xx.eor(get_string("udl_2").format(file_name, t)) | |
async def _(event): | |
msg = await event.eor(get_string("com_1")) | |
match = event.pattern_match.group(1) | |
if match: | |
match = match.strip() | |
if not event.out and match == ".env": | |
return await event.reply("`You can't do this...`") | |
stream, force_doc, delete, thumb = ( | |
False, | |
True, | |
False, | |
ULTConfig.thumb, | |
) | |
if "--stream" in match: | |
stream = True | |
force_doc = False | |
if "--delete" in match: | |
delete = True | |
if "--no-thumb" in match: | |
thumb = None | |
arguments = ["--stream", "--delete", "--no-thumb"] | |
if any(item in match for item in arguments): | |
match = ( | |
match.replace("--stream", "") | |
.replace("--delete", "") | |
.replace("--no-thumb", "") | |
.strip() | |
) | |
if match.endswith("/"): | |
match += "*" | |
results = glob.glob(match) | |
if not results and os.path.exists(match): | |
results = [match] | |
if not results: | |
try: | |
await event.reply(file=match) | |
return await event.try_delete() | |
except Exception as er: | |
LOGS.exception(er) | |
return await msg.eor(get_string("ls1")) | |
for result in results: | |
if os.path.isdir(result): | |
c, s = 0, 0 | |
for files in get_all_files(result): | |
attributes = None | |
if stream: | |
try: | |
attributes = await set_attributes(files) | |
except KeyError as er: | |
LOGS.exception(er) | |
try: | |
file, _ = await event.client.fast_uploader( | |
files, show_progress=True, event=msg, to_delete=delete | |
) | |
await event.client.send_file( | |
event.chat_id, | |
file, | |
supports_streaming=stream, | |
force_document=force_doc, | |
thumb=thumb, | |
attributes=attributes, | |
caption=f"`Uploaded` `{files}` `in {time_formatter(_*1000)}`", | |
reply_to=event.reply_to_msg_id or event, | |
) | |
s += 1 | |
except (ValueError, IsADirectoryError): | |
c += 1 | |
break | |
attributes = None | |
if stream: | |
try: | |
attributes = await set_attributes(result) | |
except KeyError as er: | |
LOGS.exception(er) | |
file, _ = await event.client.fast_uploader( | |
result, show_progress=True, event=msg, to_delete=delete | |
) | |
await event.client.send_file( | |
event.chat_id, | |
file, | |
supports_streaming=stream, | |
force_document=force_doc, | |
thumb=thumb, | |
attributes=attributes, | |
caption=f"`Uploaded` `{result}` `in {time_formatter(_*1000)}`", | |
) | |
await msg.try_delete() | |