Batch processor; Merging enqueue and enqueue next

This commit is contained in:
James Barnsley
2017-04-04 21:21:44 +12:00
parent bbd35234a9
commit 9d56a05fc4
3 changed files with 57 additions and 69 deletions

View File

@ -139,7 +139,7 @@ class ContextMenu extends React.Component{
return (helpers.uriSource(this.props.menu.items[0].uri) == 'spotify')
}
toggleInLibrary(in_library){
toggleInLibrary(e, in_library){
this.props.uiActions.hideContextMenu()
if (in_library){
this.props.spotifyActions.following(this.props.menu.items[0].uri, 'DELETE')
@ -148,13 +148,13 @@ class ContextMenu extends React.Component{
}
}
playQueueItem(){
playQueueItem(e){
this.props.uiActions.hideContextMenu()
var tracks = this.props.menu.items;
this.props.mopidyActions.changeTrack( tracks[0].tlid )
}
removeFromQueue(){
removeFromQueue(e){
this.props.uiActions.hideContextMenu()
var tracks = this.props.menu.items;
var tracks_tlids = [];
@ -164,37 +164,32 @@ class ContextMenu extends React.Component{
this.props.mopidyActions.removeTracks( tracks_tlids );
}
playURIs(){
playURIs(e){
this.props.uiActions.hideContextMenu()
this.props.mopidyActions.playURIs(this.props.menu.uris, this.props.menu.tracklist_uri)
}
playURIsNext(){
addToQueue(e, next = false){
this.props.uiActions.hideContextMenu()
this.props.mopidyActions.enqueueURIsNext(this.props.menu.uris, this.props.menu.tracklist_uri)
this.props.mopidyActions.enqueueURIs(this.props.menu.uris, this.props.menu.tracklist_uri, next)
}
addToQueue(){
this.props.uiActions.hideContextMenu()
this.props.mopidyActions.enqueueURIs(this.props.menu.uris, this.props.menu.tracklist_uri)
}
addTracksToPlaylist(playlist_uri){
addTracksToPlaylist(e, playlist_uri){
this.props.uiActions.hideContextMenu()
this.props.uiActions.addTracksToPlaylist(playlist_uri, this.props.menu.uris)
}
removeFromPlaylist(){
removeFromPlaylist(e){
this.props.uiActions.hideContextMenu()
this.props.uiActions.removeTracksFromPlaylist(this.props.menu.tracklist_uri, this.props.menu.indexes)
}
startRadio(){
startRadio(e){
this.props.uiActions.hideContextMenu()
this.props.pusherActions.startRadio(this.props.menu.uris)
}
goToArtist(){
goToArtist(e){
if (!this.props.menu.items || this.props.menu.items.length <= 0 || !this.props.menu.items[0].artists || this.props.menu.items[0].artists.length <= 0){
return null
} else {
@ -203,7 +198,7 @@ class ContextMenu extends React.Component{
}
}
goToUser(){
goToUser(e){
if (!this.props.menu.items || this.props.menu.items.length <= 0){
return null
} else {
@ -223,7 +218,7 @@ class ContextMenu extends React.Component{
this.props.uiActions.hideContextMenu()
}
closeAndDeselectTracks(){
closeAndDeselectTracks(e){
this.props.uiActions.hideContextMenu();
// TODO
}
@ -341,7 +336,7 @@ class ContextMenu extends React.Component{
var play_uris_next = (
<span className="menu-item-wrapper">
<a className="menu-item" onClick={e => this.playURIsNext(e)}>
<a className="menu-item" onClick={e => this.addToQueue(e, true)}>
<span className="label">Play next</span>
</a>
</span>
@ -367,7 +362,7 @@ class ContextMenu extends React.Component{
var toggle_in_library = (
<span className="menu-item-wrapper">
<a className="menu-item" onClick={e => this.toggleInLibrary(context.in_library)}>
<a className="menu-item" onClick={e => this.toggleInLibrary(e, context.in_library)}>
<span className="label">
{context.in_library ? 'Remove from library' : 'Add to library'}
</span>

View File

@ -57,20 +57,12 @@ export function playURIs( uris, from_uri = null ){
}
}
export function enqueueURIsNext( uris, from_uri = null ){
if( typeof(uris) !== 'object' ) uris = [uris]
return {
type: 'MOPIDY_ENQUEUE_URIS_NEXT',
uris: uris,
from_uri: from_uri
}
}
export function enqueueURIs( uris, from_uri = null, at_position = false ){
export function enqueueURIs( uris, from_uri = null, next = false, at_position = null ){
return {
type: 'MOPIDY_ENQUEUE_URIS',
uris: uris,
at_position: at_position,
next: next,
from_uri: from_uri
}
}

View File

@ -222,35 +222,8 @@ const MopidyMiddleware = (function(){
break;
case 'MOPIDY_ENQUEUE_URIS':
// create batches of 20 uris to load
var all_uris = Object.assign([], action.uris)
var batched_uris = []
while (all_uris.length > 0){
batched_uris.push( all_uris.splice(0,20) )
}
// run each batch
for (var i = 0; i < batched_uris.length; i++){
var value = { uris: batched_uris[i] }
if (action.at_position){
value.at_position = action.at_position
}
instruct( socket, store, 'tracklist.add', value )
.then( response => {
var tlids = []
for (var i = 0; i < response.length; i++){
tlids.push(response[i].tlid)
}
store.dispatch( pusherActions.addQueueMetadata(tlids, action.from_uri) )
console.info('Added '+tlids.length+' URI(s) to queue')
})
}
break
case 'MOPIDY_ENQUEUE_URIS_NEXT':
var uris_added = 0
var remaining_uris = Object.assign([], action.uris)
var current_track = store.getState().ui.current_track
var current_tracklist = store.getState().ui.current_tracklist
var current_track_index = -1
@ -264,18 +237,46 @@ const MopidyMiddleware = (function(){
}
}
var at_position = null
if( current_track_index > -1 ) at_position = current_track_index + 1
let process_batch = function(){
var params = {uris: remaining_uris.splice(0,10)}
if (action.next && current_track_index > -1){
params.at_position = current_track_index + uris_added + 1
} else if (action.at_position){
params.at_position = action.at_position
}
instruct(socket, store, 'tracklist.add', params)
.then( response => {
// append our counter
uris_added += response.length
// add metadata to queue
var tlids = []
for (var i = 0; i < response.length; i++){
tlids.push(response[i].tlid)
}
store.dispatch( pusherActions.addQueueMetadata(tlids, action.from_uri) )
console.info('Added '+tlids.length+' URI(s) to queue')
// still more URIs? run again in 0.8s
// this gives our server time to handle other requests
// crude, but prevents locking the server
if (remaining_uris.length > 0){
setTimeout(
function(){
process_batch()
},
800
)
}
})
}
// start processing
process_batch()
instruct( socket, store, 'tracklist.add', { uris: action.uris, at_position: at_position } )
.then( response => {
var tlids = []
for (var i = 0; i < response.length; i++){
tlids.push(response[i].tlid)
}
store.dispatch( pusherActions.addQueueMetadata(tlids, action.from_uri) )
store.dispatch( uiActions.createNotification('Added '+tlids.length+' URI(s) to queue') )
})
break
case 'MOPIDY_PLAY_URIS':