mirror of
https://github.com/omg-xtao/ytdlbot.git
synced 2025-01-30 17:58:36 +00:00
progress bar for ffmpeg
This commit is contained in:
parent
41a51cee9a
commit
5c66b15b51
@ -18,3 +18,4 @@ redis==4.1.4
|
||||
requests==2.27.1
|
||||
tqdm==4.62.3
|
||||
requests-toolbelt==0.9.1
|
||||
ffpb==0.4.1
|
@ -19,6 +19,7 @@ from unittest.mock import MagicMock
|
||||
|
||||
import fakeredis
|
||||
import ffmpeg
|
||||
import ffpb
|
||||
import filetype
|
||||
import yt_dlp as ytdl
|
||||
from tqdm import tqdm
|
||||
@ -65,7 +66,7 @@ def tqdm_progress(desc, total, finished, speed="", eta=""):
|
||||
raw_output = f.getvalue()
|
||||
tqdm_output = raw_output.split("|")
|
||||
progress = f"`[{tqdm_output[1]}]`"
|
||||
detail = tqdm_output[2]
|
||||
detail = tqdm_output[2].replace("[A", "")
|
||||
text = f"""
|
||||
{desc}
|
||||
|
||||
@ -142,13 +143,32 @@ def convert_to_mp4(resp: dict, bot_msg):
|
||||
edit_text(bot_msg, f"{current_time()}: Converting {path.name} to mp4. Please wait.")
|
||||
new_file_path = path.with_suffix(".mp4")
|
||||
logging.info("Detected %s, converting to mp4...", mime)
|
||||
subprocess.check_output(["ffmpeg", "-y", "-i", path, new_file_path])
|
||||
run_ffmpeg(["ffmpeg", "-y", "-i", path, new_file_path], bot_msg)
|
||||
index = resp["filepath"].index(path)
|
||||
resp["filepath"][index] = new_file_path
|
||||
|
||||
return resp
|
||||
|
||||
|
||||
class ProgressBar(tqdm):
|
||||
b = None
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.bot_msg = self.b
|
||||
|
||||
def update(self, n=1):
|
||||
super().update(n)
|
||||
t = tqdm_progress("Converting...", self.total, self.n)
|
||||
edit_text(self.bot_msg, t)
|
||||
|
||||
|
||||
def run_ffmpeg(cmd_list, bm):
|
||||
cmd_list = cmd_list.copy()[1:]
|
||||
ProgressBar.b = bm
|
||||
ffpb.main(cmd_list, tqdm=ProgressBar)
|
||||
|
||||
|
||||
def can_convert_mp4(video_path, uid):
|
||||
if not ENABLE_VIP:
|
||||
return True
|
||||
@ -225,20 +245,20 @@ def ytdl_download(url, tempdir, bm) -> dict:
|
||||
# only convert if send type is video
|
||||
convert_to_mp4(response, bm)
|
||||
if settings[2] == "audio":
|
||||
check_audio_format(response)
|
||||
convert_audio_format(response, bm)
|
||||
# disable it for now
|
||||
# split_large_video(response)
|
||||
return response
|
||||
|
||||
|
||||
def check_audio_format(resp: "dict"):
|
||||
def convert_audio_format(resp: "dict", bm):
|
||||
if resp["status"]:
|
||||
# all_converted = []
|
||||
path: pathlib.PosixPath
|
||||
for path in resp["filepath"]:
|
||||
if path.suffix != f".{AUDIO_FORMAT}":
|
||||
new_path = path.with_suffix(f".{AUDIO_FORMAT}")
|
||||
subprocess.check_output(["ffmpeg", "-y", "-i", path, new_path])
|
||||
run_ffmpeg(["ffmpeg", "-y", "-i", path, new_path], bm)
|
||||
path.unlink()
|
||||
index = resp["filepath"].index(path)
|
||||
resp["filepath"][index] = new_path
|
||||
|
@ -34,8 +34,8 @@ from config import (ARCHIVE_ID, AUDIO_FORMAT, BROKER, ENABLE_CELERY,
|
||||
ENABLE_VIP, TG_MAX_SIZE, WORKERS)
|
||||
from constant import BotText
|
||||
from db import Redis
|
||||
from downloader import (edit_text, sizeof_fmt, tqdm_progress, upload_hook,
|
||||
ytdl_download)
|
||||
from downloader import (edit_text, run_ffmpeg, sizeof_fmt, tqdm_progress,
|
||||
upload_hook, ytdl_download)
|
||||
from limit import VIP
|
||||
from utils import (apply_log_formatter, auto_restart, customize_logger,
|
||||
get_metadata, get_revision, get_user_settings)
|
||||
@ -211,24 +211,28 @@ def direct_normal_download(bot_msg, client, url):
|
||||
def normal_audio(bot_msg, client):
|
||||
chat_id = bot_msg.chat.id
|
||||
fn = getattr(bot_msg.video, "file_name", None) or getattr(bot_msg.document, "file_name", None)
|
||||
status_msg = bot_msg.reply_text("Converting to audio...please wait patiently", quote=True)
|
||||
with tempfile.TemporaryDirectory(prefix="ytdl-") as tmp:
|
||||
logging.info("downloading to %s", tmp)
|
||||
base_path = pathlib.Path(tmp)
|
||||
video_path = base_path.joinpath(fn)
|
||||
audio = base_path.joinpath(fn).with_suffix(f".{AUDIO_FORMAT}")
|
||||
client.send_chat_action(chat_id, 'record_video_note')
|
||||
status_msg.edit_text("Preparing your conversion....")
|
||||
client.download_media(bot_msg, video_path)
|
||||
logging.info("downloading complete %s", video_path)
|
||||
# execute ffmpeg
|
||||
client.send_chat_action(chat_id, 'record_audio')
|
||||
try:
|
||||
subprocess.check_output(["ffmpeg", "-y", "-i", video_path, "-vn", "-acodec", "copy", audio])
|
||||
run_ffmpeg(["ffmpeg", "-y", "-i", video_path, "-vn", "-acodec", "copy", audio], status_msg)
|
||||
except subprocess.CalledProcessError:
|
||||
# CPU consuming if re-encoding.
|
||||
subprocess.check_output(["ffmpeg", "-y", "-i", video_path, audio])
|
||||
run_ffmpeg(["ffmpeg", "-y", "-i", video_path, audio], status_msg)
|
||||
|
||||
status_msg.edit_text("Sending audio now...")
|
||||
client.send_chat_action(chat_id, 'upload_audio')
|
||||
client.send_audio(chat_id, audio)
|
||||
status_msg.edit_text("✅ Conversion complete.")
|
||||
Redis().update_metrics("audio_success")
|
||||
|
||||
|
||||
|
@ -266,7 +266,6 @@ def download_handler(client: "Client", message: "types.Message"):
|
||||
|
||||
red.update_metrics("video_request")
|
||||
text = bot_text.get_receive_link_text()
|
||||
time.sleep(random.random() / 2)
|
||||
try:
|
||||
# raise pyrogram.errors.exceptions.FloodWait(10)
|
||||
bot_msg: typing.Union["types.Message", "typing.Any"] = message.reply_text(text, quote=True)
|
||||
@ -308,8 +307,8 @@ def audio_callback(client: "Client", callback_query: types.CallbackQuery):
|
||||
callback_query.answer(f"Converting to audio...please wait patiently")
|
||||
Redis().update_metrics("audio_request")
|
||||
|
||||
msg = callback_query.message
|
||||
audio_entrance(msg, client)
|
||||
vmsg = callback_query.message
|
||||
audio_entrance(vmsg, client)
|
||||
|
||||
|
||||
@app.on_callback_query(filters.regex(r"Local|Celery"))
|
||||
|
Loading…
Reference in New Issue
Block a user