diff --git a/linux/media/mediacontroller.cpp b/linux/media/mediacontroller.cpp index 078129c5a..6e0db5c16 100644 --- a/linux/media/mediacontroller.cpp +++ b/linux/media/mediacontroller.cpp @@ -288,8 +288,7 @@ QStringList MediaController::getPlayingMediaPlayers() continue; } - QVariant playbackStatus = playerInterface.property("PlaybackStatus"); - if (playbackStatus.isValid() && playbackStatus.toString() == "Playing") + if (PlayerStatusWatcher::playbackStatusOf(service) == "Playing") { playingServices << service; LOG_DEBUG("Found playing service: " << service); @@ -373,9 +372,9 @@ void MediaController::pause() continue; } - QVariant playbackStatus = playerInterface.property("PlaybackStatus"); - LOG_DEBUG("PlaybackStatus for " << service << ": " << playbackStatus.toString()); - if (!playbackStatus.isValid() || playbackStatus.toString() != "Playing") + const QString playbackStatus = PlayerStatusWatcher::playbackStatusOf(service); + LOG_DEBUG("PlaybackStatus for " << service << ": " << playbackStatus); + if (playbackStatus != "Playing") { continue; } diff --git a/linux/media/playerstatuswatcher.cpp b/linux/media/playerstatuswatcher.cpp index 76e4d246a..6d2a81558 100644 --- a/linux/media/playerstatuswatcher.cpp +++ b/linux/media/playerstatuswatcher.cpp @@ -47,6 +47,26 @@ void PlayerStatusWatcher::onServiceOwnerChanged(const QString &name, const QStri } } +QString PlayerStatusWatcher::playbackStatusOf(const QString &playerService) +{ + if (playerService.isEmpty()) { + return QString(); + } + + QDBusInterface props(playerService, "/org/mpris/MediaPlayer2", + "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus()); + if (!props.isValid()) { + return QString(); + } + + QDBusReply reply = props.call("Get", "org.mpris.MediaPlayer2.Player", "PlaybackStatus"); + if (!reply.isValid()) { + return QString(); + } + + return reply.value().toString(); +} + QString PlayerStatusWatcher::getCurrentPlaybackStatus(const QString &playerService) { QDBusConnection bus = QDBusConnection::sessionBus(); @@ -54,14 +74,8 @@ QString PlayerStatusWatcher::getCurrentPlaybackStatus(const QString &playerServi for (const QString &service : services) { if (service.startsWith("org.mpris.MediaPlayer2.")) { - QDBusInterface iface(service, "/org/mpris/MediaPlayer2", - "org.mpris.MediaPlayer2.Player", bus); - - if (iface.isValid()) { - QVariant status = iface.property("PlaybackStatus"); - if (status.isValid() && status.toString() == "Playing") { - return status.toString(); - } + if (playbackStatusOf(service) == "Playing") { + return QStringLiteral("Playing"); } } } diff --git a/linux/media/playerstatuswatcher.h b/linux/media/playerstatuswatcher.h index c0d14c46a..f456873c8 100644 --- a/linux/media/playerstatuswatcher.h +++ b/linux/media/playerstatuswatcher.h @@ -9,6 +9,9 @@ class PlayerStatusWatcher : public QObject { public: explicit PlayerStatusWatcher(const QString &playerService, QObject *parent = nullptr); static QString getCurrentPlaybackStatus(const QString &playerService); + // Chromium serves an empty Introspect document, so the metaobject QDBusInterface builds + // from it has no PlaybackStatus and property() reads invalid on a player that is Playing. + static QString playbackStatusOf(const QString &playerService); signals: void playbackStatusChanged(const QString &status);