2015-12-13 04:42:28 +00:00
|
|
|
import _ from 'lodash';
|
|
|
|
|
|
|
|
export default {
|
|
|
|
state: {
|
|
|
|
songs: [],
|
2016-01-07 08:11:11 +00:00
|
|
|
current: null,
|
2015-12-13 04:42:28 +00:00
|
|
|
},
|
2016-03-13 17:00:32 +00:00
|
|
|
|
2015-12-13 04:42:28 +00:00
|
|
|
init() {
|
|
|
|
// We don't have anything to do here yet.
|
|
|
|
// How about another song then?
|
2016-03-13 17:00:32 +00:00
|
|
|
//
|
2015-12-13 04:42:28 +00:00
|
|
|
// LITTLE WING
|
2015-12-30 04:14:47 +00:00
|
|
|
// -- by Jimi Fucking Hendrix
|
2016-03-13 17:00:32 +00:00
|
|
|
//
|
2015-12-13 04:42:28 +00:00
|
|
|
// Well she's walking
|
2015-12-13 16:52:35 +00:00
|
|
|
// Through the clouds
|
2015-12-13 04:42:28 +00:00
|
|
|
// With a circus mind
|
|
|
|
// That's running wild
|
|
|
|
// Butterflies and zebras and moonbeams and fairytales
|
|
|
|
// That's all she ever thinks about
|
|
|
|
// Riding with the wind
|
2016-03-13 17:00:32 +00:00
|
|
|
//
|
2015-12-13 16:52:35 +00:00
|
|
|
// When I'm sad
|
2015-12-13 04:42:28 +00:00
|
|
|
// She comes to me
|
|
|
|
// With a thousand smiles
|
|
|
|
// She gives to me free
|
|
|
|
// It's alright she said
|
|
|
|
// It's alright
|
|
|
|
// Take anything you want from me
|
|
|
|
// Anything...
|
|
|
|
},
|
|
|
|
|
2016-01-19 11:00:23 +00:00
|
|
|
/**
|
2016-03-18 04:45:12 +00:00
|
|
|
* All queued songs.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-19 11:00:23 +00:00
|
|
|
* @return {Array.<Object>}
|
|
|
|
*/
|
2016-03-18 04:45:12 +00:00
|
|
|
get all() {
|
2015-12-13 04:42:28 +00:00
|
|
|
return this.state.songs;
|
|
|
|
},
|
|
|
|
|
2016-01-19 11:00:23 +00:00
|
|
|
/**
|
2016-03-18 04:45:12 +00:00
|
|
|
* The first song in the queue.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-19 11:00:23 +00:00
|
|
|
* @return {?Object}
|
|
|
|
*/
|
2016-03-18 04:45:12 +00:00
|
|
|
get first() {
|
2015-12-13 04:42:28 +00:00
|
|
|
return _.first(this.state.songs);
|
|
|
|
},
|
|
|
|
|
2016-01-19 11:00:23 +00:00
|
|
|
/**
|
2016-03-18 04:45:12 +00:00
|
|
|
* The last song in the queue.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
|
|
|
* @return {?Object}
|
2016-01-19 11:00:23 +00:00
|
|
|
*/
|
2016-03-18 04:45:12 +00:00
|
|
|
get last() {
|
2015-12-13 04:42:28 +00:00
|
|
|
return _.last(this.state.songs);
|
|
|
|
},
|
|
|
|
|
2016-01-07 08:11:11 +00:00
|
|
|
/**
|
|
|
|
* Determine if the queue contains a song.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-07 08:11:11 +00:00
|
|
|
* @param {Object} song
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-17 14:26:24 +00:00
|
|
|
* @return {Boolean}
|
2016-01-07 08:11:11 +00:00
|
|
|
*/
|
|
|
|
contains(song) {
|
2016-03-18 19:41:46 +00:00
|
|
|
return _.includes(this.all, song);
|
2016-01-07 08:11:11 +00:00
|
|
|
},
|
|
|
|
|
2015-12-13 04:42:28 +00:00
|
|
|
/**
|
2016-03-13 17:00:32 +00:00
|
|
|
* Add a list of songs to the end of the current queue,
|
2015-12-13 04:42:28 +00:00
|
|
|
* or replace the current queue as a whole if `replace` is true.
|
|
|
|
*
|
2016-01-17 14:26:24 +00:00
|
|
|
* @param {Object|Array.<Object>} songs The song, or an array of songs
|
|
|
|
* @param {Boolean} replace Whether to replace the current queue
|
2016-01-19 11:00:23 +00:00
|
|
|
* @param {Boolean} toTop Whether to prepend or append to the queue
|
2015-12-13 04:42:28 +00:00
|
|
|
*/
|
|
|
|
queue(songs, replace = false, toTop = false) {
|
2016-01-21 10:21:46 +00:00
|
|
|
songs = [].concat(songs);
|
2015-12-13 04:42:28 +00:00
|
|
|
|
|
|
|
if (replace) {
|
|
|
|
this.state.songs = songs;
|
|
|
|
} else {
|
|
|
|
if (toTop) {
|
2016-03-13 17:00:32 +00:00
|
|
|
this.state.songs = _.union(songs, this.state.songs);
|
2015-12-13 04:42:28 +00:00
|
|
|
} else {
|
|
|
|
this.state.songs = _.union(this.state.songs, songs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2016-01-07 08:11:11 +00:00
|
|
|
/**
|
|
|
|
* Queue song(s) to after the current song.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-17 14:26:24 +00:00
|
|
|
* @param {Array.<Object>|Object} songs
|
2016-01-07 08:11:11 +00:00
|
|
|
*/
|
|
|
|
queueAfterCurrent(songs) {
|
2016-01-21 10:21:46 +00:00
|
|
|
songs = [].concat(songs);
|
2016-01-07 08:11:11 +00:00
|
|
|
|
|
|
|
if (!this.state.current || !this.state.songs.length) {
|
|
|
|
return this.queue(songs);
|
|
|
|
}
|
|
|
|
|
2016-03-16 03:51:07 +00:00
|
|
|
let head = this.state.songs.splice(0, this.indexOf(this.state.current) + 1);
|
2016-01-07 08:11:11 +00:00
|
|
|
this.state.songs = head.concat(songs, this.state.songs);
|
|
|
|
},
|
|
|
|
|
2015-12-13 04:42:28 +00:00
|
|
|
/**
|
|
|
|
* Unqueue a song, or several songs at once.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-19 11:00:23 +00:00
|
|
|
* @param {Object|String|Array.<Object>} songs The song(s) to unqueue
|
2015-12-13 04:42:28 +00:00
|
|
|
*/
|
|
|
|
unqueue(songs) {
|
2016-01-21 10:21:46 +00:00
|
|
|
this.state.songs = _.difference(this.state.songs, [].concat(songs));
|
2015-12-13 04:42:28 +00:00
|
|
|
},
|
|
|
|
|
2016-01-16 01:37:29 +00:00
|
|
|
/**
|
|
|
|
* Move some songs to after a target.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-17 14:26:24 +00:00
|
|
|
* @param {Array.<Object>} songs Songs to move
|
|
|
|
* @param {Object} target The target song object
|
2016-01-16 01:37:29 +00:00
|
|
|
*/
|
|
|
|
move(songs, target) {
|
2016-03-16 03:51:07 +00:00
|
|
|
let $targetIndex = this.indexOf(target);
|
2016-01-16 01:37:29 +00:00
|
|
|
|
|
|
|
songs.forEach(song => {
|
|
|
|
this.state.songs.splice(this.indexOf(song), 1);
|
|
|
|
this.state.songs.splice($targetIndex, 0, song);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2015-12-13 04:42:28 +00:00
|
|
|
/**
|
|
|
|
* Clear the current queue.
|
2016-01-19 11:00:23 +00:00
|
|
|
*
|
|
|
|
* @param {?Function} cb The function to execute after clearing
|
2015-12-13 04:42:28 +00:00
|
|
|
*/
|
|
|
|
clear(cb = null) {
|
|
|
|
this.state.songs = [];
|
2016-01-07 08:11:11 +00:00
|
|
|
this.state.current = null;
|
2015-12-13 04:42:28 +00:00
|
|
|
|
|
|
|
if (cb) {
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2016-01-16 01:37:29 +00:00
|
|
|
/**
|
|
|
|
* Get index of a song in the queue.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-16 01:37:29 +00:00
|
|
|
* @param {Object} song
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-17 14:26:24 +00:00
|
|
|
* @return {?Integer}
|
2016-01-16 01:37:29 +00:00
|
|
|
*/
|
|
|
|
indexOf(song) {
|
|
|
|
return _.indexOf(this.state.songs, song);
|
|
|
|
},
|
|
|
|
|
2015-12-13 04:42:28 +00:00
|
|
|
/**
|
2016-03-18 04:45:12 +00:00
|
|
|
* The next song in queue.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-07 09:03:38 +00:00
|
|
|
* @return {?Object}
|
2015-12-13 04:42:28 +00:00
|
|
|
*/
|
2016-03-18 04:45:12 +00:00
|
|
|
get next() {
|
|
|
|
if (!this.current) {
|
2016-01-07 08:11:11 +00:00
|
|
|
return _.first(this.state.songs);
|
|
|
|
}
|
|
|
|
|
2016-03-18 04:45:12 +00:00
|
|
|
let i = _.pluck(this.state.songs, 'id').indexOf(this.current.id) + 1;
|
2015-12-13 04:42:28 +00:00
|
|
|
|
|
|
|
return i >= this.state.songs.length ? null : this.state.songs[i];
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2016-03-18 04:45:12 +00:00
|
|
|
* The previous song in queue.
|
2016-03-13 17:00:32 +00:00
|
|
|
*
|
2016-01-07 09:03:38 +00:00
|
|
|
* @return {?Object}
|
2015-12-13 04:42:28 +00:00
|
|
|
*/
|
2016-03-18 04:45:12 +00:00
|
|
|
get previous() {
|
|
|
|
if (!this.current) {
|
2016-01-07 08:11:11 +00:00
|
|
|
return _.last(this.state.songs);
|
|
|
|
}
|
|
|
|
|
2016-03-18 04:45:12 +00:00
|
|
|
let i = _.pluck(this.state.songs, 'id').indexOf(this.current.id) - 1;
|
2015-12-13 04:42:28 +00:00
|
|
|
|
|
|
|
return i < 0 ? null : this.state.songs[i];
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2016-03-18 04:45:12 +00:00
|
|
|
* The current song.
|
2016-01-07 09:03:38 +00:00
|
|
|
*
|
|
|
|
* @return {Object}
|
2015-12-13 04:42:28 +00:00
|
|
|
*/
|
2016-03-18 04:45:12 +00:00
|
|
|
get current() {
|
2016-03-13 17:00:32 +00:00
|
|
|
return this.state.current;
|
2015-12-13 04:42:28 +00:00
|
|
|
},
|
|
|
|
|
2016-03-18 04:45:12 +00:00
|
|
|
/**
|
|
|
|
* Set a song as the current queued song.
|
|
|
|
*
|
|
|
|
* @param {Object} song
|
|
|
|
*
|
|
|
|
* @return {Object} The queued song.
|
|
|
|
*/
|
|
|
|
set current(song) {
|
|
|
|
this.state.current = song;
|
|
|
|
|
|
|
|
return this.current;
|
|
|
|
},
|
|
|
|
|
2015-12-13 04:42:28 +00:00
|
|
|
/**
|
|
|
|
* Shuffle the queue.
|
2016-01-19 11:00:23 +00:00
|
|
|
*
|
|
|
|
* @return {Array.<Object>} The shuffled array of song objects
|
2015-12-13 04:42:28 +00:00
|
|
|
*/
|
|
|
|
shuffle() {
|
|
|
|
return (this.state.songs = _.shuffle(this.state.songs));
|
|
|
|
},
|
|
|
|
};
|