From bc1d173ab21bc7e710c74e86bf7e2f1edf54726a Mon Sep 17 00:00:00 2001 From: James Barnsley Date: Fri, 2 Jun 2017 16:16:48 +1200 Subject: [PATCH] Moving tracks to index; Discover with URI properties; Get simple artist objects by default - speed improvements --- src/js/components/AddSeedField.js | 2 +- src/js/components/ContextMenu.js | 7 +++-- src/js/components/FullPlayer.js | 8 ++++- src/js/services/spotify/actions.js | 50 ++++++++++++++++++------------ src/js/services/ui/reducer.js | 4 +-- src/js/views/Artist.js | 4 +-- 6 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/js/components/AddSeedField.js b/src/js/components/AddSeedField.js index b0797a9f..cfb4a152 100755 --- a/src/js/components/AddSeedField.js +++ b/src/js/components/AddSeedField.js @@ -67,7 +67,7 @@ class AddSeedField extends React.Component{ switch (helpers.uriType(item.uri)){ case 'artist': - this.props.uiActions.albumLoaded(item.uri,item) + this.props.uiActions.artistLoaded(item.uri,item) break case 'track': diff --git a/src/js/components/ContextMenu.js b/src/js/components/ContextMenu.js index ba588974..2de765ad 100755 --- a/src/js/components/ContextMenu.js +++ b/src/js/components/ContextMenu.js @@ -407,7 +407,7 @@ class ContextMenu extends React.Component{ var go_to_recommendations = ( this.goToRecommendations(e)}> - More like this + Discover similar ) @@ -464,7 +464,7 @@ class ContextMenu extends React.Component{
{start_radio} {this.canBeInLibrary() ? toggle_in_library : null} - {go_to_recommendations} + {context.source == 'spotify' ? go_to_recommendations : null} {copy_uris}
) @@ -513,7 +513,8 @@ class ContextMenu extends React.Component{ {play_uris_next} {add_to_queue} {add_to_playlist} - {start_radio} + {context.source == 'spotify' ? start_radio : null} + {context.source == 'spotify' ? go_to_recommendations : null} {copy_uris} ) diff --git a/src/js/components/FullPlayer.js b/src/js/components/FullPlayer.js index 8604a8a9..dbf80a1d 100755 --- a/src/js/components/FullPlayer.js +++ b/src/js/components/FullPlayer.js @@ -75,12 +75,17 @@ class FullPlayer extends React.Component{ ) } + var images = this.props.current_track.album.images + if (typeof(this.props.tracks[this.props.current_track.uri]) !== 'undefined'){ + images = this.props.tracks[this.props.current_track.uri].album.images + } + var link = null if( this.props.current_track.album.uri ) link = '/album/'+this.props.current_track.album.uri return ( this.handleContextMenu(e,this.props.current_track.album)}> {this.props.radio_enabled ? : null} - + ) } @@ -140,6 +145,7 @@ class FullPlayer extends React.Component{ const mapStateToProps = (state, ownProps) => { return { radio_enabled: (state.ui.radio && state.ui.radio.enabled ? true : false), + tracks: state.ui.tracks, current_track: state.ui.current_track, play_state: state.mopidy.play_state, time_position: state.mopidy.time_position, diff --git a/src/js/services/spotify/actions.js b/src/js/services/spotify/actions.js index 65190f52..6b887655 100755 --- a/src/js/services/spotify/actions.js +++ b/src/js/services/spotify/actions.js @@ -796,26 +796,33 @@ export function getGenres(){ * Get a single artist * * @param uri string + * @param full boolean (whether we want a full artist object) **/ -export function getArtist( uri ){ +export function getArtist(uri, full = false){ return (dispatch, getState) => { - var artist = {}; - - // get both the artist and the top tracks - $.when( + // Start with an empty object + // As each requests completes, they'll add to this object + var artist = {} + // We need our artist, obviously + var requests = [ sendRequest( dispatch, getState, 'artists/'+ helpers.getFromUri('artistid', uri) ) + .then( response => { + Object.assign(artist, response); + }) + ] + + // Do we want a full artist, with all supporting material? + if (full){ + requests.push( + sendRequest( dispatch, getState, 'artists/'+ helpers.getFromUri('artistid', uri) +'/top-tracks?country='+getState().spotify.country ) .then( response => { Object.assign(artist, response); - }), - - sendRequest( dispatch, getState, 'artists/'+ helpers.getFromUri('artistid', uri) +'/top-tracks?country='+getState().spotify.country ) - .then( response => { - Object.assign(artist, response); - }), - - sendRequest( dispatch, getState, 'artists/'+ helpers.getFromUri('artistid', uri) +'/related-artists' ) + }) + ) + requests.push( + sendRequest( dispatch, getState, 'artists/'+ helpers.getFromUri('artistid', uri) +'/related-artists' ) .then( response => { dispatch({ type: 'ARTISTS_LOADED', @@ -823,8 +830,11 @@ export function getArtist( uri ){ }); Object.assign(artist, { related_artists_uris: helpers.asURIs(response.artists) }); }) + ) + } - ).then(() => { + // Run our requests + $.when.apply($, requests).then(() => { if (artist.musicbrainz_id){ dispatch(lastfmActions.getArtist(artist.uri, false, artist.musicbrainz_id)) @@ -836,18 +846,20 @@ export function getArtist( uri ){ type: 'ARTIST_LOADED', key: artist.uri, artist: artist - }); + }) - // now go get our artist albums - sendRequest( dispatch, getState, 'artists/'+ helpers.getFromUri('artistid', uri) +'/albums?market='+getState().spotify.country ) + // Now go get our artist albums + if (full){ + sendRequest( dispatch, getState, 'artists/'+ helpers.getFromUri('artistid', uri) +'/albums?market='+getState().spotify.country ) .then( response => { dispatch({ type: 'SPOTIFY_ARTIST_ALBUMS_LOADED', data: response, key: uri - }); + }) }) - }); + } + }) } } diff --git a/src/js/services/ui/reducer.js b/src/js/services/ui/reducer.js index 8234150c..86a501d5 100755 --- a/src/js/services/ui/reducer.js +++ b/src/js/services/ui/reducer.js @@ -410,7 +410,7 @@ export default function reducer(ui = {}, action){ **/ case 'TRACK_LOADED': - var tracks = Object.assign([], ui.tracks) + var tracks = Object.assign({}, ui.tracks) if (tracks[action.key]){ var track = Object.assign({}, tracks[action.key], action.track) @@ -422,7 +422,7 @@ export default function reducer(ui = {}, action){ return Object.assign({}, ui, { tracks: tracks }); case 'TRACKS_LOADED': - var tracks = Object.assign([], ui.tracks) + var tracks = Object.assign({}, ui.tracks) for (var i = 0; i < action.tracks.length; i++){ var track = action.tracks[i] diff --git a/src/js/views/Artist.js b/src/js/views/Artist.js index 9ce5f48b..af626c44 100755 --- a/src/js/views/Artist.js +++ b/src/js/views/Artist.js @@ -61,7 +61,7 @@ class Artist extends React.Component{ if (props.artist && props.artist.albums_uris && props.artist.related_artists_uris){ console.info('Loading spotify artist from index') }else{ - this.props.spotifyActions.getArtist( props.params.uri ); + this.props.spotifyActions.getArtist(props.params.uri, true); } break @@ -70,7 +70,7 @@ class Artist extends React.Component{ if (props.artist && props.artist.images){ console.info('Loading local artist from index') } else { - this.props.mopidyActions.getArtist( props.params.uri ); + this.props.mopidyActions.getArtist(props.params.uri); } } break