Added feature to select custom server from url
This commit is contained in:
		
							parent
							
								
									22210ca352
								
							
						
					
					
						commit
						dcaf787080
					
				|  | @ -25,3 +25,6 @@ pip-log.txt | ||||||
| 
 | 
 | ||||||
| #Mr Developer | #Mr Developer | ||||||
| .mr.developer.cfg | .mr.developer.cfg | ||||||
|  | 
 | ||||||
|  | #Environment | ||||||
|  | speedtest-env | ||||||
|  |  | ||||||
							
								
								
									
										83
									
								
								speedtest.py
								
								
								
								
							
							
						
						
									
										83
									
								
								speedtest.py
								
								
								
								
							|  | @ -29,6 +29,8 @@ import threading | ||||||
| import timeit | import timeit | ||||||
| import xml.parsers.expat | import xml.parsers.expat | ||||||
| 
 | 
 | ||||||
|  | import requests | ||||||
|  | 
 | ||||||
| try: | try: | ||||||
|     import gzip |     import gzip | ||||||
|     GZIP_BASE = gzip.GzipFile |     GZIP_BASE = gzip.GzipFile | ||||||
|  | @ -1237,7 +1239,21 @@ class Speedtest(object): | ||||||
| 
 | 
 | ||||||
|         return self.config |         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 = '<?xml version="1.0" encoding="UTF-8"?>\n<settings>\n<servers>' | ||||||
|  |             try: | ||||||
|  |                 message += f'<server url="{json_data["url"]}" lat="{json_data["lat"]}" lon="{json_data["lon"]}" name="{json_data["name"]}" country="{json_data["country"]}" cc="{json_data["cc"]}" sponsor="{json_data["sponsor"]}" id="{json_data["id"]}" host="{json_data["host"]}" />' | ||||||
|  |             except (KeyError,SyntaxError) as e: | ||||||
|  |                 pass | ||||||
|  |             message += "\n</servers>\n</settings>\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 |         """Retrieve a the list of speedtest.net servers, optionally filtered | ||||||
|         to servers matching those specified in the ``servers`` argument |         to servers matching those specified in the ``servers`` argument | ||||||
|         """ |         """ | ||||||
|  | @ -1270,6 +1286,65 @@ class Speedtest(object): | ||||||
|             headers['Accept-Encoding'] = 'gzip' |             headers['Accept-Encoding'] = 'gzip' | ||||||
| 
 | 
 | ||||||
|         errors = [] |         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: |         for url in urls: | ||||||
|             try: |             try: | ||||||
|                 request = build_request( |                 request = build_request( | ||||||
|  | @ -1299,9 +1374,8 @@ class Speedtest(object): | ||||||
| 
 | 
 | ||||||
|                 if int(uh.code) != 200: |                 if int(uh.code) != 200: | ||||||
|                     raise ServersRetrievalError() |                     raise ServersRetrievalError() | ||||||
| 
 |  | ||||||
|                 serversxml = ''.encode().join(serversxml_list) |                 serversxml = ''.encode().join(serversxml_list) | ||||||
| 
 |                 print(serversxml) | ||||||
|                 printer('Servers XML:\n%s' % serversxml, debug=True) |                 printer('Servers XML:\n%s' % serversxml, debug=True) | ||||||
| 
 | 
 | ||||||
|                 try: |                 try: | ||||||
|  | @ -1784,6 +1858,7 @@ def parse_args(): | ||||||
|                         help='Show the version number and exit') |                         help='Show the version number and exit') | ||||||
|     parser.add_argument('--debug', action='store_true', |     parser.add_argument('--debug', action='store_true', | ||||||
|                         help=ARG_SUPPRESS, default=ARG_SUPPRESS) |                         help=ARG_SUPPRESS, default=ARG_SUPPRESS) | ||||||
|  |     parser.add_argument('--custom',help="Test with a custom server using its link") | ||||||
| 
 | 
 | ||||||
|     options = parser.parse_args() |     options = parser.parse_args() | ||||||
|     if isinstance(options, tuple): |     if isinstance(options, tuple): | ||||||
|  | @ -1916,7 +1991,7 @@ def shell(): | ||||||
|     if not args.mini: |     if not args.mini: | ||||||
|         printer('Retrieving speedtest.net server list...', quiet) |         printer('Retrieving speedtest.net server list...', quiet) | ||||||
|         try: |         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: |         except NoMatchedServers: | ||||||
|             raise SpeedtestCLIError( |             raise SpeedtestCLIError( | ||||||
|                 'No matched servers: %s' % |                 'No matched servers: %s' % | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue