local: Add support for list_distinct and implement for json backend

This commit is contained in:
Thomas Adamcik 2015-03-01 22:48:16 +01:00
parent 00b2b9538e
commit ba8fc51f86
3 changed files with 49 additions and 0 deletions

View File

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

View File

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

View File

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