Skip to content

Usage Examples

Command Line Interface Examples

Basic Commands

Test Your Setup

# Test both Spotify and YouTube Music connections
python main.py test

# Expected output:
# 🎵 Spotify to YouTube Music Transfer Tool
# Testing Spotify connection...
# ✅ Spotify connection successful
# Testing YouTube Music connection...
# ✅ YouTube Music connection successful
# 🎉 All connections successful!

List Playlists

# List your Spotify playlists (default: 20)
python main.py list-spotify

# List with custom limit
python main.py list-spotify --limit 50

# List YouTube Music playlists
python main.py list-youtube --limit 25

Search for Tracks

# Search for a specific song
python main.py search "Bohemian Rhapsody Queen"

# Search with custom limit
python main.py search "The Beatles" --limit 15

# Search for exact matches
python main.py search "Hotel California Eagles" --limit 5

Playlist Transfer Examples

Transfer to New Playlist

# Basic transfer (creates private playlist)
python main.py transfer 37i9dQZF1DXcBWIGoYBM5M --name "My Rock Playlist"

# Transfer with public visibility
python main.py transfer 37i9dQZF1DXcBWIGoYBM5M --name "My Public Playlist" --privacy PUBLIC

# Transfer with unlisted visibility
python main.py transfer 37i9dQZF1DXcBWIGoYBM5M --name "Shared Playlist" --privacy UNLISTED

# Transfer your liked songs to a new playlist
python main.py transfer liked_songs --name "My Spotify Likes"

Transfer to Liked Music

# Transfer any playlist to your YouTube Music liked songs
python main.py transfer-liked 37i9dQZF1DXcBWIGoYBM5M

# Transfer your Spotify liked songs to YouTube Music liked songs
python main.py transfer-liked liked_songs

# Transfer with custom matching settings
MATCH_THRESHOLD=0.7 python main.py transfer-liked 37i9dQZF1DXcBWIGoYBM5M

Advanced Usage

Custom Configuration

# Set environment variables for one-time use
MATCH_THRESHOLD=0.6 MAX_SEARCH_RESULTS=10 python main.py transfer PLAYLIST_ID --name "Test"

# Enable debug logging
python main.py --log-level DEBUG transfer PLAYLIST_ID --name "Debug Transfer"

# Use custom retry attempts
RETRY_ATTEMPTS=5 python main.py transfer PLAYLIST_ID --name "Reliable Transfer"

Batch Operations

# Transfer multiple playlists (using shell scripting)
for playlist_id in "37i9dQZF1DXcBWIGoYBM5M" "37i9dQZF1DX0XUsuxWHRQd" "37i9dQZF1DXbTxeAdrVG2l"; do
    python main.py transfer "$playlist_id" --name "Transferred $(date +%Y%m%d)"
    sleep 30  # Wait between transfers to respect rate limits
done

Python API Examples

Basic Setup

from src.spotify_youtube_transfer.config import Config
from src.spotify_youtube_transfer.playlist_transfer import PlaylistTransfer
from src.spotify_youtube_transfer.spotify_client import SpotifyClient
from src.spotify_youtube_transfer.youtube_music_client import YouTubeMusicClient

# Initialize configuration
config = Config()

# Create transfer instance
transfer = PlaylistTransfer(config)

Simple Playlist Transfer

def simple_transfer_example():
    """Basic playlist transfer example"""
    config = Config()
    transfer = PlaylistTransfer(config)

    # Transfer playlist
    result = transfer.transfer_playlist(
        spotify_playlist_id="37i9dQZF1DXcBWIGoYBM5M",
        youtube_playlist_name="My Transferred Playlist",
        privacy="PRIVATE"
    )

    print(f"Transfer completed!")
    print(f"Success: {result['success_count']}/{result['total_count']} tracks")
    print(f"Accuracy: {result['accuracy']:.1%}")

    return result

# Run the example
result = simple_transfer_example()

Transfer with Progress Tracking

