mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-29 05:48:47 +03:00
WebUI: Implement server-side torrent filtering.
This commit is contained in:
parent
e887f574d7
commit
5edf0e251f
6 changed files with 197 additions and 6 deletions
|
@ -32,6 +32,7 @@
|
||||||
#include "fs_utils.h"
|
#include "fs_utils.h"
|
||||||
#include "qbtsession.h"
|
#include "qbtsession.h"
|
||||||
#include "torrentpersistentdata.h"
|
#include "torrentpersistentdata.h"
|
||||||
|
#include "qtorrentfilter.h"
|
||||||
#include "jsonutils.h"
|
#include "jsonutils.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
@ -213,7 +214,7 @@ static QVariantMap toMap(const QTorrentHandle& h)
|
||||||
* - "eta": Torrent ETA
|
* - "eta": Torrent ETA
|
||||||
* - "state": Torrent state
|
* - "state": Torrent state
|
||||||
*/
|
*/
|
||||||
QByteArray btjson::getTorrents()
|
QByteArray btjson::getTorrents(QString filter, QString label)
|
||||||
{
|
{
|
||||||
QVariantList torrent_list;
|
QVariantList torrent_list;
|
||||||
|
|
||||||
|
@ -221,8 +222,12 @@ QByteArray btjson::getTorrents()
|
||||||
std::vector<torrent_handle>::const_iterator it = torrents.begin();
|
std::vector<torrent_handle>::const_iterator it = torrents.begin();
|
||||||
std::vector<torrent_handle>::const_iterator end = torrents.end();
|
std::vector<torrent_handle>::const_iterator end = torrents.end();
|
||||||
|
|
||||||
|
QTorrentFilter torrentFilter(filter, label);
|
||||||
for( ; it != end; ++it) {
|
for( ; it != end; ++it) {
|
||||||
torrent_list.append(toMap(QTorrentHandle(*it)));
|
QTorrentHandle torrent = QTorrentHandle(*it);
|
||||||
|
|
||||||
|
if (torrentFilter.apply(torrent))
|
||||||
|
torrent_list.append(toMap(torrent));
|
||||||
}
|
}
|
||||||
|
|
||||||
return json::toJson(torrent_list);
|
return json::toJson(torrent_list);
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
|
class QTorrentHandle;
|
||||||
|
|
||||||
class btjson
|
class btjson
|
||||||
{
|
{
|
||||||
Q_DECLARE_TR_FUNCTIONS(misc)
|
Q_DECLARE_TR_FUNCTIONS(misc)
|
||||||
|
@ -42,7 +44,7 @@ private:
|
||||||
btjson() {}
|
btjson() {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static QByteArray getTorrents();
|
static QByteArray getTorrents(QString filter = "all", QString label = QString());
|
||||||
static QByteArray getTrackersForTorrent(const QString& hash);
|
static QByteArray getTrackersForTorrent(const QString& hash);
|
||||||
static QByteArray getPropertiesForTorrent(const QString& hash);
|
static QByteArray getPropertiesForTorrent(const QString& hash);
|
||||||
static QByteArray getFilesForTorrent(const QString& hash);
|
static QByteArray getFilesForTorrent(const QString& hash);
|
||||||
|
|
118
src/webui/qtorrentfilter.cpp
Normal file
118
src/webui/qtorrentfilter.cpp
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "torrentpersistentdata.h"
|
||||||
|
#include "qtorrentfilter.h"
|
||||||
|
|
||||||
|
QTorrentFilter::QTorrentFilter(QString filter, QString label)
|
||||||
|
: type_(All)
|
||||||
|
, label_(label)
|
||||||
|
{
|
||||||
|
if (filter == "downloading")
|
||||||
|
type_ = Downloading;
|
||||||
|
else if (filter == "completed")
|
||||||
|
type_ = Completed;
|
||||||
|
else if (filter == "paused")
|
||||||
|
type_ = Paused;
|
||||||
|
else if (filter == "active")
|
||||||
|
type_ = Active;
|
||||||
|
else if (filter == "inactive")
|
||||||
|
type_ = Inactive;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTorrentFilter::apply(const QTorrentHandle& h) const
|
||||||
|
{
|
||||||
|
if (!torrentHasLabel(h))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (type_) {
|
||||||
|
case Downloading:
|
||||||
|
return isTorrentDownloading(h);
|
||||||
|
case Completed:
|
||||||
|
return isTorrentCompleted(h);
|
||||||
|
case Paused:
|
||||||
|
return isTorrentPaused(h);
|
||||||
|
case Active:
|
||||||
|
return isTorrentActive(h);
|
||||||
|
case Inactive:
|
||||||
|
return isTorrentInactive(h);
|
||||||
|
default: // All
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTorrentFilter::isTorrentDownloading(const QTorrentHandle &h) const
|
||||||
|
{
|
||||||
|
const QTorrentState state = h.torrentState();
|
||||||
|
|
||||||
|
return state == QTorrentState::Downloading
|
||||||
|
|| state == QTorrentState::StalledDownloading
|
||||||
|
|| state == QTorrentState::CheckingDownloading
|
||||||
|
|| state == QTorrentState::PausedDownloading
|
||||||
|
|| state == QTorrentState::QueuedDownloading;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTorrentFilter::isTorrentCompleted(const QTorrentHandle &h) const
|
||||||
|
{
|
||||||
|
const QTorrentState state = h.torrentState();
|
||||||
|
|
||||||
|
return state == QTorrentState::Uploading
|
||||||
|
|| state == QTorrentState::StalledUploading
|
||||||
|
|| state == QTorrentState::CheckingUploading
|
||||||
|
|| state == QTorrentState::PausedUploading
|
||||||
|
|| state == QTorrentState::QueuedUploading;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTorrentFilter::isTorrentPaused(const QTorrentHandle &h) const
|
||||||
|
{
|
||||||
|
const QTorrentState state = h.torrentState();
|
||||||
|
|
||||||
|
return state == QTorrentState::PausedDownloading
|
||||||
|
|| state == QTorrentState::PausedUploading;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTorrentFilter::isTorrentActive(const QTorrentHandle &h) const
|
||||||
|
{
|
||||||
|
const QTorrentState state = h.torrentState();
|
||||||
|
|
||||||
|
return state == QTorrentState::Downloading
|
||||||
|
|| state == QTorrentState::Uploading;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTorrentFilter::isTorrentInactive(const QTorrentHandle &h) const
|
||||||
|
{
|
||||||
|
return !isTorrentActive(h);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QTorrentFilter::torrentHasLabel(const QTorrentHandle &h) const
|
||||||
|
{
|
||||||
|
if (label_.isNull())
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return TorrentPersistentData::getLabel(h.hash()) == label_;
|
||||||
|
}
|
63
src/webui/qtorrentfilter.h
Normal file
63
src/webui/qtorrentfilter.h
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt and libtorrent.
|
||||||
|
* Copyright (C) 2014 Vladimir Golovnev <glassez@yandex.ru>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||||
|
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||||
|
* and distribute the linked executables. You must obey the GNU General Public
|
||||||
|
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||||
|
* modify file(s), you may extend this exception to your version of the file(s),
|
||||||
|
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||||
|
* exception statement from your version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QTORRENTFILTER_H
|
||||||
|
#define QTORRENTFILTER_H
|
||||||
|
|
||||||
|
#include "qtorrenthandle.h"
|
||||||
|
|
||||||
|
class QTorrentFilter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
All,
|
||||||
|
Downloading,
|
||||||
|
Completed,
|
||||||
|
Paused,
|
||||||
|
Active,
|
||||||
|
Inactive
|
||||||
|
};
|
||||||
|
|
||||||
|
// label: pass empty string for "no label" or null string (QString()) for "any label"
|
||||||
|
QTorrentFilter(QString filter, QString label = QString());
|
||||||
|
bool apply(const QTorrentHandle& h) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int type_;
|
||||||
|
QString label_;
|
||||||
|
|
||||||
|
bool isTorrentDownloading(const QTorrentHandle &h) const;
|
||||||
|
bool isTorrentCompleted(const QTorrentHandle &h) const;
|
||||||
|
bool isTorrentPaused(const QTorrentHandle &h) const;
|
||||||
|
bool isTorrentActive(const QTorrentHandle &h) const;
|
||||||
|
bool isTorrentInactive(const QTorrentHandle &h) const;
|
||||||
|
bool torrentHasLabel(const QTorrentHandle &h) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // QTORRENTFILTER_H
|
|
@ -188,7 +188,8 @@ void RequestHandler::action_public_images()
|
||||||
|
|
||||||
void RequestHandler::action_json_torrents()
|
void RequestHandler::action_json_torrents()
|
||||||
{
|
{
|
||||||
print(btjson::getTorrents(), CONTENT_TYPE_JS);
|
const QStringMap& gets = request().gets;
|
||||||
|
print(btjson::getTorrents(gets["filter"], gets["label"]), CONTENT_TYPE_JS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RequestHandler::action_json_preferences()
|
void RequestHandler::action_json_preferences()
|
||||||
|
|
|
@ -11,7 +11,8 @@ HEADERS += $$PWD/httpserver.h \
|
||||||
$$PWD/extra_translations.h \
|
$$PWD/extra_translations.h \
|
||||||
$$PWD/webapplication.h \
|
$$PWD/webapplication.h \
|
||||||
$$PWD/abstractrequesthandler.h \
|
$$PWD/abstractrequesthandler.h \
|
||||||
$$PWD/requesthandler.h
|
$$PWD/requesthandler.h \
|
||||||
|
$$PWD/qtorrentfilter.h
|
||||||
|
|
||||||
SOURCES += $$PWD/httpserver.cpp \
|
SOURCES += $$PWD/httpserver.cpp \
|
||||||
$$PWD/httpconnection.cpp \
|
$$PWD/httpconnection.cpp \
|
||||||
|
@ -21,7 +22,8 @@ SOURCES += $$PWD/httpserver.cpp \
|
||||||
$$PWD/prefjson.cpp \
|
$$PWD/prefjson.cpp \
|
||||||
$$PWD/webapplication.cpp \
|
$$PWD/webapplication.cpp \
|
||||||
$$PWD/abstractrequesthandler.cpp \
|
$$PWD/abstractrequesthandler.cpp \
|
||||||
$$PWD/requesthandler.cpp
|
$$PWD/requesthandler.cpp \
|
||||||
|
$$PWD/qtorrentfilter.cpp
|
||||||
|
|
||||||
# QJson JSON parser/serializer for using with Qt4
|
# QJson JSON parser/serializer for using with Qt4
|
||||||
lessThan(QT_MAJOR_VERSION, 5) {
|
lessThan(QT_MAJOR_VERSION, 5) {
|
||||||
|
|
Loading…
Reference in a new issue