feat: add SearX search plugin and alert backend
Add standalone !searx command for on-demand SearXNG search (top 3 results). Add SearX as a third backend (sx) to the alert plugin for keyword monitoring. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,7 @@ _YT_SEARCH_URL = "https://www.youtube.com/youtubei/v1/search"
|
||||
_YT_CLIENT_VERSION = "2.20250101.00.00"
|
||||
_GQL_URL = "https://gql.twitch.tv/gql"
|
||||
_GQL_CLIENT_ID = "kimne78kx3ncx6brgo4mv6wki5h1ko"
|
||||
_SEARX_URL = "http://192.168.122.119:3000/search"
|
||||
|
||||
# -- Module-level tracking ---------------------------------------------------
|
||||
|
||||
@@ -193,11 +194,40 @@ def _search_twitch(keyword: str) -> list[dict]:
|
||||
return results
|
||||
|
||||
|
||||
# -- SearXNG search (blocking) ----------------------------------------------
|
||||
|
||||
def _search_searx(keyword: str) -> list[dict]:
|
||||
"""Search SearXNG. Blocking."""
|
||||
import urllib.parse
|
||||
|
||||
params = urllib.parse.urlencode({"q": keyword, "format": "json"})
|
||||
url = f"{_SEARX_URL}?{params}"
|
||||
|
||||
req = urllib.request.Request(url, method="GET")
|
||||
resp = urllib.request.urlopen(req, timeout=_FETCH_TIMEOUT)
|
||||
raw = resp.read()
|
||||
resp.close()
|
||||
|
||||
data = json.loads(raw)
|
||||
results: list[dict] = []
|
||||
for item in data.get("results", []):
|
||||
item_url = item.get("url", "")
|
||||
title = item.get("title", "")
|
||||
results.append({
|
||||
"id": item_url,
|
||||
"title": title,
|
||||
"url": item_url,
|
||||
"extra": "",
|
||||
})
|
||||
return results
|
||||
|
||||
|
||||
# -- Backend registry -------------------------------------------------------
|
||||
|
||||
_BACKENDS: dict[str, callable] = {
|
||||
"yt": _search_youtube,
|
||||
"tw": _search_twitch,
|
||||
"sx": _search_searx,
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user