From 54e523d69cc610fb994125eb7b2c3ec829575077 Mon Sep 17 00:00:00 2001 From: James Barnsley Date: Sun, 7 May 2017 09:29:18 +1200 Subject: [PATCH] M3U uri type as playlist; Playing local playlist; Play playlist offset +1 --- src/js/helpers.js | 4 +++ src/js/services/mopidy/actions.js | 5 ++-- src/js/services/mopidy/middleware.js | 44 ++++++++++++++++------------ src/js/views/Playlist.js | 2 +- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/js/helpers.js b/src/js/helpers.js index 3ac14dd2..1c3ed18a 100755 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -215,6 +215,10 @@ export let getFromUri = function(element,uri){ export let uriType = function( uri ){ var exploded = uri.split(':') + if (exploded[0] == 'm3u'){ + return 'playlist' + } + switch (exploded[1]){ case 'track': case 'artist': diff --git a/src/js/services/mopidy/actions.js b/src/js/services/mopidy/actions.js index 54fca06a..2a873130 100755 --- a/src/js/services/mopidy/actions.js +++ b/src/js/services/mopidy/actions.js @@ -57,13 +57,14 @@ export function playURIs(uris, from_uri = null){ } } -export function enqueueURIs(uris, from_uri = null, next = false, at_position = null){ +export function enqueueURIs(uris, from_uri = null, next = false, at_position = null, offset = 0){ return { type: 'MOPIDY_ENQUEUE_URIS', uris: uris, at_position: at_position, next: next, - from_uri: from_uri + from_uri: from_uri, + offset: offset } } diff --git a/src/js/services/mopidy/middleware.js b/src/js/services/mopidy/middleware.js index 9784fed5..a0ecdc68 100755 --- a/src/js/services/mopidy/middleware.js +++ b/src/js/services/mopidy/middleware.js @@ -249,29 +249,37 @@ const MopidyMiddleware = (function(){ break case 'MOPIDY_PLAY_PLAYLIST': - if (helpers.uriSource(action.uri) == 'spotify'){ - // playlist already in index - if (store.getState().ui.playlists.hasOwnProperty(action.uri)){ - - // make sure we didn't get this playlist from Mopidy-Spotify - // if we did, we'd have a cached version on server so no need to fetch - if (!store.getState().ui.playlists[action.uri].is_mopidy){ - store.dispatch(uiActions.startProcess('MOPIDY_ENQUEUE_URIS', 'Fetching tracks')) - store.dispatch(spotifyActions.getAllPlaylistTracks(action.uri)) - break - } - - // not loaded, so we need to fetch - } else { + // playlist already in index + if (store.getState().ui.playlists.hasOwnProperty(action.uri)){ + + // make sure we didn't get this playlist from Mopidy-Spotify + // if we did, we'd have a cached version on server so no need to fetch + if (!store.getState().ui.playlists[action.uri].is_mopidy){ store.dispatch(uiActions.startProcess('MOPIDY_ENQUEUE_URIS', 'Fetching tracks')) store.dispatch(spotifyActions.getAllPlaylistTracks(action.uri)) break } + + // it's a spotify playlist that we haven't loaded + // we need to fetch via HTTP API to avoid timeout + } else if (helpers.uriSource(action.uri) == 'spotify'){ + store.dispatch(uiActions.startProcess('MOPIDY_ENQUEUE_URIS', 'Fetching tracks')) + store.dispatch(spotifyActions.getAllPlaylistTracks(action.uri)) + break } - // default to load it as per usual - store.dispatch(mopidyActions.playURIs([action.uri], action.uri)) + // fetch the playlist tracks via backend + // add each track by URI + instruct(socket, store, 'playlists.lookup', {uri: action.uri}) + .then( response => { + if (typeof(response.tracks) === 'undefined'){ + store.dispatch(uiActions.createNotification('Failed to load playlist tracks','bad')) + } else { + var tracks_uris = helpers.asURIs(response.tracks) + store.dispatch(mopidyActions.playURIs(tracks_uris, action.uri)) + } + }) break @@ -294,7 +302,7 @@ const MopidyMiddleware = (function(){ uris: uris.splice(0,batch_size), at_position: action.at_position, next: action.next, - offset: batch_size * batches.length, + offset: action.offset + (batch_size * batches.length), from_uri: action.from_uri }) } @@ -425,7 +433,7 @@ const MopidyMiddleware = (function(){ // this means our UI feels snappier as the first track shows up quickly setTimeout( function(){ - store.dispatch(mopidyActions.enqueueURIs( action.uris, action.from_uri, 1 )) + store.dispatch(mopidyActions.enqueueURIs(action.uris, action.from_uri, true, null, 1)) }, 100 ) diff --git a/src/js/views/Playlist.js b/src/js/views/Playlist.js index dc7489d0..ed127bc8 100755 --- a/src/js/views/Playlist.js +++ b/src/js/views/Playlist.js @@ -75,7 +75,7 @@ class Playlist extends React.Component{ follow(){ ReactGA.event({ category: 'Playlist', action: 'Follow', label: this.props.playlist.uri }) - this.props.spotifyActions.toggleFollowingPlaylist( this.props.playlist.uri, 'PUT' ) + this.props.spotifyActions.toggleFollowingPlaylist(this.props.playlist.uri, 'PUT') } // TODO: Once unfollowing occurs, remove playlist from global playlists list