add random mode in browse and search

This commit is contained in:
vincent 2020-11-03 20:36:28 +01:00
parent 1bc9e35d83
commit 81a62cdca4
3 changed files with 46 additions and 4 deletions

View file

@ -14,6 +14,7 @@ class SubidyLibraryProvider(backend.LibraryProvider):
dict(id="artists", name="Artists"), dict(id="artists", name="Artists"),
dict(id="albums", name="Albums"), dict(id="albums", name="Albums"),
dict(id="rootdirs", name="Directories"), dict(id="rootdirs", name="Directories"),
dict(id="random", name="Random"),
] ]
# Create a dict with the keys being the `id`s in `vdir_templates` # Create a dict with the keys being the `id`s in `vdir_templates`
# and the values being objects containing the vdir `id`, # and the values being objects containing the vdir `id`,
@ -52,6 +53,9 @@ class SubidyLibraryProvider(backend.LibraryProvider):
def browse_rootdirs(self): def browse_rootdirs(self):
return self.subsonic_api.get_rootdirs_as_refs() 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): def browse_diritems(self, directory_id):
return self.subsonic_api.get_diritems_as_refs(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): def browse(self, browse_uri):
if browse_uri == uri.get_vdir_uri("root"): if browse_uri == uri.get_vdir_uri("root"):
root_vdir_names = ["rootdirs", "artists", "albums"] root_vdir_names = ["rootdirs", "artists", "albums", "random"]
root_vdirs = [ root_vdirs = [
self._vdirs[vdir_name] for vdir_name in root_vdir_names self._vdirs[vdir_name] for vdir_name in root_vdir_names
] ]
@ -96,6 +100,9 @@ class SubidyLibraryProvider(backend.LibraryProvider):
return self.browse_artists() return self.browse_artists()
elif browse_uri == uri.get_vdir_uri("albums"): elif browse_uri == uri.get_vdir_uri("albums"):
return self.browse_albums() return self.browse_albums()
elif browse_uri == uri.get_vdir_uri("random"):
return self.browse_random_songs()
else: else:
uri_type = uri.get_type(browse_uri) uri_type = uri.get_type(browse_uri)
if uri_type == uri.DIRECTORY: if uri_type == uri.DIRECTORY:
@ -150,7 +157,7 @@ class SubidyLibraryProvider(backend.LibraryProvider):
) )
return SearchResult(tracks=tracks) 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) result = self.subsonic_api.find_raw(artist_name)
if result is None: if result is None:
return None return None
@ -192,8 +199,12 @@ class SubidyLibraryProvider(backend.LibraryProvider):
query.get("artist")[0], query.get("album")[0] query.get("artist")[0], query.get("album")[0]
) )
if "artist" in query: if "artist" in query:
return self.search_by_artist(query.get("artist")[0], return self.search_by_artist(query.get("artist")[0], exact)
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: if "any" in query:
return self.subsonic_api.find_as_search_result(query.get("any")[0]) return self.subsonic_api.find_as_search_result(query.get("any")[0])
return SearchResult(artists=self.subsonic_api.get_artists_as_artists()) return SearchResult(artists=self.subsonic_api.get_artists_as_artists())

View file

@ -410,6 +410,25 @@ class SubsonicApi:
return songs return songs
return [] 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): def get_raw_album_list(self, ltype, size=MAX_LIST_RESULTS):
try: try:
response = self.connection.getAlbumList2(ltype=ltype, size=size) response = self.connection.getAlbumList2(ltype=ltype, size=size)
@ -475,6 +494,17 @@ class SubsonicApi:
for diritem in self.get_raw_dir(directory_id) 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): def get_artists_as_artists(self):
return [ return [
self.raw_artist_to_artist(artist) self.raw_artist_to_artist(artist)

View file

@ -8,6 +8,7 @@ DIRECTORY = "directory"
VDIR = "vdir" VDIR = "vdir"
PREFIX = "subidy" PREFIX = "subidy"
SEARCH = "search" SEARCH = "search"
RANDOM = "random"
regex = re.compile(r"(\w+?):(\w+?)(?::|$)(.+?)?$") regex = re.compile(r"(\w+?):(\w+?)(?::|$)(.+?)?$")