Skip to content

Commit d89f289

Browse files
authored
Apply filename filter to subfolder names as well
PR #20902. Closes #14480.
1 parent dd34c85 commit d89f289

File tree

5 files changed

+51
-37
lines changed

5 files changed

+51
-37
lines changed

src/base/bittorrent/session.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ namespace BitTorrent
425425
virtual void setExcludedFileNamesEnabled(bool enabled) = 0;
426426
virtual QStringList excludedFileNames() const = 0;
427427
virtual void setExcludedFileNames(const QStringList &newList) = 0;
428-
virtual bool isFilenameExcluded(const QString &fileName) const = 0;
428+
virtual void applyFilenameFilter(const PathList &files, QList<BitTorrent::DownloadPriority> &priorities) = 0;
429429
virtual QStringList bannedIPs() const = 0;
430430
virtual void setBannedIPs(const QStringList &newList) = 0;
431431
virtual ResumeDataStorageType resumeDataStorageType() const = 0;

src/base/bittorrent/sessionimpl.cpp

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2769,26 +2769,22 @@ bool SessionImpl::addTorrent_impl(const TorrentDescriptor &source, const AddTorr
27692769
Q_ASSERT(p.file_priorities.empty());
27702770
Q_ASSERT(addTorrentParams.filePriorities.isEmpty() || (addTorrentParams.filePriorities.size() == nativeIndexes.size()));
27712771

2772+
QList<DownloadPriority> filePriorities = addTorrentParams.filePriorities;
2773+
2774+
if (filePriorities.isEmpty() && isExcludedFileNamesEnabled())
2775+
{
2776+
// Check file name blacklist when priorities are not explicitly set
2777+
applyFilenameFilter(filePaths, filePriorities);
2778+
}
2779+
27722780
const int internalFilesCount = torrentInfo.nativeInfo()->files().num_files(); // including .pad files
27732781
// Use qBittorrent default priority rather than libtorrent's (4)
27742782
p.file_priorities = std::vector(internalFilesCount, LT::toNative(DownloadPriority::Normal));
27752783

2776-
if (addTorrentParams.filePriorities.isEmpty())
2784+
if (!filePriorities.isEmpty())
27772785
{
2778-
if (isExcludedFileNamesEnabled())
2779-
{
2780-
// Check file name blacklist when priorities are not explicitly set
2781-
for (int i = 0; i < filePaths.size(); ++i)
2782-
{
2783-
if (isFilenameExcluded(filePaths.at(i).filename()))
2784-
p.file_priorities[LT::toUnderlyingType(nativeIndexes[i])] = lt::dont_download;
2785-
}
2786-
}
2787-
}
2788-
else
2789-
{
2790-
for (int i = 0; i < addTorrentParams.filePriorities.size(); ++i)
2791-
p.file_priorities[LT::toUnderlyingType(nativeIndexes[i])] = LT::toNative(addTorrentParams.filePriorities[i]);
2786+
for (int i = 0; i < filePriorities.size(); ++i)
2787+
p.file_priorities[LT::toUnderlyingType(nativeIndexes[i])] = LT::toNative(filePriorities[i]);
27922788
}
27932789

27942790
Q_ASSERT(p.ti);
@@ -3874,21 +3870,41 @@ void SessionImpl::populateExcludedFileNamesRegExpList()
38743870

38753871
for (const QString &str : excludedNames)
38763872
{
3877-
const QString pattern = QRegularExpression::anchoredPattern(QRegularExpression::wildcardToRegularExpression(str));
3873+
const QString pattern = QRegularExpression::wildcardToRegularExpression(str);
38783874
const QRegularExpression re {pattern, QRegularExpression::CaseInsensitiveOption};
38793875
m_excludedFileNamesRegExpList.append(re);
38803876
}
38813877
}
38823878

