1010#include < QDBusMessage>
1111#include < QDBusError>
1212#include < QApplication>
13- #include < QCryptographicHash>
1413#include < QDebug>
15- #include < QDir>
16- #include < QFile>
1714#include < QJsonDocument>
1815#include < QJsonObject>
1916#include < QJsonArray>
2320#include < QEventLoop>
2421#include < QTimer>
2522#include < QUrlQuery>
23+ #include < QMimeDatabase>
2624
2725#define MPRIS_SERVICE_NAME " org.mpris.MediaPlayer2.jellyfinmediaplayer"
2826#define MPRIS_OBJECT_PATH " /org/mpris/MediaPlayer2"
@@ -44,16 +42,10 @@ MprisComponent::MprisComponent(QObject* parent)
4442 , m_seekPending(false )
4543 , m_expectedPosition(0 )
4644 , m_isNavigating(false )
47- , m_albumArtDir(" /tmp/jellyfin-mpris" )
4845 , m_playerState(PlayerComponent::State::finished)
49- , m_albumArtManager(nullptr )
46+ , m_albumArtManager(new QNetworkAccessManager( this ) )
5047 , m_pendingArtReply(nullptr )
5148{
52- // Create album art directory
53- QDir dir;
54- dir.mkpath (m_albumArtDir);
55-
56- m_albumArtManager = new QNetworkAccessManager (this );
5749}
5850
5951MprisComponent::~MprisComponent ()
@@ -1002,46 +994,32 @@ QString MprisComponent::handleAlbumArt(const QString& artUrl)
1002994 if (artUrl.isEmpty ())
1003995 return QString ();
1004996
997+ // For file:// URLs, return as-is
1005998 if (artUrl.startsWith (" file://" ))
1006999 {
1007- if (!m_currentArtPath.isEmpty ())
1008- cleanupAlbumArt ();
1000+ cleanupAlbumArt ();
10091001 return artUrl;
10101002 }
10111003
1004+ // For http/https URLs, download and convert to data URI
10121005 if (artUrl.startsWith (" http://" ) || artUrl.startsWith (" https://" ))
10131006 {
1014- QCryptographicHash hash (QCryptographicHash::Md5);
1015- hash.addData (artUrl.toUtf8 ());
1016- QString filename = QString (" %1/%2.jpg" ).arg (m_albumArtDir)
1017- .arg (hash.result ().toHex ().constData ());
1018-
1019- if (QFile::exists (filename))
1020- {
1021- if (m_currentArtPath != filename && !m_currentArtPath.isEmpty ())
1022- cleanupAlbumArt ();
1023-
1024- m_currentArtPath = filename;
1025- return QUrl::fromLocalFile (filename).toString ();
1026- }
1027-
1007+ // If already downloading this URL, wait for it
10281008 if (m_pendingArtReply && m_pendingArtUrl == artUrl)
1029- {
1030- return QString ();
1031- }
1009+ return m_currentArtDataUri;
10321010
1033- if (!m_currentArtPath.isEmpty () || m_pendingArtReply)
1034- cleanupAlbumArt ();
1011+ // If URL hasn't changed and we have a cached data URI, return it
1012+ if (m_pendingArtUrl == artUrl && !m_currentArtDataUri.isEmpty ())
1013+ return m_currentArtDataUri;
10351014
1036- m_pendingArtPath = filename ;
1015+ cleanupAlbumArt () ;
10371016 m_pendingArtUrl = artUrl;
10381017
10391018 QNetworkRequest request;
10401019 request.setUrl (QUrl (artUrl));
10411020 request.setRawHeader (" User-Agent" , " JellyfinMediaPlayer/1.0" );
10421021
10431022 m_pendingArtReply = m_albumArtManager->get (request);
1044-
10451023 connect (m_pendingArtReply, &QNetworkReply::finished, this , &MprisComponent::onAlbumArtDownloaded);
10461024
10471025 return QString ();
@@ -1057,15 +1035,10 @@ void MprisComponent::cleanupAlbumArt()
10571035 m_pendingArtReply->abort ();
10581036 m_pendingArtReply->deleteLater ();
10591037 m_pendingArtReply = nullptr ;
1060- m_pendingArtPath.clear ();
10611038 m_pendingArtUrl.clear ();
10621039 }
10631040
1064- if (!m_currentArtPath.isEmpty ())
1065- {
1066- QFile::remove (m_currentArtPath);
1067- m_currentArtPath.clear ();
1068- }
1041+ m_currentArtDataUri.clear ();
10691042}
10701043
10711044void MprisComponent::onAlbumArtDownloaded ()
@@ -1083,44 +1056,40 @@ void MprisComponent::onAlbumArtDownloaded()
10831056 {
10841057 if (reply->error () != QNetworkReply::OperationCanceledError)
10851058 qDebug () << " MPRIS: Album art download failed:" << reply->errorString ();
1086- m_pendingArtPath.clear ();
10871059 return ;
10881060 }
10891061
10901062 QByteArray imageData = reply->readAll ();
1091-
1092- if (imageData.size () > 0 )
1063+ if (imageData.isEmpty ())
10931064 {
1094- QFile file (m_pendingArtPath);
1095- if (file.open (QIODevice::WriteOnly))
1096- {
1097- file.write (imageData);
1098- file.close ();
1065+ qDebug () << " MPRIS: Album art download returned empty data" ;
1066+ return ;
1067+ }
10991068
1100- file.setPermissions (QFile::ReadOwner | QFile::WriteOwner);
1069+ static QMimeDatabase mimeDb;
1070+ QString mimeType = mimeDb.mimeTypeForData (imageData).name ();
1071+ qDebug () << " MPRIS: Album art mime type:" << mimeType;
1072+ if (mimeType.startsWith (" image/" ))
1073+ {
1074+ // Create data URI
1075+ QString dataUri = QString (" data:%1;base64,%2" )
1076+ .arg (mimeType)
1077+ .arg (QString::fromLatin1 (imageData.toBase64 ()));
11011078
1102- m_currentArtPath = m_pendingArtPath;
1103- QString artUrl = QUrl::fromLocalFile (m_currentArtPath).toString ();
1079+ m_currentArtDataUri = dataUri;
11041080
1105- if (!m_metadata.isEmpty ())
1106- {
1107- m_metadata[" mpris:artUrl" ] = artUrl;
1108- emitPropertyChange (" org.mpris.MediaPlayer2.Player" , " Metadata" , m_metadata);
1109- }
1110-
1111- qDebug () << " MPRIS: Album art downloaded successfully:" << m_currentArtPath;
1112- }
1113- else
1081+ if (!m_metadata.isEmpty ())
11141082 {
1115- qDebug () << " MPRIS: Failed to write album art to:" << m_pendingArtPath;
1083+ m_metadata[" mpris:artUrl" ] = dataUri;
1084+ emitPropertyChange (" org.mpris.MediaPlayer2.Player" , " Metadata" , m_metadata);
11161085 }
1086+
1087+ qDebug () << " MPRIS: Album art downloaded successfully, data URI length:" << dataUri.length ();
11171088 }
11181089 else
11191090 {
1120- qDebug () << " MPRIS: Album art validation failed - empty data " ;
1091+ qDebug () << " MPRIS: Album art not an image type: " << mimeType ;
11211092 }
1122-
1123- m_pendingArtPath.clear ();
11241093}
11251094
11261095QString MprisComponent::extractArtworkUrl (const QVariantMap& metadata, const QUrl& baseUrl)
0 commit comments