Reputation: 11
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
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