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