Skip to content
Snippets Groups Projects
Commit a38a83a1 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Merge branch '25-fix-encoding-in-track-data' into 'master'

Resolve "Fix encoding in track data"

Closes #25

See merge request !22
parents 775844b6 089a039a
No related branches found
No related tags found
1 merge request!22Resolve "Fix encoding in track data"
<?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"/>
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment