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
|
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):
|
def load(self):
|
||||||
"""
|
"""
|
||||||
(Re)load any tracks stored in memory, if any, otherwise just return
|
(Re)load any tracks stored in memory, if any, otherwise just return
|
||||||
|
|||||||
@ -155,6 +155,38 @@ class JsonLibrary(local.Library):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
return []
|
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):
|
def search(self, query=None, limit=100, offset=0, uris=None, exact=False):
|
||||||
tracks = self._tracks.values()
|
tracks = self._tracks.values()
|
||||||
# TODO: pass limit and offset into search helpers
|
# TODO: pass limit and offset into search helpers
|
||||||
|
|||||||
@ -23,6 +23,11 @@ class LocalLibraryProvider(backend.LibraryProvider):
|
|||||||
return []
|
return []
|
||||||
return self._library.browse(uri)
|
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):
|
def refresh(self, uri=None):
|
||||||
if not self._library:
|
if not self._library:
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user