Files
spotify-fetch/get_playlist.py

92 lines
2.4 KiB
Python

import csv
import os
import sys
import spotipy
import spotipy.util as util
from utils import get_artists
def main(playlist_id: str):
"""
Main execution point.
"""
# get credentials and callback URL from environment variables
# HINT: callback URL has to match Spotify App settings
client_id: str = os.environ.get("SPOTIPY_CLIENT_ID")
client_secret: str = os.environ.get("SPOTIPY_CLIENT_SECRET")
redirect_uri: str = os.environ.get("SPOTIPY_REDIRECT_URI")
# don't edit scope, but edit user name and playlist_id!
scope: str = "user-library-read"
username: str = "username"
# get user auth token
token: str = util.prompt_for_user_token(
username,
scope,
client_id=client_id,
client_secret=client_secret,
redirect_uri=redirect_uri,
)
# raw responses from Spotify API
items: list[dict] = []
# response elements reduced to (artist, title) tuples
tracks: list[tuple[str, str]] = []
shall_continue: bool = True
i: int = 0
if token:
# initialize API client
client = spotipy.Spotify(auth=token)
while shall_continue:
results = client.playlist_items(playlist_id=playlist_id, offset=i, limit=50)
# break if response is empty
if len(results["items"]) == 0:
break
# add items; increase offset
print(results)
items += results["items"]
i += 50
# reduce API responses to just artists and tracks
for item in items:
track: str = item["track"]
artist: str = get_artists(track["artists"])
title: str = track["name"]
# add track
tracks.append((artist, title))
# output artist and track
print(f"{artist} - {title}")
# final step: write tracks to tracks.csv file
with open(f"playlist-{playlist_id}.csv", "w", encoding="utf8") as file:
writer = csv.writer(file, quotechar='"')
writer.writerow(("Artist", "Title"))
writer.writerows(tracks)
if __name__ == "__main__":
playlist_id: str = ""
# get argument vector; ask for playlist id if it's not given,
# otherwise use argv[1] as playlist id
args = sys.argv[1:]
if len(args) == 0:
playlist_id = input("Playlist ID: ")
else:
playlist_id = args[0]
# execution
main(playlist_id)