bugfix(spotify): Updated script to be parsed for session_data from config to appServerConfig script

- config script is no longer returned from Fetch session data call from Spotify
- it's now called appServerConfig which contains the correlationId needed to make Spotify requests
-
This commit is contained in:
kuelteabmas
2025-05-15 17:03:03 -04:00
parent de7b58d7b2
commit 54d012009e

View File

@@ -1,7 +1,7 @@
from dataclasses import dataclass from dataclasses import dataclass
import os import os
from app.providers.base import AccountAttributes, Album, Artist, BrowseCard, BrowseSection, Image, MusicProviderClient, Owner, Playlist, PlaylistTrack, Profile, Track, ExternalUrl, Category from app.providers.base import AccountAttributes, Album, Artist, BrowseCard, BrowseSection, Image, MusicProviderClient, Owner, Playlist, PlaylistTrack, Profile, Track, ExternalUrl, Category
import requests import base64
import json import json
import requests import requests
@@ -24,7 +24,7 @@ class SpotifyClient(MusicProviderClient):
def __init__(self, cookie_file: Optional[str] = None): def __init__(self, cookie_file: Optional[str] = None):
self.base_url = "https://api-partner.spotify.com" self.base_url = "https://api-partner.spotify.com"
self.session_data = None self.session_data = None
self.config_data = None self.app_server_config_data = None
self.client_token = None self.client_token = None
self.cookies = None self.cookies = None
if cookie_file: if cookie_file:
@@ -52,11 +52,11 @@ class SpotifyClient(MusicProviderClient):
""" """
if self.cookies: if self.cookies:
l.debug("Authenticating using cookies.") l.debug("Authenticating using cookies.")
self.session_data, self.config_data = self._fetch_session_data() self.session_data, self.app_server_config_data = self._fetch_session_data()
self.client_token = self._fetch_client_token() self.client_token = self._fetch_client_token()
else: else:
l.debug("Authenticating without cookies.") l.debug("Authenticating without cookies.")
self.session_data, self.config_data = self._fetch_session_data(fetch_with_cookies=False) self.session_data, self.app_server_config_data = self._fetch_session_data(fetch_with_cookies=False)
self.client_token = self._fetch_client_token() self.client_token = self._fetch_client_token()
def _fetch_session_data(self, fetch_with_cookies: bool = True): def _fetch_session_data(self, fetch_with_cookies: bool = True):
@@ -76,10 +76,12 @@ class SpotifyClient(MusicProviderClient):
response.raise_for_status() response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser') soup = BeautifulSoup(response.text, 'html.parser')
session_script = soup.find('script', {'id': 'session'}) session_script = soup.find('script', {'id': 'session'})
config_script = soup.find('script', {'id': 'config'}) app_server_config_script = soup.find('script', {'id': 'appServerConfig'}).text # decode JWT to obtain correlation required for obtain Bearer Token
if session_script and config_script: decoded_app_server_config_script = base64.b64decode(app_server_config_script) # base64 decode
decoded_app_server_config_script = decoded_app_server_config_script.decode().strip("b'") # decode from byte object to string object
if session_script.string and decoded_app_server_config_script:
l.debug("fetched session and config scripts") l.debug("fetched session and config scripts")
return json.loads(session_script.string), json.loads(config_script.string) return json.loads(session_script.string, decoded_app_server_config_script)
else: else:
raise ValueError("Failed to fetch session or config data.") raise ValueError("Failed to fetch session or config data.")
@@ -105,7 +107,7 @@ class SpotifyClient(MusicProviderClient):
"device_model": "unknown", "device_model": "unknown",
"os": "windows", "os": "windows",
"os_version": "NT 10.0", "os_version": "NT 10.0",
"device_id": self.config_data.get("correlationId", ""), "device_id": self.app_server_config_data.get("correlationId", ""),
"device_type": "computer" "device_type": "computer"
} }
} }