Check if QNetworkRequest::ContentTypeHeader is filetype everwhere

This commit is contained in:
Jonas Kvinge
2020-10-11 01:08:42 +02:00
parent db96e24028
commit 318c3bb422
7 changed files with 66 additions and 37 deletions

View File

@@ -64,6 +64,7 @@
#include <QtEvents> #include <QtEvents>
#include <QMessageBox> #include <QMessageBox>
#include <QNetworkInterface> #include <QNetworkInterface>
#include <QImageReader>
#include <QtDebug> #include <QtDebug>
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
# include <QRandomGenerator> # include <QRandomGenerator>
@@ -108,6 +109,9 @@
namespace Utilities { namespace Utilities {
QStringList kSupportedImageMimeTypes;
QStringList kSupportedImageFormats;
static QString tr(const char *str) { static QString tr(const char *str) {
return QCoreApplication::translate("", str); return QCoreApplication::translate("", str);
} }
@@ -1024,13 +1028,41 @@ bool IsColorDark(const QColor &color) {
return ((30 * color.red() + 59 * color.green() + 11 * color.blue()) / 100) <= 130; return ((30 * color.red() + 59 * color.green() + 11 * color.blue()) / 100) <= 130;
} }
QStringList SupportedImageMimeTypes() {
if (kSupportedImageMimeTypes.isEmpty()) {
for (const QByteArray &mimetype : QImageReader::supportedMimeTypes()) {
kSupportedImageMimeTypes << mimetype;
}
}
return kSupportedImageMimeTypes;
}
QStringList SupportedImageFormats() {
if (kSupportedImageFormats.isEmpty()) {
for (const QByteArray &filetype : QImageReader::supportedImageFormats()) {
kSupportedImageFormats << filetype;
}
}
return kSupportedImageFormats;
}
QList<QByteArray> ImageFormatsForMimeType(const QByteArray &mimetype) { QList<QByteArray> ImageFormatsForMimeType(const QByteArray &mimetype) {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
return QImageReader::imageFormatsForMimeType(mimetype);
#else
if (mimetype == "image/bmp") return QList<QByteArray>() << "BMP"; if (mimetype == "image/bmp") return QList<QByteArray>() << "BMP";
else if (mimetype == "image/gif") return QList<QByteArray>() << "GIF"; else if (mimetype == "image/gif") return QList<QByteArray>() << "GIF";
else if (mimetype == "image/jpeg") return QList<QByteArray>() << "JPG"; else if (mimetype == "image/jpeg") return QList<QByteArray>() << "JPG";
else if (mimetype == "image/png") return QList<QByteArray>() << "PNG"; else if (mimetype == "image/png") return QList<QByteArray>() << "PNG";
else return QList<QByteArray>(); else return QList<QByteArray>();
#endif
} }

View File

@@ -158,6 +158,8 @@ QString ReplaceVariable(const QString &variable, const Song &song, const QString
bool IsColorDark(const QColor &color); bool IsColorDark(const QColor &color);
QStringList SupportedImageMimeTypes();
QStringList SupportedImageFormats();
QList<QByteArray> ImageFormatsForMimeType(const QByteArray &mimetype); QList<QByteArray> ImageFormatsForMimeType(const QByteArray &mimetype);
} // namespace } // namespace

View File

@@ -40,6 +40,7 @@
#include <QtDebug> #include <QtDebug>
#include "core/logging.h" #include "core/logging.h"
#include "core/utilities.h"
#include "core/networktimeouts.h" #include "core/networktimeouts.h"
#include "albumcoverfetcher.h" #include "albumcoverfetcher.h"
#include "albumcoverfetchersearch.h" #include "albumcoverfetchersearch.h"
@@ -325,7 +326,7 @@ void AlbumCoverFetcherSearch::ProviderCoverFetchFinished(QNetworkReply *reply) {
} }
else { else {
QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString(); QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString();
if (QImageReader::supportedMimeTypes().contains(mimetype.toUtf8())) { if (Utilities::SupportedImageMimeTypes().contains(mimetype, Qt::CaseInsensitive) || Utilities::SupportedImageFormats().contains(mimetype, Qt::CaseInsensitive)) {
QImage image; QImage image;
if (image.loadFromData(reply->readAll())) { if (image.loadFromData(reply->readAll())) {
if (result.image_size != QSize(0,0) && result.image_size != image.size()) { if (result.image_size != QSize(0,0) && result.image_size != image.size()) {

View File

@@ -1220,7 +1220,7 @@ void QobuzRequest::AlbumCoverReceived(QNetworkReply *reply, const QUrl &cover_ur
if (reply->error() != QNetworkReply::NoError) { if (reply->error() != QNetworkReply::NoError) {
Error(QString("%1 (%2)").arg(reply->errorString()).arg(reply->error())); Error(QString("%1 (%2)").arg(reply->errorString()).arg(reply->error()));
album_covers_requests_sent_.remove(cover_url); if (album_covers_requests_sent_.contains(cover_url)) album_covers_requests_sent_.remove(cover_url);
AlbumCoverFinishCheck(); AlbumCoverFinishCheck();
return; return;
} }
@@ -1233,27 +1233,29 @@ void QobuzRequest::AlbumCoverReceived(QNetworkReply *reply, const QUrl &cover_ur
} }
QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString(); QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString();
if (!QImageReader::supportedMimeTypes().contains(mimetype.toUtf8())) { if (!Utilities::SupportedImageMimeTypes().contains(mimetype, Qt::CaseInsensitive) && !Utilities::SupportedImageFormats().contains(mimetype, Qt::CaseInsensitive)) {
Error(QString("Unsupported mimetype for image reader %1 for %2").arg(mimetype).arg(cover_url.toString())); Error(QString("Unsupported mimetype for image reader %1 for %2").arg(mimetype).arg(cover_url.toString()));
if (album_covers_requests_sent_.contains(cover_url)) album_covers_requests_sent_.remove(cover_url); if (album_covers_requests_sent_.contains(cover_url)) album_covers_requests_sent_.remove(cover_url);
AlbumCoverFinishCheck(); AlbumCoverFinishCheck();
return; return;
} }
#if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
QList<QByteArray> format_list = QImageReader::imageFormatsForMimeType(mimetype.toUtf8());
#else
QList<QByteArray> format_list = Utilities::ImageFormatsForMimeType(mimetype.toUtf8());
#endif
QByteArray data = reply->readAll(); QByteArray data = reply->readAll();
if (format_list.isEmpty() || data.isEmpty()) { if (data.isEmpty()) {
Error(QString("Received empty image data for %1").arg(cover_url.toString())); Error(QString("Received empty image data for %1").arg(cover_url.toString()));
album_covers_requests_sent_.remove(cover_url); if (album_covers_requests_sent_.contains(cover_url)) album_covers_requests_sent_.remove(cover_url);
AlbumCoverFinishCheck(); AlbumCoverFinishCheck();
return; return;
} }
QByteArray format = format_list.first();
QList<QByteArray> format_list = Utilities::ImageFormatsForMimeType(mimetype.toUtf8());
QByteArray format;
if (format_list.isEmpty()) {
format = "JPG";
}
else {
format = format_list.first();
}
QImage image; QImage image;
if (image.loadFromData(data, format)) { if (image.loadFromData(data, format)) {
@@ -1263,10 +1265,13 @@ void QobuzRequest::AlbumCoverReceived(QNetworkReply *reply, const QUrl &cover_ur
song->set_art_automatic(QUrl::fromLocalFile(filename)); song->set_art_automatic(QUrl::fromLocalFile(filename));
} }
} }
else {
Error(QString("Error saving image data to %1").arg(filename));
if (album_covers_requests_sent_.contains(cover_url)) album_covers_requests_sent_.remove(cover_url);
}
} }
else { else {
album_covers_requests_sent_.remove(cover_url); if (album_covers_requests_sent_.contains(cover_url)) album_covers_requests_sent_.remove(cover_url);
Error(QString("Error decoding image data from %1").arg(cover_url.toString())); Error(QString("Error decoding image data from %1").arg(cover_url.toString()));
} }

View File

@@ -57,9 +57,6 @@ const int SubsonicRequest::kMaxConcurrentAlbumsRequests = 3;
const int SubsonicRequest::kMaxConcurrentAlbumSongsRequests = 3; const int SubsonicRequest::kMaxConcurrentAlbumSongsRequests = 3;
const int SubsonicRequest::kMaxConcurrentAlbumCoverRequests = 1; const int SubsonicRequest::kMaxConcurrentAlbumCoverRequests = 1;
QStringList SubsonicRequest::kSupportedImageMimeTypes;
QStringList SubsonicRequest::kSupportedImageFormats;
SubsonicRequest::SubsonicRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, Application *app, QObject *parent) SubsonicRequest::SubsonicRequest(SubsonicService *service, SubsonicUrlHandler *url_handler, Application *app, QObject *parent)
: SubsonicBaseRequest(service, parent), : SubsonicBaseRequest(service, parent),
service_(service), service_(service),
@@ -81,14 +78,6 @@ SubsonicRequest::SubsonicRequest(SubsonicService *service, SubsonicUrlHandler *u
network_->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy); network_->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
#endif #endif
for (const QByteArray &mimetype : QImageReader::supportedMimeTypes()) {
kSupportedImageMimeTypes.append(QString::fromUtf8(mimetype));
}
for (const QByteArray &filetype : QImageReader::supportedImageFormats()) {
kSupportedImageFormats.append(filetype);
}
} }
SubsonicRequest::~SubsonicRequest() { SubsonicRequest::~SubsonicRequest() {
@@ -799,7 +788,7 @@ void SubsonicRequest::AlbumCoverReceived(QNetworkReply *reply, const QUrl url, c
} }
QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString(); QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString();
if (!kSupportedImageMimeTypes.contains(mimetype, Qt::CaseInsensitive) && !kSupportedImageFormats.contains(mimetype, Qt::CaseInsensitive)) { if (!Utilities::SupportedImageMimeTypes().contains(mimetype, Qt::CaseInsensitive) && !Utilities::SupportedImageFormats().contains(mimetype, Qt::CaseInsensitive)) {
Error(QString("Unsupported mimetype for image reader %1 for %2").arg(mimetype).arg(url.toString())); Error(QString("Unsupported mimetype for image reader %1 for %2").arg(mimetype).arg(url.toString()));
if (album_covers_requests_sent_.contains(url)) album_covers_requests_sent_.remove(url); if (album_covers_requests_sent_.contains(url)) album_covers_requests_sent_.remove(url);
AlbumCoverFinishCheck(); AlbumCoverFinishCheck();

View File

@@ -115,8 +115,6 @@ class SubsonicRequest : public SubsonicBaseRequest {
static const int kMaxConcurrentArtistAlbumsRequests; static const int kMaxConcurrentArtistAlbumsRequests;
static const int kMaxConcurrentAlbumSongsRequests; static const int kMaxConcurrentAlbumSongsRequests;
static const int kMaxConcurrentAlbumCoverRequests; static const int kMaxConcurrentAlbumCoverRequests;
static QStringList kSupportedImageMimeTypes;
static QStringList kSupportedImageFormats;
SubsonicService *service_; SubsonicService *service_;
SubsonicUrlHandler *url_handler_; SubsonicUrlHandler *url_handler_;

View File

@@ -1170,27 +1170,29 @@ void TidalRequest::AlbumCoverReceived(QNetworkReply *reply, const QString &album
} }
QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString(); QString mimetype = reply->header(QNetworkRequest::ContentTypeHeader).toString();
if (!QImageReader::supportedMimeTypes().contains(mimetype.toUtf8())) { if (!Utilities::SupportedImageMimeTypes().contains(mimetype, Qt::CaseInsensitive) && !Utilities::SupportedImageFormats().contains(mimetype, Qt::CaseInsensitive)) {
Error(QString("Unsupported mimetype for image reader %1 for %2").arg(mimetype).arg(url.toString())); Error(QString("Unsupported mimetype for image reader %1 for %2").arg(mimetype).arg(url.toString()));
if (album_covers_requests_sent_.contains(album_id)) album_covers_requests_sent_.remove(album_id); if (album_covers_requests_sent_.contains(album_id)) album_covers_requests_sent_.remove(album_id);
AlbumCoverFinishCheck(); AlbumCoverFinishCheck();
return; return;
} }
#if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0))
QList<QByteArray> format_list = QImageReader::imageFormatsForMimeType(mimetype.toUtf8());
#else
QList<QByteArray> format_list = Utilities::ImageFormatsForMimeType(mimetype.toUtf8());
#endif
QByteArray data = reply->readAll(); QByteArray data = reply->readAll();
if (format_list.isEmpty() || data.isEmpty()) { if (data.isEmpty()) {
Error(QString("Received empty image data for %1").arg(url.toString())); Error(QString("Received empty image data for %1").arg(url.toString()));
if (album_covers_requests_sent_.contains(album_id)) album_covers_requests_sent_.remove(album_id); if (album_covers_requests_sent_.contains(album_id)) album_covers_requests_sent_.remove(album_id);
AlbumCoverFinishCheck(); AlbumCoverFinishCheck();
return; return;
} }
QByteArray format = format_list.first();
QList<QByteArray> format_list = Utilities::ImageFormatsForMimeType(mimetype.toUtf8());
QByteArray format;
if (format_list.isEmpty()) {
format = "JPG";
}
else {
format = format_list.first();
}
QImage image; QImage image;
if (image.loadFromData(data, format)) { if (image.loadFromData(data, format)) {