diff --git a/constants.py b/constants.py index 0057942..59b0656 100644 --- a/constants.py +++ b/constants.py @@ -52,6 +52,8 @@ class Messages: NO_CONNECTION_MSG = "Unable to establish an internet connection." BAD_DOWNLOAD = "Something went wrong" BAD_DOWNLOAD_MSG = "Something went wrong with the downaload.\nCheck your internet connection and try again." + SLOW_CONN = "Slow internet connection" + SLOW_CONN_MSG = "Your internet connection is unstable or too slow." class Signal: diff --git a/deploy/Linux/requirements_lin.txt b/deploy/Linux/requirements_lin.txt index e4d9f51..98560a7 100644 --- a/deploy/Linux/requirements_lin.txt +++ b/deploy/Linux/requirements_lin.txt @@ -1,6 +1,7 @@ -pandas==0.24.2 -aiohttp==3.5.4 -pygame==1.9.6 -QtAwesome==0.5.7 -urllib3==1.24.2 -PyQt5==5.12.2 +pandas>=0.24.2 +certifi>=2019.6.16 +aiohttp>=3.5.4 +pygame>=1.9.6 +QtAwesome>=0.5.7 +urllib3>=1.25.3 +PyQt5>=5.12.3 diff --git a/deploy/Windows/requirements_win.txt b/deploy/Windows/requirements_win.txt index 2b1e420..98560a7 100644 --- a/deploy/Windows/requirements_win.txt +++ b/deploy/Windows/requirements_win.txt @@ -1,36 +1,7 @@ -aiohttp==3.5.4 -altgraph==0.16.1 -asn1crypto==0.24.0 -async-timeout==3.0.1 -attrs==19.1.0 -certifi==2019.3.9 -cffi==1.11.5 -chardet==3.0.4 -cryptography==2.3.1 -Cython==0.29.6 -future==0.16.0 -idna==2.7 -intel-openmp==2019.0 -macholib==1.11 -multidict==4.5.2 -numpy==1.15.2 -pandas==0.23.4 -pefile==2018.8.8 -pycparser==2.19 -pydub==0.23.0 -pygame==1.9.4 -PyInstaller==3.4 -pyOpenSSL==18.0.0 -PyQt5==5.10.1 -PySocks==1.6.8 -python-dateutil==2.7.3 -pytz==2018.5 -pywin32-ctypes==0.2.0 -QtAwesome==0.5.0 -QtPy==1.5.1 -sip==4.19.8 -six==1.11.0 -urllib3==1.24 -win-inet-pton==1.0.1 -wincertstore==0.2 -yarl==1.3.0 +pandas>=0.24.2 +certifi>=2019.6.16 +aiohttp>=3.5.4 +pygame>=1.9.6 +QtAwesome>=0.5.7 +urllib3>=1.25.3 +PyQt5>=5.12.3 diff --git a/download_window.py b/download_window.py index 7d16728..763cdc8 100644 --- a/download_window.py +++ b/download_window.py @@ -37,6 +37,10 @@ class DownloadWindow(QWidget, Ui_Download_window): text=Messages.BAD_DOWNLOAD_MSG, connection=self.close) + self._slow_conn_msg = pop_up(self, title=Messages.SLOW_CONN, + text=Messages.SLOW_CONN_MSG, + connection=self.close) + self._download_thread = DownloadThread() self._download_thread.finished.connect(self._wait_close) self._download_thread.progress.connect(self._display_progress) @@ -49,7 +53,12 @@ class DownloadWindow(QWidget, Ui_Download_window): def _downlaod_format_str(self, n, speed): """Return a well-formatted string with downloaded MB and speed.""" - return f"Downloaded: {n} MB\nSpeed: {speed} MB/s" + ret = f"Downloaded: {n} MB\nSpeed: " + if speed == 0.0: + ret += "VERY SLOW" + else: + ret += f"{speed} MB/s" + return ret def show(self): """Extends QWidget.show. Set downloaded MB and speed to zero.""" @@ -86,6 +95,8 @@ class DownloadWindow(QWidget, Ui_Download_window): self._no_internet_msg.show() elif self._download_thread.status is ThreadStatus.BAD_DOWNLOAD_ERR: self._bad_db_download_msg.show() + elif self._download_thread.status is ThreadStatus.SLOW_CONN_ERR: + self._slow_conn_msg.show() else: self.close() diff --git a/threads.py b/threads.py index fc0a122..ed965f6 100644 --- a/threads.py +++ b/threads.py @@ -4,7 +4,7 @@ from io import BytesIO from math import ceil import os.path from shutil import rmtree -from time import time +from time import perf_counter from zipfile import ZipFile import aiohttp import urllib3 @@ -21,6 +21,11 @@ class ThreadStatus(Enum): UNKNOWN_ERR = auto() BAD_DOWNLOAD_ERR = auto() UNDEFINED = auto() + SLOW_CONN_ERR = auto() + + +class _SlowConnError(Exception): + pass class BaseDownloadThread(QThread): @@ -41,7 +46,7 @@ class DownloadThread(BaseDownloadThread): """Subclass BaseDownloadThread. Download the database, images and audio samples.""" progress = pyqtSignal(int, float) - _CHUNK = 512 * 1024 + _CHUNK = 128 * 1024 _MEGA = 1024**2 def __init__(self): @@ -82,35 +87,38 @@ class DownloadThread(BaseDownloadThread): preload_content=False, timeout=4.0 ) + start = perf_counter() while True: - start = time() try: data = self._db.read(self._CHUNK) except Exception: - raise + raise _SlowConnError else: - delta = time() - start + delta = perf_counter() - start if not data: break raw_data += data self.progress.emit( self._pretty_len(raw_data), - self._get_download_speed(data, delta) + self._get_download_speed(raw_data, delta) ) if self._exit_call: self._exit_call = False self._db.release_conn() return - except Exception: # No internet connection. + except Exception as e: # No (or bad) internet connection. self._db.release_conn() - self.status = ThreadStatus.NO_CONNECTION_ERR + if isinstance(e, _SlowConnError): + self.status = ThreadStatus.SLOW_CONN_ERR + else: + self.status = ThreadStatus.NO_CONNECTION_ERR return if self._db.status != 200: self.status = ThreadStatus.BAD_DOWNLOAD_ERR return try: is_checksum_ok = checksum_ok(raw_data, ChecksumWhat.FOLDER) - except Exception: + except Exception: # checksum_ok unable to connect to the reference. self.status = ThreadStatus.NO_CONNECTION_ERR return else: