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="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())

View file

@ -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)

View file

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