From 682bb729b7c35f640f095cf148860864d87d69f7 Mon Sep 17 00:00:00 2001 From: artickl Date: Sat, 1 Jul 2023 19:27:25 -0700 Subject: [PATCH] Add an option to load server list from the local file. Example of the file provided --- server-list.txt | 15 +++++++++++++++ speedtest.py | 25 ++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 server-list.txt diff --git a/server-list.txt b/server-list.txt new file mode 100644 index 000000000..c7bfa9d01 --- /dev/null +++ b/server-list.txt @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/speedtest.py b/speedtest.py index 186b52929..5cdaaff87 100755 --- a/speedtest.py +++ b/speedtest.py @@ -1237,7 +1237,7 @@ def get_config(self): return self.config - def get_servers(self, servers=None, exclude=None): + def get_servers(self, servers=None, exclude=None, load_servers=None): """Retrieve a the list of speedtest.net servers, optionally filtered to servers matching those specified in the ``servers`` argument """ @@ -1326,6 +1326,14 @@ def get_servers(self, servers=None, exclude=None): except (SyntaxError, xml.parsers.expat.ExpatError): raise ServersRetrievalError() + #load from file if exist + printer('Servers File:\n%s' % load_servers, debug=True) + if load_servers is not None: + if os.path.isfile(load_servers): + serverfile = ET.parse(load_servers) + serverlist = serverfile.getroot() + elements = elements + list(set(serverlist[0])-set(elements)) + for server in elements: try: attrib = server.attrib @@ -1757,6 +1765,8 @@ def parse_args(): help='Suppress verbose output, only show basic ' 'information in JSON format. Speeds listed in ' 'bit/s and not affected by --bytes') + parser.add_argument('--load-servers', action='append', + help='Load list of servers from file') parser.add_argument('--list', action='store_true', help='Display a list of speedtest.net servers ' 'sorted by distance') @@ -1891,9 +1901,18 @@ def shell(): printer('Cannot retrieve speedtest configuration', error=True) raise SpeedtestCLIError(get_exception()) + if args.load_servers: + printer('Loading file with servers...', quiet) + if not os.path.isfile(args.load_servers[0]): + raise SystemExit('ERROR: Cannot load specified %s file' % args.load_servers) + + file = args.load_servers[0] + else: + file = None + if args.list: try: - speedtest.get_servers() + speedtest.get_servers(load_servers=file) except (ServersRetrievalError,) + HTTP_ERRORS: printer('Cannot retrieve speedtest server list', error=True) raise SpeedtestCLIError(get_exception()) @@ -1916,7 +1935,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, load_servers=file) except NoMatchedServers: raise SpeedtestCLIError( 'No matched servers: %s' %