local: Add support for list_distinct and implement for json backend
This commit is contained in:
parent
00b2b9538e
commit
ba8fc51f86
@ -89,6 +89,18 @@ class Library(object):
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def list_distinct(self, field, query=None):
|
||||
"""
|
||||
List distinct values for a given field from the library.
|
||||
|
||||
:param string field: One of ``artist``, ``albumartist``, ``album``,
|
||||
``composer``, ``performer``, ``date``or ``genre``.
|
||||
:param dict query: Query to use for limiting results, see
|
||||
:method:`search` for details about the query format.
|
||||
:rtype: set of values corresponding to the requested field type.
|
||||
"""
|
||||
return set()
|
||||
|
||||
def load(self):
|
||||
"""
|
||||
(Re)load any tracks stored in memory, if any, otherwise just return
|
||||
|
||||
@ -155,6 +155,38 @@ class JsonLibrary(local.Library):
|
||||
except KeyError:
|
||||
return []
|
||||
|
||||
def list_distinct(self, field, query=None):
|
||||
if field == 'artist':
|
||||
def distinct(track):
|
||||
return {a.name for a in track.artists}
|
||||
elif field == 'albumartist':
|
||||
def distinct(track):
|
||||
album = track.album or models.Album()
|
||||
return {a.name for a in album.artists}
|
||||
elif field == 'album':
|
||||
def distinct(track):
|
||||
album = track.album or models.Album()
|
||||
return {album.name}
|
||||
elif field == 'composer':
|
||||
def distinct(track):
|
||||
return {a.name for a in track.composers}
|
||||
elif field == 'performer':
|
||||
def distinct(track):
|
||||
return {a.name for a in track.performers}
|
||||
elif field == 'date':
|
||||
def distinct(track):
|
||||
return {track.date}
|
||||
elif field == 'genre':
|
||||
def distinct(track):
|
||||
return {track.genre}
|
||||
else:
|
||||
return set()
|
||||
|
||||
result = set()
|
||||
for track in search.search(self._tracks.values(), query).tracks:
|
||||
result.update(distinct(track))
|
||||
return result
|
||||
|
||||
def search(self, query=None, limit=100, offset=0, uris=None, exact=False):
|
||||
tracks = self._tracks.values()
|
||||
# TODO: pass limit and offset into search helpers
|
||||
|
||||
@ -23,6 +23,11 @@ class LocalLibraryProvider(backend.LibraryProvider):
|
||||
return []
|
||||
return self._library.browse(uri)
|
||||
|
||||
def list_distinct(self, field, query=None):
|
||||
if not self._library:
|
||||
return set()
|
||||
return self._library.list_distinct(field, query)
|
||||
|
||||
def refresh(self, uri=None):
|
||||
if not self._library:
|
||||
return 0
|
||||
|
||||
Loading…
Reference in New Issue
Block a user