From 06240ccf8027a38e72eaae2d598d262258688b27 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Thu, 23 May 2024 18:15:49 -0700 Subject: [PATCH] service/mpris: improve compatibility with noncompliant players --- src/services/mpris/player.cpp | 30 +++++++++++++++++++++++------- src/services/mpris/player.hpp | 1 + 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/services/mpris/player.cpp b/src/services/mpris/player.cpp index e17f3e8..b659bad 100644 --- a/src/services/mpris/player.cpp +++ b/src/services/mpris/player.cpp @@ -192,15 +192,15 @@ void MprisPlayer::setPosition(qreal position) { } auto target = static_cast(position * 1000) * 1000; - this->pPosition.set(target); if (!this->mTrackId.isEmpty()) { this->player->SetPosition(QDBusObjectPath(this->mTrackId), target); - return; } else { auto pos = this->positionMs() * 1000; this->player->Seek(target - pos); } + + this->pPosition.set(target); } void MprisPlayer::onPositionChanged() { @@ -247,6 +247,8 @@ void MprisPlayer::setVolume(qreal volume) { QVariantMap MprisPlayer::metadata() const { return this->pMetadata.get(); } void MprisPlayer::onMetadataChanged() { + emit this->metadataChanged(); + auto lengthVariant = this->pMetadata.get().value("mpris:length"); qlonglong length = -1; if (lengthVariant.isValid() && lengthVariant.canConvert()) { @@ -258,20 +260,34 @@ void MprisPlayer::onMetadataChanged() { emit this->lengthChanged(); } + auto trackChanged = false; + auto trackidVariant = this->pMetadata.get().value("mpris:trackid"); if (trackidVariant.isValid() && trackidVariant.canConvert()) { auto trackId = trackidVariant.value(); if (trackId != this->mTrackId) { this->mTrackId = trackId; - emit this->trackChanged(); + trackChanged = true; } - - // Some players don't seem to send position updats or seeks on track change. - this->pPosition.update(); } - emit this->metadataChanged(); + // Helps to catch players without trackid. + auto urlVariant = this->pMetadata.get().value("xesam:url"); + if (urlVariant.isValid() && urlVariant.canConvert()) { + auto url = urlVariant.value(); + + if (url != this->mUrl) { + this->mUrl = url; + trackChanged = true; + } + } + + if (trackChanged) { + // Some players don't seem to send position updates or seeks on track change. + this->pPosition.update(); + emit this->trackChanged(); + } } MprisPlaybackState::Enum MprisPlayer::playbackState() const { return this->mPlaybackState; } diff --git a/src/services/mpris/player.hpp b/src/services/mpris/player.hpp index ddbb87c..1172505 100644 --- a/src/services/mpris/player.hpp +++ b/src/services/mpris/player.hpp @@ -326,6 +326,7 @@ private: DBusMprisPlayerApp* app = nullptr; DBusMprisPlayer* player = nullptr; QString mTrackId; + QString mUrl; }; } // namespace qs::service::mpris