|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from . import get_help |
|
|
|
__doc__ = get_help("help_compressor") |
|
|
|
|
|
import asyncio |
|
import os |
|
import re |
|
import time |
|
from datetime import datetime as dt |
|
|
|
from telethon.errors.rpcerrorlist import MessageNotModifiedError |
|
from telethon.tl.types import DocumentAttributeVideo |
|
|
|
from pyUltroid.fns.tools import metadata |
|
|
|
from . import ( |
|
ULTConfig, |
|
bash, |
|
downloader, |
|
get_string, |
|
humanbytes, |
|
math, |
|
mediainfo, |
|
time_formatter, |
|
ultroid_cmd, |
|
uploader, |
|
) |
|
|
|
|
|
@ultroid_cmd(pattern="compress( (.*)|$)") |
|
async def _(e): |
|
cr = e.pattern_match.group(1).strip() |
|
crf = 27 |
|
to_stream = False |
|
if cr: |
|
k = e.text.split() |
|
if len(k) == 2: |
|
crf = int(k[1]) if k[1].isdigit() else 27 |
|
elif len(k) > 2: |
|
crf = int(k[1]) if k[1].isdigit() else 27 |
|
to_stream = "stream" in k[2] |
|
vido = await e.get_reply_message() |
|
if vido and vido.media and "video" in mediainfo(vido.media): |
|
if hasattr(vido.media, "document"): |
|
vfile = vido.media.document |
|
name = vido.file.name |
|
else: |
|
vfile = vido.media |
|
name = "" |
|
if not name: |
|
name = "video_" + dt.now().isoformat("_", "seconds") + ".mp4" |
|
xxx = await e.eor(get_string("audiotools_5")) |
|
c_time = time.time() |
|
file = await downloader( |
|
f"resources/downloads/{name}", |
|
vfile, |
|
xxx, |
|
c_time, |
|
f"Downloading {name}...", |
|
) |
|
|
|
o_size = os.path.getsize(file.name) |
|
d_time = time.time() |
|
diff = time_formatter((d_time - c_time) * 1000) |
|
file_name = (file.name).split("/")[-1] |
|
out = file_name.replace(file_name.split(".")[-1], "compressed.mkv") |
|
await xxx.edit( |
|
f"`Downloaded {file.name} of {humanbytes(o_size)} in {diff}.\nNow Compressing...`" |
|
) |
|
x, y = await bash( |
|
f'mediainfo --fullscan """{file.name}""" | grep "Frame count"' |
|
) |
|
if y and y.endswith("NOT_FOUND"): |
|
return await xxx.edit(f"ERROR: `{y}`") |
|
total_frames = x.split(":")[1].split("\n")[0] |
|
progress = f"progress-{c_time}.txt" |
|
with open(progress, "w"): |
|
pass |
|
proce = await asyncio.create_subprocess_shell( |
|
f'ffmpeg -hide_banner -loglevel quiet -progress {progress} -i """{file.name}""" -preset ultrafast -vcodec libx265 -crf {crf} -c:a copy """{out}""" -y', |
|
stdout=asyncio.subprocess.PIPE, |
|
stderr=asyncio.subprocess.PIPE, |
|
) |
|
while proce.returncode != 0: |
|
await asyncio.sleep(3) |
|
with open(progress, "r+") as fil: |
|
text = fil.read() |
|
frames = re.findall("frame=(\\d+)", text) |
|
size = re.findall("total_size=(\\d+)", text) |
|
speed = 0 |
|
if len(frames): |
|
elapse = int(frames[-1]) |
|
if len(size): |
|
size = int(size[-1]) |
|
per = elapse * 100 / int(total_frames) |
|
time_diff = time.time() - int(d_time) |
|
speed = round(elapse / time_diff, 2) |
|
if int(speed) != 0: |
|
some_eta = ((int(total_frames) - elapse) / speed) * 1000 |
|
text = f"`Compressing {file_name} at {crf} CRF.\n`" |
|
progress_str = "`[{0}{1}] {2}%\n\n`".format( |
|
"".join("β" for _ in range(math.floor(per / 5))), |
|
"".join("" for _ in range(20 - math.floor(per / 5))), |
|
round(per, 2), |
|
) |
|
|
|
e_size = f"{humanbytes(size)} of ~{humanbytes((size / per) * 100)}" |
|
eta = f"~{time_formatter(some_eta)}" |
|
try: |
|
await xxx.edit( |
|
text |
|
+ progress_str |
|
+ "`" |
|
+ e_size |
|
+ "`" |
|
+ "\n\n`" |
|
+ eta |
|
+ "`" |
|
) |
|
except MessageNotModifiedError: |
|
pass |
|
os.remove(file.name) |
|
c_size = os.path.getsize(out) |
|
f_time = time.time() |
|
difff = time_formatter((f_time - d_time) * 1000) |
|
await xxx.edit( |
|
f"`Compressed {humanbytes(o_size)} to {humanbytes(c_size)} in {difff}\nTrying to Upload...`" |
|
) |
|
differ = 100 - ((c_size / o_size) * 100) |
|
caption = f"**Original Size: **`{humanbytes(o_size)}`\n" |
|
caption += f"**Compressed Size: **`{humanbytes(c_size)}`\n" |
|
caption += f"**Compression Ratio: **`{differ:.2f}%`\n" |
|
caption += f"\n**Time Taken To Compress: **`{difff}`" |
|
n_file, _ = await e.client.fast_uploader( |
|
out, show_progress=True, event=e, message="Uploading...", to_delete=True |
|
) |
|
if to_stream: |
|
data = await metadata(out) |
|
width = data["width"] |
|
height = data["height"] |
|
duration = data["duration"] |
|
attributes = [ |
|
DocumentAttributeVideo( |
|
duration=duration, w=width, h=height, supports_streaming=True |
|
) |
|
] |
|
await e.client.send_file( |
|
e.chat_id, |
|
n_file, |
|
thumb=ULTConfig.thumb, |
|
caption=caption, |
|
attributes=attributes, |
|
force_document=False, |
|
reply_to=e.reply_to_msg_id, |
|
) |
|
else: |
|
await e.client.send_file( |
|
e.chat_id, |
|
n_file, |
|
thumb=ULTConfig.thumb, |
|
caption=caption, |
|
force_document=True, |
|
reply_to=e.reply_to_msg_id, |
|
) |
|
await xxx.delete() |
|
os.remove(out) |
|
os.remove(progress) |
|
else: |
|
await e.eor(get_string("audiotools_8"), time=5) |
|
|