Skip to content

Instantly share code, notes, and snippets.

@Cajivah
Forked from nsyntych/tidal_login.py
Last active April 29, 2026 09:28
Show Gist options
  • Select an option

  • Save Cajivah/df5bd06448a2f3bf09534b23d0928043 to your computer and use it in GitHub Desktop.

Select an option

Save Cajivah/df5bd06448a2f3bf09534b23d0928043 to your computer and use it in GitHub Desktop.
Login to tidal API using PKCE and update strawberry player settings to support Hi-Res Lossless playback
#!/usr/bin/python3
import tidalapi
import json
from pathlib import Path
from configparser import ConfigParser
strawberry_conf_file_path = str(Path.home()) + "/.config/strawberry/strawberry.conf"
strawberry_conf_file = ConfigParser()
strawberry_conf_file.read(strawberry_conf_file_path)
session = tidalapi.Session()
session.login_pkce()
creds = {
"token_type": session.token_type,
"session_id": session.session_id,
"access_token": session.access_token,
"refresh_token": session.refresh_token,
}
strawberry_conf_file["Tidal"]["type"] = "2"
strawberry_conf_file["Tidal"]["streamurl"] = "2"
strawberry_conf_file["Tidal"]["oauth"] = "true"
strawberry_conf_file["Tidal"]["enabled"] = "true"
strawberry_conf_file["Tidal"]["client_id"] = session.config.client_id_pkce
strawberry_conf_file["Tidal"]["quality"] = "HI_RES_LOSSLESS"
strawberry_conf_file["Tidal"]["country_code"] = "PL"
strawberry_conf_file["Tidal"]["token_type"] = "Bearer"
strawberry_conf_file["Tidal"]["access_token"] = creds["access_token"]
strawberry_conf_file["Tidal"]["refresh_token"] = creds["refresh_token"]
with open(strawberry_conf_file_path, "w") as configfile:
strawberry_conf_file.write(configfile)
print(json.dumps(creds, indent=4))
@bill-kolokithas
Copy link
Copy Markdown

thanks for this. Had to remove appMode=android from the url tidal login generates in orer for google login option to show up.

@markusritschel
Copy link
Copy Markdown

markusritschel commented Apr 29, 2026

I got a few DuplicateOptionErrors, complaining that certain options already exist, e.g. option 'statusdisplaytype' in section 'DiscordRPC' already exists.
The solution: Add a strict=False to the ConfigParser() call. This tells ConfigParser to tolerate duplicate keys in the Strawberry config.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment