I have written a Python script to extract YouTube links for songs in a Spotify playlist. Regrettably, it seems to fetch only the initial 100 songs out of a total of over 2000 in the playlist. Additionally, when I attempt to run the code for the second time, I encounter a 403 error, signaling a quota limit breach.
As a newbie, any guidance or support you can provide would be greatly appreciated.
Thanks in advance.
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
from googleapiclient.discovery import build
import requests_cache
import time
# Enable caching with requests_cache
requests_cache.install_cache('youtube_cache', expire_after=3600)
# Spotify API credentials (hidden)
SPOTIFY_CLIENT_ID = 'XXX'
SPOTIFY_CLIENT_SECRET = 'XXX'
# YouTube API key (hidden)
YOUTUBE_API_KEY = 'XXX'
# Spotify playlist ID (hidden)
SPOTIFY_PLAYLIST_ID = 'XXX'
# Spotify authentication
sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials(client_id=SPOTIFY_CLIENT_ID, client_secret=SPOTIFY_CLIENT_SECRET))
# YouTube API
youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
# Fetch all tracks from a playlist, handling pagination
def fetch_all_tracks(sp, playlist_id):
all_tracks = []
offset = 0
limit = 100 # Set the limit to the maximum (100) initially
while True:
response = sp.playlist_tracks(playlist_id, offset=offset, limit=limit)
tracks = response['items']
if not tracks:
break
all_tracks.extend(tracks)
offset += len(tracks)
# Update the limit for the next request
limit = min(100, response['total'] - offset)
return all_tracks
# Extract track information
def extract_track_info(track):
track_info = {
'name': track['track']['name'],
'artists': [artist['name'] for artist in track['track']['artists']]
}
return track_info
# Search for the respective track on YouTube using API key with rate limiting
def search_on_youtube(api_key, query):
time.sleep(1) # Introduce a delay of 1 second between requests
request = youtube.search().list(q=query, part='snippet', type='video', maxResults=1)
response = request.execute()
video_id = response['items'][0]['id']['videoId']
return video_id
# Add video to YouTube Music (manual step)
def add_to_youtube_music(video_id):
print(f"Add video to YouTube Music: https://www.youtube.com/watch?v={video_id}")
print("Manually add this video to your YouTube Music library.")
# Transfer playlist to YouTube Music
def transfer_to_youtube_music(api_key, playlist_name, tracks):
for track in tracks:
query = f"{track['name']} {', '.join(track['artists'])}"
video_id = search_on_youtube(api_key, query)
# Perform actions with video_id as needed (e.g., add to YouTube Music)
add_to_youtube_music(video_id)
if __name__ == '__main__':
# Fetch playlist from Spotify
playlist_name, tracks = fetch_playlist_by_id(sp, SPOTIFY_PLAYLIST_ID)
# Transfer playlist to YouTube Music
transfer_to_youtube_music(YOUTUBE_API_KEY, playlist_name, tracks)
print(f'Transferred playlist "{playlist_name}" to YouTube Music.')