Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Delay subsequent requests to the same host #19801

Merged
merged 33 commits into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from 32 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
e79878a
Add RSS fetch delay to settings
jNullj Oct 25, 2023
5c471f0
Add RSS fetch delay to webui
jNullj Oct 25, 2023
ae79c73
Add RSS fetch delay functionality
jNullj Oct 27, 2023
8510d96
Fix code format and style
jNullj Dec 2, 2023
fad287c
Remove redundent code
jNullj Dec 2, 2023
e1d5d28
Use std::chrono::seconds for fetchDelay
jNullj Dec 3, 2023
dd94380
Merge branch 'qbittorrent:master' into feat/8350/RSS-request-delay
jNullj Dec 3, 2023
7a9dcde
Add delay to registerSequentialService
jNullj Dec 3, 2023
a3c426e
Update delay for registered sequential service
jNullj Dec 4, 2023
e72b20c
Merge branch 'qbittorrent:master' into feat/8350/RSS-request-delay
jNullj Dec 4, 2023
590c53d
Fix code format and style
jNullj Dec 15, 2023
a4eb01b
Add missing parameter const to functions
jNullj Dec 15, 2023
59c3025
Rearnge optionsdialog.ui for better code history
jNullj Dec 15, 2023
3e91435
Rename gui label for rss fetch delay
jNullj Dec 15, 2023
9eb1dc2
Merge m_serviceDelay into m_sequentialServices
jNullj Dec 15, 2023
b41d5f2
Merge branch 'qbittorrent:master' into feat/8350/RSS-request-delay
jNullj Dec 15, 2023
bba1400
Update fetch delay label in webui
jNullj Dec 15, 2023
ea4ad45
Change m_storeFetchDelay to qint64
jNullj Dec 18, 2023
93c0308
Update m_sequentialServices comment
jNullj Dec 18, 2023
c62f38a
Remove redundent registerSequentialService
jNullj Dec 18, 2023
7f6556f
Fix m_sequentialServices usage
jNullj Dec 18, 2023
eb44a21
Merge branch 'qbittorrent:master' into feat/8350/RSS-request-delay
jNullj Dec 18, 2023
5722c3c
Move delay into handleDownloadFinished
jNullj Dec 19, 2023
5a7c6b6
Merge branch 'qbittorrent:master' into feat/8350/RSS-request-delay
jNullj Dec 19, 2023
a4cfe0f
Merge branch 'qbittorrent:master' into feat/8350/RSS-request-delay
jNullj Jan 6, 2024
b541ed6
Remove redundant declaration
glassez Jan 6, 2024
f505990
Fix naming style
glassez Jan 6, 2024
aa96086
Avoid fetch delay clip at webui
jNullj Jan 7, 2024
6fa7c4e
Update spinRSSFetchDelay max value
jNullj Jan 7, 2024
01509fa
Merge branch 'master' into feat/8350/RSS-request-delay after improvme…
jNullj Jan 13, 2024
64d62df
Add delay to processRequest
jNullj Jan 13, 2024
64894d3
Add copyright notice
jNullj Jan 13, 2024
8f6218e
Fix copyright notice
jNullj Jan 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/base/net/downloadmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2015-2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
jNullj marked this conversation as resolved.
Show resolved Hide resolved
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -49,6 +50,8 @@
#include "downloadhandlerimpl.h"
#include "proxyconfigurationmanager.h"

using namespace std::chrono_literals;

namespace
{
// Disguise as Firefox to avoid web server banning
Expand Down Expand Up @@ -188,9 +191,9 @@ Net::DownloadHandler *Net::DownloadManager::download(const DownloadRequest &down
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
Expand Down Expand Up @@ -309,7 +312,7 @@ void Net::DownloadManager::processRequest(DownloadHandlerImpl *downloadHandler)
QNetworkReply *reply = m_networkManager->get(request);
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);
}
Expand Down
8 changes: 6 additions & 2 deletions src/base/net/downloadmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2015-2024 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -29,6 +30,8 @@

#pragma once

#include <chrono>

