From 57085ca126aed075ee8a45b6dd726eb041d0c9f1 Mon Sep 17 00:00:00 2001 From: Vladimir Golovnev Date: Mon, 17 Jul 2023 08:11:07 +0300 Subject: [PATCH] Use previous approach of deducing favicon URL PR #19325. Fixes regression of #19062. Closes #19307. --- .../trackersfilterwidget.cpp | 112 ++++++++++++------ .../trackersfilterwidget.h | 3 +- 2 files changed, 79 insertions(+), 36 deletions(-) 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; - } - - const QString host = getHost(result.url); - - if (!m_trackers.contains(host)) - { - Utils::Fs::removeFile(result.filePath); - return; - } - - 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 (result.url.endsWith(u".ico", Qt::CaseInsensitive)) - downloadFavicon(result.url.left(result.url.size() - 4) + u".png"); - Utils::Fs::removeFile(result.filePath); + failed = true; } else { - trackerItem->setData(Qt::DecorationRole, QIcon(result.filePath.data())); - m_iconPaths.append(result.filePath); + 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; + } } + + if (failed) + { + if (result.url.endsWith(u".ico", Qt::CaseInsensitive)) + { + 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; + } + + bool matchedTrackerFound = false; + for (const auto &trackerHost : trackerHosts) + { + 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; // };