-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmedia-session.js
57 lines (48 loc) · 1.74 KB
/
media-session.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { getImageAsDataURI } from './utils.js';
export function initMediaSession(player) {
if (!('mediaSession' in navigator)) {
return;
}
function updateMediaSessionState() {
navigator.mediaSession.playbackState = player.audio.paused ? 'paused' : 'playing';
navigator.mediaSession.setPositionState({
duration: player.audio.duration,
position: player.audio.currentTime,
playbackRate: player.audio.playbackRate
});
}
async function updateMediaSessionMetadata() {
const artworkUrl = player.song.artworkUrl
? await getImageAsDataURI(player.song.artworkUrl)
: 'https://microsoftedge.github.io/Demos/pwamp/album-art-placeholder.png';
const artwork = {
src: artworkUrl,
type: artworkUrl.substring(artworkUrl.indexOf(':') + 1, artworkUrl.indexOf(';')),
};
navigator.mediaSession.metadata = new MediaMetadata({
title: player.song.title,
artist: player.song.artist,
album: player.song.album,
artwork: [artwork]
});
}
const actionHandlers = new Map([
['play', () => player.play()],
['pause', () => player.pause()],
['previoustrack', () => player.playPrevious()],
['nexttrack', () => player.playNext()],
['seekto', (e) => player.currentTime = e.seekTime]
]);
for (const [action, handler] of actionHandlers) {
try {
navigator.mediaSession.setActionHandler(action, handler);
} catch (e) {
console.log(`mediasession action ${action} not supported yet`)
}
}
const audioEvents = ['playing', 'paused', 'durationchange', 'ratechange', 'timechange'];
for (const event of audioEvents) {
player.audio.addEventListener(event, updateMediaSessionState);
}
player.addEventListener('playing', updateMediaSessionMetadata);
}