awesomechop
awesomechop

Reputation: 11

Why am I only getting one song from Spotify playlists isntead of all of them?

I'm new to programming. I want to make sentiment analysis combined with audio features analysis of my Spotify playlists using SpotiPy and PyLyrics.

I'm trying to get this code work but I managed to get only one song to my CSV, even though my playlists are much bigger.

from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
import json
import csv
import pylyrics3
from nltk.sentiment.vader import SentimentIntensityAnalyzer as SIA

client_credentials_manager = SpotifyClientCredentials(client_id='#########', client_secret='#########')

sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

sentiment_analyzer = SIA()

def get_features(track_id):
    features_results = sp.audio_features(track_id)
    json_features = json.dumps(features_results)
    features_data = json.loads(json_features)
    features_list = list(features_data[0].values())
    return features_list

playlist_ids = [
    "6itzpx6OEo76NWSpy0f3fc",
    "3itylhqRqKPS4nOgWmU7lU",
    "63UBtWxXAtUIR6djuNhGj9",
    "6tZo11hLgEslYdMP5wu4q8",
    "3XXl0JH2uLXpmO5EbH6XPb"
]

# Audio features
feature_names = [
  "danceability",
  "energy",
  "key",
  "loudness",
  "mode",
  "speechiness",
  "acousticness",
  "instrumentalness",
  "liveness",
  "valence",
  "tempo",
  "type",
  "id",
  "uri",
  "track_href",
  "analysis_url",
  "duration_ms",
  "time_signature"
]

username = '#########'

# Write data to CSV file
data_file = open('data.csv','w')

writer = csv.writer(data_file)

# Write header
writer.writerow(['track_id', 'playlist_id', 'date_added', 'track_name', 'first_artist'] + feature_names + ['lyrics', 'neg', 'neu', 'pos', 'compound'])

for playlist_id in playlist_ids:
    print('Querying playlist: ' + str(playlist_id))

    repeat_query = True
    offset_n = 0
    for i in range(2):
        # Query Spotify API
        if i > 0:
            print('Repeating query')
            offset_n += 50
        results = sp.user_playlist_tracks(username, playlist_id, offset=offset_n)
        json_results = json.dumps(results)
        data = json.loads(json_results)

# Write rows

for track in data['items']:
                track_id = track['track']['id']
                date_added = track['added_at']
                track_name = track['track']['name']
                first_artist = track['track']['artists'][0]['name']

# Track features

features = get_features(track_id)

# Try to get lyrics, if available

lyrics = ''

try:
                lyrics = pylyrics3.get_song_lyrics(first_artist, track_name)

except:
                pass

# Sentiment Analysis

neg = None            
neu = None            
pos = None

compound = None

if lyrics:
                snt = sentiment_analyzer.polarity_scores(lyrics)
                neg = snt['neg']
                neu = snt['neu']
                pos = snt['pos']
                compound = snt['compound']

writer.writerow([track_id, playlist_id, date_added, track_name, first_artist] + features + [lyrics] + [neg, neu, pos, compound])

#if data['total'] < 50:
#           break           ????

print('Done querying')

data_file.close()

Does anyone have any idea what is wrong here and how to get all tracks from my playlists to csv?

Upvotes: 0

Views: 357

Answers (1)

Jainil Patel
Jainil Patel

Reputation: 1324

from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
import json
import csv
import pylyrics3
from nltk.sentiment.vader import SentimentIntensityAnalyzer as SIA
import nltk
import spotipy.util as util


nltk.download('vader_lexicon')

client_credentials_manager = SpotifyClientCredentials(client_id='befa36b5832642fdbb2aa9062f167a7b', client_secret='6ae5e340ddb048839359f53a0bf9abb2')

sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

sentiment_analyzer = SIA()

def get_features(track_id):
    features_results = sp.audio_features(track_id)
    json_features = json.dumps(features_results)
    features_data = json.loads(json_features)
    features_list = list(features_data[0].values())
    return features_list

playlist_ids = [
    "6itzpx6OEo76NWSpy0f3fc",
    "3itylhqRqKPS4nOgWmU7lU",
    "63UBtWxXAtUIR6djuNhGj9",
    "6tZo11hLgEslYdMP5wu4q8",
    "3XXl0JH2uLXpmO5EbH6XPb",
    "5iNZJ2AZghsNgbZgNUngyv",
]




# Audio features
feature_names = [
  "danceability",
  "energy",
  "key",
  "loudness",
  "mode",
  "speechiness",
  "acousticness",
  "instrumentalness",
  "liveness",
  "valence",
  "tempo",
  "type",
  "id",
  "uri",
  "track_href",
  "analysis_url",
  "duration_ms",
  "time_signature"
]

username = 'h93pdaba60md5qbuazllf0mft'



# Write data to CSV file
data_file = open('data.csv','w')

writer = csv.writer(data_file)

# Write header
writer.writerow(['track_id', 'playlist_id', 'date_added', 'track_name', 'first_artist'] + feature_names + ['lyrics', 'neg', 'neu', 'pos', 'compound'])

for playlist_id in playlist_ids:
    print('Querying playlist: ' + str(playlist_id))

    repeat_query = True
    offset_n = 0
    for i in range(2):
        # Query Spotify API
        if i > 0:
            print('Repeating query')
            offset_n += 50
        results = sp.user_playlist_tracks(username, playlist_id, offset=offset_n)
        json_results = json.dumps(results)
        data = json.loads(json_results)

# Write rows

        for track in data['items']:
                        track_id = track['track']['id']
                        date_added = track['added_at']
                        track_name = track['track']['name']
                        first_artist = track['track']['artists'][0]['name']

# Track features

                        features = get_features(track_id)

# Try to get lyrics, if available

                        lyrics = ''

                        try:
                                        lyrics = pylyrics3.get_song_lyrics(first_artist, track_name)

                        except:
                                        pass

# Sentiment Analysis

                        neg = None
                        neu = None
                        pos = None

                        compound = None

                        if lyrics:
                                        snt = sentiment_analyzer.polarity_scores(lyrics)
                                        neg = snt['neg']
                                        neu = snt['neu']
                                        pos = snt['pos']
                                        compound = snt['compound']
                        try:
                            writer.writerow([track_id, playlist_id, date_added, track_name, first_artist] + features + [lyrics] + [neg, neu, pos, compound])
                        except:
                            print("error in csv writting")
                    #if data['total'] < 50:
                    #           break           ????

    print('Done querying')

data_file.close()

Upvotes: 2

Related Questions