Clean up download value calculations
This commit is contained in:
parent
85ee71b739
commit
5d6cb0e45d
@ -44,16 +44,19 @@ class DownloadItem(QObject):
|
|||||||
Attributes:
|
Attributes:
|
||||||
reply: The QNetworkReply associated with this download.
|
reply: The QNetworkReply associated with this download.
|
||||||
percentage: How many percent were downloaded successfully.
|
percentage: How many percent were downloaded successfully.
|
||||||
|
None if unknown.
|
||||||
bytes_done: How many bytes there are already downloaded.
|
bytes_done: How many bytes there are already downloaded.
|
||||||
bytes_total: The total count of bytes.
|
bytes_total: The total count of bytes.
|
||||||
|
None if the total is unknown.
|
||||||
speed: The current download speed, in bytes per second.
|
speed: The current download speed, in bytes per second.
|
||||||
|
remaining_time: The time remaining for the download.
|
||||||
|
None if not enough data is available yet.
|
||||||
fileobj: The file object to download the file to.
|
fileobj: The file object to download the file to.
|
||||||
filename: The filename of the download.
|
filename: The filename of the download.
|
||||||
is_cancelled: Whether the download was cancelled.
|
is_cancelled: Whether the download was cancelled.
|
||||||
speed_avg: A rolling average of speeds.
|
speed_avg: A rolling average of speeds.
|
||||||
_last_done: The count of bytes which where downloaded when calculating
|
_last_done: The count of bytes which where downloaded when calculating
|
||||||
the speed the last time.
|
the speed the last time.
|
||||||
_last_percentage: The remembered percentage for data_changed.
|
|
||||||
|
|
||||||
Signals:
|
Signals:
|
||||||
data_changed: The downloads metadata changed.
|
data_changed: The downloads metadata changed.
|
||||||
@ -78,9 +81,8 @@ class DownloadItem(QObject):
|
|||||||
"""
|
"""
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.reply = reply
|
self.reply = reply
|
||||||
self.bytes_done = None
|
|
||||||
self.bytes_total = None
|
self.bytes_total = None
|
||||||
self.speed = None
|
self.speed = 0
|
||||||
self.basename = '???'
|
self.basename = '???'
|
||||||
samples = int(self.SPEED_AVG_WINDOW *
|
samples = int(self.SPEED_AVG_WINDOW *
|
||||||
(1000 / self.SPEED_REFRESH_INTERVAL))
|
(1000 / self.SPEED_REFRESH_INTERVAL))
|
||||||
@ -89,8 +91,8 @@ class DownloadItem(QObject):
|
|||||||
self.filename = None
|
self.filename = None
|
||||||
self.is_cancelled = False
|
self.is_cancelled = False
|
||||||
self._do_delayed_write = False
|
self._do_delayed_write = False
|
||||||
self._last_done = None
|
self.bytes_done = 0
|
||||||
self._last_percentage = None
|
self._last_done = 0
|
||||||
reply.setReadBufferSize(16 * 1024 * 1024)
|
reply.setReadBufferSize(16 * 1024 * 1024)
|
||||||
reply.downloadProgress.connect(self.on_download_progress)
|
reply.downloadProgress.connect(self.on_download_progress)
|
||||||
reply.finished.connect(self.on_reply_finished)
|
reply.finished.connect(self.on_reply_finished)
|
||||||
@ -132,11 +134,7 @@ class DownloadItem(QObject):
|
|||||||
@property
|
@property
|
||||||
def percentage(self):
|
def percentage(self):
|
||||||
"""Property to get the current download percentage."""
|
"""Property to get the current download percentage."""
|
||||||
if self.bytes_total == -1:
|
if self.bytes_total == 0 or self.bytes_total is None:
|
||||||
return -1
|
|
||||||
elif self.bytes_total == 0:
|
|
||||||
return 0
|
|
||||||
elif self.bytes_done is None or self.bytes_total is None:
|
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
return 100 * self.bytes_done / self.bytes_total
|
return 100 * self.bytes_done / self.bytes_total
|
||||||
@ -144,12 +142,16 @@ class DownloadItem(QObject):
|
|||||||
@property
|
@property
|
||||||
def remaining_time(self):
|
def remaining_time(self):
|
||||||
"""Property to get the remaining download time in seconds."""
|
"""Property to get the remaining download time in seconds."""
|
||||||
if (self.bytes_total is None or self.bytes_total <= 0 or
|
if self.bytes_total is None or not self.speed_avg:
|
||||||
self.speed is None or not self.speed_avg):
|
# No average yet or we don't know the total size.
|
||||||
return None
|
return None
|
||||||
remaining_bytes = self.bytes_total - self.bytes_done
|
remaining_bytes = self.bytes_total - self.bytes_done
|
||||||
speed = sum(self.speed_avg) / len(self.speed_avg)
|
avg = sum(self.speed_avg) / len(self.speed_avg)
|
||||||
return remaining_bytes / speed
|
if avg == 0:
|
||||||
|
# Download stalled
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return remaining_bytes / avg
|
||||||
|
|
||||||
def bg_color(self):
|
def bg_color(self):
|
||||||
"""Background color to be shown."""
|
"""Background color to be shown."""
|
||||||
@ -220,6 +222,8 @@ class DownloadItem(QObject):
|
|||||||
bytes_done: How many bytes are downloaded.
|
bytes_done: How many bytes are downloaded.
|
||||||
bytes_total: How many bytes there are to download in total.
|
bytes_total: How many bytes there are to download in total.
|
||||||
"""
|
"""
|
||||||
|
if bytes_total == -1:
|
||||||
|
bytes_total = None
|
||||||
self.bytes_done = bytes_done
|
self.bytes_done = bytes_done
|
||||||
self.bytes_total = bytes_total
|
self.bytes_total = bytes_total
|
||||||
self.data_changed.emit()
|
self.data_changed.emit()
|
||||||
@ -268,15 +272,8 @@ class DownloadItem(QObject):
|
|||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def update_speed(self):
|
def update_speed(self):
|
||||||
"""Recalculate the current download speed."""
|
"""Recalculate the current download speed."""
|
||||||
if self._last_done is None:
|
delta = self.bytes_done - self._last_done
|
||||||
if self.bytes_done is None:
|
self.speed = delta * 1000 / self.SPEED_REFRESH_INTERVAL
|
||||||
self.speed = 0
|
|
||||||
else:
|
|
||||||
delta = self.bytes_done
|
|
||||||
self.speed = delta * 1000 / self.SPEED_REFRESH_INTERVAL
|
|
||||||
else:
|
|
||||||
delta = self.bytes_done - self._last_done
|
|
||||||
self.speed = delta * 1000 / self.SPEED_REFRESH_INTERVAL
|
|
||||||
self.speed_avg.append(self.speed)
|
self.speed_avg.append(self.speed)
|
||||||
self._last_done = self.bytes_done
|
self._last_done = self.bytes_done
|
||||||
self.data_changed.emit()
|
self.data_changed.emit()
|
||||||
|
Loading…
Reference in New Issue
Block a user