diff --git a/src/speedtest.py b/src/speedtest.py index 2b37a95..ce09395 100644 --- a/src/speedtest.py +++ b/src/speedtest.py @@ -30,10 +30,19 @@ def __init__(self, name, server, pingURL, dlURL, ulURL, **_): self.uploadURL = urljoin(server, ulURL) async def get_servers(): + print("Fetching servers...") async with aiohttp.ClientSession() as session: async with session.get("https://librespeed.org/backend-servers/servers.php") as response: - result = await response.json() - return list(map(lambda x: Server(**x), result)) + servers = await response.json() + servers = list(map(lambda x: Server(**x), servers)) + + await asyncio.gather(*[check_server(s) for s in servers]) + + servers = list(filter(lambda s: s.ping != -1, servers)) + + servers.sort(key=lambda s: s.ping) + + return servers class GarbageReader(io.IOBase): def __init__(self, read_callback=None): @@ -66,6 +75,26 @@ def read(self, size=None): return garbage[old_pos:self.pos] +async def check_server(server): + async with aiohttp.ClientSession() as session: + try: + start = time.time() + task = asyncio.create_task(session.get(server.pingURL, headers=headers)) + + while not task.done(): + if time.time() - start > 1: + task.cancel() + server.ping = -1 + return + await asyncio.sleep(0) + + task.result().close() + server.ping = time.time() - start + return + except aiohttp.ClientError: + server.ping = -1 + return + async def ping(server): #TODO: jitter and other stuff async with aiohttp.ClientSession() as session: pings = []