diff --git a/bot.py b/bot.py index 39bf538..ca248e8 100644 --- a/bot.py +++ b/bot.py @@ -217,38 +217,36 @@ async def select_category_callback(update: Update, context: ContextTypes.DEFAULT # --- Отправка опций директорий --- async def send_directory_options(query, context): + # Попытка инициализации клиента qBittorrent + if not init_qbittorrent_client(): + await query.edit_message_text( + "Не удалось подключиться к qBittorrent. Проверьте переменные окружения и доступность сервера." + ) + return + try: - # Получаем пути сохранения из qBittorrent - # qbittorrentapi.app.default_save_path - это дефолтная директория - # qbittorrentapi.app.preferences().save_path - это та же дефолтная директория, - # но если хотим показать другие, нам нужно их получить откуда-то еще, - # например, из существующих торрентов или заранее заданного списка. - # Для простоты пока используем дефолтный и какой-нибудь пример. - # !!! ВНИМАНИЕ: qBittorrent API не предоставляет список "доступных" директорий автоматически. # Вам нужно будет вручную указать те директории, которые вы хотите предложить пользователю. - # Здесь приведен ПРИМЕР, как это можно сделать. # ЗАМЕНИТЕ ЭТОТ СПИСОК СВОИМИ АКТУАЛЬНЫМИ ПУТЯМИ! + # Пример: available_paths = [ - qb.app.default_save_path, # Дефолтный путь qBittorrent + qb.app.default_save_path, # Дефолтный путь qBittorrent, например: /downloads/complete "/share/Data/Films", "/share/Data/Serials", + "/share/Data/Music", "/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 = [] for path in available_paths: - # path.replace(os.sep, '/') для кроссплатформенности и читаемости - display_path = path.replace(os.sep, '/') + # Для отображения: используем basename, если путь очень длинный, или просто путь + display_path = os.path.basename(path) if len(path) > 30 else 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) 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}" ) # Очищаем данные из context.user_data после использования - del context.user_data['current_torrent_url'] - del context.user_data['selected_category'] + if 'current_torrent_url' in context.user_data: + del context.user_data['current_torrent_url'] + if 'selected_category' in context.user_data: + del context.user_data['selected_category'] except APIError as e: logger.error(f"Error adding torrent with path: {e}") await query.edit_message_text(f"Ошибка при добавлении торрента: {e}") @@ -350,7 +350,13 @@ def main() -> None: # --- Добавление обработчиков сообщений --- # Перехватывает URL и 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/ (например, 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))