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 42d85d4ca25b..324bb89d6fba 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 82e6e01a6b4d..a233048acc76 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 514ed3f14d96..e30d5f349e69 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 @@ class WebApplication final : public ApplicationComponent {{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},