From 1567426a74f3773c7f44a1ab7f8fa60c0b97592d Mon Sep 17 00:00:00 2001 From: wvffle Date: Mon, 26 Sep 2022 19:03:27 +0000 Subject: [PATCH] Add proper mediaSession controls to embedded player --- front/public/embed.html | 43 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/front/public/embed.html b/front/public/embed.html index 5d93cda1f..a43ed6b40 100644 --- a/front/public/embed.html +++ b/front/public/embed.html @@ -163,7 +163,7 @@ // NOTE: Fetch tracks only if there is no error if (error.value === false) { - fetchTracks().catch(err => { + fetchTracks().then(() => updateMediaSessionMetadata()).catch(err => { console.error(err) error.value = `An unknown error occurred while loading ${type} data.` }) @@ -188,6 +188,41 @@ // Logo component const Logo = () => ({ $template: '#logo-template' }) + // Media Session + const updateMediaSessionMetadata = () => { + const { current } = player + + if (tracks[current] && 'mediaSession' in navigator) { + navigator.mediaSession.setActionHandler('play', () => { + player.playing = true + audio.element.play() + }) + + navigator.mediaSession.setActionHandler('pause', () => { + player.playing = false + audio.element.pause() + }) + + navigator.mediaSession.setActionHandler('seekbackward', () => player.seekTime({ target: { value: player.seek - 5 } })) + navigator.mediaSession.setActionHandler('seekforward', () => player.seekTime({ target: { value: player.seek + 5 } })) + + navigator.mediaSession.setActionHandler('previoustrack', () => player.prev()) + navigator.mediaSession.setActionHandler('nexttrack', () => player.next()) + + navigator.mediaSession.metadata = new MediaMetadata({ + title: tracks[current].title, + album: tracks[current].album.title, + artist: tracks[current].artist.name, + artwork: [ + { src: tracks[current]?.cover ?? cover.value, sizes: '96x96', type: 'image/png' }, + { src: tracks[current]?.cover ?? cover.value, sizes: '128x128', type: 'image/png' }, + { src: tracks[current]?.cover ?? cover.value, sizes: '192x192', type: 'image/png' }, + { src: tracks[current]?.cover ?? cover.value, sizes: '256x256', type: 'image/png' }, + ] + }) + } + } + // Player const player = reactive({ playing: false, @@ -205,6 +240,7 @@ audio.element.load() if (wasPlaying) audio.element.play() + updateMediaSessionMetadata() }, next () { @@ -253,10 +289,11 @@ // Audio const audio = reactive({ element: undefined, + current: -1, volume: -1 }) - const watchAudio = (element, volume) => { + const watchAudio = (element, current, volume) => { if (audio.element !== element) { audio.element = element @@ -424,7 +461,7 @@ -