Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion votify/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.5.8"
__version__ = "1.5.9"
7 changes: 4 additions & 3 deletions votify/spotify_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
11 changes: 8 additions & 3 deletions votify/totp.py
Original file line number Diff line number Diff line change
@@ -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")

Expand Down