mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-02-02 01:44:26 +00:00
FEATURE: Simplified torrent root folder renaming/truncating (< v2.3.0 is no longer forward compatible)
This commit is contained in:
parent
0cd5253857
commit
772028106e
@ -1,4 +1,5 @@
|
|||||||
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.3.0
|
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.3.0
|
||||||
|
- FEATURE: Simplified torrent root folder renaming/truncating (< v2.3.0 is no longer forward compatible)
|
||||||
- FEATURE: Max number of half-open connections can now be edited
|
- FEATURE: Max number of half-open connections can now be edited
|
||||||
- FEATURE: Added support for strict super seeding
|
- FEATURE: Added support for strict super seeding
|
||||||
|
|
||||||
|
@ -839,7 +839,8 @@ QTorrentHandle Bittorrent::addMagnetUri(QString magnet_uri, bool resumed) {
|
|||||||
qDebug("Successfuly loaded");
|
qDebug("Successfuly loaded");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const QString &savePath = getSavePath(hash);
|
QString torrent_name = misc::magnetUriToName(magnet_uri);
|
||||||
|
const QString &savePath = getSavePath(hash, false, QString::null, torrent_name);
|
||||||
if(!defaultTempPath.isEmpty() && resumed && !TorrentPersistentData::isSeed(hash)) {
|
if(!defaultTempPath.isEmpty() && resumed && !TorrentPersistentData::isSeed(hash)) {
|
||||||
qDebug("addMagnetURI: Temp folder is enabled.");
|
qDebug("addMagnetURI: Temp folder is enabled.");
|
||||||
p.save_path = defaultTempPath.toLocal8Bit().constData();
|
p.save_path = defaultTempPath.toLocal8Bit().constData();
|
||||||
@ -1035,6 +1036,7 @@ QTorrentHandle Bittorrent::addTorrent(QString path, bool fromScanDir, QString fr
|
|||||||
}
|
}
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
QString root_folder = misc::truncateRootFolder(t);
|
||||||
add_torrent_params p;
|
add_torrent_params p;
|
||||||
//Getting fast resume data if existing
|
//Getting fast resume data if existing
|
||||||
std::vector<char> buf;
|
std::vector<char> buf;
|
||||||
@ -1052,7 +1054,7 @@ QTorrentHandle Bittorrent::addTorrent(QString path, bool fromScanDir, QString fr
|
|||||||
// Enforcing the save path defined before URL download (from RSS for example)
|
// Enforcing the save path defined before URL download (from RSS for example)
|
||||||
savePath = savepath_fromurl.take(QUrl::fromEncoded(from_url.toLocal8Bit()));
|
savePath = savepath_fromurl.take(QUrl::fromEncoded(from_url.toLocal8Bit()));
|
||||||
} else {
|
} else {
|
||||||
savePath = getSavePath(hash, fromScanDir, path);
|
savePath = getSavePath(hash, fromScanDir, path, root_folder);
|
||||||
}
|
}
|
||||||
if(!defaultTempPath.isEmpty() && resumed && !TorrentPersistentData::isSeed(hash)) {
|
if(!defaultTempPath.isEmpty() && resumed && !TorrentPersistentData::isSeed(hash)) {
|
||||||
qDebug("addTorrent::Temp folder is enabled.");
|
qDebug("addTorrent::Temp folder is enabled.");
|
||||||
@ -1938,12 +1940,6 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
|||||||
QTorrentHandle h(p->handle);
|
QTorrentHandle h(p->handle);
|
||||||
if(h.is_valid()) {
|
if(h.is_valid()) {
|
||||||
qDebug("Received metadata for %s", qPrintable(h.hash()));
|
qDebug("Received metadata for %s", qPrintable(h.hash()));
|
||||||
#ifdef LIBTORRENT_0_15
|
|
||||||
// Append .!qB to incomplete files
|
|
||||||
if(appendqBExtension)
|
|
||||||
appendqBextensionToTorrent(h, true);
|
|
||||||
#endif
|
|
||||||
emit metadataReceived(h);
|
|
||||||
// Save metadata
|
// Save metadata
|
||||||
const QDir torrentBackup(misc::BTBackupLocation());
|
const QDir torrentBackup(misc::BTBackupLocation());
|
||||||
if(!QFile::exists(torrentBackup.path()+QDir::separator()+h.hash()+QString(".torrent")))
|
if(!QFile::exists(torrentBackup.path()+QDir::separator()+h.hash()+QString(".torrent")))
|
||||||
@ -1968,11 +1964,20 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef LIBTORRENT_0_15
|
||||||
|
// Append .!qB to incomplete files
|
||||||
|
if(appendqBExtension)
|
||||||
|
appendqBextensionToTorrent(h, true);
|
||||||
|
#endif
|
||||||
|
// Truncate root folder
|
||||||
|
misc::truncateRootFolder(p->handle);
|
||||||
|
emit metadataReceived(h);
|
||||||
if(h.is_paused()) {
|
if(h.is_paused()) {
|
||||||
// XXX: Unfortunately libtorrent-rasterbar does not send a torrent_paused_alert
|
// XXX: Unfortunately libtorrent-rasterbar does not send a torrent_paused_alert
|
||||||
// and the torrent can be paused when metadata is received
|
// and the torrent can be paused when metadata is received
|
||||||
emit pausedTorrent(h);
|
emit pausedTorrent(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (file_error_alert* p = dynamic_cast<file_error_alert*>(a.get())) {
|
else if (file_error_alert* p = dynamic_cast<file_error_alert*>(a.get())) {
|
||||||
@ -2148,7 +2153,7 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
|||||||
return s->status();
|
return s->status();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Bittorrent::getSavePath(QString hash, bool fromScanDir, QString filePath) {
|
QString Bittorrent::getSavePath(QString hash, bool fromScanDir, QString filePath, QString root_folder) {
|
||||||
QString savePath;
|
QString savePath;
|
||||||
if(TorrentTempData::hasTempData(hash)) {
|
if(TorrentTempData::hasTempData(hash)) {
|
||||||
savePath = TorrentTempData::getSavePath(hash);
|
savePath = TorrentTempData::getSavePath(hash);
|
||||||
@ -2168,11 +2173,19 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
|||||||
qDebug("getSavePath, got save_path from temp data: %s", qPrintable(savePath));
|
qDebug("getSavePath, got save_path from temp data: %s", qPrintable(savePath));
|
||||||
} else {
|
} else {
|
||||||
savePath = TorrentPersistentData::getSavePath(hash);
|
savePath = TorrentPersistentData::getSavePath(hash);
|
||||||
|
bool append_root_folder = false;
|
||||||
if(savePath.isEmpty()) {
|
if(savePath.isEmpty()) {
|
||||||
if(fromScanDir && m_scanFolders->downloadInTorrentFolder(filePath))
|
if(fromScanDir && m_scanFolders->downloadInTorrentFolder(filePath))
|
||||||
savePath = QFileInfo(filePath).dir().path();
|
savePath = QFileInfo(filePath).dir().path();
|
||||||
else
|
else {
|
||||||
savePath = defaultSavePath;
|
savePath = defaultSavePath;
|
||||||
|
append_root_folder = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
if(!settings.value("ported_to_new_savepath_system", false).toBool()) {
|
||||||
|
append_root_folder = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(!fromScanDir && appendLabelToSavePath) {
|
if(!fromScanDir && appendLabelToSavePath) {
|
||||||
const QString &label = TorrentPersistentData::getLabel(hash);
|
const QString &label = TorrentPersistentData::getLabel(hash);
|
||||||
@ -2183,6 +2196,13 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(append_root_folder && !root_folder.isEmpty()) {
|
||||||
|
// Append torrent root folder to the save path
|
||||||
|
if(!savePath.endsWith(QDir::separator()))
|
||||||
|
savePath += QDir::separator();
|
||||||
|
savePath += root_folder;
|
||||||
|
TorrentPersistentData::saveSavePath(hash, savePath);
|
||||||
|
}
|
||||||
qDebug("getSavePath, got save_path from persistent data: %s", qPrintable(savePath));
|
qDebug("getSavePath, got save_path from persistent data: %s", qPrintable(savePath));
|
||||||
}
|
}
|
||||||
// Clean path
|
// Clean path
|
||||||
@ -2296,6 +2316,7 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
|||||||
filters << "*.torrent";
|
filters << "*.torrent";
|
||||||
const QStringList &torrents_on_hd = torrentBackup.entryList(filters, QDir::Files, QDir::Unsorted);
|
const QStringList &torrents_on_hd = torrentBackup.entryList(filters, QDir::Files, QDir::Unsorted);
|
||||||
foreach(QString hash, torrents_on_hd) {
|
foreach(QString hash, torrents_on_hd) {
|
||||||
|
qDebug("found torrent with hash: %s on hard disk", qPrintable(hash));
|
||||||
hash.chop(8); // remove trailing .torrent
|
hash.chop(8); // remove trailing .torrent
|
||||||
if(!known_torrents.contains(hash)) {
|
if(!known_torrents.contains(hash)) {
|
||||||
std::cerr << "ERROR Detected!!! Adding back torrent " << qPrintable(hash) << " which got lost for some reason." << std::endl;
|
std::cerr << "ERROR Detected!!! Adding back torrent " << qPrintable(hash) << " which got lost for some reason." << std::endl;
|
||||||
@ -2317,9 +2338,10 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
|||||||
const int prio = TorrentPersistentData::getPriority(hash);
|
const int prio = TorrentPersistentData::getPriority(hash);
|
||||||
torrent_queue.push(qMakePair(prio, hash));
|
torrent_queue.push(qMakePair(prio, hash));
|
||||||
}
|
}
|
||||||
|
qDebug("Priority_queue size: %ld", (long)torrent_queue.size());
|
||||||
// Resume downloads
|
// Resume downloads
|
||||||
while(!torrent_queue.empty()) {
|
while(!torrent_queue.empty()) {
|
||||||
const QString &hash = torrent_queue.top().second;
|
const QString hash = torrent_queue.top().second;
|
||||||
torrent_queue.pop();
|
torrent_queue.pop();
|
||||||
qDebug("Starting up torrent %s", qPrintable(hash));
|
qDebug("Starting up torrent %s", qPrintable(hash));
|
||||||
if(TorrentPersistentData::isMagnet(hash)) {
|
if(TorrentPersistentData::isMagnet(hash)) {
|
||||||
@ -2338,5 +2360,7 @@ void Bittorrent::addConsoleMessage(QString msg, QString) {
|
|||||||
addTorrent(torrentBackup.path()+QDir::separator()+hash+".torrent", false, QString(), true);
|
addTorrent(torrentBackup.path()+QDir::separator()+hash+".torrent", false, QString(), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
settings.setValue("ported_to_new_savepath_system", true);
|
||||||
qDebug("Unfinished torrents resumed");
|
qDebug("Unfinished torrents resumed");
|
||||||
}
|
}
|
||||||
|
@ -186,7 +186,7 @@ public slots:
|
|||||||
void recursiveTorrentDownload(const QTorrentHandle &h);
|
void recursiveTorrentDownload(const QTorrentHandle &h);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString getSavePath(QString hash, bool fromScanDir = false, QString filePath = QString());
|
QString getSavePath(QString hash, bool fromScanDir = false, QString filePath = QString::null, QString root_folder=QString::null);
|
||||||
bool initWebUi(QString username, QString password, int port);
|
bool initWebUi(QString username, QString password, int port);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
|
31
src/misc.cpp
31
src/misc.cpp
@ -166,6 +166,37 @@ long long misc::freeDiskSpaceOnPath(QString path) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString misc::truncateRootFolder(boost::intrusive_ptr<torrent_info> t) {
|
||||||
|
QString root_folder;
|
||||||
|
int i = 0;
|
||||||
|
for(torrent_info::file_iterator it = t->begin_files(); it < t->end_files(); it++) {
|
||||||
|
QString path = QString::fromUtf8(it->path.string().c_str());
|
||||||
|
QStringList path_parts = path.split("/", QString::SkipEmptyParts);
|
||||||
|
if(path_parts.size() > 1) {
|
||||||
|
root_folder = path_parts.takeFirst();
|
||||||
|
t->rename_file(i, std::string(path_parts.join("/").toUtf8()));
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
return root_folder;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString misc::truncateRootFolder(libtorrent::torrent_handle h) {
|
||||||
|
QString root_folder;
|
||||||
|
int i = 0;
|
||||||
|
torrent_info t = h.get_torrent_info();
|
||||||
|
for(torrent_info::file_iterator it = t.begin_files(); it < t.end_files(); it++) {
|
||||||
|
QString path = QString::fromUtf8(it->path.string().c_str());
|
||||||
|
QStringList path_parts = path.split("/", QString::SkipEmptyParts);
|
||||||
|
if(path_parts.size() > 1) {
|
||||||
|
root_folder = path_parts.takeFirst();
|
||||||
|
h.rename_file(i, std::string(path_parts.join("/").toUtf8()));
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
return root_folder;
|
||||||
|
}
|
||||||
|
|
||||||
bool misc::sameFiles(QString path1, QString path2) {
|
bool misc::sameFiles(QString path1, QString path2) {
|
||||||
QFile f1(path1);
|
QFile f1(path1);
|
||||||
if(!f1.exists()) return false;
|
if(!f1.exists()) return false;
|
||||||
|
@ -40,6 +40,8 @@
|
|||||||
#include <QPoint>
|
#include <QPoint>
|
||||||
|
|
||||||
#include <libtorrent/torrent_info.hpp>
|
#include <libtorrent/torrent_info.hpp>
|
||||||
|
#include <libtorrent/torrent_handle.hpp>
|
||||||
|
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
|
|
||||||
/* Miscellaneaous functions that can be useful */
|
/* Miscellaneaous functions that can be useful */
|
||||||
@ -68,6 +70,9 @@ public:
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QString truncateRootFolder(boost::intrusive_ptr<torrent_info> t);
|
||||||
|
static QString truncateRootFolder(torrent_handle h);
|
||||||
|
|
||||||
static bool sameFiles(QString path1, QString path2);
|
static bool sameFiles(QString path1, QString path2);
|
||||||
static void copyDir(QString src_path, QString dst_path);
|
static void copyDir(QString src_path, QString dst_path);
|
||||||
// Introduced in v2.1.0 for backward compatibility
|
// Introduced in v2.1.0 for backward compatibility
|
||||||
|
@ -157,7 +157,14 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fileName = misc::magnetUriToName(magnet_uri);
|
fileName = misc::magnetUriToName(magnet_uri);
|
||||||
if(fileName.isEmpty()) fileName = tr("Magnet Link");
|
if(fileName.isEmpty()) {
|
||||||
|
fileName = tr("Magnet Link");
|
||||||
|
} else {
|
||||||
|
QString save_path = savePathTxt->text();
|
||||||
|
if(!save_path.endsWith(QDir::separator()))
|
||||||
|
save_path += QDir::separator();
|
||||||
|
savePathTxt->setText(save_path + fileName);
|
||||||
|
}
|
||||||
fileNameLbl->setText(QString::fromUtf8("<center><b>")+fileName+QString::fromUtf8("</b></center>"));
|
fileNameLbl->setText(QString::fromUtf8("<center><b>")+fileName+QString::fromUtf8("</b></center>"));
|
||||||
// Update display
|
// Update display
|
||||||
updateDiskSpaceLabels();
|
updateDiskSpaceLabels();
|
||||||
@ -199,6 +206,13 @@ public:
|
|||||||
close();
|
close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
QString root_folder = misc::truncateRootFolder(t);
|
||||||
|
if(!root_folder.isEmpty()) {
|
||||||
|
QString save_path = savePathTxt->text();
|
||||||
|
if(!save_path.endsWith(QDir::separator()))
|
||||||
|
save_path += QDir::separator();
|
||||||
|
savePathTxt->setText(save_path + root_folder);
|
||||||
|
}
|
||||||
nbFiles = t->num_files();
|
nbFiles = t->num_files();
|
||||||
// Setting file name
|
// Setting file name
|
||||||
fileName = misc::toQString(t->name());
|
fileName = misc::toQString(t->name());
|
||||||
|
@ -505,7 +505,7 @@ public:
|
|||||||
files_index = new TreeItem*[t.num_files()];
|
files_index = new TreeItem*[t.num_files()];
|
||||||
|
|
||||||
TreeItem *parent = this->rootItem;
|
TreeItem *parent = this->rootItem;
|
||||||
if(t.num_files() == 1) {
|
/*if(t.num_files() == 1) {
|
||||||
// Create possible parent folder
|
// Create possible parent folder
|
||||||
QStringList path_parts = misc::toQString(t.file_at(0).path.string()).split("/");
|
QStringList path_parts = misc::toQString(t.file_at(0).path.string()).split("/");
|
||||||
path_parts.removeLast();
|
path_parts.removeLast();
|
||||||
@ -518,12 +518,14 @@ public:
|
|||||||
files_index[0] = f;
|
files_index[0] = f;
|
||||||
emit layoutChanged();
|
emit layoutChanged();
|
||||||
return;
|
return;
|
||||||
}
|
}*/
|
||||||
// Create parent folder
|
// Create parent folder
|
||||||
QString root_name = misc::toQString(t.file_at(0).path.string()).split("/").first();
|
//QString root_name = misc::toQString(t.file_at(0).path.string()).split("/").first();
|
||||||
TreeItem *current_parent = new TreeItem(root_name, parent);
|
//TreeItem *current_parent = new TreeItem(root_name, parent);
|
||||||
//parent->appendChild(current_parent);
|
//parent->appendChild(current_parent);
|
||||||
TreeItem *root_folder = current_parent;
|
//TreeItem *root_folder = current_parent;
|
||||||
|
TreeItem *root_folder = parent;
|
||||||
|
TreeItem *current_parent;
|
||||||
|
|
||||||
// Iterate over files
|
// Iterate over files
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -533,10 +535,10 @@ public:
|
|||||||
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
||||||
// Iterate of parts of the path to create necessary folders
|
// Iterate of parts of the path to create necessary folders
|
||||||
QStringList pathFolders = path.split("/");
|
QStringList pathFolders = path.split("/");
|
||||||
Q_ASSERT(pathFolders.size() >= 2);
|
//Q_ASSERT(pathFolders.size() >= 2);
|
||||||
QString fileName = pathFolders.takeLast();
|
QString fileName = pathFolders.takeLast();
|
||||||
QString currentFolderName = pathFolders.takeFirst();
|
//QString currentFolderName = pathFolders.takeFirst();
|
||||||
Q_ASSERT(currentFolderName == current_parent->getName());
|
//Q_ASSERT(currentFolderName == current_parent->getName());
|
||||||
foreach(const QString &pathPart, pathFolders) {
|
foreach(const QString &pathPart, pathFolders) {
|
||||||
TreeItem *new_parent = current_parent->childWithName(pathPart);
|
TreeItem *new_parent = current_parent->childWithName(pathPart);
|
||||||
if(!new_parent) {
|
if(!new_parent) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user