From 62e50e89b766b768149f5f598b03982663251b0e Mon Sep 17 00:00:00 2001 From: James Barnsley Date: Tue, 21 Nov 2017 11:27:34 +1300 Subject: [PATCH] 30s timeout for pusher; No broadcasting after metadata flush; Extra error logging during radio functions --- mopidy_iris/core.py | 106 ++++++++++++++------------- mopidy_iris/frontend.py | 4 +- src/js/services/pusher/middleware.js | 2 +- 3 files changed, 57 insertions(+), 55 deletions(-) diff --git a/mopidy_iris/core.py b/mopidy_iris/core.py index a13e4db1..f4133e43 100755 --- a/mopidy_iris/core.py +++ b/mopidy_iris/core.py @@ -372,39 +372,53 @@ class IrisCore(object): # We only want to play the first batch added = self.core.tracklist.add(uris = uris[0:3]) + if (not added.get()): + logger.error("No recommendations added to queue") + + self.radio['enabled'] = 0; + error = { + 'message': 'No recommendations added to queue', + 'radio': self.radio + } + if (callback): + callback(False, error) + else: + return error + # Save results (minus first batch) for later use self.radio['results'] = uris[3:] - if added.get(): - if starting: - self.core.playback.play() - self.broadcast( - data={ - 'type': 'radio_started', - 'radio': self.radio - } - ) - else: - self.broadcast( - data={ - 'type': 'radio_changed', - 'radio': self.radio - } - ) + if starting: + self.core.playback.play() + self.broadcast( + data={ + 'type': 'radio_started', + 'radio': self.radio + } + ) + else: + self.broadcast( + data={ + 'type': 'radio_changed', + 'radio': self.radio + } + ) - self.get_radio(callback=callback) - return + self.get_radio(callback=callback) + return - # failed fetching/adding tracks, so no-go - self.radio['enabled'] = 0; - error = { - 'message': 'Could not start radio', - 'radio': self.radio - } - if (callback): - callback(False, error) + # Failed fetching/adding tracks, so no-go else: - return error + logger.error("No recommendations returned by Spotify") + self.radio['enabled'] = 0; + error = { + 'message': 'Could not start radio', + 'radio': self.radio + } + if (callback): + callback(False, error) + else: + return error def stop_radio(self, *args, **kwargs): @@ -440,13 +454,10 @@ class IrisCore(object): def load_more_tracks(self, *args, **kwargs): - # this is crude, but it means we don't need to handle expired tokens - # TODO: address this when it's clear what Jodal and the team want to do with Pyspotify - self.refresh_spotify_token() - try: - token = self.spotify_token - token = token['access_token'] + self.get_spotify_token() + spotify_token = self.spotify_token + access_token = spotify_token['access_token'] except: error = 'IrisFrontend: access_token missing or invalid' logger.error(error) @@ -460,7 +471,7 @@ class IrisCore(object): url = url+'&limit=50' req = urllib2.Request(url) - req.add_header('Authorization', 'Bearer '+self.spotify_token['access_token']) + req.add_header('Authorization', 'Bearer '+access_token) response = urllib2.urlopen(req, timeout=30).read() response_dict = json.loads(response) @@ -554,21 +565,6 @@ class IrisCore(object): self.queue_metadata = cleaned_queue_metadata - self.broadcast( - data={ - 'type': 'queue_metadata_changed', - 'queue_metadata': self.queue_metadata - } - ) - - response = { - 'message': 'Cleaned queue metadata' - } - if (callback): - callback(response) - else: - return response - ## # Spotify authentication @@ -580,6 +576,11 @@ class IrisCore(object): def get_spotify_token(self, *args, **kwargs): callback = kwargs.get('callback', False) + + # Expired, so go get a new one + if (not self.spotify_token or self.spotify_token['expires_at'] <= time.time()): + self.refresh_spotify_token() + response = { 'spotify_token': self.spotify_token } @@ -606,6 +607,10 @@ class IrisCore(object): request = tornado.httpclient.HTTPRequest(url, method='POST', body=urllib.urlencode(data)) response = http_client.fetch(request) + token = json.loads(response.body) + token['expires_at'] = time.time() + token['expires_in'] + self.spotify_token = token + self.broadcast( data={ 'type': 'spotify_token_changed', @@ -613,12 +618,9 @@ class IrisCore(object): } ) - token = json.loads(response.body) - self.spotify_token = token response = { 'spotify_token': token } - if (callback): callback(response) else: diff --git a/mopidy_iris/frontend.py b/mopidy_iris/frontend.py index 1d35f2e0..6e4e0b90 100755 --- a/mopidy_iris/frontend.py +++ b/mopidy_iris/frontend.py @@ -19,9 +19,9 @@ class IrisFrontend(pykka.ThreadingActor, CoreListener): def on_start(self): logger.info('Starting Iris '+mem.iris.version) - def track_playback_ended( self, tl_track, time_position ): + def track_playback_ended(self, tl_track, time_position): mem.iris.check_for_radio_update() - def tracklist_changed( self ): + def tracklist_changed(self): mem.iris.clean_queue_metadata() \ No newline at end of file diff --git a/src/js/services/pusher/middleware.js b/src/js/services/pusher/middleware.js index fd75fa3c..b001f4fa 100755 --- a/src/js/services/pusher/middleware.js +++ b/src/js/services/pusher/middleware.js @@ -83,7 +83,7 @@ const PusherMiddleware = (function(){ store.dispatch(uiActions.stopLoading(request_id)); reject({message: "Request timed out", method: method, data: data}); }, - 5000 // 30000 + 30000 ); // add query to our deferred responses