Files
music-controller/spotify/util.py
T
2025-12-27 15:33:48 -05:00

121 lines
3.3 KiB
Python

from django.utils import timezone
from .models import SpotifyToken
import os
from dotenv import load_dotenv
from datetime import timedelta
from requests import post, put, get
load_dotenv()
CLIENT_ID = os.getenv('CLIENT_ID')
CLIENT_SECRET = os.getenv('CLIENT_SECRET')
BASE_URL = 'https://api.spotify.com/v1/me/'
def get_user_token(session_id):
user_tokens = SpotifyToken.objects.filter(user=session_id)
# DEBUG
print('## get_user_token()##')
print('user_tokens:', user_tokens.first())
print('session_id', session_id)
if user_tokens.exists():
return user_tokens[0]
else:
return None
def update_or_create_user_tokens(session_id, access_token, token_type, expires_in, refresh_token):
# default expires in = 3600 from spotify
tokens = get_user_token(session_id)
expires_in = timezone.now() + timedelta(seconds=expires_in)
# update if exist
if tokens:
tokens.access_token = access_token
tokens.expires_in = expires_in
tokens.refresh_token = refresh_token
tokens.token_type = token_type
tokens.save(update_fields=['access_token', 'expires_in', 'refresh_token', 'token_type'])
else: # create on db
tokens = SpotifyToken(
user=session_id,
access_token=access_token,
token_type=token_type,
expires_in=expires_in,
refresh_token=refresh_token,
)
tokens.save()
def is_spotify_authenticated(session_id):
tokens = get_user_token(session_id)
if tokens:
expiry = tokens.expires_in
return True
return False
def refresh_spotify_token(session_id):
refresh_token = get_user_token(session_id).refresh_token
_response = post(
'https://accounts.spotify.com/api/token',
data={
'grant_type': 'refresh_token',
'refresh_token': refresh_token,
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
},
).json()
# dont need these just in case
access_token = _response.get('access_token')
token_type = _response.get('token_type')
expires_in = _response.get('expires_in')
update_or_create_user_tokens(session_id, access_token, token_type, expires_in, refresh_token)
def spotify_api_request(session_id, endpoint, post_=False, put_=False):
tokens = get_user_token(session_id)
# endpoint = 'player/currently-playing'
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + tokens.access_token,
}
if post_:
response = post(BASE_URL + endpoint, headers=headers)
try:
return response.json()
except:
return {'Error': 'Issue with POST request'}
if put_:
response = put(BASE_URL + endpoint, headers=headers)
try:
return response.json()
except:
return {'Error': 'Issue with PUT request'}
# GET request (default)
spotify_response = get(BASE_URL + endpoint, headers=headers)
try:
return spotify_response.json()
except:
return {'Error': 'Issue with GET request', 'status_code': spotify_response.status_code}
def play_song(session_id):
return spotify_api_request(session_id, 'player/play', put_=True)
def pause_song(session_id):
return spotify_api_request(session_id, 'player/pause', put_=True)