Path: blob/master/bot/modules/nzb_search.py
1630 views
from xml.etree import ElementTree as ET1from aiohttp import ClientSession23from .. import LOGGER4from ..core.config_manager import Config5from ..helper.ext_utils.bot_utils import new_task6from ..helper.ext_utils.status_utils import get_readable_file_size7from ..helper.ext_utils.telegraph_helper import telegraph8from ..helper.telegram_helper.button_build import ButtonMaker9from ..helper.telegram_helper.message_utils import edit_message, send_message101112@new_task13async def hydra_search(_, message):14key = message.text.split()15if len(key) == 1:16await send_message(17message,18"Please provide a search query. Example: `/nzbsearch movie title`.",19)20return2122query = " ".join(key[1:]).strip()23message = await send_message(message, f"Searching for '{query}'...")24try:25items = await search_nzbhydra(query)26if not items:27await edit_message(message, "No results found.")28LOGGER.info(f"No results found for search query: {query}")29return3031page_url = await create_telegraph_page(query, items)32buttons = ButtonMaker()33buttons.url_button("Results", page_url)34button = buttons.build_menu()35await edit_message(36message,37f"Search results for '{query}' are available here",38button,39)40except Exception as e:41LOGGER.error(f"Error in hydra_search: {e!s}")42await edit_message(message, "Something went wrong.")434445async def search_nzbhydra(query, limit=50):46search_url = f"{Config.HYDRA_IP}/api"47params = {48"apikey": Config.HYDRA_API_KEY,49"t": "search",50"q": query,51"limit": limit,52}5354headers = {55"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",56}5758async with ClientSession() as session:59try:60async with session.get(61search_url,62params=params,63headers=headers,64) as response:65if response.status == 200:66content = await response.text()67root = ET.fromstring(content)68return root.findall(".//item")6970LOGGER.error(71f"Failed to search NZBHydra. Status Code: {response.status}",72)73LOGGER.error(f"Response Text: {await response.text()}")74return None75except ET.ParseError:76LOGGER.error("Failed to parse the XML response.")77return None78except Exception as e:79LOGGER.error(f"Error in search_nzbhydra: {e!s}")80return None818283async def create_telegraph_page(query, items):84content = "<b>Search Results:</b><br><br>"85sorted_items = sorted(86[87(88int(item.find("size").text) if item.find("size") is not None else 0,89item,90)91for item in items[:100]92],93reverse=True,94key=lambda x: x[0],95)9697for idx, (size_bytes, item) in enumerate(sorted_items, 1):98title = (99item.find("title").text100if item.find("title") is not None101else "No Title Available"102)103download_url = (104item.find("link").text105if item.find("link") is not None106else "No Link Available"107)108size = get_readable_file_size(size_bytes)109110content += (111f"{idx}. {title}<br>"112f"<b><a href='{download_url}'>Download URL</a> | <a href='http://t.me/share/url?url={download_url}'>Share Download URL</a></b><br>"113f"<b>Size:</b> {size}<br>"114f"━━━━━━━━━━━━━━━━━━━━━━<br><br>"115)116117response = await telegraph.create_page(118title=f"Search Results for '{query}'",119content=content,120)121LOGGER.info(f"Telegraph page created for search: {query}")122return f"https://telegra.ph/{response['path']}"123124125