team-9/backend/endpoints/spotify_api.py

132 lines
4.1 KiB
Python
Raw Permalink Normal View History

2025-08-02 02:59:23 +02:00
import os
2025-08-02 05:58:43 +02:00
import requests
2025-08-02 04:21:13 +02:00
from auth.session import SessionData, SessionManager
2025-08-02 05:58:43 +02:00
from fastapi import APIRouter
from fastapi.responses import RedirectResponse
2025-08-02 02:59:23 +02:00
2025-08-02 03:42:20 +02:00
music_router = APIRouter(prefix="/music")
2025-08-02 02:59:23 +02:00
SPOTIFY_CLIENT_ID = os.getenv("SPOTIFY_CLIENT_ID")
SPOTIFY_CLIENT_SECRET = os.getenv("SPOTIFY_CLIENT_SECRET")
SPOTIFY_REDIRECT_URI = os.getenv("HOST") + "/music/callback"
SPOTIFY_AUTH_URL = "https://accounts.spotify.com/authorize"
SPOTIFY_TOKEN_URL = "https://accounts.spotify.com/api/token"
2025-08-02 05:04:53 +02:00
SPOTIFY_PLAY_URL = "https://api.spotify.com/v1/"
2025-08-02 02:59:23 +02:00
2025-08-02 05:58:43 +02:00
2025-08-02 02:59:23 +02:00
# Step 1: Redirect user to Spotify login
@music_router.get("/login")
2025-08-02 02:59:23 +02:00
def login():
scope = "user-modify-playback-state user-read-playback-state"
url = (
f"{SPOTIFY_AUTH_URL}?response_type=code"
f"&client_id={SPOTIFY_CLIENT_ID}"
f"&scope={scope}"
f"&redirect_uri={SPOTIFY_REDIRECT_URI}"
)
return RedirectResponse(url)
2025-08-02 05:58:43 +02:00
2025-08-02 02:59:23 +02:00
# Step 2: Callback to get access token
@music_router.get("/callback")
2025-08-02 02:59:23 +02:00
def callback(code: str):
payload = {
"grant_type": "authorization_code",
"code": code,
"redirect_uri": SPOTIFY_REDIRECT_URI,
"client_id": SPOTIFY_CLIENT_ID,
"client_secret": SPOTIFY_CLIENT_SECRET,
}
response = requests.post(SPOTIFY_TOKEN_URL, data=payload)
token_info = response.json()
access_token = token_info.get("access_token")
refresh_token = token_info.get("refresh_token")
expires_in = token_info.get("expires_in")
2025-08-02 11:53:43 +02:00
if any(token is None for token in [access_token, refresh_token, expires_in]):
return {"error": "Failed to obtain access token from Spotify."}
2025-08-02 02:59:23 +02:00
# Salva access_token in sessione o database per usi futuri
2025-08-02 07:04:38 +02:00
old_session = SessionManager.instance().get_current_session()
2025-08-02 04:08:11 +02:00
SessionManager.instance().set_session(SessionData(access_token, refresh_token, expires_in))
2025-08-02 07:04:38 +02:00
session = SessionManager.instance().get_current_session()
2025-08-02 02:59:23 +02:00
2025-08-02 07:04:38 +02:00
return {
"changed": session != old_session,
2025-08-02 13:42:14 +02:00
"access_token": session.access_token,
2025-08-02 07:04:38 +02:00
}
2025-08-02 02:59:23 +02:00
2025-08-02 05:58:43 +02:00
2025-08-02 03:42:20 +02:00
@music_router.get("/search")
def search(query: str):
2025-08-02 05:04:53 +02:00
try:
2025-08-02 05:35:58 +02:00
url = SPOTIFY_PLAY_URL + f"search?q={query}&type=track"
2025-08-02 05:04:53 +02:00
header = {
2025-08-02 11:53:43 +02:00
"Authorization": "Bearer " + SessionManager.instance().get_current_session().access_token,
2025-08-02 05:04:53 +02:00
"Content-Type": "application/json"
}
2025-08-02 05:31:20 +02:00
response = requests.get(url, headers=header)
return response.json()
2025-08-02 05:04:53 +02:00
except Exception as e:
print(e)
2025-08-02 05:58:43 +02:00
2025-08-02 05:04:53 +02:00
@music_router.get("/play")
def play(song_id: str):
2025-08-02 05:31:20 +02:00
try:
url = SPOTIFY_PLAY_URL + "me/player/play"
2025-08-02 05:58:43 +02:00
body = {
"uris": [f"spotify:track:{song_id}"],
"position_ms": 0
}
2025-08-02 05:31:20 +02:00
header = {
2025-08-02 11:53:43 +02:00
"Authorization": "Bearer " + SessionManager.instance().get_current_session().access_token,
2025-08-02 05:31:20 +02:00
"Content-Type": "application/json"
}
2025-08-02 05:58:43 +02:00
print(body)
2025-08-02 13:42:14 +02:00
response = requests.put(url, json=body, headers=header)
2025-08-02 05:04:53 +02:00
2025-08-02 05:31:20 +02:00
return response.json()
except Exception as e:
print(e)
2025-08-02 05:58:43 +02:00
2025-08-02 05:04:53 +02:00
@music_router.get("/current-song")
def current_song():
2025-08-02 05:31:20 +02:00
try:
url = SPOTIFY_PLAY_URL + f"me/player/currently-playing?marketing=IT"
header = {
2025-08-02 11:53:43 +02:00
"Authorization": "Bearer " + SessionManager.instance().get_current_session().access_token,
2025-08-02 05:31:20 +02:00
"Content-Type": "application/json"
}
return requests.get(url, headers=header).json()
except Exception as e:
print(e)
2025-08-02 07:04:38 +02:00
2025-08-02 13:42:14 +02:00
2025-08-02 07:04:38 +02:00
@music_router.get("/add_queue_track")
2025-08-02 11:53:43 +02:00
async def add_queue_track(song_id: str):
2025-08-02 07:04:38 +02:00
try:
params = {
"uri": f"spotify:track:{song_id}"
}
2025-08-02 11:53:43 +02:00
url = f"{SPOTIFY_PLAY_URL}me/player/queue"
2025-08-02 07:04:38 +02:00
header = {
2025-08-02 11:53:43 +02:00
"Authorization": "Bearer " + SessionManager.instance().get_current_session().access_token,
2025-08-02 07:04:38 +02:00
}
response_code = requests.post(url, headers=header, params=params).status_code
if response_code == 204:
return {"success": True, "message": "Track added to queue"}
else:
return {"success": False, "message": "Failed to add track to queue", "status_code": response_code}
2025-08-02 11:53:43 +02:00
2025-08-02 07:04:38 +02:00
except Exception as e:
2025-08-02 11:53:43 +02:00
import traceback
traceback.print_exc()
print(e)