summaryrefslogtreecommitdiff
path: root/searx/engines/radio_browser.py
diff options
context:
space:
mode:
Diffstat (limited to 'searx/engines/radio_browser.py')
-rw-r--r--searx/engines/radio_browser.py47
1 files changed, 41 insertions, 6 deletions
diff --git a/searx/engines/radio_browser.py b/searx/engines/radio_browser.py
index 64208304e..70aecd476 100644
--- a/searx/engines/radio_browser.py
+++ b/searx/engines/radio_browser.py
@@ -5,7 +5,9 @@
https://de1.api.radio-browser.info/#Advanced_station_search
"""
+from __future__ import annotations
+import typing
import random
import socket
from urllib.parse import urlencode
@@ -13,9 +15,15 @@ import babel
from flask_babel import gettext
from searx.network import get
+from searx.enginelib import EngineCache
from searx.enginelib.traits import EngineTraits
from searx.locales import language_tag
+if typing.TYPE_CHECKING:
+ import logging
+
+ logger = logging.getLogger()
+
traits: EngineTraits
about = {
@@ -52,11 +60,24 @@ none filters are applied. Valid filters are:
"""
-servers = []
+CACHE: EngineCache
+"""Persistent (SQLite) key/value cache that deletes its values after ``expire``
+seconds."""
def init(_):
- # see https://api.radio-browser.info
+ global CACHE # pylint: disable=global-statement
+ CACHE = EngineCache("radio_browser")
+ server_list()
+
+
+def server_list() -> list[str]:
+
+ servers = CACHE.get("servers", [])
+ if servers:
+ return servers
+
+ # hint: can take up to 40sec!
ips = socket.getaddrinfo("all.api.radio-browser.info", 80, 0, 0, socket.IPPROTO_TCP)
for ip_tuple in ips:
_ip: str = ip_tuple[4][0] # type: ignore
@@ -65,8 +86,22 @@ def init(_):
if srv not in servers:
servers.append(srv)
+ # update server list once in 24h
+ CACHE.set(key="servers", value=servers, expire=60 * 60 * 24)
+
+ return servers
+
def request(query, params):
+
+ servers = server_list()
+ if not servers:
+ logger.error("Fetched server list is empty!")
+ params["url"] = None
+ return
+
+ server = random.choice(servers)
+
args = {
'name': query,
'order': 'votes',
@@ -87,8 +122,7 @@ def request(query, params):
if countrycode in traits.custom['countrycodes']: # type: ignore
args['countrycode'] = countrycode
- params['url'] = f"{random.choice(servers)}/json/stations/search?{urlencode(args)}"
- return params
+ params['url'] = f"{server}/json/stations/search?{urlencode(args)}"
def response(resp):
@@ -154,8 +188,9 @@ def fetch_traits(engine_traits: EngineTraits):
babel_reg_list = get_global("territory_languages").keys()
- language_list = get(f'{servers[0]}/json/languages').json() # type: ignore
- country_list = get(f'{servers[0]}/json/countries').json() # type: ignore
+ server = server_list()[0]
+ language_list = get(f'{server}/json/languages').json() # type: ignore
+ country_list = get(f'{server}/json/countries').json() # type: ignore
for lang in language_list: