Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
156 lines
4.6 KiB
JavaScript
Executable file
156 lines
4.6 KiB
JavaScript
Executable file
/* global View */
|
|
'use strict';
|
|
|
|
const REPEAT_VALUES = ['off', 'list', 'song'];
|
|
const SHUFFLE_VALUES = ['off', 'on'];
|
|
|
|
var PlayerView = View.extend(function PlayerView() {
|
|
View.call(this); // super();
|
|
|
|
this.artwork = document.getElementById('artwork');
|
|
this.controls = document.getElementById('controls');
|
|
this.seekBar = document.getElementById('seek-bar');
|
|
|
|
this.artwork.addEventListener('share', () => this.share());
|
|
this.artwork.addEventListener('repeat', () => {
|
|
this.setRepeatSetting(this.artwork.repeat);
|
|
});
|
|
this.artwork.addEventListener('shuffle', () => {
|
|
this.setShuffleSetting(this.artwork.shuffle);
|
|
});
|
|
this.artwork.addEventListener('ratingchange', (evt) => {
|
|
this.setSongRating(evt.detail);
|
|
});
|
|
|
|
this.controls.addEventListener('play', () => this.play());
|
|
this.controls.addEventListener('pause', () => this.pause());
|
|
this.controls.addEventListener('previous', () => this.previous());
|
|
this.controls.addEventListener('next', () => this.next());
|
|
this.controls.addEventListener('startseek', (evt) => {
|
|
this.startFastSeek(evt.detail.reverse);
|
|
});
|
|
this.controls.addEventListener('stopseek', () => this.stopFastSeek());
|
|
|
|
this.seekBar.addEventListener('seek', (evt) => {
|
|
this.seek(evt.detail.elapsedTime);
|
|
});
|
|
|
|
this.client.on('play', () => this.controls.paused = false);
|
|
this.client.on('pause', () => this.controls.paused = true);
|
|
this.client.on('songChange', () => this.update());
|
|
this.client.on('durationChange', (duration) => {
|
|
this.seekBar.duration = duration;
|
|
});
|
|
this.client.on('elapsedTimeChange', (elapsedTime) => {
|
|
this.seekBar.elapsedTime = elapsedTime;
|
|
});
|
|
|
|
this.update();
|
|
});
|
|
|
|
PlayerView.prototype.update = function() {
|
|
this.getPlaybackStatus().then((status) => {
|
|
this.getSong(status.filePath).then((song) => {
|
|
if (!song) {
|
|
return;
|
|
}
|
|
|
|
document.l10n.formatValues(
|
|
'unknownTitle', 'unknownArtist', 'unknownAlbum'
|
|
).then(([unknownTitle, unknownArtist, unknownAlbum]) => {
|
|
this.title = song.metadata.title || unknownTitle;
|
|
this.artwork.artist = song.metadata.artist || unknownArtist;
|
|
this.artwork.album = song.metadata.album || unknownAlbum;
|
|
});
|
|
|
|
this.artwork.els.rating.value = song.metadata.rated;
|
|
});
|
|
|
|
this.getSongArtwork(status.filePath)
|
|
.then((url) => this.artwork.src = url);
|
|
|
|
this.artwork.repeat = REPEAT_VALUES[status.repeat];
|
|
this.artwork.shuffle = SHUFFLE_VALUES[status.shuffle];
|
|
this.controls.paused = status.paused;
|
|
this.seekBar.duration = status.duration;
|
|
this.seekBar.elapsedTime = status.elapsedTime;
|
|
this.render();
|
|
});
|
|
};
|
|
|
|
PlayerView.prototype.destroy = function() {
|
|
this.client.destroy();
|
|
|
|
View.prototype.destroy.call(this); // super(); // Always call *last*
|
|
};
|
|
|
|
PlayerView.prototype.render = function() {
|
|
this.onRenderDone();
|
|
};
|
|
|
|
PlayerView.prototype.startFastSeek = function(reverse) {
|
|
this.fetch('/api/audio/fastseek/start/' + (reverse ? 'reverse' : 'forward'));
|
|
};
|
|
|
|
PlayerView.prototype.stopFastSeek = function() {
|
|
this.fetch('/api/audio/fastseek/stop');
|
|
};
|
|
|
|
PlayerView.prototype.seek = function(time) {
|
|
this.fetch('/api/audio/seek/' + time);
|
|
};
|
|
|
|
PlayerView.prototype.play = function() {
|
|
this.fetch('/api/audio/play');
|
|
};
|
|
|
|
PlayerView.prototype.pause = function() {
|
|
this.fetch('/api/audio/pause');
|
|
};
|
|
|
|
PlayerView.prototype.previous = function() {
|
|
this.fetch('/api/queue/previous');
|
|
};
|
|
|
|
PlayerView.prototype.next = function() {
|
|
this.fetch('/api/queue/next');
|
|
};
|
|
|
|
PlayerView.prototype.share = function() {
|
|
this.getPlaybackStatus().then((status) => {
|
|
this.fetch('/api/activities/share/' + status.filePath);
|
|
});
|
|
};
|
|
|
|
PlayerView.prototype.getPlaybackStatus = function() {
|
|
return this.fetch('/api/audio/status').then(response => response.json());
|
|
};
|
|
|
|
PlayerView.prototype.setRepeatSetting = function(repeat) {
|
|
this.fetch('/api/queue/repeat/' + REPEAT_VALUES.indexOf(repeat));
|
|
};
|
|
|
|
PlayerView.prototype.setShuffleSetting = function(shuffle) {
|
|
this.fetch('/api/queue/shuffle/' + SHUFFLE_VALUES.indexOf(shuffle));
|
|
};
|
|
|
|
PlayerView.prototype.setSongRating = function(rating) {
|
|
this.getPlaybackStatus().then((status) => {
|
|
this.fetch('/api/songs/rating/' + rating + '/' + status.filePath);
|
|
});
|
|
};
|
|
|
|
PlayerView.prototype.getSong = function(filePath) {
|
|
return this.fetch('/api/songs/info/' + filePath).then((response) => {
|
|
return response.json();
|
|
});
|
|
};
|
|
|
|
PlayerView.prototype.getSongArtwork = function(filePath) {
|
|
return this.fetch('/api/artwork/url/original/' + filePath)
|
|
.then((response) => {
|
|
return response.json();
|
|
});
|
|
};
|
|
|
|
window.view = new PlayerView();
|