Extracting YouTube Links for Songs in a Spotify Playlist

128 Views Asked by At

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.')
0

There are 0 best solutions below