52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
import os
|
|
import requests
|
|
from typing import Optional
|
|
|
|
GENIUS_API_KEY = os.getenv("GENIUS_API_KEY", "")
|
|
GENIUS_BASE_URL = "https://api.genius.com"
|
|
|
|
|
|
def fetch_lyrics(song_title: str, artist_name: str) -> Optional[str]:
|
|
if not GENIUS_API_KEY:
|
|
return None
|
|
|
|
search_query = f"{song_title} {artist_name}"
|
|
|
|
try:
|
|
search_url = f"{GENIUS_BASE_URL}/search"
|
|
headers = {"Authorization": f"Bearer {GENIUS_API_KEY}"}
|
|
params = {"q": search_query}
|
|
|
|
response = requests.get(search_url, headers=headers, params=params, timeout=10)
|
|
if response.status_code != 200:
|
|
return None
|
|
|
|
data = response.json()
|
|
hits = data.get("response", {}).get("hits", [])
|
|
|
|
if not hits:
|
|
return None
|
|
|
|
# Get the best match
|
|
best_hit = hits[0]
|
|
song_id = best_hit.get("result", {}).get("id")
|
|
|
|
if not song_id:
|
|
return None
|
|
|
|
# Fetch song details
|
|
song_url = f"{GENIUS_BASE_URL}/songs/{song_id}"
|
|
song_response = requests.get(song_url, headers=headers, timeout=10)
|
|
if song_response.status_code != 200:
|
|
return None
|
|
|
|
song_data = song_response.json()
|
|
lyrics = song_data.get("response", {}).get("lyrics", "")
|
|
|
|
if lyrics and lyrics != "[Lyrics are not written yet]":
|
|
return lyrics
|
|
|
|
return None
|
|
|
|
except (requests.RequestException, KeyError, IndexError):
|
|
return None |