Refactoring

This commit is contained in:
Jonas Kvinge
2024-10-22 18:12:33 +02:00
parent dfcf715291
commit 8da2b9cd94
623 changed files with 9071 additions and 5126 deletions

View File

@@ -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 &params_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 &params_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 {

View File

@@ -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 &params_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 &params_provided);
protected:
QNetworkReply *CreateGetRequest(const QString &ressource_name, const ParamList &params_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(); }

View File

@@ -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),

View File

@@ -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_;

View File

@@ -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() {

View File

@@ -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_;

View File

@@ -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);

View File

@@ -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_;

View File

@@ -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) {

View File

@@ -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;