used url_resolved for yamaha app

This commit is contained in:
Thomas Hanika 2022-01-28 10:23:25 +01:00
parent 4d2a8b219f
commit 2179c48d5a
6 changed files with 50 additions and 21 deletions

View file

@ -40,6 +40,6 @@ setup(
'onkyo',
'denon'
],
install_requires=['requests', 'flask', 'PyYAML', 'Pillow', 'oyaml'],
install_requires=['requests', 'flask', 'PyYAML', 'Pillow'],
packages=find_packages(exclude=['contrib', 'docs', 'tests'])
)

View file

@ -7,13 +7,18 @@ white_list = {}
black_list = {}
filter_dir = {}
parameter_failed_list = {}
count_used = 0
count_hit = 0
def init_filter():
global white_list
global black_list
global parameter_failed_list
global filter_dir
global count_used
global count_hit
count_used = 0
count_hit = 0
filter_dir = generic.read_yaml_file(generic.get_var_path() + '/filter.yml')
if filter_dir:
white_list = filter_dir['whitelist']
@ -30,9 +35,9 @@ def init_filter():
def end_filter():
if parameter_failed_list:
logging.info("Used filter parameter: %s", parameter_failed_list)
logging.info("(%d/%d) stations filtered by: %s", count_hit, count_used, parameter_failed_list)
else:
logging.info("Used filter parameter: <nothing used>")
logging.info("(%d/%d) stations filtered by: <no filter used>")
def parameter_hit(param_name):
@ -46,6 +51,9 @@ def parameter_hit(param_name):
def check_station(station_json):
global count_used
global count_hit
count_used = count_used + 1
station_name = get_json_attr(station_json, 'name')
if not station_name:
# müll response
@ -92,4 +100,5 @@ def check_station(station_json):
# station_name, param_name, valid_elements, val)
return False
# logging.debug("OK '%s' passed", station_name)
count_hit = count_hit + 1
return True

View file

@ -1,4 +1,3 @@
import logging
import ycast.vtuner as vtuner
import ycast.generic as generic

View file

@ -7,7 +7,7 @@ import logging
from ycast import __version__
import ycast.vtuner as vtuner
import ycast.generic as generic
from ycast.filter import check_station, init_filter, end_filter
from ycast.my_filter import check_station, init_filter, end_filter
from ycast.generic import get_json_attr
API_ENDPOINT = "http://all.api.radio-browser.info"
@ -28,7 +28,11 @@ class Station:
self.id = generic.generate_stationid_with_prefix(
base64.urlsafe_b64encode(uuid.UUID(self.stationuuid).bytes).decode(), ID_PREFIX)
self.name = generic.get_json_attr(station_json, 'name')
self.url = generic.get_json_attr(station_json, 'url')
self.url = generic.get_json_attr(station_json, 'url_resolved')
if not self.url:
self.url = generic.get_json_attr(station_json, 'url')
self.icon = generic.get_json_attr(station_json, 'favicon')
self.tags = generic.get_json_attr(station_json, 'tags').split(',')
self.countrycode = generic.get_json_attr(station_json, 'countrycode')
@ -45,8 +49,9 @@ class Station:
def get_playable_url(self):
try:
playable_url_json = request('url/' + str(self.stationuuid))[0]
playable_url_json = request('url/' + str(self.stationuuid))
self.url = playable_url_json['url']
except (IndexError, KeyError):
logging.error("Could not retrieve first playlist item for station with id '%s'", self.stationuuid)
@ -141,7 +146,6 @@ def get_stations_by_country(country):
cur_station = Station(station_json)
station_cache[cur_station.id] = cur_station
stations.append(cur_station)
logging.info("Stations (%d/%d)", len(stations), len(stations_list_json))
end_filter()
return stations
@ -157,7 +161,6 @@ def get_stations_by_language(language):
cur_station = Station(station_json)
station_cache[cur_station.id] = cur_station
stations.append(cur_station)
logging.info("Stations (%d/%d)", len(stations), len(stations_list_json))
end_filter()
return stations
@ -172,7 +175,6 @@ def get_stations_by_genre(genre):
cur_station = Station(station_json)
station_cache[cur_station.id] = cur_station
stations.append(cur_station)
logging.info("Stations (%d/%d)", len(stations), len(stations_list_json))
end_filter()
return stations
@ -187,7 +189,6 @@ def get_stations_by_votes(limit=DEFAULT_STATION_LIMIT):
cur_station = Station(station_json)
station_cache[cur_station.id] = cur_station
stations.append(cur_station)
logging.info("Stations (%d/%d)", len(stations), len(stations_list_json))
end_filter()
return stations
@ -202,6 +203,5 @@ def search(name, limit=DEFAULT_STATION_LIMIT):
cur_station = Station(station_json)
station_cache[cur_station.id] = cur_station
stations.append(cur_station)
logging.info("Stations (%d/%d)", len(stations), len(stations_list_json))
end_filter()
return stations

