__version__ = (1, 1, 0) # 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()) os.makedirs(output_dir, exist_ok=True) ydl_opts = { 'format': 'best', 'outtmpl': os.path.join(output_dir, f'{random_uuid}.%(ext)s'), 'noplaylist': True, } with yt_dlp.YoutubeDL(ydl_opts) as ydl: info_dict = ydl.extract_info(url, download=True) 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) 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) 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 await utils.answer(message, self.config["downloading_text"]) try: video, title = await download_video(link) 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: caption = title or "Готово!" await utils.answer_file( message, video, caption=caption, parse_mode="HTML" ) try: await message.delete() except: pass try: os.remove(video) except: pass except Exception as e: error_msg = self.config["error_text"].format(e) await utils.answer(message, error_msg) try: os.remove(video) except: pass