mirror of
https://github.com/DerrtSML/qbittorent_bot.git
synced 2025-10-26 04:20:08 +03:00
Update bot.py
This commit is contained in:
parent
ff9fa39493
commit
be9d31908e
44
bot.py
44
bot.py
@ -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))
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user