Unbreak gradio with newer radio-browser.info API

- cf https://api.radio-browser.info/
- use uuid string to identify stations
- adapt to type changes in the API (str -> bool or int)
- do a DNS SRV lookup to randomly select an API server
This commit is contained in:
landry 2020-11-02 18:44:36 +00:00
parent d0c985b697
commit 80e39061e7
13 changed files with 402 additions and 2 deletions

View File

@ -1,12 +1,12 @@
# $OpenBSD: Makefile,v 1.18 2020/11/01 17:47:59 landry Exp $
# $OpenBSD: Makefile,v 1.19 2020/11/02 18:44:36 landry Exp $
BROKEN = radio-browser.info API changed
COMMENT = internet radio browser and player
GH_TAGNAME = v7.3
GH_ACCOUNT = haecker-felix
GH_PROJECT = Gradio
DISTNAME = ${GH_PROJECT:L}-${GH_TAGNAME:S/^v//}
EPOCH = 0
REVISION = 0
CATEGORIES = audio www

View File

@ -0,0 +1,16 @@
$OpenBSD: patch-data_de_haeckerfelix_gradio_gschema_xml,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: data/de.haeckerfelix.gradio.gschema.xml
--- data/de.haeckerfelix.gradio.gschema.xml.orig
+++ data/de.haeckerfelix.gradio.gschema.xml
@@ -55,8 +55,8 @@
<summary>Resume Playback On Startup</summary>
</key>
- <key name="previous-station" type="i">
- <default>0</default>
+ <key name="previous-station" type="s">
+ <default>''</default>
<summary>The last played station</summary>
</key>

View File

@ -0,0 +1,14 @@
$OpenBSD: patch-src_gradio-app_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-app.vala
--- src/gradio-app.vala.orig
+++ src/gradio-app.vala
@@ -43,7 +43,7 @@ namespace Gradio {
ensure_window ();
window.present_with_time (timestamp);
- Util.get_station_by_id.begin(int.parse(station_id), (obj,res) => {
+ Util.get_station_by_id.begin(station_id, (obj,res) => {
RadioStation station = Util.get_station_by_id.end(res);
player.station = station;
});

View File

@ -0,0 +1,23 @@
$OpenBSD: patch-src_gradio-audio-player_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-audio-player.vala
--- src/gradio-audio-player.vala.orig
+++ src/gradio-audio-player.vala
@@ -47,7 +47,7 @@ namespace Gradio{
codec = new CodecInstaller();
volume = App.settings.volume_position;
- if(App.settings.previous_station != 0 && App.settings.resume_playback_on_startup){
+ if(App.settings.previous_station != "" && App.settings.resume_playback_on_startup){
Util.get_station_by_id.begin(App.settings.previous_station, (obj, res) => {
station = Util.get_station_by_id.end(res);
});
@@ -70,7 +70,7 @@ namespace Gradio{
state = Gst.State.NULL;
- App.settings.previous_station = int.parse(station.id);
+ App.settings.previous_station = station.id;
string address = yield station.get_stream_address();
if(station.is_broken){

View File

@ -0,0 +1,41 @@
$OpenBSD: patch-src_gradio-category-items_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-category-items.vala
--- src/gradio-category-items.vala.orig
+++ src/gradio-category-items.vala
@@ -39,7 +39,7 @@ namespace Gradio{
try{
// Languages
- data = yield Util.get_string_from_uri(RadioBrowser.radio_station_languages);
+ data = yield Util.get_string_from_uri(Util.get_random_server() + RadioBrowser.radio_station_languages);
parser.load_from_data (data);
root = parser.get_root ();
items = root.get_array ();
@@ -53,7 +53,7 @@ namespace Gradio{
}
// Countries
- data = yield Util.get_string_from_uri(RadioBrowser.radio_station_countries);
+ data = yield Util.get_string_from_uri(Util.get_random_server() + RadioBrowser.radio_station_countries);
parser.load_from_data (data);
root = parser.get_root ();
items = root.get_array ();
@@ -67,7 +67,7 @@ namespace Gradio{
}
// States
- data = yield Util.get_string_from_uri(RadioBrowser.radio_station_states);
+ data = yield Util.get_string_from_uri(Util.get_random_server() + RadioBrowser.radio_station_states);
parser.load_from_data (data);
root = parser.get_root ();
items = root.get_array ();
@@ -81,7 +81,7 @@ namespace Gradio{
}
// Tags
- data = yield Util.get_string_from_uri(RadioBrowser.radio_station_tags);
+ data = yield Util.get_string_from_uri(Util.get_random_server() + RadioBrowser.radio_station_tags);
parser.load_from_data (data);
root = parser.get_root ();
items = root.get_array ();

View File

@ -0,0 +1,41 @@
$OpenBSD: patch-src_gradio-library_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-library.vala
--- src/gradio-library.vala.orig
+++ src/gradio-library.vala
@@ -105,7 +105,7 @@ namespace Gradio{
message("Initialize database...");
string query = """
- CREATE TABLE "library" ('station_id' INTEGER, 'collection_id' INTEGER);
+ CREATE TABLE "library" ('station_id' TEXT, 'collection_id' INTEGER);
CREATE TABLE "collections" ('collection_id' INTEGER, 'collection_name' TEXT)
""";
@@ -303,7 +303,7 @@ namespace Gradio{
case Sqlite.ROW:
string station_id = stmt.column_text(0);
- RadioStation station = yield Util.get_station_by_id(int.parse(station_id));
+ RadioStation station = yield Util.get_station_by_id(station_id);
if (station != null) {
progress_dialog.text = "Exporting \"" + station.title + "\" ...";
string address = yield station.get_stream_address();
@@ -359,7 +359,7 @@ namespace Gradio{
string line;
while ((line = dis.read_line (null)) != null) {
- RadioStation station = yield Util.get_station_by_id(int.parse(line));
+ RadioStation station = yield Util.get_station_by_id(line);
if(station != null){
add_radio_station(station);
@@ -438,7 +438,7 @@ namespace Gradio{
case Sqlite.DONE:
break;
case Sqlite.ROW:
- RadioStation station = yield Util.get_station_by_id(int.parse(stmt.column_text(0)));
+ RadioStation station = yield Util.get_station_by_id(stmt.column_text(0));
result.add_item(station);
break;
default:

View File

@ -0,0 +1,59 @@
$OpenBSD: patch-src_gradio-radio-browser_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-radio-browser.vala
--- src/gradio-radio-browser.vala.orig
+++ src/gradio-radio-browser.vala
@@ -17,35 +17,34 @@
namespace Gradio{
public class RadioBrowser{
- private const string radio_browser = "https://www.radio-browser.info/webservice/json";
- public const string radio_stations_by_name = radio_browser + "/stations/byname/";
- public const string radio_stations_by_codec = radio_browser + "/stations/bycodec/";
- public const string radio_stations_by_country = radio_browser + "/stations/bycountry/";
- public const string radio_stations_by_state = radio_browser + "/stations/bystate/";
- public const string radio_stations_by_language = radio_browser + "/stations/bylanguage/";
- public const string radio_stations_by_tag = radio_browser + "/stations/bytag/";
- public const string radio_stations_by_id = radio_browser + "/stations/byid/";
+ public const string radio_stations_by_name = "/json/stations/byname/";
+ public const string radio_stations_by_codec = "/json/stations/bycodec/";
+ public const string radio_stations_by_country = "/json/stations/bycountry/";
+ public const string radio_stations_by_state = "/json/stations/bystate/";
+ public const string radio_stations_by_language = "/json/stations/bylanguage/";
+ public const string radio_stations_by_tag = "/json/stations/bytag/";
+ public const string radio_stations_by_id = "/json/stations/byuuid/";
- public const string radio_station_vote = radio_browser + "/vote/";
- public const string radio_station_stream_url = "https://www.radio-browser.info/webservice/v2/json/url/";
- public const string radio_station_search = radio_browser + "/stations/search";
- public const string radio_station_languages = radio_browser + "/languages";
- public const string radio_station_countries = radio_browser + "/countries";
- public const string radio_station_codecs = radio_browser + "/codecs";
- public const string radio_station_states = radio_browser + "/states";
- public const string radio_station_tags = radio_browser + "/tags";
+ public const string radio_station_vote = "/json/vote/";
+ public const string radio_station_stream_url = "/json/url/";
+ public const string radio_station_search = "/json/stations/search";
+ public const string radio_station_languages = "/json/languages";
+ public const string radio_station_countries = "/json/countries";
+ public const string radio_station_codecs = "/json/codecs";
+ public const string radio_station_states = "/json/states";
+ public const string radio_station_tags = "/json/tags";
public static string most_votes(int count){
- return radio_browser + "/stations/topvote/" + count.to_string();
+ return "/json/stations/topvote/" + count.to_string();
}
public static string recently_clicked(int count){
- return radio_browser + "/stations/lastclick/" + count.to_string();
+ return "/json/stations/lastclick/" + count.to_string();
}
public static string most_clicks(int count){
- return radio_browser + "/stations/topclick/" + count.to_string();
+ return "/json/stations/topclick/" + count.to_string();
}
}

View File

@ -0,0 +1,69 @@
$OpenBSD: patch-src_gradio-radio-station_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-radio-station.vala
--- src/gradio-radio-station.vala.orig
+++ src/gradio-radio-station.vala
@@ -210,21 +210,17 @@ namespace Gradio{
_title = radio_station_data.get_string_member("name");
_homepage = radio_station_data.get_string_member("homepage");
_language = radio_station_data.get_string_member("language");
- _id = radio_station_data.get_string_member("id");
+ _id = radio_station_data.get_string_member("stationuuid");
_icon_address = radio_station_data.get_string_member("favicon");
- _country = radio_station_data.get_string_member("country");
+ _country = radio_station_data.get_string_member("countrycode");
_tags = radio_station_data.get_string_member("tags");
_state = radio_station_data.get_string_member("state");
- _votes = radio_station_data.get_string_member("votes");
+ _votes = radio_station_data.get_int_member("votes").to_string();
_codec = radio_station_data.get_string_member("codec");
- _bitrate = radio_station_data.get_string_member("bitrate");
- _clickcount = radio_station_data.get_string_member("clickcount");
+ _bitrate = radio_station_data.get_int_member("bitrate").to_string();
+ _clickcount = radio_station_data.get_int_member("clickcount").to_string();
_clicktimestamp = radio_station_data.get_string_member("clicktimestamp");
-
- if(radio_station_data.get_string_member("lastcheckok") == "1")
- _is_broken = false;
- else
- _is_broken = true;
+ _is_broken = ! radio_station_data.get_boolean_member("lastcheckok");
}
// Returns the playable url for the station
@@ -234,7 +230,7 @@ namespace Gradio{
string data = "";
- Util.get_string_from_uri.begin(RadioBrowser.radio_station_stream_url + _id, (obj, res) => {
+ Util.get_string_from_uri.begin(Util.get_random_server() + RadioBrowser.radio_station_stream_url + _id, (obj, res) => {
string result = Util.get_string_from_uri.end(res);
if(result != null)
@@ -251,7 +247,7 @@ namespace Gradio{
var root = parser.get_root ();
if(root != null){
var radio_station_data = root.get_object ();
- if(radio_station_data.get_string_member("ok") == "true"){
+ if(radio_station_data.get_boolean_member("ok")){
url = radio_station_data.get_string_member("url");
}
}
@@ -268,7 +264,7 @@ namespace Gradio{
Json.Parser parser = new Json.Parser ();
bool vote = false;
- Util.get_string_from_uri.begin(RadioBrowser.radio_station_vote + id, (obj, res) => {
+ Util.get_string_from_uri.begin(Util.get_random_server() + RadioBrowser.radio_station_vote + id, (obj, res) => {
string data = Util.get_string_from_uri.end(res);
try{
@@ -277,7 +273,7 @@ namespace Gradio{
if(root != null){
var radio_station_data = root.get_object ();
- if(radio_station_data.get_string_member("ok") == "true"){
+ if(radio_station_data.get_boolean_member("ok")){
int v = int.parse(votes);
v++;
_votes=v.to_string();

View File

@ -0,0 +1,14 @@
$OpenBSD: patch-src_gradio-search-provider_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-search-provider.vala
--- src/gradio-search-provider.vala.orig
+++ src/gradio-search-provider.vala
@@ -55,7 +55,7 @@ namespace Gradio{
filter_table.insert("name", searchterm);
filter_table.insert("order", "votes");
filter_table.insert("reverse", "true");
- yield station_provider.get_stations("http://www.radio-browser.info/webservice/json/stations/search", filter_table);
+ yield station_provider.get_stations(Util.get_random_server() + RadioBrowser.radio_station_search, filter_table);
string[] results = {};
for(int i = 0; i < station_model.get_n_items(); i++){

View File

@ -0,0 +1,14 @@
$OpenBSD: patch-src_gradio-searchbar_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-searchbar.vala
--- src/gradio-searchbar.vala.orig
+++ src/gradio-searchbar.vala
@@ -224,7 +224,7 @@ namespace Gradio{
filter_table.insert("reverse", (!App.settings.sort_ascending).to_string());
filter_table.insert("limit", App.settings.max_search_results.to_string());
- station_provider.get_stations.begin(RadioBrowser.radio_station_search, filter_table);
+ station_provider.get_stations.begin(Util.get_random_server() + RadioBrowser.radio_station_search, filter_table);
delayed_changed_id = 0;
return false;

View File

@ -0,0 +1,39 @@
$OpenBSD: patch-src_gradio-settings_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-settings.vala
--- src/gradio-settings.vala.orig
+++ src/gradio-settings.vala
@@ -29,7 +29,7 @@ namespace Gradio{
private bool _resume_playback_on_startup;
private bool _hide_broken_stations;
private bool _show_technical_information;
- private int _previous_station;
+ private string _previous_station;
private double _volume_position;
private int _window_height;
private int _window_width;
@@ -50,7 +50,7 @@ namespace Gradio{
_resume_playback_on_startup = settings.get_boolean("resume-playback-on-startup");
_hide_broken_stations = settings.get_boolean("hide-broken-stations");
_show_technical_information = settings.get_boolean("show-technical-information");
- _previous_station = settings.get_int("previous-station");
+ _previous_station = settings.get_string("previous-station");
_volume_position = settings.get_double("volume-position");
_window_height = settings.get_int("window-height");
_window_width = settings.get_int("window-width");
@@ -154,13 +154,13 @@ namespace Gradio{
}
}
- public int previous_station{
+ public string previous_station{
get{
return _previous_station;
}
set{
_previous_station = value;
- settings.set_int ("previous-station", value);
+ settings.set_string ("previous-station", value);
}
}

View File

@ -0,0 +1,52 @@
$OpenBSD: patch-src_gradio-utils_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/gradio-utils.vala
--- src/gradio-utils.vala.orig
+++ src/gradio-utils.vala
@@ -40,7 +40,7 @@ namespace Gradio{
}
public static bool check_database_connection(){
- var host = "www.radio-browser.info";
+ var host = "all.api.radio-browser.info";
try {
Resolver resolver = Resolver.get_default ();
@@ -53,6 +53,23 @@ namespace Gradio{
}
}
+ public static string get_random_server(){
+ var host = "radio-browser.info";
+ try {
+ Resolver resolver = Resolver.get_default ();
+ List<SrvTarget> targets = resolver.lookup_service ("api", "tcp", host, null);
+ var tgt = targets.nth_data(0);
+ if (tgt.get_port() == 443) {
+ return "https://" + tgt.get_hostname();
+ } else {
+ return "http://" + tgt.get_hostname();
+ }
+ } catch (Error e) {
+ critical (e.message);
+ return "fr1.api.radio-browser.info";
+ }
+ }
+
public static void add_stylesheet () {
var provider = new CssProvider ();
@@ -73,11 +90,11 @@ namespace Gradio{
return false;
}
- public static async RadioStation get_station_by_id(int id){
+ public static async RadioStation get_station_by_id(string id){
Json.Parser parser = new Json.Parser ();
RadioStation new_station = null;
- string data = yield Util.get_string_from_uri(RadioBrowser.radio_stations_by_id + id.to_string());
+ string data = yield Util.get_string_from_uri(Util.get_random_server() + RadioBrowser.radio_stations_by_id + id);
if(data != ""){
try{

View File

@ -0,0 +1,18 @@
$OpenBSD: patch-src_page_gradio-search-page_vala,v 1.1 2020/11/02 18:44:36 landry Exp $
Index: src/page/gradio-search-page.vala
--- src/page/gradio-search-page.vala.orig
+++ src/page/gradio-search-page.vala
@@ -77,9 +77,9 @@ namespace Gradio{
StationProvider recently_clicked_provider = new StationProvider(ref recently_clicked_model);
StationProvider most_clicks_provider = new StationProvider(ref most_clicks_model);
- most_votes_provider.get_stations.begin(RadioBrowser.most_votes(14), filter_table);
- recently_clicked_provider.get_stations.begin(RadioBrowser.recently_clicked(14), filter_table);
- most_clicks_provider.get_stations.begin(RadioBrowser.most_clicks(14), filter_table);
+ most_votes_provider.get_stations.begin(Util.get_random_server() + RadioBrowser.most_votes(14), filter_table);
+ recently_clicked_provider.get_stations.begin(Util.get_random_server() + RadioBrowser.recently_clicked(14), filter_table);
+ most_clicks_provider.get_stations.begin(Util.get_random_server() + RadioBrowser.most_clicks(14), filter_table);
most_votes_mainbox.set_model(most_votes_model);
recently_clicked_mainbox.set_model(recently_clicked_model);