diff --git a/votify/__init__.py b/votify/__init__.py index eb1dc9a..424ebc4 100644 --- a/votify/__init__.py +++ b/votify/__init__.py @@ -1 +1 @@ -__version__ = "1.5.8" +__version__ = "1.5.9" diff --git a/votify/spotify_api.py b/votify/spotify_api.py index c23350c..e5af666 100644 --- a/votify/spotify_api.py +++ b/votify/spotify_api.py @@ -53,7 +53,7 @@ class SpotifyApi: def __init__( self, sp_dc: str | None = None, - use_totp: bool = False, + use_totp: bool = True, ) -> None: self.sp_dc = sp_dc self.use_totp = use_totp @@ -123,15 +123,16 @@ def set_authorization_header(self, token: str) -> None: def _setup_authorization_with_totp(self) -> None: server_time = self._get_server_time() - totp = self.totp.generate(timestamp=server_time) + totp = self.totp.generate() + totpServer = self.totp.generate(timestamp=server_time) response = self.session.get( self.SESSION_TOKEN_URL, params={ "reason": "init", "productType": "web-player", "totp": totp, + "totpServer": totpServer, "totpVer": str(self.totp.version), - "ts": str(server_time), }, ) check_response(response) diff --git a/votify/totp.py b/votify/totp.py index 18a23bb..b415de0 100644 --- a/votify/totp.py +++ b/votify/totp.py @@ -1,17 +1,22 @@ import hashlib import hmac import math +import time +from typing import Optional # thanks to https://github.com/glomatico/votify/pull/42#issuecomment-2727036757 class TOTP: def __init__(self) -> None: # dumped directly from the object, after all decryptions - self.secret = b"120887534115119493370126558380647147717911891615550" - self.version = 25 + self.secret = b"587110910437125581069094371158251108736873797144" + self.version = 37 self.period = 30 self.digits = 6 - def generate(self, timestamp: int) -> str: + def generate(self, timestamp: Optional[int] = None) -> str: + if timestamp is None: + timestamp = int(time.time() * 1000) + counter = math.floor(timestamp / 1000 / self.period) counter_bytes = counter.to_bytes(8, byteorder="big")