3883-
bool SessionImpl::isFilenameExcluded(const QString &fileName) const
3879+
void SessionImpl::applyFilenameFilter(const PathList &files, QList<DownloadPriority> &priorities)
38843880
{
38853881
if (!isExcludedFileNamesEnabled())
3886-
return false;
3882+
return;
38873883

3888-
return std::any_of(m_excludedFileNamesRegExpList.begin(), m_excludedFileNamesRegExpList.end(), [&fileName](const QRegularExpression &re)
3884+
const auto isFilenameExcluded = [patterns = m_excludedFileNamesRegExpList](const Path &fileName)
38893885
{
3890-
return re.match(fileName).hasMatch();
3891-
});
3886+
return std::any_of(patterns.begin(), patterns.end(), [&fileName](const QRegularExpression &re)
3887+
{
3888+
Path path = fileName;
3889+
while (!re.match(path.filename()).hasMatch())
3890+
{
3891+
path = path.parentPath();
3892+
if (path.isEmpty())
3893+
return false;
3894+
}
3895+
return true;
3896+
});
3897+
};
3898+
3899+
priorities.resize(files.count(), DownloadPriority::Normal);
3900+
for (int i = 0; i < priorities.size(); ++i)
3901+
{
3902+
if (priorities[i] == BitTorrent::DownloadPriority::Ignored)
3903+
continue;
3904+
3905+
if (isFilenameExcluded(files.at(i)))
3906+
priorities[i] = BitTorrent::DownloadPriority::Ignored;
3907+
}
38923908
}
38933909

38943910
void SessionImpl::setBannedIPs(const QStringList &newList)

src/base/bittorrent/sessionimpl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ namespace BitTorrent
402402
void setExcludedFileNamesEnabled(bool enabled) override;
403403
QStringList excludedFileNames() const override;
404404
void setExcludedFileNames(const QStringList &excludedFileNames) override;
405-
bool isFilenameExcluded(const QString &fileName) const override;
405+
void applyFilenameFilter(const PathList &files, QList<BitTorrent::DownloadPriority> &priorities) override;
406406
QStringList bannedIPs() const override;
407407
void setBannedIPs(const QStringList &newList) override;
408408
ResumeDataStorageType resumeDataStorageType() const override;

src/base/bittorrent/torrentimpl.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,12 +1791,13 @@ void TorrentImpl::endReceivedMetadataHandling(const Path &savePath, const PathLi
17911791
const Path filePath = actualFilePath.removedExtension(QB_EXT);
17921792
m_filePaths.append(filePath);
17931793

1794-
lt::download_priority_t &nativePriority = p.file_priorities[LT::toUnderlyingType(nativeIndex)];
1795-
if ((nativePriority != lt::dont_download) && m_session->isFilenameExcluded(filePath.filename()))
1796-
nativePriority = lt::dont_download;
1797-
const auto priority = LT::fromNative(nativePriority);
1798-
m_filePriorities.append(priority);
1794+
m_filePriorities.append(LT::fromNative(p.file_priorities[LT::toUnderlyingType(nativeIndex)]));
17991795
}
1796+
1797+
m_session->applyFilenameFilter(fileNames, m_filePriorities);
1798+
for (int i = 0; i < m_filePriorities.size(); ++i)
1799+
p.file_priorities[LT::toUnderlyingType(nativeIndexes[i])] = LT::toNative(m_filePriorities[i]);
1800+
18001801
p.save_path = savePath.toString().toStdString();
18011802
p.ti = metadata;
18021803

src/gui/addnewtorrentdialog.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ class AddNewTorrentDialog::TorrentContentAdaptor final
181181
return (m_filePaths.isEmpty() ? m_torrentInfo.filePath(index) : m_filePaths.at(index));
182182
}
183183

184+
PathList filePaths() const
185+
{
186+
return (m_filePaths.isEmpty() ? m_torrentInfo.filePaths() : m_filePaths);
187+
}
188+
184189
void renameFile(const int index, const Path &newFilePath) override
185190
{
186191
Q_ASSERT((index >= 0) && (index < filesCount()));
@@ -886,15 +891,7 @@ void AddNewTorrentDialog::setupTreeview()
886891
{
887892
// Check file name blacklist for torrents that are manually added
888893
QVector<BitTorrent::DownloadPriority> priorities = m_contentAdaptor->filePriorities();
889-
for (int i = 0; i < priorities.size(); ++i)
890-
{
891-
if (priorities[i] == BitTorrent::DownloadPriority::Ignored)
892-
continue;
893-
894-
if (BitTorrent::Session::instance()->isFilenameExcluded(torrentInfo.filePath(i).filename()))
895-
priorities[i] = BitTorrent::DownloadPriority::Ignored;
896-
}
897-
894+
BitTorrent::Session::instance()->applyFilenameFilter(m_contentAdaptor->filePaths(), priorities);
898895
m_contentAdaptor->prioritizeFiles(priorities);
899896
}
900897

0 commit comments

Comments
 (0)