Search code examples
pythonspotify

Using python to get a track from the spotify API by using search Endpoint


So I'm trying to get a track from the spotify API by searching for it by using the search endpoint of the API (See documentation). First, I authorize myself so I can send GET requests. This happens without issues, I added the code for reproducibility.

import requests

CLIENT_ID = "your_id_here"
CLIENT_SECRET = "your_secret_here"

AUTH_URL = "https://accounts.spotify.com/api/token"
auth_response = requests.post(AUTH_URL, {
    'grant_type': 'client_credentials',
    'client_id': CLIENT_ID,
    'client_secret': CLIENT_SECRET,
})

#Convert response to JSON
auth_response_data = auth_response.json()

#Save the access token
access_token = auth_response_data['access_token']

#Need to pass access token into header to send properly formed GET request to API server
headers = {
    'Authorization': 'Bearer {token}'.format(token=access_token)
}

Then, I want to use the search endpoint of the API to find a track by using the track name + artist (I need the track ID later on). When I use the example provided in the documentation, everything works fine and an artist object is returned by using the following query:

BASE_URL = 'https://api.spotify.com/v1/'
r = requests.get(BASE_URL + 'search?q=tania%20bowra&type=artist', headers=headers)
r = r.json()

This is the response, which looks exactly like the one in documentation:

{'artists': {'href': 'https://api.spotify.com/v1/search?query=tania+bowra&type=artist&offset=0&limit=20',
             'items': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/08td7MxkoHQkXnWAYD8d6Q'},
                        'followers': {'href': None, 'total': 235},
                        'genres': [],
                        'href': 'https://api.spotify.com/v1/artists/08td7MxkoHQkXnWAYD8d6Q',
                        'id': '08td7MxkoHQkXnWAYD8d6Q',
                        'images': [{'height': 640,
                                    'url': 'https://i.scdn.co/image/ab67616d0000b2731ae2bdc1378da1b440e1f610',
                                    'width': 640},
                                   {'height': 300,
                                    'url': 'https://i.scdn.co/image/ab67616d00001e021ae2bdc1378da1b440e1f610',
                                    'width': 300},
                                   {'height': 64,
                                    'url': 'https://i.scdn.co/image/ab67616d000048511ae2bdc1378da1b440e1f610',
                                    'width': 64}],
                        'name': 'Tania Bowra',
                        'popularity': 1,
                        'type': 'artist',
                        'uri': 'spotify:artist:08td7MxkoHQkXnWAYD8d6Q'}],
             'limit': 20,
             'next': None,
             'offset': 0,
             'previous': None,
             'total': 1}}

Applying the same logic, I tried to get a track object from the api by using an artist and a track name, like so:

BASE_URL = 'https://api.spotify.com/v1/'
r = requests.get(BASE_URL + 'search?q=artist:queen%20track:bohemian%20rapsody&type=track', headers=headers)
r = r.json()

Even though I do get a valid response (statuscode==200), it seems to be empty:

 {'tracks': {'href': 'https://api.spotify.com/v1/search?query=artist%3Aqueen+track%3Abohemian+rapsody&type=track&offset=0&limit=20',
            'items': [],
            'limit': 20,
            'next': None,
            'offset': 0,
            'previous': None,
            'total': 0}}

My question is: why is this happening?


Solution

  • You are now searching for the query: artist:queen%20track:bohemian%20rapsody while this should just be queen%20bohemian%20rapsody instead. the type afterwards shows what items you want to return. You dont have to determine the artist and track name seperately in the query. Interpret the query just like typing something into the spotify search bar.