From 5f4990c6aa1ec89c8243d3840fdc613aed6f08f7 Mon Sep 17 00:00:00 2001 From: delthas Date: Wed, 4 Sep 2024 16:16:56 +0000 Subject: [PATCH] Bug 1815783 - Expose media URL in MPRIS metadata r=media-playback-reviewers,padenot Differential Revision: https://phabricator.services.mozilla.com/D219160 --- dom/media/mediacontrol/MediaStatusManager.cpp | 28 +++++++++++++++++++ dom/media/mediacontrol/MediaStatusManager.h | 1 + dom/media/mediasession/MediaMetadata.h | 1 + dom/media/mediasession/MediaSessionIPCUtils.h | 2 ++ widget/gtk/MPRISServiceHandler.cpp | 5 ++++ widget/gtk/MPRISServiceHandler.h | 1 + 6 files changed, 38 insertions(+) diff --git a/dom/media/mediacontrol/MediaStatusManager.cpp b/dom/media/mediacontrol/MediaStatusManager.cpp index b309a214ac3a..651b0adfbb02 100644 --- a/dom/media/mediacontrol/MediaStatusManager.cpp +++ b/dom/media/mediacontrol/MediaStatusManager.cpp @@ -199,6 +199,7 @@ bool MediaStatusManager::IsSessionOwningAudioFocus( MediaMetadataBase MediaStatusManager::CreateDefaultMetadata() const { MediaMetadataBase metadata; metadata.mTitle = GetDefaultTitle(); + metadata.mUrl = GetUrl(); metadata.mArtwork.AppendElement()->mSrc = GetDefaultFaviconURL(); LOG("Default media metadata, title=%s, album src=%s", @@ -236,6 +237,32 @@ nsString MediaStatusManager::GetDefaultTitle() const { return documentTitle.IsEmpty() ? defaultTitle : documentTitle; } +nsCString MediaStatusManager::GetUrl() const { + nsCString defaultUrl; + + RefPtr bc = + CanonicalBrowsingContext::Get(mTopLevelBrowsingContextId); + if (!bc) { + return defaultUrl; + } + + RefPtr globalParent = bc->GetCurrentWindowGlobal(); + if (!globalParent) { + return defaultUrl; + } + + if (IsInPrivateBrowsing()) { + return defaultUrl; + } + + nsIURI* documentURI = globalParent->GetDocumentURI(); + if (!documentURI) { + return defaultUrl; + } + + return documentURI->GetSpecOrDefault(); +} + nsString MediaStatusManager::GetDefaultFaviconURL() const { #ifdef MOZ_PLACES nsCOMPtr faviconURI; @@ -446,6 +473,7 @@ MediaMetadataBase MediaStatusManager::GetCurrentMediaMetadata() const { } MediaMetadataBase& metadata = *(info.mMetadata); FillMissingTitleAndArtworkIfNeeded(metadata); + metadata.mUrl = GetUrl(); return metadata; } return CreateDefaultMetadata(); diff --git a/dom/media/mediacontrol/MediaStatusManager.h b/dom/media/mediacontrol/MediaStatusManager.h index 45f3ccccc5d1..93c4abcf9ed3 100644 --- a/dom/media/mediacontrol/MediaStatusManager.h +++ b/dom/media/mediacontrol/MediaStatusManager.h @@ -230,6 +230,7 @@ class MediaStatusManager : public IMediaInfoUpdater { private: nsString GetDefaultFaviconURL() const; nsString GetDefaultTitle() const; + nsCString GetUrl() const; MediaMetadataBase CreateDefaultMetadata() const; bool IsInPrivateBrowsing() const; void FillMissingTitleAndArtworkIfNeeded(MediaMetadataBase& aMetadata) const; diff --git a/dom/media/mediasession/MediaMetadata.h b/dom/media/mediasession/MediaMetadata.h index 6c552e646577..3c1a6c3fe9f6 100644 --- a/dom/media/mediasession/MediaMetadata.h +++ b/dom/media/mediasession/MediaMetadata.h @@ -33,6 +33,7 @@ class MediaMetadataBase { nsString mTitle; nsString mArtist; nsString mAlbum; + nsCString mUrl; CopyableTArray mArtwork; }; diff --git a/dom/media/mediasession/MediaSessionIPCUtils.h b/dom/media/mediasession/MediaSessionIPCUtils.h index 610b123b6cb9..8a3f2cf16a6d 100644 --- a/dom/media/mediasession/MediaSessionIPCUtils.h +++ b/dom/media/mediasession/MediaSessionIPCUtils.h @@ -50,6 +50,7 @@ struct ParamTraits { WriteParam(aWriter, aParam.mTitle); WriteParam(aWriter, aParam.mArtist); WriteParam(aWriter, aParam.mAlbum); + WriteParam(aWriter, aParam.mUrl); WriteParam(aWriter, aParam.mArtwork); } @@ -57,6 +58,7 @@ struct ParamTraits { if (!ReadParam(aReader, &(aResult->mTitle)) || !ReadParam(aReader, &(aResult->mArtist)) || !ReadParam(aReader, &(aResult->mAlbum)) || + !ReadParam(aReader, &(aResult->mUrl)) || !ReadParam(aReader, &(aResult->mArtwork))) { return false; } diff --git a/widget/gtk/MPRISServiceHandler.cpp b/widget/gtk/MPRISServiceHandler.cpp index 2cff17f5099f..1ce4aa519a7e 100644 --- a/widget/gtk/MPRISServiceHandler.cpp +++ b/widget/gtk/MPRISServiceHandler.cpp @@ -846,6 +846,11 @@ GVariant* MPRISServiceHandler::GetMetadataAsGVariant() const { g_variant_new_string(static_cast( mMPRISMetadata.mArtUrl.get()))); } + if (!mMPRISMetadata.mUrl.IsEmpty()) { + g_variant_builder_add(&builder, "{sv}", "xesam:url", + g_variant_new_string(static_cast( + mMPRISMetadata.mUrl.get()))); + } if (mPositionState.isSome()) { CheckedInt64 length = CheckedInt64((int64_t)mPositionState.value().mDuration) * 1000000; diff --git a/widget/gtk/MPRISServiceHandler.h b/widget/gtk/MPRISServiceHandler.h index 924693d4cfd5..b887f9c969fd 100644 --- a/widget/gtk/MPRISServiceHandler.h +++ b/widget/gtk/MPRISServiceHandler.h @@ -124,6 +124,7 @@ class MPRISServiceHandler final : public dom::MediaControlKeySource { mTitle = aMetadata.mTitle; mArtist = aMetadata.mArtist; mAlbum = aMetadata.mAlbum; + mUrl = aMetadata.mUrl; mArtwork = aMetadata.mArtwork; } void Clear() {