diff --git a/mopidy_subidy/library.py b/mopidy_subidy/library.py index 9ae885b..bc5e7c2 100644 --- a/mopidy_subidy/library.py +++ b/mopidy_subidy/library.py @@ -14,6 +14,7 @@ class SubidyLibraryProvider(backend.LibraryProvider): dict(id="artists", name="Artists"), dict(id="albums", name="Albums"), dict(id="rootdirs", name="Directories"), + dict(id="random", name="Random"), ] # Create a dict with the keys being the `id`s in `vdir_templates` # and the values being objects containing the vdir `id`, @@ -52,6 +53,9 @@ class SubidyLibraryProvider(backend.LibraryProvider): def browse_rootdirs(self): return self.subsonic_api.get_rootdirs_as_refs() + def browse_random_songs(self): + return self.subsonic_api.get_random_songs_as_refs() + def browse_diritems(self, directory_id): return self.subsonic_api.get_diritems_as_refs(directory_id) @@ -82,7 +86,7 @@ class SubidyLibraryProvider(backend.LibraryProvider): def browse(self, browse_uri): if browse_uri == uri.get_vdir_uri("root"): - root_vdir_names = ["rootdirs", "artists", "albums"] + root_vdir_names = ["rootdirs", "artists", "albums", "random"] root_vdirs = [ self._vdirs[vdir_name] for vdir_name in root_vdir_names ] @@ -96,6 +100,9 @@ class SubidyLibraryProvider(backend.LibraryProvider): return self.browse_artists() elif browse_uri == uri.get_vdir_uri("albums"): return self.browse_albums() + elif browse_uri == uri.get_vdir_uri("random"): + return self.browse_random_songs() + else: uri_type = uri.get_type(browse_uri) if uri_type == uri.DIRECTORY: @@ -150,7 +157,7 @@ class SubidyLibraryProvider(backend.LibraryProvider): ) return SearchResult(tracks=tracks) - def search_by_artist(self, artist_name,exact): + def search_by_artist(self, artist_name, exact): result = self.subsonic_api.find_raw(artist_name) if result is None: return None @@ -192,8 +199,12 @@ class SubidyLibraryProvider(backend.LibraryProvider): query.get("artist")[0], query.get("album")[0] ) if "artist" in query: - return self.search_by_artist(query.get("artist")[0], - exact) + return self.search_by_artist(query.get("artist")[0], exact) + if "comment" in query: + if query.get("comment")[0] == "random": + return SearchResult( + tracks=self.subsonic_api.get_random_songs_as_tracks() + ) if "any" in query: return self.subsonic_api.find_as_search_result(query.get("any")[0]) return SearchResult(artists=self.subsonic_api.get_artists_as_artists()) diff --git a/mopidy_subidy/subsonic_api.py b/mopidy_subidy/subsonic_api.py index 329a482..789dc25 100644 --- a/mopidy_subidy/subsonic_api.py +++ b/mopidy_subidy/subsonic_api.py @@ -410,6 +410,25 @@ class SubsonicApi: return songs return [] + def get_raw_random_song(self, size=MAX_LIST_RESULTS): + try: + response = self.connection.getRandomSongs(size) + except Exception: + logger.warning( + "Connecting to subsonic failed when loading list of songs in album." + ) + return [] + if response.get("status") != RESPONSE_OK: + logger.warning( + "Got non-okay status code from subsonic: %s" + % response.get("status") + ) + return [] + songs = response.get("randomSongs").get("song") + if songs is not None: + return songs + return [] + def get_raw_album_list(self, ltype, size=MAX_LIST_RESULTS): try: response = self.connection.getAlbumList2(ltype=ltype, size=size) @@ -475,6 +494,17 @@ class SubsonicApi: for diritem in self.get_raw_dir(directory_id) ] + def get_random_songs_as_refs(self): + return [ + self.raw_song_to_ref(song) for song in self.get_raw_random_song(75) + ] + + def get_random_songs_as_tracks(self): + return [ + self.raw_song_to_track(song) + for song in self.get_raw_random_song(MAX_LIST_RESULTS) + ] + def get_artists_as_artists(self): return [ self.raw_artist_to_artist(artist) diff --git a/mopidy_subidy/uri.py b/mopidy_subidy/uri.py index 57338b8..a4d8464 100644 --- a/mopidy_subidy/uri.py +++ b/mopidy_subidy/uri.py @@ -8,6 +8,7 @@ DIRECTORY = "directory" VDIR = "vdir" PREFIX = "subidy" SEARCH = "search" +RANDOM = "random" regex = re.compile(r"(\w+?):(\w+?)(?::|$)(.+?)?$")