Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
anasty17
GitHub Repository: anasty17/mirror-leech-telegram-bot
Path: blob/master/bot/modules/nzb_search.py
1630 views
1
from xml.etree import ElementTree as ET
2
from aiohttp import ClientSession
3
4
from .. import LOGGER
5
from ..core.config_manager import Config
6
from ..helper.ext_utils.bot_utils import new_task
7
from ..helper.ext_utils.status_utils import get_readable_file_size
8
from ..helper.ext_utils.telegraph_helper import telegraph
9
from ..helper.telegram_helper.button_build import ButtonMaker
10
from ..helper.telegram_helper.message_utils import edit_message, send_message
11
12
13
@new_task
14
async def hydra_search(_, message):
15
key = message.text.split()
16
if len(key) == 1:
17
await send_message(
18
message,
19
"Please provide a search query. Example: `/nzbsearch movie title`.",
20
)
21
return
22
23
query = " ".join(key[1:]).strip()
24
message = await send_message(message, f"Searching for '{query}'...")
25
try:
26
items = await search_nzbhydra(query)
27
if not items:
28
await edit_message(message, "No results found.")
29
LOGGER.info(f"No results found for search query: {query}")
30
return
31
32
page_url = await create_telegraph_page(query, items)
33
buttons = ButtonMaker()
34
buttons.url_button("Results", page_url)
35
button = buttons.build_menu()
36
await edit_message(
37
message,
38
f"Search results for '{query}' are available here",
39
button,
40
)
41
except Exception as e:
42
LOGGER.error(f"Error in hydra_search: {e!s}")
43
await edit_message(message, "Something went wrong.")
44
45
46
async def search_nzbhydra(query, limit=50):
47
search_url = f"{Config.HYDRA_IP}/api"
48
params = {
49
"apikey": Config.HYDRA_API_KEY,
50
"t": "search",
51
"q": query,
52
"limit": limit,
53
}
54
55
headers = {
56
"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",
57
}
58
59
async with ClientSession() as session:
60
try:
61
async with session.get(
62
search_url,
63
params=params,
64
headers=headers,
65
) as response:
66
if response.status == 200:
67
content = await response.text()
68
root = ET.fromstring(content)
69
return root.findall(".//item")
70
71
LOGGER.error(
72
f"Failed to search NZBHydra. Status Code: {response.status}",
73
)
74
LOGGER.error(f"Response Text: {await response.text()}")
75
return None
76
except ET.ParseError:
77
LOGGER.error("Failed to parse the XML response.")
78
return None
79
except Exception as e:
80
LOGGER.error(f"Error in search_nzbhydra: {e!s}")
81
return None
82
83
84
async def create_telegraph_page(query, items):
85
content = "<b>Search Results:</b><br><br>"
86
sorted_items = sorted(
87
[
88
(
89
int(item.find("size").text) if item.find("size") is not None else 0,
90
item,
91
)
92
for item in items[:100]
93
],
94
reverse=True,
95
key=lambda x: x[0],
96
)
97
98
for idx, (size_bytes, item) in enumerate(sorted_items, 1):
99
title = (
100
item.find("title").text
101
if item.find("title") is not None
102
else "No Title Available"
103
)
104
download_url = (
105
item.find("link").text
106
if item.find("link") is not None
107
else "No Link Available"
108
)
109
size = get_readable_file_size(size_bytes)
110
111
content += (
112
f"{idx}. {title}<br>"
113
f"<b><a href='{download_url}'>Download URL</a> | <a href='http://t.me/share/url?url={download_url}'>Share Download URL</a></b><br>"
114
f"<b>Size:</b> {size}<br>"
115
f"━━━━━━━━━━━━━━━━━━━━━━<br><br>"
116
)
117
118
response = await telegraph.create_page(
119
title=f"Search Results for '{query}'",
120
content=content,
121
)
122
LOGGER.info(f"Telegraph page created for search: {query}")
123
return f"https://telegra.ph/{response['path']}"
124
125