Queue metadata endpoint

This commit is contained in:
James Barnsley
2017-02-14 12:13:07 +13:00
parent 7184fad11f
commit 02d3868d1e
12 changed files with 113 additions and 16 deletions

View File

@ -27,6 +27,7 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener):
self.version = mopidy_iris.__version__
self.is_root = ( os.geteuid() == 0 )
self.spotify_token = False
self.queue_metadata = {}
self.radio = {
"enabled": 0,
"seed_artists": [],
@ -190,6 +191,26 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener):
return self.spotify_token
# get queue metadata
def get_queue_metadata( self ):
return self.queue_metadata
# add queue metadata
def add_queue_metadata( self, tlids, from_uri, added_by ):
queue_metadata = self.queue_metadata
for tlid in tlids:
item = {
'tlid': tlid,
'from_uri': from_uri,
'added_by': added_by
}
queue_metadata['tlid_'+str(tlid)] = item
return queue_metadata
# get our config values
def get_config( self ):
all_config = self.config

View File

@ -210,6 +210,35 @@ class PusherWebsocketHandler(tornado.websocket.WebSocketHandler):
messageJson['request_id'],
{ 'connections': connectionsDetailsList }
)
# add some queue metadata
elif messageJson['action'] == 'add_queue_metadata':
queue_metadata = self.frontend.add_queue_metadata(
messageJson['tlids'],
messageJson['from_uri'],
connections[self.connectionid]['client']['username']
)
send_message(
self.connectionid,
'response',
messageJson['request_id'],
{ 'queue_metadata': queue_metadata }
)
# get our queue metadata (added_by, from, etc)
elif messageJson['action'] == 'get_queue_metadata':
connectionsDetailsList = []
for connection in connections.itervalues():
connectionsDetailsList.append(connection['client'])
send_message(
self.connectionid,
'response',
messageJson['request_id'],
{ 'queue_metadata': self.frontend.get_queue_metadata() }
)
# change connection's client username
elif messageJson['action'] == 'set_username':

View File

@ -55,12 +55,12 @@ class ContextMenu extends React.Component{
}
playURIs(){
this.props.mopidyActions.playURIs(this.props.menu.uris);
this.props.mopidyActions.playURIs(this.props.menu.uris, this.props.menu.tracklist_uri);
this.props.uiActions.hideContextMenu();
}
playURIsNext(){
this.props.mopidyActions.enqueueURIsNext(this.props.menu.uris);
this.props.mopidyActions.enqueueURIsNext(this.props.menu.uris, this.props.menu.tracklist_uri);
this.props.uiActions.hideContextMenu();
}
@ -70,7 +70,7 @@ class ContextMenu extends React.Component{
}
addToQueue(){
this.props.mopidyActions.enqueueURIs(this.props.menu.uris)
this.props.mopidyActions.enqueueURIs(this.props.menu.uris, this.props.menu.tracklist_uri)
this.props.uiActions.hideContextMenu()
}

View File

