Support JSON server list in addition to XML server list(s)
The JSON server list (https://www.speedtest.net/api/js/servers) is what the Speedtest.net web interface currently uses.
This commit is contained in:
parent
ca4f4a3222
commit
0096adccf7
66
speedtest.py
66
speedtest.py
|
|
@ -1286,6 +1286,7 @@ class Speedtest(object):
|
|||
)
|
||||
|
||||
urls = [
|
||||
'https://www.speedtest.net/api/js/servers',
|
||||
'://www.speedtest.net/speedtest-servers-static.php',
|
||||
'http://c.speedtest.net/speedtest-servers-static.php',
|
||||
'://www.speedtest.net/speedtest-servers.php',
|
||||
|
|
@ -1311,6 +1312,10 @@ class Speedtest(object):
|
|||
raise ServersRetrievalError()
|
||||
|
||||
stream = get_response_stream(uh)
|
||||
try:
|
||||
is_json = uh.headers.getheader('content-type').startswith('application/json')
|
||||
except AttributeError:
|
||||
is_json = uh.getheader('content-type').startswith('application/json')
|
||||
|
||||
serversxml_list = []
|
||||
while 1:
|
||||
|
|
@ -1328,37 +1333,48 @@ class Speedtest(object):
|
|||
raise ServersRetrievalError()
|
||||
|
||||
serversxml = ''.encode().join(serversxml_list)
|
||||
attriblist = []
|
||||
|
||||
printer('Servers XML:\n%s' % serversxml, debug=True)
|
||||
if is_json:
|
||||
printer('Servers JSON:\n%s' % serversxml, debug=True)
|
||||
try:
|
||||
attriblist = json.loads(serversxml)
|
||||
except (ValueError, json.JSONDecodeError):
|
||||
raise ServersRetrievalError()
|
||||
|
||||
else:
|
||||
printer('Servers XML:\n%s' % serversxml, debug=True)
|
||||
|
||||
try:
|
||||
try:
|
||||
try:
|
||||
root = ET.fromstring(serversxml)
|
||||
except ET.ParseError:
|
||||
e = get_exception()
|
||||
raise SpeedtestServersError(
|
||||
'Malformed speedtest.net server list: %s' % e
|
||||
)
|
||||
elements = root.getiterator('server')
|
||||
except AttributeError:
|
||||
try:
|
||||
root = ET.fromstring(serversxml)
|
||||
except ET.ParseError:
|
||||
e = get_exception()
|
||||
raise SpeedtestServersError(
|
||||
'Malformed speedtest.net server list: %s' % e
|
||||
)
|
||||
elements = root.getiterator('server')
|
||||
except AttributeError:
|
||||
try:
|
||||
root = DOM.parseString(serversxml)
|
||||
except ExpatError:
|
||||
e = get_exception()
|
||||
raise SpeedtestServersError(
|
||||
'Malformed speedtest.net server list: %s' % e
|
||||
)
|
||||
elements = root.getElementsByTagName('server')
|
||||
except (SyntaxError, xml.parsers.expat.ExpatError):
|
||||
raise ServersRetrievalError()
|
||||
|
||||
for server in elements:
|
||||
try:
|
||||
root = DOM.parseString(serversxml)
|
||||
except ExpatError:
|
||||
e = get_exception()
|
||||
raise SpeedtestServersError(
|
||||
'Malformed speedtest.net server list: %s' % e
|
||||
)
|
||||
elements = root.getElementsByTagName('server')
|
||||
except (SyntaxError, xml.parsers.expat.ExpatError):
|
||||
raise ServersRetrievalError()
|
||||
|
||||
for server in elements:
|
||||
try:
|
||||
attrib = server.attrib
|
||||
except AttributeError:
|
||||
attrib = dict(list(server.attributes.items()))
|
||||
attrib = server.attrib
|
||||
except AttributeError:
|
||||
attrib = dict(list(server.attributes.items()))
|
||||
attriblist.append(attrib)
|
||||
|
||||
for attrib in attriblist:
|
||||
if servers and int(attrib.get('id')) not in servers:
|
||||
continue
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue