diff --git a/mopidy_subidy/subsonic_api.py b/mopidy_subidy/subsonic_api.py index 9102127..c9f8413 100644 --- a/mopidy_subidy/subsonic_api.py +++ b/mopidy_subidy/subsonic_api.py @@ -42,17 +42,24 @@ class SubsonicApi(): return template % (self.url, song_id, self.username, self.password) def find_raw(self, query, exclude_artists=False, exclude_albums=False, exclude_songs=False): - response = self.connection.search2( - query.encode('utf-8'), - MAX_SEARCH_RESULTS if not exclude_artists else 0, 0, - MAX_SEARCH_RESULTS if not exclude_albums else 0, 0, - MAX_SEARCH_RESULTS if not exclude_songs else 0, 0) + try: + response = self.connection.search2( + query.encode('utf-8'), + MAX_SEARCH_RESULTS if not exclude_artists else 0, 0, + MAX_SEARCH_RESULTS if not exclude_albums else 0, 0, + MAX_SEARCH_RESULTS if not exclude_songs else 0, 0) + except Exception as e: + logger.warning('Connecting to subsonic failed when searching.') + return None if response.get('status') != RESPONSE_OK: + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) return None return response.get('searchResult2') def find_as_search_result(self, query, exclude_artists=False, exclude_albums=False, exclude_songs=False): result = self.find_raw(query) + if result is None: + return None return SearchResult( uri=uri.get_search_uri(query), artists=[self.raw_artist_to_artist(artist) for artist in result.get('artist') or []], @@ -61,48 +68,88 @@ class SubsonicApi(): def get_raw_artists(self): - response = self.connection.getIndexes() + try: + response = self.connection.getIndexes() + except Exception as e: + logger.warning('Connecting to subsonic failed when loading list of artists.') + return [] if response.get('status') != RESPONSE_OK: - return None + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) + return [] letters = response.get('indexes').get('index') if letters is not None: - artists = [artist for letter in letters for artist in letter.get('artist')] + artists = [artist for letter in letters for artist in letter.get('artist') or []] return artists - return None + logger.warning('Subsonic does not seem to have any artists in it\'s library.') + return [] def get_song_by_id(self, song_id): - response = self.connection.getSong(song_id) + try: + response = self.connection.getSong(song_id) + except Exception as e: + logger.warning('Connecting to subsonic failed when loading song by id.') + return None if response.get('status') != RESPONSE_OK: + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) return None return self.raw_song_to_track(response.get('song')) if response.get('song') is not None else None def get_album_by_id(self, album_id): - response = self.connection.getAlbum(album_id) + try: + response = self.connection.getAlbum(album_id) + except Exception as e: + logger.warning('Connecting to subsonic failed when loading album by id.') + return None if response.get('status') != RESPONSE_OK: + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) return None return self.raw_album_to_album(response.get('album')) if response.get('album') is not None else None def get_artist_by_id(self, artist_id): - response = self.connection.getArtist(artist_id) + try: + response = self.connection.getArtist(artist_id) + except Exception as e: + logger.warning('Connecting to subsonic failed when loading artist by id.') + return None if response.get('status') != RESPONSE_OK: + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) return None return self.raw_artist_to_artist(response.get('artist')) if response.get('artist') is not None else None def get_raw_playlists(self): - response = self.connection.getPlaylists() + try: + response = self.connection.getPlaylists() + except Exception as e: + logger.warning('Connecting to subsonic failed when loading list of playlists.') + return [] if response.get('status') != RESPONSE_OK: - return None - return response.get('playlists').get('playlist') + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) + return [] + playlists = response.get('playlists').get('playlist') + if playlists is None: + logger.warning('Subsonic does not seem to have any playlists in it\'s library.') + return [] + return playlists def get_raw_playlist(self, playlist_id): - response = self.connection.getPlaylist(playlist_id) + try: + response = self.connection.getPlaylist(playlist_id) + except Exception as e: + logger.warning('Connecting to subsonic failed when loading playlist.') + return None if response.get('status') != RESPONSE_OK: + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) return None return response.get('playlist') def get_raw_dir(self, parent_id): - response = self.connection.getMusicDirectory(parent_id) + try: + response = self.connection.getMusicDirectory(parent_id) + except Exception as e: + logger.warning('Connecting to subsonic failed when listing content of music directory.') + return None if response.get('status') != RESPONSE_OK: + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) return None directory = response.get('directory') if directory is not None: