Make mediaSession metadata reliable in embedded player

This commit is contained in:
wvffle 2022-09-26 19:23:20 +00:00
parent 1567426a74
commit dd832da862
1 changed files with 33 additions and 13 deletions

View File

@ -163,7 +163,7 @@
// NOTE: Fetch tracks only if there is no error // NOTE: Fetch tracks only if there is no error
if (error.value === false) { if (error.value === false) {
fetchTracks().then(() => updateMediaSessionMetadata()).catch(err => { fetchTracks().catch(err => {
console.error(err) console.error(err)
error.value = `An unknown error occurred while loading ${type} data.` error.value = `An unknown error occurred while loading ${type} data.`
}) })
@ -189,10 +189,8 @@
const Logo = () => ({ $template: '#logo-template' }) const Logo = () => ({ $template: '#logo-template' })
// Media Session // Media Session
const updateMediaSessionMetadata = () => { const initializeMediaSession = () => {
const { current } = player if ('mediaSession' in navigator) {
if (tracks[current] && 'mediaSession' in navigator) {
navigator.mediaSession.setActionHandler('play', () => { navigator.mediaSession.setActionHandler('play', () => {
player.playing = true player.playing = true
audio.element.play() audio.element.play()
@ -203,23 +201,41 @@
audio.element.pause() audio.element.pause()
}) })
navigator.mediaSession.setActionHandler('seekbackward', () => player.seekTime({ target: { value: player.seek - 5 } })) navigator.mediaSession.setActionHandler('seekbackward', () => player.seekTime({
navigator.mediaSession.setActionHandler('seekforward', () => player.seekTime({ target: { value: player.seek + 5 } })) target: { value: (audio.element.currentTime - 5) / audio.element.duration * 100 }
}))
navigator.mediaSession.setActionHandler('seekforward', () => player.seekTime({
target: { value: (audio.element.currentTime + 5) / audio.element.duration * 100 }
}))
navigator.mediaSession.setActionHandler('previoustrack', () => player.prev()) navigator.mediaSession.setActionHandler('previoustrack', () => player.prev())
navigator.mediaSession.setActionHandler('nexttrack', () => player.next()) navigator.mediaSession.setActionHandler('nexttrack', () => player.next())
}
}
navigator.mediaSession.metadata = new MediaMetadata({ const updateMediaSessionMetadata = () => {
const { current } = player
if (tracks[current] && 'mediaSession' in navigator) {
const metadata = new MediaMetadata({
title: tracks[current].title, title: tracks[current].title,
album: tracks[current].album.title, album: tracks[current]?.album.title ?? '',
artist: tracks[current].artist.name, artist: tracks[current]?.artist.name ?? '',
artwork: [ artwork: [
{ src: tracks[current]?.cover ?? cover.value, sizes: '96x96', type: 'image/png' }, { 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: '128x128', type: 'image/png' },
{ src: tracks[current]?.cover ?? cover.value, sizes: '192x192', 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' }, { src: tracks[current]?.cover ?? cover.value, sizes: '256x256', type: 'image/png' },
{ src: tracks[current]?.cover ?? cover.value, sizes: '384x384', type: 'image/png' },
{ src: tracks[current]?.cover ?? cover.value, sizes: '512x512', type: 'image/png' }
] ]
}) })
console.log(metadata)
requestAnimationFrame(() => {
navigator.mediaSession.metadata = metadata
})
} }
} }
@ -240,6 +256,7 @@
audio.element.load() audio.element.load()
if (wasPlaying) audio.element.play() if (wasPlaying) audio.element.play()
updateMediaSessionMetadata() updateMediaSessionMetadata()
}, },
@ -255,7 +272,7 @@
if (!audio.element) return if (!audio.element) return
const seek = audio.element.duration * event.target.value / 100 const seek = audio.element.duration * event.target.value / 100
audio.element.currentTime = isNaN(seek) ? 0 : seek audio.element.currentTime = isNaN(seek) ? 0 : Math.min(seek, audio.element.duration - 1)
}, },
togglePlay () { togglePlay () {
@ -263,6 +280,8 @@
if (this.playing) audio.element.play() if (this.playing) audio.element.play()
else audio.element.pause() else audio.element.pause()
updateMediaSessionMetadata()
} }
}) })
@ -293,7 +312,7 @@
volume: -1 volume: -1
}) })
const watchAudio = (element, current, volume) => { const watchAudio = (element, volume) => {
if (audio.element !== element) { if (audio.element !== element) {
audio.element = element audio.element = element
@ -327,6 +346,7 @@
error, error,
// Playback // Playback
initializeMediaSession,
watchAudio, watchAudio,
player, player,
volume, volume,
@ -461,7 +481,7 @@
</table> </table>
</div> </div>
<audio v-effect="watchAudio($el, player.current, volume.level)"> <audio v-effect="watchAudio($el, volume.level)" @vue:mounted="initializeMediaSession">
<source <source
v-for="source in tracks[player.current]?.sources ?? []" v-for="source in tracks[player.current]?.sources ?? []"
:key="source.mimetype + source.listen_url" :key="source.mimetype + source.listen_url"