Skip to content

Commit 83399a5

Browse files
author
Andrew Rabert
committed
Change MPRIS artUrl to inline base64 image
Particularly useful for Flatpak where filesystem paths may not be consistent between the host and sandbox.
1 parent df79a7f commit 83399a5

2 files changed

Lines changed: 33 additions & 66 deletions

File tree

src/mpris/MprisComponent.cpp

Lines changed: 32 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,7 @@
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>
@@ -23,6 +20,7 @@
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

5951
MprisComponent::~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

10711044
void 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

11261095
QString MprisComponent::extractArtworkUrl(const QVariantMap& metadata, const QUrl& baseUrl)

src/mpris/MprisComponent.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,7 @@ private Q_SLOTS:
151151

152152
bool m_isNavigating;
153153

154-
QString m_currentArtPath;
155-
QString m_albumArtDir;
156-
QString m_pendingArtPath;
154+
QString m_currentArtDataUri;
157155
QString m_pendingArtUrl;
158156
PlayerComponent::State m_playerState;
159157

0 commit comments

Comments
 (0)