diff --git a/src/gui/transferlistfilters/trackersfilterwidget.cpp b/src/gui/transferlistfilters/trackersfilterwidget.cpp index 91066b177..8e1ed6355 100644 --- a/src/gui/transferlistfilters/trackersfilterwidget.cpp +++ b/src/gui/transferlistfilters/trackersfilterwidget.cpp @@ -72,6 +72,14 @@ namespace return host; } + QString getFaviconHost(const QString &trackerHost) + { + if (!QHostAddress(trackerHost).isNull()) + return trackerHost; + + return trackerHost.section(u'.', -2, -1); + } + const QString NULL_HOST = u""_s; } @@ -190,7 +198,7 @@ void TrackersFilterWidget::addItems(const QString &trackerURL, const QVectordownload( - Net::DownloadRequest(url).saveToFile(true), Preferences::instance()->useProxyForGeneralPurposes() - , this, &TrackersFilterWidget::handleFavicoDownloadFinished); + if (!m_downloadTrackerFavicon) + return; + + QSet &downloadingFaviconNode = m_downloadingFavicons[faviconURL]; + if (downloadingFaviconNode.isEmpty()) + { + Net::DownloadManager::instance()->download( + Net::DownloadRequest(faviconURL).saveToFile(true), Preferences::instance()->useProxyForGeneralPurposes() + , this, &TrackersFilterWidget::handleFavicoDownloadFinished); + } + + downloadingFaviconNode.insert(trackerHost); } void TrackersFilterWidget::handleFavicoDownloadFinished(const Net::DownloadResult &result) { + const QSet trackerHosts = m_downloadingFavicons.take(result.url); + Q_ASSERT(!trackerHosts.isEmpty()); + if (Q_UNLIKELY(trackerHosts.isEmpty())) + return; + + QIcon icon; + bool failed = false; if (result.status != Net::DownloadStatus::Success) { - if (result.url.endsWith(u".ico", Qt::CaseInsensitive)) - downloadFavicon(result.url.left(result.url.size() - 4) + u".png"); - return; + failed = true; } - - const QString host = getHost(result.url); - - if (!m_trackers.contains(host)) + else { - Utils::Fs::removeFile(result.filePath); - return; + icon = QIcon(result.filePath.data()); + //Detect a non-decodable icon + QList sizes = icon.availableSizes(); + const bool invalid = (sizes.isEmpty() || icon.pixmap(sizes.first()).isNull()); + if (invalid) + { + Utils::Fs::removeFile(result.filePath); + failed = true; + } } - QListWidgetItem *trackerItem = item(rowFromTracker(host)); - if (!trackerItem) return; - - const QIcon icon {result.filePath.data()}; - //Detect a non-decodable icon - QList sizes = icon.availableSizes(); - bool invalid = (sizes.isEmpty() || icon.pixmap(sizes.first()).isNull()); - if (invalid) + if (failed) { if (result.url.endsWith(u".ico", Qt::CaseInsensitive)) - downloadFavicon(result.url.left(result.url.size() - 4) + u".png"); - Utils::Fs::removeFile(result.filePath); + { + const QString faviconURL = result.url.left(result.url.size() - 4) + u".png"; + for (const auto &trackerHost : trackerHosts) + { + if (m_trackers.contains(trackerHost)) + downloadFavicon(trackerHost, faviconURL); + } + } + + return; } - else + + bool matchedTrackerFound = false; + for (const auto &trackerHost : trackerHosts) { - trackerItem->setData(Qt::DecorationRole, QIcon(result.filePath.data())); - m_iconPaths.append(result.filePath); + if (!m_trackers.contains(trackerHost)) + continue; + + matchedTrackerFound = true; + + QListWidgetItem *trackerItem = item(rowFromTracker(trackerHost)); + Q_ASSERT(trackerItem); + if (Q_UNLIKELY(!trackerItem)) + continue; + + trackerItem->setData(Qt::DecorationRole, icon); } + + if (matchedTrackerFound) + m_iconPaths.append(result.filePath); + else + Utils::Fs::removeFile(result.filePath); } void TrackersFilterWidget::showMenu() diff --git a/src/gui/transferlistfilters/trackersfilterwidget.h b/src/gui/transferlistfilters/trackersfilterwidget.h index 0626c65d4..1261c6adf 100644 --- a/src/gui/transferlistfilters/trackersfilterwidget.h +++ b/src/gui/transferlistfilters/trackersfilterwidget.h @@ -76,7 +76,7 @@ private: QString trackerFromRow(int row) const; int rowFromTracker(const QString &tracker) const; QSet getTorrentIDs(int row) const; - void downloadFavicon(const QString &url); + void downloadFavicon(const QString &trackerHost, const QString &faviconURL); struct TrackerData { @@ -90,4 +90,5 @@ private: PathList m_iconPaths; int m_totalTorrents = 0; bool m_downloadTrackerFavicon = false; + QHash> m_downloadingFavicons; // };