yt-dlp-bot/app_bot/bot/core/callbacks.py

75 lines
2.5 KiB
Python
Raw Normal View History

2022-02-04 06:21:27 +08:00
import logging
2023-03-29 03:26:16 +08:00
from pyrogram.enums import ParseMode
2022-06-11 04:35:48 +08:00
from pyrogram.types import Message
2022-02-04 06:21:27 +08:00
from yt_shared.emoji import SUCCESS_EMOJI
from bot.core.bot import VideoBot
2023-03-29 03:26:16 +08:00
from bot.core.service import UrlParser, UrlService
2023-03-30 03:51:49 +08:00
from bot.core.utils import bold, get_user_id
2022-02-04 06:21:27 +08:00
class TelegramCallback:
2022-11-05 00:45:33 +08:00
_MSG_SEND_OK = f'{SUCCESS_EMOJI} {bold("{count}URL{plural} sent for download")}'
2022-02-04 06:21:27 +08:00
_MSG_SEND_FAIL = f'🛑 {bold("Failed to send URL for download")}'
def __init__(self) -> None:
self._log = logging.getLogger(self.__class__.__name__)
2023-03-29 03:26:16 +08:00
self._url_parser = UrlParser()
self._url_service = UrlService()
2022-02-04 06:21:27 +08:00
2022-06-14 07:24:25 +08:00
@staticmethod
async def on_start(client: VideoBot, message: Message) -> None:
await message.reply(
bold('Send video URL to start processing'),
parse_mode=ParseMode.HTML,
reply_to_message_id=message.id,
)
2022-06-14 04:46:54 +08:00
async def on_message(self, client: VideoBot, message: Message) -> None:
2022-02-04 06:21:27 +08:00
"""Receive video URL and send to the download worker."""
2023-03-29 03:26:16 +08:00
self._log.debug('Received Telegram Message: %s', message)
2023-11-17 03:37:04 +08:00
text = message.text
if not text:
2023-11-18 21:21:47 +08:00
self._log.debug('Forwarded message, skipping')
2023-11-17 03:37:04 +08:00
return
urls = text.splitlines()
2023-03-29 03:26:16 +08:00
user = client.allowed_users[get_user_id(message)]
if user.use_url_regex_match:
urls = self._url_parser.filter_urls(
urls=urls, regexes=client.conf.telegram.url_validation_regexes
)
if not urls:
2023-03-30 03:51:49 +08:00
self._log.debug('No urls to download, skipping message')
2023-03-29 03:26:16 +08:00
return
2023-10-01 05:23:30 +08:00
ack_message = await self._send_acknowledge_message(
2023-09-24 22:16:50 +08:00
message=message, url_count=len(urls)
)
context = {
'message': message,
'user': user,
2023-10-01 05:23:30 +08:00
'ack_message': ack_message,
2023-09-24 22:16:50 +08:00
}
url_objects = self._url_parser.parse_urls(urls=urls, context=context)
await self._url_service.process_urls(url_objects)
2022-11-05 00:45:33 +08:00
async def _send_acknowledge_message(
2023-03-29 03:26:16 +08:00
self,
message: Message,
url_count: int,
2023-09-24 22:16:50 +08:00
) -> Message:
return await message.reply(
2023-03-29 03:26:16 +08:00
text=self._format_acknowledge_text(url_count),
2022-06-11 04:35:48 +08:00
parse_mode=ParseMode.HTML,
reply_to_message_id=message.id,
)
2022-11-03 01:56:19 +08:00
2023-03-29 03:26:16 +08:00
def _format_acknowledge_text(self, url_count: int) -> str:
is_multiple = url_count > 1
return self._MSG_SEND_OK.format(
count=f'{url_count} ' if is_multiple else '',
plural='s' if is_multiple else '',
)