# Spotify API Interaction with Spotipy

This guide demonstrates how to interact with the Spotify Web API using the `spotipy` library. It covers authentication using the Client Credentials Flow (suitable for server-side scripts that don't access user-private data) and fetching artist information and top tracks.

**Modules Used:**
*   `spotipy`: A lightweight Python library for the Spotify Web API.
*   [[programming/python/modules/argparse-module|argparse]]: To handle command-line arguments.

## Prerequisites

1.  **Spotify Developer Account**: Log in to the Spotify Developer Dashboard.
2.  **Create an App**: Click "Create an App", give it a name and description.
3.  **Get Credentials**: Note down your **Client ID** and **Client Secret**.

## Installation

```bash
pip install spotipy
```

## The Code

Save this as `spotify_tool.py`.

```python
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import argparse
import os
import sys

def get_spotify_client(client_id=None, client_secret=None):
    """
    Authenticates with Spotify using Client Credentials Flow.
    Spotipy automatically looks for SPOTIPY_CLIENT_ID and SPOTIPY_CLIENT_SECRET 
    environment variables if arguments are not provided.
    """
    try:
        auth_manager = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret)
        sp = spotipy.Spotify(auth_manager=auth_manager)
        return sp
    except Exception as e:
        print(f"Authentication Error: {e}")
        return None

def search_artist(sp, name):
    print(f"Searching for '{name}'...")
    results = sp.search(q='artist:' + name, type='artist')
    items = results['artists']['items']
    
    if len(items) > 0:
        artist = items[0]
        print(f"\n--- Artist Info ---")
        print(f"Name:       {artist['name']}")
        print(f"Followers:  {artist['followers']['total']:,}")
        print(f"Genres:     {', '.join(artist['genres'])}")
        print(f"Popularity: {artist['popularity']}%")
        print(f"URL:        {artist['external_urls']['spotify']}")
        return artist['id']
    else:
        print(f"Artist '{name}' not found.")
        return None

def get_top_tracks(sp, artist_id):
    results = sp.artist_top_tracks(artist_id)
    print("\n--- Top Tracks (US) ---")
    for i, track in enumerate(results['tracks'][:10]):
        print(f"{i+1}. {track['name']} - {track['album']['name']}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Spotify CLI Tool")
    parser.add_argument("artist", help="Name of the artist to search for")
    parser.add_argument("--id", help="Spotify Client ID")
    parser.add_argument("--secret", help="Spotify Client Secret")
    
    args = parser.parse_args()
    
    # It is best practice to set environment variables:
    # export SPOTIPY_CLIENT_ID='your_id'
    # export SPOTIPY_CLIENT_SECRET='your_secret'
    
    sp = get_spotify_client(args.id, args.secret)
    
    if sp:
        try:
            artist_id = search_artist(sp, args.artist)
            if artist_id:
                get_top_tracks(sp, artist_id)
        except Exception as e:
            print(f"An error occurred: {e}")
            print("Check your credentials.")
```

## Usage

1.  **Set Environment Variables (Recommended)**:
    ```bash
    # Linux/macOS
    export SPOTIPY_CLIENT_ID='your_client_id'
    export SPOTIPY_CLIENT_SECRET='your_client_secret'
    
    # Windows (PowerShell)
    $env:SPOTIPY_CLIENT_ID='your_client_id'
    $env:SPOTIPY_CLIENT_SECRET='your_client_secret'
    ```

2.  **Run the script**:
    ```bash
    python spotify_tool.py "Daft Punk"
    ```

3.  **Or pass credentials directly**:
    ```bash
    python spotify_tool.py "The Beatles" --id YOUR_ID --secret YOUR_SECRET
    ```

[[programming/python/python]]