Skip to content

Instantly share code, notes, and snippets.

@tai-fukaya
Created August 25, 2019 13:47
Show Gist options
  • Save tai-fukaya/4ced66a13fd26056e040a13c0041b19a to your computer and use it in GitHub Desktop.
Save tai-fukaya/4ced66a13fd26056e040a13c0041b19a to your computer and use it in GitHub Desktop.
Spotifyのプレイリスト情報取得
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import sys
playlist_id = '<playlist_id>'
client_id = '<client_id>'
client_secret = '<client_secret>'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
base_dir = '<save_dir>'
playlist_file = f"{base_dir}/playlist-{playlist_id}.csv"
artist_file = f"{base_dir}/artist-{playlist_id}.csv"
album_file = f"{base_dir}/album-{playlist_id}.csv"
tracks = []
artists = {}
albums = {}
# parse playlist
result = spotify._get(f"playlists/{playlist_id}")
playlist_id = result.get("id")
playlist_name = result.get("name")
for i, item in enumerate(result.get("tracks",{}).get("items",[])):
track = item.get("track", {})
playlist_track_number = i + 1
track_id = track.get('id')
track_name = track.get('name')
popularity = track.get("popularity", 0)
duration = track.get("duration_ms", 0)
track_result = spotify._get(f"audio-features/{track_id}")
key = track_result.get("key", 0)
mode = track_result.get("mode", 0)
time_signature = track_result.get("time_signature", 0)
tempo = track_result.get("tempo", 0)
danceability = track_result.get("danceability", 0.0)
energy = track_result.get("energy", 0.0)
loudness = track_result.get("loudness", 0.0)
speechiness = track_result.get("speechiness", 0.0)
acousticness = track_result.get("acousticness", 0.0)
instrumentalness = track_result.get("instrumentalness", 0.0)
liveness = track_result.get("liveness", 0.0)
valence = track_result.get("valence", 0.0)
album = track.get('album', {})
album_id = album.get("id", "")
album_name = album.get("name", "")
release_date = album.get("release_date")
track_artists = []
for a in track.get('artists', []):
artist_id = a.get("id")
artist_name = a.get("name")
if artist_id in track_artists:
track_artists.append(artists[artist_id])
continue
artist_result = spotify._get(f"artists/{artist_id}")
followers_total = artist_result.get("followers", {}).get("total", 0)
popularity = artist_result.get('popularity', 0)
genres = artist_result.get('genres', [])
artist_item = {
"id": artist_id,
"name": artist_name,
"followers_total": followers_total,
"popularity": popularity,
"genres": genres,
}
track_artists.append(artist_item)
artists[artist_id] = artist_item
album_item = {
"id": album_id,
"name": album_name,
"release_date": release_date,
}
albums[album_id] = album_item
track_item = {
"playlist_id": playlist_id,
"track_id": track_id,
"album_id": album_id,
"artist_id": ",".join([x["id"] for x in track_artists]),
"playlist_name": playlist_name,
"playlist_track_number": playlist_track_number,
"track_name": track_name,
"album_name": album_name,
"release_date": release_date,
"artist_name": " / ".join([x["name"] for x in track_artists]),
"popularity": popularity,
"duration": duration,
"key": key,
"mode": mode,
"time_signature": time_signature,
"tempo": tempo,
"danceability": danceability,
"energy":energy,
"loudness":loudness,
"speechiness":speechiness,
"acousticness":acousticness,
"instrumentalness":instrumentalness,
"liveness":liveness,
"valence":valence,
}
tracks.append(track_item)
print(f"track: {item.get('track').get('id')}")
print(f"album: {item.get('track').get('album').get('id')}")
for artist in item.get("track").get("artists"):
print(f"artist: {artist.get('id')}")
with open(playlist_file, 'w') as f:
csv_data = []
for t in tracks:
csv_data.append(','.join([
t["playlist_id"],
t["track_id"],
t["album_id"],
f'\"{t["artist_id"]}\"',
f'\"{t["playlist_name"]}\"',
str(t["playlist_track_number"]),
f'\"{t["track_name"]}\"',
f'\"{t["artist_name"]}\"',
f'\"{t["album_name"]}\"',
t["release_date"],
str(t["popularity"]),
str(t["duration"]),
str(t["key"]),
str(t["mode"]),
str(t["time_signature"]),
str(t["tempo"]),
str(t["danceability"]),
str(t["energy"]),
str(t["loudness"]),
str(t["speechiness"]),
str(t["acousticness"]),
str(t["instrumentalness"]),
str(t["liveness"]),
str(t["valence"]),
]))
f.write('\n'.join(csv_data))
with open(album_file, 'w') as f:
csv_data = []
for k, v in albums.items():
csv_data.append(','.join([
v["id"],
f'\"{v["name"]}\"',
v["release_date"],
]))
f.write('\n'.join(csv_data))
with open(artist_file, 'w') as f:
csv_data = []
for k, v in artists.items():
csv_data.append(','.join([
v["id"],
f'\"{v["name"]}\"',
str(v["followers_total"]),
str(v["popularity"]),
','.join([f'\"{x}\"' for x in v["genres"]]),
]))
f.write('\n'.join(csv_data))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment