From ba8fc51f860861c5bfebc1db2ca4f5f8b7be0ddf Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 1 Mar 2015 22:48:16 +0100 Subject: [PATCH] local: Add support for list_distinct and implement for json backend --- mopidy/local/__init__.py | 12 ++++++++++++ mopidy/local/json.py | 32 ++++++++++++++++++++++++++++++++ mopidy/local/library.py | 5 +++++ 3 files changed, 49 insertions(+) diff --git a/mopidy/local/__init__.py b/mopidy/local/__init__.py index 31ec6426..3099e240 100644 --- a/mopidy/local/__init__.py +++ b/mopidy/local/__init__.py @@ -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 diff --git a/mopidy/local/json.py b/mopidy/local/json.py index 38e1bf6c..dcf8ff9b 100644 --- a/mopidy/local/json.py +++ b/mopidy/local/json.py @@ -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 diff --git a/mopidy/local/library.py b/mopidy/local/library.py index f3828f1b..8a6c2a8a 100644 --- a/mopidy/local/library.py +++ b/mopidy/local/library.py @@ -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