diff --git a/src/js/components/AddSeedField.js b/src/js/components/AddSeedField.js index f03b52b5..01d04b5e 100755 --- a/src/js/components/AddSeedField.js +++ b/src/js/components/AddSeedField.js @@ -68,12 +68,12 @@ class AddSeedField extends React.Component{ switch (helpers.uriType(item.uri)){ case 'artist': - this.props.coreActions.artistLoaded(item.uri,item) - break + this.props.coreActions.artistsLoaded(item); + break; case 'track': - this.props.coreActions.trackLoaded(item.uri,item) - break + this.props.coreActions.tracksLoaded(item); + break; } } diff --git a/src/js/services/core/actions.js b/src/js/services/core/actions.js index 9e9de3f7..42184943 100755 --- a/src/js/services/core/actions.js +++ b/src/js/services/core/actions.js @@ -221,11 +221,10 @@ export function getLibraryArtists(){ * Assets loaded **/ -export function albumLoaded(key,album){ +export function tracksLoaded(tracks){ return { - type: 'ALBUM_LOADED', - key: key, - album: album + type: 'TRACKS_LOADED', + tracks: tracks } } @@ -236,14 +235,6 @@ export function albumsLoaded(albums){ } } -export function artistLoaded(key,artist){ - return { - type: 'ARTIST_LOADED', - key: key, - artist: artist - } -} - export function artistsLoaded(artists){ return { type: 'ALBUMS_LOADED', @@ -251,17 +242,16 @@ export function artistsLoaded(artists){ } } -export function trackLoaded(key,track){ +export function playlistsLoaded(playlists){ return { - type: 'TRACK_LOADED', - key: key, - track: track + type: 'PLAYLISTS_LOADED', + playlists: playlists } } -export function tracksLoaded(tracks){ +export function usersLoaded(users){ return { - type: 'TRACKS_LOADED', - tracks: tracks + type: 'USERS_LOADED', + users: users } } diff --git a/src/js/services/core/middleware.js b/src/js/services/core/middleware.js index 23a12625..eb106e23 100755 --- a/src/js/services/core/middleware.js +++ b/src/js/services/core/middleware.js @@ -98,7 +98,6 @@ const CoreMiddleware = (function(){ case 'CORE_START_SERVICES': store.dispatch(mopidyActions.connect()); store.dispatch(pusherActions.connect()); - store.dispatch(lastfmActions.connect()); next(action) break @@ -306,27 +305,69 @@ const CoreMiddleware = (function(){ * These modify our asset indexes, which are used globally **/ + // Array wrapper for TRACKS_LOADED case 'TRACK_LOADED': - if (action.track.album && action.track.album.images && action.track.album.images.length > 0){ - action.track.album.images = helpers.digestMopidyImages(store.getState().mopidy, action.track.album.images); - } + store.dispatch({ + type: 'TRACKS_LOADED', + tracks: [action.track] + }) + next(action); + break; - var tracks = Object.assign({}, core.tracks) - if (tracks[action.key]){ - var track = Object.assign( - {}, - tracks[action.key], - helpers.formatTracks(action.track) - ); - } else { - var track = Object.assign( - {}, - helpers.formatTracks(action.track) - ); + // Array wrapper for ALBUMS_LOADED + case 'ALBUM_LOADED': + store.dispatch({ + type: 'ALBUMS_LOADED', + albums: [action.album] + }); + next(action); + break; + + // Array wrapper for ARTISTS_LOADED + case 'ARTIST_LOADED': + store.dispatch({ + type: 'ARTISTS_LOADED', + artists: [action.artist] + }); + next(action); + break; + + // Array wrapper for PLAYLISTS_LOADED + case 'PLAYLIST_LOADED': + store.dispatch({ + type: 'PLAYLISTS_LOADED', + playlists: [action.playlist] + }); + next(action); + break; + + // Array wrapper for USERS_LOADED + case 'USER_LOADED': + store.dispatch({ + type: 'USERS_LOADED', + users: [action.user] + }); + next(action); + break; + + case 'TRACKS_LOADED': + var tracks = Object.assign({}, core.tracks); + + for (var i = 0; i < action.tracks.length; i++){ + var track = Object.assign({}, helpers.formatTracks(action.tracks[i])); + + if (tracks[track.uri]){ + track = Object.assign({}, tracks[track.uri], track); + } + + if (track.album && track.album.images && track.album.images.length > 0){ + track.album.images = helpers.digestMopidyImages(store.getState().mopidy, track.album.images); + } + + tracks[track.uri] = track; } // Update index - tracks[action.key] = track; store.dispatch({ type: 'UPDATE_TRACKS_INDEX', tracks: tracks @@ -335,97 +376,85 @@ const CoreMiddleware = (function(){ next(action); break; - case 'TRACKS_LOADED': - for (var i = 0; i < action.tracks.length; i++){ - store.dispatch({ - type: 'TRACK_LOADED', - key: action.tracks[i].uri, - track: action.tracks[i] - }); - } - next(action); - break; + case 'ALBUMS_LOADED': + var albums = Object.assign({}, core.albums); + var tracks_loaded = []; - case 'ALBUM_LOADED': - var albums = Object.assign({}, core.albums) + for (var i = 0; i < action.albums.length; i++){ + var album = Object.assign({}, action.albums[i]); - if (albums[action.key]){ - var album = Object.assign({}, albums[action.key], action.album) - } else { - var album = Object.assign({}, action.album) + if (albums[album.uri]){ + album = Object.assign({}, albums[album.uri], album); + } + + if (album.images && album.images.length > 0){ + album.images = helpers.digestMopidyImages(store.getState().mopidy, album.images); + } + + // Load our tracks + if (album.tracks){ + var tracks = helpers.formatTracks(album.tracks); + var tracks_uris = helpers.arrayOf('uri', tracks); + album.tracks_uris = tracks_uris; + delete album.tracks; + tracks_loaded = [...tracks_loaded, ...tracks]; + } + + albums[album.uri] = album; } - if (action.album.images && action.album.images.length > 0){ - action.album.images = helpers.digestMopidyImages(store.getState().mopidy, action.album.images); - } - - // Load our tracks - if (album.tracks){ - var tracks = helpers.formatTracks(album.tracks); - var tracks_uris = helpers.arrayOf('uri', tracks); - album.tracks_uris = tracks_uris; - delete album.tracks; - - store.dispatch({ - type: 'TRACKS_LOADED', - tracks: tracks - }); - } + // Load these new tracks + store.dispatch({ + type: 'TRACKS_LOADED', + tracks: tracks_loaded + }); // Update index - albums[action.key] = album; store.dispatch({ type: 'UPDATE_ALBUMS_INDEX', albums: albums }); - next(action); - break; - - case 'ALBUMS_LOADED': - for (var i = 0; i < action.albums.length; i++){ - store.dispatch({ - type: 'ALBUM_LOADED', - key: action.albums[i].uri, - album: action.albums[i] - }); - } next(action); break - case 'ARTIST_LOADED': - var artists = Object.assign({}, core.artists) + case 'ARTISTS_LOADED': + var artists = Object.assign({}, core.artists); + var tracks_loaded = []; - if (artists[action.key]){ + for (var i = 0; i < action.artists.length; i++){ + var artist = action.artists[i]; - // 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 + if (artists[artist.uri]){ + + // if we've already got images, remove and add as additional_images + // this is to prevent LastFM overwriting Spotify images + if (artists[artist.uri].images){ + artist.images_additional = artist.images + delete artist.images + } + + artist = Object.assign({}, artists[artist.uri], artist); } - var artist = Object.assign({}, artists[action.key], action.artist) if (artist.tracks){ - artist.tracks = helpers.formatTracks(artist.tracks); - } - } else { - var artist = Object.assign({}, action.artist) - if (artist.tracks){ - artist.tracks = helpers.formatTracks(artist.tracks); + var tracks = helpers.formatTracks(artist.tracks); + var tracks_uris = helpers.arrayOf('uri', tracks); + artist.tracks_uris = tracks_uris; + delete artist.tracks; + tracks_loaded = [...tracks_loaded, ...tracks]; } + + // Update index + artists[artist.uri] = artist; } // Load our tracks - if (artist.tracks){ - store.dispatch({ - type: 'TRACKS_LOADED', - tracks: artist.tracks - }); - } + store.dispatch({ + type: 'TRACKS_LOADED', + tracks: tracks_loaded + }); - // Update index - artists[action.key] = artist; store.dispatch({ type: 'UPDATE_ARTISTS_INDEX', artists: artists @@ -434,69 +463,61 @@ const CoreMiddleware = (function(){ next(action); break; - case 'ARTISTS_LOADED': - for (var i = 0; i < action.artists.length; i++){ - store.dispatch({ - type: 'ARTIST_LOADED', - key: action.artists[i].uri, - artist: action.artists[i] - }); - } - next(action); - break; - - case 'PLAYLIST_LOADED': - var playlist = Object.assign({}, action.playlist); + case 'PLAYLISTS_LOADED': var playlists = Object.assign({}, core.playlists); + var tracks_loaded = []; - // Detect editability - switch (helpers.uriSource(playlist.uri)){ + for (var i = 0; i < action.playlists.length; i++){ + var playlist = Object.assign({}, action.playlists[i]); - case 'm3u': - playlist.can_edit = true - break + // Detect editability + switch (helpers.uriSource(playlist.uri)){ - case 'spotify': - if (store.getState().spotify.authorization && store.getState().spotify.me){ - playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id) - } - } + case 'm3u': + playlist.can_edit = true + break - if (playlists[action.key] !== undefined){ - var existing_playlist = playlists[action.key]; - - if (existing_playlist.tracks && playlist.tracks){ - var tracks = [...existing_playlist.tracks, ...playlist.tracks]; - } else if (existing_playlist.tracks){ - var tracks = existing_playlist.tracks; - } else if (action.playlist.tracks){ - var tracks = playlist.tracks; - } else { - var tracks = []; + case 'spotify': + if (store.getState().spotify.authorization && store.getState().spotify.me){ + playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id) + } } - playlist = Object.assign( - {}, - existing_playlist, - playlist - ) + if (playlists[playlist.uri] !== undefined){ + var existing_playlist = playlists[playlist.uri]; + + if (existing_playlist.tracks && playlist.tracks){ + var tracks = [...existing_playlist.tracks, ...playlist.tracks]; + } else if (existing_playlist.tracks){ + var tracks = existing_playlist.tracks; + } else if (action.playlist.tracks){ + var tracks = playlist.tracks; + } else { + var tracks = []; + } + + playlist = Object.assign({tracks: tracks}, existing_playlist, playlist); + } + + // Load our tracks + if (playlist.tracks){ + var tracks = helpers.formatTracks(playlist.tracks); + var tracks_uris = helpers.arrayOf('uri', tracks); + playlist.tracks_uris = tracks_uris; + delete playlist.tracks; + tracks_loaded = [...tracks_loaded, ...tracks]; + } + + // Update index + playlists[playlist.uri] = playlist; } // Load our tracks - if (playlist.tracks){ - var tracks = helpers.formatTracks(playlist.tracks); - var tracks_uris = helpers.arrayOf('uri', tracks); - playlist.tracks_uris = tracks_uris; - delete playlist.tracks; + store.dispatch({ + type: 'TRACKS_LOADED', + tracks: tracks_loaded + }); - store.dispatch({ - type: 'TRACKS_LOADED', - tracks: tracks - }); - } - - // Update index - playlists[action.key] = playlist; store.dispatch({ type: 'UPDATE_PLAYLISTS_INDEX', playlists: playlists @@ -505,17 +526,20 @@ const CoreMiddleware = (function(){ next(action); break; - case 'USER_LOADED': - var users = Object.assign([], core.users) + case 'USERS_LOADED': + var users = Object.assign([], core.users); - if (users[action.key]){ - var user = Object.assign({}, users[action.key], action.user) - } else { - var user = Object.assign({}, action.user) + for (var i = 0; i < action.users.length; i++){ + var user = Object.assign({}, action.users[i]); + + if (users[user.uri]){ + user = Object.assign({}, users[user.uri], user); + } + + users[action.key] = user; } // Update index - users[action.key] = user; store.dispatch({ type: 'UPDATE_USERS_INDEX', users: users diff --git a/src/js/services/genius/actions.js b/src/js/services/genius/actions.js index 7ca13915..447b68f0 100755 --- a/src/js/services/genius/actions.js +++ b/src/js/services/genius/actions.js @@ -64,8 +64,8 @@ export function getTrackLyrics(uri, url){ dispatch({ type: 'TRACK_LOADED', - key: uri, track: { + uri: uri, lyrics: null, lyrics_url: null } @@ -89,8 +89,8 @@ export function getTrackLyrics(uri, url){ dispatch({ type: 'TRACK_LOADED', - key: uri, track: { + uri: uri, lyrics: lyrics_html, lyrics_url: url } @@ -131,8 +131,8 @@ export function findTrackLyrics(track){ } dispatch({ type: 'TRACK_LOADED', - key: track.uri, track: { + uri: track.uri, lyrics_results: lyrics_results } }); diff --git a/src/js/services/lastfm/actions.js b/src/js/services/lastfm/actions.js index 17e35954..90047323 100755 --- a/src/js/services/lastfm/actions.js +++ b/src/js/services/lastfm/actions.js @@ -189,8 +189,8 @@ export function loveTrack(uri, artist, track){ response => { dispatch({ type: 'TRACK_LOADED', - key: uri, track: { + uri: uri, userloved: true } }); @@ -208,8 +208,8 @@ export function unloveTrack(uri, artist, track){ response => { dispatch({ type: 'TRACK_LOADED', - key: uri, track: { + uri: uri, userloved: false } }); @@ -255,8 +255,8 @@ export function getArtist(uri, artist, mbid = false){ if (response.artist){ dispatch({ type: 'ARTIST_LOADED', - key: uri, artist: { + uri: uri, images: response.artist.image, bio: response.artist.bio, listeners: parseInt(response.artist.stats.listeners), @@ -315,12 +315,14 @@ export function getTrack(track, artist_name = null, track_name = null){ if (response.track){ var merged_track = Object.assign( {}, + { + uri: track.uri + }, response.track, track ); dispatch({ type: 'TRACK_LOADED', - key: merged_track.uri, track: merged_track }); } diff --git a/src/js/services/lastfm/middleware.js b/src/js/services/lastfm/middleware.js index feaac867..3d4633b5 100755 --- a/src/js/services/lastfm/middleware.js +++ b/src/js/services/lastfm/middleware.js @@ -25,9 +25,8 @@ const LastfmMiddleware = (function(){ } ); store.dispatch({ - type: "USER_LOADED", - key: user.uri, - user: user + type: "USERS_LOADED", + users: [user] }); next(action); break; diff --git a/src/js/services/spotify/actions.js b/src/js/services/spotify/actions.js index f56d1080..791578f2 100755 --- a/src/js/services/spotify/actions.js +++ b/src/js/services/spotify/actions.js @@ -1166,9 +1166,8 @@ export function getUser(uri){ .then( response => { dispatch({ - type: 'USER_LOADED', - key: response.uri, - user: response + type: 'USERS_LOADED', + users: [response] }); }, error => { diff --git a/src/js/services/spotify/middleware.js b/src/js/services/spotify/middleware.js index 716da34f..02fdbb76 100755 --- a/src/js/services/spotify/middleware.js +++ b/src/js/services/spotify/middleware.js @@ -413,9 +413,8 @@ const SpotifyMiddleware = (function(){ ReactGA.event({category: 'Spotify', action: 'Authorization verified', label: action.data.id}); store.dispatch({ - type: 'USER_LOADED', - key: action.data.uri, - user: action.data + type: 'USERS_LOADED', + users: [action.data] }) next(action); diff --git a/src/js/views/Playlist.js b/src/js/views/Playlist.js index 647375db..28517d2b 100755 --- a/src/js/views/Playlist.js +++ b/src/js/views/Playlist.js @@ -167,6 +167,16 @@ class Playlist extends React.Component{ ) } + var tracks = []; + if (this.props.playlist.tracks_uris && this.props.tracks){ + for (var i = 0; i < this.props.playlist.tracks_uris.length; i++){ + var uri = this.props.playlist.tracks_uris[i] + if (this.props.tracks.hasOwnProperty(uri)){ + tracks.push(this.props.tracks[uri]) + } + } + } + return (