Example #1
0
    def test_date_is_ignored_if_not_parseable(self, caplog):
        query = translator.sp_search_query({'date': ['abc']})

        assert query == ''
        assert (
            'Excluded year from search query: Cannot parse date "abc"'
            in caplog.text())
Example #2
0
def search(config, session, web_client,
           query=None, uris=None, exact=False, types=_SEARCH_TYPES):
    # 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 session.connection.state is not spotify.ConnectionState.LOGGED_IN:
        logger.info('Spotify search aborted: Spotify is offline')
        return models.SearchResult(uri=uri)

    search_count = max(
        config['search_album_count'],
        config['search_artist_count'],
        config['search_track_count'])

    if search_count > 50:
        logger.warn(
            'Spotify currently allows maximum 50 search results of each type. '
            'Please set the config values spotify/search_album_count, '
            'spotify/search_artist_count and spotify/search_track_count '
            'to at most 50.')
        search_count = 50

    result = web_client.get(_API_BASE_URI, params={
        'q': sp_query,
        'limit': search_count,
        'type': ','.join(types)})

    albums = [
        translator.web_to_album(web_album) for web_album in
        result['albums']['items'][:config['search_album_count']]
    ] if 'albums' in result else []

    artists = [
        translator.web_to_artist(web_artist) for web_artist in
        result['artists']['items'][:config['search_artist_count']]
    ] if 'artists' in result else []

    tracks = [
        translator.web_to_track(web_track) for web_track in
        result['tracks']['items'][:config['search_track_count']]
    ] if 'tracks' in result else []

    return models.SearchResult(
        uri=uri, albums=albums, artists=artists, tracks=tracks)
Example #3
0
    def test_date_is_ignored_if_not_parseable(self, caplog):
        query = translator.sp_search_query({"date": ["abc"]})

        assert query == ""
        assert (
            'Excluded year from search query: Cannot parse date "abc"'
            in caplog.text
        )
Example #4
0
    def test_anything_can_be_combined(self):
        query = translator.sp_search_query({
            "any": ["ABC", "DEF"],
            "artist": ["ABBA"],
            "album": ["Greatest Hits"],
            "track_name": ["Dancing Queen"],
            "year": ["1970-01-02"],
        })

        assert '"ABC"' in query
        assert '"DEF"' in query
        assert 'artist:"ABBA"' in query
        assert 'album:"Greatest Hits"' in query
        assert 'track:"Dancing Queen"' in query
        assert "year:1970" in query
Example #5
0
    def test_anything_can_be_combined(self):
        query = translator.sp_search_query({
            'any': ['ABC', 'DEF'],
            'artist': ['ABBA'],
            'album': ['Greatest Hits'],
            'track_name': ['Dancing Queen'],
            'year': ['1970-01-02'],
        })

        assert '"ABC"' in query
        assert '"DEF"' in query
        assert 'artist:"ABBA"' in query
        assert 'album:"Greatest Hits"' in query
        assert 'track:"Dancing Queen"' in query
        assert 'year:1970' in query
Example #6
0
    def test_anything_can_be_combined(self):
        query = translator.sp_search_query({
            'any': ['ABC', 'DEF'],
            'artist': ['ABBA'],
            'album': ['Greatest Hits'],
            'track_name': ['Dancing Queen'],
            'year': ['1970-01-02'],
        })

        assert '"ABC"' in query
        assert '"DEF"' in query
        assert 'artist:"ABBA"' in query
        assert 'album:"Greatest Hits"' in query
        assert 'track:"Dancing Queen"' in query
        assert 'year:1970' in query
def get_distinct(config, session, field, query=None):
    # To make the returned data as interesting as possible, we limit
    # ourselves to data extracted from the user's playlists when no search
    # query is included.

    sp_query = translator.sp_search_query(query) if query else None

    if field == 'artist':
        result = _get_distinct_artists(config, session, sp_query)
    elif field == 'albumartist':
        result = _get_distinct_albumartists(config, session, sp_query)
    elif field == 'album':
        result = _get_distinct_albums(config, session, sp_query)
    elif field == 'date':
        result = _get_distinct_dates(config, session, sp_query)
    else:
        result = set()

    return result - {None}
Example #8
0
def search(config, session, 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 session.connection.state is not spotify.ConnectionState.LOGGED_IN:
        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)
Example #9
0
def search(config, session, 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 session.connection.state is not spotify.ConnectionState.LOGGED_IN:
        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)
Example #10
0
    def test_album_maps_to_album(self):
        query = translator.sp_search_query({'album': ['Greatest Hits']})

        assert query == 'album:"Greatest Hits"'
Example #11
0
    def test_albumartist_maps_to_artist(self):
        # We don't know how to filter by albumartist in Spotify

        query = translator.sp_search_query({'albumartist': ['ABBA', 'ACDC']})

        assert query == 'artist:"ABBA" artist:"ACDC"'
Example #12
0
    def test_artist_maps_to_artist(self):
        query = translator.sp_search_query({'artist': ['ABBA', 'ACDC']})

        assert query == 'artist:"ABBA" artist:"ACDC"'
Example #13
0
    def test_any_maps_to_no_field(self):
        query = translator.sp_search_query({'any': ['ABC', 'DEF']})

        assert query == '"ABC" "DEF"'
Example #14
0
def search(
    config,
    session,
    web_client,
    query=None,
    uris=None,
    exact=False,
    types=_SEARCH_TYPES,
):
    # 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, web_client, 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 = f"spotify:search:{urllib.parse.quote(sp_query)}"
    logger.info(f"Searching Spotify for: {sp_query}")

    if session.connection.state is not spotify.ConnectionState.LOGGED_IN:
        logger.info("Spotify search aborted: Spotify is offline")
        return models.SearchResult(uri=uri)

    search_count = max(
        config["search_album_count"],
        config["search_artist_count"],
        config["search_track_count"],
    )

    if search_count > 50:
        logger.warn(
            "Spotify currently allows maximum 50 search results of each type. "
            "Please set the config values spotify/search_album_count, "
            "spotify/search_artist_count and spotify/search_track_count "
            "to at most 50.")
        search_count = 50

    result = web_client.get(
        "search",
        params={
            "q": sp_query,
            "limit": search_count,
            "market": "from_token",
            "type": ",".join(types),
        },
    )

    albums = ([
        translator.web_to_album(web_album) for web_album in result["albums"]
        ["items"][:config["search_album_count"]]
    ] if "albums" in result else [])

    artists = ([
        translator.web_to_artist(web_artist) for web_artist in
        result["artists"]["items"][:config["search_artist_count"]]
    ] if "artists" in result else [])

    tracks = ([
        translator.web_to_track(web_track) for web_track in result["tracks"]
        ["items"][:config["search_track_count"]]
    ] if "tracks" in result else [])

    return models.SearchResult(uri=uri,
                               albums=albums,
                               artists=artists,
                               tracks=tracks)
Example #15
0
    def test_any_maps_to_no_field(self):
        query = translator.sp_search_query({"any": ["ABC", "DEF"]})

        assert query == '"ABC" "DEF"'
Example #16
0
    def test_date_maps_to_year(self):
        query = translator.sp_search_query({'date': ['1970']})

        assert query == 'year:1970'
Example #17
0
    def test_track_name_maps_to_track(self):
        query = translator.sp_search_query({"track_name": ["ABC"]})

        assert query == 'track:"ABC"'
Example #18
0
    def test_date_maps_to_year(self):
        query = translator.sp_search_query({"date": ["1970"]})

        assert query == "year:1970"
Example #19
0
    def test_track_name_maps_to_track(self):
        query = translator.sp_search_query({'track_name': ['ABC']})

        assert query == 'track:"ABC"'
Example #20
0
    def test_album_maps_to_album(self):
        query = translator.sp_search_query({'album': ['Greatest Hits']})

        assert query == 'album:"Greatest Hits"'
Example #21
0
    def test_albumartist_maps_to_artist(self):
        # We don't know how to filter by albumartist in Spotify

        query = translator.sp_search_query({'albumartist': ['ABBA', 'ACDC']})

        assert query == 'artist:"ABBA" artist:"ACDC"'
Example #22
0
    def test_artist_maps_to_artist(self):
        query = translator.sp_search_query({'artist': ['ABBA', 'ACDC']})

        assert query == 'artist:"ABBA" artist:"ACDC"'
Example #23
0
    def test_any_maps_to_no_field(self):
        query = translator.sp_search_query({'any': ['ABC', 'DEF']})

        assert query == '"ABC" "DEF"'
Example #24
0
    def test_track_name_maps_to_track(self):
        query = translator.sp_search_query({'track_name': ['ABC']})

        assert query == 'track:"ABC"'
Example #25
0
    def test_track_number_is_not_supported(self):
        # We don't know how to filter by track number in Spotify

        query = translator.sp_search_query({'track_number': ['10']})

        assert query == ''
Example #26
0
    def test_date_is_transformed_to_just_the_year(self):
        query = translator.sp_search_query({'date': ['1970-02-01']})

        assert query == 'year:1970'
Example #27
0
    def test_date_is_transformed_to_just_the_year(self):
        query = translator.sp_search_query({'date': ['1970-02-01']})

        assert query == 'year:1970'
Example #28
0
    def test_artist_maps_to_artist(self):
        query = translator.sp_search_query({"artist": ["ABBA", "ACDC"]})

        assert query == 'artist:"ABBA" artist:"ACDC"'
Example #29
0
    def test_track_number_is_not_supported(self):
        # We don't know how to filter by track number in Spotify

        query = translator.sp_search_query({'track_number': ['10']})

        assert query == ''
Example #30
0
    def test_date_is_transformed_to_just_the_year(self):
        query = translator.sp_search_query({"date": ["1970-02-01"]})

        assert query == "year:1970"
Example #31
0
def search(config,
           session,
           web_client,
           query=None,
           uris=None,
           exact=False,
           types=_SEARCH_TYPES):
    # 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, web_client)

    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 session.connection.state is not spotify.ConnectionState.LOGGED_IN:
        logger.info('Spotify search aborted: Spotify is offline')
        return models.SearchResult(uri=uri)

    search_count = max(config['search_album_count'],
                       config['search_artist_count'],
                       config['search_track_count'])

    if search_count > 50:
        logger.warn(
            'Spotify currently allows maximum 50 search results of each type. '
            'Please set the config values spotify/search_album_count, '
            'spotify/search_artist_count and spotify/search_track_count '
            'to at most 50.')
        search_count = 50

    result = web_client.get('search',
                            params={
                                'q': sp_query,
                                'limit': search_count,
                                'market': session.user_country,
                                'type': ','.join(types)
                            })

    albums = [
        translator.web_to_album(web_album) for web_album in result['albums']
        ['items'][:config['search_album_count']]
    ] if 'albums' in result else []

    artists = [
        translator.web_to_artist(web_artist) for web_artist in
        result['artists']['items'][:config['search_artist_count']]
    ] if 'artists' in result else []

    tracks = [
        translator.web_to_track(web_track) for web_track in result['tracks']
        ['items'][:config['search_track_count']]
    ] if 'tracks' in result else []

    return models.SearchResult(uri=uri,
                               albums=albums,
                               artists=artists,
                               tracks=tracks)
Example #32
0
    def test_date_maps_to_year(self):
        query = translator.sp_search_query({'date': ['1970']})

        assert query == 'year:1970'