#include <QtTypes>
#include <QHash>
#include <QNetworkProxy>
Expand Down Expand Up @@ -137,7 +140,7 @@ namespace Net
template <typename Context, typename Func>
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;
bool setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url);
Expand All @@ -161,7 +164,8 @@ namespace Net
QNetworkAccessManager *m_networkManager = nullptr;
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;
QHash<ServiceID, QQueue<DownloadHandlerImpl *>> m_waitingJobs;
};
Expand Down
9 changes: 8 additions & 1 deletion src/base/rss/rss_feed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2015-2022 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -98,7 +99,7 @@ Feed::Feed(const QUuid &uid, const QString &url, const QString &path, Session *s
else
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();
}
Expand Down Expand Up @@ -159,6 +160,12 @@ void Feed::refresh()
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
{
return m_uid;
Expand Down
2 changes: 2 additions & 0 deletions src/base/rss/rss_feed.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2015-2022 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -75,6 +76,7 @@ namespace RSS
int unreadCount() const override;
void markAsRead() override;
void refresh() override;
void updateFetchDelay() override;

QUuid uid() const;
QString url() const;
Expand Down
7 changes: 7 additions & 0 deletions src/base/rss/rss_folder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -91,6 +92,12 @@ void Folder::refresh()
item->refresh();
}

void Folder::updateFetchDelay()
{
for (Item *item : asConst(items()))
item->updateFetchDelay();
}

QList<Item *> Folder::items() const
{
return m_items;
Expand Down
2 changes: 2 additions & 0 deletions src/base/rss/rss_folder.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -54,6 +55,7 @@ namespace RSS
int unreadCount() const override;
void markAsRead() override;
void refresh() override;
void updateFetchDelay() override;

QList<Item *> items() const;

Expand Down
2 changes: 2 additions & 0 deletions src/base/rss/rss_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -52,6 +53,7 @@ namespace RSS
virtual int unreadCount() const = 0;
virtual void markAsRead() = 0;
virtual void refresh() = 0;
virtual void updateFetchDelay() = 0;

QString path() const;
QString name() const;
Expand Down
15 changes: 15 additions & 0 deletions src/base/rss/rss_session.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -62,6 +63,7 @@ QPointer<Session> Session::m_instance = nullptr;
Session::Session()
: m_storeProcessingEnabled(u"RSS/Session/EnableProcessing"_s)
, m_storeRefreshInterval(u"RSS/Session/RefreshInterval"_s, 30)
, m_storeFetchDelay(u"RSS/Session/FetchDelay"_s, 2)
jNullj marked this conversation as resolved.
Show resolved Hide resolved
, m_storeMaxArticlesPerFeed(u"RSS/Session/MaxArticlesPerFeed"_s, 50)
, m_workingThread(new QThread)
{
Expand Down Expand Up @@ -525,6 +527,19 @@ void Session::setRefreshInterval(const int refreshInterval)
}
}

std::chrono::seconds Session::fetchDelay() const
{
return std::chrono::seconds(m_storeFetchDelay);
jNullj marked this conversation as resolved.
Show resolved Hide resolved
}

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
{
return m_workingThread.get();
Expand Down
7 changes: 7 additions & 0 deletions src/base/rss/rss_session.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2017 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2010 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2010 Arnaud Demaiziere <arnaud@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -68,6 +69,8 @@
* 3. Feed is JSON object (keys are property names, values are property values; 'uid' and 'url' are required)
*/

#include <chrono>

#include <QHash>
#include <QObject>
#include <QPointer>
Expand Down Expand Up @@ -114,6 +117,9 @@ namespace RSS
int refreshInterval() const;
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> addFeed(const QString &url, const QString &path);
nonstd::expected<void, QString> setFeedURL(const QString &path, const QString &url);
Expand Down Expand Up @@ -161,6 +167,7 @@ namespace RSS

CachedSettingValue<bool> m_storeProcessingEnabled;
CachedSettingValue<int> m_storeRefreshInterval;
CachedSettingValue<qint64> m_storeFetchDelay;
CachedSettingValue<int> m_storeMaxArticlesPerFeed;
Utils::Thread::UniquePtr m_workingThread;
AsyncFileStorage *m_confFileStorage = nullptr;
Expand Down
5 changes: 5 additions & 0 deletions src/gui/optionsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2023 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -29,6 +30,7 @@

#include "optionsdialog.h"

#include <chrono>
#include <cstdlib>
#include <limits>

Expand Down Expand Up @@ -1193,6 +1195,7 @@ void OptionsDialog::loadRSSTabOptions()

m_ui->checkRSSEnable->setChecked(rssSession->isProcessingEnabled());
m_ui->spinRSSRefreshInterval->setValue(rssSession->refreshInterval());
m_ui->spinRSSFetchDelay->setValue(rssSession->fetchDelay().count());
m_ui->spinRSSMaxArticlesPerFeed->setValue(rssSession->maxArticlesPerFeed());
m_ui->checkRSSAutoDownloaderEnable->setChecked(autoDownloader->isProcessingEnabled());
m_ui->textSmartEpisodeFilters->setPlainText(autoDownloader->smartEpisodeFilters().join(u'\n'));
Expand All @@ -1209,6 +1212,7 @@ void OptionsDialog::loadRSSTabOptions()
connect(m_ui->textSmartEpisodeFilters, &QPlainTextEdit::textChanged, this, &OptionsDialog::enableApplyButton);
connect(m_ui->checkSmartFilterDownloadRepacks, &QCheckBox::toggled, 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);
}

