Fetching 50 recommendations, and storing results to add 3x at a time to avoid locking server; Fixes #149

This commit is contained in:
James Barnsley
2017-08-25 08:39:42 +12:00
parent c9cf32177a
commit a041d5c846

View File

@ -26,7 +26,8 @@ class IrisCore(object):
"enabled": 0, "enabled": 0,
"seed_artists": [], "seed_artists": [],
"seed_genres": [], "seed_genres": [],
"seed_tracks": [] "seed_tracks": [],
"results": []
} }
@ -267,6 +268,7 @@ class IrisCore(object):
# fetch more tracks from Mopidy-Spotify # fetch more tracks from Mopidy-Spotify
self.radio = data self.radio = data
self.radio['enabled'] = 1; self.radio['enabled'] = 1;
self.radio['results'] = [];
uris = self.load_more_tracks() uris = self.load_more_tracks()
# make sure we got recommendations # make sure we got recommendations
@ -275,7 +277,12 @@ class IrisCore(object):
self.core.tracklist.clear() self.core.tracklist.clear()
self.core.tracklist.set_consume(True) self.core.tracklist.set_consume(True)
added = self.core.tracklist.add(uris = uris)
# We only want to play the first batch
added = self.core.tracklist.add(uris = uris[0:3])
# Save results (minus first batch) for later use
self.radio['results'] = uris[3:]
if added.get(): if added.get():
if starting: if starting:
@ -307,7 +314,8 @@ class IrisCore(object):
"enabled": 0, "enabled": 0,
"seed_artists": [], "seed_artists": [],
"seed_genres": [], "seed_genres": [],
"seed_tracks": [] "seed_tracks": [],
"results": []
} }
# restore initial consume state # restore initial consume state
@ -343,13 +351,14 @@ class IrisCore(object):
try: try:
spotify = Spotify( auth = token ) spotify = Spotify( auth = token )
response = spotify.recommendations(seed_artists = self.radio['seed_artists'], seed_genres = self.radio['seed_genres'], seed_tracks = self.radio['seed_tracks'], limit = 5) response = spotify.recommendations(seed_artists = self.radio['seed_artists'], seed_genres = self.radio['seed_genres'], seed_tracks = self.radio['seed_tracks'], limit = 50)
uris = [] uris = []
for track in response['tracks']: for track in response['tracks']:
uris.append( track['uri'] ) uris.append( track['uri'] )
return uris return uris
except: except:
logger.error('IrisFrontend: Failed to fetch Spotify recommendations') logger.error('IrisFrontend: Failed to fetch Spotify recommendations')
self.broadcast({ self.broadcast({
@ -357,25 +366,27 @@ class IrisCore(object):
'message': 'Could not get radio tracks', 'message': 'Could not get radio tracks',
'source': 'load_more_tracks' 'source': 'load_more_tracks'
}) })
return False return []
def check_for_radio_update( self ): def check_for_radio_update( self ):
tracklistLength = self.core.tracklist.length.get() tracklistLength = self.core.tracklist.length.get()
if( tracklistLength <= 5 and self.radio['enabled'] == 1 ): if( tracklistLength < 3 and self.radio['enabled'] == 1 ):
uris = self.load_more_tracks() # Grab our loaded tracks
uris = self.radio['results']
if not uris: # We've run out of pre-fetched tracks, so we need to get more recommendations
self.broadcast({ if (len(uris) < 3):
'type': 'error', uris = self.load_more_tracks()
'message': 'Could not fetch tracklist length',
'source': 'check_for_radio_update'
})
logger.warning('IrisFrontend: Could not fetch tracklist length')
else: # Remove the next batch, and update our results
self.core.tracklist.add(uris = uris) self.radio['results'] = uris[3:]
# Only add the next set of uris
uris = uris[0:3]
self.core.tracklist.add(uris = uris)