ms.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /* global MediaMetadata */
  2. export default {
  3. mediaSessionData: {},
  4. listeners: {},
  5. audio: null,
  6. ytReady: false,
  7. playSuccessful: false,
  8. loopInterval: null,
  9. setYTReady(ytReady) {
  10. if (ytReady)
  11. setTimeout(() => {
  12. this.ytReady = true;
  13. }, 1000);
  14. else this.ytReady = false;
  15. },
  16. setListeners(priority, listeners) {
  17. this.listeners[priority] = listeners;
  18. },
  19. removeListeners(priority) {
  20. delete this.listeners[priority];
  21. },
  22. setMediaSessionData(priority, playing, title, artist, album, artwork) {
  23. this.mediaSessionData[priority] = {
  24. playing, // True = playing, false = paused
  25. mediaMetadata: new MediaMetadata({
  26. title,
  27. artist,
  28. album,
  29. artwork: [{ src: artwork }]
  30. })
  31. };
  32. },
  33. removeMediaSessionData(priority) {
  34. delete this.mediaSessionData[priority];
  35. },
  36. // Gets the highest priority media session data and updates the media session
  37. updateMediaSession() {
  38. const highestPriority = this.getHighestPriority();
  39. if (typeof highestPriority === "number") {
  40. const mediaSessionDataObject =
  41. this.mediaSessionData[highestPriority];
  42. navigator.mediaSession.metadata =
  43. mediaSessionDataObject.mediaMetadata;
  44. if (
  45. mediaSessionDataObject.playing ||
  46. !this.ytReady ||
  47. !this.playSuccessful
  48. ) {
  49. navigator.mediaSession.playbackState = "playing";
  50. this.audio
  51. .play()
  52. .then(() => {
  53. if (this.audio.currentTime > 1.0) {
  54. this.audio.muted = true;
  55. }
  56. this.playSuccessful = true;
  57. })
  58. .catch(() => {
  59. this.playSuccessful = false;
  60. });
  61. } else {
  62. this.audio.pause();
  63. navigator.mediaSession.playbackState = "paused";
  64. }
  65. } else {
  66. this.audio.pause();
  67. navigator.mediaSession.playbackState = "none";
  68. navigator.mediaSession.metadata = null;
  69. }
  70. },
  71. getHighestPriority() {
  72. return Object.keys(this.mediaSessionData)
  73. .map(priority => Number(priority))
  74. .sort((a, b) => a > b)
  75. .reverse()[0];
  76. },
  77. init() {
  78. this.audio = new Audio(
  79. "http://localhost/assets/15-seconds-of-silence.mp3"
  80. );
  81. this.audio.loop = true;
  82. this.audio.volume = 0.1;
  83. navigator.mediaSession.setActionHandler("play", () => {
  84. this.listeners[this.getHighestPriority()].play();
  85. });
  86. navigator.mediaSession.setActionHandler("pause", () => {
  87. this.listeners[this.getHighestPriority()].pause();
  88. });
  89. navigator.mediaSession.setActionHandler("nexttrack", () => {
  90. this.listeners[this.getHighestPriority()].nexttrack();
  91. });
  92. this.loopInterval = setInterval(() => {
  93. this.updateMediaSession();
  94. }, 100);
  95. }
  96. };