@@ -19,6 +19,7 @@ const MAXCHARS = 30;
1919let audio = null ;
2020let loop = false ;
2121let pauseClickTimeout = null ;
22+ let currentSong = null ;
2223
2324const options = {
2425 volume : 0.500 ,
@@ -48,8 +49,27 @@ function clickSong() {
4849 playSong ( this ) ;
4950}
5051
52+ function assingMediaSession ( song ) {
53+ if ( 'mediaSession' in navigator ) {
54+ console . log ( song ) ;
55+
56+ navigator . mediaSession . metadata = new MediaMetadata ( {
57+ title : song . title || song . name ,
58+ artist : song . artist ,
59+ album : song . album ,
60+ } ) ;
61+
62+ if ( song . artworkImageUrl ) {
63+ navigator . mediaSession . metadata . artwork = [
64+ { src : song . artworkImageUrl , sizes : '1024x1024' , type : 'image/jpeg' }
65+ ]
66+ }
67+ }
68+ }
69+
5170async function playSong ( song ) {
5271 const { file } = song ;
72+ currentSong = song ;
5373 points . setUniform ( 'showMessage' , 0 ) ;
5474 const audioUrl = URL . createObjectURL ( file ) ;
5575 const name = song ?. name || file . name ;
@@ -69,6 +89,8 @@ async function playSong(song) {
6989 points . setUniform ( 'artworkLoaded' , artworkLoaded ) ;
7090 audio . id = song ?. id ;
7191
92+ assingMediaSession ( song ) ;
93+
7294 audio . addEventListener ( 'timeupdate' , onTimeUpdate ) ;
7395 audio . addEventListener ( 'ended' , async e => {
7496 const id = + e . target . id ;
@@ -133,8 +155,8 @@ function loadFolder() {
133155async function onCompleteTags ( result ) {
134156 const { tag, song } = result ;
135157 const { file } = song ;
136- const { title, album, picture } = tag . tags ;
137- const albumExists = album ? ` - ${ album } ` : '' ;
158+ const { title, album, artist , picture } = tag . tags ;
159+ const albumExists = album ? ` - ${ album } ` : '' ;
138160 const name = `${ title } ${ albumExists } `
139161 let artworkImageUrl = null ;
140162 let artworkColors = null ;
@@ -153,16 +175,22 @@ async function onCompleteTags(result) {
153175 }
154176
155177 song . name = name || file . name ;
156- song . title = name ;
178+ song . title = title ;
179+ song . album = album ;
180+ song . artist = artist ;
181+
182+ assingMediaSession ( song ) ; // this is a duplicate call only on file load
157183
158184
159185 if ( ! song . default ) {
160186 await db . songs . add ( {
161187 file,
162188 artworkImageUrl,
163189 artworkColors,
190+ title,
191+ album,
192+ artist,
164193 name : song . name ,
165- title : song . title
166194 } ) ;
167195 }
168196
@@ -224,18 +252,24 @@ const songs = [
224252 {
225253 default : true ,
226254 name : 'Pulse 🎵' ,
255+ title : 'Pulse' ,
256+ artist : 'nickpanek620' ,
227257 src : './music/80s-pulse-synthwave-dude-212407.mp3' ,
228258 fn : clickSong
229259 } ,
230260 {
231261 default : true ,
232262 name : 'Robot Swarm 🎵' ,
263+ title : 'Robot Swarm' ,
264+ artist : 'nickpanek620' ,
233265 src : './music/synthwave-80s-robot-swarm-218092.mp3' ,
234266 fn : clickSong
235267 } ,
236268 {
237269 default : true ,
238270 name : 'Fading Echoes 🎵' ,
271+ title : 'Fading Echoes' ,
272+ artist : 'Mezhdunami' ,
239273 src : './music/mezhdunami-fading-echoes-129291.mp3' ,
240274 fn : clickSong
241275 }
@@ -295,6 +329,7 @@ songsFromDB.forEach(item => {
295329 artworkImageUrl : item . artworkImageUrl ,
296330 name : item . name ,
297331 title : item . title ,
332+ artist : item . artist ,
298333 src : audioUrl ,
299334 fn : clickSong
300335 }
@@ -350,7 +385,7 @@ await points.setTextureImage('font', './src/img/inconsolata_regular_8x22.png');
350385
351386
352387const size = { x : 8 , y : 22 } ;
353- const atlas = await loadImage ( 'src/img/inconsolata_regular_8x22.png' ) ;
388+ const atlas = await loadImage ( 'src/img/inconsolata_regular_8x22.png' ) ;
354389const messageStringImg = strToImage ( 'Select a song to Play' , atlas , size ) ;
355390await points . setTextureImage ( 'messageString' , messageStringImg ) ;
356391
@@ -455,3 +490,31 @@ async function loadSongFromURL() {
455490}
456491
457492loadSongFromURL ( )
493+
494+
495+
496+ // ----------------------------------
497+
498+ if ( 'mediaSession' in navigator ) {
499+ navigator . mediaSession . setActionHandler ( 'play' , _ => audio ?. play ( ) ) ;
500+ navigator . mediaSession . setActionHandler ( 'pause' , _ => audio ?. pause ( ) ) ;
501+
502+ navigator . mediaSession . setActionHandler ( 'stop' , ( ) => {
503+ audio . pause ( )
504+ audio . currentTime = 0 ; // Reset playback()
505+ assingMediaSession ( currentSong ) ;
506+ navigator . mediaSession . setActionHandler ( 'play' , _ => audio ?. play ( ) ) ;
507+ } ) ;
508+
509+ navigator . mediaSession . setActionHandler ( 'previoustrack' , _ => {
510+ const id = + currentSong . id ;
511+ const nextSong = songs [ id - 1 ] || songs [ songs . length - 1 ] ;
512+ playSong ( nextSong ) ;
513+ } ) ;
514+
515+ navigator . mediaSession . setActionHandler ( 'nexttrack' , _ => {
516+ const id = + currentSong . id ;
517+ const nextSong = songs [ id + 1 ] || songs [ 0 ] ;
518+ playSong ( nextSong ) ;
519+ } ) ;
520+ }
0 commit comments