Home Manual Reference Source Test

src/browser/providers/spotify.js

  1. class SpotifyPlayer extends Player {
  2.  
  3. getTitle() {
  4. const elm = document.querySelector('.now-playing-bar .track-info__name');
  5. return elm ? elm.textContent : super.getTitle();
  6. }
  7.  
  8. getArtists() {
  9. const elm = document.querySelector('.now-playing-bar .track-info__artists');
  10. return elm ? [elm.textContent] : super.getArtists();
  11. }
  12.  
  13. getCover() {
  14. const elm = document.querySelector('.now-playing-bar .cover-art-image');
  15. return elm ?
  16. elm.style.backgroundImage
  17. .replace('url("', '')
  18. .replace('")', '') :
  19. super.getCover();
  20. }
  21.  
  22. isPlaying() {
  23. const elm = this.page.playback.controls.play;
  24. return elm ? elm.title === 'Pause' : super.isPlaying();
  25. }
  26.  
  27. }
  28.  
  29. Player = SpotifyPlayer;
  30.  
  31. class SpotifyPlayback extends Playback {
  32.  
  33. canGoNext() {
  34. const elm = this.controls.next;
  35. return elm ? !elm.classList.contains('control-button--disabled') : super.canGoNext();
  36. }
  37.  
  38. next() {
  39. const elm = this.controls.next;
  40. (elm && elm.click()) || super.next();
  41. }
  42.  
  43. canGoPrevious() {
  44. const elm = this.controls.prev;
  45. return elm ? !elm.classList.contains('control-button--disabled') : super.canGoPrevious();
  46. }
  47.  
  48. previous() {
  49. (this.controls.prev && this.controls.prev.click()) || super.previous();
  50. }
  51.  
  52. setShuffle(isShuffle) {
  53. this.controls.shuffle && this.controls.shuffle.click();
  54. }
  55.  
  56. isShuffle() {
  57. return this.controls.shuffle ?
  58. this.controls.shuffle.classList.contains('control-button--active') :
  59. super.isShuffle();
  60. }
  61.  
  62. getLoopStatus() {
  63. if (this.controls.repeat) {
  64. const classes = this.controls.repeat.classList;
  65. if (classes.contains('spoticon-repeatonce-16'))
  66. return LoopStatus.TRACK;
  67. else if (classes.contains('control-button--active'))
  68. return LoopStatus.PLAYLIST;
  69. else
  70. return LoopStatus.NONE;
  71. } else
  72. return super.getLoopStatus();
  73. }
  74.  
  75. setLoopStatus(status) {
  76. if (this.controls.repeat)
  77. this.controls.repeat.click();
  78. else
  79. super.setLoopStatus(status);
  80. }
  81.  
  82. setVolume(volume) {
  83. if (this.controls.volumeProgress) {
  84. this.controls.volumeProgress.style.transform = `translateX(${volume * 100 - 100}%)`;
  85. }
  86. super.setVolume(volume);
  87. }
  88.  
  89. }
  90.  
  91. Playback = SpotifyPlayback;
  92.  
  93. window.addEventListener('mpris2-setup', function () {
  94. const BUTTONS_CONTAINER = '.now-playing-bar .player-controls__buttons';
  95.  
  96. page.playback.controls = {
  97. shuffle: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(1)'),
  98. repeat: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(5)'),
  99. play: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(3)'),
  100. next: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(4)'),
  101. prev: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(2)'),
  102.  
  103. // volumeHandle: document.querySelector('.volume__sliderHandle'),
  104. volumeProgress: document.querySelector('.volume-bar .progress-bar__fg')
  105. };
  106.  
  107. const observer = new MutationObserver(() => {
  108. page.host.change();
  109. });
  110.  
  111. Object.values(page.playback.controls).forEach(control => {
  112. observer.observe(control, {
  113. attributes: true,
  114. attributeFilter: ['class']
  115. });
  116. });
  117. });