Spis treści
- Wprowadzenie
- Zarządzanie mediami
- Wygląd UI
- Działający przykład na Github Pages
- Pełny kod przykładu na Github
- Podsumowanie
Wprowadzenie
Dzięki MediaSession API możemy sterować listą odtwarzania spoza karty przeglądarki, która odtwarza dźwięk/wideo.
Przez to obsługa multimediów odtwarzanych przykładowo na stronie zespołu muzycznego jest dużo prostsza – użytkownik nie musi wracać na stronę i szukać na niej customowych przycisków.
W tym artykule zaimplementujemy bazową obsługę odtwarzania playlisty na stronie i jej kontrolę za pomocą MediaSession API.
Zarządzanie mediami
Na stronie umieścimy piosenki pobrane z serwisu Bensound, którymi będziemy chcieli zarządzać za pomocą nowego API.
Pod API udostępnianie przez przeglądarkę podepniemy utworzone wcześniej funkcje:
navigator.mediaSession.setActionHandler('play', onPlayClicked);
navigator.mediaSession.setActionHandler('pause', onPauseClicked);
navigator.mediaSession.setActionHandler('stop', onStopClicked);
navigator.mediaSession.setActionHandler('previoustrack', onPreviousClicked);
navigator.mediaSession.setActionHandler('nexttrack', onNextClicked);
Przyjrzyjmy się 2 funkcjom odpowiadającym za przesuwanie się do przodu i do tyłu na „wirtualnej” playliście:
const songs = [...document.querySelectorAll('audio')];
let currentSong = songs[0];
const onPreviousClicked = () => {
currentSong.pause();
currentSong.currentTime = 0;
const currentSongIndex = songs.findIndex(el => el === currentSong);
const newCurrentSongIndex = (() => {
if (currentSongIndex === 0) {
return songs.length - 1;
}
return currentSongIndex - 1;
})();
currentSong = songs[newCurrentSongIndex];
currentSong.play();
updateMetadata('playing');
};
const onNextClicked = () => {
currentSong.pause();
currentSong.currentTime = 0;
const currentSongIndex = songs.findIndex(el => el === currentSong);
const newCurrentSongIndex = (() => {
if (currentSongIndex === songs.length - 1) {
return 0;
}
return currentSongIndex + 1;
})();
currentSong = songs[newCurrentSongIndex];
currentSong.play();
updateMetadata('playing');
};
W momencie gdy użytkownik klika przycisk następny bądź poprzedni, następuje zatrzymanie odtwarzania aktualnie wybranej piosenki oraz wyzerowanie czasu odtwarzania. Następnie wyliczany jest indeks kolejnej piosenki do odtworzenia i jest ona odtwarzana.
Przyciski wyglądają następująco:

Dane do wyświetlenia na odtwarzacze pobierane są z zahardkodowanej struktury HTML. Wygląda ona tak:
<p> <a href="https://www.bensound.com/royalty-free-music/track/dubstep">Dubstep from BenSound</a> <br> <audio controls src="bensound-dubstep.mp3"></audio> </p>
Oczywiście, w rzeczywistej aplikacji źródłem tych danych mógłby być np backend.
Funkcja która dokonuje aktualizacji opisu wygląda tak:
const updateMetadata = playbackState => {
const descriptionItems = currentSong.parentNode.querySelector('a').innerHTML.split(' ');
navigator.mediaSession.metadata = new MediaMetadata({
title: descriptionItems[0],
artist: descriptionItems[descriptionItems.length - 1],
});
navigator.mediaSession.playbackState = playbackState;
};
Tworzony jest obiekt MediaMetadata z którego dane wyświetlą się użytkownikowi.
Wygląd UI
Desktop
Na przeglądarce Chrome UI prezentuje się następująco:

I jest widoczne w prawym górnym rogu przeglądarki. Umożliwia sterowanie multimediami z dowolnej karty, niezależnie w której karcie są odtwarzane
Mobile (Android)
Na urządzeniu Android w przeglądarce Chrome UI wygląda tak:

Dostępny jest on, gdy rozwiniemy górny bar powiadomień (swipe palcem w dół). Niedogodnością jest to, że kliknięcie któregokolwiek przycisku zwija bar i przenosi nas do aplikacji, przez co nie da się multimediami sterować całkowicie spoza aplikacji
Działający przykład na Github Pages
Klikalny przykład znajduje się pod adresem:
https://radek-anuszewski.github.io/mediasession-demo/
Pełny kod przykładu na Github
Pełen kod przykładu znajduje się pod adresem
https://github.com/radek-anuszewski/mediasession-demo
Podsumowanie
MediaSession API znajdzie zastosowanie głównie na stronach z bardzo dużą ilością multimediów, jak strony zespołów muzycznych. Sterowanie odtwarzaniem z zewnątrz jest czytelne dla użytkownika i praktyczne, szczególnie dla użytkowników desktopów.
