harbour-allradio/qml/items/RadioBrowser.qml
2025-06-07 19:05:22 +02:00

143 lines
5.5 KiB
QML

// properties:
// -----------
// server - selected server name)
// serverUrl - Url of the selected server
// stations - Number of stations in selected server
// tags - Number of tags in selected server
// countries - Number of countries in selected server
// count - Number of servers in model
// model - Model containing list of servers (if you want to manually choose server)
// --------------------------------------------------------------------------------
// functions:
// ----------
// getList - Refresh the ListModel and add a random url to server
// getRandom - Get a random url from the ListModel and add url to server
// ---------------------------------------------------------------------
import QtQuick 2.0
import "../models"
Item {
property string _useragent: "AllRadio/2.0.0 (test) (SailfishOS; Linux) nesnomis@gmail.com"
property int _tags: 0
property int _countries: 0
// Properties to be used in application -------------------------------------------------
property ListModel serversModel : ListModel { id: serversModel }
property ListModel votedModel : ListModel {id: votedModel}
property CountryListModel countriesModel : CountryListModel {id:countriesModel}
//property TagListModel tagsModel : TagListModel {id:tagsModel}
property string serverUrl: ""
property string server: ""
property bool online: false
property bool voted: false
property int stationCount: 0
property int tagCount: 0
//property int viewTagCount: tagsModel.maxCount
property int countryCount: 0
property bool loading: stationCount !== 0 && tagCount !== 0 && countryCount !== 0 ? false : true
property string lookup: "http://all.api.radio-browser.info/json/servers"
// ---------------------------------------------------------------------------------------
onOnlineChanged: {
if (online && serverUrl.length > 7) {
countriesModel.source = serverUrl + "/xml/countrycodes?hidebroken=true"
} else getRandom()
}
// Not used?!?!?
/* function getServer(s,u) {
stationCount = 0
tagCount = 0
countryCount = 0
server = s
serverUrl = u
getStats()
} */
// Choose a random server from available servers
function getRandom() {
if (serversModel.count > 0) {
var random = Math.floor((Math.random() * serversModel.count) + 1) - 1
serverUrl = serversModel.get(random).serverUrl
server = serversModel.get(random).server
getStats()
}
}
// Get a list of available Radio Community Servers.
function getList() {
var req = new XMLHttpRequest();
req.onreadystatechange = function () {
if (req.readyState === 4 && req.status < 300) {
var obj = JSON.parse(req.responseText)
serversModel.clear()
for (var key in obj) {
addIfNotExist(obj[key])
}
getRandom()
} else if (req.readyState === 4 && req.status > 299) {lookup="http://de2.api.radio-browser.info/json/servers";getList();}
};
req.open("get", lookup);
req.setRequestHeader('User-Agent',_useragent);
req.send();
}
// Add available server to listmodel
function addIfNotExist(server) {
for (var i = 0; i < serversModel.count; i++) {
if (serversModel.get(i).server === server.name) {
return
}
}
serversModel.append({"serverUrl": "http://"+server.name,"server": server.name})
}
// ----------------------------------------------
// Station online?
function getStats() {
var req = new XMLHttpRequest();
req.onreadystatechange = function () {
if (req.readyState === 4 && req.status < 300) {
var obj = req.response.split("{").pop();
obj = JSON.parse("{"+obj)
if (obj.status === "OK") {
stationCount = obj.stations-obj.stations_broken
tagCount = obj.tags
if (obj.status === "OK") {online = true} else {online = false}
}
}
};
req.open("get", serverUrl+"/json/stats");
req.setRequestHeader('User-Agent',_useragent);
req.send();
}
// ----------------------------------------------
// Vote/like for radio station on community radio browser.
function upVote(stationuuid,returnValue) {
var req = new XMLHttpRequest();
var ret = false
req.onreadystatechange = function () {
if (req.readyState === 4 && req.status === 200) {
var obj = req.response.split("{").pop();
obj = JSON.parse("{"+obj)
if (obj.ok) {
if (obj.ok) {returnValue=true;console.log(" ****** VOTED *****")} else {returnValue=false;console.log(" ****** NOT VOTED *****")}
}
return ret
}
};
req.open("get", serverUrl+"/json/vote/"+stationuuid);
req.setRequestHeader('User-Agent',_useragent);
req.send();
}
// ----------------------------------------------
// Load model with country names.
CountryNameModel {id: countryNameModel}
function getCountryName(land) { // Get translated countryname
for(var i = 0; i < countryNameModel.count; i++) {
var current = countryNameModel.get(i);
if(land === current.code) {
return countryNameModel.countryname(i)
}
}
}
}