View file

@ -40,13 +40,13 @@ def check_my_stations_feature(config):
my_stations_enabled = my_stations.set_config(config)
def get_directories_page(subdir, directories, request):
def get_directories_page(subdir, directories, request_obj):
page = vtuner.Page()
if len(directories) == 0:
page.add(vtuner.Display("No entries found"))
page.set_count(1)
return page
for directory in get_paged_elements(directories, request.args):
for directory in get_paged_elements(directories, request_obj.args):
vtuner_directory = vtuner.Directory(directory.displayname,
url_for(subdir, _external=True, directory=directory.name),
directory.item_count)
@ -55,17 +55,18 @@ def get_directories_page(subdir, directories, request):
return page
def get_stations_page(stations, request):
def get_stations_page(stations, request_obj):
page = vtuner.Page()
if len(stations) == 0:
page.add(vtuner.Display("No stations found"))
page.set_count(1)
return page
for station in get_paged_elements(stations, request.args):
for station in get_paged_elements(stations, request_obj.args):
vtuner_station = station.to_vtuner()
if station_tracking:
vtuner_station.set_trackurl(request.host_url + PATH_ROOT + '/' + PATH_PLAY + '?id=' + vtuner_station.uid)
vtuner_station.icon = request.host_url + PATH_ROOT + '/' + PATH_ICON + '?id=' + vtuner_station.uid
vtuner_station.set_trackurl(
request_obj.host_url + PATH_ROOT + '/' + PATH_PLAY + '?id=' + vtuner_station.uid)
vtuner_station.icon = request_obj.host_url + PATH_ROOT + '/' + PATH_ICON + '?id=' + vtuner_station.uid
page.add(vtuner_station)
page.set_count(len(stations))
return page
@ -112,7 +113,7 @@ def get_station_by_id(stationid, additional_info=False):
def vtuner_redirect(url):
if request and request.host and not re.search("^[A-Za-z0-9]+\.vtuner\.com$", request.host):
if request and request.host and not re.search(r"^[A-Za-z0-9]+\.vtuner\.com$", request.host):
logging.warning("You are not accessing a YCast redirect with a whitelisted host url (*.vtuner.com). "
"Some AVRs have problems with this. The requested host was: %s", request.host)
return redirect(url, code=302)
@ -121,6 +122,7 @@ def vtuner_redirect(url):
@app.route('/setupapp/<path:path>',
methods=['GET', 'POST'])
def upstream(path):
logging.debug('**********************: %s', request.url)
if request.args.get('token') == '0':
return vtuner.get_init_token()
if request.args.get('search'):
@ -144,6 +146,7 @@ def upstream(path):
defaults={'path': ''},
methods=['GET', 'POST'])
def landing(path=''):
logging.debug('**********************: %s', request.url)
page = vtuner.Page()
page.add(vtuner.Directory('Radiobrowser', url_for('radiobrowser_landing', _external=True), 4))
if my_stations_enabled:
@ -158,6 +161,7 @@ def landing(path=''):
@app.route('/' + PATH_ROOT + '/' + PATH_MY_STATIONS + '/',
methods=['GET', 'POST'])
def my_stations_landing():
logging.debug('**********************: %s', request.url)
directories = my_stations.get_category_directories()
return get_directories_page('my_stations_category', directories, request).to_string()
@ -165,6 +169,7 @@ def my_stations_landing():
@app.route('/' + PATH_ROOT + '/' + PATH_MY_STATIONS + '/<directory>',
methods=['GET', 'POST'])
def my_stations_category(directory):
logging.debug('**********************: %s', request.url)
stations = my_stations.get_stations_by_category(directory)
return get_stations_page(stations, request).to_string()
@ -172,6 +177,7 @@ def my_stations_category(directory):
@app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/',
methods=['GET', 'POST'])
def radiobrowser_landing():
logging.debug('**********************: %s', request.url)
page = vtuner.Page()
page.add(vtuner.Directory('Genres', url_for('radiobrowser_genres', _external=True),
len(radiobrowser.get_genre_directories())))
@ -188,6 +194,7 @@ def radiobrowser_landing():
@app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_COUNTRY + '/',
methods=['GET', 'POST'])
def radiobrowser_countries():
logging.debug('**********************: %s', request.url)
directories = radiobrowser.get_country_directories()
return get_directories_page('radiobrowser_country_stations', directories, request).to_string()
@ -195,6 +202,7 @@ def radiobrowser_countries():
@app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_COUNTRY + '/<directory>',
methods=['GET', 'POST'])
def radiobrowser_country_stations(directory):
logging.debug('**********************: %s', request.url)
stations = radiobrowser.get_stations_by_country(directory)
return get_stations_page(stations, request).to_string()
@ -202,6 +210,7 @@ def radiobrowser_country_stations(directory):
@app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_LANGUAGE + '/',
methods=['GET', 'POST'])
def radiobrowser_languages():
logging.debug('**********************: %s', request.url)
directories = radiobrowser.get_language_directories()
return get_directories_page('radiobrowser_language_stations', directories, request).to_string()
@ -209,6 +218,7 @@ def radiobrowser_languages():
@app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_LANGUAGE + '/<directory>',
methods=['GET', 'POST'])
def radiobrowser_language_stations(directory):
logging.debug('**********************: %s', request.url)
stations = radiobrowser.get_stations_by_language(directory)
return get_stations_page(stations, request).to_string()
@ -216,6 +226,7 @@ def radiobrowser_language_stations(directory):
@app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_GENRE + '/',
methods=['GET', 'POST'])
def radiobrowser_genres():
logging.debug('**********************: %s', request.url)
directories = radiobrowser.get_genre_directories()
return get_directories_page('radiobrowser_genre_stations', directories, request).to_string()
@ -223,6 +234,7 @@ def radiobrowser_genres():
@app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_GENRE + '/<directory>',
methods=['GET', 'POST'])
def radiobrowser_genre_stations(directory):
logging.debug('**********************: %s', request.url)
stations = radiobrowser.get_stations_by_genre(directory)
return get_stations_page(stations, request).to_string()
@ -230,6 +242,7 @@ def radiobrowser_genre_stations(directory):
@app.route('/' + PATH_ROOT + '/' + PATH_RADIOBROWSER + '/' + PATH_RADIOBROWSER_POPULAR + '/',
methods=['GET', 'POST'])
def radiobrowser_popular():
logging.debug('**********************: %s', request.url)
stations = radiobrowser.get_stations_by_votes()
return get_stations_page(stations, request).to_string()
@ -237,6 +250,7 @@ def radiobrowser_popular():
@app.route('/' + PATH_ROOT + '/' + PATH_SEARCH + '/',
methods=['GET', 'POST'])
def station_search():
logging.debug('**********************: %s', request.url)
query = request.args.get('search')
if not query or len(query) < 3:
page = vtuner.Page()
@ -252,6 +266,7 @@ def station_search():
@app.route('/' + PATH_ROOT + '/' + PATH_PLAY,
methods=['GET', 'POST'])
def get_stream_url():
logging.debug('**********************: %s', request.url)
stationid = request.args.get('id')
if not stationid:
logging.error("Stream URL without station ID requested")
@ -267,6 +282,7 @@ def get_stream_url():
@app.route('/' + PATH_ROOT + '/' + PATH_STATION,
methods=['GET', 'POST'])
def get_station_info():
logging.debug('**********************: %s', request.url)
stationid = request.args.get('id')
if not stationid:
logging.error("Station info without station ID requested")
@ -291,6 +307,7 @@ def get_station_info():
@app.route('/' + PATH_ROOT + '/' + PATH_ICON,
methods=['GET', 'POST'])
def get_station_icon():
logging.debug('**********************: %s', request.url)
stationid = request.args.get('id')
if not stationid:
logging.error("Station icon without station ID requested")

View file

@ -3,7 +3,7 @@ import logging
import unittest
from io import StringIO
import filter
import my_filter
import generic
from ycast import radiobrowser
@ -39,6 +39,10 @@ class MyTestCase(unittest.TestCase):
logging.info("Used filter parameter", filter.parameter_failed_list)
def test_popular_station(self):
stations = radiobrowser.get_stations_by_votes()
logging.info("Stations (%d)", len(stations))
if __name__ == '__main__':
unittest.main()