diff options
Diffstat (limited to 'searx/engines/radio_browser.py')
| -rw-r--r-- | searx/engines/radio_browser.py | 47 |
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: |