Skip to content

Commit

Permalink
Merge pull request #15 from sumpfralle/mopidy_beets-exakt_search
Browse files Browse the repository at this point in the history
Exact search
  • Loading branch information
jodal committed Apr 28, 2016
2 parents fd70574 + 6591560 commit a96148c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 8 deletions.
28 changes: 22 additions & 6 deletions mopidy_beets/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,16 +84,32 @@ def get_item_by(self, name):
except Exception:
return False

@cache()
def get_track_by_artist(self, artist):
return [track for track in (self.get_item_by(artist) or [])
if track["artist"] == artist]

@cache()
def get_track_by_title(self, title):
return [track for track in (self.get_item_by(title) or [])
if track["title"] == title]

@cache()
def get_artists(self):
res = self._get('/artist/')
try:
return res[u'artist_names']
except KeyError:
return False

@cache()
def get_album_by(self, name):
if isinstance(name, unicode):
name = name.encode('utf-8')
res = self._get('/album/query/%s' %
urllib.quote(name)).get('results')
try:
return self._parse_query(res[0]['items'])
except Exception:
return False
albums = self._get('/album/query/%s' %
urllib.quote(name)).get('results')
# deliver a list of album dictionaries
return albums

def _get(self, url):
try:
Expand Down
31 changes: 29 additions & 2 deletions mopidy_beets/library.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,40 @@ def __init__(self, *args, **kwargs):
super(BeetsLibraryProvider, self).__init__(*args, **kwargs)
self.remote = self.backend.beets_api

def search(self, query=None, uris=None, exact=False):
# TODO Support exact search
def _find_exact(self, query=None, uris=None):
if not query:
# Fetch all artists (browse library)
return SearchResult(
uri='beets:search',
tracks=self.remote.get_artists())
else:
results = []
if 'artist' in query:
results.append(self.remote.get_track_by_artist(
query['artist'][0]))
if 'album' in query:
results.append(self.remote.get_track_by_title(
query['album'][0]))
if len(results) > 1:
# return only albums that match all restrictions
results_set = set(results.pop(0))
while results:
results_set.intersection_update(set(results.pop(0)))
tracks = list(results_set)
elif len(results) == 1:
tracks = results[0]
else:
tracks = []
return SearchResult(uri='beets:tracks', tracks=tracks)

def search(self, query=None, uris=None, exact=False):
logger.debug('Query "%s":' % query)
if not self.remote.has_connection:
return []

if exact:
return self._find_exact(query=query, uris=uris)

if not query:
# Fetch all data(browse library)
return SearchResult(
Expand Down

0 comments on commit a96148c

Please sign in to comment.