mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-29 05:48:47 +03:00
parent
8ec3db1807
commit
c5d7b62473
13 changed files with 98 additions and 10 deletions
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2015-2024 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2015-2024 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
|
@ -49,6 +50,8 @@
|
||||||
#include "downloadhandlerimpl.h"
|
#include "downloadhandlerimpl.h"
|
||||||
#include "proxyconfigurationmanager.h"
|
#include "proxyconfigurationmanager.h"
|
||||||
|
|
||||||
|
using namespace std::chrono_literals;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
// Disguise as Firefox to avoid web server banning
|
// Disguise as Firefox to avoid web server banning
|
||||||
|
@ -188,9 +191,9 @@ Net::DownloadHandler *Net::DownloadManager::download(const DownloadRequest &down
|
||||||
return downloadHandler;
|
return downloadHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Net::DownloadManager::registerSequentialService(const Net::ServiceID &serviceID)
|
void Net::DownloadManager::registerSequentialService(const Net::ServiceID &serviceID, const std::chrono::seconds delay)
|
||||||
{
|
{
|
||||||
m_sequentialServices.insert(serviceID);
|
m_sequentialServices.insert(serviceID, delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QNetworkCookie> Net::DownloadManager::cookiesForUrl(const QUrl &url) const
|
QList<QNetworkCookie> Net::DownloadManager::cookiesForUrl(const QUrl &url) const
|
||||||
|
@ -309,7 +312,7 @@ void Net::DownloadManager::processRequest(DownloadHandlerImpl *downloadHandler)
|
||||||
QNetworkReply *reply = m_networkManager->get(request);
|
QNetworkReply *reply = m_networkManager->get(request);
|
||||||
connect(reply, &QNetworkReply::finished, this, [this, serviceID = ServiceID::fromURL(downloadHandler->url())]
|
connect(reply, &QNetworkReply::finished, this, [this, serviceID = ServiceID::fromURL(downloadHandler->url())]
|
||||||
{
|
{
|
||||||
QTimer::singleShot(0, this, [this, serviceID] { processWaitingJobs(serviceID); });
|
QTimer::singleShot(m_sequentialServices.value(serviceID, 0s), this, [this, serviceID] { processWaitingJobs(serviceID); });
|
||||||
});
|
});
|
||||||
downloadHandler->assignNetworkReply(reply);
|
downloadHandler->assignNetworkReply(reply);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2015-2024 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2015-2024 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
|
@ -29,6 +30,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
#include <QtTypes>
|
#include <QtTypes>
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QNetworkProxy>
|
#include <QNetworkProxy>
|
||||||
|
@ -137,7 +140,7 @@ namespace Net
|
||||||
template <typename Context, typename Func>
|
template <typename Context, typename Func>
|
||||||
void download(const DownloadRequest &downloadRequest, bool useProxy, Context context, Func &&slot);
|
void download(const DownloadRequest &downloadRequest, bool useProxy, Context context, Func &&slot);
|
||||||
|
|
||||||
void registerSequentialService(const ServiceID &serviceID);
|
void registerSequentialService(const ServiceID &serviceID, std::chrono::seconds delay = std::chrono::seconds(0));
|
||||||
|
|
||||||
QList<QNetworkCookie> cookiesForUrl(const QUrl &url) const;
|
QList<QNetworkCookie> cookiesForUrl(const QUrl &url) const;
|
||||||
bool setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url);
|
bool setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url);
|
||||||
|
@ -161,7 +164,8 @@ namespace Net
|
||||||
QNetworkAccessManager *m_networkManager = nullptr;
|
QNetworkAccessManager *m_networkManager = nullptr;
|
||||||
QNetworkProxy m_proxy;
|
QNetworkProxy m_proxy;
|
||||||
|
|
||||||
QSet<ServiceID> m_sequentialServices;
|
// m_sequentialServices value is delay for same host requests
|
||||||
|
QHash<ServiceID, std::chrono::seconds> m_sequentialServices;
|
||||||
QSet<ServiceID> m_busyServices;
|
QSet<ServiceID> m_busyServices;
|
||||||
QHash<ServiceID, QQueue<DownloadHandlerImpl *>> m_waitingJobs;
|
QHash<ServiceID, QQueue<DownloadHandlerImpl *>> m_waitingJobs;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2015-2022 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2015-2022 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
||||||
|
@ -98,7 +99,7 @@ Feed::Feed(const QUuid &uid, const QString &url, const QString &path, Session *s
|
||||||
else
|
else
|
||||||
connect(m_session, &Session::processingStateChanged, this, &Feed::handleSessionProcessingEnabledChanged);
|
connect(m_session, &Session::processingStateChanged, this, &Feed::handleSessionProcessingEnabledChanged);
|
||||||
|
|
||||||
Net::DownloadManager::instance()->registerSequentialService(Net::ServiceID::fromURL(m_url));
|
Net::DownloadManager::instance()->registerSequentialService(Net::ServiceID::fromURL(m_url), m_session->fetchDelay());
|
||||||
|
|
||||||
load();
|
load();
|
||||||
}
|
}
|
||||||
|
@ -159,6 +160,12 @@ void Feed::refresh()
|
||||||
emit stateChanged(this);
|
emit stateChanged(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Feed::updateFetchDelay()
|
||||||
|
{
|
||||||
|
// Update delay values for registered sequential services
|
||||||
|
Net::DownloadManager::instance()->registerSequentialService(Net::ServiceID::fromURL(m_url), m_session->fetchDelay());
|
||||||
|
}
|
||||||
|
|
||||||
QUuid Feed::uid() const
|
QUuid Feed::uid() const
|
||||||
{
|
{
|
||||||
return m_uid;
|
return m_uid;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2015-2022 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2015-2022 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
||||||
|
@ -75,6 +76,7 @@ namespace RSS
|
||||||
int unreadCount() const override;
|
int unreadCount() const override;
|
||||||
void markAsRead() override;
|
void markAsRead() override;
|
||||||
void refresh() override;
|
void refresh() override;
|
||||||
|
void updateFetchDelay() override;
|
||||||
|
|
||||||
QUuid uid() const;
|
QUuid uid() const;
|
||||||
QString url() const;
|
QString url() const;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
||||||
|
@ -91,6 +92,12 @@ void Folder::refresh()
|
||||||
item->refresh();
|
item->refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Folder::updateFetchDelay()
|
||||||
|
{
|
||||||
|
for (Item *item : asConst(items()))
|
||||||
|
item->updateFetchDelay();
|
||||||
|
}
|
||||||
|
|
||||||
QList<Item *> Folder::items() const
|
QList<Item *> Folder::items() const
|
||||||
{
|
{
|
||||||
return m_items;
|
return m_items;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
||||||
|
@ -54,6 +55,7 @@ namespace RSS
|
||||||
int unreadCount() const override;
|
int unreadCount() const override;
|
||||||
void markAsRead() override;
|
void markAsRead() override;
|
||||||
void refresh() override;
|
void refresh() override;
|
||||||
|
void updateFetchDelay() override;
|
||||||
|
|
||||||
QList<Item *> items() const;
|
QList<Item *> items() const;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
||||||
|
@ -52,6 +53,7 @@ namespace RSS
|
||||||
virtual int unreadCount() const = 0;
|
virtual int unreadCount() const = 0;
|
||||||
virtual void markAsRead() = 0;
|
virtual void markAsRead() = 0;
|
||||||
virtual void refresh() = 0;
|
virtual void refresh() = 0;
|
||||||
|
virtual void updateFetchDelay() = 0;
|
||||||
|
|
||||||
QString path() const;
|
QString path() const;
|
||||||
QString name() const;
|
QString name() const;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
||||||
|
@ -62,6 +63,7 @@ QPointer<Session> Session::m_instance = nullptr;
|
||||||
Session::Session()
|
Session::Session()
|
||||||
: m_storeProcessingEnabled(u"RSS/Session/EnableProcessing"_s)
|
: m_storeProcessingEnabled(u"RSS/Session/EnableProcessing"_s)
|
||||||
, m_storeRefreshInterval(u"RSS/Session/RefreshInterval"_s, 30)
|
, m_storeRefreshInterval(u"RSS/Session/RefreshInterval"_s, 30)
|
||||||
|
, m_storeFetchDelay(u"RSS/Session/FetchDelay"_s, 2)
|
||||||
, m_storeMaxArticlesPerFeed(u"RSS/Session/MaxArticlesPerFeed"_s, 50)
|
, m_storeMaxArticlesPerFeed(u"RSS/Session/MaxArticlesPerFeed"_s, 50)
|
||||||
, m_workingThread(new QThread)
|
, m_workingThread(new QThread)
|
||||||
{
|
{
|
||||||
|
@ -525,6 +527,19 @@ void Session::setRefreshInterval(const int refreshInterval)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::chrono::seconds Session::fetchDelay() const
|
||||||
|
{
|
||||||
|
return std::chrono::seconds(m_storeFetchDelay);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Session::setFetchDelay(const std::chrono::seconds delay)
|
||||||
|
{
|
||||||
|
if (delay == fetchDelay())
|
||||||
|
return;
|
||||||
|
m_storeFetchDelay = static_cast<qint64>(delay.count());
|
||||||
|
rootFolder()->updateFetchDelay();
|
||||||
|
}
|
||||||
|
|
||||||
QThread *Session::workingThread() const
|
QThread *Session::workingThread() const
|
||||||
{
|
{
|
||||||
return m_workingThread.get();
|
return m_workingThread.get();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
|
||||||
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
|
||||||
|
@ -68,6 +69,8 @@
|
||||||
* 3. Feed is JSON object (keys are property names, values are property values; 'uid' and 'url' are required)
|
* 3. Feed is JSON object (keys are property names, values are property values; 'uid' and 'url' are required)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
|
@ -114,6 +117,9 @@ namespace RSS
|
||||||
int refreshInterval() const;
|
int refreshInterval() const;
|
||||||
void setRefreshInterval(int refreshInterval);
|
void setRefreshInterval(int refreshInterval);
|
||||||
|
|
||||||
|
std::chrono::seconds fetchDelay() const;
|
||||||
|
void setFetchDelay(std::chrono::seconds delay);
|
||||||
|
|
||||||
nonstd::expected<void, QString> addFolder(const QString &path);
|
nonstd::expected<void, QString> addFolder(const QString &path);
|
||||||
nonstd::expected<void, QString> addFeed(const QString &url, const QString &path);
|
nonstd::expected<void, QString> addFeed(const QString &url, const QString &path);
|
||||||
nonstd::expected<void, QString> setFeedURL(const QString &path, const QString &url);
|
nonstd::expected<void, QString> setFeedURL(const QString &path, const QString &url);
|
||||||
|
@ -161,6 +167,7 @@ namespace RSS
|
||||||
|
|
||||||
CachedSettingValue<bool> m_storeProcessingEnabled;
|
CachedSettingValue<bool> m_storeProcessingEnabled;
|
||||||
CachedSettingValue<int> m_storeRefreshInterval;
|
CachedSettingValue<int> m_storeRefreshInterval;
|
||||||
|
CachedSettingValue<qint64> m_storeFetchDelay;
|
||||||
CachedSettingValue<int> m_storeMaxArticlesPerFeed;
|
CachedSettingValue<int> m_storeMaxArticlesPerFeed;
|
||||||
Utils::Thread::UniquePtr m_workingThread;
|
Utils::Thread::UniquePtr m_workingThread;
|
||||||
AsyncFileStorage *m_confFileStorage = nullptr;
|
AsyncFileStorage *m_confFileStorage = nullptr;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2023 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2023 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||||
*
|
*
|
||||||
|
@ -29,6 +30,7 @@
|
||||||
|
|
||||||
#include "optionsdialog.h"
|
#include "optionsdialog.h"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
|
@ -1193,6 +1195,7 @@ void OptionsDialog::loadRSSTabOptions()
|
||||||
|
|
||||||
m_ui->checkRSSEnable->setChecked(rssSession->isProcessingEnabled());
|
m_ui->checkRSSEnable->setChecked(rssSession->isProcessingEnabled());
|
||||||
m_ui->spinRSSRefreshInterval->setValue(rssSession->refreshInterval());
|
m_ui->spinRSSRefreshInterval->setValue(rssSession->refreshInterval());
|
||||||
|
m_ui->spinRSSFetchDelay->setValue(rssSession->fetchDelay().count());
|
||||||
m_ui->spinRSSMaxArticlesPerFeed->setValue(rssSession->maxArticlesPerFeed());
|
m_ui->spinRSSMaxArticlesPerFeed->setValue(rssSession->maxArticlesPerFeed());
|
||||||
m_ui->checkRSSAutoDownloaderEnable->setChecked(autoDownloader->isProcessingEnabled());
|
m_ui->checkRSSAutoDownloaderEnable->setChecked(autoDownloader->isProcessingEnabled());
|
||||||
m_ui->textSmartEpisodeFilters->setPlainText(autoDownloader->smartEpisodeFilters().join(u'\n'));
|
m_ui->textSmartEpisodeFilters->setPlainText(autoDownloader->smartEpisodeFilters().join(u'\n'));
|
||||||
|
@ -1209,6 +1212,7 @@ void OptionsDialog::loadRSSTabOptions()
|
||||||
connect(m_ui->textSmartEpisodeFilters, &QPlainTextEdit::textChanged, this, &OptionsDialog::enableApplyButton);
|
connect(m_ui->textSmartEpisodeFilters, &QPlainTextEdit::textChanged, this, &OptionsDialog::enableApplyButton);
|
||||||
connect(m_ui->checkSmartFilterDownloadRepacks, &QCheckBox::toggled, this, &OptionsDialog::enableApplyButton);
|
connect(m_ui->checkSmartFilterDownloadRepacks, &QCheckBox::toggled, this, &OptionsDialog::enableApplyButton);
|
||||||
connect(m_ui->spinRSSRefreshInterval, qSpinBoxValueChanged, this, &OptionsDialog::enableApplyButton);
|
connect(m_ui->spinRSSRefreshInterval, qSpinBoxValueChanged, this, &OptionsDialog::enableApplyButton);
|
||||||
|
connect(m_ui->spinRSSFetchDelay, qSpinBoxValueChanged, this, &OptionsDialog::enableApplyButton);
|
||||||
connect(m_ui->spinRSSMaxArticlesPerFeed, qSpinBoxValueChanged, this, &OptionsDialog::enableApplyButton);
|
connect(m_ui->spinRSSMaxArticlesPerFeed, qSpinBoxValueChanged, this, &OptionsDialog::enableApplyButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1219,6 +1223,7 @@ void OptionsDialog::saveRSSTabOptions() const
|
||||||
|
|
||||||
rssSession->setProcessingEnabled(m_ui->checkRSSEnable->isChecked());
|
rssSession->setProcessingEnabled(m_ui->checkRSSEnable->isChecked());
|
||||||
rssSession->setRefreshInterval(m_ui->spinRSSRefreshInterval->value());
|
rssSession->setRefreshInterval(m_ui->spinRSSRefreshInterval->value());
|
||||||
|
rssSession->setFetchDelay(std::chrono::seconds(m_ui->spinRSSFetchDelay->value()));
|
||||||
rssSession->setMaxArticlesPerFeed(m_ui->spinRSSMaxArticlesPerFeed->value());
|
rssSession->setMaxArticlesPerFeed(m_ui->spinRSSMaxArticlesPerFeed->value());
|
||||||
autoDownloader->setProcessingEnabled(m_ui->checkRSSAutoDownloaderEnable->isChecked());
|
autoDownloader->setProcessingEnabled(m_ui->checkRSSAutoDownloaderEnable->isChecked());
|
||||||
autoDownloader->setSmartEpisodeFilters(m_ui->textSmartEpisodeFilters->toPlainText().split(u'\n', Qt::SkipEmptyParts));
|
autoDownloader->setSmartEpisodeFilters(m_ui->textSmartEpisodeFilters->toPlainText().split(u'\n', Qt::SkipEmptyParts));
|
||||||
|
|
|
@ -3155,19 +3155,22 @@ Disable encryption: Only connect to peers without protocol encryption</string>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="QSpinBox" name="spinRSSMaxArticlesPerFeed">
|
<widget class="QSpinBox" name="spinRSSFetchDelay">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> sec</string>
|
||||||
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>2147483646</number>
|
<number>2147483646</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>100</number>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="label_12">
|
<widget class="QLabel" name="labelRSSFetchDelay">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Maximum number of articles per feed:</string>
|
<string>Same host request delay:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -3200,6 +3203,23 @@ Disable encryption: Only connect to peers without protocol encryption</string>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QSpinBox" name="spinRSSMaxArticlesPerFeed">
|
||||||
|
<property name="maximum">
|
||||||
|
<number>2147483646</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_12">
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum number of articles per feed:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Bittorrent Client using Qt and libtorrent.
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2024 Jonathan Ketchker
|
||||||
* Copyright (C) 2018 Vladimir Golovnev <glassez@yandex.ru>
|
* Copyright (C) 2018 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
* Copyright (C) 2006-2012 Christophe Dumez <chris@qbittorrent.org>
|
* Copyright (C) 2006-2012 Christophe Dumez <chris@qbittorrent.org>
|
||||||
* Copyright (C) 2006-2012 Ishan Arora <ishan@qbittorrent.org>
|
* Copyright (C) 2006-2012 Ishan Arora <ishan@qbittorrent.org>
|
||||||
|
@ -321,6 +322,7 @@ void AppController::preferencesAction()
|
||||||
|
|
||||||
// RSS settings
|
// RSS settings
|
||||||
data[u"rss_refresh_interval"_s] = RSS::Session::instance()->refreshInterval();
|
data[u"rss_refresh_interval"_s] = RSS::Session::instance()->refreshInterval();
|
||||||
|
data[u"rss_fetch_delay"_s] = static_cast<qlonglong>(RSS::Session::instance()->fetchDelay().count());
|
||||||
data[u"rss_max_articles_per_feed"_s] = RSS::Session::instance()->maxArticlesPerFeed();
|
data[u"rss_max_articles_per_feed"_s] = RSS::Session::instance()->maxArticlesPerFeed();
|
||||||
data[u"rss_processing_enabled"_s] = RSS::Session::instance()->isProcessingEnabled();
|
data[u"rss_processing_enabled"_s] = RSS::Session::instance()->isProcessingEnabled();
|
||||||
data[u"rss_auto_downloading_enabled"_s] = RSS::AutoDownloader::instance()->isProcessingEnabled();
|
data[u"rss_auto_downloading_enabled"_s] = RSS::AutoDownloader::instance()->isProcessingEnabled();
|
||||||
|
@ -870,6 +872,8 @@ void AppController::setPreferencesAction()
|
||||||
|
|
||||||
if (hasKey(u"rss_refresh_interval"_s))
|
if (hasKey(u"rss_refresh_interval"_s))
|
||||||
RSS::Session::instance()->setRefreshInterval(it.value().toInt());
|
RSS::Session::instance()->setRefreshInterval(it.value().toInt());
|
||||||
|
if (hasKey(u"rss_fetch_delay"_s))
|
||||||
|
RSS::Session::instance()->setFetchDelay(std::chrono::seconds(it.value().toLongLong()));
|
||||||
if (hasKey(u"rss_max_articles_per_feed"_s))
|
if (hasKey(u"rss_max_articles_per_feed"_s))
|
||||||
RSS::Session::instance()->setMaxArticlesPerFeed(it.value().toInt());
|
RSS::Session::instance()->setMaxArticlesPerFeed(it.value().toInt());
|
||||||
if (hasKey(u"rss_processing_enabled"_s))
|
if (hasKey(u"rss_processing_enabled"_s))
|
||||||
|
|
|
@ -737,6 +737,14 @@
|
||||||
<input type="text" id="feed_refresh_interval" style="width: 4em;" /> QBT_TR( min)QBT_TR[CONTEXT=OptionsDialog]
|
<input type="text" id="feed_refresh_interval" style="width: 4em;" /> QBT_TR( min)QBT_TR[CONTEXT=OptionsDialog]
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="feedFetchDelay">QBT_TR(Same host request delay:)QBT_TR[CONTEXT=OptionsDialog]</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" id="feedFetchDelay" style="width: 4em;" /> QBT_TR( sec)QBT_TR[CONTEXT=OptionsDialog]
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<label for="maximum_article_number">QBT_TR(Maximum number of articles per feed:)QBT_TR[CONTEXT=OptionsDialog]</label>
|
<label for="maximum_article_number">QBT_TR(Maximum number of articles per feed:)QBT_TR[CONTEXT=OptionsDialog]</label>
|
||||||
|
@ -2227,6 +2235,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD
|
||||||
// RSS Tab
|
// RSS Tab
|
||||||
$('enable_fetching_rss_feeds_checkbox').setProperty('checked', pref.rss_processing_enabled);
|
$('enable_fetching_rss_feeds_checkbox').setProperty('checked', pref.rss_processing_enabled);
|
||||||
$('feed_refresh_interval').setProperty('value', pref.rss_refresh_interval);
|
$('feed_refresh_interval').setProperty('value', pref.rss_refresh_interval);
|
||||||
|
$('feedFetchDelay').setProperty('value', perf.rss_fetch_delay);
|
||||||
$('maximum_article_number').setProperty('value', pref.rss_max_articles_per_feed);
|
$('maximum_article_number').setProperty('value', pref.rss_max_articles_per_feed);
|
||||||
$('enable_auto_downloading_rss_torrents_checkbox').setProperty('checked', pref.rss_auto_downloading_enabled);
|
$('enable_auto_downloading_rss_torrents_checkbox').setProperty('checked', pref.rss_auto_downloading_enabled);
|
||||||
$('downlock_repack_proper_episodes').setProperty('checked', pref.rss_download_repack_proper_episodes);
|
$('downlock_repack_proper_episodes').setProperty('checked', pref.rss_download_repack_proper_episodes);
|
||||||
|
@ -2640,6 +2649,7 @@ Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsD
|
||||||
// RSS Tab
|
// RSS Tab
|
||||||
settings.set('rss_processing_enabled', $('enable_fetching_rss_feeds_checkbox').getProperty('checked'));
|
settings.set('rss_processing_enabled', $('enable_fetching_rss_feeds_checkbox').getProperty('checked'));
|
||||||
settings.set('rss_refresh_interval', $('feed_refresh_interval').getProperty('value'));
|
settings.set('rss_refresh_interval', $('feed_refresh_interval').getProperty('value'));
|
||||||
|
settings.set('rss_fetch_delay', $('feedFetchDelay').getProperties('value'));
|
||||||
settings.set('rss_max_articles_per_feed', $('maximum_article_number').getProperty('value'));
|
settings.set('rss_max_articles_per_feed', $('maximum_article_number').getProperty('value'));
|
||||||
settings.set('rss_auto_downloading_enabled', $('enable_auto_downloading_rss_torrents_checkbox').getProperty('checked'));
|
settings.set('rss_auto_downloading_enabled', $('enable_auto_downloading_rss_torrents_checkbox').getProperty('checked'));
|
||||||
settings.set('rss_download_repack_proper_episodes', $('downlock_repack_proper_episodes').getProperty('checked'));
|
settings.set('rss_download_repack_proper_episodes', $('downlock_repack_proper_episodes').getProperty('checked'));
|
||||||
|
|
Loading…
Reference in a new issue