#! /usr/bin/env python3 import argparse import sys import logging import spotipy import subprocess from pathlib import Path from spotipy.oauth2 import SpotifyOAuth SPOTIFY_CLIENT_ID = "bb39d914c6884316ac09cf0c928d975b" logger = logging.getLogger(__name__) def main() -> int: # Handle program arguments ap = argparse.ArgumentParser( prog="spotify-current-track-id", description="Get the currently playing track ID from Spotify", ) ap.add_argument("--url", help="Print the URL of the currently playing track", action="store_true") ap.add_argument( "-v", "--verbose", help="Enable verbose logging", action="store_true" ) args = ap.parse_args() # Configure logging logging.basicConfig( level=logging.DEBUG if args.verbose else logging.INFO, format="%(levelname)s: %(message)s", ) # Call `ewp-secrets` to read the Spotify client secret secrets_proc = subprocess.run( [ (Path(__file__).parent / "ewp-secrets").as_posix(), "load", "-n", "spotify", "-k", "client-secret", ], capture_output=True, ) # If the secret manager failed, exit if secrets_proc.returncode != 0: print("Failed to load Spotify Client Secret", file=sys.stderr) print( "Please run `ewp-secrets store -n spotify -k client-secret` and pass it the secret from:", file=sys.stderr, ) print( f"https://developer.spotify.com/dashboard/{SPOTIFY_CLIENT_ID}/settings", file=sys.stderr, ) return 1 # Connect to Spotify cache_path = Path("~/.cache/spotipy/spotify-current-track-id.oauth").expanduser() cache_path.parent.mkdir(parents=True, exist_ok=True) oauth = SpotifyOAuth( client_id=SPOTIFY_CLIENT_ID, client_secret=secrets_proc.stdout.decode().strip(), redirect_uri="http://localhost:8933", scope="user-read-currently-playing", cache_path=cache_path.as_posix(), open_browser=True ) spotify = spotipy.Spotify(auth_manager=oauth) # Read the currently playing track current_track = spotify.current_user_playing_track() # If nothing is playing if not current_track: print("Nothing is currently playing", file=sys.stderr) return 1 # Display info if args.url: print(current_track["item"]["external_urls"]["spotify"]) else: print(current_track["item"]["id"]) return 0 if __name__ == "__main__": sys.exit(main())