def transfer_with_progress():
    """Transfer with real-time progress tracking"""
    config = Config()
    transfer = PlaylistTransfer(config)

    # Define progress callback
    def progress_callback(current, total, track_name, success):
        status = "✅" if success else "❌"
        percentage = (current / total) * 100
        print(f"[{percentage:5.1f}%] {status} {track_name} ({current}/{total})")

    # Set progress callback
    transfer.set_progress_callback(progress_callback)

    # Transfer playlist
    result = transfer.transfer_playlist(
        spotify_playlist_id="37i9dQZF1DXcBWIGoYBM5M",
        youtube_playlist_name="Progress Tracked Playlist"
    )

    return result

# Run with progress tracking
result = transfer_with_progress()

Transfer to Liked Music

def transfer_to_liked_example():
    """Transfer playlist to YouTube Music liked songs"""
    config = Config()
    transfer = PlaylistTransfer(config)

    # Transfer to liked music
    result = transfer.transfer_to_liked_music("37i9dQZF1DXcBWIGoYBM5M")

    print(f"Added {result['success_count']} songs to liked music")
    print(f"Failed to add {result['failed_count']} songs")

    return result

# Run the example
result = transfer_to_liked_example()

Custom Configuration Example

def custom_config_example():
    """Example with custom configuration"""
    # Create config with custom settings
    config = Config()
    config.match_threshold = 0.7  # Lower threshold for more matches
    config.max_search_results = 10  # More search results
    config.retry_attempts = 5  # More retry attempts

    transfer = PlaylistTransfer(config)

    # Transfer with custom settings
    result = transfer.transfer_playlist(
        spotify_playlist_id="37i9dQZF1DXcBWIGoYBM5M",
        youtube_playlist_name="Custom Config Transfer"
    )

    return result

# Run with custom configuration
result = custom_config_example()

Error Handling Example

def robust_transfer_example():
    """Transfer with comprehensive error handling"""
    from src.spotify_youtube_transfer.exceptions import (
        AuthenticationError, APIError, ConfigurationError
    )

    try:
        config = Config()
        transfer = PlaylistTransfer(config)

        result = transfer.transfer_playlist(
            spotify_playlist_id="37i9dQZF1DXcBWIGoYBM5M",
            youtube_playlist_name="Robust Transfer"
        )

        print(f"✅ Transfer successful: {result['success_count']} tracks")
        return result

    except AuthenticationError as e:
        print(f"❌ Authentication failed: {e}")
        print("Please check your API credentials")

    except APIError as e:
        print(f"❌ API error: {e}")
        print("This might be a temporary issue, try again later")

    except ConfigurationError as e:
        print(f"❌ Configuration error: {e}")
        print("Please check your .env file")

    except Exception as e:
        print(f"❌ Unexpected error: {e}")
        print("Please report this issue on GitHub")

    return None

# Run with error handling
result = robust_transfer_example()

Batch Transfer Example

def batch_transfer_example():
    """Transfer multiple playlists in batch"""
    import time

    config = Config()
    transfer = PlaylistTransfer(config)

    # List of playlists to transfer
    playlists = [
        {"id": "37i9dQZF1DXcBWIGoYBM5M", "name": "Rock Classics"},
        {"id": "37i9dQZF1DX0XUsuxWHRQd", "name": "Pop Hits"},
        {"id": "37i9dQZF1DXbTxeAdrVG2l", "name": "Jazz Standards"}
    ]

    results = []

    for i, playlist in enumerate(playlists, 1):
        print(f"\n[{i}/{len(playlists)}] Transferring: {playlist['name']}")

        try:
            result = transfer.transfer_playlist(
                spotify_playlist_id=playlist["id"],
                youtube_playlist_name=playlist["name"]
            )

            results.append({
                "name": playlist["name"],
                "success": True,
                "result": result
            })

            print(f"✅ Completed: {result['success_count']}/{result['total_count']} tracks")

        except Exception as e:
            print(f"❌ Failed: {e}")
            results.append({
                "name": playlist["name"],
                "success": False,
                "error": str(e)
            })

        # Wait between transfers to respect rate limits
        if i < len(playlists):
            print("Waiting 30 seconds before next transfer...")
            time.sleep(30)

    # Summary
    successful = sum(1 for r in results if r["success"])
    print(f"\n📊 Batch transfer completed: {successful}/{len(playlists)} playlists")

    return results

# Run batch transfer
results = batch_transfer_example()

Individual Client Usage

Spotify Client Example

def spotify_client_example():
    """Direct Spotify client usage"""
    from src.spotify_youtube_transfer.config import Config
    from src.spotify_youtube_transfer.spotify_client import SpotifyClient

    config = Config()
    spotify = SpotifyClient(config)
    spotify.authenticate()

    # Get user playlists
    playlists = spotify.get_user_playlists(limit=10)
    print(f"Found {len(playlists)} playlists:")

    for playlist in playlists:
        print(f"- {playlist['name']} ({playlist['track_count']} tracks)")

    # Get tracks from a specific playlist
    if playlists:
        playlist_id = playlists[0]['id']
        tracks = spotify.get_playlist_tracks(playlist_id)

        print(f"\nTracks in '{playlists[0]['name']}':")
        for track in tracks[:5]:  # Show first 5 tracks
            print(f"- {track['name']} by {track['artist']}")

    return playlists

# Run Spotify client example
playlists = spotify_client_example()

YouTube Music Client Example

def youtube_client_example():
    """Direct YouTube Music client usage"""
    from src.spotify_youtube_transfer.config import Config
    from src.spotify_youtube_transfer.youtube_music_client import YouTubeMusicClient

    config = Config()
    youtube = YouTubeMusicClient(config)
    youtube.authenticate()

    # Search for a song
    results = youtube.search_song("Bohemian Rhapsody Queen", limit=5)
    print(f"Search results for 'Bohemian Rhapsody Queen':")

    for result in results:
        print(f"- {result['title']} by {result['artist']} ({result['duration']})")

    # Create a new playlist
    playlist_id = youtube.create_playlist(
        name="API Test Playlist",
        description="Created via API",
        privacy="PRIVATE"
    )

    print(f"\nCreated playlist with ID: {playlist_id}")

    # Add a song to the playlist
    if results:
        video_id = results[0]['videoId']
        youtube.add_song_to_playlist(playlist_id, video_id)
        print(f"Added '{results[0]['title']}' to playlist")

    return playlist_id

# Run YouTube Music client example
playlist_id = youtube_client_example()

Track Matching Example

def track_matching_example():
    """Demonstrate track matching algorithm"""
    from src.spotify_youtube_transfer.config import Config
    from src.spotify_youtube_transfer.track_matcher import TrackMatcher
    from src.spotify_youtube_transfer.youtube_music_client import YouTubeMusicClient

    config = Config()
    matcher = TrackMatcher(config)
    youtube = YouTubeMusicClient(config)
    youtube.authenticate()

    # Example Spotify track
    spotify_track = {
        'name': 'Bohemian Rhapsody',
        'artist': 'Queen',
        'duration_ms': 355000
    }

    # Search YouTube Music
    search_query = f"{spotify_track['name']} {spotify_track['artist']}"
    youtube_results = youtube.search_song(search_query, limit=10)

    # Find best match
    best_match = matcher.find_best_match(spotify_track, youtube_results)

    if best_match:
        print(f"✅ Found match:")
        print(f"   Spotify: {spotify_track['name']} by {spotify_track['artist']}")
        print(f"   YouTube: {best_match['title']} by {best_match['artist']}")
        print(f"   Similarity: {best_match['similarity']:.2%}")
    else:
        print(f"❌ No suitable match found")

    return best_match

# Run track matching example
match = track_matching_example()

Real-World Scenarios

Scenario 1: Migrating Your Entire Music Library

def migrate_entire_library():
    """Migrate all playlists from Spotify to YouTube Music"""
    import time
    from datetime import datetime

    config = Config()
    transfer = PlaylistTransfer(config)
    spotify = SpotifyClient(config)
    spotify.authenticate()

    # Get all user playlists
    all_playlists = spotify.get_user_playlists(limit=50)

    print(f"Found {len(all_playlists)} playlists to migrate")

    migration_log = []

    for i, playlist in enumerate(all_playlists, 1):
        print(f"\n[{i}/{len(all_playlists)}] Migrating: {playlist['name']}")

        try:
            result = transfer.transfer_playlist(
                spotify_playlist_id=playlist['id'],
                youtube_playlist_name=f"{playlist['name']} (Migrated {datetime.now().strftime('%Y-%m-%d')})"
            )

            migration_log.append({
                "playlist": playlist['name'],
                "status": "success",
                "tracks_transferred": result['success_count'],
                "total_tracks": result['total_count'],
                "accuracy": result['accuracy']
            })

            print(f"✅ Success: {result['success_count']}/{result['total_count']} tracks")

        except Exception as e:
            print(f"❌ Failed: {e}")
            migration_log.append({
                "playlist": playlist['name'],
                "status": "failed",
                "error": str(e)
            })

        # Rate limiting
        time.sleep(60)  # Wait 1 minute between playlists

    # Generate migration report
    successful = sum(1 for log in migration_log if log["status"] == "success")
    total_tracks = sum(log.get("tracks_transferred", 0) for log in migration_log)

    print(f"\n📊 Migration Summary:")
    print(f"   Playlists: {successful}/{len(all_playlists)} successful")
    print(f"   Total tracks transferred: {total_tracks}")

    return migration_log

# Run full migration (use with caution!)
# migration_log = migrate_entire_library()

Scenario 2: Weekly Playlist Sync

def weekly_playlist_sync():
    """Sync specific playlists weekly"""
    import json
    from datetime import datetime

    # Configuration for weekly sync
    SYNC_PLAYLISTS = [
        {"spotify_id": "37i9dQZF1DXcBWIGoYBM5M", "youtube_name": "Weekly Rock"},
        {"spotify_id": "37i9dQZF1DX0XUsuxWHRQd", "youtube_name": "Weekly Pop"}
    ]

    config = Config()
    transfer = PlaylistTransfer(config)

    sync_results = []
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    for playlist_config in SYNC_PLAYLISTS:
        print(f"Syncing: {playlist_config['youtube_name']}")

        try:
            result = transfer.transfer_playlist(
                spotify_playlist_id=playlist_config["spotify_id"],
                youtube_playlist_name=f"{playlist_config['youtube_name']} - {datetime.now().strftime('%Y-%m-%d')}"
            )

            sync_results.append({
                "timestamp": timestamp,
                "playlist": playlist_config["youtube_name"],
                "status": "success",
                "result": result
            })

        except Exception as e:
            sync_results.append({
                "timestamp": timestamp,
                "playlist": playlist_config["youtube_name"],
                "status": "failed",
                "error": str(e)
            })

    # Save sync log
    with open(f"sync_log_{datetime.now().strftime('%Y%m%d')}.json", "w") as f:
        json.dump(sync_results, f, indent=2)

    return sync_results

# Run weekly sync
# sync_results = weekly_playlist_sync()

Scenario 3: Discover Weekly to Liked Music

def discover_weekly_to_liked():
    """Transfer Discover Weekly to YouTube Music liked songs"""
    config = Config()
    transfer = PlaylistTransfer(config)
    spotify = SpotifyClient(config)
    spotify.authenticate()

    # Find Discover Weekly playlist
    playlists = spotify.get_user_playlists(limit=50)
    discover_weekly = None

    for playlist in playlists:
        if "Discover Weekly" in playlist['name']:
            discover_weekly = playlist
            break

    if not discover_weekly:
        print("❌ Discover Weekly playlist not found")
        return None

    print(f"Found Discover Weekly: {discover_weekly['name']}")

    # Transfer to liked music
    result = transfer.transfer_to_liked_music(discover_weekly['id'])

    print(f"✅ Added {result['success_count']} new discoveries to liked music")

    return result

# Run Discover Weekly transfer
# result = discover_weekly_to_liked()

These examples demonstrate various ways to use the Spotify to YouTube Music Transfer Tool, from simple command-line operations to complex Python integrations. Choose the approach that best fits your needs and technical comfort level.