Update bot.py

This commit is contained in:
DerrtSML 2025-06-23 18:25:45 +03:00 committed by GitHub
parent ff9fa39493
commit be9d31908e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

44
bot.py
View File

@ -217,38 +217,36 @@ async def select_category_callback(update: Update, context: ContextTypes.DEFAULT
# --- Отправка опций директорий --- # --- Отправка опций директорий ---
async def send_directory_options(query, context): async def send_directory_options(query, context):
# Попытка инициализации клиента qBittorrent
if not init_qbittorrent_client():
await query.edit_message_text(
"Не удалось подключиться к qBittorrent. Проверьте переменные окружения и доступность сервера."
)
return
try: try:
# Получаем пути сохранения из qBittorrent
# qbittorrentapi.app.default_save_path - это дефолтная директория
# qbittorrentapi.app.preferences().save_path - это та же дефолтная директория,
# но если хотим показать другие, нам нужно их получить откуда-то еще,
# например, из существующих торрентов или заранее заданного списка.
# Для простоты пока используем дефолтный и какой-нибудь пример.
# !!! ВНИМАНИЕ: qBittorrent API не предоставляет список "доступных" директорий автоматически. # !!! ВНИМАНИЕ: qBittorrent API не предоставляет список "доступных" директорий автоматически.
# Вам нужно будет вручную указать те директории, которые вы хотите предложить пользователю. # Вам нужно будет вручную указать те директории, которые вы хотите предложить пользователю.
# Здесь приведен ПРИМЕР, как это можно сделать.
# ЗАМЕНИТЕ ЭТОТ СПИСОК СВОИМИ АКТУАЛЬНЫМИ ПУТЯМИ! # ЗАМЕНИТЕ ЭТОТ СПИСОК СВОИМИ АКТУАЛЬНЫМИ ПУТЯМИ!
# Пример:
available_paths = [ available_paths = [
qb.app.default_save_path, # Дефолтный путь qBittorrent qb.app.default_save_path, # Дефолтный путь qBittorrent, например: /downloads/complete
"/share/Data/Films", "/share/Data/Films",
"/share/Data/Serials", "/share/Data/Serials",
"/share/Data/Music",
"/share/Data/torrents", "/share/Data/torrents",
# Добавьте здесь другие пути, если они у вас есть # Добавьте здесь другие пути, если они у вас есть
] ]
# Удаляем дубликаты и пустые пути # Удаляем дубликаты и пустые пути, нормализуем слеши для отображения
available_paths = list(set([p for p in available_paths if p])) available_paths = sorted(list(set([p.replace(os.sep, '/') for p in available_paths if p])))
directory_keyboard = [] directory_keyboard = []
for path in available_paths: for path in available_paths:
# path.replace(os.sep, '/') для кроссплатформенности и читаемости # Для отображения: используем basename, если путь очень длинный, или просто путь
display_path = path.replace(os.sep, '/') display_path = os.path.basename(path) if len(path) > 30 else path
directory_keyboard.append([InlineKeyboardButton(display_path, callback_data=f"select_dir_{path}")]) directory_keyboard.append([InlineKeyboardButton(display_path, callback_data=f"select_dir_{path}")])
# Опция для использования дефолтной директории qBittorrent (если пользователь не хочет выбирать)
directory_keyboard.append([InlineKeyboardButton("Использовать дефолтную qBittorrent", callback_data=f"select_dir_{qb.app.default_save_path}")])
reply_markup = InlineKeyboardMarkup(directory_keyboard) reply_markup = InlineKeyboardMarkup(directory_keyboard)
await query.edit_message_reply_markup(reply_markup=reply_markup) # Изменяем только разметку, чтобы сообщение осталось await query.edit_message_reply_markup(reply_markup=reply_markup) # Изменяем только разметку, чтобы сообщение осталось
@ -299,8 +297,10 @@ async def select_directory_callback(update: Update, context: ContextTypes.DEFAUL
f"Директория: {selected_directory}" f"Директория: {selected_directory}"
) )
# Очищаем данные из context.user_data после использования # Очищаем данные из context.user_data после использования
del context.user_data['current_torrent_url'] if 'current_torrent_url' in context.user_data:
del context.user_data['selected_category'] del context.user_data['current_torrent_url']
if 'selected_category' in context.user_data:
del context.user_data['selected_category']
except APIError as e: except APIError as e:
logger.error(f"Error adding torrent with path: {e}") logger.error(f"Error adding torrent with path: {e}")
await query.edit_message_text(f"Ошибка при добавлении торрента: {e}") await query.edit_message_text(f"Ошибка при добавлении торрента: {e}")
@ -350,7 +350,13 @@ def main() -> None:
# --- Добавление обработчиков сообщений --- # --- Добавление обработчиков сообщений ---
# Перехватывает URL и Magnet-ссылки # Перехватывает URL и Magnet-ссылки
url_regex = r"magnet:\?xt=urn:[a-z0-9]+" # Регулярное выражение для magnet-ссылок url_regex = r"magnet:\?xt=urn:[a-z0-9]+" # Регулярное выражение для magnet-ссылок
torrent_url_regex = r"https?://[^\s]+(?:\.torrent|\/torrent\.php\?hash=)[\S]*" # Регулярное выражение для URL торрент-файлов # Обновленное регулярное выражение для URL торрент-файлов
# Включает:
# - обычные .torrent ссылки (например, example.com/file.torrent)
# - /torrent.php?hash= (некоторые трекеры используют это)
# - /download/<ID> (например, d.rutor.info/download/1042274)
# - любые URL, оканчивающиеся на число, которое может быть ID торрента
torrent_url_regex = r"https?://[^\s]+(?:/\d+|/\w+\.torrent|/download/\d+|\/torrent\.php\?hash=)[\S]*"
application.add_handler(MessageHandler(filters.TEXT & (filters.Regex(url_regex) | filters.Regex(torrent_url_regex)), handle_url)) application.add_handler(MessageHandler(filters.TEXT & (filters.Regex(url_regex) | filters.Regex(torrent_url_regex)), handle_url))