diff --git a/mopidy_subidy/library.py b/mopidy_subidy/library.py index 258da55..b6bdd88 100644 --- a/mopidy_subidy/library.py +++ b/mopidy_subidy/library.py @@ -15,7 +15,7 @@ class SubidyLibraryProvider(backend.LibraryProvider): def browse_songs(self, album_id): return self.subsonic_api.get_songs_as_refs(album_id) - def browse_albums(self, artist_id): + def browse_albums(self, artist_id=None): return [Ref.directory(name=album.name, uri=album.uri) for album in self.subsonic_api.get_albums_as_refs(artist_id)] def browse_artists(self): @@ -41,15 +41,18 @@ class SubidyLibraryProvider(backend.LibraryProvider): # ("root", ) ("rootdirs", "Directories"), ("artists", "Artists"), + ("albums", "Albums"), ] vdirs = dict((template[0], dict(id=template[0], name=template[1])) for template in vdir_templates) if browse_uri == uri.ROOT_URI: - root_vdirs = sorted((vdirs[vdir_name] for vdir_name in ["rootdirs", "artists"]), key=lambda a: a["name"]) + root_vdirs = sorted((vdirs[vdir_name] for vdir_name in ["rootdirs", "artists", "albums"]), key=lambda a: a["name"]) return [Ref.directory(name=vdir["name"], uri=uri.get_vdir_uri(vdir["id"])) for vdir in root_vdirs] elif browse_uri == uri.get_vdir_uri("rootdirs"): return self.browse_rootdirs() elif browse_uri == uri.get_vdir_uri("artists"): return self.browse_artists() + elif browse_uri == uri.get_vdir_uri("albums"): + return self.browse_albums() else: uri_type = uri.get_type(browse_uri) if uri_type == uri.DIRECTORY: diff --git a/mopidy_subidy/subsonic_api.py b/mopidy_subidy/subsonic_api.py index dfc8940..bd4eb99 100644 --- a/mopidy_subidy/subsonic_api.py +++ b/mopidy_subidy/subsonic_api.py @@ -13,6 +13,7 @@ UNKNOWN_SONG = u'Unknown Song' UNKNOWN_ALBUM = u'Unknown Album' UNKNOWN_ARTIST = u'Unknown Artist' MAX_SEARCH_RESULTS = 100 +MAX_LIST_RESULTS = 500 ref_sort_key = lambda ref: ref.name @@ -224,8 +225,23 @@ class SubsonicApi(): return songs return [] - def get_albums_as_refs(self, artist_id): - return [self.raw_album_to_ref(album) for album in self.get_raw_albums(artist_id)] + def get_raw_album_list(self, ltype, size=MAX_LIST_RESULTS): + try: + response = self.connection.getAlbumList2(ltype=ltype, size=size) + except Exception as e: + logger.warning('Connecting to subsonic failed when loading album list.') + return [] + if response.get('status') != RESPONSE_OK: + logger.warning('Got non-okay status code from subsonic: %s' % response.get('status')) + return [] + albums = response.get('albumList2').get('album') + if albums is not None: + return albums + return [] + + def get_albums_as_refs(self, artist_id=None): + albums = (self.get_raw_album_list('alphabeticalByName') if artist_id is None else self.get_raw_albums(artist_id)) + return [self.raw_album_to_ref(album) for album in albums] def get_albums_as_albums(self, artist_id): return [self.raw_album_to_album(album) for album in self.get_raw_albums(artist_id)]