src/browser/providers/spotify.js
class SpotifyPlayer extends Player {
getTitle() {
const elm = document.querySelector('.now-playing-bar .track-info__name');
return elm ? elm.textContent : super.getTitle();
}
getArtists() {
const elm = document.querySelector('.now-playing-bar .track-info__artists');
return elm ? [elm.textContent] : super.getArtists();
}
getCover() {
const elm = document.querySelector('.now-playing-bar .cover-art-image');
return elm ?
elm.style.backgroundImage
.replace('url("', '')
.replace('")', '') :
super.getCover();
}
isPlaying() {
const elm = this.page.playback.controls.play;
return elm ? elm.title === 'Pause' : super.isPlaying();
}
}
Player = SpotifyPlayer;
class SpotifyPlayback extends Playback {
canGoNext() {
const elm = this.controls.next;
return elm ? !elm.classList.contains('control-button--disabled') : super.canGoNext();
}
next() {
const elm = this.controls.next;
(elm && elm.click()) || super.next();
}
canGoPrevious() {
const elm = this.controls.prev;
return elm ? !elm.classList.contains('control-button--disabled') : super.canGoPrevious();
}
previous() {
(this.controls.prev && this.controls.prev.click()) || super.previous();
}
setShuffle(isShuffle) {
this.controls.shuffle && this.controls.shuffle.click();
}
isShuffle() {
return this.controls.shuffle ?
this.controls.shuffle.classList.contains('control-button--active') :
super.isShuffle();
}
getLoopStatus() {
if (this.controls.repeat) {
const classes = this.controls.repeat.classList;
if (classes.contains('spoticon-repeatonce-16'))
return LoopStatus.TRACK;
else if (classes.contains('control-button--active'))
return LoopStatus.PLAYLIST;
else
return LoopStatus.NONE;
} else
return super.getLoopStatus();
}
setLoopStatus(status) {
if (this.controls.repeat)
this.controls.repeat.click();
else
super.setLoopStatus(status);
}
setVolume(volume) {
if (this.controls.volumeProgress) {
this.controls.volumeProgress.style.transform = `translateX(${volume * 100 - 100}%)`;
}
super.setVolume(volume);
}
}
Playback = SpotifyPlayback;
window.addEventListener('mpris2-setup', function () {
const BUTTONS_CONTAINER = '.now-playing-bar .player-controls__buttons';
page.playback.controls = {
shuffle: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(1)'),
repeat: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(5)'),
play: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(3)'),
next: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(4)'),
prev: document.querySelector(BUTTONS_CONTAINER + ' button:nth-child(2)'),
// volumeHandle: document.querySelector('.volume__sliderHandle'),
volumeProgress: document.querySelector('.volume-bar .progress-bar__fg')
};
const observer = new MutationObserver(() => {
page.host.change();
});
Object.values(page.playback.controls).forEach(control => {
observer.observe(control, {
attributes: true,
attributeFilter: ['class']
});
});
});