@ -122,7 +122,7 @@ class TrackList extends React.Component{
var data = {
e: e,
context: (this.props.context ? this.props.context : 'track'),
tracklist_uri: (this.props.tracklist_uri ? this.props.tracklist_uri : null),
tracklist_uri: (this.props.uri ? this.props.uri : null),
items: selected_tracks,
uris: helpers.asURIs(selected_tracks),
indexes: this.tracksIndexes(selected_tracks)

View File

@ -56,15 +56,17 @@ export function playURIs( uris ){
}
}
export function enqueueURIsNext( uris ){
export function enqueueURIsNext( uris, from_uri = null ){
if( typeof(uris) !== 'object' ) uris = [uris]
return {
type: 'MOPIDY_ENQUEUE_URIS_NEXT',
uris: uris
uris: uris,
from_uri: from_uri
}
}
export function enqueueURIs( uris, at_position = false ){
// TODO: Create separate action type for this, rather than using _INSTRUCT
export function enqueueURIs( uris, from_uri = null, at_position = false ){
if( typeof(uris) !== 'object' ) uris = [uris];
var value = { uris: uris };
if( at_position ) value.at_position = at_position;

View File

@ -238,10 +238,13 @@ const MopidyMiddleware = (function(){
var current_track = store.getState().ui.current_track
var current_tracklist = store.getState().ui.current_tracklist
var current_track_index = -1
for( var i = 0; i < current_tracklist.length; i++ ){
if( current_tracklist[i].tlid == current_track.tlid ){
current_track_index = i
break
if (typeof(current_track) !== 'undefined'){
for( var i = 0; i < current_tracklist.length; i++ ){
if( current_tracklist[i].tlid == current_track.tlid ){
current_track_index = i
break
}
}
}
@ -249,6 +252,13 @@ const MopidyMiddleware = (function(){
if( current_track_index > -1 ) at_position = current_track_index + 1
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) )
})
break
case 'MOPIDY_PLAY_URIS':

View File

@ -75,4 +75,18 @@ export function debug( data = null ){
type: 'PUSHER_DEBUG',
data: data
}
}
export function getQueueMetadata(){
return {
type: 'PUSHER_GET_QUEUE_METADATA'
}
}
export function addQueueMetadata( tlids = [], from_uri = null ){
return {
type: 'PUSHER_ADD_QUEUE_METADATA',
tlids: tlids,
from_uri: from_uri
}
}

View File

@ -161,6 +161,24 @@ const PusherMiddleware = (function(){
store.dispatch( uiActions.createNotification(action.data.source+': '+action.data.message,'bad') )
break;
case 'PUSHER_GET_QUEUE_METADATA':
request({ action: 'get_queue_metadata'})
.then(
response => {
store.dispatch({ type: 'QUEUE_METADATA', queue_metadata: response.data.queue_metadata })
}
)
break;
case 'PUSHER_ADD_QUEUE_METADATA':
request({ action: 'add_queue_metadata', tlids: action.tlids, from_uri: action.from_uri })
.then(
response => {
store.dispatch({ type: 'QUEUE_METADATA', queue_metadata: response.data.queue_metadata })
}
)
break;
case 'START_UPGRADE':
request({ action: 'upgrade' })
.then(

View File

@ -119,6 +119,10 @@ export default function reducer(ui = {}, action){
current_track: current_track
});
case 'QUEUE_METADATA':
console.log(action)
return Object.assign({}, ui, { queue_metadata: action.queue_metadata })
case 'RADIO':
case 'START_RADIO':
return Object.assign({}, ui, { seeds_resolved: false }, { radio: action.data.radio })

View File

@ -77,8 +77,7 @@ class Album extends React.Component{
}
play(){
var tracks_uris = helpers.asURIs( this.props.album.tracks )
this.props.mopidyActions.playURIs( tracks_uris )
this.props.mopidyActions.playURIs([this.props.params.uri])
}
render(){
@ -123,7 +122,7 @@ class Album extends React.Component{
</div>
<section className="list-wrapper">
{ this.props.album.tracks ? <TrackList tracks={ this.props.album.tracks } /> : null }
{ this.props.album.tracks ? <TrackList tracks={ this.props.album.tracks } uri={this.props.params.uri} /> : null }
<LazyLoadListener enabled={this.props.album.tracks_more} loadMore={ () => this.loadMore() }/>
</section>

View File

@ -157,7 +157,7 @@ class Artist extends React.Component{
<div className={related_artists.length > 0 ? "col w70" : "col w100"}>
<h4 className="left-padding">Top tracks</h4>
<div className="list-wrapper">
{ this.props.artist.tracks ? <TrackList tracks={this.props.artist.tracks} /> : null }
{ this.props.artist.tracks ? <TrackList uris={this.props.params.uri} tracks={this.props.artist.tracks} /> : null }
</div>
</div>

View File

@ -165,7 +165,7 @@ class Playlist extends React.Component{
{ this.renderActions() }
<section className="list-wrapper">
{ this.props.playlist.tracks ? <TrackList tracklist_uri={this.props.params.uri} context={context} tracks={this.props.playlist.tracks} removeTracks={ tracks_indexes => this.removeTracks(tracks_indexes) } reorderTracks={ (indexes, index) => this.reorderTracks(indexes, index) } /> : null }
{ this.props.playlist.tracks ? <TrackList uri={this.props.params.uri} context={context} tracks={this.props.playlist.tracks} removeTracks={ tracks_indexes => this.removeTracks(tracks_indexes) } reorderTracks={ (indexes, index) => this.reorderTracks(indexes, index) } /> : null }
<LazyLoadListener enabled={this.props.playlist.tracks_more} loadMore={ () => this.loadMore() }/>
</section>
</div>