diff --git a/extension/content-script.js b/extension/content-script.js --- a/extension/content-script.js +++ b/extension/content-script.js @@ -709,6 +709,23 @@ }); window.dispatchEvent(event); }; + ${mediaSessionsClassName}.sendMetadata = function() { + let newMetadata = {}; + let keys = []; + if (this.metadata) { + // MediaMetadata is not a regular Object so we cannot just JSON.stringify it + keys = Object.getOwnPropertyNames(Object.getPrototypeOf(this.metadata)); + } + + keys.forEach((key) => { + const value = this.metadata[key]; + if (typeof value === "function") { + return; // continue + } + newMetadata[key] = value; + }); + ${mediaSessionsClassName}.sendMessage("metadata", newMetadata); + } ${mediaSessionsClassName}.executeCallback = function (action) { let details = { action: action @@ -743,23 +760,23 @@ Object.defineProperty(navigator.mediaSession, "metadata", { get: function() { return ${mediaSessionsClassName}.metadata; }, set: function(newValue) { - ${mediaSessionsClassName}.metadata = newValue; - - // MediaMetadata is not a regular Object so we cannot just JSON.stringify it - var newMetadata = {}; if (newValue) { - var keys = Object.getOwnPropertyNames(Object.getPrototypeOf(newValue)); - - keys.forEach(function (key) { - var value = newValue[key]; - if (typeof value === "function") { - return; // continue + // assign a Proxy so we can detect changes within the object + ${mediaSessionsClassName}.metadata = new Proxy(newValue, { + get: (target, key) => { + return target[key]; + }, + set: (target, key, value) => { + target[key] = value; + ${mediaSessionsClassName}.sendMetadata(); + return true; } - newMetadata[key] = newValue[key]; }); + } else { + ${mediaSessionsClassName}.metadata = null; } - ${mediaSessionsClassName}.sendMessage("metadata", newMetadata); + ${mediaSessionsClassName}.sendMetadata(); } }); Object.defineProperty(navigator.mediaSession, "playbackState", {