@@ -35,6 +35,23 @@ DownloadState::Status getDownloadStatus(QString status)
3535 return DownloadState::UNKNOWN;
3636}
3737
38+ QString formatTimeRemaining (double seconds)
39+ {
40+ int totalSec = int (seconds);
41+ int hours = totalSec / 3600 ;
42+ int minutes = (totalSec % 3600 ) / 60 ;
43+ int secs = totalSec % 60 ;
44+ if (hours > 0 )
45+ return QString (" %1:%2:%3" )
46+ .arg (hours, 2 , 10 , QChar (' 0' ))
47+ .arg (minutes, 2 , 10 , QChar (' 0' ))
48+ .arg (secs, 2 , 10 , QChar (' 0' ));
49+ else
50+ return QString (" %1:%2" )
51+ .arg (minutes, 2 , 10 , QChar (' 0' ))
52+ .arg (secs, 2 , 10 , QChar (' 0' ));
53+ }
54+
3855} // unnamed namespace
3956
4057bool DownloadState::isLateUpdateInfo (const DownloadInfo& info) const
@@ -49,11 +66,17 @@ bool DownloadState::isLateUpdateInfo(const DownloadInfo& info) const
4966void DownloadState::update (const DownloadInfo& info)
5067{
5168 const auto completedBytes = info[" completedLength" ].toDouble ();
52- const double percentage = completedBytes / info[" totalLength" ].toDouble ();
69+ const double totalBytes = info[" totalLength" ].toDouble ();
70+ const double percentage = completedBytes / totalBytes;
5371
5472 progress = QString::number (100 * percentage, ' g' , 3 ).toDouble ();
5573 completedLength = convertToUnits (completedBytes);
56- downloadSpeed = convertToUnits (info[" downloadSpeed" ].toDouble ()) + " /s" ;
74+ double speedVal = info[" downloadSpeed" ].toDouble ();
75+ downloadSpeed = convertToUnits (speedVal) + " /s" ;
76+ // Compute estimated time remaining
77+ double remainingSeconds = (speedVal > 0 ) ? ((totalBytes - completedBytes) / speedVal) : 0 ;
78+ estimatedTimeRemaining = (speedVal > 0 ) ? formatTimeRemaining (remainingSeconds)
79+ : " ---" ;
5780 if ( !isLateUpdateInfo (info) ) {
5881 status = getDownloadStatus (info[" status" ].toString ());
5982 }
@@ -229,12 +252,20 @@ DownloadInfo DownloadManager::getDownloadInfo(QString bookId) const
229252 const auto d = mp_downloader->getDownload (b.getDownloadId ());
230253 d->updateStatus (true );
231254
255+ // Calculate estimated time remaining.
256+ double total = d->getTotalLength ();
257+ double completed = d->getCompletedLength ();
258+ double speed = d->getDownloadSpeed (); // bytes per second
259+ double remainingSeconds = (speed > 0 ) ? ((total - completed) / speed) : 0 ;
260+ QString timeRemaining = (speed > 0 ) ? formatTimeRemaining (remainingSeconds) : " ---" ;
261+
232262 return {
233- { " status" , downloadStatus2QString (d->getStatus ()) },
234- { " completedLength" , QString::number (d->getCompletedLength ()) },
235- { " totalLength" , QString::number (d->getTotalLength ()) },
236- { " downloadSpeed" , QString::number (d->getDownloadSpeed ()) },
237- { " path" , QString::fromStdString (d->getPath ()) }
263+ { " status" , downloadStatus2QString (d->getStatus ()) },
264+ { " completedLength" , QString::number (d->getCompletedLength ()) },
265+ { " totalLength" , QString::number (d->getTotalLength ()) },
266+ { " downloadSpeed" , QString::number (d->getDownloadSpeed ()) },
267+ { " estimatedTimeRemaining" , timeRemaining },
268+ { " path" , QString::fromStdString (d->getPath ()) }
238269 };
239270}
240271
0 commit comments