From 1ecd12fd62f9c754b1f051a18e02b492f2ba10a0 Mon Sep 17 00:00:00 2001 From: Canuma Date: Tue, 23 Nov 2021 19:49:14 +0100 Subject: [PATCH 1/2] radiobrowser: Refactor, removed code duplications by parameterizing directory and station searches. --- ycast/radiobrowser.py | 127 +++++++++++++++--------------------------- ycast/server.py | 28 ++++++---- 2 files changed, 60 insertions(+), 95 deletions(-) diff --git a/ycast/radiobrowser.py b/ycast/radiobrowser.py index fa50541..98beb8c 100644 --- a/ycast/radiobrowser.py +++ b/ycast/radiobrowser.py @@ -6,9 +6,6 @@ import ycast.generic as generic API_ENDPOINT = "http://all.api.radio-browser.info" -MINIMUM_COUNT_GENRE = 5 -MINIMUM_COUNT_COUNTRY = 5 -MINIMUM_COUNT_LANGUAGE = 5 DEFAULT_STATION_LIMIT = 200 SHOW_BROKEN_STATIONS = False ID_PREFIX = "RB" @@ -21,6 +18,31 @@ def get_json_attr(json, attr): return None +def format_displayname(displayname, apiparam): + if apiparam == 'languages': + displayname = displayname.title() + elif apiparam == 'tags': + displayname = displayname.capitalize() + else: + displayname = None + return displayname + + +def request_station_builder(paramtype, param, limit): + prefix = 'stations/search?order=' + order = 'name&reverse=false' + lim = '&limit=' + str(limit) + req = '&' + str(paramtype) + 'Exact=true&' + str(paramtype) + '=' + str(param) + hidebroken = '&hidebroken=true' + if SHOW_BROKEN_STATIONS: + hidebroken = '&hidebroken=false' + if paramtype == 'votes': + order = 'votes&reverse=true' + if paramtype == 'search': + req = '&name=' + str(param) + return prefix + order + lim + req + hidebroken + + class Station: def __init__(self, station_json): self.id = generic.generate_stationid_with_prefix(get_json_attr(station_json, 'stationuuid'), ID_PREFIX) @@ -68,90 +90,29 @@ def get_station_by_id(uid): return None -def search(name, limit=DEFAULT_STATION_LIMIT): +def get_station(paramtype, param='', limit=DEFAULT_STATION_LIMIT): + """ + Generic Function for getting Stations. paramtype must be one + of search, country, language, tag(getting genres),votes. See + request_station_builder(paramtype, param, limit) to expand functionality + """ stations = [] - stations_json = request('stations/search?order=name&reverse=false&limit=' + str(limit) + '&name=' + str(name)) + stations_json = request(request_station_builder(paramtype, param, limit)) for station_json in stations_json: - if SHOW_BROKEN_STATIONS or get_json_attr(station_json, 'lastcheckok') == 1: - stations.append(Station(station_json)) + stations.append(Station(station_json)) return stations -def get_country_directories(): - country_directories = [] - apicall = 'countries' - if not SHOW_BROKEN_STATIONS: - apicall += '?hidebroken=true' - countries_raw = request(apicall) - for country_raw in countries_raw: - if get_json_attr(country_raw, 'name') and get_json_attr(country_raw, 'stationcount') and \ - int(get_json_attr(country_raw, 'stationcount')) > MINIMUM_COUNT_COUNTRY: - country_directories.append(generic.Directory(get_json_attr(country_raw, 'name'), - get_json_attr(country_raw, 'stationcount'))) - return country_directories - - -def get_language_directories(): - language_directories = [] - apicall = 'languages' +def get_directories(apiparam, minimumcount=5): + apicall = apiparam + directories = [] if not SHOW_BROKEN_STATIONS: apicall += '?hidebroken=true' - languages_raw = request(apicall) - for language_raw in languages_raw: - if get_json_attr(language_raw, 'name') and get_json_attr(language_raw, 'stationcount') and \ - int(get_json_attr(language_raw, 'stationcount')) > MINIMUM_COUNT_LANGUAGE: - language_directories.append(generic.Directory(get_json_attr(language_raw, 'name'), - get_json_attr(language_raw, 'stationcount'), - get_json_attr(language_raw, 'name').title())) - return language_directories - - -def get_genre_directories(): - genre_directories = [] - apicall = 'tags' - if not SHOW_BROKEN_STATIONS: - apicall += '?hidebroken=true' - genres_raw = request(apicall) - for genre_raw in genres_raw: - if get_json_attr(genre_raw, 'name') and get_json_attr(genre_raw, 'stationcount') and \ - int(get_json_attr(genre_raw, 'stationcount')) > MINIMUM_COUNT_GENRE: - genre_directories.append(generic.Directory(get_json_attr(genre_raw, 'name'), - get_json_attr(genre_raw, 'stationcount'), - get_json_attr(genre_raw, 'name').capitalize())) - return genre_directories - - -def get_stations_by_country(country): - stations = [] - stations_json = request('stations/search?order=name&reverse=false&countryExact=true&country=' + str(country)) - for station_json in stations_json: - if SHOW_BROKEN_STATIONS or get_json_attr(station_json, 'lastcheckok') == 1: - stations.append(Station(station_json)) - return stations - - -def get_stations_by_language(language): - stations = [] - stations_json = request('stations/search?order=name&reverse=false&languageExact=true&language=' + str(language)) - for station_json in stations_json: - if SHOW_BROKEN_STATIONS or get_json_attr(station_json, 'lastcheckok') == 1: - stations.append(Station(station_json)) - return stations - - -def get_stations_by_genre(genre): - stations = [] - stations_json = request('stations/search?order=name&reverse=false&tagExact=true&tag=' + str(genre)) - for station_json in stations_json: - if SHOW_BROKEN_STATIONS or get_json_attr(station_json, 'lastcheckok') == 1: - stations.append(Station(station_json)) - return stations - - -def get_stations_by_votes(limit=DEFAULT_STATION_LIMIT): - stations = [] - stations_json = request('stations?order=votes&reverse=true&limit=' + str(limit)) - for station_json in stations_json: - if SHOW_BROKEN_STATIONS or get_json_attr(station_json, 'lastcheckok') == 1: - stations.append(Station(station_json)) - return stations + raw_directories = request(apicall) + for raw_directory in raw_directories: + if get_json_attr(raw_directory, 'name') and get_json_attr(raw_directory, 'stationcount') and \ + int(get_json_attr(raw_directory, 'stationcount')) > minimumcount: + directories.append(generic.Directory(get_json_attr(raw_directory, 'name'), + get_json_attr(raw_directory, 'stationcount'), + format_displayname(get_json_attr(raw_directory, 'name'), apiparam))) + return directories diff --git a/ycast/server.py b/ycast/server.py index 6d963da..86a204c 100644 --- a/ycast/server.py +++ b/ycast/server.py @@ -22,6 +22,10 @@ PATH_RADIOBROWSER_GENRE = 'genre' PATH_RADIOBROWSER_POPULAR = 'popular' +MINIMUM_COUNT_GENRE = 5 +MINIMUM_COUNT_COUNTRY = 5 +MINIMUM_COUNT_LANGUAGE = 5 + station_tracking = False my_stations_enabled = False app = Flask(__name__) @@ -174,13 +178,13 @@ def my_stations_category(directory): def radiobrowser_landing(): page = vtuner.Page() page.add(vtuner.Directory('Genres', url_for('radiobrowser_genres', _external=True), - len(radiobrowser.get_genre_directories()))) + len(radiobrowser.get_directories('tags', MINIMUM_COUNT_GENRE)))) page.add(vtuner.Directory('Countries', url_for('radiobrowser_countries', _external=True), - len(radiobrowser.get_country_directories()))) + len(radiobrowser.get_directories('countries', MINIMUM_COUNT_COUNTRY)))) page.add(vtuner.Directory('Languages', url_for('radiobrowser_languages', _external=True), - len(radiobrowser.get_language_directories()))) + len(radiobrowser.get_directories('languages', MINIMUM_COUNT_LANGUAGE)))) page.add(vtuner.Directory('Most Popular', url_for('radiobrowser_popular', _external=True), - len(radiobrowser.get_stations_by_votes()))) + len(radiobrowser.get_station('votes')))) page.set_count(4) return page.to_string() @@ -188,49 +192,49 @@ def radiobrowser_landing(): @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_COUNTRY + '/', methods=['GET', 'POST']) def radiobrowser_countries(): - directories = radiobrowser.get_country_directories() + directories = radiobrowser.get_directories('countries', MINIMUM_COUNT_COUNTRY) return get_directories_page('radiobrowser_country_stations', directories, request).to_string() @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_COUNTRY + '/', methods=['GET', 'POST']) def radiobrowser_country_stations(directory): - stations = radiobrowser.get_stations_by_country(directory) + stations = radiobrowser.get_station('country', directory) return get_stations_page(stations, request).to_string() @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_LANGUAGE + '/', methods=['GET', 'POST']) def radiobrowser_languages(): - directories = radiobrowser.get_language_directories() + directories = radiobrowser.get_directories('languages', MINIMUM_COUNT_LANGUAGE) return get_directories_page('radiobrowser_language_stations', directories, request).to_string() @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_LANGUAGE + '/', methods=['GET', 'POST']) def radiobrowser_language_stations(directory): - stations = radiobrowser.get_stations_by_language(directory) + stations = radiobrowser.get_station('language', directory) return get_stations_page(stations, request).to_string() @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_GENRE + '/', methods=['GET', 'POST']) def radiobrowser_genres(): - directories = radiobrowser.get_genre_directories() + directories = radiobrowser.get_directories('tags', MINIMUM_COUNT_GENRE) return get_directories_page('radiobrowser_genre_stations', directories, request).to_string() @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_GENRE + '/', methods=['GET', 'POST']) def radiobrowser_genre_stations(directory): - stations = radiobrowser.get_stations_by_genre(directory) + stations = radiobrowser.get_station('tag', directory) return get_stations_page(stations, request).to_string() @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_POPULAR + '/', methods=['GET', 'POST']) def radiobrowser_popular(): - stations = radiobrowser.get_stations_by_votes() + stations = radiobrowser.get_station('votes') return get_stations_page(stations, request).to_string() @@ -245,7 +249,7 @@ def station_search(): return page.to_string() else: # TODO: we also need to include 'my station' elements - stations = radiobrowser.search(query) + stations = radiobrowser.get_station('search', query) return get_stations_page(stations, request).to_string() From a0a60b3cfe2977d7f12c12f4bf9941a26028b860 Mon Sep 17 00:00:00 2001 From: Canuma Date: Tue, 23 Nov 2021 20:17:39 +0100 Subject: [PATCH 2/2] small semantic fix. get_station -> get_stations --- ycast/radiobrowser.py | 2 +- ycast/server.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ycast/radiobrowser.py b/ycast/radiobrowser.py index 98beb8c..f15852f 100644 --- a/ycast/radiobrowser.py +++ b/ycast/radiobrowser.py @@ -90,7 +90,7 @@ def get_station_by_id(uid): return None -def get_station(paramtype, param='', limit=DEFAULT_STATION_LIMIT): +def get_stations(paramtype, param='', limit=DEFAULT_STATION_LIMIT): """ Generic Function for getting Stations. paramtype must be one of search, country, language, tag(getting genres),votes. See diff --git a/ycast/server.py b/ycast/server.py index 86a204c..0a184ad 100644 --- a/ycast/server.py +++ b/ycast/server.py @@ -184,7 +184,7 @@ def radiobrowser_landing(): page.add(vtuner.Directory('Languages', url_for('radiobrowser_languages', _external=True), len(radiobrowser.get_directories('languages', MINIMUM_COUNT_LANGUAGE)))) page.add(vtuner.Directory('Most Popular', url_for('radiobrowser_popular', _external=True), - len(radiobrowser.get_station('votes')))) + len(radiobrowser.get_stations('votes')))) page.set_count(4) return page.to_string() @@ -199,7 +199,7 @@ def radiobrowser_countries(): @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_COUNTRY + '/', methods=['GET', 'POST']) def radiobrowser_country_stations(directory): - stations = radiobrowser.get_station('country', directory) + stations = radiobrowser.get_stations('country', directory) return get_stations_page(stations, request).to_string() @@ -213,7 +213,7 @@ def radiobrowser_languages(): @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_LANGUAGE + '/', methods=['GET', 'POST']) def radiobrowser_language_stations(directory): - stations = radiobrowser.get_station('language', directory) + stations = radiobrowser.get_stations('language', directory) return get_stations_page(stations, request).to_string() @@ -227,14 +227,14 @@ def radiobrowser_genres(): @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_GENRE + '/', methods=['GET', 'POST']) def radiobrowser_genre_stations(directory): - stations = radiobrowser.get_station('tag', directory) + stations = radiobrowser.get_stations('tag', directory) return get_stations_page(stations, request).to_string() @app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_POPULAR + '/', methods=['GET', 'POST']) def radiobrowser_popular(): - stations = radiobrowser.get_station('votes') + stations = radiobrowser.get_stations('votes') return get_stations_page(stations, request).to_string() @@ -249,7 +249,7 @@ def station_search(): return page.to_string() else: # TODO: we also need to include 'my station' elements - stations = radiobrowser.get_station('search', query) + stations = radiobrowser.get_stations('search', query) return get_stations_page(stations, request).to_string()