From c91cef35070b51fa1eaad8925aaa73e290c45d11 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sun, 13 Jan 2019 00:06:08 +0100 Subject: [PATCH] Add error handling/message for url handler --- src/core/player.cpp | 14 ++++++++++++-- src/core/urlhandler.cpp | 2 +- src/core/urlhandler.h | 8 +++++++- src/tidal/tidalservice.cpp | 2 +- src/tidal/tidalservice.h | 2 +- src/tidal/tidalurlhandler.cpp | 9 ++++++--- src/tidal/tidalurlhandler.h | 2 +- 7 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/core/player.cpp b/src/core/player.cpp index 3e963f86..9be4a9fb 100644 --- a/src/core/player.cpp +++ b/src/core/player.cpp @@ -235,6 +235,12 @@ void Player::HandleLoadResult(const UrlHandler::LoadResult &result) { if (item->Url() != result.original_url_) return; switch (result.type_) { + case UrlHandler::LoadResult::Error: + loading_async_ = QUrl(); + EngineStateChanged(Engine::Error); + FatalError(); + emit Error(result.error_); + break; case UrlHandler::LoadResult::NoMoreTracks: qLog(Debug) << "URL handler for" << result.original_url_ << "said no more tracks"; @@ -703,13 +709,17 @@ void Player::TrackAboutToEnd() { if (url_handlers_.contains(url.scheme()) && !(engine_->type() == Engine::Deezer && url.scheme() == "dzmedia")) { UrlHandler::LoadResult result = url_handlers_[url.scheme()]->LoadNext(url); switch (result.type_) { + case UrlHandler::LoadResult::Error: + loading_async_ = QUrl(); + EngineStateChanged(Engine::Error); + FatalError(); + emit Error(result.error_); + return; case UrlHandler::LoadResult::NoMoreTracks: return; - case UrlHandler::LoadResult::WillLoadAsynchronously: loading_async_ = url; return; - case UrlHandler::LoadResult::TrackAvailable: url = result.media_url_; break; diff --git a/src/core/urlhandler.cpp b/src/core/urlhandler.cpp index 0adf506f..41822864 100644 --- a/src/core/urlhandler.cpp +++ b/src/core/urlhandler.cpp @@ -28,6 +28,6 @@ #include "song.h" #include "urlhandler.h" -UrlHandler::LoadResult::LoadResult(const QUrl &original_url, Type type, const QUrl &media_url, const Song::FileType &filetype, qint64 length_nanosec) : original_url_(original_url), type_(type), media_url_(media_url), filetype_(filetype), length_nanosec_(length_nanosec) {} +UrlHandler::LoadResult::LoadResult(const QUrl &original_url, Type type, const QUrl &media_url, const Song::FileType &filetype, const qint64 length_nanosec, const QString error) : original_url_(original_url), type_(type), media_url_(media_url), filetype_(filetype), length_nanosec_(length_nanosec), error_(error) {} UrlHandler::UrlHandler(QObject *parent) : QObject(parent) {} diff --git a/src/core/urlhandler.h b/src/core/urlhandler.h index bcabab2a..335838ef 100644 --- a/src/core/urlhandler.h +++ b/src/core/urlhandler.h @@ -52,9 +52,12 @@ class UrlHandler : public QObject { // There was a track available. Its url is in media_url. TrackAvailable, + + // There was a error + Error, }; - LoadResult(const QUrl &original_url = QUrl(), Type type = NoMoreTracks, const QUrl &media_url = QUrl(), const Song::FileType &filetype = Song::FileType_Stream, qint64 length_nanosec_ = -1); + LoadResult(const QUrl &original_url = QUrl(), Type type = NoMoreTracks, const QUrl &media_url = QUrl(), const Song::FileType &filetype = Song::FileType_Stream, const qint64 length_nanosec_ = -1, const QString error = QString()); // The url that the playlist item has in Url(). // Might be something unplayable like lastfm://... @@ -70,6 +73,9 @@ class UrlHandler : public QObject { // Track length, if we are able to get it only now qint64 length_nanosec_; + + // Error message, if any + QString error_; }; // Called by the Player when a song starts loading - gives the handler a chance to do something clever to get a playable track. diff --git a/src/tidal/tidalservice.cpp b/src/tidal/tidalservice.cpp index de8271d5..7dd422f0 100644 --- a/src/tidal/tidalservice.cpp +++ b/src/tidal/tidalservice.cpp @@ -911,7 +911,7 @@ void TidalService::Error(QString error, QVariant debug) { CheckFinish(); } if (!stream_request_url_.isEmpty() && !login_sent_) { - emit StreamURLFinished(stream_request_url_, Song::FileType_Stream); + emit StreamURLFinished(stream_request_url_, Song::FileType_Stream, error); stream_request_url_ = QUrl(); } } diff --git a/src/tidal/tidalservice.h b/src/tidal/tidalservice.h index bcb1799c..40ebdf72 100644 --- a/src/tidal/tidalservice.h +++ b/src/tidal/tidalservice.h @@ -73,7 +73,7 @@ class TidalService : public InternetService { void ProgressSetMaximum(int max); void UpdateProgress(int max); void GetStreamURLFinished(QNetworkReply *reply, const QUrl url); - void StreamURLFinished(const QUrl url, const Song::FileType); + void StreamURLFinished(const QUrl url, const Song::FileType, QString error = QString()); public slots: void ShowConfig(); diff --git a/src/tidal/tidalurlhandler.cpp b/src/tidal/tidalurlhandler.cpp index d9c694e9..ccffeaa4 100644 --- a/src/tidal/tidalurlhandler.cpp +++ b/src/tidal/tidalurlhandler.cpp @@ -33,7 +33,7 @@ TidalUrlHandler::TidalUrlHandler( Application *app, TidalService *service) : UrlHandler(service), app_(app), service_(service), task_id_(-1) { - connect(service, SIGNAL(StreamURLFinished(QUrl, Song::FileType)), this, SLOT(GetStreamURLFinished(QUrl, Song::FileType))); + connect(service, SIGNAL(StreamURLFinished(QUrl, Song::FileType, QString)), this, SLOT(GetStreamURLFinished(QUrl, Song::FileType, QString))); } @@ -49,11 +49,14 @@ UrlHandler::LoadResult TidalUrlHandler::StartLoading(const QUrl &url) { } -void TidalUrlHandler::GetStreamURLFinished(QUrl url, Song::FileType filetype) { +void TidalUrlHandler::GetStreamURLFinished(QUrl url, Song::FileType filetype, QString error) { if (task_id_ == -1) return; CancelTask(); - emit AsyncLoadComplete(LoadResult(last_original_url_, LoadResult::TrackAvailable, url, filetype)); + if (error.isEmpty()) + emit AsyncLoadComplete(LoadResult(last_original_url_, LoadResult::TrackAvailable, url, filetype)); + else + emit AsyncLoadComplete(LoadResult(last_original_url_, LoadResult::Error, url, filetype, -1, error)); } diff --git a/src/tidal/tidalurlhandler.h b/src/tidal/tidalurlhandler.h index a7c771e9..dfeb43c6 100644 --- a/src/tidal/tidalurlhandler.h +++ b/src/tidal/tidalurlhandler.h @@ -43,7 +43,7 @@ class TidalUrlHandler : public UrlHandler { void CancelTask(); private slots: - void GetStreamURLFinished(QUrl url, Song::FileType filetype); + void GetStreamURLFinished(QUrl url, Song::FileType filetype, QString error = QString()); private: Application *app_;