37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { browser } from '$app/environment';
|
|
import type { Track } from '$lib/types';
|
|
import { trackCover } from '$lib/utils/hrefs';
|
|
|
|
interface MediaSessionHandlers {
|
|
play: () => void;
|
|
pause: () => void;
|
|
previous: () => void;
|
|
next: () => void;
|
|
}
|
|
|
|
const supported = () => browser && 'mediaSession' in navigator;
|
|
|
|
export const mediaSession = {
|
|
setup(handlers: MediaSessionHandlers) {
|
|
if (!supported()) return;
|
|
navigator.mediaSession.setActionHandler('play', handlers.play);
|
|
navigator.mediaSession.setActionHandler('pause', handlers.pause);
|
|
navigator.mediaSession.setActionHandler('previoustrack', handlers.previous);
|
|
navigator.mediaSession.setActionHandler('nexttrack', handlers.next);
|
|
},
|
|
|
|
setPlaying(playing: boolean) {
|
|
if (!supported()) return;
|
|
navigator.mediaSession.playbackState = playing ? 'playing' : 'paused';
|
|
},
|
|
|
|
setTrack(track: Track) {
|
|
if (!supported()) return;
|
|
navigator.mediaSession.metadata = new MediaMetadata({
|
|
title: track.title,
|
|
artist: track.artist ?? '',
|
|
artwork: [{ src: trackCover(track.id, 'small'), sizes: '256x256' }]
|
|
});
|
|
}
|
|
};
|