Refactoring
This commit is contained in:
@@ -43,7 +43,7 @@
|
||||
#include "subsonicservice.h"
|
||||
#include "subsonicbaserequest.h"
|
||||
|
||||
#include "settings/subsonicsettingspage.h"
|
||||
#include "constants/subsonicsettings.h"
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
@@ -56,7 +56,7 @@ SubsonicBaseRequest::SubsonicBaseRequest(SubsonicService *service, QObject *pare
|
||||
|
||||
}
|
||||
|
||||
QUrl SubsonicBaseRequest::CreateUrl(const QUrl &server_url, const SubsonicSettingsPage::AuthMethod auth_method, const QString &username, const QString &password, const QString &ressource_name, const ParamList ¶ms_provided) {
|
||||
QUrl SubsonicBaseRequest::CreateUrl(const QUrl &server_url, const SubsonicSettings::AuthMethod auth_method, const QString &username, const QString &password, const QString &ressource_name, const ParamList ¶ms_provided) {
|
||||
|
||||
ParamList params = ParamList() << params_provided
|
||||
<< Param(u"c"_s, QLatin1String(SubsonicService::kClientName))
|
||||
@@ -64,7 +64,7 @@ QUrl SubsonicBaseRequest::CreateUrl(const QUrl &server_url, const SubsonicSettin
|
||||
<< Param(u"f"_s, u"json"_s)
|
||||
<< Param(u"u"_s, username);
|
||||
|
||||
if (auth_method == SubsonicSettingsPage::AuthMethod::Hex) {
|
||||
if (auth_method == SubsonicSettings::AuthMethod::Hex) {
|
||||
params << Param(u"p"_s, u"enc:"_s + QString::fromUtf8(password.toUtf8().toHex()));
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -34,9 +34,9 @@
|
||||
#include <QSslError>
|
||||
#include <QJsonObject>
|
||||
|
||||
#include "core/scoped_ptr.h"
|
||||
#include "includes/scoped_ptr.h"
|
||||
#include "subsonicservice.h"
|
||||
#include "settings/subsonicsettingspage.h"
|
||||
#include "constants/subsonicsettings.h"
|
||||
|
||||
class QNetworkAccessManager;
|
||||
class QNetworkReply;
|
||||
@@ -52,7 +52,7 @@ class SubsonicBaseRequest : public QObject {
|
||||
using ParamList = QList<Param>;
|
||||
|
||||
public:
|
||||
static QUrl CreateUrl(const QUrl &server_url, const SubsonicSettingsPage::AuthMethod auth_method, const QString &username, const QString &password, const QString &ressource_name, const ParamList ¶ms_provided);
|
||||
static QUrl CreateUrl(const QUrl &server_url, const SubsonicSettings::AuthMethod auth_method, const QString &username, const QString &password, const QString &ressource_name, const ParamList ¶ms_provided);
|
||||
|
||||
protected:
|
||||
QNetworkReply *CreateGetRequest(const QString &ressource_name, const ParamList ¶ms_provided) const;
|
||||
@@ -65,7 +65,7 @@ class SubsonicBaseRequest : public QObject {
|
||||
QUrl server_url() const { return service_->server_url(); }
|
||||
QString username() const { return service_->username(); }
|
||||
QString password() const { return service_->password(); }
|
||||
SubsonicSettingsPage::AuthMethod auth_method() const { return service_->auth_method(); }
|
||||
SubsonicSettings::AuthMethod auth_method() const { return service_->auth_method(); }
|
||||
bool http2() const { return service_->http2(); }
|
||||
bool verify_certificate() const { return service_->verify_certificate(); }
|
||||
bool download_album_covers() const { return service_->download_album_covers(); }
|
||||
|
||||
@@ -39,12 +39,11 @@
|
||||
#include <QJsonArray>
|
||||
#include <QJsonValue>
|
||||
|
||||
#include "core/application.h"
|
||||
#include "core/logging.h"
|
||||
#include "core/song.h"
|
||||
#include "core/networktimeouts.h"
|
||||
#include "utilities/imageutils.h"
|
||||
#include "utilities/timeconstants.h"
|
||||
#include "constants/timeconstants.h"
|
||||
#include "subsonicservice.h"
|
||||
#include "subsonicurlhandler.h"
|
||||
#include "subsonicbaserequest.h"
|
||||
@@ -58,11 +57,10 @@ constexpr int kMaxConcurrentAlbumSongsRequests = 3;
|
||||
constexpr int kMaxConcurrentAlbumCoverRequests = 1;
|
||||
} // namespace
|
||||
|
||||
SubsonicRequest::SubsonicRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, Application *app, QObject *parent)
|
||||
SubsonicRequest::SubsonicRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, QObject *parent)
|
||||
: SubsonicBaseRequest(service, parent),
|
||||
service_(service),
|
||||
url_handler_(url_handler),
|
||||
app_(app),
|
||||
network_(new QNetworkAccessManager(this)),
|
||||
timeouts_(new NetworkTimeouts(30000, this)),
|
||||
finished_(false),
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
|
||||
class QNetworkAccessManager;
|
||||
class QNetworkReply;
|
||||
class Application;
|
||||
class SubsonicService;
|
||||
class SubsonicUrlHandler;
|
||||
class NetworkTimeouts;
|
||||
@@ -51,7 +50,7 @@ class SubsonicRequest : public SubsonicBaseRequest {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SubsonicRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, Application *app, QObject *parent = nullptr);
|
||||
explicit SubsonicRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, QObject *parent = nullptr);
|
||||
~SubsonicRequest() override;
|
||||
|
||||
void ReloadSettings();
|
||||
@@ -112,7 +111,6 @@ class SubsonicRequest : public SubsonicBaseRequest {
|
||||
|
||||
SubsonicService *service_;
|
||||
SubsonicUrlHandler *url_handler_;
|
||||
Application *app_;
|
||||
QNetworkAccessManager *network_;
|
||||
NetworkTimeouts *timeouts_;
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include <QJsonArray>
|
||||
#include <QJsonValue>
|
||||
|
||||
#include "core/application.h"
|
||||
#include "core/logging.h"
|
||||
#include "subsonicservice.h"
|
||||
#include "subsonicbaserequest.h"
|
||||
@@ -41,11 +40,10 @@ namespace {
|
||||
constexpr int kMaxConcurrentScrobbleRequests = 3;
|
||||
}
|
||||
|
||||
SubsonicScrobbleRequest::SubsonicScrobbleRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, Application *app, QObject *parent)
|
||||
SubsonicScrobbleRequest::SubsonicScrobbleRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, QObject *parent)
|
||||
: SubsonicBaseRequest(service, parent),
|
||||
service_(service),
|
||||
url_handler_(url_handler),
|
||||
app_(app),
|
||||
scrobble_requests_active_(0) {}
|
||||
|
||||
SubsonicScrobbleRequest::~SubsonicScrobbleRequest() {
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <QtGlobal>
|
||||
#include <QObject>
|
||||
#include <QDateTime>
|
||||
@@ -36,7 +34,6 @@
|
||||
#include "subsonicbaserequest.h"
|
||||
|
||||
class QNetworkReply;
|
||||
class Application;
|
||||
class SubsonicService;
|
||||
class SubsonicUrlHandler;
|
||||
|
||||
@@ -44,7 +41,7 @@ class SubsonicScrobbleRequest : public SubsonicBaseRequest {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SubsonicScrobbleRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, Application *app, QObject *parent = nullptr);
|
||||
explicit SubsonicScrobbleRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, QObject *parent = nullptr);
|
||||
~SubsonicScrobbleRequest() override;
|
||||
|
||||
void CreateScrobbleRequest(const QString &song_id, const bool submission, const QDateTime &start_time);
|
||||
@@ -71,7 +68,6 @@ class SubsonicScrobbleRequest : public SubsonicBaseRequest {
|
||||
|
||||
SubsonicService *service_;
|
||||
SubsonicUrlHandler *url_handler_;
|
||||
Application *app_;
|
||||
|
||||
QQueue<Request> scrobble_requests_queue_;
|
||||
|
||||
|
||||
@@ -42,13 +42,12 @@
|
||||
#include <QJsonObject>
|
||||
#include <QSettings>
|
||||
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "core/logging.h"
|
||||
#include "core/shared_ptr.h"
|
||||
#include "core/application.h"
|
||||
#include "core/player.h"
|
||||
#include "core/database.h"
|
||||
#include "core/song.h"
|
||||
#include "core/settings.h"
|
||||
#include "core/urlhandlers.h"
|
||||
#include "utilities/randutils.h"
|
||||
#include "collection/collectionbackend.h"
|
||||
#include "collection/collectionmodel.h"
|
||||
@@ -56,8 +55,7 @@
|
||||
#include "subsonicurlhandler.h"
|
||||
#include "subsonicrequest.h"
|
||||
#include "subsonicscrobblerequest.h"
|
||||
#include "settings/settingsdialog.h"
|
||||
#include "settings/subsonicsettingspage.h"
|
||||
#include "constants/subsonicsettings.h"
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
using std::make_unique;
|
||||
@@ -72,24 +70,27 @@ constexpr char kSongsTable[] = "subsonic_songs";
|
||||
constexpr int kMaxRedirects = 3;
|
||||
} // namespace
|
||||
|
||||
SubsonicService::SubsonicService(Application *app, QObject *parent)
|
||||
: StreamingService(Song::Source::Subsonic, u"Subsonic"_s, u"subsonic"_s, QLatin1String(SubsonicSettingsPage::kSettingsGroup), SettingsDialog::Page::Subsonic, app, parent),
|
||||
app_(app),
|
||||
url_handler_(new SubsonicUrlHandler(app, this)),
|
||||
SubsonicService::SubsonicService(const SharedPtr<TaskManager> task_manager,
|
||||
const SharedPtr<Database> database,
|
||||
const SharedPtr<UrlHandlers> url_handlers,
|
||||
const SharedPtr<AlbumCoverLoader> albumcover_loader,
|
||||
QObject *parent)
|
||||
: StreamingService(Song::Source::Subsonic, u"Subsonic"_s, u"subsonic"_s, QLatin1String(SubsonicSettings::kSettingsGroup), parent),
|
||||
url_handler_(new SubsonicUrlHandler(this)),
|
||||
collection_backend_(nullptr),
|
||||
collection_model_(nullptr),
|
||||
http2_(false),
|
||||
verify_certificate_(false),
|
||||
download_album_covers_(true),
|
||||
auth_method_(SubsonicSettingsPage::AuthMethod::MD5),
|
||||
auth_method_(SubsonicSettings::AuthMethod::MD5),
|
||||
ping_redirects_(0) {
|
||||
|
||||
app->player()->RegisterUrlHandler(url_handler_);
|
||||
url_handlers->Register(url_handler_);
|
||||
|
||||
collection_backend_ = make_shared<CollectionBackend>();
|
||||
collection_backend_->moveToThread(app_->database()->thread());
|
||||
collection_backend_->Init(app_->database(), app->task_manager(), Song::Source::Subsonic, QLatin1String(kSongsTable));
|
||||
collection_model_ = new CollectionModel(collection_backend_, app_, this);
|
||||
collection_backend_->moveToThread(database->thread());
|
||||
collection_backend_->Init(database, task_manager, Song::Source::Subsonic, QLatin1String(kSongsTable));
|
||||
collection_model_ = new CollectionModel(collection_backend_, albumcover_loader, this);
|
||||
|
||||
SubsonicService::ReloadSettings();
|
||||
|
||||
@@ -113,25 +114,21 @@ void SubsonicService::Exit() {
|
||||
|
||||
}
|
||||
|
||||
void SubsonicService::ShowConfig() {
|
||||
app_->OpenSettingsDialogAtPage(SettingsDialog::Page::Subsonic);
|
||||
}
|
||||
|
||||
void SubsonicService::ReloadSettings() {
|
||||
|
||||
Settings s;
|
||||
s.beginGroup(SubsonicSettingsPage::kSettingsGroup);
|
||||
s.beginGroup(SubsonicSettings::kSettingsGroup);
|
||||
|
||||
server_url_ = s.value("url").toUrl();
|
||||
username_ = s.value("username").toString();
|
||||
QByteArray password = s.value("password").toByteArray();
|
||||
server_url_ = s.value(SubsonicSettings::kUrl).toUrl();
|
||||
username_ = s.value(SubsonicSettings::kUsername).toString();
|
||||
QByteArray password = s.value(SubsonicSettings::kPassword).toByteArray();
|
||||
if (password.isEmpty()) password_.clear();
|
||||
else password_ = QString::fromUtf8(QByteArray::fromBase64(password));
|
||||
|
||||
http2_ = s.value("http2", false).toBool();
|
||||
verify_certificate_ = s.value("verifycertificate", false).toBool();
|
||||
download_album_covers_ = s.value("downloadalbumcovers", true).toBool();
|
||||
auth_method_ = static_cast<SubsonicSettingsPage::AuthMethod>(s.value("authmethod", static_cast<int>(SubsonicSettingsPage::AuthMethod::MD5)).toInt());
|
||||
http2_ = s.value(SubsonicSettings::kHTTP2, false).toBool();
|
||||
verify_certificate_ = s.value(SubsonicSettings::kVerifyCertificate, false).toBool();
|
||||
download_album_covers_ = s.value(SubsonicSettings::kDownloadAlbumCovers, true).toBool();
|
||||
auth_method_ = static_cast<SubsonicSettings::AuthMethod>(s.value(SubsonicSettings::kAuthMethod, static_cast<int>(SubsonicSettings::AuthMethod::MD5)).toInt());
|
||||
|
||||
s.endGroup();
|
||||
|
||||
@@ -141,7 +138,7 @@ void SubsonicService::SendPing() {
|
||||
SendPingWithCredentials(server_url_, username_, password_, auth_method_, false);
|
||||
}
|
||||
|
||||
void SubsonicService::SendPingWithCredentials(QUrl url, const QString &username, const QString &password, const SubsonicSettingsPage::AuthMethod auth_method, const bool redirect) {
|
||||
void SubsonicService::SendPingWithCredentials(QUrl url, const QString &username, const QString &password, const SubsonicSettings::AuthMethod auth_method, const bool redirect) {
|
||||
|
||||
if (!network_ || !redirect) {
|
||||
network_ = make_unique<QNetworkAccessManager>();
|
||||
@@ -157,7 +154,7 @@ void SubsonicService::SendPingWithCredentials(QUrl url, const QString &username,
|
||||
<< Param(u"f"_s, u"json"_s)
|
||||
<< Param(u"u"_s, username);
|
||||
|
||||
if (auth_method == SubsonicSettingsPage::AuthMethod::Hex) {
|
||||
if (auth_method == SubsonicSettings::AuthMethod::Hex) {
|
||||
params << Param(u"p"_s, u"enc:"_s + QString::fromLatin1(password.toUtf8().toHex()));
|
||||
}
|
||||
else {
|
||||
@@ -215,7 +212,7 @@ void SubsonicService::HandlePingSSLErrors(const QList<QSslError> &ssl_errors) {
|
||||
|
||||
}
|
||||
|
||||
void SubsonicService::HandlePingReply(QNetworkReply *reply, const QUrl &url, const QString &username, const QString &password, const SubsonicSettingsPage::AuthMethod auth_method) {
|
||||
void SubsonicService::HandlePingReply(QNetworkReply *reply, const QUrl &url, const QString &username, const QString &password, const SubsonicSettings::AuthMethod auth_method) {
|
||||
|
||||
Q_UNUSED(url);
|
||||
|
||||
@@ -388,7 +385,7 @@ void SubsonicService::Scrobble(const QString &song_id, const bool submission, co
|
||||
|
||||
if (!scrobble_request_) {
|
||||
// We're doing requests every 30-240s the whole time, so keep reusing this instance
|
||||
scrobble_request_.reset(new SubsonicScrobbleRequest(this, url_handler_, app_), [](SubsonicScrobbleRequest *request) { request->deleteLater(); });
|
||||
scrobble_request_.reset(new SubsonicScrobbleRequest(this, url_handler_), [](SubsonicScrobbleRequest *request) { request->deleteLater(); });
|
||||
}
|
||||
|
||||
scrobble_request_->CreateScrobbleRequest(song_id, submission, time);
|
||||
@@ -418,7 +415,7 @@ void SubsonicService::GetSongs() {
|
||||
}
|
||||
|
||||
ResetSongsRequest();
|
||||
songs_request_.reset(new SubsonicRequest(this, url_handler_, app_), [](SubsonicRequest *request) { request->deleteLater(); });
|
||||
songs_request_.reset(new SubsonicRequest(this, url_handler_), [](SubsonicRequest *request) { request->deleteLater(); });
|
||||
QObject::connect(&*songs_request_, &SubsonicRequest::Results, this, &SubsonicService::SongsResultsReceived);
|
||||
QObject::connect(&*songs_request_, &SubsonicRequest::UpdateStatus, this, &SubsonicService::SongsUpdateStatus);
|
||||
QObject::connect(&*songs_request_, &SubsonicRequest::ProgressSetMaximum, this, &SubsonicService::SongsProgressSetMaximum);
|
||||
|
||||
@@ -36,15 +36,18 @@
|
||||
#include <QSslError>
|
||||
#include <QDateTime>
|
||||
|
||||
#include "core/scoped_ptr.h"
|
||||
#include "core/shared_ptr.h"
|
||||
#include "includes/scoped_ptr.h"
|
||||
#include "includes/shared_ptr.h"
|
||||
#include "core/song.h"
|
||||
#include "streaming/streamingservice.h"
|
||||
#include "settings/subsonicsettingspage.h"
|
||||
#include "constants/subsonicsettings.h"
|
||||
|
||||
class QNetworkReply;
|
||||
|
||||
class Application;
|
||||
class TaskManager;
|
||||
class Database;
|
||||
class UrlHandlers;
|
||||
class AlbumCoverLoader;
|
||||
class SubsonicUrlHandler;
|
||||
class SubsonicRequest;
|
||||
class SubsonicScrobbleRequest;
|
||||
@@ -56,7 +59,12 @@ class SubsonicService : public StreamingService {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SubsonicService(Application *app, QObject *parent = nullptr);
|
||||
explicit SubsonicService(const SharedPtr<TaskManager> task_manager,
|
||||
const SharedPtr<Database> database,
|
||||
const SharedPtr<UrlHandlers> url_handlers,
|
||||
const SharedPtr<AlbumCoverLoader> albumcover_loader,
|
||||
QObject *parent = nullptr);
|
||||
|
||||
~SubsonicService() override;
|
||||
|
||||
static const Song::Source kSource;
|
||||
@@ -66,15 +74,13 @@ class SubsonicService : public StreamingService {
|
||||
void ReloadSettings() override;
|
||||
void Exit() override;
|
||||
|
||||
Application *app() const { return app_; }
|
||||
|
||||
QUrl server_url() const { return server_url_; }
|
||||
QString username() const { return username_; }
|
||||
QString password() const { return password_; }
|
||||
bool http2() const { return http2_; }
|
||||
bool verify_certificate() const { return verify_certificate_; }
|
||||
bool download_album_covers() const { return download_album_covers_; }
|
||||
SubsonicSettingsPage::AuthMethod auth_method() const { return auth_method_; }
|
||||
SubsonicSettings::AuthMethod auth_method() const { return auth_method_; }
|
||||
|
||||
SharedPtr<CollectionBackend> collection_backend() const { return collection_backend_; }
|
||||
CollectionModel *collection_model() const { return collection_model_; }
|
||||
@@ -88,22 +94,20 @@ class SubsonicService : public StreamingService {
|
||||
void Scrobble(const QString &song_id, const bool submission, const QDateTime &time);
|
||||
|
||||
public Q_SLOTS:
|
||||
void ShowConfig() override;
|
||||
void SendPing();
|
||||
void SendPingWithCredentials(QUrl url, const QString &username, const QString &password, const SubsonicSettingsPage::AuthMethod auth_method, const bool redirect = false);
|
||||
void SendPingWithCredentials(QUrl url, const QString &username, const QString &password, const SubsonicSettings::AuthMethod auth_method, const bool redirect = false);
|
||||
void GetSongs() override;
|
||||
void DeleteSongs();
|
||||
void ResetSongsRequest() override;
|
||||
|
||||
private Q_SLOTS:
|
||||
void HandlePingSSLErrors(const QList<QSslError> &ssl_errors);
|
||||
void HandlePingReply(QNetworkReply *reply, const QUrl &url, const QString &username, const QString &password, const SubsonicSettingsPage::AuthMethod auth_method);
|
||||
void HandlePingReply(QNetworkReply *reply, const QUrl &url, const QString &username, const QString &password, const SubsonicSettings::AuthMethod auth_method);
|
||||
void SongsResultsReceived(const SongMap &songs, const QString &error);
|
||||
|
||||
private:
|
||||
void PingError(const QString &error = QString(), const QVariant &debug = QVariant());
|
||||
|
||||
Application *app_;
|
||||
ScopedPtr<QNetworkAccessManager> network_;
|
||||
SubsonicUrlHandler *url_handler_;
|
||||
|
||||
@@ -119,7 +123,7 @@ class SubsonicService : public StreamingService {
|
||||
bool http2_;
|
||||
bool verify_certificate_;
|
||||
bool download_album_covers_;
|
||||
SubsonicSettingsPage::AuthMethod auth_method_;
|
||||
SubsonicSettings::AuthMethod auth_method_;
|
||||
|
||||
QStringList errors_;
|
||||
int ping_redirects_;
|
||||
|
||||
@@ -29,11 +29,7 @@
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
class Application;
|
||||
|
||||
SubsonicUrlHandler::SubsonicUrlHandler(Application *app, SubsonicService *service) : UrlHandler(service), service_(service) {
|
||||
Q_UNUSED(app);
|
||||
}
|
||||
SubsonicUrlHandler::SubsonicUrlHandler(SubsonicService *service) : UrlHandler(service), service_(service) {}
|
||||
|
||||
UrlHandler::LoadResult SubsonicUrlHandler::StartLoading(const QUrl &url) {
|
||||
|
||||
|
||||
@@ -30,20 +30,19 @@
|
||||
|
||||
#include "core/urlhandler.h"
|
||||
#include "subsonic/subsonicservice.h"
|
||||
|
||||
class Application;
|
||||
#include "constants/subsonicsettings.h"
|
||||
|
||||
class SubsonicUrlHandler : public UrlHandler {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SubsonicUrlHandler(Application *app, SubsonicService *service);
|
||||
explicit SubsonicUrlHandler(SubsonicService *service);
|
||||
|
||||
QString scheme() const override { return service_->url_scheme(); }
|
||||
QUrl server_url() const { return service_->server_url(); }
|
||||
QString username() const { return service_->username(); }
|
||||
QString password() const { return service_->password(); }
|
||||
SubsonicSettingsPage::AuthMethod auth_method() const { return service_->auth_method(); }
|
||||
SubsonicSettings::AuthMethod auth_method() const { return service_->auth_method(); }
|
||||
|
||||
LoadResult StartLoading(const QUrl &url) override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user