Merge branch 'browse_libs' into 'master'

Support library browsing

See merge request funkwhale/mopidy!7
main
Agate 2020-07-01 20:55:30 +02:00
commit 294903245d
2 changed files with 45 additions and 0 deletions

View File

@ -141,6 +141,11 @@ class APIClient(object):
response.raise_for_status()
return response.json()
def list_libraries(self, filters):
response = self.session.get("libraries/", params=filters)
response.raise_for_status()
return response.json()
def load_all(self, first_page, max=0):
for i in first_page["results"]:
yield i

View File

@ -69,6 +69,7 @@ class FunkwhaleLibraryProvider(backend.LibraryProvider):
self.vfs = {"funkwhale:directory": collections.OrderedDict()}
self.add_to_vfs(new_folder("Favorites", "favorites"))
self.add_to_vfs(new_folder("Artists", "artists"))
self.add_to_vfs(new_folder("Libraries", "libraries"))
# self.add_to_vfs(new_folder('Following', ['following']))
# self.add_to_vfs(new_folder('Sets', ['sets']))
# self.add_to_vfs(new_folder('Stream', ['stream']))
@ -123,6 +124,7 @@ class FunkwhaleLibraryProvider(backend.LibraryProvider):
return [], False
def browse_albums(self, uri_prefix, remaining):
logger.debug("Handling albums route: %s", remaining)
if len(remaining) == 2:
album = remaining[1]
payload = self.backend.client.list_tracks(
@ -225,8 +227,35 @@ class FunkwhaleLibraryProvider(backend.LibraryProvider):
]
return artists, True
if root == "by-library":
logger.debug("Handling artists by lib route: %s", end)
if len(end) == 1:
payload = self.backend.client.list_artists(
{"ordering": "name", "page_size": 50, "library": end}
)
uri_prefix = "funkwhale:directory:artists:by-name"
artists = [
convert_to_artist(row, uri_prefix=uri_prefix, ref=True)
for row in self.backend.client.load_all(payload)
]
return artists, True
return [], False
def browse_libraries(self, remaining):
logger.debug("Handling libraries route: %s", remaining)
payload = self.backend.client.list_libraries(
{"ordering": "name", "page_size": 50}
)
uri_prefix = "funkwhale:directory:artists:by-library"
libraries = [
convert_to_ref(row, uri_prefix=uri_prefix)
for row in self.backend.client.load_all(payload)
]
return libraries, True
def search(self, query=None, uris=None, exact=False):
# TODO Support exact search
if not query:
@ -337,6 +366,17 @@ def convert_to_track(payload, uri_prefix="funkwhale:tracks"):
)
def convert_to_ref(payload, uri_prefix="funkwhale:libraries"):
try:
upload = payload["uploads"][0]
except (KeyError, IndexError):
upload = {}
return models.Ref(
uri=uri_prefix + ":%s" % payload["uuid"],
name=payload["name"],
)
def to_ref(obj):
getter = getattr(models.Ref, obj.__class__.__name__.lower())
return getter(uri=obj.uri, name=obj.name)