Improve Tidal code

This commit is contained in:
Jonas Kvinge 2018-10-16 21:31:28 +02:00
parent 4156e26f76
commit 83a9724d17
2 changed files with 62 additions and 27 deletions

View File

@ -240,7 +240,7 @@ void TidalService::HandleAuthReply(QNetworkReply *reply) {
if (!json_doc.isObject()) { if (!json_doc.isObject()) {
QString failure_reason("Authentication reply from server has Json document that is not an object."); QString failure_reason("Authentication reply from server has Json document that is not an object.");
Error(failure_reason); Error(failure_reason, json_doc);
emit LoginFailure(failure_reason); emit LoginFailure(failure_reason);
return; return;
} }
@ -248,14 +248,14 @@ void TidalService::HandleAuthReply(QNetworkReply *reply) {
QJsonObject json_obj = json_doc.object(); QJsonObject json_obj = json_doc.object();
if (json_obj.isEmpty()) { if (json_obj.isEmpty()) {
QString failure_reason("Authentication reply from server has empty Json object."); QString failure_reason("Authentication reply from server has empty Json object.");
Error(failure_reason); Error(failure_reason, json_doc);
emit LoginFailure(failure_reason); emit LoginFailure(failure_reason);
return; return;
} }
if ( !json_obj.contains("userId") || !json_obj.contains("sessionId") || !json_obj.contains("countryCode") ) { if ( !json_obj.contains("userId") || !json_obj.contains("sessionId") || !json_obj.contains("countryCode") ) {
QString failure_reason("Authentication reply from server is missing userId, sessionId or countryCode"); QString failure_reason("Authentication reply from server is missing userId, sessionId or countryCode");
Error(failure_reason); Error(failure_reason, json_obj);
emit LoginFailure(failure_reason); emit LoginFailure(failure_reason);
return; return;
} }
@ -339,7 +339,7 @@ QNetworkReply *TidalService::CreateRequest(const QString &ressource_name, const
} }
QJsonObject TidalService::ExtractJsonObj(QNetworkReply *reply, const bool sendlogin) { QByteArray TidalService::GetReplyData(QNetworkReply *reply, const bool sendlogin) {
QByteArray data; QByteArray data;
@ -390,30 +390,38 @@ QJsonObject TidalService::ExtractJsonObj(QNetworkReply *reply, const bool sendlo
Error(failure_reason); Error(failure_reason);
} }
} }
return QJsonObject(); return QByteArray();
} }
return data;
}
QJsonObject TidalService::ExtractJsonObj(QByteArray &data) {
QJsonParseError error; QJsonParseError error;
QJsonDocument json_doc = QJsonDocument::fromJson(data, &error); QJsonDocument json_doc = QJsonDocument::fromJson(data, &error);
//qLog(Debug) << json_doc;
if (error.error != QJsonParseError::NoError) { if (error.error != QJsonParseError::NoError) {
Error("Reply from server missing Json data."); Error("Reply from server missing Json data.", data);
return QJsonObject(); return QJsonObject();
} }
if (json_doc.isNull() || json_doc.isEmpty()) { if (json_doc.isNull() || json_doc.isEmpty()) {
Error("Received empty Json document."); Error("Received empty Json document.", data);
return QJsonObject(); return QJsonObject();
} }
if (!json_doc.isObject()) { if (!json_doc.isObject()) {
Error("Json document is not an object."); Error("Json document is not an object.", json_doc);
return QJsonObject(); return QJsonObject();
} }
QJsonObject json_obj = json_doc.object(); QJsonObject json_obj = json_doc.object();
if (json_obj.isEmpty()) { if (json_obj.isEmpty()) {
Error("Received empty Json object."); Error("Received empty Json object.", json_doc);
return QJsonObject(); return QJsonObject();
} }
@ -423,21 +431,16 @@ QJsonObject TidalService::ExtractJsonObj(QNetworkReply *reply, const bool sendlo
} }
QJsonArray TidalService::ExtractItems(QNetworkReply *reply, bool sendlogin) { QJsonValue TidalService::ExtractItems(QByteArray &data) {
QJsonObject json_obj = ExtractJsonObj(reply, sendlogin); QJsonObject json_obj = ExtractJsonObj(data);
if (json_obj.isEmpty()) return QJsonArray(); if (json_obj.isEmpty()) return QJsonArray();
if (!json_obj.contains("items")) { if (!json_obj.contains("items")) {
Error("Json reply is missing items."); Error("Json reply is missing items.", json_obj);
return QJsonArray();
}
QJsonArray json_items = json_obj["items"].toArray();
if (json_items.isEmpty()) {
Error("No match.");
return QJsonArray(); return QJsonArray();
} }
QJsonValue json_items = json_obj["items"];
return json_items; return json_items;
@ -525,11 +528,21 @@ void TidalService::SearchFinished(QNetworkReply *reply, int id) {
if (id != search_id_) return; if (id != search_id_) return;
QJsonArray json_items = ExtractItems(reply, true); QByteArray data = GetReplyData(reply, true);
if (json_items.isEmpty()) { if (data.isEmpty()) {
CheckFinish(); CheckFinish();
return; return;
} }
QJsonValue json_value = ExtractItems(data);
if (!json_value.isArray()) {
CheckFinish();
return;
}
QJsonArray json_items = json_value.toArray();
if (json_items.isEmpty()) {
Error("No match.");
return;
}
//qLog(Debug) << json_items; //qLog(Debug) << json_items;
@ -649,7 +662,19 @@ void TidalService::GetAlbumFinished(QNetworkReply *reply, int search_id, int alb
albums_received_++; albums_received_++;
emit UpdateProgress(albums_received_); emit UpdateProgress(albums_received_);
QJsonArray json_items = ExtractItems(reply); QByteArray data = GetReplyData(reply);
if (data.isEmpty()) {
CheckFinish();
return;
}
QJsonValue json_value = ExtractItems(data);
if (!json_value.isArray()) {
CheckFinish();
return;
}
QJsonArray json_items = json_value.toArray();
if (json_items.isEmpty()) { if (json_items.isEmpty()) {
CheckFinish(); CheckFinish();
return; return;
@ -818,7 +843,16 @@ void TidalService::GetStreamURLFinished(QNetworkReply *reply, const int song_id,
if (requests_song_.contains(song_id)) requests_song_.remove(song_id); if (requests_song_.contains(song_id)) requests_song_.remove(song_id);
if (original_url != stream_request_url_) return; if (original_url != stream_request_url_) return;
QJsonObject json_obj = ExtractJsonObj(reply, true); QByteArray data = GetReplyData(reply);
if (data.isEmpty()) {
if (!stream_request_url_.isEmpty() && !login_sent_) {
emit StreamURLFinished(original_url, Song::FileType_Stream);
stream_request_url_ = QUrl();
}
return;
}
QJsonObject json_obj = ExtractJsonObj(data);
if (json_obj.isEmpty()) { if (json_obj.isEmpty()) {
if (!stream_request_url_.isEmpty() && !login_sent_) { if (!stream_request_url_.isEmpty() && !login_sent_) {
emit StreamURLFinished(original_url, Song::FileType_Stream); emit StreamURLFinished(original_url, Song::FileType_Stream);
@ -866,9 +900,9 @@ void TidalService::CheckFinish() {
} }
void TidalService::Error(QString error, QString debug) { void TidalService::Error(QString error, QVariant debug) {
qLog(Error) << "Tidal:" << error; qLog(Error) << "Tidal:" << error;
if (!debug.isEmpty()) qLog(Debug) << debug; if (debug.isValid()) qLog(Debug) << debug;
if (search_id_ != 0) { if (search_id_ != 0) {
if (!error.isEmpty()) { if (!error.isEmpty()) {
search_error_ += error; search_error_ += error;

View File

@ -92,13 +92,14 @@ class TidalService : public InternetService {
void ClearSearch(); void ClearSearch();
void LoadSessionID(); void LoadSessionID();
QNetworkReply *CreateRequest(const QString &ressource_name, const QList<QPair<QString, QString>> &params); QNetworkReply *CreateRequest(const QString &ressource_name, const QList<QPair<QString, QString>> &params);
QJsonObject ExtractJsonObj(QNetworkReply *reply, bool sendlogin = false); QByteArray GetReplyData(QNetworkReply *reply, const bool sendlogin = false);
QJsonArray ExtractItems(QNetworkReply *reply, bool sendlogin = false); QJsonObject ExtractJsonObj(QByteArray &data);
QJsonValue ExtractItems(QByteArray &data);
void SendSearch(); void SendSearch();
void GetAlbum(const int album_id); void GetAlbum(const int album_id);
Song ParseSong(const int album_id_requested, const QJsonValue &value); Song ParseSong(const int album_id_requested, const QJsonValue &value);
void CheckFinish(); void CheckFinish();
void Error(QString error, QString debug = QString()); void Error(QString error, QVariant debug = QVariant());
static const char *kApiUrl; static const char *kApiUrl;
static const char *kAuthUrl; static const char *kAuthUrl;