68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
import re
|
|
import urllib
|
|
import logging
|
|
import json
|
|
import http.client
|
|
import struct
|
|
|
|
|
|
def get_radio_server_description(url):
|
|
p = re.compile('(https?\:\/\/[^\/]*)', re.IGNORECASE)
|
|
res = re.search(p, url)
|
|
base_url = res.group(1)
|
|
url_icecast = base_url + '/status-json.xsl'
|
|
url_shoutcast = base_url + '/stats?json=1'
|
|
title_server = None
|
|
try:
|
|
request = urllib.request.Request(url_shoutcast)
|
|
response = urllib.request.urlopen(request)
|
|
data = json.loads(response.read().decode("utf-8"))
|
|
title_server = data['servertitle']
|
|
logging.debug("TITLE FOUND SHOUTCAST: " + title_server)
|
|
except urllib.error.HTTPError:
|
|
pass
|
|
except http.client.BadStatusLine:
|
|
pass
|
|
except ValueError:
|
|
return False
|
|
|
|
if not title_server:
|
|
try:
|
|
request = urllib.request.Request(url_icecast)
|
|
response = urllib.request.urlopen(request)
|
|
data = json.loads(response.read().decode('utf-8',errors='ignore'),strict=False)
|
|
title_server = data['icestats']['source'][0]['server_name'] + ' - ' + data['icestats']['source'][0]['server_description']
|
|
logging.debug("TITLE FOUND ICECAST: " + title_server)
|
|
if not title_server:
|
|
title_server = url
|
|
except urllib.error.URLError:
|
|
title_server = url
|
|
except urllib.error.HTTPError:
|
|
return False
|
|
except http.client.BadStatusLine:
|
|
pass
|
|
return title_server
|
|
|
|
|
|
def get_radio_title(url):
|
|
request = urllib.request.Request(url, headers={'Icy-MetaData': 1})
|
|
try:
|
|
|
|
response = urllib.request.urlopen(request)
|
|
icy_metaint_header = int(response.headers['icy-metaint'])
|
|
if icy_metaint_header is not None:
|
|
response.read(icy_metaint_header)
|
|
|
|
metadata_length = struct.unpack('B', response.read(1))[0] * 16 # length byte
|
|
metadata = response.read(metadata_length).rstrip(b'\0')
|
|
logging.debug(metadata)
|
|
# extract title from the metadata
|
|
m = re.search(br"StreamTitle='([^']*)';", metadata)
|
|
if m:
|
|
title = m.group(1)
|
|
if title:
|
|
return title.decode()
|
|
except (urllib.error.URLError, urllib.error.HTTPError):
|
|
pass
|
|
return 'Impossible to get the music title'
|