#!/bin/env python import socket import random import urllib2 import json def get_radiobrowser_base_urls(): """ Get all base urls of all currently available radiobrowser servers Returns: list: a list of strings """ hosts = [] # get all hosts from DNS ips = socket.getaddrinfo('all.api.radio-browser.info', 80, 0, 0, socket.IPPROTO_TCP) for ip_tupple in ips: ip = ip_tupple[4][0] # do a reverse lookup on every one of the ips to have a nice name for it host_addr = socket.gethostbyaddr(ip) # add the name to a list if not already in there if host_addr[0] not in hosts: hosts.append(host_addr[0]) # sort list of names hosts.sort() # add "https://" in front to make it an url return list(map(lambda x: "https://" + x, hosts)) def downloadUri(uri, param): """ Download file with the correct headers set Returns: a string result """ paramEncoded = None if param != None: paramEncoded = json.dumps(param) print('Request to ' + uri + ' Params: ' + ','.join(param)) else: print('Request to ' + uri) req = urllib2.Request(uri, paramEncoded) #TODO: change the user agent to name your app and version req.add_header('User-Agent', 'MyApp/0.0.1') req.add_header('Content-Type', 'application/json') response = urllib2.urlopen(req) data=response.read() response.close() return data def downloadRadiobrowser(path, param): """ Download file with relative url from a random api server. Retry with other api servers if failed. Returns: a string result """ servers = get_radiobrowser_base_urls() random.shuffle(servers) i = 0 for server_base in servers: print('Random server: ' + server_base + ' Try: ' + str(i)) uri = server_base + path try: data = downloadUri(uri, param) return data except Exception as e: print("Unable to download from api url: " + uri, e) pass i += 1 return {} def downloadRadiobrowserStats(): stats = downloadRadiobrowser("/json/stats", None) return json.loads(stats) def downloadRadiobrowserStationsByCountry(countrycode): stations = downloadRadiobrowser("/json/stations/bycountrycodeexact/" + countrycode, None) return json.loads(stations) def downloadRadiobrowserStationsByName(name): stations = downloadRadiobrowser("/json/stations/search", {"name":name}) return json.loads(stations) # print list of names print("All available urls") print("------------------") for host in get_radiobrowser_base_urls(): print(host) print("") print("Stats") print("------------") print(json.dumps(downloadRadiobrowserStats(), indent=4))