mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-08-20 05:13:30 -07:00
WebAPI: Add setComment endpoint
No UI implementation as of now. Closes #19598. PR #23031.
This commit is contained in:
parent
fef6ac515c
commit
d7b330c069
10 changed files with 47 additions and 2 deletions
|
@ -1,5 +1,9 @@
|
||||||
# WebAPI Changelog
|
# WebAPI Changelog
|
||||||
|
|
||||||
|
## 2.12.1
|
||||||
|
* [#23031](https://github.com/qbittorrent/qBittorrent/pull/23031)
|
||||||
|
* Add `torrents/setComment` endpoint with parameters `hashes` and `comment` for setting a new torrent comment
|
||||||
|
|
||||||
## 2.12.0
|
## 2.12.0
|
||||||
|
|
||||||
* [#22989](https://github.com/qbittorrent/qBittorrent/pull/22989)
|
* [#22989](https://github.com/qbittorrent/qBittorrent/pull/22989)
|
||||||
|
|
|
@ -236,6 +236,7 @@ BitTorrent::LoadResumeDataResult BitTorrent::BencodeResumeDataStorage::loadTorre
|
||||||
LoadTorrentParams torrentParams;
|
LoadTorrentParams torrentParams;
|
||||||
torrentParams.category = fromLTString(resumeDataRoot.dict_find_string_value("qBt-category"));
|
torrentParams.category = fromLTString(resumeDataRoot.dict_find_string_value("qBt-category"));
|
||||||
torrentParams.name = fromLTString(resumeDataRoot.dict_find_string_value("qBt-name"));
|
torrentParams.name = fromLTString(resumeDataRoot.dict_find_string_value("qBt-name"));
|
||||||
|
torrentParams.comment = fromLTString(resumeDataRoot.dict_find_string_value("qBt-comment"));
|
||||||
torrentParams.hasFinishedStatus = resumeDataRoot.dict_find_int_value("qBt-seedStatus");
|
torrentParams.hasFinishedStatus = resumeDataRoot.dict_find_int_value("qBt-seedStatus");
|
||||||
torrentParams.firstLastPiecePriority = resumeDataRoot.dict_find_int_value("qBt-firstLastPiecePriority");
|
torrentParams.firstLastPiecePriority = resumeDataRoot.dict_find_int_value("qBt-firstLastPiecePriority");
|
||||||
torrentParams.seedingTimeLimit = resumeDataRoot.dict_find_int_value("qBt-seedingTimeLimit", Torrent::USE_GLOBAL_SEEDING_TIME);
|
torrentParams.seedingTimeLimit = resumeDataRoot.dict_find_int_value("qBt-seedingTimeLimit", Torrent::USE_GLOBAL_SEEDING_TIME);
|
||||||
|
@ -437,6 +438,7 @@ void BitTorrent::BencodeResumeDataStorage::Worker::store(const TorrentID &id, co
|
||||||
data["qBt-category"] = resumeData.category.toStdString();
|
data["qBt-category"] = resumeData.category.toStdString();
|
||||||
data["qBt-tags"] = setToEntryList(resumeData.tags);
|
data["qBt-tags"] = setToEntryList(resumeData.tags);
|
||||||
data["qBt-name"] = resumeData.name.toStdString();
|
data["qBt-name"] = resumeData.name.toStdString();
|
||||||
|
data["qBt-comment"] = resumeData.comment.toStdString();
|
||||||
data["qBt-seedStatus"] = resumeData.hasFinishedStatus;
|
data["qBt-seedStatus"] = resumeData.hasFinishedStatus;
|
||||||
data["qBt-contentLayout"] = Utils::String::fromEnum(resumeData.contentLayout).toStdString();
|
data["qBt-contentLayout"] = Utils::String::fromEnum(resumeData.contentLayout).toStdString();
|
||||||
data["qBt-firstLastPiecePriority"] = resumeData.firstLastPiecePriority;
|
data["qBt-firstLastPiecePriority"] = resumeData.firstLastPiecePriority;
|
||||||
|
|
|
@ -67,7 +67,7 @@ namespace
|
||||||
{
|
{
|
||||||
const QString DB_CONNECTION_NAME = u"ResumeDataStorage"_s;
|
const QString DB_CONNECTION_NAME = u"ResumeDataStorage"_s;
|
||||||
|
|
||||||
const int DB_VERSION = 8;
|
const int DB_VERSION = 9;
|
||||||
|
|
||||||
const QString DB_TABLE_META = u"meta"_s;
|
const QString DB_TABLE_META = u"meta"_s;
|
||||||
const QString DB_TABLE_TORRENTS = u"torrents"_s;
|
const QString DB_TABLE_TORRENTS = u"torrents"_s;
|
||||||
|
@ -131,6 +131,7 @@ namespace
|
||||||
const Column DB_COLUMN_NAME = makeColumn(u"name"_s);
|
const Column DB_COLUMN_NAME = makeColumn(u"name"_s);
|
||||||
const Column DB_COLUMN_CATEGORY = makeColumn(u"category"_s);
|
const Column DB_COLUMN_CATEGORY = makeColumn(u"category"_s);
|
||||||
const Column DB_COLUMN_TAGS = makeColumn(u"tags"_s);
|
const Column DB_COLUMN_TAGS = makeColumn(u"tags"_s);
|
||||||
|
const Column DB_COLUMN_COMMENT = makeColumn(u"comment"_s);
|
||||||
const Column DB_COLUMN_TARGET_SAVE_PATH = makeColumn(u"target_save_path"_s);
|
const Column DB_COLUMN_TARGET_SAVE_PATH = makeColumn(u"target_save_path"_s);
|
||||||
const Column DB_COLUMN_DOWNLOAD_PATH = makeColumn(u"download_path"_s);
|
const Column DB_COLUMN_DOWNLOAD_PATH = makeColumn(u"download_path"_s);
|
||||||
const Column DB_COLUMN_CONTENT_LAYOUT = makeColumn(u"content_layout"_s);
|
const Column DB_COLUMN_CONTENT_LAYOUT = makeColumn(u"content_layout"_s);
|
||||||
|
@ -461,6 +462,7 @@ void BitTorrent::DBResumeDataStorage::createDB() const
|
||||||
makeColumnDefinition(DB_COLUMN_NAME, u"TEXT"_s),
|
makeColumnDefinition(DB_COLUMN_NAME, u"TEXT"_s),
|
||||||
makeColumnDefinition(DB_COLUMN_CATEGORY, u"TEXT"_s),
|
makeColumnDefinition(DB_COLUMN_CATEGORY, u"TEXT"_s),
|
||||||
makeColumnDefinition(DB_COLUMN_TAGS, u"TEXT"_s),
|
makeColumnDefinition(DB_COLUMN_TAGS, u"TEXT"_s),
|
||||||
|
makeColumnDefinition(DB_COLUMN_COMMENT, u"TEXT"_s),
|
||||||
makeColumnDefinition(DB_COLUMN_TARGET_SAVE_PATH, u"TEXT"_s),
|
makeColumnDefinition(DB_COLUMN_TARGET_SAVE_PATH, u"TEXT"_s),
|
||||||
makeColumnDefinition(DB_COLUMN_DOWNLOAD_PATH, u"TEXT"_s),
|
makeColumnDefinition(DB_COLUMN_DOWNLOAD_PATH, u"TEXT"_s),
|
||||||
makeColumnDefinition(DB_COLUMN_CONTENT_LAYOUT, u"TEXT NOT NULL"_s),
|
makeColumnDefinition(DB_COLUMN_CONTENT_LAYOUT, u"TEXT NOT NULL"_s),
|
||||||
|
@ -578,6 +580,9 @@ void BitTorrent::DBResumeDataStorage::updateDB(const int fromVersion) const
|
||||||
throw RuntimeError(query.lastError().text());
|
throw RuntimeError(query.lastError().text());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fromVersion <= 8)
|
||||||
|
addColumn(DB_TABLE_TORRENTS, DB_COLUMN_COMMENT, u"TEXT"_s);
|
||||||
|
|
||||||
const QString updateMetaVersionQuery = makeUpdateStatement(DB_TABLE_META, {DB_COLUMN_NAME, DB_COLUMN_VALUE});
|
const QString updateMetaVersionQuery = makeUpdateStatement(DB_TABLE_META, {DB_COLUMN_NAME, DB_COLUMN_VALUE});
|
||||||
if (!query.prepare(updateMetaVersionQuery))
|
if (!query.prepare(updateMetaVersionQuery))
|
||||||
throw RuntimeError(query.lastError().text());
|
throw RuntimeError(query.lastError().text());
|
||||||
|
@ -619,6 +624,7 @@ LoadResumeDataResult DBResumeDataStorage::parseQueryResultRow(const QSqlQuery &q
|
||||||
LoadTorrentParams resumeData;
|
LoadTorrentParams resumeData;
|
||||||
resumeData.name = query.value(DB_COLUMN_NAME.name).toString();
|
resumeData.name = query.value(DB_COLUMN_NAME.name).toString();
|
||||||
resumeData.category = query.value(DB_COLUMN_CATEGORY.name).toString();
|
resumeData.category = query.value(DB_COLUMN_CATEGORY.name).toString();
|
||||||
|
resumeData.comment = query.value(DB_COLUMN_COMMENT.name).toString();
|
||||||
const QString tagsData = query.value(DB_COLUMN_TAGS.name).toString();
|
const QString tagsData = query.value(DB_COLUMN_TAGS.name).toString();
|
||||||
if (!tagsData.isEmpty())
|
if (!tagsData.isEmpty())
|
||||||
{
|
{
|
||||||
|
@ -834,6 +840,7 @@ StoreJob::StoreJob(const TorrentID &torrentID, LoadTorrentParams resumeData)
|
||||||
DB_COLUMN_NAME,
|
DB_COLUMN_NAME,
|
||||||
DB_COLUMN_CATEGORY,
|
DB_COLUMN_CATEGORY,
|
||||||
DB_COLUMN_TAGS,
|
DB_COLUMN_TAGS,
|
||||||
|
DB_COLUMN_COMMENT,
|
||||||
DB_COLUMN_TARGET_SAVE_PATH,
|
DB_COLUMN_TARGET_SAVE_PATH,
|
||||||
DB_COLUMN_DOWNLOAD_PATH,
|
DB_COLUMN_DOWNLOAD_PATH,
|
||||||
DB_COLUMN_CONTENT_LAYOUT,
|
DB_COLUMN_CONTENT_LAYOUT,
|
||||||
|
@ -899,6 +906,7 @@ StoreJob::StoreJob(const TorrentID &torrentID, LoadTorrentParams resumeData)
|
||||||
query.bindValue(DB_COLUMN_CATEGORY.placeholder, m_resumeData.category);
|
query.bindValue(DB_COLUMN_CATEGORY.placeholder, m_resumeData.category);
|
||||||
query.bindValue(DB_COLUMN_TAGS.placeholder, (m_resumeData.tags.isEmpty()
|
query.bindValue(DB_COLUMN_TAGS.placeholder, (m_resumeData.tags.isEmpty()
|
||||||
? QString() : Utils::String::joinIntoString(m_resumeData.tags, u","_s)));
|
? QString() : Utils::String::joinIntoString(m_resumeData.tags, u","_s)));
|
||||||
|
query.bindValue(DB_COLUMN_COMMENT.placeholder, m_resumeData.comment);
|
||||||
query.bindValue(DB_COLUMN_CONTENT_LAYOUT.placeholder, Utils::String::fromEnum(m_resumeData.contentLayout));
|
query.bindValue(DB_COLUMN_CONTENT_LAYOUT.placeholder, Utils::String::fromEnum(m_resumeData.contentLayout));
|
||||||
query.bindValue(DB_COLUMN_RATIO_LIMIT.placeholder, static_cast<int>(m_resumeData.ratioLimit * 1000));
|
query.bindValue(DB_COLUMN_RATIO_LIMIT.placeholder, static_cast<int>(m_resumeData.ratioLimit * 1000));
|
||||||
query.bindValue(DB_COLUMN_SEEDING_TIME_LIMIT.placeholder, m_resumeData.seedingTimeLimit);
|
query.bindValue(DB_COLUMN_SEEDING_TIME_LIMIT.placeholder, m_resumeData.seedingTimeLimit);
|
||||||
|
|
|
@ -50,6 +50,7 @@ namespace BitTorrent
|
||||||
TagSet tags;
|
TagSet tags;
|
||||||
Path savePath;
|
Path savePath;
|
||||||
Path downloadPath;
|
Path downloadPath;
|
||||||
|
QString comment;
|
||||||
TorrentContentLayout contentLayout = TorrentContentLayout::Original;
|
TorrentContentLayout contentLayout = TorrentContentLayout::Original;
|
||||||
TorrentOperatingMode operatingMode = TorrentOperatingMode::AutoManaged;
|
TorrentOperatingMode operatingMode = TorrentOperatingMode::AutoManaged;
|
||||||
bool useAutoTMM = false;
|
bool useAutoTMM = false;
|
||||||
|
|
|
@ -144,6 +144,7 @@ namespace BitTorrent
|
||||||
virtual QDateTime creationDate() const = 0;
|
virtual QDateTime creationDate() const = 0;
|
||||||
virtual QString creator() const = 0;
|
virtual QString creator() const = 0;
|
||||||
virtual QString comment() const = 0;
|
virtual QString comment() const = 0;
|
||||||
|
virtual void setComment(const QString &comment) = 0;
|
||||||
virtual bool isPrivate() const = 0;
|
virtual bool isPrivate() const = 0;
|
||||||
virtual qlonglong totalSize() const = 0;
|
virtual qlonglong totalSize() const = 0;
|
||||||
virtual qlonglong wantedSize() const = 0;
|
virtual qlonglong wantedSize() const = 0;
|
||||||
|
|
|
@ -367,6 +367,9 @@ TorrentImpl::TorrentImpl(SessionImpl *session, const lt::torrent_handle &nativeH
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!params.comment.isEmpty())
|
||||||
|
m_comment = params.comment;
|
||||||
|
|
||||||
setStopCondition(params.stopCondition);
|
setStopCondition(params.stopCondition);
|
||||||
|
|
||||||
const auto *extensionData = static_cast<ExtensionData *>(m_ltAddTorrentParams.userdata);
|
const auto *extensionData = static_cast<ExtensionData *>(m_ltAddTorrentParams.userdata);
|
||||||
|
@ -440,6 +443,15 @@ QString TorrentImpl::comment() const
|
||||||
return m_comment;
|
return m_comment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TorrentImpl::setComment(const QString &comment)
|
||||||
|
{
|
||||||
|
if (m_comment != comment)
|
||||||
|
{
|
||||||
|
m_comment = comment;
|
||||||
|
deferredRequestResumeData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool TorrentImpl::isPrivate() const
|
bool TorrentImpl::isPrivate() const
|
||||||
{
|
{
|
||||||
return m_torrentInfo.isPrivate();
|
return m_torrentInfo.isPrivate();
|
||||||
|
@ -2210,6 +2222,7 @@ void TorrentImpl::prepareResumeData(lt::add_torrent_params params)
|
||||||
.tags = m_tags,
|
.tags = m_tags,
|
||||||
.savePath = (!m_useAutoTMM ? m_savePath : Path()),
|
.savePath = (!m_useAutoTMM ? m_savePath : Path()),
|
||||||
.downloadPath = (!m_useAutoTMM ? m_downloadPath : Path()),
|
.downloadPath = (!m_useAutoTMM ? m_downloadPath : Path()),
|
||||||
|
.comment = m_comment,
|
||||||
.contentLayout = m_contentLayout,
|
.contentLayout = m_contentLayout,
|
||||||
.operatingMode = m_operatingMode,
|
.operatingMode = m_operatingMode,
|
||||||
.useAutoTMM = m_useAutoTMM,
|
.useAutoTMM = m_useAutoTMM,
|
||||||
|
|
|
@ -106,6 +106,7 @@ namespace BitTorrent
|
||||||
QDateTime creationDate() const override;
|
QDateTime creationDate() const override;
|
||||||
QString creator() const override;
|
QString creator() const override;
|
||||||
QString comment() const override;
|
QString comment() const override;
|
||||||
|
void setComment(const QString &comment) override;
|
||||||
bool isPrivate() const override;
|
bool isPrivate() const override;
|
||||||
qlonglong totalSize() const override;
|
qlonglong totalSize() const override;
|
||||||
qlonglong wantedSize() const override;
|
qlonglong wantedSize() const override;
|
||||||
|
|
|
@ -1591,6 +1591,19 @@ void TorrentsController::renameAction()
|
||||||
setResult(QString());
|
setResult(QString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TorrentsController::setCommentAction()
|
||||||
|
{
|
||||||
|
requireParams({u"hashes"_s, u"comment"_s});
|
||||||
|
|
||||||
|
const QStringList hashes {params()[u"hashes"_s].split(u'|')};
|
||||||
|
const QString comment = params()[u"comment"_s].trimmed();
|
||||||
|
|
||||||
|
applyToTorrents(hashes, [&comment](BitTorrent::Torrent *const torrent)
|
||||||
|
{
|
||||||
|
torrent->setComment(comment);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void TorrentsController::setAutoManagementAction()
|
void TorrentsController::setAutoManagementAction()
|
||||||
{
|
{
|
||||||
requireParams({u"hashes"_s, u"enable"_s});
|
requireParams({u"hashes"_s, u"enable"_s});
|
||||||
|
|
|
@ -71,6 +71,7 @@ private slots:
|
||||||
void recheckAction();
|
void recheckAction();
|
||||||
void reannounceAction();
|
void reannounceAction();
|
||||||
void renameAction();
|
void renameAction();
|
||||||
|
void setCommentAction();
|
||||||
void setCategoryAction();
|
void setCategoryAction();
|
||||||
void createCategoryAction();
|
void createCategoryAction();
|
||||||
void editCategoryAction();
|
void editCategoryAction();
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
#include "base/utils/version.h"
|
#include "base/utils/version.h"
|
||||||
#include "api/isessionmanager.h"
|
#include "api/isessionmanager.h"
|
||||||
|
|
||||||
inline const Utils::Version<3, 2> API_VERSION {2, 12, 0};
|
inline const Utils::Version<3, 2> API_VERSION {2, 12, 1};
|
||||||
|
|
||||||
class APIController;
|
class APIController;
|
||||||
class AuthController;
|
class AuthController;
|
||||||
|
@ -200,6 +200,7 @@ private:
|
||||||
{{u"torrents"_s, u"renameFolder"_s}, Http::METHOD_POST},
|
{{u"torrents"_s, u"renameFolder"_s}, Http::METHOD_POST},
|
||||||
{{u"torrents"_s, u"setAutoManagement"_s}, Http::METHOD_POST},
|
{{u"torrents"_s, u"setAutoManagement"_s}, Http::METHOD_POST},
|
||||||
{{u"torrents"_s, u"setCategory"_s}, Http::METHOD_POST},
|
{{u"torrents"_s, u"setCategory"_s}, Http::METHOD_POST},
|
||||||
|
{{u"torrents"_s, u"setComment"_s}, Http::METHOD_POST},
|
||||||
{{u"torrents"_s, u"setDownloadLimit"_s}, Http::METHOD_POST},
|
{{u"torrents"_s, u"setDownloadLimit"_s}, Http::METHOD_POST},
|
||||||
{{u"torrents"_s, u"setDownloadPath"_s}, Http::METHOD_POST},
|
{{u"torrents"_s, u"setDownloadPath"_s}, Http::METHOD_POST},
|
||||||
{{u"torrents"_s, u"setForceStart"_s}, Http::METHOD_POST},
|
{{u"torrents"_s, u"setForceStart"_s}, Http::METHOD_POST},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue