diff --git a/src/js/components/FullPlayer.js b/src/js/components/FullPlayer.js index fae15c3c..761bed13 100755 --- a/src/js/components/FullPlayer.js +++ b/src/js/components/FullPlayer.js @@ -146,7 +146,7 @@ const mapStateToProps = (state, ownProps) => { return { radio_enabled: (state.ui.radio && state.ui.radio.enabled ? true : false), tracks: state.ui.tracks, - current_track: (typeof(state.ui.current_track) !== 'undefined' && typeof(state.ui.tracks) !== 'undefined' && typeof(state.ui.tracks[state.ui.current_track]) !== 'undefined' ? state.ui.tracks[state.ui.current_track] : null), + current_track: (typeof(state.ui.current_track) !== 'undefined' && typeof(state.ui.tracks) !== 'undefined' && typeof(state.ui.tracks[state.ui.current_track.uri]) !== 'undefined' ? state.ui.tracks[state.ui.current_track.uri] : null), play_state: state.mopidy.play_state, time_position: state.mopidy.time_position, consume: state.mopidy.consume, diff --git a/src/js/components/MiniPlayer.js b/src/js/components/MiniPlayer.js index 82fa72dd..ff364cfb 100755 --- a/src/js/components/MiniPlayer.js +++ b/src/js/components/MiniPlayer.js @@ -59,7 +59,7 @@ class MiniPlayer extends React.Component{ const mapStateToProps = (state, ownProps) => { return { - current_track: (typeof(state.ui.current_track) !== 'undefined' && typeof(state.ui.tracks) !== 'undefined' && typeof(state.ui.tracks[state.ui.current_track]) !== 'undefined' ? state.ui.tracks[state.ui.current_track] : null), + current_track: (typeof(state.ui.current_track) !== 'undefined' && typeof(state.ui.tracks) !== 'undefined' && typeof(state.ui.tracks[state.ui.current_track.uri]) !== 'undefined' ? state.ui.tracks[state.ui.current_track.uri] : null), play_state: state.mopidy.play_state } } diff --git a/src/js/components/ProgressSlider.js b/src/js/components/ProgressSlider.js index b3012537..00c36e9a 100755 --- a/src/js/components/ProgressSlider.js +++ b/src/js/components/ProgressSlider.js @@ -53,7 +53,7 @@ class ProgressSlider extends React.Component{ const mapStateToProps = (state, ownProps) => { return { - current_track: state.ui.current_track, + current_track: (typeof(state.ui.current_track) !== 'undefined' && typeof(state.ui.tracks) !== 'undefined' && typeof(state.ui.tracks[state.ui.current_track.uri]) !== 'undefined' ? state.ui.tracks[state.ui.current_track.uri] : null), connected: state.mopidy.connected, time_position: state.mopidy.time_position, play_state: state.mopidy.play_state diff --git a/src/js/components/Sidebar.js b/src/js/components/Sidebar.js index f9f7aa0b..98dc4e4c 100755 --- a/src/js/components/Sidebar.js +++ b/src/js/components/Sidebar.js @@ -112,8 +112,8 @@ const mapStateToProps = (state, ownProps) => { mopidy_connected: state.mopidy.connected, pusher_connected: state.pusher.connected, spotify_connected: state.spotify.connected, - spotify_authorized: state.spotify.authorized, - current_track: (typeof(state.ui.current_track) !== 'undefined' && typeof(state.ui.tracks) !== 'undefined' && typeof(state.ui.tracks[state.ui.current_track]) !== 'undefined' ? state.ui.tracks[state.ui.current_track] : null), + spotify_authorized: state.spotify.authorized, + current_track: (typeof(state.ui.current_track) !== 'undefined' && typeof(state.ui.tracks) !== 'undefined' && typeof(state.ui.tracks[state.ui.current_track.uri]) !== 'undefined' ? state.ui.tracks[state.ui.current_track.uri] : null), dragger: state.ui.dragger } } diff --git a/src/js/services/mopidy/middleware.js b/src/js/services/mopidy/middleware.js index f07604d8..9d6eaf45 100755 --- a/src/js/services/mopidy/middleware.js +++ b/src/js/services/mopidy/middleware.js @@ -995,6 +995,29 @@ const MopidyMiddleware = (function(){ break; + /** + * =============================================================== TRACKS ================ + * ====================================================================================== + **/ + + case 'MOPIDY_CURRENTTLTRACK': + if (!action.data || !action.data.track){ + return mopidy + } + + // Fire off our universal track index loader + store.dispatch({ type: 'TRACK_LOADED', key: action.data.track.uri, track: action.data.track }) + + // When current track is Spotify track, go get the full object + // This is because Mopidy doesn't give us full artist/album objects, without artwork + if (action.data.track.uri.substring(0,14) == 'spotify:track:'){ + store.dispatch( spotifyActions.getTrack( action.data.track.uri ) ) + } + + next(action) + break + + /** * =============================================================== LOCAL ================ * ====================================================================================== diff --git a/src/js/services/spotify/middleware.js b/src/js/services/spotify/middleware.js index 96e10ac8..d171856a 100755 --- a/src/js/services/spotify/middleware.js +++ b/src/js/services/spotify/middleware.js @@ -74,18 +74,6 @@ const SpotifyMiddleware = (function(){ store.dispatch( spotifyActions.savePlaylist( action.key, action.name, action.is_public )) break - // when our mopidy server current track changes - case 'MOPIDY_CURRENTTLTRACK': - - // proceed as usual so we don't inhibit default functionality - next(action) - - // if the current track is a spotify track - if( action.data && action.data.track.uri.substring(0,14) == 'spotify:track:' ){ - store.dispatch( spotifyActions.getTrack( action.data.track.uri ) ) - } - break - // when radio returns case 'PUSHER_RADIO_STARTED': case 'PUSHER_RADIO_CHANGED': diff --git a/src/js/services/ui/reducer.js b/src/js/services/ui/reducer.js index 4dd78c21..8561181e 100755 --- a/src/js/services/ui/reducer.js +++ b/src/js/services/ui/reducer.js @@ -106,24 +106,57 @@ export default function reducer(ui = {}, action){ return Object.assign({}, ui, { current_tracklist: tracklist }); case 'MOPIDY_CURRENTTLTRACK': - if( !action.data ) return ui + if (!action.data) return ui var current_tracklist = [] Object.assign(current_tracklist, ui.current_tracklist) - for( var i = 0; i < current_tracklist.length; i++ ){ + 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 = action.data.track.uri + 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) @@ -404,40 +437,6 @@ export default function reducer(ui = {}, action){ - /** - * Tracks - **/ - - 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 }); - - - - /** * Playlists **/