koel/resources/assets/js/stores/song.js

195 lines
5 KiB
JavaScript
Raw Normal View History

2015-12-13 04:42:28 +00:00
import _ from 'lodash';
import http from '../services/http';
import utils from '../services/utils';
import stub from '../stubs/song';
import favoriteStore from './favorite';
2015-12-22 17:14:47 +00:00
import userStore from './user';
2015-12-13 04:42:28 +00:00
export default {
stub,
albums: [],
2016-01-16 05:55:16 +00:00
cache: {},
2015-12-13 04:42:28 +00:00
state: {
songs: [stub],
},
/**
* Init the store.
*
2016-01-17 14:26:24 +00:00
* @param {Array.<Object>} albums The array of albums to extract our songs from
2015-12-13 04:42:28 +00:00
*/
2015-12-22 17:46:54 +00:00
init(albums) {
2015-12-13 04:42:28 +00:00
// Iterate through the albums. With each, add its songs into our master song list.
this.state.songs = _.reduce(albums, (songs, album) => {
// While doing so, we populate some other information into the songs as well.
_.each(album.songs, song => {
song.fmtLength = utils.secondsToHis(song.length);
// Keep a back reference to the album
song.album = album;
2016-01-16 05:55:16 +00:00
// Cache the song, so that byId() is faster
this.cache[song.id] = song;
2015-12-13 04:42:28 +00:00
});
return songs.concat(album.songs);
}, []);
},
2015-12-22 17:46:54 +00:00
/**
* Initializes the interaction (like/play count) information.
*
2016-01-17 14:26:24 +00:00
* @param {Array.<Object>} interactions The array of interactions of the current user
2015-12-22 17:46:54 +00:00
*/
initInteractions(interactions) {
2015-12-30 04:14:47 +00:00
favoriteStore.clear();
2015-12-22 17:46:54 +00:00
_.each(interactions, interaction => {
var song = this.byId(interaction.song_id);
if (!song) {
return;
}
song.liked = interaction.liked;
song.playCount = interaction.play_count;
if (song.liked) {
favoriteStore.add(song);
}
});
},
2016-01-14 08:02:59 +00:00
/**
* Get the total duration of some songs.
*
2016-01-17 14:26:24 +00:00
* @param {Array.<Object>} songs
2016-01-19 11:00:23 +00:00
* @param {Boolean} toHis Whether to convert the duration into H:i:s format
2016-01-14 08:02:59 +00:00
*
2016-01-17 14:26:24 +00:00
* @return {Float|String}
2016-01-14 08:02:59 +00:00
*/
getLength(songs, toHis) {
var duration = _.reduce(songs, (length, song) => length + song.length, 0);
if (toHis) {
return utils.secondsToHis(duration);
}
return duration;
},
2015-12-13 04:42:28 +00:00
/**
* Get all songs.
2015-12-22 17:46:54 +00:00
*
2016-01-17 14:26:24 +00:00
* @return {Array.<Object>}
2015-12-13 04:42:28 +00:00
*/
all() {
return this.state.songs;
},
/**
2016-01-07 09:03:38 +00:00
* Get a song by its ID.
2015-12-13 04:42:28 +00:00
*
2016-01-17 14:26:24 +00:00
* @param {String} id
2015-12-13 04:42:28 +00:00
*
2015-12-22 17:46:54 +00:00
* @return {Object}
2015-12-13 04:42:28 +00:00
*/
byId(id) {
2016-01-16 05:55:16 +00:00
return this.cache[id];
2015-12-13 04:42:28 +00:00
},
/**
2016-01-07 09:03:38 +00:00
* Get songs by their IDs.
2015-12-13 04:42:28 +00:00
*
2016-01-17 14:26:24 +00:00
* @param {Array.<String>} ids
2015-12-13 04:42:28 +00:00
*
2016-01-17 14:26:24 +00:00
* @return {Array.<Object>}
2015-12-13 04:42:28 +00:00
*/
byIds(ids) {
return _.map(ids, id => this.byId(id));
2015-12-13 04:42:28 +00:00
},
/**
* Increase a play count for a song.
*
2015-12-22 17:46:54 +00:00
* @param {Object} song
2015-12-13 04:42:28 +00:00
*/
registerPlay(song) {
// Increase playcount
2016-01-26 06:25:31 +00:00
http.post('interaction/play', { song: song.id }, response => song.playCount = response.data.play_count);
2015-12-13 04:42:28 +00:00
},
/**
* Get extra song information (lyrics, artist info, album info).
2015-12-13 04:42:28 +00:00
*
2016-01-07 09:03:38 +00:00
* @param {Object} song
* @param {?Function} cb
2015-12-13 04:42:28 +00:00
*/
getInfo(song, cb = null) {
2015-12-13 04:42:28 +00:00
if (!_.isUndefined(song.lyrics)) {
if (cb) {
cb();
}
return;
}
http.get(`${song.id}/info`, data => {
song.lyrics = data.lyrics;
// If the artist image is not in a nice form, don't use it.
if (data.artist_info && typeof data.artist_info.image !== 'string') {
data.artist_info.image = null;
}
song.album.artist.info = data.artist_info;
// Set the artist image on the client side to the retrieved image from server.
if (data.artist_info.image) {
song.album.artist.image = data.artist_info.image;
}
// Convert the duration into i:s
if (data.album_info && data.album_info.tracks) {
_.each(data.album_info.tracks, track => track.fmtLength = utils.secondsToHis(track.length));
}
// If the album cover is not in a nice form, don't use it.
if (data.album_info && typeof data.album_info.image !== 'string') {
data.album_info.image = null;
}
song.album.info = data.album_info;
2015-12-13 04:42:28 +00:00
// Set the album on the client side to the retrieved image from server.
if (data.album_info.cover) {
song.album.cover = data.album_info.cover;
}
2015-12-13 04:42:28 +00:00
if (cb) {
cb();
}
});
},
2015-12-20 12:17:35 +00:00
/**
2016-01-07 09:03:38 +00:00
* Scrobble a song (using Last.fm).
2015-12-20 12:17:35 +00:00
*
2016-01-07 09:03:38 +00:00
* @param {Object} song
* @param {?Function} cb
2015-12-20 12:17:35 +00:00
*/
scrobble(song, cb = null) {
2015-12-22 17:46:54 +00:00
if (!window.useLastfm || !userStore.current().preferences.lastfm_session_key) {
2015-12-20 12:17:35 +00:00
return;
}
http.post(`${song.id}/scrobble/${song.playStartTime}`, () => {
if (cb) {
cb();
}
});
},
2015-12-13 04:42:28 +00:00
};