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:
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user