forked from CopyBot/sptnr
Implement token refreshing
This commit is contained in:
@@ -47,6 +47,45 @@ if not os.path.exists(LOG_DIR):
|
|||||||
|
|
||||||
LOGFILE = os.path.join(LOG_DIR, f"spotify-popularity_{int(time.time())}.log")
|
LOGFILE = os.path.join(LOG_DIR, f"spotify-popularity_{int(time.time())}.log")
|
||||||
|
|
||||||
|
HEX_ENCODED_PASS = NAV_PASS.encode().hex()
|
||||||
|
TOKEN_AUTH = base64.b64encode(
|
||||||
|
f"{SPOTIFY_CLIENT_ID}:{SPOTIFY_CLIENT_SECRET}".encode()
|
||||||
|
).decode()
|
||||||
|
TOKEN_URL = "https://accounts.spotify.com/api/token"
|
||||||
|
|
||||||
|
class SpotifyTokenManager:
|
||||||
|
def __init__(self, client_id, client_secret, token_url):
|
||||||
|
self.client_id = client_id
|
||||||
|
self.client_secret = client_secret
|
||||||
|
self.token_url = token_url
|
||||||
|
self.token = None
|
||||||
|
self.expires_at = 0
|
||||||
|
self._authenticate()
|
||||||
|
|
||||||
|
def _authenticate(self):
|
||||||
|
token_auth = base64.b64encode(
|
||||||
|
f"{self.client_id}:{self.client_secret}".encode()
|
||||||
|
).decode()
|
||||||
|
response = requests.post(
|
||||||
|
self.token_url,
|
||||||
|
headers={"Authorization": f"Basic {token_auth}"},
|
||||||
|
data={"grant_type": "client_credentials"},
|
||||||
|
)
|
||||||
|
if response.status_code != 200:
|
||||||
|
error_info = response.json()
|
||||||
|
error_description = error_info.get("error_description", "Unknown error")
|
||||||
|
logging.error(
|
||||||
|
f"{LIGHT_RED}Spotify Authentication Error: {error_description}{RESET}"
|
||||||
|
)
|
||||||
|
sys.exit(1)
|
||||||
|
token_data = response.json()
|
||||||
|
self.token = token_data["access_token"]
|
||||||
|
self.expires_at = time.time() + token_data["expires_in"] - 60 # refresh 1 min early
|
||||||
|
|
||||||
|
def get_token(self):
|
||||||
|
if time.time() >= self.expires_at:
|
||||||
|
self._authenticate()
|
||||||
|
return self.token
|
||||||
|
|
||||||
class NoColorFormatter(logging.Formatter):
|
class NoColorFormatter(logging.Formatter):
|
||||||
ansi_escape = re.compile(r"\x1B\[[0-?]*[ -/]*[@-~]")
|
ansi_escape = re.compile(r"\x1B\[[0-?]*[ -/]*[@-~]")
|
||||||
@@ -66,27 +105,11 @@ file_handler = logging.FileHandler(LOGFILE, "a")
|
|||||||
file_handler.setFormatter(NoColorFormatter("[%(asctime)s] %(message)s"))
|
file_handler.setFormatter(NoColorFormatter("[%(asctime)s] %(message)s"))
|
||||||
logging.getLogger().addHandler(file_handler)
|
logging.getLogger().addHandler(file_handler)
|
||||||
|
|
||||||
# Auth
|
# Authentication
|
||||||
HEX_ENCODED_PASS = NAV_PASS.encode().hex()
|
spotify_token_manager = SpotifyTokenManager(
|
||||||
TOKEN_AUTH = base64.b64encode(
|
SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET, TOKEN_URL
|
||||||
f"{SPOTIFY_CLIENT_ID}:{SPOTIFY_CLIENT_SECRET}".encode()
|
|
||||||
).decode()
|
|
||||||
TOKEN_URL = "https://accounts.spotify.com/api/token"
|
|
||||||
response = requests.post(
|
|
||||||
TOKEN_URL,
|
|
||||||
headers={"Authorization": f"Basic {TOKEN_AUTH}"},
|
|
||||||
data={"grant_type": "client_credentials"},
|
|
||||||
)
|
)
|
||||||
|
SPOTIFY_TOKEN = spotify_token_manager.get_token()
|
||||||
if response.status_code != 200:
|
|
||||||
error_info = response.json() # Assuming the error response is in JSON format
|
|
||||||
error_description = error_info.get("error_description", "Unknown error")
|
|
||||||
logging.error(
|
|
||||||
f"{LIGHT_RED}Spotify Authentication Error: {error_description}{RESET}"
|
|
||||||
)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
SPOTIFY_TOKEN = response.json()["access_token"]
|
|
||||||
|
|
||||||
init(autoreset=True)
|
init(autoreset=True)
|
||||||
|
|
||||||
@@ -215,6 +238,9 @@ def process_track(track_id, artist_name, album, track_name):
|
|||||||
global FOUND_AND_UPDATED, UNMATCHED_TRACKS, NOT_FOUND, TOTAL_TRACKS
|
global FOUND_AND_UPDATED, UNMATCHED_TRACKS, NOT_FOUND, TOTAL_TRACKS
|
||||||
|
|
||||||
def search_spotify(query, max_retries=3):
|
def search_spotify(query, max_retries=3):
|
||||||
|
|
||||||
|
SPOTIFY_TOKEN = spotify_token_manager.get_token()
|
||||||
|
|
||||||
spotify_url = f"https://api.spotify.com/v1/search?q={query}&type=track&limit=1"
|
spotify_url = f"https://api.spotify.com/v1/search?q={query}&type=track&limit=1"
|
||||||
headers = {"Authorization": f"Bearer {SPOTIFY_TOKEN}"}
|
headers = {"Authorization": f"Bearer {SPOTIFY_TOKEN}"}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user