From 8c8aba8cf50c74399d1ba7a86e0953ab32dbc3f3 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Sun, 6 Apr 2025 18:38:38 +0200 Subject: [PATCH] [fix] engine radio browser: get servers from DNS api.radio-browser.info Do a DNS-lookup of 'all.api.radio-browser.info', add reverse lookup and select randomly a URL from available servers Closes: https://github.com/searxng/searxng/issues/4576 Signed-off-by: Markus Heiser --- searx/data/engine_traits.json | 1 + searx/engines/radio_browser.py | 23 +++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/searx/data/engine_traits.json b/searx/data/engine_traits.json index df8f1f295..dcbeba8e4 100644 --- a/searx/data/engine_traits.json +++ b/searx/data/engine_traits.json @@ -7196,6 +7196,7 @@ "km": "khmer", "kn": "kannada", "ko": "korean", + "ks": "kashmiri", "ku": "kurdish", "kw": "cornish", "la": "latin", diff --git a/searx/engines/radio_browser.py b/searx/engines/radio_browser.py index a8f07a638..64208304e 100644 --- a/searx/engines/radio_browser.py +++ b/searx/engines/radio_browser.py @@ -6,6 +6,8 @@ """ +import random +import socket from urllib.parse import urlencode import babel from flask_babel import gettext @@ -27,7 +29,6 @@ about = { paging = True categories = ['music', 'radio'] -base_url = "https://de1.api.radio-browser.info" # see https://api.radio-browser.info/ for all nodes number_of_results = 10 station_filters = [] # ['countrycode', 'language'] @@ -51,6 +52,19 @@ none filters are applied. Valid filters are: """ +servers = [] + + +def init(_): + # see https://api.radio-browser.info + 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 + url = socket.gethostbyaddr(_ip)[0] + srv = "https://" + url + if srv not in servers: + servers.append(srv) + def request(query, params): args = { @@ -73,7 +87,7 @@ def request(query, params): if countrycode in traits.custom['countrycodes']: # type: ignore args['countrycode'] = countrycode - params['url'] = f"{base_url}/json/stations/search?{urlencode(args)}" + params['url'] = f"{random.choice(servers)}/json/stations/search?{urlencode(args)}" return params @@ -135,12 +149,13 @@ def fetch_traits(engine_traits: EngineTraits): """ # pylint: disable=import-outside-toplevel + init(None) from babel.core import get_global babel_reg_list = get_global("territory_languages").keys() - language_list = get(f'{base_url}/json/languages').json() # type: ignore - country_list = get(f'{base_url}/json/countries').json() # type: ignore + language_list = get(f'{servers[0]}/json/languages').json() # type: ignore + country_list = get(f'{servers[0]}/json/countries').json() # type: ignore for lang in language_list: