mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-08-19 21:03:30 -07:00
Merge 032957f0f8
into b7a43ea118
This commit is contained in:
commit
0d9bd2b788
7 changed files with 88 additions and 3 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<QString> 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<BitTorrent::TrackerEntryStatus> &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());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -248,6 +248,8 @@
|
|||
<li class="separator"><a href="#EditTracker"><img src="images/edit-rename.svg" alt="QBT_TR(Edit tracker URL...)QBT_TR[CONTEXT=TrackerListWidget]"> QBT_TR(Edit tracker URL...)QBT_TR[CONTEXT=TrackerListWidget]</a></li>
|
||||
<li><a href="#RemoveTracker"><img src="images/list-remove.svg" alt="QBT_TR(Remove tracker)QBT_TR[CONTEXT=TrackerListWidget]"> QBT_TR(Remove tracker)QBT_TR[CONTEXT=TrackerListWidget]</a></li>
|
||||
<li><a href="#CopyTrackerUrl" id="CopyTrackerUrl"><img src="images/edit-copy.svg" alt="QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]"> QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]</a></li>
|
||||
<li><a href="#ReannounceTrackers" id="ReannounceTrackers"><img src="images/view-refresh.svg" alt="QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]"> QBT_TR(Force reannounce to selected tracker(s))QBT_TR[CONTEXT=TrackerListWidget]</a></li>
|
||||
<li class="separator"><a href="#ReannounceAllTrackers" id="ReannounceAllTrackers"><img src="images/view-refresh.svg" alt="QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]"> QBT_TR(Force reannounce to all trackers)QBT_TR[CONTEXT=TrackerListWidget]</a></li>
|
||||
</ul>
|
||||
<ul id="torrentPeersMenu" class="contextMenu">
|
||||
<li><a href="#addPeer"><img src="images/peers-add.svg" alt="QBT_TR(Add peers...)QBT_TR[CONTEXT=PeerListWidget]"> QBT_TR(Add peers...)QBT_TR[CONTEXT=PeerListWidget]</a></li>
|
||||
|
|
|
@ -1818,6 +1818,11 @@ window.qBittorrent.DynamicTable ??= (() => {
|
|||
onSelectedRowChanged() {
|
||||
updatePropertiesPanel();
|
||||
}
|
||||
|
||||
isStopped(hash) {
|
||||
const row = this.getRow(hash);
|
||||
return (row === undefined) ? true : row.full_data.state.includes("stopped");
|
||||
}
|
||||
}
|
||||
|
||||
class TorrentPeersTable extends DynamicTable {
|
||||
|
|
|
@ -148,6 +148,12 @@ window.qBittorrent.PropTrackers ??= (() => {
|
|||
},
|
||||
RemoveTracker: (element, ref) => {
|
||||
removeTrackerFN(element);
|
||||
},
|
||||
ReannounceTrackers: (element, ref) => {
|
||||
reannounceTrackersFN(element, torrentTrackersTable.selectedRowsIds());
|
||||
},
|
||||
ReannounceAllTrackers: (element, ref) => {
|
||||
reannounceTrackersFN(element, []);
|
||||
}
|
||||
},
|
||||
offsets: {
|
||||
|
@ -164,6 +170,8 @@ window.qBittorrent.PropTrackers ??= (() => {
|
|||
this.hideItem("EditTracker");
|
||||
this.hideItem("RemoveTracker");
|
||||
this.hideItem("CopyTrackerUrl");
|
||||
this.hideItem("ReannounceTrackers");
|
||||
this.hideItem("ReannounceAllTrackers");
|
||||
}
|
||||
else {
|
||||
if (selectedTrackers.length === 1)
|
||||
|
@ -173,6 +181,16 @@ window.qBittorrent.PropTrackers ??= (() => {
|
|||
|
||||
this.showItem("RemoveTracker");
|
||||
this.showItem("CopyTrackerUrl");
|
||||
|
||||
const torrentHash = torrentsTable.getCurrentTorrentID();
|
||||
if (torrentsTable.isStopped(torrentHash)) {
|
||||
this.hideItem("ReannounceTrackers");
|
||||
this.hideItem("ReannounceAllTrackers");
|
||||
}
|
||||
else {
|
||||
this.showItem("ReannounceTrackers");
|
||||
this.showItem("ReannounceAllTrackers");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -253,6 +271,28 @@ window.qBittorrent.PropTrackers ??= (() => {
|
|||
});
|
||||
};
|
||||
|
||||
const reannounceTrackersFN = (element, trackers) => {
|
||||
if (current_hash.length === 0)
|
||||
return;
|
||||
|
||||
const body = new URLSearchParams({
|
||||
hashes: current_hash
|
||||
});
|
||||
if (trackers.length > 0)
|
||||
body.set("urls", trackers.map(encodeURIComponent).join("|"));
|
||||
|
||||
fetch("api/v2/torrents/reannounce", {
|
||||
method: "POST",
|
||||
body: body
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok)
|
||||
return;
|
||||
|
||||
updateData();
|
||||
});
|
||||
};
|
||||
|
||||
const clear = () => {
|
||||
torrentTrackersTable.clear();
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue