diff --git a/addon.xml b/addon.xml index 17e7f1e0eeee9f82990364fd8b4fa64787019f10..161574c8a24db2563362a3252cd8b5dc8ac2f6da 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="script.spotify.screensaver" name="Spotify Screensaver" - version="0.0.16" + version="0.0.17" provider-name="BenoƮt Harrault"> <requires> <import addon="xbmc.python" version="2.25.0"/> diff --git a/gui.py b/gui.py index 23ba4065f4cbe7315435fb13381d8d3b5d37a2d9..4a0728e438cbfb059f4eeae8c0a6c2bc610de992 100644 --- a/gui.py +++ b/gui.py @@ -49,6 +49,7 @@ class GUI(xbmcgui.WindowXMLDialog): self.Monitor = MyMonitor(action=self._exit) self.stop = False self.last_spotify_event = '' + self.current_track_id = '' def _get_settings(self): # read addon settings @@ -124,8 +125,9 @@ class GUI(xbmcgui.WindowXMLDialog): event_value = event_split[2] if len(event_split) > 2 else '' if event_type == 'changed' or event_type == 'playing': - self._reload_images(event_value) - self.next = True + if (self.current_track_id != event_value): + self._reload_images(event_value) + self.next = True elif event_type == 'preloading': self._preload_images(event_value) elif ( @@ -150,30 +152,44 @@ class GUI(xbmcgui.WindowXMLDialog): self.log('preload images for track: ' + track_id) track_data = self._get_track_data(track_id) - track_name = track_data.get('track_name') - track_artists = track_data.get('track_artists') - track_image_url = track_data.get('track_image_url') - - notification = ( - 'Notification("Next:", "' + ', '.join(track_artists) - + ' - ' + track_name - + '", 29000, ' + track_image_url + ')' - ) - xbmc.executebuiltin(notification) + + if track_data is None: + self.log('failed to get next track data', xbmc.LOGERROR) + else: + track_name = track_data.get('track_name') + track_artists = track_data.get('track_artists') + track_image_url = track_data.get('track_image_url') + + if ((track_name is None) + or (track_artists is None) + or (track_image_url is None)): + self.log('failed to parse next track data', xbmc.LOGERROR) + else: + artists_string = ', '.join(track_artists).replace('"', '\"') + + notification = ( + 'Notification("Next:", "' + + str(artists_string) + ' - ' + str(track_name) + + '", 29000, ' + str(track_image_url) + ')' + ) + + xbmc.executebuiltin(notification) def _reload_images(self, track_id): self.log('load images for track: ' + track_id) self.PanelItems = self.getControl(101) self.PanelItems.reset() self.PanelItems.addItems(self._build_items_list(track_id)) + self.current_track_id = track_id def _remove_images(self): self.log('no played track. remove images') self.PanelItems = self.getControl(101) self.PanelItems.reset() + self.current_track_id = '' def _fix_encoding(self, string): - return string.encode('utf-8') + return str(string.encode('utf-8')) def _get_track_data(self, track_id, try_count=1): self.log('track_id: [' + str(track_id) + ']') @@ -200,84 +216,102 @@ class GUI(xbmcgui.WindowXMLDialog): # album/track image album = data.get('album') if album is None: - self.log('failed to get album from API', xbmc.LOGERROR) - self.log(json.dumps(data), xbmc.LOGERROR) - - if json.dumps(data) == '{"error": {"status": 401, "message": "The access token expired"}}': - self.log('trying to refresh access token') - self._init_spotify_access_token() - self.log('retry get image') - self._get_track_data(track_id, try_count + 1) + self.log( + 'failed to get album from API: ' + + json.dumps(data), xbmc.LOGERROR) + + error_string = ('{"error": {"status": 401, ' + + '"message": "The access token expired"}}') + if json.dumps(data) == error_string: + if try_count < 3: + self.log('trying to refresh access token') + self._init_spotify_access_token() + self.log('retry get image') + return self._get_track_data(track_id, try_count + 1) + else: + self.log('giving up', xbmc.LOGERROR) else: self.log('unknown error getting image', xbmc.LOGERROR) else: - self.log('ok got album from API') - self.log(json.dumps(album)) + self.log('ok got album from API: ' + json.dumps(album)) # get artists artists = album.get('artists') if artists is None: - self.log('failed to get artists from API', xbmc.LOGERROR) - self.log(json.dumps(album), xbmc.LOGERROR) + self.log( + 'failed to get artists from API: ' + + json.dumps(album), xbmc.LOGERROR) else: - self.log('ok got artists from API') - self.log(json.dumps(artists)) + self.log('ok got artists from API: ' + json.dumps(artists)) for artist in artists: artist_name = artist.get('name') if artist_name is None: self.log( - 'failed to get artist_name from API', - xbmc.LOGERROR) - self.log(json.dumps(artist), xbmc.LOGERROR) + 'failed to get artist_name from API: ' + + json.dumps(artist), xbmc.LOGERROR) else: - self.log('ok got artist_name from API') - self.log(json.dumps(artist_name)) - - track_data['track_artists'].append(self._fix_encoding(artist_name)) + self.log( + 'ok got artist_name from API: ' + + json.dumps(artist_name)) + track_data['track_artists'].append( + self._fix_encoding(artist_name)) # get images images = album.get('images') if images is None: - self.log('failed to get images from API', xbmc.LOGERROR) - self.log(json.dumps(album), xbmc.LOGERROR) + self.log( + 'failed to get images from API: ' + + json.dumps(album), xbmc.LOGERROR) else: - self.log('ok got images from API') - self.log(json.dumps(images)) + self.log('ok got images from API: ' + json.dumps(images)) image = images[0] if image is None: - self.log('failed to get image from API', xbmc.LOGERROR) - self.log(json.dumps(images), xbmc.LOGERROR) + self.log( + 'failed to get image from API: ' + + json.dumps(images), xbmc.LOGERROR) else: - self.log('ok got image from API') - self.log(json.dumps(image)) + self.log('ok got image from API: ' + json.dumps(image)) track_image_url = image.get('url') if track_image_url is None: self.log( - 'failed to get track_image_url from API', - xbmc.LOGERROR) - self.log(json.dumps(image), xbmc.LOGERROR) + 'failed to get track_image_url from API: ' + + json.dumps(image), xbmc.LOGERROR) else: - self.log('ok got track_image_url from API') - self.log(track_image_url) + self.log( + 'ok got track_image_url from API: ' + + track_image_url) track_data['track_image_url'] = track_image_url except Exception as e: self.log('failed to get track data: ' + str(e), xbmc.LOGERROR) + self.log('track_name: ' + track_data.get('track_name', '')) + self.log('track_artists: ' + str(track_data.get('track_artists', []))) + self.log('track_image_url: ' + track_data.get('track_image_url', '')) + return track_data def _build_items_list(self, track_id): imageLST = [] track_data = self._get_track_data(track_id) - track_name = track_data.get('track_name') - track_artists = track_data.get('track_artists') - track_image_url = track_data.get('track_image_url') - - imageLST.append( - xbmcgui.ListItem( - ', '.join(track_artists) + ' - ' + track_name, - thumbnailImage=track_image_url - ) - ) + if track_data is None: + self.log('failed to get next track data', xbmc.LOGERROR) + else: + track_name = track_data.get('track_name') + track_artists = track_data.get('track_artists') + track_image_url = track_data.get('track_image_url') + + if ((track_name is None) + or (track_artists is None) + or (track_image_url is None)): + self.log('failed to parse next track data', xbmc.LOGERROR) + else: + artists_string = ', '.join(track_artists) + imageLST.append( + xbmcgui.ListItem( + artists_string + ' - ' + track_name, + thumbnailImage=track_image_url + ) + ) return imageLST