mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-02-02 01:44:26 +00:00
made ETA calculation more reliable
This commit is contained in:
parent
92541b779c
commit
80f61880b7
@ -20,6 +20,7 @@
|
|||||||
- FEATURE: Added a way to link against static libtorrent (useful for deb packages)
|
- FEATURE: Added a way to link against static libtorrent (useful for deb packages)
|
||||||
- BUGFIX: Progress of paused torrents is now correct on restart
|
- BUGFIX: Progress of paused torrents is now correct on restart
|
||||||
- BUGFIX: Progress column gets sorted on restart it is was during last execution
|
- BUGFIX: Progress column gets sorted on restart it is was during last execution
|
||||||
|
- BUGFIX: Made ETA more reliable using stats instead of instant values
|
||||||
- COSMETIC: Redesigned torrent properties a little
|
- COSMETIC: Redesigned torrent properties a little
|
||||||
- COSMETIC: Redesigned options a little
|
- COSMETIC: Redesigned options a little
|
||||||
- COSMETIC: Display more logs messages concerning features
|
- COSMETIC: Display more logs messages concerning features
|
||||||
|
3
TODO
3
TODO
@ -45,4 +45,5 @@
|
|||||||
- Allow the user to see when peers were blocked thanks to IPFilter. Maybe in a file in order not to spam the GUI.
|
- Allow the user to see when peers were blocked thanks to IPFilter. Maybe in a file in order not to spam the GUI.
|
||||||
- Allow to scan multiple directories
|
- Allow to scan multiple directories
|
||||||
- Fix all (or almost all) opened bugs in bug tracker
|
- Fix all (or almost all) opened bugs in bug tracker
|
||||||
- Fix sorting with Qt 4.3 - Reported to Trolltech, waiting for fix
|
- Fix sorting with Qt 4.3 - Reported to Trolltech, waiting for fix
|
||||||
|
- update sorting when a new torrent is added
|
@ -534,7 +534,7 @@ void GUI::updateDlList(bool force){
|
|||||||
if(torrentStatus.download_payload_rate > 0){
|
if(torrentStatus.download_payload_rate > 0){
|
||||||
// Display "Downloading" status when connecting if download speed > 0
|
// Display "Downloading" status when connecting if download speed > 0
|
||||||
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading...")));
|
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading...")));
|
||||||
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)((ti.total_size()-torrentStatus.total_done)/(double)torrentStatus.download_payload_rate)));
|
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)BTSession.getETA(fileHash)));
|
||||||
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole);
|
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole);
|
||||||
setRowColor(row, "green");
|
setRowColor(row, "green");
|
||||||
}else{
|
}else{
|
||||||
@ -552,7 +552,7 @@ void GUI::updateDlList(bool force){
|
|||||||
if(torrentStatus.download_payload_rate > 0){
|
if(torrentStatus.download_payload_rate > 0){
|
||||||
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading...")));
|
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Downloading...")));
|
||||||
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole);
|
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/downloading.png")), Qt::DecorationRole);
|
||||||
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)((ti.total_size()-torrentStatus.total_done)/(double)torrentStatus.download_payload_rate)));
|
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)BTSession.getETA(fileHash)));
|
||||||
setRowColor(row, "green");
|
setRowColor(row, "green");
|
||||||
}else{
|
}else{
|
||||||
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Stalled", "i.e: State of a torrent whose download speed is 0kb/s")));
|
DLListModel->setData(DLListModel->index(row, STATUS), QVariant(tr("Stalled", "i.e: State of a torrent whose download speed is 0kb/s")));
|
||||||
@ -694,8 +694,8 @@ void GUI::sortDownloadList(int index, Qt::SortOrder startSortOrder, bool fromLoa
|
|||||||
default:
|
default:
|
||||||
sortDownloadListString(index, sortOrder);
|
sortDownloadListString(index, sortOrder);
|
||||||
}
|
}
|
||||||
QSettings settings("qBittorrent", "qBittorrent");
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
settings.setValue("DownloadListSortedCol", QString(misc::toString(index).c_str())+sortOrderLetter);
|
settings.setValue("DownloadListSortedCol", QString(misc::toString(index).c_str())+sortOrderLetter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Toggle Main window visibility
|
// Toggle Main window visibility
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "downloadThread.h"
|
#include "downloadThread.h"
|
||||||
|
|
||||||
|
#define ETAS_MAX_VALUES 5
|
||||||
|
|
||||||
// Main constructor
|
// Main constructor
|
||||||
bittorrent::bittorrent(){
|
bittorrent::bittorrent(){
|
||||||
// To avoid some exceptions
|
// To avoid some exceptions
|
||||||
@ -51,11 +53,6 @@ bittorrent::bittorrent(){
|
|||||||
connect(downloader, SIGNAL(downloadFinished(const QString&, const QString&, int, const QString&)), this, SLOT(processDownloadedFile(const QString&, const QString&, int, const QString&)));
|
connect(downloader, SIGNAL(downloadFinished(const QString&, const QString&, int, const QString&)), this, SLOT(processDownloadedFile(const QString&, const QString&, int, const QString&)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void bittorrent::resumeUnfinishedTorrents(){
|
|
||||||
// Resume unfinished torrents
|
|
||||||
resumeUnfinished();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Main destructor
|
// Main destructor
|
||||||
bittorrent::~bittorrent(){
|
bittorrent::~bittorrent(){
|
||||||
disableDirectoryScanning();
|
disableDirectoryScanning();
|
||||||
@ -64,6 +61,40 @@ bittorrent::~bittorrent(){
|
|||||||
delete s;
|
delete s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bittorrent::resumeUnfinishedTorrents(){
|
||||||
|
// Resume unfinished torrents
|
||||||
|
resumeUnfinished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void bittorrent::updateETAs(){
|
||||||
|
std::vector<torrent_handle> handles = s->get_torrents();
|
||||||
|
for(unsigned int i=0; i<handles.size(); ++i){
|
||||||
|
torrent_handle h = handles[i];
|
||||||
|
if(h.is_valid()){
|
||||||
|
QString hash = QString(misc::toString(h.info_hash()).c_str());
|
||||||
|
QList<long> listEtas = ETAstats.value(hash, QList<long>());
|
||||||
|
if(listEtas.size() == ETAS_MAX_VALUES){
|
||||||
|
long moy = 0;
|
||||||
|
long val;
|
||||||
|
foreach(val, listEtas){
|
||||||
|
moy += val;
|
||||||
|
}
|
||||||
|
ETAs[hash] = (long) ((double)moy/(double)ETAS_MAX_VALUES);
|
||||||
|
ETAstats[hash] = QList<long>();
|
||||||
|
}else{
|
||||||
|
torrent_status torrentStatus = h.status();
|
||||||
|
torrent_info ti = h.get_torrent_info();
|
||||||
|
listEtas << (long)((ti.total_size()-torrentStatus.total_done)/(double)torrentStatus.download_payload_rate);
|
||||||
|
ETAstats[hash] = listEtas;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long bittorrent::getETA(QString hash) const{
|
||||||
|
return ETAs.value(hash, -1);
|
||||||
|
}
|
||||||
|
|
||||||
// Return the torrent handle, given its hash
|
// Return the torrent handle, given its hash
|
||||||
torrent_handle bittorrent::getTorrentHandle(const QString& hash) const{
|
torrent_handle bittorrent::getTorrentHandle(const QString& hash) const{
|
||||||
return s->find_torrent(misc::fromString<sha1_hash>((hash.toStdString())));
|
return s->find_torrent(misc::fromString<sha1_hash>((hash.toStdString())));
|
||||||
@ -101,6 +132,9 @@ void bittorrent::deleteTorrent(const QString& hash, bool permanent){
|
|||||||
torrentBackup.remove(hash+".priorities");
|
torrentBackup.remove(hash+".priorities");
|
||||||
torrentBackup.remove(hash+".savepath");
|
torrentBackup.remove(hash+".savepath");
|
||||||
torrentBackup.remove(hash+".trackers");
|
torrentBackup.remove(hash+".trackers");
|
||||||
|
// Remove it fro ETAs hash tables
|
||||||
|
ETAstats.take(hash);
|
||||||
|
ETAs.take(hash);
|
||||||
if(permanent){
|
if(permanent){
|
||||||
// Remove from Hard drive
|
// Remove from Hard drive
|
||||||
qDebug("Removing this on hard drive: %s", qPrintable(savePath+QDir::separator()+fileName));
|
qDebug("Removing this on hard drive: %s", qPrintable(savePath+QDir::separator()+fileName));
|
||||||
@ -674,6 +708,8 @@ void bittorrent::readAlerts(){
|
|||||||
}
|
}
|
||||||
a = s->pop_alert();
|
a = s->pop_alert();
|
||||||
}
|
}
|
||||||
|
// ETAs
|
||||||
|
updateETAs();
|
||||||
}
|
}
|
||||||
|
|
||||||
void bittorrent::reloadTorrent(const torrent_handle &h, bool compact_mode){
|
void bittorrent::reloadTorrent(const torrent_handle &h, bool compact_mode){
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
#ifndef __BITTORRENT_H__
|
#ifndef __BITTORRENT_H__
|
||||||
#define __BITTORRENT_H__
|
#define __BITTORRENT_H__
|
||||||
|
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
#include <libtorrent/entry.hpp>
|
#include <libtorrent/entry.hpp>
|
||||||
#include <libtorrent/bencode.hpp>
|
#include <libtorrent/bencode.hpp>
|
||||||
#include <libtorrent/session.hpp>
|
#include <libtorrent/session.hpp>
|
||||||
@ -59,6 +61,8 @@ class bittorrent : public QObject{
|
|||||||
QString defaultSavePath;
|
QString defaultSavePath;
|
||||||
QStringList torrentsToPauseAfterChecking;
|
QStringList torrentsToPauseAfterChecking;
|
||||||
QStringList torrentsUnchecked;
|
QStringList torrentsUnchecked;
|
||||||
|
QHash<QString, QList<long> > ETAstats;
|
||||||
|
QHash<QString, long> ETAs;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString getSavePath(const QString& hash);
|
QString getSavePath(const QString& hash);
|
||||||
@ -80,6 +84,7 @@ class bittorrent : public QObject{
|
|||||||
int getListenPort() const;
|
int getListenPort() const;
|
||||||
QStringList getTorrentsToPauseAfterChecking() const;
|
QStringList getTorrentsToPauseAfterChecking() const;
|
||||||
QStringList getUncheckedTorrentsList() const;
|
QStringList getUncheckedTorrentsList() const;
|
||||||
|
long getETA(QString hash) const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void addTorrent(const QString& path, bool fromScanDir = false, bool onStartup = false, const QString& from_url = QString());
|
void addTorrent(const QString& path, bool fromScanDir = false, bool onStartup = false, const QString& from_url = QString());
|
||||||
@ -102,6 +107,7 @@ class bittorrent : public QObject{
|
|||||||
void reloadTorrent(const torrent_handle &h, bool compact_mode = true);
|
void reloadTorrent(const torrent_handle &h, bool compact_mode = true);
|
||||||
void setTorrentFinishedChecking(QString hash);
|
void setTorrentFinishedChecking(QString hash);
|
||||||
void resumeUnfinishedTorrents();
|
void resumeUnfinishedTorrents();
|
||||||
|
void updateETAs();
|
||||||
// Session configuration - Setters
|
// Session configuration - Setters
|
||||||
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
|
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
|
||||||
void setMaxConnections(int maxConnec);
|
void setMaxConnections(int maxConnec);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user