diff --git a/src/js/services/core/middleware.js b/src/js/services/core/middleware.js
index 48bce9b1..e2e8f129 100755
--- a/src/js/services/core/middleware.js
+++ b/src/js/services/core/middleware.js
@@ -254,6 +254,7 @@ const CoreMiddleware = (function(){
next(action)
break
+ // Get assets from all of our providers
case 'GET_LIBRARY_PLAYLISTS':
if (store.getState().spotify.connected){
store.dispatch(spotifyActions.getLibraryPlaylists())
@@ -264,6 +265,7 @@ const CoreMiddleware = (function(){
next(action)
break
+ // Get assets from all of our providers
case 'GET_LIBRARY_ALBUMS':
if (store.getState().spotify.connected){
store.dispatch(spotifyActions.getLibraryAlbums())
@@ -274,6 +276,7 @@ const CoreMiddleware = (function(){
next(action)
break
+ // Get assets from all of our providers
case 'GET_LIBRARY_ARTISTS':
if (store.getState().spotify.connected){
store.dispatch(spotifyActions.getLibraryArtists())
diff --git a/src/js/services/mopidy/middleware.js b/src/js/services/mopidy/middleware.js
index 391329a6..7756f0a4 100755
--- a/src/js/services/mopidy/middleware.js
+++ b/src/js/services/mopidy/middleware.js
@@ -592,12 +592,20 @@ const MopidyMiddleware = (function(){
// drop in our URI list
var playlist_uris = helpers.arrayOf('uri',response)
+ var playlist_uris_filtered = []
- store.dispatch({ type: 'LIBRARY_PLAYLISTS_LOADED', uris: playlist_uris });
+ // Remove any Spotify playlists. These will be handled by our Spotify API
+ for (var i = 0; i < playlist_uris.length; i++){
+ if (helpers.uriSource(playlist_uris[i]) != 'spotify'){
+ playlist_uris_filtered.push(playlist_uris[i])
+ }
+ }
+
+ store.dispatch({ type: 'MOPIDY_LIBRARY_PLAYLISTS_LOADED', uris: playlist_uris_filtered });
// get the full playlist objects
- for (var i = 0; i < response.length; i++ ){
- instruct( socket, store, 'playlists.lookup', { uri: response[i].uri })
+ for (var i = 0; i < playlist_uris_filtered.length; i++ ){
+ instruct( socket, store, 'playlists.lookup', { uri: playlist_uris_filtered[i] })
.then( response => {
var source = helpers.uriSource(response.uri)
var playlist = Object.assign(
@@ -850,7 +858,7 @@ const MopidyMiddleware = (function(){
var uris = helpers.arrayOf('uri',response)
store.dispatch({
- type: 'LIBRARY_ALBUMS_LOADED',
+ type: 'MOPIDY_LIBRARY_ALBUMS_LOADED',
uris: uris
});
@@ -860,8 +868,6 @@ const MopidyMiddleware = (function(){
break;
case 'MOPIDY_LIBRARY_ALBUMS_PROCESSOR':
- console.log(action)
-
if (store.getState().ui.processes['MOPIDY_LIBRARY_ALBUMS_PROCESSOR'] !== undefined){
var processor = store.getState().ui.processes['MOPIDY_LIBRARY_ALBUMS_PROCESSOR']
diff --git a/src/js/services/mopidy/reducer.js b/src/js/services/mopidy/reducer.js
index a3b75df8..7a1e5092 100755
--- a/src/js/services/mopidy/reducer.js
+++ b/src/js/services/mopidy/reducer.js
@@ -122,6 +122,35 @@ export default function reducer(mopidy = {}, action){
enqueue_uris_batches: batches
});
+
+ /**
+ * Library
+ **/
+
+ case 'MOPIDY_LIBRARY_PLAYLISTS_LOADED':
+ if (mopidy.library_playlists){
+ var uris = [...mopidy.library_playlists,...action.uris]
+ } else {
+ var uris = action.uris
+ }
+ return Object.assign({}, mopidy, { library_playlists: uris })
+
+ case 'MOPIDY_LIBRARY_ARTISTS_LOADED':
+ if (mopidy.library_artists){
+ var uris = [...mopidy.library_artists,...action.uris]
+ } else {
+ var uris = action.uris
+ }
+ return Object.assign({}, mopidy, { library_artists: uris })
+
+ case 'MOPIDY_LIBRARY_ALBUMS_LOADED':
+ if (mopidy.library_albums){
+ var uris = [...mopidy.library_albums,...action.uris]
+ } else {
+ var uris = action.uris
+ }
+ return Object.assign({}, mopidy, { library_albums: uris })
+
default:
return mopidy
}
diff --git a/src/js/services/spotify/actions.js b/src/js/services/spotify/actions.js
index 6915adde..9eaebf69 100755
--- a/src/js/services/spotify/actions.js
+++ b/src/js/services/spotify/actions.js
@@ -912,19 +912,6 @@ export function getArtists( uris ){
}
-export function getLibraryArtists(){
- return (dispatch, getState) => {
- sendRequest( dispatch, getState, 'me/following?type=artist&limit=50' )
- .then( response => {
- dispatch({
- type: 'SPOTIFY_LIBRARY_ARTISTS_LOADED',
- data: response
- })
- });
- }
-}
-
-
export function playArtistTopTracks(uri){
return (dispatch, getState) => {
const artists = getState().ui.artists
@@ -1305,54 +1292,13 @@ export function reorderPlaylistTracks( uri, range_start, range_length, insert_be
**/
-/**
- * ALbums
- **/
-
-export function getLibraryAlbums(){
- return (dispatch, getState) => {
- dispatch(uiActions.startProcess('SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR','Loading Spotify library albums', {next: 'me/albums?limit=50'}))
- }
-}
-
-export function getLibraryAlbumsProcessor(data){
- return (dispatch, getState) => {
- sendRequest(dispatch, getState, data.next)
- .then( response => {
-
- dispatch({
- type: 'SPOTIFY_LIBRARY_ALBUMS_LOADED',
- albums: response.items
- })
-
- // Check to see if we've been cancelled
- if (getState().ui.processes['SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR'] !== undefined){
- var processor = getState().ui.processes['SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR']
-
- if (processor.cancelling){
- dispatch(uiActions.processFinished('SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR'))
- return false
- }
- }
-
- // We got a next link, so we've got more work to be done
- if (response.next){
- dispatch(uiActions.runProcess('SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR', {next: response.next}))
- } else {
- dispatch(uiActions.processFinished('SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR'))
- }
- });
- }
-}
-
-
/**
* Playlists
**/
export function getLibraryPlaylists(){
return (dispatch, getState) => {
- dispatch(uiActions.startProcess('SPOTIFY_GET_LIBRARY_PLAYLISTS_PROCESSOR','Loading Spotify library playlists', {next: 'me/playlists?limit=50'}))
+ dispatch(uiActions.startProcess('SPOTIFY_GET_LIBRARY_PLAYLISTS_PROCESSOR','Loading Spotify playlists', {next: 'me/playlists?limit=50'}))
}
}
@@ -1384,4 +1330,86 @@ export function getLibraryPlaylistsProcessor(data){
}
});
}
+}
+
+
+/**
+ * Artists
+ **/
+
+export function getLibraryArtists(){
+ return (dispatch, getState) => {
+ dispatch(uiActions.startProcess('SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR','Loading Spotify artists', {next: 'me/following?type=artist&limit=50'}))
+ }
+}
+
+export function getLibraryArtistsProcessor(data){
+ return (dispatch, getState) => {
+ sendRequest(dispatch, getState, data.next)
+ .then( response => {
+
+ dispatch({
+ type: 'SPOTIFY_LIBRARY_ARTISTS_LOADED',
+ artists: response.artists.items
+ })
+
+ // Check to see if we've been cancelled
+ if (getState().ui.processes['SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR'] !== undefined){
+ var processor = getState().ui.processes['SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR']
+
+ if (processor.cancelling){
+ dispatch(uiActions.processFinished('SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR'))
+ return false
+ }
+ }
+
+ // We got a next link, so we've got more work to be done
+ if (response.artists.next){
+ dispatch(uiActions.runProcess('SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR', {next: response.artists.next}))
+ } else {
+ dispatch(uiActions.processFinished('SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR'))
+ }
+ });
+ }
+}
+
+
+/**
+ * ALbums
+ **/
+
+export function getLibraryAlbums(){
+ return (dispatch, getState) => {
+ dispatch(uiActions.startProcess('SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR','Loading Spotify albums', {next: 'me/albums?limit=50'}))
+ }
+}
+
+export function getLibraryAlbumsProcessor(data){
+ return (dispatch, getState) => {
+ sendRequest(dispatch, getState, data.next)
+ .then( response => {
+
+ dispatch({
+ type: 'SPOTIFY_LIBRARY_ALBUMS_LOADED',
+ albums: response.items
+ })
+
+ // Check to see if we've been cancelled
+ if (getState().ui.processes['SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR'] !== undefined){
+ var processor = getState().ui.processes['SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR']
+
+ if (processor.cancelling){
+ dispatch(uiActions.processFinished('SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR'))
+ return false
+ }
+ }
+
+ // We got a next link, so we've got more work to be done
+ if (response.next){
+ dispatch(uiActions.runProcess('SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR', {next: response.next}))
+ } else {
+ dispatch(uiActions.processFinished('SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR'))
+ }
+ });
+ }
}
\ No newline at end of file
diff --git a/src/js/services/spotify/middleware.js b/src/js/services/spotify/middleware.js
index a282d0bb..6c8e10bc 100755
--- a/src/js/services/spotify/middleware.js
+++ b/src/js/services/spotify/middleware.js
@@ -208,19 +208,22 @@ const SpotifyMiddleware = (function(){
playlists: playlists
});
- store.dispatch({
- type: 'LIBRARY_PLAYLISTS_LOADED',
- uris: helpers.arrayOf('uri',playlists)
- });
+ // Append our action with the uris. This gets handed down to subsequent middleware and our reducer.
+ action.uris = helpers.arrayOf('uri',playlists)
+ next(action)
+ break
+
+ case 'SPOTIFY_GET_LIBRARY_ARTISTS_PROCESSOR':
+ store.dispatch(spotifyActions.getLibraryArtistsProcessor(action.data))
break
case 'SPOTIFY_LIBRARY_ARTISTS_LOADED':
var artists = []
- for (var i = 0; i < action.data.artists.items.length; i++){
+ for (var i = 0; i < action.artists.length; i++){
artists.push(
Object.assign(
{},
- action.data.artists.items[i],
+ action.artists[i],
{
source: 'spotify',
in_library: true // assumed because we asked for library items
@@ -232,12 +235,10 @@ const SpotifyMiddleware = (function(){
type: 'ARTISTS_LOADED',
artists: artists
});
- store.dispatch({
- type: 'LIBRARY_ARTISTS_LOADED',
- uris: helpers.arrayOf('uri',artists),
- more: action.data.artists.next,
- total: action.data.artists.total
- });
+
+ // Append our action with the uris. This gets handed down to subsequent middleware and our reducer.
+ action.uris = helpers.arrayOf('uri',artists)
+ next(action)
break
case 'SPOTIFY_GET_LIBRARY_ALBUMS_PROCESSOR':
@@ -268,10 +269,9 @@ const SpotifyMiddleware = (function(){
albums: albums
});
- store.dispatch({
- type: 'LIBRARY_ALBUMS_LOADED',
- uris: helpers.arrayOf('uri',albums)
- });
+ // Append our action with the uris. This gets handed down to subsequent middleware and our reducer.
+ action.uris = helpers.arrayOf('uri',albums)
+ next(action)
break
case 'SPOTIFY_FAVORITES_LOADED':
diff --git a/src/js/services/spotify/reducer.js b/src/js/services/spotify/reducer.js
index 60e14a33..c0822506 100755
--- a/src/js/services/spotify/reducer.js
+++ b/src/js/services/spotify/reducer.js
@@ -73,73 +73,6 @@ export default function reducer(spotify = {}, action){
case 'SPOTIFY_ME_LOADED':
return Object.assign({}, spotify, { me: action.data })
- case 'SPOTIFY_LIBRARY_ALBUMS_LOADED':
- if( !action.data ) return Object.assign({}, spotify)
- var albums = []
- for( var i = 0; i < action.data.items.length; i++ ){
- albums.push( Object.assign(
- {},
- action.data.items[i].album,
- {
- added_at: action.data.items[i].added_at
- }
- ))
- }
- console.log(action)
- return Object.assign({}, spotify, {
- library_albums: albums,
- library_albums_spotify_more: action.data.next
- })
-
- case 'SPOTIFY_LIBRARY_ALBUMS_LOADED_MORE':
- var albums = []
- for( var i = 0; i < action.data.items.length; i++ ){
- albums.push( Object.assign(
- {},
- action.data.items[i].album,
- {
- added_at: action.data.items[i].added_at
- }
- ))
- }
- return Object.assign({}, spotify, {
- library_albums: [...spotify.library_albums, ...albums ],
- library_albums_spotify_more: action.data.next
- })
-
- case 'SPOTIFY_LIBRARY_TRACKS_LOADED':
- if( !action.data ) return Object.assign({}, spotify)
- var tracks = Object.assign([], action.data.items)
- for( var i = 0; i < tracks.length; i++ ){
- tracks[i] = Object.assign(
- {},
- tracks[i].track,
- {
- added_at: tracks[i].added_at
- }
- )
- }
- return Object.assign({}, spotify, {
- library_tracks: tracks,
- library_tracks_more: action.data.next
- })
-
- case 'SPOTIFY_LIBRARY_TRACKS_LOADED_MORE':
- var tracks = Object.assign([], action.data.items)
- for( var i = 0; i < tracks.length; i++ ){
- tracks[i] = Object.assign(
- {},
- tracks[i].track,
- {
- added_at: tracks[i].added_at
- }
- )
- }
- return Object.assign({}, spotify, {
- library_tracks: [...spotify.library_tracks, ...tracks],
- library_tracks_more: action.data.next
- })
-
case 'SPOTIFY_FEATURED_PLAYLISTS_LOADED':
return Object.assign({}, spotify, { featured_playlists: action.data })
@@ -212,6 +145,35 @@ export default function reducer(spotify = {}, action){
autocomplete_results: autocomplete_results
})
+
+ /**
+ * Library
+ **/
+
+ case 'SPOTIFY_LIBRARY_PLAYLISTS_LOADED':
+ if (spotify.library_playlists){
+ var uris = [...spotify.library_playlists,...action.uris]
+ } else {
+ var uris = action.uris
+ }
+ return Object.assign({}, spotify, { library_playlists: uris })
+
+ case 'SPOTIFY_LIBRARY_ARTISTS_LOADED':
+ if (spotify.library_artists){
+ var uris = [...spotify.library_artists,...action.uris]
+ } else {
+ var uris = action.uris
+ }
+ return Object.assign({}, spotify, { library_artists: uris })
+
+ case 'SPOTIFY_LIBRARY_ALBUMS_LOADED':
+ if (spotify.library_albums){
+ var uris = [...spotify.library_albums,...action.uris]
+ } else {
+ var uris = action.uris
+ }
+ return Object.assign({}, spotify, { library_albums: uris })
+
default:
return spotify
}
diff --git a/src/js/views/library/LibraryAlbums.js b/src/js/views/library/LibraryAlbums.js
index 770c7536..aa5ca37d 100755
--- a/src/js/views/library/LibraryAlbums.js
+++ b/src/js/views/library/LibraryAlbums.js
@@ -26,17 +26,40 @@ class LibraryAlbums extends React.Component{
}
componentDidMount(){
- if (!this.props.library_albums){
- this.props.coreActions.getLibraryAlbums()
+ if (!this.props.mopidy_library_albums && this.props.mopidy_connected && (this.props.filter == 'all' || this.props.filter == 'local')){
+ this.props.mopidyActions.getLibraryAlbums()
+ }
+
+ if (!this.props.spotify_library_albums && this.props.spotify_connected && (this.props.filter == 'all' || this.props.filter == 'spotify')){
+ this.props.spotifyActions.getLibraryAlbums()
}
}
componentWillReceiveProps(newProps){
- if (!this.props.spotify_connected && newProps.spotify_connected){
- this.props.spotifyActions.getLibraryAlbums()
+ if (newProps.mopidy_connected && (newProps.filter == 'all' || newProps.filter == 'local')){
+
+ // We've just connected
+ if (!this.props.mopidy_connected){
+ this.props.mopidyActions.getLibraryAlbums()
+ }
+
+ // Filter changed, but we haven't got this provider's library yet
+ if (this.props.filter != 'all' && this.props.filter != 'local' && !newProps.mopidy_library_albums){
+ this.props.mopidyActions.getLibraryAlbums()
+ }
}
- if (!this.props.mopidy_connected && newProps.mopidy_connected){
- this.props.mopidyActions.getLibraryAlbums()
+
+ if (newProps.spotify_connected && (newProps.filter == 'all' || newProps.filter == 'spotify')){
+
+ // We've just connected
+ if (!this.props.spotify_connected){
+ this.props.spotifyActions.getLibraryAlbums()
+ }
+
+ // Filter changed, but we haven't got this provider's library yet
+ if (this.props.filter != 'all' && this.props.filter != 'spotify' && !newProps.spotify_library_albums){
+ this.props.spotifyActions.getLibraryAlbums()
+ }
}
}
@@ -157,10 +180,24 @@ class LibraryAlbums extends React.Component{
render(){
var albums = []
- if (this.props.library_albums && this.props.albums){
- for (var i = 0; i < this.props.library_albums.length; i++){
- var uri = this.props.library_albums[i]
+ // Spotify library items
+ if (this.props.spotify_library_albums && (this.props.filter == 'all' || this.props.filter == 'spotify')){
+ for (var i = 0; i < this.props.spotify_library_albums.length; i++){
+ var uri = this.props.spotify_library_albums[i]
+ if (this.props.albums.hasOwnProperty(uri)){
+ albums.push(this.props.albums[uri])
+ }
+ }
+ }
+
+ // Mopidy library items
+ if (this.props.mopidy_library_albums && (this.props.filter == 'all' || this.props.filter == 'local')){
+ for (var i = 0; i < this.props.mopidy_library_albums.length; i++){
+
+ // Construct item placeholder. This is used as Mopidy needs to
+ // lookup ref objects to get the full object which can take some time
+ var uri = this.props.mopidy_library_albums[i]
var source = helpers.uriSource(uri)
var album = {
uri: uri,
@@ -171,29 +208,12 @@ class LibraryAlbums extends React.Component{
album = this.props.albums[uri]
}
- switch (this.props.filter){
-
- case 'spotify':
- if (source == 'spotify'){
- albums.push(album)
- }
- break
-
- case 'local':
- if (source == 'local'){
- albums.push(album)
- }
- break
-
- default:
- albums.push(album)
- break
- }
+ albums.push(album)
}
+ }
- if( this.props.sort ){
- albums = helpers.sortItems(albums, this.props.sort, this.props.sort_reverse)
- }
+ if (this.props.sort){
+ albums = helpers.sortItems(albums, this.props.sort, this.props.sort_reverse)
}
var filter_options = [
@@ -259,11 +279,7 @@ class LibraryAlbums extends React.Component{