mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-07-13 00:33:09 -07:00
Hide unwanted files that have to be partly downloaded
This commit is contained in:
parent
4790949e16
commit
fb443bb6e7
5 changed files with 66 additions and 42 deletions
|
@ -11,6 +11,7 @@
|
||||||
- FEATURE: Added a search engine plugin to extratorrent.com
|
- FEATURE: Added a search engine plugin to extratorrent.com
|
||||||
- FEATURE: Added a search engine plugin for kickasstorrents.com
|
- FEATURE: Added a search engine plugin for kickasstorrents.com
|
||||||
- FEATURE: Added auto-suspend upon downloads completion feature
|
- FEATURE: Added auto-suspend upon downloads completion feature
|
||||||
|
- BUGFIX: Hide unwanted files that have to be partly downloaded
|
||||||
- I18N: Added Galician translation
|
- I18N: Added Galician translation
|
||||||
- COSMETIC: Same deletion confirmation dialog in the GUI and Web UI
|
- COSMETIC: Same deletion confirmation dialog in the GUI and Web UI
|
||||||
- COSMETIC: Simplified the top toolbar
|
- COSMETIC: Simplified the top toolbar
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
#ifdef DISABLE_GUI
|
#ifdef DISABLE_GUI
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
|
@ -772,7 +773,13 @@ QString misc::branchPath(QString file_path, bool uses_slashes)
|
||||||
{
|
{
|
||||||
if(!uses_slashes)
|
if(!uses_slashes)
|
||||||
file_path.replace("\\", "/");
|
file_path.replace("\\", "/");
|
||||||
|
Q_ASSERT(!file_path.contains("\\"));
|
||||||
|
if(file_path.endsWith("/"))
|
||||||
|
file_path.chop(1); // Remove trailing slash
|
||||||
|
qDebug() << Q_FUNC_INFO << "before:" << file_path;
|
||||||
|
if(file_path.contains("/"))
|
||||||
return file_path.left(file_path.lastIndexOf('/'));
|
return file_path.left(file_path.lastIndexOf('/'));
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool misc::isUrl(const QString &s)
|
bool misc::isUrl(const QString &s)
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include <boost/filesystem/fstream.hpp>
|
#include <boost/filesystem/fstream.hpp>
|
||||||
|
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
QTorrentHandle::QTorrentHandle(torrent_handle h): torrent_handle(h) {}
|
QTorrentHandle::QTorrentHandle(torrent_handle h): torrent_handle(h) {}
|
||||||
|
|
||||||
|
@ -456,45 +457,6 @@ void QTorrentHandle::add_url_seed(QString seed) const {
|
||||||
torrent_handle::add_url_seed(str_seed);
|
torrent_handle::add_url_seed(str_seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QTorrentHandle::prioritize_files(const std::vector<int> &v) const {
|
|
||||||
// Does not do anything for seeding torrents
|
|
||||||
if(v.size() != (unsigned int)torrent_handle::get_torrent_info().num_files())
|
|
||||||
return;
|
|
||||||
bool was_seed = is_seed();
|
|
||||||
torrent_handle::prioritize_files(v);
|
|
||||||
if(was_seed && !is_seed()) {
|
|
||||||
// Reset seed status
|
|
||||||
TorrentPersistentData::saveSeedStatus(*this);
|
|
||||||
// Move to temp folder if necessary
|
|
||||||
const Preferences pref;
|
|
||||||
if(pref.isTempPathEnabled()) {
|
|
||||||
QString tmp_path = pref.getTempPath();
|
|
||||||
QString root_folder = TorrentPersistentData::getRootFolder(hash());
|
|
||||||
if(!root_folder.isEmpty())
|
|
||||||
tmp_path = QDir(tmp_path).absoluteFilePath(root_folder);
|
|
||||||
move_storage(tmp_path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QTorrentHandle::file_priority(int index, int priority) const {
|
|
||||||
bool was_seed = is_seed();
|
|
||||||
torrent_handle::file_priority(index, priority);
|
|
||||||
if(was_seed && !is_seed()) {
|
|
||||||
// Save seed status
|
|
||||||
TorrentPersistentData::saveSeedStatus(*this);
|
|
||||||
// Move to temp folder if necessary
|
|
||||||
const Preferences pref;
|
|
||||||
if(pref.isTempPathEnabled()) {
|
|
||||||
QString tmp_path = pref.getTempPath();
|
|
||||||
QString root_folder = TorrentPersistentData::getRootFolder(hash());
|
|
||||||
if(!root_folder.isEmpty())
|
|
||||||
tmp_path = QDir(tmp_path).absoluteFilePath(root_folder);
|
|
||||||
move_storage(tmp_path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QTorrentHandle::set_tracker_login(QString username, QString password) const {
|
void QTorrentHandle::set_tracker_login(QString username, QString password) const {
|
||||||
torrent_handle::set_tracker_login(std::string(username.toLocal8Bit().constData()), std::string(password.toLocal8Bit().constData()));
|
torrent_handle::set_tracker_login(std::string(username.toLocal8Bit().constData()), std::string(password.toLocal8Bit().constData()));
|
||||||
}
|
}
|
||||||
|
@ -526,6 +488,59 @@ bool QTorrentHandle::save_torrent_file(QString path) const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QTorrentHandle::file_priority(int index, int priority) const {
|
||||||
|
vector<int> priorities = torrent_handle::file_priorities();
|
||||||
|
if(priorities[index] != priority) {
|
||||||
|
priorities[index] = priority;
|
||||||
|
prioritize_files(priorities);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Also hide the folder on Windows
|
||||||
|
void QTorrentHandle::prioritize_files(const vector<int> &files) const {
|
||||||
|
if((int)files.size() != torrent_handle::get_torrent_info().num_files()) return;
|
||||||
|
const vector<int> prev_priorities = torrent_handle::file_priorities();
|
||||||
|
bool was_seed = is_seed();
|
||||||
|
torrent_handle::prioritize_files(files);
|
||||||
|
for(uint i=0; i<files.size(); ++i) {
|
||||||
|
// Move unwanted files to a .unwanted subfolder
|
||||||
|
if(prev_priorities[i] > 0 && files[i] == 0) {
|
||||||
|
QString old_path = filepath_at(i);
|
||||||
|
QString old_name = filename_at(i);
|
||||||
|
QDir parent_path(misc::branchPath(old_path));
|
||||||
|
if(parent_path.dirName() != ".unwanted") {
|
||||||
|
parent_path.mkdir(".unwanted");
|
||||||
|
rename_file(i, parent_path.filePath(".unwanted/"+old_name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Move wanted files back to their original folder
|
||||||
|
if(prev_priorities[i] == 0 && files[i] > 0) {
|
||||||
|
QString old_path = filepath_at(i);
|
||||||
|
QString old_name = filename_at(i);
|
||||||
|
QDir parent_path(misc::branchPath(old_path));
|
||||||
|
if(parent_path.dirName() == ".unwanted") {
|
||||||
|
QDir new_path(misc::branchPath(parent_path.path()));
|
||||||
|
rename_file(i, new_path.filePath(old_name));
|
||||||
|
// Remove .unwanted directory if empty
|
||||||
|
new_path.rmdir(".unwanted");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(was_seed && !is_seed()) {
|
||||||
|
// Save seed status
|
||||||
|
TorrentPersistentData::saveSeedStatus(*this);
|
||||||
|
// Move to temp folder if necessary
|
||||||
|
const Preferences pref;
|
||||||
|
if(pref.isTempPathEnabled()) {
|
||||||
|
QString tmp_path = pref.getTempPath();
|
||||||
|
QString root_folder = TorrentPersistentData::getRootFolder(hash());
|
||||||
|
if(!root_folder.isEmpty())
|
||||||
|
tmp_path = QDir(tmp_path).absoluteFilePath(root_folder);
|
||||||
|
move_storage(tmp_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QTorrentHandle::add_tracker(const announce_entry& url) const {
|
void QTorrentHandle::add_tracker(const announce_entry& url) const {
|
||||||
#if LIBTORRENT_VERSION_MINOR > 14
|
#if LIBTORRENT_VERSION_MINOR > 14
|
||||||
torrent_handle::add_tracker(url);
|
torrent_handle::add_tracker(url);
|
||||||
|
|
|
@ -122,14 +122,14 @@ public:
|
||||||
void resume() const;
|
void resume() const;
|
||||||
void remove_url_seed(QString seed) const;
|
void remove_url_seed(QString seed) const;
|
||||||
void add_url_seed(QString seed) const;
|
void add_url_seed(QString seed) const;
|
||||||
void prioritize_files(const std::vector<int> &v) const;
|
|
||||||
void file_priority(int index, int priority) const;
|
|
||||||
void set_tracker_login(QString username, QString password) const;
|
void set_tracker_login(QString username, QString password) const;
|
||||||
void move_storage(QString path) const;
|
void move_storage(QString path) const;
|
||||||
void add_tracker(const libtorrent::announce_entry& url) const;
|
void add_tracker(const libtorrent::announce_entry& url) const;
|
||||||
void prioritize_first_last_piece(bool b) const;
|
void prioritize_first_last_piece(bool b) const;
|
||||||
void rename_file(int index, QString name) const;
|
void rename_file(int index, QString name) const;
|
||||||
bool save_torrent_file(QString path) const;
|
bool save_torrent_file(QString path) const;
|
||||||
|
void prioritize_files(const std::vector<int> &files) const;
|
||||||
|
void file_priority(int index, int priority) const;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Operators
|
// Operators
|
||||||
|
|
|
@ -546,6 +546,7 @@ public:
|
||||||
#endif
|
#endif
|
||||||
// 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("/");
|
||||||
|
pathFolders.removeAll(".unwanted");
|
||||||
pathFolders.takeLast();
|
pathFolders.takeLast();
|
||||||
foreach(const QString &pathPart, pathFolders) {
|
foreach(const QString &pathPart, pathFolders) {
|
||||||
TreeItem *new_parent = current_parent->childWithName(pathPart);
|
TreeItem *new_parent = current_parent->childWithName(pathPart);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue