Search code examples
python-3.xspotifyspotipy

Spotipy - Listing only track and artists names in a playlist


Hello All and thank you in advance for your help :)

Can someone help me understand how I can take the below code, which displays data for a specified playlist, and have it only show the artist and track names? I have been toying around with the API documentation for several hours and I have not been able to make heads or tales of it. Right now when it displays data it gives me a whole bunch of data in a jumbled mess. Also, note that I put dummy values in the client_id and Secret parts of this code.

from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
import json


PlaylistExample = '37i9dQZEVXbMDoHDwVN2tF'

cid = '123'
secret = 'xyz'


auth_manager = SpotifyClientCredentials(client_id=cid, client_secret=secret)
sp = spotipy.Spotify(auth_manager=auth_manager)




playlist_id = 'spotify:user:spotifycharts:playlist:37i9dQZEVXbJiZcmkrIHGU'
results = sp.playlist(playlist_id)
print(json.dumps(results, indent=4))

Solution

  • Would something like this be useful?:

    print("Song - Artist - Album\n")
    
    for item in results['tracks']['items']:
        print(
            item['track']['name'] + ' - ' +
            item['track']['artists'][0]['name'] + ' - ' +
            item['track']['album']['name']
        )
        
    

    Your output will look similar to this:

    Song - Artist - Album
    
    ONLY - ZHU - ONLY
    Bad - 2012 Remaster - Michael Jackson - Bad 25th Anniversary
    Orion - Rodrigo y Gabriela - Rodrigo y Gabriela
    Shape of You - Ed Sheeran - ÷ (Deluxe)
    

    Alternatively, you could create your own structure based on the returned one by Spotify but just keeping what you need:

    result_dict = {
        'tracks': {
            'items': [],
            'limit': 100,
            'next': None,
            'offset': 0,
            'previous': None,
            'total': 16
        },
        'type': 'playlist',
        'uri': '<playlist_uri>'
    }
    

    And your track structure that goes inside 'items' from above:

    track_dict = {
        'track': {
            'album': {
                'name': item['track']['album']['name'],
            },
            'artists': [{
                'name': item['track']['artists'][0]['name'],
            }],
            'name': item['track']['name'],
        }
    }
    

    Then iterate and insert one by one:

    for item in results['tracks']['items']:
        track_dict = {
            'track': {
                'album': {
                    'name': item['track']['album']['name'],
                },
                'artists': [{
                    'name': item['track']['artists'][0]['name'],
                }],
                'name': item['track']['name'],
            }
        }
        # Append the track dict structure to your results dict structure
        result_dict['tracks']['items'].append(track_dict)
    

    Having this as a result when printing result_dict:

    {
      'tracks': {
        'items': [{
          'track': {
            'album': {
              'name': 'ONLY'
            },
            'artists': [{
              'name': 'ZHU'
            }],
            'name': 'ONLY'
          }
        }, {
          'track': {
            'album': {
              'name': 'Bad 25th Anniversary'
            },
            'artists': [{
              'name': 'Michael Jackson'
            }],
            'name': 'Bad - 2012 Remaster'
          }
        }, {
          'track': {
            'album': {
              'name': 'Rodrigo y Gabriela'
            },
            'artists': [{
              'name': 'Rodrigo y Gabriela'
            }],
            'name': 'Orion'
          }
        }, {
          'track': {
            'album': {
              'name': '÷ (Deluxe)'
            },
            'artists': [{
              'name': 'Ed Sheeran'
            }],
            'name': 'Shape of You'
          }
        }],
        'limit': 100,
        'next': None,
        'offset': 0,
        'previous': None,
        'total': 4
      },
      'type': 'playlist',
      'uri': '<playlist_uri>'
    }