Expand All @@ -1219,6 +1223,7 @@ void OptionsDialog::saveRSSTabOptions() const

rssSession->setProcessingEnabled(m_ui->checkRSSEnable->isChecked());
rssSession->setRefreshInterval(m_ui->spinRSSRefreshInterval->value());
rssSession->setFetchDelay(std::chrono::seconds(m_ui->spinRSSFetchDelay->value()));
rssSession->setMaxArticlesPerFeed(m_ui->spinRSSMaxArticlesPerFeed->value());
autoDownloader->setProcessingEnabled(m_ui->checkRSSAutoDownloaderEnable->isChecked());
autoDownloader->setSmartEpisodeFilters(m_ui->textSmartEpisodeFilters->toPlainText().split(u'\n', Qt::SkipEmptyParts));
Expand Down
28 changes: 24 additions & 4 deletions src/gui/optionsdialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -3155,19 +3155,22 @@ Disable encryption: Only connect to peers without protocol encryption</string>
</widget>
</item>
<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">
<number>2147483646</number>
</property>
<property name="value">
<number>100</number>
<number>2</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_12">
<widget class="QLabel" name="labelRSSFetchDelay">
<property name="text">
<string>Maximum number of articles per feed:</string>
<string>Same host request delay:</string>
</property>
</widget>
</item>
Expand Down Expand Up @@ -3200,6 +3203,23 @@ Disable encryption: Only connect to peers without protocol encryption</string>
</property>
</spacer>
</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>
</item>
</layout>
Expand Down
4 changes: 4 additions & 0 deletions src/webui/api/appcontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (C) 2018 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2006-2012 Christophe Dumez <chris@qbittorrent.org>
* Copyright (C) 2006-2012 Ishan Arora <ishan@qbittorrent.org>
* Copyright (C) 2024 Jonathan Ketchker <15849761+jNullj@users.noreply.github.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
Expand Down Expand Up @@ -321,6 +322,7 @@ void AppController::preferencesAction()

// RSS settings
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_processing_enabled"_s] = RSS::Session::instance()->isProcessingEnabled();
data[u"rss_auto_downloading_enabled"_s] = RSS::AutoDownloader::instance()->isProcessingEnabled();
Expand Down Expand Up @@ -870,6 +872,8 @@ void AppController::setPreferencesAction()

if (hasKey(u"rss_refresh_interval"_s))
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))
RSS::Session::instance()->setMaxArticlesPerFeed(it.value().toInt());
if (hasKey(u"rss_processing_enabled"_s))
Expand Down
10 changes: 10 additions & 0 deletions src/webui/www/private/views/preferences.html
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,14 @@
<input type="text" id="feed_refresh_interval" style="width: 4em;" />&nbsp;&nbsp;QBT_TR( min)QBT_TR[CONTEXT=OptionsDialog]
</td>
</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;" />&nbsp;&nbsp;QBT_TR( sec)QBT_TR[CONTEXT=OptionsDialog]
</td>
</tr>
<tr>
<td>
<label for="maximum_article_number">QBT_TR(Maximum number of articles per feed:)QBT_TR[CONTEXT=OptionsDialog]</label>
Expand Down Expand Up @@ -2227,6 +2235,7 @@
// RSS Tab
$('enable_fetching_rss_feeds_checkbox').setProperty('checked', pref.rss_processing_enabled);
$('feed_refresh_interval').setProperty('value', pref.rss_refresh_interval);
$('feedFetchDelay').setProperty('value', perf.rss_fetch_delay);
jNullj marked this conversation as resolved.
Show resolved Hide resolved
$('maximum_article_number').setProperty('value', pref.rss_max_articles_per_feed);
$('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);
Expand Down Expand Up @@ -2640,6 +2649,7 @@
// RSS Tab
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_fetch_delay', $('feedFetchDelay').getProperties('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_download_repack_proper_episodes', $('downlock_repack_proper_episodes').getProperty('checked'));
Expand Down