Replace QLatin1String with operator _L1

This commit is contained in:
Jonas Kvinge
2024-09-07 04:24:14 +02:00
parent e3e6a22172
commit 4270b12cd1
185 changed files with 2429 additions and 2139 deletions

View File

@@ -40,6 +40,8 @@
#include "tidalservice.h"
#include "tidalbaserequest.h"
using namespace Qt::StringLiterals;
TidalBaseRequest::TidalBaseRequest(TidalService *service, SharedPtr<NetworkAccessManager> network, QObject *parent)
: QObject(parent),
service_(service),
@@ -102,10 +104,10 @@ QByteArray TidalBaseRequest::GetReplyData(QNetworkReply *reply, const bool send_
int sub_status = 0;
if (json_error.error == QJsonParseError::NoError && !json_doc.isEmpty() && json_doc.isObject()) {
QJsonObject json_obj = json_doc.object();
if (!json_obj.isEmpty() && json_obj.contains(QLatin1String("status")) && json_obj.contains(QLatin1String("userMessage"))) {
status = json_obj[QLatin1String("status")].toInt();
sub_status = json_obj[QLatin1String("subStatus")].toInt();
QString user_message = json_obj[QLatin1String("userMessage")].toString();
if (!json_obj.isEmpty() && json_obj.contains("status"_L1) && json_obj.contains("userMessage"_L1)) {
status = json_obj["status"_L1].toInt();
sub_status = json_obj["subStatus"_L1].toInt();
QString user_message = json_obj["userMessage"_L1].toString();
error = QStringLiteral("%1 (%2) (%3)").arg(user_message).arg(status).arg(sub_status);
}
}
@@ -185,11 +187,11 @@ QJsonValue TidalBaseRequest::ExtractItems(const QByteArray &data) {
QJsonValue TidalBaseRequest::ExtractItems(const QJsonObject &json_obj) {
if (!json_obj.contains(QLatin1String("items"))) {
if (!json_obj.contains("items"_L1)) {
Error(QStringLiteral("Json reply is missing items."), json_obj);
return QJsonArray();
}
QJsonValue json_items = json_obj[QLatin1String("items")];
QJsonValue json_items = json_obj["items"_L1];
return json_items;
}
@@ -198,7 +200,7 @@ QString TidalBaseRequest::ErrorsToHTML(const QStringList &errors) {
QString error_html;
for (const QString &error : errors) {
error_html += error + QLatin1String("<br />");
error_html += error + "<br />"_L1;
}
return error_html;

View File

@@ -39,6 +39,8 @@
#include "tidalbaserequest.h"
#include "tidalfavoriterequest.h"
using namespace Qt::StringLiterals;
TidalFavoriteRequest::TidalFavoriteRequest(TidalService *service, SharedPtr<NetworkAccessManager> network, QObject *parent)
: TidalBaseRequest(service, network, parent),
service_(service),
@@ -135,14 +137,14 @@ void TidalFavoriteRequest::AddFavorites(const FavoriteType type, const SongList
void TidalFavoriteRequest::AddFavoritesRequest(const FavoriteType type, const QStringList &id_list, const SongList &songs) {
const ParamList params = ParamList() << Param(QStringLiteral("countryCode"), country_code())
<< Param(FavoriteMethod(type), id_list.join(QLatin1Char(',')));
<< Param(FavoriteMethod(type), id_list.join(u','));
QUrlQuery url_query;
for (const Param &param : params) {
url_query.addQueryItem(QString::fromLatin1(QUrl::toPercentEncoding(param.first)), QString::fromLatin1(QUrl::toPercentEncoding(param.second)));
}
QUrl url(QLatin1String(TidalService::kApiUrl) + QLatin1Char('/') + QLatin1String("users/") + QString::number(service_->user_id()) + QLatin1String("/favorites/") + FavoriteText(type));
QUrl url(QLatin1String(TidalService::kApiUrl) + QLatin1Char('/') + "users/"_L1 + QString::number(service_->user_id()) + "/favorites/"_L1 + FavoriteText(type));
QNetworkRequest req(url);
req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
req.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/x-www-form-urlencoded"));
@@ -251,7 +253,7 @@ void TidalFavoriteRequest::RemoveFavoritesRequest(const FavoriteType type, const
url_query.addQueryItem(QString::fromLatin1(QUrl::toPercentEncoding(param.first)), QString::fromLatin1(QUrl::toPercentEncoding(param.second)));
}
QUrl url(QLatin1String(TidalService::kApiUrl) + QLatin1String("/users/") + QString::number(service_->user_id()) + QLatin1String("/favorites/") + FavoriteText(type) + QLatin1String("/") + id);
QUrl url(QLatin1String(TidalService::kApiUrl) + "/users/"_L1 + QString::number(service_->user_id()) + "/favorites/"_L1 + FavoriteText(type) + "/"_L1 + id);
url.setQuery(url_query);
QNetworkRequest req(url);
req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);

View File

@@ -49,6 +49,8 @@
#include "tidalbaserequest.h"
#include "tidalrequest.h"
using namespace Qt::StringLiterals;
namespace {
constexpr char kResourcesUrl[] = "https://resources.tidal.com";
constexpr int kMaxConcurrentArtistsRequests = 3;
@@ -435,17 +437,17 @@ void TidalRequest::ArtistsReplyReceived(QNetworkReply *reply, const int limit_re
return;
}
if (!json_obj.contains(QLatin1String("limit")) ||
!json_obj.contains(QLatin1String("offset")) ||
!json_obj.contains(QLatin1String("totalNumberOfItems")) ||
!json_obj.contains(QLatin1String("items"))) {
if (!json_obj.contains("limit"_L1) ||
!json_obj.contains("offset"_L1) ||
!json_obj.contains("totalNumberOfItems"_L1) ||
!json_obj.contains("items"_L1)) {
Error(QStringLiteral("Json object missing values."), json_obj);
ArtistsFinishCheck();
return;
}
//int limit = json_obj["limit"].toInt();
int offset = json_obj[QLatin1String("offset")].toInt();
int artists_total = json_obj[QLatin1String("totalNumberOfItems")].toInt();
int offset = json_obj["offset"_L1].toInt();
int artists_total = json_obj["totalNumberOfItems"_L1].toInt();
if (offset_requested == 0) {
artists_total_ = artists_total;
@@ -489,8 +491,8 @@ void TidalRequest::ArtistsReplyReceived(QNetworkReply *reply, const int limit_re
}
QJsonObject obj_item = value_item.toObject();
if (obj_item.contains(QLatin1String("item"))) {
QJsonValue json_item = obj_item[QLatin1String("item")];
if (obj_item.contains("item"_L1)) {
QJsonValue json_item = obj_item["item"_L1];
if (!json_item.isObject()) {
Error(QStringLiteral("Invalid Json reply, item in array is not a object."), json_item);
continue;
@@ -498,19 +500,19 @@ void TidalRequest::ArtistsReplyReceived(QNetworkReply *reply, const int limit_re
obj_item = json_item.toObject();
}
if (!obj_item.contains(QLatin1String("id")) || !obj_item.contains(QLatin1String("name"))) {
if (!obj_item.contains("id"_L1) || !obj_item.contains("name"_L1)) {
Error(QStringLiteral("Invalid Json reply, item missing id or album."), obj_item);
continue;
}
Artist artist;
if (obj_item[QLatin1String("id")].isString()) {
artist.artist_id = obj_item[QLatin1String("id")].toString();
if (obj_item["id"_L1].isString()) {
artist.artist_id = obj_item["id"_L1].toString();
}
else {
artist.artist_id = QString::number(obj_item[QLatin1String("id")].toInt());
artist.artist_id = QString::number(obj_item["id"_L1].toInt());
}
artist.artist = obj_item[QLatin1String("name")].toString();
artist.artist = obj_item["name"_L1].toString();
if (artist_albums_requests_pending_.contains(artist.artist_id)) continue;
@@ -630,18 +632,18 @@ void TidalRequest::AlbumsReceived(QNetworkReply *reply, const Artist &artist_req
return;
}
if (!json_obj.contains(QLatin1String("limit")) ||
!json_obj.contains(QLatin1String("offset")) ||
!json_obj.contains(QLatin1String("totalNumberOfItems")) ||
!json_obj.contains(QLatin1String("items"))) {
if (!json_obj.contains("limit"_L1) ||
!json_obj.contains("offset"_L1) ||
!json_obj.contains("totalNumberOfItems"_L1) ||
!json_obj.contains("items"_L1)) {
Error(QStringLiteral("Json object missing values."), json_obj);
AlbumsFinishCheck(artist_requested);
return;
}
//int limit = json_obj["limit"].toInt();
int offset = json_obj[QLatin1String("offset")].toInt();
int albums_total = json_obj[QLatin1String("totalNumberOfItems")].toInt();
int offset = json_obj["offset"_L1].toInt();
int albums_total = json_obj["totalNumberOfItems"_L1].toInt();
if (offset != offset_requested) {
Error(QStringLiteral("Offset returned does not match offset requested! %1 != %2").arg(offset).arg(offset_requested));
@@ -671,8 +673,8 @@ void TidalRequest::AlbumsReceived(QNetworkReply *reply, const Artist &artist_req
}
QJsonObject obj_item = value_item.toObject();
if (obj_item.contains(QLatin1String("item"))) {
QJsonValue json_item = obj_item[QLatin1String("item")];
if (obj_item.contains("item"_L1)) {
QJsonValue json_item = obj_item["item"_L1];
if (!json_item.isObject()) {
Error(QStringLiteral("Invalid Json reply, item in array is not a object."), json_item);
continue;
@@ -681,47 +683,47 @@ void TidalRequest::AlbumsReceived(QNetworkReply *reply, const Artist &artist_req
}
Album album;
if (obj_item.contains(QLatin1String("type"))) { // This was an albums request or search
if (!obj_item.contains(QLatin1String("id")) || !obj_item.contains(QLatin1String("title"))) {
if (obj_item.contains("type"_L1)) { // This was an albums request or search
if (!obj_item.contains("id"_L1) || !obj_item.contains("title"_L1)) {
Error(QStringLiteral("Invalid Json reply, item is missing ID or title."), obj_item);
continue;
}
if (obj_item[QLatin1String("id")].isString()) {
album.album_id = obj_item[QLatin1String("id")].toString();
if (obj_item["id"_L1].isString()) {
album.album_id = obj_item["id"_L1].toString();
}
else {
album.album_id = QString::number(obj_item[QLatin1String("id")].toInt());
album.album_id = QString::number(obj_item["id"_L1].toInt());
}
album.album = obj_item[QLatin1String("title")].toString();
if (service_->album_explicit() && obj_item.contains(QLatin1String("explicit"))) {
album.album_explicit = obj_item[QLatin1String("explicit")].toVariant().toBool();
album.album = obj_item["title"_L1].toString();
if (service_->album_explicit() && obj_item.contains("explicit"_L1)) {
album.album_explicit = obj_item["explicit"_L1].toVariant().toBool();
if (album.album_explicit && !album.album.isEmpty()) {
album.album.append(QLatin1String(" (Explicit)"));
album.album.append(" (Explicit)"_L1);
}
}
}
else if (obj_item.contains(QLatin1String("album"))) { // This was a tracks request or search
QJsonValue value_album = obj_item[QLatin1String("album")];
else if (obj_item.contains("album"_L1)) { // This was a tracks request or search
QJsonValue value_album = obj_item["album"_L1];
if (!value_album.isObject()) {
Error(QStringLiteral("Invalid Json reply, item album is not a object."), value_album);
continue;
}
QJsonObject obj_album = value_album.toObject();
if (!obj_album.contains(QLatin1String("id")) || !obj_album.contains(QLatin1String("title"))) {
if (!obj_album.contains("id"_L1) || !obj_album.contains("title"_L1)) {
Error(QStringLiteral("Invalid Json reply, item album is missing ID or title."), obj_album);
continue;
}
if (obj_album[QLatin1String("id")].isString()) {
album.album_id = obj_album[QLatin1String("id")].toString();
if (obj_album["id"_L1].isString()) {
album.album_id = obj_album["id"_L1].toString();
}
else {
album.album_id = QString::number(obj_album[QLatin1String("id")].toInt());
album.album_id = QString::number(obj_album["id"_L1].toInt());
}
album.album = obj_album[QLatin1String("title")].toString();
if (service_->album_explicit() && obj_album.contains(QLatin1String("explicit"))) {
album.album_explicit = obj_album[QLatin1String("explicit")].toVariant().toBool();
album.album = obj_album["title"_L1].toString();
if (service_->album_explicit() && obj_album.contains("explicit"_L1)) {
album.album_explicit = obj_album["explicit"_L1].toVariant().toBool();
if (album.album_explicit && !album.album.isEmpty()) {
album.album.append(QLatin1String(" (Explicit)"));
album.album.append(" (Explicit)"_L1);
}
}
}
@@ -732,29 +734,29 @@ void TidalRequest::AlbumsReceived(QNetworkReply *reply, const Artist &artist_req
if (album_songs_requests_pending_.contains(album.album_id)) continue;
if (!obj_item.contains(QLatin1String("artist")) || !obj_item.contains(QLatin1String("title")) || !obj_item.contains(QLatin1String("audioQuality"))) {
if (!obj_item.contains("artist"_L1) || !obj_item.contains("title"_L1) || !obj_item.contains("audioQuality"_L1)) {
Error(QStringLiteral("Invalid Json reply, item missing artist, title or audioQuality."), obj_item);
continue;
}
QJsonValue value_artist = obj_item[QLatin1String("artist")];
QJsonValue value_artist = obj_item["artist"_L1];
if (!value_artist.isObject()) {
Error(QStringLiteral("Invalid Json reply, item artist is not a object."), value_artist);
continue;
}
QJsonObject obj_artist = value_artist.toObject();
if (!obj_artist.contains(QLatin1String("id")) || !obj_artist.contains(QLatin1String("name"))) {
if (!obj_artist.contains("id"_L1) || !obj_artist.contains("name"_L1)) {
Error(QStringLiteral("Invalid Json reply, item artist missing id or name."), obj_artist);
continue;
}
Artist album_artist;
if (obj_artist[QLatin1String("id")].isString()) {
album_artist.artist_id = obj_artist[QLatin1String("id")].toString();
if (obj_artist["id"_L1].isString()) {
album_artist.artist_id = obj_artist["id"_L1].toString();
}
else {
album_artist.artist_id = QString::number(obj_artist[QLatin1String("id")].toInt());
album_artist.artist_id = QString::number(obj_artist["id"_L1].toInt());
}
album_artist.artist = obj_artist[QLatin1String("name")].toString();
album_artist.artist = obj_artist["name"_L1].toString();
//QString quality = obj_item["audioQuality"].toString();
//QString copyright = obj_item["copyright"].toString();
@@ -907,18 +909,18 @@ void TidalRequest::SongsReceived(QNetworkReply *reply, const Artist &artist, con
return;
}
if (!json_obj.contains(QLatin1String("limit")) ||
!json_obj.contains(QLatin1String("offset")) ||
!json_obj.contains(QLatin1String("totalNumberOfItems")) ||
!json_obj.contains(QLatin1String("items"))) {
if (!json_obj.contains("limit"_L1) ||
!json_obj.contains("offset"_L1) ||
!json_obj.contains("totalNumberOfItems"_L1) ||
!json_obj.contains("items"_L1)) {
Error(QStringLiteral("Json object missing values."), json_obj);
SongsFinishCheck(artist, album, limit_requested, offset_requested);
return;
}
//int limit = json_obj["limit"].toInt();
int offset = json_obj[QLatin1String("offset")].toInt();
int songs_total = json_obj[QLatin1String("totalNumberOfItems")].toInt();
int offset = json_obj["offset"_L1].toInt();
int songs_total = json_obj["totalNumberOfItems"_L1].toInt();
if (offset != offset_requested) {
Error(QStringLiteral("Offset returned does not match offset requested! %1 != %2").arg(offset).arg(offset_requested));
@@ -950,8 +952,8 @@ void TidalRequest::SongsReceived(QNetworkReply *reply, const Artist &artist, con
}
QJsonObject obj_item = value_item.toObject();
if (obj_item.contains(QLatin1String("item"))) {
QJsonValue item = obj_item[QLatin1String("item")];
if (obj_item.contains("item"_L1)) {
QJsonValue item = obj_item["item"_L1];
if (!item.isObject()) {
Error(QStringLiteral("Invalid Json reply, item is not a object."), item);
continue;
@@ -1021,85 +1023,85 @@ void TidalRequest::SongsFinishCheck(const Artist &artist, const Album &album, co
void TidalRequest::ParseSong(Song &song, const QJsonObject &json_obj, const Artist &album_artist, const Album &album) {
if (
!json_obj.contains(QLatin1String("album")) ||
!json_obj.contains(QLatin1String("allowStreaming")) ||
!json_obj.contains(QLatin1String("artist")) ||
!json_obj.contains(QLatin1String("artists")) ||
!json_obj.contains(QLatin1String("audioQuality")) ||
!json_obj.contains(QLatin1String("duration")) ||
!json_obj.contains(QLatin1String("id")) ||
!json_obj.contains(QLatin1String("streamReady")) ||
!json_obj.contains(QLatin1String("title")) ||
!json_obj.contains(QLatin1String("trackNumber")) ||
!json_obj.contains(QLatin1String("url")) ||
!json_obj.contains(QLatin1String("volumeNumber")) ||
!json_obj.contains(QLatin1String("copyright"))
!json_obj.contains("album"_L1) ||
!json_obj.contains("allowStreaming"_L1) ||
!json_obj.contains("artist"_L1) ||
!json_obj.contains("artists"_L1) ||
!json_obj.contains("audioQuality"_L1) ||
!json_obj.contains("duration"_L1) ||
!json_obj.contains("id"_L1) ||
!json_obj.contains("streamReady"_L1) ||
!json_obj.contains("title"_L1) ||
!json_obj.contains("trackNumber"_L1) ||
!json_obj.contains("url"_L1) ||
!json_obj.contains("volumeNumber"_L1) ||
!json_obj.contains("copyright"_L1)
) {
Error(QStringLiteral("Invalid Json reply, track is missing one or more values."), json_obj);
return;
}
QJsonValue value_artist = json_obj[QLatin1String("artist")];
QJsonValue value_album = json_obj[QLatin1String("album")];
QJsonValue json_duration = json_obj[QLatin1String("duration")];
QJsonValue value_artist = json_obj["artist"_L1];
QJsonValue value_album = json_obj["album"_L1];
QJsonValue json_duration = json_obj["duration"_L1];
//QJsonArray array_artists = json_obj["artists"].toArray();
QString song_id;
if (json_obj[QLatin1String("id")].isString()) {
song_id = json_obj[QLatin1String("id")].toString();
if (json_obj["id"_L1].isString()) {
song_id = json_obj["id"_L1].toString();
}
else {
song_id = QString::number(json_obj[QLatin1String("id")].toInt());
song_id = QString::number(json_obj["id"_L1].toInt());
}
QString title = json_obj[QLatin1String("title")].toString();
QString title = json_obj["title"_L1].toString();
//QString urlstr = json_obj["url"].toString();
int track = json_obj[QLatin1String("trackNumber")].toInt();
int disc = json_obj[QLatin1String("volumeNumber")].toInt();
bool allow_streaming = json_obj[QLatin1String("allowStreaming")].toBool();
bool stream_ready = json_obj[QLatin1String("streamReady")].toBool();
QString copyright = json_obj[QLatin1String("copyright")].toString();
int track = json_obj["trackNumber"_L1].toInt();
int disc = json_obj["volumeNumber"_L1].toInt();
bool allow_streaming = json_obj["allowStreaming"_L1].toBool();
bool stream_ready = json_obj["streamReady"_L1].toBool();
QString copyright = json_obj["copyright"_L1].toString();
if (!value_artist.isObject()) {
Error(QStringLiteral("Invalid Json reply, track artist is not a object."), value_artist);
return;
}
QJsonObject obj_artist = value_artist.toObject();
if (!obj_artist.contains(QLatin1String("id")) || !obj_artist.contains(QLatin1String("name"))) {
if (!obj_artist.contains("id"_L1) || !obj_artist.contains("name"_L1)) {
Error(QStringLiteral("Invalid Json reply, track artist is missing id or name."), obj_artist);
return;
}
QString artist_id;
if (obj_artist[QLatin1String("id")].isString()) {
artist_id = obj_artist[QLatin1String("id")].toString();
if (obj_artist["id"_L1].isString()) {
artist_id = obj_artist["id"_L1].toString();
}
else {
artist_id = QString::number(obj_artist[QLatin1String("id")].toInt());
artist_id = QString::number(obj_artist["id"_L1].toInt());
}
QString artist = obj_artist[QLatin1String("name")].toString();
QString artist = obj_artist["name"_L1].toString();
if (!value_album.isObject()) {
Error(QStringLiteral("Invalid Json reply, track album is not a object."), value_album);
return;
}
QJsonObject obj_album = value_album.toObject();
if (!obj_album.contains(QLatin1String("id")) || !obj_album.contains(QLatin1String("title"))) {
if (!obj_album.contains("id"_L1) || !obj_album.contains("title"_L1)) {
Error(QStringLiteral("Invalid Json reply, track album is missing ID or title."), obj_album);
return;
}
QString album_id;
if (obj_album[QLatin1String("id")].isString()) {
album_id = obj_album[QLatin1String("id")].toString();
if (obj_album["id"_L1].isString()) {
album_id = obj_album["id"_L1].toString();
}
else {
album_id = QString::number(obj_album[QLatin1String("id")].toInt());
album_id = QString::number(obj_album["id"_L1].toInt());
}
if (!album.album_id.isEmpty() && album.album_id != album_id) {
Error(QStringLiteral("Invalid Json reply, track album id is wrong."), obj_album);
return;
}
QString album_title = obj_album[QLatin1String("title")].toString();
if (album.album_explicit) album_title.append(QLatin1String(" (Explicit)"));
QString album_title = obj_album["title"_L1].toString();
if (album.album_explicit) album_title.append(" (Explicit)"_L1);
if (!allow_streaming) {
Warn(QStringLiteral("Song %1 %2 %3 is not allowStreaming").arg(artist, album_title, title));
@@ -1126,8 +1128,8 @@ void TidalRequest::ParseSong(Song &song, const QJsonObject &json_obj, const Arti
}
QUrl cover_url;
if (obj_album.contains(QLatin1String("cover"))) {
const QString cover = obj_album[QLatin1String("cover")].toString().replace(QLatin1Char('-'), QLatin1Char('/'));
if (obj_album.contains("cover"_L1)) {
const QString cover = obj_album["cover"_L1].toString().replace(u'-', u'/');
if (!cover.isEmpty()) {
cover_url.setUrl(QStringLiteral("%1/images/%2/%3.jpg").arg(QLatin1String(kResourcesUrl), cover, coversize_));
}
@@ -1281,8 +1283,8 @@ void TidalRequest::AlbumCoverReceived(QNetworkReply *reply, const QString &album
}
QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString();
if (mimetype.contains(QLatin1Char(';'))) {
mimetype = mimetype.left(mimetype.indexOf(QLatin1Char(';')));
if (mimetype.contains(u';')) {
mimetype = mimetype.left(mimetype.indexOf(u';'));
}
if (!ImageUtils::SupportedImageMimeTypes().contains(mimetype, Qt::CaseInsensitive) && !ImageUtils::SupportedImageFormats().contains(mimetype, Qt::CaseInsensitive)) {
Error(QStringLiteral("Unsupported mimetype for image reader %1 for %2").arg(mimetype, url.toString()));

View File

@@ -65,8 +65,9 @@
#include "settings/settingsdialog.h"
#include "settings/tidalsettingspage.h"
using std::make_shared;
using namespace std::chrono_literals;
using namespace Qt::StringLiterals;
using std::make_shared;
const Song::Source TidalService::kSource = Song::Source::Tidal;
@@ -292,7 +293,7 @@ void TidalService::StartAuthorization(const QString &client_id) {
code_verifier_ = Utilities::CryptographicRandomString(44);
code_challenge_ = QString::fromLatin1(QCryptographicHash::hash(code_verifier_.toUtf8(), QCryptographicHash::Sha256).toBase64(QByteArray::Base64UrlEncoding));
if (code_challenge_.lastIndexOf(QLatin1Char('=')) == code_challenge_.length() - 1) {
if (code_challenge_.lastIndexOf(u'=') == code_challenge_.length() - 1) {
code_challenge_.chop(1);
}
@@ -425,10 +426,10 @@ void TidalService::AccessTokenRequestFinished(QNetworkReply *reply) {
QJsonDocument json_doc = QJsonDocument::fromJson(data, &json_error);
if (json_error.error == QJsonParseError::NoError && !json_doc.isEmpty() && json_doc.isObject()) {
QJsonObject json_obj = json_doc.object();
if (!json_obj.isEmpty() && json_obj.contains(QLatin1String("status")) && json_obj.contains(QLatin1String("userMessage"))) {
int status = json_obj[QLatin1String("status")].toInt();
int sub_status = json_obj[QLatin1String("subStatus")].toInt();
QString user_message = json_obj[QLatin1String("userMessage")].toString();
if (!json_obj.isEmpty() && json_obj.contains("status"_L1) && json_obj.contains("userMessage"_L1)) {
int status = json_obj["status"_L1].toInt();
int sub_status = json_obj["subStatus"_L1].toInt();
QString user_message = json_obj["userMessage"_L1].toString();
login_errors_ << QStringLiteral("Authentication failure: %1 (%2) (%3)").arg(user_message).arg(status).arg(sub_status);
}
}
@@ -470,23 +471,23 @@ void TidalService::AccessTokenRequestFinished(QNetworkReply *reply) {
return;
}
if (!json_obj.contains(QLatin1String("access_token")) || !json_obj.contains(QLatin1String("expires_in"))) {
if (!json_obj.contains("access_token"_L1) || !json_obj.contains("expires_in"_L1)) {
LoginError(QStringLiteral("Authentication reply from server is missing access_token or expires_in"), json_obj);
return;
}
access_token_ = json_obj[QLatin1String("access_token")].toString();
expires_in_ = json_obj[QLatin1String("expires_in")].toInt();
if (json_obj.contains(QLatin1String("refresh_token"))) {
refresh_token_ = json_obj[QLatin1String("refresh_token")].toString();
access_token_ = json_obj["access_token"_L1].toString();
expires_in_ = json_obj["expires_in"_L1].toInt();
if (json_obj.contains("refresh_token"_L1)) {
refresh_token_ = json_obj["refresh_token"_L1].toString();
}
login_time_ = QDateTime::currentSecsSinceEpoch();
if (json_obj.contains(QLatin1String("user")) && json_obj[QLatin1String("user")].isObject()) {
QJsonObject obj_user = json_obj[QLatin1String("user")].toObject();
if (obj_user.contains(QLatin1String("countryCode")) && obj_user.contains(QLatin1String("userId"))) {
country_code_ = obj_user[QLatin1String("countryCode")].toString();
user_id_ = obj_user[QLatin1String("userId")].toInt();
if (json_obj.contains("user"_L1) && json_obj["user"_L1].isObject()) {
QJsonObject obj_user = json_obj["user"_L1].toObject();
if (obj_user.contains("countryCode"_L1) && obj_user.contains("userId"_L1)) {
country_code_ = obj_user["countryCode"_L1].toString();
user_id_ = obj_user["userId"_L1].toInt();
}
}
@@ -575,10 +576,10 @@ void TidalService::HandleAuthReply(QNetworkReply *reply) {
QJsonDocument json_doc = QJsonDocument::fromJson(data, &json_error);
if (json_error.error == QJsonParseError::NoError && !json_doc.isEmpty() && json_doc.isObject()) {
QJsonObject json_obj = json_doc.object();
if (!json_obj.isEmpty() && json_obj.contains(QLatin1String("status")) && json_obj.contains(QLatin1String("userMessage"))) {
int status = json_obj[QLatin1String("status")].toInt();
int sub_status = json_obj[QLatin1String("subStatus")].toInt();
QString user_message = json_obj[QLatin1String("userMessage")].toString();
if (!json_obj.isEmpty() && json_obj.contains("status"_L1) && json_obj.contains("userMessage"_L1)) {
int status = json_obj["status"_L1].toInt();
int sub_status = json_obj["subStatus"_L1].toInt();
QString user_message = json_obj["userMessage"_L1].toString();
login_errors_ << QStringLiteral("Authentication failure: %1 (%2) (%3)").arg(user_message).arg(status).arg(sub_status);
}
}
@@ -623,14 +624,14 @@ void TidalService::HandleAuthReply(QNetworkReply *reply) {
return;
}
if (!json_obj.contains(QLatin1String("userId")) || !json_obj.contains(QLatin1String("sessionId")) || !json_obj.contains(QLatin1String("countryCode"))) {
if (!json_obj.contains("userId"_L1) || !json_obj.contains("sessionId"_L1) || !json_obj.contains("countryCode"_L1)) {
LoginError(QStringLiteral("Authentication reply from server is missing userId, sessionId or countryCode"), json_obj);
return;
}
country_code_ = json_obj[QLatin1String("countryCode")].toString();
session_id_ = json_obj[QLatin1String("sessionId")].toString();
user_id_ = json_obj[QLatin1String("userId")].toInt();
country_code_ = json_obj["countryCode"_L1].toString();
session_id_ = json_obj["sessionId"_L1].toString();
user_id_ = json_obj["userId"_L1].toInt();
access_token_.clear();
refresh_token_.clear();
@@ -1009,7 +1010,7 @@ void TidalService::LoginError(const QString &error, const QVariant &debug) {
QString error_html;
for (const QString &e : std::as_const(login_errors_)) {
qLog(Error) << "Tidal:" << e;
error_html += e + QLatin1String("<br />");
error_html += e + "<br />"_L1;
}
if (debug.isValid()) qLog(Debug) << debug;

View File

@@ -42,6 +42,8 @@
#include "tidalbaserequest.h"
#include "tidalstreamurlrequest.h"
using namespace Qt::StringLiterals;
TidalStreamURLRequest::TidalStreamURLRequest(TidalService *service, SharedPtr<NetworkAccessManager> network, const QUrl &media_url, const uint id, QObject *parent)
: TidalBaseRequest(service, network, parent),
service_(service),
@@ -169,22 +171,22 @@ void TidalStreamURLRequest::StreamURLReceived() {
return;
}
if (!json_obj.contains(QLatin1String("trackId"))) {
if (!json_obj.contains("trackId"_L1)) {
Error(QStringLiteral("Invalid Json reply, stream missing trackId."), json_obj);
Q_EMIT StreamURLFailure(id_, media_url_, errors_.constFirst());
return;
}
int track_id = json_obj[QLatin1String("trackId")].toInt();
int track_id = json_obj["trackId"_L1].toInt();
if (track_id != song_id_) {
qLog(Debug) << "Tidal returned track ID" << track_id << "for" << media_url_;
}
Song::FileType filetype(Song::FileType::Stream);
if (json_obj.contains(QLatin1String("codec")) || json_obj.contains(QLatin1String("codecs"))) {
if (json_obj.contains("codec"_L1) || json_obj.contains("codecs"_L1)) {
QString codec;
if (json_obj.contains(QLatin1String("codec"))) codec = json_obj[QLatin1String("codec")].toString().toLower();
if (json_obj.contains(QLatin1String("codecs"))) codec = json_obj[QLatin1String("codecs")].toString().toLower();
if (json_obj.contains("codec"_L1)) codec = json_obj["codec"_L1].toString().toLower();
if (json_obj.contains("codecs"_L1)) codec = json_obj["codecs"_L1].toString().toLower();
filetype = Song::FiletypeByExtension(codec);
if (filetype == Song::FileType::Unknown) {
qLog(Debug) << "Tidal: Unknown codec" << codec;
@@ -194,9 +196,9 @@ void TidalStreamURLRequest::StreamURLReceived() {
QList<QUrl> urls;
if (json_obj.contains(QLatin1String("manifest"))) {
if (json_obj.contains("manifest"_L1)) {
QString manifest(json_obj[QLatin1String("manifest")].toString());
QString manifest(json_obj["manifest"_L1].toString());
QByteArray data_manifest = QByteArray::fromBase64(manifest.toUtf8());
QXmlStreamReader xml_reader(data_manifest);
@@ -215,9 +217,9 @@ void TidalStreamURLRequest::StreamURLReceived() {
return;
}
if (json_obj.contains(QLatin1String("encryptionType")) && json_obj.contains(QLatin1String("keyId"))) {
QString encryption_type = json_obj[QLatin1String("encryptionType")].toString();
QString key_id = json_obj[QLatin1String("keyId")].toString();
if (json_obj.contains("encryptionType"_L1) && json_obj.contains("keyId"_L1)) {
QString encryption_type = json_obj["encryptionType"_L1].toString();
QString key_id = json_obj["keyId"_L1].toString();
if (!encryption_type.isEmpty() && !key_id.isEmpty()) {
Error(tr("Received URL with %1 encrypted stream from Tidal. Strawberry does not currently support encrypted streams.").arg(encryption_type));
Q_EMIT StreamURLFailure(id_, media_url_, errors_.constFirst());
@@ -225,13 +227,13 @@ void TidalStreamURLRequest::StreamURLReceived() {
}
}
if (!json_obj.contains(QLatin1String("mimeType"))) {
if (!json_obj.contains("mimeType"_L1)) {
Error(QStringLiteral("Invalid Json reply, stream url reply manifest is missing mimeType."), json_obj);
Q_EMIT StreamURLFailure(id_, media_url_, errors_.constFirst());
return;
}
QString mimetype = json_obj[QLatin1String("mimeType")].toString();
QString mimetype = json_obj["mimeType"_L1].toString();
QMimeDatabase mimedb;
const QStringList suffixes = mimedb.mimeTypeForName(mimetype).suffixes();
for (const QString &suffix : suffixes) {
@@ -246,8 +248,8 @@ void TidalStreamURLRequest::StreamURLReceived() {
}
if (json_obj.contains(QLatin1String("urls"))) {
QJsonValue json_urls = json_obj[QLatin1String("urls")];
if (json_obj.contains("urls"_L1)) {
QJsonValue json_urls = json_obj["urls"_L1];
if (!json_urls.isArray()) {
Error(QStringLiteral("Invalid Json reply, urls is not an array."), json_urls);
Q_EMIT StreamURLFailure(id_, media_url_, errors_.constFirst());
@@ -259,8 +261,8 @@ void TidalStreamURLRequest::StreamURLReceived() {
urls << QUrl(value.toString());
}
}
else if (json_obj.contains(QLatin1String("url"))) {
QUrl new_url(json_obj[QLatin1String("url")].toString());
else if (json_obj.contains("url"_L1)) {
QUrl new_url(json_obj["url"_L1].toString());
urls << new_url;
if (filetype == Song::FileType::Stream) {
// Guess filetype by filename extension in URL.
@@ -269,8 +271,8 @@ void TidalStreamURLRequest::StreamURLReceived() {
}
}
if (json_obj.contains(QLatin1String("encryptionKey"))) {
QString encryption_key = json_obj[QLatin1String("encryptionKey")].toString();
if (json_obj.contains("encryptionKey"_L1)) {
QString encryption_key = json_obj["encryptionKey"_L1].toString();
if (!encryption_key.isEmpty()) {
Error(tr("Received URL with encrypted stream from Tidal. Strawberry does not currently support encrypted streams."));
Q_EMIT StreamURLFailure(id_, media_url_, errors_.constFirst());
@@ -278,9 +280,9 @@ void TidalStreamURLRequest::StreamURLReceived() {
}
}
if (json_obj.contains(QLatin1String("securityType")) && json_obj.contains(QLatin1String("securityToken"))) {
QString security_type = json_obj[QLatin1String("securityType")].toString();
QString security_token = json_obj[QLatin1String("securityToken")].toString();
if (json_obj.contains("securityType"_L1) && json_obj.contains("securityToken"_L1)) {
QString security_type = json_obj["securityType"_L1].toString();
QString security_token = json_obj["securityToken"_L1].toString();
if (!security_type.isEmpty() && !security_token.isEmpty()) {
Error(tr("Received URL with encrypted stream from Tidal. Strawberry does not currently support encrypted streams."));
Q_EMIT StreamURLFailure(id_, media_url_, errors_.constFirst());