From 82c36aea895952ad28ef8316504d230dea68879e Mon Sep 17 00:00:00 2001 From: ze0s <43699394+zze0s@users.noreply.github.com> Date: Fri, 24 Jan 2025 15:24:35 +0100 Subject: [PATCH] WebAPI: add new method setTags to upsert tags on torrents This is another optimization for torrent management on large scale instances with the goal to minimize the amount of required API calls. Ref #22128. This new function and endpoint torrents/setTags does an upsert to replace the torrent tags and handles the removal and add internally, instead of doing multiple calls to add and remove tags on torrents from the client. PR #22156. --------- Co-authored-by: Chocobo1 Co-authored-by: Vladimir Golovnev --- src/webui/api/torrentscontroller.cpp | 21 +++++++++++++++++++++ src/webui/api/torrentscontroller.h | 1 + src/webui/webapplication.h | 3 ++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/webui/api/torrentscontroller.cpp b/src/webui/api/torrentscontroller.cpp index 42d85d4ca..324bb89d6 100644 --- a/src/webui/api/torrentscontroller.cpp +++ b/src/webui/api/torrentscontroller.cpp @@ -1496,6 +1496,27 @@ void TorrentsController::addTagsAction() } } +void TorrentsController::setTagsAction() +{ + requireParams({u"hashes"_s, u"tags"_s}); + + const QStringList hashes {params()[u"hashes"_s].split(u'|', Qt::SkipEmptyParts)}; + const QStringList tags {params()[u"tags"_s].split(u',', Qt::SkipEmptyParts)}; + + const TagSet newTags {tags.begin(), tags.end()}; + applyToTorrents(hashes, [&newTags](BitTorrent::Torrent *const torrent) + { + TagSet tmpTags {newTags}; + for (const Tag &tag : asConst(torrent->tags())) + { + if (tmpTags.erase(tag) == 0) + torrent->removeTag(tag); + } + for (const Tag &tag : tmpTags) + torrent->addTag(tag); + }); +} + void TorrentsController::removeTagsAction() { requireParams({u"hashes"_s}); diff --git a/src/webui/api/torrentscontroller.h b/src/webui/api/torrentscontroller.h index 82e6e01a6..a233048ac 100644 --- a/src/webui/api/torrentscontroller.h +++ b/src/webui/api/torrentscontroller.h @@ -61,6 +61,7 @@ private slots: void removeCategoriesAction(); void categoriesAction(); void addTagsAction(); + void setTagsAction(); void removeTagsAction(); void createTagsAction(); void deleteTagsAction(); diff --git a/src/webui/webapplication.h b/src/webui/webapplication.h index 514ed3f14..e30d5f349 100644 --- a/src/webui/webapplication.h +++ b/src/webui/webapplication.h @@ -54,7 +54,7 @@ #include "base/utils/version.h" #include "api/isessionmanager.h" -inline const Utils::Version<3, 2> API_VERSION {2, 11, 3}; +inline const Utils::Version<3, 2> API_VERSION {2, 11, 4}; class QTimer; @@ -212,6 +212,7 @@ private: {{u"torrents"_s, u"setShareLimits"_s}, Http::METHOD_POST}, {{u"torrents"_s, u"setSSLParameters"_s}, Http::METHOD_POST}, {{u"torrents"_s, u"setSuperSeeding"_s}, Http::METHOD_POST}, + {{u"torrents"_s, u"setTags"_s}, Http::METHOD_POST}, {{u"torrents"_s, u"setUploadLimit"_s}, Http::METHOD_POST}, {{u"transfer"_s, u"setDownloadLimit"_s}, Http::METHOD_POST}, {{u"transfer"_s, u"setSpeedLimitsMode"_s}, Http::METHOD_POST},