Add donwloaded megabytes and current download speed to the
download window
This commit is contained in:
50
threads.py
50
threads.py
@@ -1,12 +1,14 @@
|
||||
import asyncio
|
||||
from enum import Enum, auto
|
||||
from io import BytesIO
|
||||
from math import ceil
|
||||
import os.path
|
||||
from shutil import rmtree
|
||||
from time import time
|
||||
from zipfile import ZipFile
|
||||
import aiohttp
|
||||
import urllib3
|
||||
from PyQt5.QtCore import QThread
|
||||
from PyQt5.QtCore import QThread, pyqtSignal
|
||||
from constants import Constants, Database, ChecksumWhat
|
||||
from utilities import checksum_ok
|
||||
|
||||
@@ -30,23 +32,56 @@ class BaseDownloadThread(QThread):
|
||||
|
||||
|
||||
class DownloadThread(BaseDownloadThread):
|
||||
|
||||
progress = pyqtSignal(int, float)
|
||||
CHUNK = 1024**2
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.reason = 0
|
||||
|
||||
def __pretty_len(self, byte_obj):
|
||||
mega = len(byte_obj) / self.CHUNK
|
||||
if mega.is_integer():
|
||||
return int(mega)
|
||||
else:
|
||||
return ceil(mega)
|
||||
|
||||
def __get_download_speed(self, data, delta):
|
||||
return round(
|
||||
(len(data) / self.CHUNK) / delta,
|
||||
2
|
||||
)
|
||||
|
||||
def run(self):
|
||||
self.status = ThreadStatus.UNDEFINED
|
||||
raw_data = bytes(0)
|
||||
try:
|
||||
db = urllib3.PoolManager().request('GET', Database.LINK_LOC)
|
||||
except urllib3.exceptions.MaxRetryError: # No internet connection.
|
||||
db = urllib3.PoolManager().request(
|
||||
'GET',
|
||||
Database.LINK_LOC,
|
||||
preload_content=False
|
||||
)
|
||||
while True:
|
||||
start = time()
|
||||
data = db.read(self.CHUNK)
|
||||
delta = time() - start
|
||||
if not data:
|
||||
break
|
||||
raw_data += data
|
||||
self.progress.emit(
|
||||
self.__pretty_len(raw_data),
|
||||
self.__get_download_speed(data, delta)
|
||||
)
|
||||
db.release_conn()
|
||||
except Exception: # No internet connection.
|
||||
db.release_conn()
|
||||
self.status = ThreadStatus.NO_CONNECTION_ERR
|
||||
return
|
||||
if db.status != 200:
|
||||
self.reason = db.reason
|
||||
self.status = ThreadStatus.BAD_DOWNLOAD_ERR
|
||||
return
|
||||
try:
|
||||
is_checksum_ok = checksum_ok(db.data, ChecksumWhat.FOLDER)
|
||||
is_checksum_ok = checksum_ok(raw_data, ChecksumWhat.FOLDER)
|
||||
except Exception:
|
||||
self.status = ThreadStatus.NO_CONNECTION_ERR
|
||||
return
|
||||
@@ -57,7 +92,8 @@ class DownloadThread(BaseDownloadThread):
|
||||
if os.path.exists(Constants.DATA_FOLDER):
|
||||
rmtree(Constants.DATA_FOLDER)
|
||||
try:
|
||||
with ZipFile(BytesIO(db.data)) as zipped:
|
||||
self.progress.emit(Constants.EXTRACTING_CODE, 0.0)
|
||||
with ZipFile(BytesIO(raw_data)) as zipped:
|
||||
zipped.extractall()
|
||||
except Exception:
|
||||
self.status = ThreadStatus.UNKNOWN_ERR
|
||||
|
||||
Reference in New Issue
Block a user