From dcaf7870809765f72d8db607f769e105a48d4e71 Mon Sep 17 00:00:00 2001 From: edseldim Date: Sat, 2 Jul 2022 17:22:57 -0500 Subject: [PATCH] Added feature to select custom server from url --- .gitignore | 3 ++ speedtest.py | 83 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index f24cd99..28020b2 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ pip-log.txt #Mr Developer .mr.developer.cfg + +#Environment +speedtest-env diff --git a/speedtest.py b/speedtest.py index 186b529..a05fdf4 100755 --- a/speedtest.py +++ b/speedtest.py @@ -29,6 +29,8 @@ import threading import timeit import xml.parsers.expat +import requests + try: import gzip GZIP_BASE = gzip.GzipFile @@ -1237,7 +1239,21 @@ class Speedtest(object): return self.config - def get_servers(self, servers=None, exclude=None): + def json_to_xml(self,json_url=None): + if json_url: + r = requests.get(json_url) + if r.status_code == 200: + json_data = json.loads(r.text)[0] + message = '\n\n' + try: + message += f'' + except (KeyError,SyntaxError) as e: + pass + message += "\n\n\n" + return message.replace("&","").encode() + + + def get_servers(self, servers=None, exclude=None, custom_server=None): """Retrieve a the list of speedtest.net servers, optionally filtered to servers matching those specified in the ``servers`` argument """ @@ -1270,6 +1286,65 @@ class Speedtest(object): headers['Accept-Encoding'] = 'gzip' errors = [] + if custom_server: + serversxml = "".encode().join([self.json_to_xml(custom_server)]) + try: + try: + try: + root = ET.fromstring(serversxml) + except ET.ParseError: + e = get_exception() + raise SpeedtestServersError( + 'Malformed speedtest.net server list: %s' % e + ) + elements = etree_iter(root, '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: + attrib = server.attrib + except AttributeError: + attrib = dict(list(server.attributes.items())) + + if servers and int(attrib.get('id')) not in servers: + continue + + if (int(attrib.get('id')) in self.config['ignore_servers'] + or int(attrib.get('id')) in exclude): + continue + + try: + d = distance(self.lat_lon, + (float(attrib.get('lat')), + float(attrib.get('lon')))) + except Exception: + continue + + attrib['d'] = d + + try: + self.servers[d].append(attrib) + except KeyError: + self.servers[d] = [attrib] + + except ServersRetrievalError: + pass + + if (servers or exclude) and not self.servers: + raise NoMatchedServers() + + return self.servers + for url in urls: try: request = build_request( @@ -1299,9 +1374,8 @@ class Speedtest(object): if int(uh.code) != 200: raise ServersRetrievalError() - serversxml = ''.encode().join(serversxml_list) - + print(serversxml) printer('Servers XML:\n%s' % serversxml, debug=True) try: @@ -1784,6 +1858,7 @@ def parse_args(): help='Show the version number and exit') parser.add_argument('--debug', action='store_true', help=ARG_SUPPRESS, default=ARG_SUPPRESS) + parser.add_argument('--custom',help="Test with a custom server using its link") options = parser.parse_args() if isinstance(options, tuple): @@ -1916,7 +1991,7 @@ def shell(): if not args.mini: printer('Retrieving speedtest.net server list...', quiet) try: - speedtest.get_servers(servers=args.server, exclude=args.exclude) + speedtest.get_servers(servers=args.server, exclude=args.exclude,custom_server=args.custom) except NoMatchedServers: raise SpeedtestCLIError( 'No matched servers: %s' %