From 076389ee7d3678f6a6364375df7618e7e07ecab1 Mon Sep 17 00:00:00 2001 From: RUIS Date: Fri, 13 Jun 2025 14:14:59 +0300 Subject: [PATCH] Update youtube-loader.py --- youtube-loader.py | 100 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 21 deletions(-) diff --git a/youtube-loader.py b/youtube-loader.py index 958de3c..66c11f9 100644 --- a/youtube-loader.py +++ b/youtube-loader.py @@ -1,13 +1,22 @@ -version = (1, 0, 0) +__version__ = (1, 1, 0) -# meta developer: @RUIS_VlP +# meta developer: @RUIS_VlP, @RoKrz # requires: yt_dlp import yt_dlp import uuid import os +import re from .. import loader, utils + +def extract_youtube_link(text): + if not text: + return None + match = re.search(r"(https?://)?(www\.)?(youtube\.com|youtu\.be)/[^\s]+", text) + return match.group(0) if match else None + + async def download_video(url): output_dir = utils.get_base_dir() random_uuid = str(uuid.uuid4()) @@ -20,39 +29,88 @@ async def download_video(url): with yt_dlp.YoutubeDL(ydl_opts) as ydl: info_dict = ydl.extract_info(url, download=True) - video_ext = info_dict.get('ext', None) #расширение файла - + video_ext = info_dict.get('ext', None) file_path = os.path.join(output_dir, f"{random_uuid}.{video_ext}") - - title = info_dict.get('title', None) - + title = info_dict.get('title', None) + return file_path, title - - + + +def convert_markdown_to_html(template: str, link: str) -> str: + return re.sub(r'\[([^\]]+)\]\(([^)]+)\)', r'\1', template).replace("{link}", link) + + @loader.tds class YouTube_DLDMod(loader.Module): """Помогает скачивать видео с YouTube""" strings = { "name": "YouTube-DLD", + "no_link": "❌ Пожалуйста, укажите ссылку на YouTube либо ответьте на сообщение с ней.", + "default_downloading": "📥 Начинаю загрузку видео.\n\nℹ️ Это может занять до 5 минут, в зависимости от длины и качества видео.", + "default_error": "❌ Ошибка!\n\n{}", + "default_response": "🎥 Вот [ваше видео]({link})!\n\n{title}", } - + + def __init__(self): + self.config = loader.ModuleConfig( + loader.ConfigValue( + "show_link", + True, + "Показывать ссылку в сообщении?", + validator=loader.validators.Boolean(), + ), + loader.ConfigValue( + "downloading_text", + self.strings["default_downloading"], + "Текст во время загрузки" + ), + loader.ConfigValue( + "error_text", + self.strings["default_error"], + "Текст ошибки. (используй {} для ошибки)" + ), + loader.ConfigValue( + "response_text", + self.strings["default_response"], + "Ответ после загрузки. (используй {link} для ссылки и {title} для названия видео)" + ), + ) + @loader.command() async def dlvideo(self, message): - """ - скачивает видео с ютуба""" + """<ссылка> или ответ на сообщение со ссылкой — скачивает видео с YouTube""" + args = utils.get_args_raw(message) - if not args: - await utils.answer(message, "❌ Вы не указали ссылку") + reply = await message.get_reply_message() + + link = extract_youtube_link(args) if args else None + if not link and reply: + link = extract_youtube_link(reply.raw_text) + + if not link: + await utils.answer(message, self.strings["no_link"]) return - link = args - await utils.answer(message, "📥 Начинаю загрузку видео.\n\nℹ️ Обычно приходится ждать ≈5 минут. Все зависит от длины и качества видео. А так же от вашего интернета.") + + await utils.answer(message, self.config["downloading_text"]) + try: video, title = await download_video(link) - print(video) - if title: - await utils.answer_file(message, video, caption=f"🎥 Вот ваше видео!\n\n{title}") + + if self.config["show_link"]: + caption_template = self.config["response_text"] + caption = convert_markdown_to_html(caption_template, link) + caption = caption.replace("{title}", title or "") else: - await utils.answer_file(message, video, caption=f"🎥 Вот ваше видео!") + caption = title or "Готово!" + + await utils.answer_file( + message, + video, + caption=caption, + parse_mode="HTML" + ) + try: await message.delete() except: @@ -62,9 +120,9 @@ class YouTube_DLDMod(loader.Module): except: pass except Exception as e: - await utils.answer(message, f"❌ Ошибка!\n\n{e}") + error_msg = self.config["error_text"].format(e) + await utils.answer(message, error_msg) try: os.remove(video) except: pass - return