Not requiring spotipy; Moving core into new service

This commit is contained in:
James Barnsley
2017-08-02 10:53:30 +12:00
parent fc4780deb4
commit 0c134459ea
38 changed files with 1309 additions and 1274 deletions

View File

@ -1,26 +1,6 @@
import * as helpers from '../../helpers'
export function getBroadcasts(){
return (dispatch, getState) => {
var config = {
method: 'GET',
url: 'https://gist.githubusercontent.com/jaedb/b677dccf80daf3ccb2ef12e96e495677/raw'
}
$.ajax(config).then(
response => {
dispatch({
type: 'BROADCASTS_LOADED',
broadcasts: JSON.parse(response)
})
},
(xhr, status, error) => {
console.error('Could not fetch broadcasts from GitHub')
}
)
}
}
export function setSelectedTracks(keys = []){
if (typeof(keys) === 'string'){
keys = [keys]
@ -66,22 +46,6 @@ export function hideTouchContextMenu(){
}
}
export function startSearch(search_type, query, only_mopidy = false){
return {
type: 'SEARCH_STARTED',
search_type: search_type,
query: query,
only_mopidy: only_mopidy
}
}
export function debugResponse( response ){
return {
type: 'DEBUG',
response: response
}
}
export function lazyLoading( start ){
return {
type: 'LAZY_LOADING',
@ -122,164 +86,6 @@ export function set( data ){
}
}
export function reorderPlaylistTracks( uri, indexes, insert_before, snapshot_id = false ){
var range = helpers.createRange( indexes );
switch( helpers.uriSource( uri ) ){
case 'spotify':
return {
type: 'SPOTIFY_REORDER_PLAYLIST_TRACKS',
key: uri,
range_start: range.start,
range_length: range.length,
insert_before: insert_before,
snapshot_id: snapshot_id
}
case 'm3u':
return {
type: 'MOPIDY_REORDER_PLAYLIST_TRACKS',
key: uri,
range_start: range.start,
range_length: range.length,
insert_before: insert_before
}
}
}
export function savePlaylist(uri, name, description = '', is_public = false, is_collaborative = false){
switch( helpers.uriSource( uri ) ){
case 'spotify':
return {
type: 'SPOTIFY_SAVE_PLAYLIST',
key: uri,
name: name,
description: (description == '' ? null : description),
is_public: is_public,
is_collaborative: is_collaborative
}
case 'm3u':
return {
type: 'MOPIDY_SAVE_PLAYLIST',
key: uri,
name: name
}
}
return false
}
export function createPlaylist(scheme, name, description = '', is_public = false, is_collaborative = false){
switch( scheme ){
case 'spotify':
return {
type: 'SPOTIFY_CREATE_PLAYLIST',
name: name,
description: (description == '' ? null : description),
is_public: is_public,
is_collaborative: is_collaborative
}
case 'm3u':
return {
type: 'MOPIDY_CREATE_PLAYLIST',
scheme: scheme,
name: name
}
}
return false
}
export function removeTracksFromPlaylist( uri, tracks_indexes ){
switch( helpers.uriSource( uri ) ){
case 'spotify':
return {
type: 'SPOTIFY_REMOVE_PLAYLIST_TRACKS',
key: uri,
tracks_indexes: tracks_indexes
}
case 'm3u':
return {
type: 'MOPIDY_REMOVE_PLAYLIST_TRACKS',
key: uri,
tracks_indexes: tracks_indexes
}
}
}
export function addTracksToPlaylist( uri, tracks_uris ){
switch( helpers.uriSource( uri ) ){
case 'spotify':
return {
type: 'SPOTIFY_ADD_PLAYLIST_TRACKS',
key: uri,
tracks_uris: tracks_uris
}
case 'm3u':
return {
type: 'MOPIDY_ADD_PLAYLIST_TRACKS',
key: uri,
tracks_uris: tracks_uris
}
}
}
/**
* Assets loaded
**/
export function albumLoaded(key,album){
return {
type: 'ALBUM_LOADED',
key: key,
album: album
}
}
export function albumsLoaded(albums){
return {
type: 'ALBUMS_LOADED',
albums: albums
}
}
export function artistLoaded(key,artist){
return {
type: 'ARTIST_LOADED',
key: key,
artist: artist
}
}
export function artistsLoaded(artists){
return {
type: 'ALBUMS_LOADED',
artists: artists
}
}
export function trackLoaded(key,track){
return {
type: 'TRACK_LOADED',
key: key,
track: track
}
}
export function tracksLoaded(tracks){
return {
type: 'TRACKS_LOADED',
tracks: tracks
}
}
/**

View File

@ -15,251 +15,11 @@ const UIMiddleware = (function(){
switch(action.type){
case 'MOPIDY_CONNECTED':
ReactGA.event({ category: 'Mopidy', action: 'Connected', label: window.location.hostname })
case 'MOPIDY_STATE':
helpers.setWindowTitle(store.getState().core.current_track, action.data)
next(action)
break
case 'PUSHER_CONNECTED':
ReactGA.event({ category: 'Pusher', action: 'Connected', label: action.username })
next(action)
break
case 'SPOTIFY_CONNECTED':
var label = null
if (store.getState().spotify.me) label = store.getState().spotify.me.id
ReactGA.event({ category: 'Spotify', action: 'Connected', label: label })
next(action)
break
case 'SPOTIFY_AUTHORIZATION_GRANTED':
ReactGA.event({ category: 'Spotify', action: 'Authorization granted' })
next(action)
break
case 'SPOTIFY_AUTHORIZATION_REVOKED':
var label = null
if (store.getState().spotify.me) label = store.getState().spotify.me.id
ReactGA.event({ category: 'Spotify', action: 'Authorization revoked', label: label })
next(action)
break
case 'SPOTIFY_ME_LOADED':
ReactGA.event({ category: 'Spotify', action: 'Authorization verified', label: action.data.id })
next(action)
break
case 'SPOTIFY_IMPORT_AUTHORIZATION':
var label = null
if (action.me && action.me.id){
label = action.me.id
}
ReactGA.event({ category: 'Spotify', action: 'Authorization imported', label: label })
next(action)
break
case 'SPOTIFY_RECOMMENDATIONS_LOADED':
if (action.seeds_uris){
ReactGA.event({ category: 'Spotify', action: 'Recommendations', label: action.seeds_uris.join(',') })
}
next(action)
break
case 'ALBUM_LOADED':
if (action.data) ReactGA.event({ category: 'Album', action: 'Load', label: action.album.uri })
// make sure our images use mopidy host:port
if (action.album.images && action.album.images.length > 0){
var images = Object.assign([], action.album.images)
for (var i = 0; i < images.length; i++){
if (typeof(images[i]) === 'string' && images[i].startsWith('/images/')){
images[i] = '//'+store.getState().mopidy.host+':'+store.getState().mopidy.port+images[i]
}
}
action.album.images = images
}
next(action)
break
case 'ALBUMS_LOADED':
if (action.data) ReactGA.event({ category: 'Albums', action: 'Load', label: action.albums.length+' items' })
for (var i = 0; i < action.albums.length; i++){
// make sure our images use mopidy host:port
if (action.albums[i].images && action.albums[i].images.length > 0){
var images = Object.assign([], action.albums[i].images)
for (var j = 0; j < images.length; j++){
if (typeof(images[j]) === 'string' && images[j].startsWith('/images/')){
images[j] = '//'+store.getState().mopidy.host+':'+store.getState().mopidy.port+images[j]
}
}
action.albums[i].images = images
}
}
next(action)
break
case 'ARTIST_LOADED':
if (action.data) ReactGA.event({ category: 'Artist', action: 'Load', label: action.artist.uri })
next(action)
break
case 'SPOTIFY_USER_LOADED':
if (action.data) ReactGA.event({ category: 'User', action: 'Load', label: action.data.uri })
next(action)
break
case 'MOPIDY_DIRECTORY':
if (action.data) ReactGA.event({ category: 'Directory', action: 'Load', label: action.data.uri })
next(action)
break
case 'MOPIDY_PLAY_PLAYLIST':
ReactGA.event({ category: 'Playlist', action: 'Play', label: action.uri })
next(action)
break
case 'MOPIDY_SAVE_PLAYLIST':
case 'SPOTIFY_SAVE_PLAYLIST':
ReactGA.event({ category: 'Playlist', action: 'Save', label: action.key })
next(action)
break
case 'MOPIDY_CREATE_PLAYLIST':
ReactGA.event({ category: 'Playlist', action: 'Create', label: 'Mopidy,'+action.name })
next(action)
break
case 'SPOTIFY_CREATE_PLAYLIST':
ReactGA.event({ category: 'Playlist', action: 'Create', label: 'Spotify,'+action.name })
next(action)
break
case 'MOPIDY_REORDER_PLAYLIST_TRACKS':
case 'SPOTIFY_REORDER_PLAYLIST_TRACKS':
ReactGA.event({ category: 'Playlist', action: 'Reorder tracks', label: action.key })
next(action)
break
case 'MOPIDY_ADD_PLAYLIST_TRACKS':
case 'SPOTIFY_ADD_PLAYLIST_TRACKS':
ReactGA.event({ category: 'Playlist', action: 'Add tracks', label: action.playlist_uri })
next(action)
break
case 'MOPIDY_REMOVE_PLAYLIST_TRACKS':
case 'SPOTIFY_REMOVE_PLAYLIST_TRACKS':
ReactGA.event({ category: 'Playlist', action: 'Remove tracks', label: action.playlist_uri })
next(action)
break
case 'MOPIDY_DELETE_PLAYLIST':
ReactGA.event({ category: 'Playlist', action: 'Delete', label: action.uri })
next(action)
break
case 'PUSHER_ERROR':
ReactGA.event({ category: 'Pusher', action: 'Error', label: action.message })
next(action)
break
case 'SEARCH_STARTED':
ReactGA.event({ category: 'Search', action: 'Started', label: action.type+': '+action.query })
var state = store.getState()
if (state.ui.search_settings){
var uri_schemes = state.ui.search_settings.uri_schemes
} else {
var uri_schemes = state.mopidy.uri_schemes
}
// backends that can handle more than just track results
// make sure they are available and respect our settings
var available_full_uri_schemes = ['local:','file:','gmusic:']
var full_uri_schemes = []
for (var i = 0; i < available_full_uri_schemes.length; i++){
var index = uri_schemes.indexOf(available_full_uri_schemes[i])
if (index > -1){
full_uri_schemes.push(available_full_uri_schemes[i])
}
}
// initiate spotify searching
if (!action.only_mopidy){
if (!state.ui.search_settings || state.ui.search_settings.spotify){
store.dispatch(spotifyActions.getSearchResults(action.query))
}
}
// backend searching (mopidy)
if (state.mopidy.connected){
switch (action.search_type){
case 'playlists':
for (var i = 0; i < full_uri_schemes.length; i++){
store.dispatch(mopidyActions.getPlaylistSearchResults(action.query,100,full_uri_schemes[i]))
}
break
case 'artists':
for (var i = 0; i < full_uri_schemes.length; i++){
store.dispatch(mopidyActions.getArtistSearchResults(action.query,100,full_uri_schemes[i]))
}
break
case 'albums':
for (var i = 0; i < full_uri_schemes.length; i++){
store.dispatch(mopidyActions.getAlbumSearchResults(action.query,100,full_uri_schemes[i]))
}
break
case 'tracks':
for (var i = 0; i < uri_schemes.length; i++){
store.dispatch(mopidyActions.getTrackSearchResults(action.query,100,uri_schemes[i]))
}
break
default:
for (var i = 0; i < full_uri_schemes.length; i++){
store.dispatch(mopidyActions.getPlaylistSearchResults(action.query,6,full_uri_schemes[i]))
store.dispatch(mopidyActions.getArtistSearchResults(action.query,6,full_uri_schemes[i]))
store.dispatch(mopidyActions.getAlbumSearchResults(action.query,6,full_uri_schemes[i]))
}
for (var i = 0; i < uri_schemes.length; i++){
store.dispatch(mopidyActions.getTrackSearchResults(action.query,20,uri_schemes[i]))
}
}
}
next(action)
break
case 'PUSHER_START_RADIO':
ReactGA.event({ category: 'Pusher', action: 'Start radio', label: action.uris.join() })
next(action)
break
case 'PUSHER_UPDATE_RADIO':
ReactGA.event({ category: 'Pusher', action: 'Update radio', label: action.uris.join() })
next(action)
break
case 'PUSHER_STOP_RADIO':
ReactGA.event({ category: 'Pusher', action: 'Stop radio' })
next(action)
break
case 'PUSHER_UPGRADING':
ReactGA.event({ category: 'Pusher', action: 'Upgrade', label: action.data })
next(action)
break
case 'RESTART':
location.reload()
break
case 'OPEN_MODAL':
ReactGA.event({ category: 'Modal', action: 'Opened', label: action.modal.name })
$('body').addClass('modal-open')
@ -363,101 +123,6 @@ const UIMiddleware = (function(){
next(action)
break
case 'PLAYLIST_TRACKS_ADDED':
store.dispatch(uiActions.createNotification('Added '+action.tracks_uris.length+' tracks to playlist'))
switch(helpers.uriSource(action.key)){
case 'spotify':
store.dispatch(spotifyActions.getPlaylist(action.key))
break
case 'm3u':
if( store.getState().mopidy.connected ) store.dispatch(mopidyActions.getPlaylist(action.key))
break
}
next(action)
break
case 'PLAYLIST_LOADED':
if (action.data) ReactGA.event({ category: 'Playlist', action: 'Load', label: action.playlist.uri })
var playlist = Object.assign({}, action.playlist)
switch (helpers.uriSource(playlist.uri)){
case 'm3u':
playlist.can_edit = true
break
case 'spotify':
if (store.getState().spotify.authorized && store.getState().spotify.me){
playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id)
}
}
// proceed as usual
action.playlist = playlist
next(action)
break
case 'PLAYLISTS_LOADED':
if (action.data) ReactGA.event({ category: 'Playlists', action: 'Load', label: action.playlists.length+' items' })
var playlists = []
for (var i = 0; i < action.playlists.length; i++){
var playlist = Object.assign({}, action.playlists[i])
switch (helpers.uriSource(playlist.uri)){
case 'm3u':
playlist.can_edit = true
break
case 'spotify':
if (store.getState().spotify.authorized && store.getState().spotify.me){
playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id)
}
}
playlists.push(playlist)
}
// proceed as usual
action.playlists = playlists
next(action)
break
case 'MOPIDY_STATE':
helpers.setWindowTitle(store.getState().ui.current_track, action.data)
next(action)
break
case 'MOPIDY_CURRENTTLTRACK':
if (action.data && action.data.track ){
helpers.setWindowTitle(action.data.track, store.getState().mopidy.play_state)
// make sure our images use mopidy host:port
if (action.data.track.album && action.data.track.album.images && action.data.track.album.images.length > 0){
var images = Object.assign([], action.data.track.album.images)
for (var i = 0; i < images.length; i++){
if (typeof(images[i]) === 'string' && images[i].startsWith('/images/')){
images[i] = '//'+store.getState().mopidy.host+':'+store.getState().mopidy.port+images[i]
}
}
action.data.track.album.images = images
}
}
next(action)
break
case 'PUSHER_VERSION':
ReactGA.event({ category: 'Pusher', action: 'Version', label: action.version.current })
if (action.version.upgrade_available){
store.dispatch( uiActions.createNotification( 'Version '+action.version.latest+' is available. See settings to upgrade.' ) )
}
next( action )
break
// This action is irrelevant to us, pass it on to the next middleware
default:
return next(action)

View File

@ -16,9 +16,6 @@ export default function reducer(ui = {}, action){
case 'UI_SET':
return Object.assign({}, ui, action.data)
case 'PUSHER_CONFIG':
return Object.assign({}, ui, { config: action.config })
case 'TOGGLE_SIDEBAR':
var new_state = !ui.sidebar_open
if( typeof(action.new_state) !== 'undefined' ) new_state = action.new_state
@ -79,643 +76,6 @@ export default function reducer(ui = {}, action){
/**
* Current track and tracklist
**/
case 'MOPIDY_TLTRACKS':
if( !action.data ) return ui
var tracklist = []
for( var i = 0; i < action.data.length; i++ ){
var tltrack = action.data[i]
// load our metadata (if we have any for that tlid)
if (typeof(ui.queue_metadata) !== 'undefined' && typeof(ui.queue_metadata['tlid_'+tltrack.tlid]) !== 'undefined'){
var metadata = ui.queue_metadata['tlid_'+tltrack.tlid]
} else {
var metadata = {}
}
var track = Object.assign(
{},
tltrack.track,
metadata,
{
tlid: tltrack.tlid,
playing: ( ui.current_track && tltrack.tlid == ui.current_track.tlid )
})
tracklist.push( track )
}
return Object.assign({}, ui, { current_tracklist: tracklist });
case 'MOPIDY_CURRENTTLTRACK':
if (!action.data) return ui
var current_tracklist = []
Object.assign(current_tracklist, ui.current_tracklist)
for (var i = 0; i < current_tracklist.length; i++){
Object.assign(
current_tracklist[i],
{ playing: ( current_tracklist[i].tlid == action.data.tlid ) }
)
}
var current_track = Object.assign(
{},
action.data.track,
{
tlid: action.data.tlid
}
)
return Object.assign({}, ui, {
current_tracklist: current_tracklist,
current_track: current_track
});
case 'TRACK_LOADED':
if (!action.key || !action.track) return ui
var tracks = Object.assign({}, ui.tracks)
if (tracks[action.key]){
var track = Object.assign({}, tracks[action.key], action.track)
}else{
var track = Object.assign({}, action.track)
}
tracks[action.key] = track
return Object.assign({}, ui, { tracks: tracks });
case 'TRACKS_LOADED':
var tracks = Object.assign({}, ui.tracks)
for (var i = 0; i < action.tracks.length; i++){
var track = action.tracks[i]
if (typeof(tracks[track.uri]) !== 'undefined'){
track = Object.assign({}, tracks[track.uri], track)
}
tracks[track.uri] = track
}
return Object.assign({}, ui, { tracks: tracks });
case 'PUSHER_QUEUE_METADATA':
case 'PUSHER_QUEUE_METADATA_CHANGED':
var tracklist = Object.assign([], ui.current_tracklist)
for( var i = 0; i < tracklist.length; i++ ){
// load our metadata (if we have any for that tlid)
if (typeof(action.queue_metadata['tlid_'+tracklist[i].tlid]) !== 'undefined'){
tracklist[i] = Object.assign(
{},
tracklist[i],
action.queue_metadata['tlid_'+tracklist[i].tlid],
)
}
}
return Object.assign({}, ui, { current_tracklist: tracklist, queue_metadata: action.queue_metadata });
case 'PUSHER_RADIO':
case 'PUSHER_RADIO_STARTED':
case 'PUSHER_RADIO_CHANGED':
case 'PUSHER_RADIO_STOPPED':
return Object.assign({}, ui, { seeds_resolved: false }, { radio: action.radio })
case 'RADIO_SEEDS_RESOLVED':
var radio = Object.assign({}, ui.radio, { resolved_seeds: action.resolved_seeds })
return Object.assign({}, ui, { radio: radio })
/**
* Categories
**/
case 'CATEGORY_LOADED':
var categories = Object.assign([], ui.categories)
if (categories[action.key]){
var category = Object.assign({}, categories[action.key], action.category)
}else{
var category = Object.assign({}, action.category)
}
categories[action.key] = category
return Object.assign({}, ui, { categories: categories });
case 'CATEGORIES_LOADED':
var categories = Object.assign([], ui.categories)
for (var i = 0; i < action.categories.length; i++){
var key = 'category:'+action.categories[i].id
if (categories[key]){
var category = Object.assign({}, categories[key], action.categories[i])
}else{
var category = Object.assign({}, action.categories[i])
}
categories[key] = category
}
return Object.assign({}, ui, { categories: categories });
case 'CATEGORY_PLAYLISTS_LOADED':
var categories = Object.assign([], ui.categories)
var playlists_uris = []
if (categories[action.key].playlists_uris) playlists_uris = categories[action.key].playlists_uris
var category = Object.assign(
{},
categories[action.key],
{
playlists_uris: [...playlists_uris, ...action.uris],
playlists_more: action.more,
playlists_total: action.total
}
)
categories[action.key] = category
return Object.assign({}, ui, { categories: categories });
/**
* Albums
**/
case 'ALBUM_LOADED':
var albums = Object.assign([], ui.albums)
if (albums[action.key]){
var album = Object.assign({}, albums[action.key], action.album)
}else{
var album = Object.assign({}, action.album)
}
albums[action.key] = album
return Object.assign({}, ui, { albums: albums });
case 'ALBUMS_LOADED':
var albums = Object.assign([], ui.albums)
for (var i = 0; i < action.albums.length; i++){
var album = action.albums[i]
if (albums[album.uri]){
album = Object.assign({}, albums[album.uri], album)
}
albums[album.uri] = album
}
return Object.assign({}, ui, { albums: albums });
case 'LIBRARY_ALBUMS_LOADED':
var library_albums = []
if (ui.library_albums) library_albums = Object.assign([], ui.library_albums)
return Object.assign({}, ui, {
library_albums: helpers.removeDuplicates([...library_albums, ...action.uris]),
library_albums_more: action.more,
library_albums_total: action.total,
library_albums_started: true
});
case 'ALBUM_LIBRARY_CHECK':
var items = Object.assign([], ui.library_albums)
// add/remove library reference
var index = items.indexOf(action.key)
// removing existing
if (index > -1 && !action.in_library){
items.splice(index, 1)
} else if (index < 0 && action.in_library){
items.push(action.key)
}
return Object.assign({}, ui, { library_albums: items });
case 'LOCAL_ALBUMS_LOADED':
if (!action.uris) return Object.assign({}, ui, { local_albums: null });
return Object.assign({}, ui, { local_albums: action.uris });
case 'NEW_RELEASES_LOADED':
if (!action.uris){
return Object.assign({}, ui, {
new_releases: null,
new_releases_more: null,
new_releases_total: null
});
}
var new_releases = []
if (ui.new_releases) new_releases = Object.assign([], ui.new_releases)
return Object.assign({}, ui, {
new_releases: [...new_releases, ...action.uris],
new_releases_more: action.more,
new_releases_total: action.total
});
/**
* Artists
**/
case 'ARTIST_LOADED':
var artists = Object.assign([], ui.artists)
if (artists[action.key]){
// if we've already got images, remove and add as additional_images
// this is to prevent LastFM overwriting Spotify images
if (artists[action.key].images){
action.artist.images_additional = action.artist.images
delete action.artist.images
}
var artist = Object.assign({}, artists[action.key], action.artist)
}else{
var artist = Object.assign({}, action.artist)
}
artists[action.key] = artist
return Object.assign({}, ui, { artists: artists });
case 'ARTISTS_LOADED':
var artists = Object.assign([], ui.artists)
for (var i = 0; i < action.artists.length; i++){
var artist = action.artists[i]
if (typeof(artists[artist.uri]) !== 'undefined'){
artist = Object.assign({}, artists[artist.uri], artist)
}
artists[artist.uri] = artist
}
return Object.assign({}, ui, { artists: artists });
case 'ARTIST_ALBUMS_LOADED':
var artists = Object.assign([], ui.artists)
var albums_uris = []
if (artists[action.key].albums_uris) albums_uris = artists[action.key].albums_uris
var artist = Object.assign(
{},
artists[action.key],
{
albums_uris: [...albums_uris, ...action.uris],
albums_more: action.more,
albums_total: action.total
}
)
artists[action.key] = artist
return Object.assign({}, ui, { artists: artists });
case 'LIBRARY_ARTISTS_LOADED':
var library_artists = []
if (ui.library_artists) library_artists = Object.assign([], ui.library_artists)
return Object.assign({}, ui, {
library_artists: helpers.removeDuplicates([...library_artists, ...action.uris]),
library_artists_more: action.more,
library_artists_total: action.total,
library_artists_started: true
});
case 'ARTIST_LIBRARY_CHECK':
var items = Object.assign([], ui.library_artists)
// add/remove library reference
var index = items.indexOf(action.key)
// removing existing
if (index > -1 && !action.in_library){
items.splice(index, 1)
} else if (index < 0 && action.in_library){
items.push(action.key)
}
return Object.assign({}, ui, { library_artists: items });
case 'LOCAL_ARTISTS_LOADED':
if (!action.uris) return Object.assign({}, ui, { local_artists: null });
return Object.assign({}, ui, { local_artists: action.uris });
/**
* User profiles
**/
case 'USER_LOADED':
var users = Object.assign([], ui.users)
if (users[action.key]){
var user = Object.assign({}, users[action.key], action.user)
}else{
var user = Object.assign({}, action.user)
}
users[action.key] = user
return Object.assign({}, ui, { users: users });
case 'USER_PLAYLISTS_LOADED':
var users = Object.assign([], ui.users)
var playlists_uris = []
if (users[action.key] && users[action.key].playlists_uris) playlists_uris = users[action.key].playlists_uris
var artist = Object.assign(
{},
users[action.key],
{
playlists_uris: [...playlists_uris, ...action.uris],
playlists_more: action.more,
playlists_total: action.total
}
)
users[action.key] = artist
return Object.assign({}, ui, { users: users });
/**
* Playlists
**/
case 'PLAYLIST_LOADED':
case 'PLAYLIST_UPDATED':
var playlists = Object.assign([], ui.playlists)
if (typeof(playlists[action.key]) !== 'undefined'){
var existing_playlist = Object.assign({}, playlists[action.key])
if (existing_playlist.tracks && action.playlist.tracks){
var tracks = [...existing_playlist.tracks, ...action.playlist.tracks]
} else if (existing_playlist.tracks){
var tracks = existing_playlist.tracks
} else if (action.playlist.tracks){
var tracks = action.playlist.tracks
} else {
var tracks = []
}
var merged_playlist = Object.assign(
{},
existing_playlist,
action.playlist,
{
tracks: tracks
}
)
}else{
var merged_playlist = Object.assign({}, action.playlist)
}
playlists[action.key] = merged_playlist
return Object.assign({}, ui, { playlists: playlists })
case 'PLAYLIST_KEY_UPDATED':
var playlists = Object.assign([], ui.playlists)
// URI not in our index? No change needed then
if (typeof(playlists[action.key]) === 'undefined'){
return ui
}
// Delete our old playlist by key, and add by new key
var playlist = Object.assign({}, playlists[action.key])
delete playlists[action.key]
playlists[playlist.uri] = playlist
return Object.assign({}, ui, { playlists: playlists })
case 'PLAYLISTS_LOADED':
var playlists = Object.assign([], ui.playlists)
for (var i = 0; i < action.playlists.length; i++){
var loaded_playlist = action.playlists[i]
if (typeof(playlists[loaded_playlist.uri]) !== 'undefined'){
var existing_playlist = Object.assign({}, playlists[loaded_playlist.uri])
if (existing_playlist.tracks && loaded_playlist.tracks){
var tracks = [...existing_playlist.tracks, ...loaded_playlist.tracks]
} else if (existing_playlist.tracks){
var tracks = existing_playlist.tracks
} else if (loaded_playlist.tracks){
var tracks = loaded_playlist.tracks
} else {
var tracks = []
}
var merged_playlist = Object.assign(
{},
existing_playlist,
loaded_playlist,
{
tracks: tracks
}
)
} else {
var merged_playlist = loaded_playlist
}
playlists[merged_playlist.uri] = merged_playlist
}
return Object.assign({}, ui, { playlists: playlists });
case 'PLAYLIST_LOADED_MORE_TRACKS':
var playlists = Object.assign([], ui.playlists)
var playlist = Object.assign(
{},
playlists[action.key],
{
tracks: [...playlists[action.key].tracks, ...helpers.flattenTracks(action.data.items)],
tracks_more: action.data.next,
tracks_total: action.data.total
}
)
playlists[action.key] = playlist
return Object.assign({}, ui, { playlists: playlists });
case 'PLAYLIST_TRACKS_REMOVED':
var playlists = Object.assign([], ui.playlists)
var playlist = Object.assign({}, playlists[action.key])
var tracks = Object.assign([], playlist.tracks)
var indexes = action.tracks_indexes.reverse()
for( var i = 0; i < indexes.length; i++ ){
tracks.splice( indexes[i], 1 )
}
var snapshot_id = null
if( action.snapshot_id ) snapshot_id = action.snapshot_id
Object.assign(playlist, { tracks: tracks, snapshot_id: snapshot_id })
playlists[action.key] = playlist
return Object.assign({}, ui, { playlists: playlists });
case 'PLAYLIST_TRACKS':
var playlists = Object.assign([], ui.playlists)
var playlist = Object.assign({}, playlists[action.key], { tracks: action.tracks })
playlists[action.key] = playlist
return Object.assign({}, ui, { playlists: playlists });
case 'PLAYLIST_TRACKS_REORDERED':
var playlists = Object.assign([], ui.playlists)
var playlist = Object.assign({}, playlists[action.key])
var tracks = Object.assign([], playlist.tracks)
// handle insert_before offset if we're moving BENEATH where we're slicing tracks
var insert_before = action.insert_before
if( insert_before > action.range_start ) insert_before = insert_before - action.range_length
// cut our moved tracks into a new array
var tracks_to_move = tracks.splice(action.range_start, action.range_length)
tracks_to_move.reverse()
for( i = 0; i < tracks_to_move.length; i++ ){
tracks.splice(insert_before, 0, tracks_to_move[i])
}
var snapshot_id = null
if( action.snapshot_id ) snapshot_id = action.snapshot_id
Object.assign(playlist, { tracks: tracks, snapshot_id: snapshot_id })
playlists[action.key] = playlist
return Object.assign({}, ui, { playlists: playlists });
case 'LIBRARY_PLAYLISTS_LOADED':
if (ui.library_playlists){
var library_playlists = [...ui.library_playlists, ...action.uris]
}else{
var library_playlists = action.uris
}
library_playlists = helpers.removeDuplicates(library_playlists)
return Object.assign({}, ui, {
library_playlists: library_playlists,
library_playlists_started: true
});
case 'PLAYLIST_LIBRARY_CHECK':
var items = Object.assign([], ui.library_playlists)
// add/remove library reference
var index = items.indexOf(action.key)
// removing existing
if (index > -1 && !action.in_library){
items.splice(index, 1)
} else if (index < 0 && action.in_library){
items.push(action.key)
}
return Object.assign({}, ui, { library_playlists: items });
/**
* Genres
**/
case 'SPOTIFY_GENRES_LOADED':
return Object.assign({}, ui, {genres: action.genres})
/**
* Search results
**/
case 'SEARCH_STARTED':
return Object.assign({}, ui, {
search_results: {
artists_more: null,
artists_uris: [],
albums_more: null,
albums_uris: [],
playlists_more: null,
playlists_uris: [],
tracks: [],
tracks_more: null,
}
});
case 'SEARCH_RESULTS_LOADED':
// artists
if (ui.search_results && ui.search_results.artists_uris){
var artists_uris = ui.search_results.artists_uris
}else{
var artists_uris = []
}
if (action.artists_uris) artists_uris = [...artists_uris, ...action.artists_uris]
// more tracks
if (typeof(action.artists_more) !== 'undefined') var artists_more = action.artists_more
else if (ui.search_results && ui.search_results.artists_more) var artists_more = ui.search_results.artists_more
else var artists_more = null
// albums
if (ui.search_results && ui.search_results.albums_uris){
var albums_uris = ui.search_results.albums_uris
}else{
var albums_uris = []
}
if (action.albums_uris) albums_uris = [...albums_uris, ...action.albums_uris]
// more tracks
if (typeof(action.albums_more) !== 'undefined') var albums_more = action.albums_more
else if (ui.search_results && ui.search_results.albums_more) var albums_more = ui.search_results.albums_more
else var albums_more = null
// playlists
if (ui.search_results && ui.search_results.playlists_uris){
var playlists_uris = ui.search_results.playlists_uris
}else{
var playlists_uris = []
}
if (action.playlists_uris) playlists_uris = [...playlists_uris, ...action.playlists_uris]
// more tracks
if (typeof(action.playlists_more) !== 'undefined') var playlists_more = action.playlists_more
else if (ui.search_results && ui.search_results.playlists_more) var playlists_more = ui.search_results.playlists_more
else var playlists_more = null
// tracks
if (ui.search_results && ui.search_results.tracks){
var tracks = ui.search_results.tracks
}else{
var tracks = []
}
if (action.tracks) tracks = [...tracks, ...action.tracks]
// more tracks
if (typeof(action.tracks_more) !== 'undefined') var tracks_more = action.tracks_more
else if (ui.search_results && ui.search_results.tracks_more) var tracks_more = ui.search_results.tracks_more
else var tracks_more = null
return Object.assign({}, ui, {
search_results: {
artists_more: artists_more,
artists_uris: helpers.removeDuplicates(artists_uris),
albums_more: albums_more,
albums_uris: helpers.removeDuplicates(albums_uris),
playlists_more: playlists_more,
playlists_uris: helpers.removeDuplicates(playlists_uris),
tracks: tracks,
tracks_more: tracks_more
}
});
/**
* Modals