Browse Source

Remove unwanted files after torrent removed

adaptive-webui-19844
Vladimir Golovnev (Glassez) 5 years ago
parent
commit
378a863611
No known key found for this signature in database
GPG Key ID: 52A2C7DEE2DFA6F7
  1. 64
      src/base/bittorrent/session.cpp
  2. 2
      src/base/bittorrent/session.h
  3. 1
      src/base/bittorrent/torrenthandle.h
  4. 23
      src/base/bittorrent/torrenthandleimpl.cpp
  5. 1
      src/base/bittorrent/torrenthandleimpl.h

64
src/base/bittorrent/session.cpp

@ -115,6 +115,7 @@ namespace
{ {
#if (LIBTORRENT_VERSION_NUM < 10200) #if (LIBTORRENT_VERSION_NUM < 10200)
using LTAlertCategory = int; using LTAlertCategory = int;
using LTDownloadPriority = int;
using LTPeerClass = int; using LTPeerClass = int;
using LTQueuePosition = int; using LTQueuePosition = int;
using LTSessionFlags = int; using LTSessionFlags = int;
@ -122,6 +123,7 @@ namespace
using LTString = std::string; using LTString = std::string;
#else #else
using LTAlertCategory = lt::alert_category_t; using LTAlertCategory = lt::alert_category_t;
using LTDownloadPriority = lt::download_priority_t;
using LTPeerClass = lt::peer_class_t; using LTPeerClass = lt::peer_class_t;
using LTQueuePosition = lt::queue_position_t; using LTQueuePosition = lt::queue_position_t;
using LTSessionFlags = lt::session_flags_t; using LTSessionFlags = lt::session_flags_t;
@ -416,6 +418,34 @@ namespace
return {}; return {};
} }
#endif #endif
QStringList getUnwantedFilePaths(const lt::torrent_handle &torrentHandle)
{
const TorrentInfo torrentInfo {torrentHandle.torrent_file()};
if (!torrentInfo.isValid())
return {};
const QString savePath = QString::fromStdString(
torrentHandle.status(lt::torrent_handle::query_save_path).save_path);
const QDir saveDir {savePath};
#if (LIBTORRENT_VERSION_NUM < 10200)
const std::vector<LTDownloadPriority> fp = torrentHandle.file_priorities();
#else
const std::vector<LTDownloadPriority> fp = torrentHandle.get_file_priorities();
#endif
QStringList res;
for (int i = 0; i < static_cast<int>(fp.size()); ++i) {
if (fp[i] == LTDownloadPriority {0}) {
const QString path = Utils::Fs::expandPathAbs(
saveDir.absoluteFilePath(torrentInfo.filePath(i)));
if (path.contains(".unwanted"))
res << path;
}
}
return res;
}
} }
// Session // Session
@ -1845,32 +1875,21 @@ bool Session::deleteTorrent(const InfoHash &hash, const DeleteOption deleteOptio
// Remove it from session // Remove it from session
if (deleteOption == Torrent) { if (deleteOption == Torrent) {
m_removingTorrents[torrent->hash()] = {torrent->name(), "", deleteOption}; m_removingTorrents[torrent->hash()] = {torrent->name(), getUnwantedFilePaths(torrent->nativeHandle()), deleteOption};
QStringList unwantedFiles;
if (torrent->hasMetadata())
unwantedFiles = torrent->absoluteFilePathsUnwanted();
m_nativeSession->remove_torrent(torrent->nativeHandle(), lt::session::delete_partfile); m_nativeSession->remove_torrent(torrent->nativeHandle(), lt::session::delete_partfile);
// Remove unwanted and incomplete files
for (const QString &unwantedFile : asConst(unwantedFiles)) {
qDebug("Removing unwanted file: %s", qUtf8Printable(unwantedFile));
Utils::Fs::forceRemove(unwantedFile);
const QString parentFolder = Utils::Fs::branchPath(unwantedFile);
qDebug("Attempt to remove parent folder (if empty): %s", qUtf8Printable(parentFolder));
QDir().rmdir(parentFolder);
}
} }
else { else {
const QString rootPath = torrent->rootPath(true); const QString rootPath = torrent->rootPath(true);
if (!rootPath.isEmpty()) { if (!rootPath.isEmpty()) {
// torrent with root folder // torrent with root folder
m_removingTorrents[torrent->hash()] = {torrent->name(), rootPath, deleteOption}; m_removingTorrents[torrent->hash()] = {torrent->name(), {rootPath}, deleteOption};
} }
else if (torrent->useTempPath()) { else if (torrent->useTempPath()) {
// torrent without root folder still has it in its temporary save path // torrent without root folder still has it in its temporary save path
m_removingTorrents[torrent->hash()] = {torrent->name(), torrent->savePath(true), deleteOption}; m_removingTorrents[torrent->hash()] = {torrent->name(), {torrent->actualStorageLocation()}, deleteOption};
} }
else { else {
m_removingTorrents[torrent->hash()] = {torrent->name(), "", deleteOption}; m_removingTorrents[torrent->hash()] = {torrent->name(), {}, deleteOption};
} }
m_nativeSession->remove_torrent(torrent->nativeHandle(), lt::session::delete_files); m_nativeSession->remove_torrent(torrent->nativeHandle(), lt::session::delete_files);
} }
@ -4608,6 +4627,15 @@ void Session::handleTorrentRemovedAlert(const lt::torrent_removed_alert *p)
const auto removingTorrentDataIter = m_removingTorrents.find(infoHash); const auto removingTorrentDataIter = m_removingTorrents.find(infoHash);
if (removingTorrentDataIter != m_removingTorrents.end()) { if (removingTorrentDataIter != m_removingTorrents.end()) {
if (removingTorrentDataIter->deleteOption == Torrent) { if (removingTorrentDataIter->deleteOption == Torrent) {
// Remove unwanted and incomplete files
for (const QString &unwantedFile : asConst(removingTorrentDataIter->pathsToRemove)) {
qDebug("Removing unwanted file: %s", qUtf8Printable(unwantedFile));
Utils::Fs::forceRemove(unwantedFile);
const QString parentFolder = Utils::Fs::branchPath(unwantedFile);
qDebug("Attempt to remove parent folder (if empty): %s", qUtf8Printable(parentFolder));
QDir().rmdir(parentFolder);
}
LogMsg(tr("'%1' was removed from the transfer list.", "'xxx.avi' was removed...").arg(removingTorrentDataIter->name)); LogMsg(tr("'%1' was removed from the transfer list.", "'xxx.avi' was removed...").arg(removingTorrentDataIter->name));
m_removingTorrents.erase(removingTorrentDataIter); m_removingTorrents.erase(removingTorrentDataIter);
} }
@ -4622,7 +4650,8 @@ void Session::handleTorrentDeletedAlert(const lt::torrent_deleted_alert *p)
if (removingTorrentDataIter == m_removingTorrents.end()) if (removingTorrentDataIter == m_removingTorrents.end())
return; return;
Utils::Fs::smartRemoveEmptyFolderTree(removingTorrentDataIter->savePathToRemove); Q_ASSERT(removingTorrentDataIter->pathsToRemove.count() == 1);
Utils::Fs::smartRemoveEmptyFolderTree(removingTorrentDataIter->pathsToRemove.first());
LogMsg(tr("'%1' was removed from the transfer list and hard disk.", "'xxx.avi' was removed...").arg(removingTorrentDataIter->name)); LogMsg(tr("'%1' was removed from the transfer list and hard disk.", "'xxx.avi' was removed...").arg(removingTorrentDataIter->name));
m_removingTorrents.erase(removingTorrentDataIter); m_removingTorrents.erase(removingTorrentDataIter);
} }
@ -4637,7 +4666,8 @@ void Session::handleTorrentDeleteFailedAlert(const lt::torrent_delete_failed_ale
// libtorrent won't delete the directory if it contains files not listed in the torrent, // libtorrent won't delete the directory if it contains files not listed in the torrent,
// so we remove the directory ourselves // so we remove the directory ourselves
Utils::Fs::smartRemoveEmptyFolderTree(removingTorrentDataIter->savePathToRemove); Q_ASSERT(removingTorrentDataIter->pathsToRemove.count() == 1);
Utils::Fs::smartRemoveEmptyFolderTree(removingTorrentDataIter->pathsToRemove.first());
if (p->error) { if (p->error) {
LogMsg(tr("'%1' was removed from the transfer list but the files couldn't be deleted. Error: %2", "'xxx.avi' was removed...") LogMsg(tr("'%1' was removed from the transfer list but the files couldn't be deleted. Error: %2", "'xxx.avi' was removed...")

2
src/base/bittorrent/session.h

@ -537,7 +537,7 @@ namespace BitTorrent
struct RemovingTorrentData struct RemovingTorrentData
{ {
QString name; QString name;
QString savePathToRemove; QStringList pathsToRemove;
DeleteOption deleteOption; DeleteOption deleteOption;
}; };

1
src/base/bittorrent/torrenthandle.h

@ -192,7 +192,6 @@ namespace BitTorrent
virtual QString fileName(int index) const = 0; virtual QString fileName(int index) const = 0;
virtual qlonglong fileSize(int index) const = 0; virtual qlonglong fileSize(int index) const = 0;
virtual QStringList absoluteFilePaths() const = 0; virtual QStringList absoluteFilePaths() const = 0;
virtual QStringList absoluteFilePathsUnwanted() const = 0;
virtual QVector<DownloadPriority> filePriorities() const = 0; virtual QVector<DownloadPriority> filePriorities() const = 0;
virtual TorrentInfo info() const = 0; virtual TorrentInfo info() const = 0;

23
src/base/bittorrent/torrenthandleimpl.cpp

@ -660,29 +660,6 @@ QStringList TorrentHandleImpl::absoluteFilePaths() const
return res; return res;
} }
QStringList TorrentHandleImpl::absoluteFilePathsUnwanted() const
{
if (!hasMetadata()) return {};
const QDir saveDir(savePath(true));
#if (LIBTORRENT_VERSION_NUM < 10200)
const std::vector<LTDownloadPriority> fp = m_nativeHandle.file_priorities();
#else
const std::vector<LTDownloadPriority> fp = m_nativeHandle.get_file_priorities();
#endif
QStringList res;
for (int i = 0; i < static_cast<int>(fp.size()); ++i) {
if (fp[i] == LTDownloadPriority {0}) {
const QString path = Utils::Fs::expandPathAbs(saveDir.absoluteFilePath(filePath(i)));
if (path.contains(".unwanted"))
res << path;
}
}
return res;
}
QVector<DownloadPriority> TorrentHandleImpl::filePriorities() const QVector<DownloadPriority> TorrentHandleImpl::filePriorities() const
{ {
#if (LIBTORRENT_VERSION_NUM < 10200) #if (LIBTORRENT_VERSION_NUM < 10200)

1
src/base/bittorrent/torrenthandleimpl.h

@ -148,7 +148,6 @@ namespace BitTorrent
QString fileName(int index) const override; QString fileName(int index) const override;
qlonglong fileSize(int index) const override; qlonglong fileSize(int index) const override;
QStringList absoluteFilePaths() const override; QStringList absoluteFilePaths() const override;
QStringList absoluteFilePathsUnwanted() const override;
QVector<DownloadPriority> filePriorities() const override; QVector<DownloadPriority> filePriorities() const override;
TorrentInfo info() const override; TorrentInfo info() const override;

Loading…
Cancel
Save