diff --git a/WebAPI_Changelog.md b/WebAPI_Changelog.md index 375e24d69..08f5a0b37 100644 --- a/WebAPI_Changelog.md +++ b/WebAPI_Changelog.md @@ -1,5 +1,10 @@ # WebAPI Changelog +## 2.11.10 + +* [#22954](https://github.com/qbittorrent/qBittorrent/pull/22954) + * `torrents/reannounce` supports specifying trackers via `trackers` field + ## 2.11.9 * [#21015](https://github.com/qbittorrent/qBittorrent/pull/21015) diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index 6fb71bfaa..3cc83cb59 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -649,7 +649,13 @@ void TransferListWidget::recheckSelectedTorrents() void TransferListWidget::reannounceSelectedTorrents() { for (BitTorrent::Torrent *const torrent : asConst(getSelectedTorrents())) - torrent->forceReannounce(); + { + if (!torrent->isStopped()) + { + torrent->forceReannounce(); + torrent->forceDHTAnnounce(); + } + } } int TransferListWidget::visibleColumnsCount() const diff --git a/src/webui/api/torrentscontroller.cpp b/src/webui/api/torrentscontroller.cpp index 9e9a4ebf6..616a2c7ba 100644 --- a/src/webui/api/torrentscontroller.cpp +++ b/src/webui/api/torrentscontroller.cpp @@ -1620,7 +1620,34 @@ void TorrentsController::reannounceAction() requireParams({u"hashes"_s}); const QStringList hashes {params()[u"hashes"_s].split(u'|')}; - applyToTorrents(hashes, [](BitTorrent::Torrent *const torrent) { torrent->forceReannounce(); }); + const QStringList urlsParam {params()[u"urls"_s].split(u'|', Qt::SkipEmptyParts)}; + + QSet urls; + urls.reserve(urlsParam.size()); + for (const QString &urlStr : urlsParam) + urls << QUrl::fromPercentEncoding(urlStr.toLatin1()); + + applyToTorrents(hashes, [&urls](BitTorrent::Torrent *const torrent) + { + if (torrent->isStopped()) + return; + + if (urls.isEmpty()) + { + torrent->forceReannounce(); + torrent->forceDHTAnnounce(); + } + else + { + const QList &trackers = torrent->trackers(); + for (qsizetype i = 0; i < trackers.size(); ++i) + { + const BitTorrent::TrackerEntryStatus &status = trackers.at(i); + if (urls.contains(status.url)) + torrent->forceReannounce(i); + } + } + }); setResult(QString()); } diff --git a/src/webui/webapplication.h b/src/webui/webapplication.h index 6ceb28593..2098e3635 100644 --- a/src/webui/webapplication.h +++ b/src/webui/webapplication.h @@ -53,7 +53,7 @@ #include "base/utils/version.h" #include "api/isessionmanager.h" -inline const Utils::Version<3, 2> API_VERSION {2, 11, 9}; +inline const Utils::Version<3, 2> API_VERSION {2, 11, 10}; class APIController; class AuthController; diff --git a/src/webui/www/private/index.html b/src/webui/www/private/index.html index 47fa063e9..255c4d4f1 100644 --- a/src/webui/www/private/index.html +++ b/src/webui/www/private/index.html @@ -248,6 +248,8 @@
  • QBT_TR(Edit tracker URL...)QBT_TR[CONTEXT=TrackerListWidget] QBT_TR(Edit tracker URL...)QBT_TR[CONTEXT=TrackerListWidget]
  • QBT_TR(Remove tracker)QBT_TR[CONTEXT=TrackerListWidget] QBT_TR(Remove tracker)QBT_TR[CONTEXT=TrackerListWidget]
  • QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget] QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]
  • +
  • QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget] QBT_TR(Force reannounce to selected tracker(s))QBT_TR[CONTEXT=TrackerListWidget]
  • +
  • QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget] QBT_TR(Force reannounce to all trackers)QBT_TR[CONTEXT=TrackerListWidget]