native.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. Native.js
  3. This script is used to match the Music Player to as native as possible
  4. for some advanced use case (like PWA)
  5. */
  6. //Native Media Player
  7. function initNativeMediaPlayer(){
  8. var skipTime = 10;
  9. if ('mediaSession' in navigator) {
  10. navigator.mediaSession.setActionHandler('play', function() {
  11. gainAudio();
  12. setPlaying(true);
  13. });
  14. navigator.mediaSession.setActionHandler('pause', function() {
  15. originalVol = audioElement[0].volume;
  16. fadeAudio();
  17. setPlaying(false);
  18. });
  19. navigator.mediaSession.setActionHandler('stop', function() {
  20. originalVol = audioElement[0].volume;
  21. fadeAudio();
  22. setPlaying(false);
  23. audioElement[0].pause();
  24. setTimeout(function(){
  25. audioElement[0].volume = defaultVolumeBeforeFadeout;
  26. },500);
  27. });
  28. navigator.mediaSession.setActionHandler('seekbackward', function() {
  29. audioElementObject.currentTime = Math.max(audioElementObject.currentTime - skipTime, 0);
  30. setTimeout(function(){
  31. updatePositionState();
  32. }, 500);
  33. });
  34. navigator.mediaSession.setActionHandler('seekforward', function() {
  35. audioElementObject.currentTime = Math.min(audioElementObject.currentTime + skipTime, audioElementObject.duration);
  36. setTimeout(function(){
  37. updatePositionState();
  38. }, 500);
  39. });
  40. navigator.mediaSession.setActionHandler('seekto', function(evt) {
  41. if (evt.fastSeek && ('fastSeek' in audioElementObject)) {
  42. audioElementObject.fastSeek(evt.seekTime);
  43. return;
  44. }
  45. audioElementObject.currentTime = evt.seekTime;
  46. setTimeout(function(){
  47. updatePositionState();
  48. }, 500);
  49. });
  50. navigator.mediaSession.setActionHandler('previoustrack', function() {
  51. previousSong();
  52. });
  53. navigator.mediaSession.setActionHandler('nexttrack', function() {
  54. nextSong();
  55. });
  56. }
  57. }
  58. function updateTitle(title, artist, albumn){
  59. if ('mediaSession' in navigator) {
  60. if (navigator.mediaSession.metadata){
  61. //Media Session created. Update the existsing one instead
  62. navigator.mediaSession.metadata.title = title;
  63. navigator.mediaSession.metadata.artist = artist;
  64. navigator.mediaSession.metadata.album = albumn;
  65. }else{
  66. //Media Session not created. Creat one
  67. navigator.mediaSession.metadata = new MediaMetadata({
  68. title: title,
  69. artist: artist,
  70. album: albumn,
  71. /*artwork: [
  72. { src: artwork, sizes: '480x480', type: 'image/jpg' }
  73. ]*/
  74. });
  75. }
  76. }
  77. }
  78. function updatePositionState(currentTime, duration) {
  79. if (isNaN(currentTime) || isNaN(duration)){
  80. return;
  81. }
  82. if ('setPositionState' in navigator.mediaSession) {
  83. navigator.mediaSession.setPositionState({
  84. duration: audioElement[0].duration,
  85. playbackRate: audioElement[0].playbackRate,
  86. position: audioElement[0].currentTime
  87. });
  88. }
  89. }