Skip to content

Commit

Permalink
search: Split impl out of library
Browse files Browse the repository at this point in the history
  • Loading branch information
jodal committed Jul 20, 2015
1 parent 629fa3e commit bf639c3
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 53 deletions.
59 changes: 6 additions & 53 deletions mopidy_spotify/library.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
from __future__ import unicode_literals

import logging
import urllib

from mopidy import backend, models
from mopidy import backend

import spotify
from mopidy_spotify import browse, distinct, images, lookup, translator, utils
from mopidy_spotify import browse, distinct, images, lookup, search


logger = logging.getLogger(__name__)
Expand All @@ -33,52 +31,7 @@ def lookup(self, uri):
return lookup.lookup(self._config, self._backend._session, uri)

def search(self, query=None, uris=None, exact=False):
# TODO Respect `uris` argument
# TODO Support `exact` search

if query is None:
logger.debug('Ignored search without query')
return models.SearchResult(uri='spotify:search')

if 'uri' in query:
return self._search_by_uri(query)

sp_query = translator.sp_search_query(query)
if not sp_query:
logger.debug('Ignored search with empty query')
return models.SearchResult(uri='spotify:search')

uri = 'spotify:search:%s' % urllib.quote(sp_query.encode('utf-8'))
logger.info('Searching Spotify for: %s', sp_query)

if not self._backend._online.is_set():
logger.info('Spotify search aborted: Spotify is offline')
return models.SearchResult(uri=uri)

sp_search = self._backend._session.search(
sp_query,
album_count=self._config['search_album_count'],
artist_count=self._config['search_artist_count'],
track_count=self._config['search_track_count'])
sp_search.load()

albums = [
translator.to_album(sp_album) for sp_album in sp_search.albums]
artists = [
translator.to_artist(sp_artist) for sp_artist in sp_search.artists]
tracks = [
translator.to_track(sp_track) for sp_track in sp_search.tracks]

return models.SearchResult(
uri=uri, albums=albums, artists=artists, tracks=tracks)

def _search_by_uri(self, query):
tracks = []
for uri in query['uri']:
tracks += self.lookup(uri)

uri = 'spotify:search'
if len(query['uri']) == 1:
uri = query['uri'][0]

return models.SearchResult(uri=uri, tracks=tracks)
return search.search(
self._config, self._backend._session,
self._backend._online.is_set(),
query, uris, exact)
62 changes: 62 additions & 0 deletions mopidy_spotify/search.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import logging
import urllib

from mopidy import models

from mopidy_spotify import lookup, translator


logger = logging.getLogger(__name__)


def search(config, session, is_online, query=None, uris=None, exact=False):
# TODO Respect `uris` argument
# TODO Support `exact` search

if query is None:
logger.debug('Ignored search without query')
return models.SearchResult(uri='spotify:search')

if 'uri' in query:
return _search_by_uri(config, session, query)

sp_query = translator.sp_search_query(query)
if not sp_query:
logger.debug('Ignored search with empty query')
return models.SearchResult(uri='spotify:search')

uri = 'spotify:search:%s' % urllib.quote(sp_query.encode('utf-8'))
logger.info('Searching Spotify for: %s', sp_query)

if not is_online:
logger.info('Spotify search aborted: Spotify is offline')
return models.SearchResult(uri=uri)

sp_search = session.search(
sp_query,
album_count=config['search_album_count'],
artist_count=config['search_artist_count'],
track_count=config['search_track_count'])
sp_search.load()

albums = [
translator.to_album(sp_album) for sp_album in sp_search.albums]
artists = [
translator.to_artist(sp_artist) for sp_artist in sp_search.artists]
tracks = [
translator.to_track(sp_track) for sp_track in sp_search.tracks]

return models.SearchResult(
uri=uri, albums=albums, artists=artists, tracks=tracks)


def _search_by_uri(config, session, query):
tracks = []
for uri in query['uri']:
tracks += lookup.lookup(config, session, uri)

uri = 'spotify:search'
if len(query['uri']) == 1:
uri = query['uri'][0]

return models.SearchResult(uri=uri, tracks=tracks)

0 comments on commit bf639c3

Please sign in to comment.