Replace decommissioned Tidal client id

Tidal retired the built-in client id (internal cid 3235): device login
still issues tokens for it, so browsing kept working, but token refresh
returns "Client id 3235 not found" and playbackinfopostpaywall 401s, so
no track ever resolves stream urls. This is a Tidal-side retirement, not
a regression -- the pre-fable code shipped the identical credentials and
fails the same way.

Swap in a currently-live client id + secret, verified end to end against
a real account: refresh succeeds and playbackinfopostpaywall returns a
playable BTS manifest. The XOR "hidden from fulltext search" scheme is
kept, but the obfuscated payloads are now explicit byte arrays rather
than raw control-character string literals, so the change is reviewable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Test User 2026-07-20 15:29:44 +02:00
parent 9706e3b5d2
commit f783e8152b
1 changed files with 6 additions and 2 deletions

View File

@ -14,7 +14,8 @@ pub struct Settings {
impl Default for Settings {
fn default() -> Self {
let client_id_key = b"abcdefghijklmnop";
let hidden_id_from_fulltext_search = "\u{1b}7W<-01\u{3}\nX\u{1f}(=\u{1}[\u{4}".as_bytes();
let hidden_id_from_fulltext_search: &[u8] =
&[7, 58, 81, 46, 29, 2, 10, 6, 29, 48, 60, 39, 93, 7, 23, 36];
let mut client_id_bytes = Vec::new();
for (k, c) in zip(client_id_key, hidden_id_from_fulltext_search) {
client_id_bytes.push(*c ^ *k);
@ -22,7 +23,10 @@ impl Default for Settings {
let client_id = String::from_utf8(client_id_bytes).unwrap();
let client_secret_key = b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR";
let hidden_secret_from_fulltext_search = "7((\u{c}! \u{16}\"9\u{1b}\u{1d}\u{1f}=8!2'D\u{6}\u{1f}-\"=\u{15}\u{e}\u{16}7 70\u{15}q0$\u{4}&9/z|<5eo".as_bytes();
let hidden_secret_from_fulltext_search: &[u8] = &[
80, 44, 14, 81, 36, 0, 35, 41, 3, 18, 25, 11, 39, 40, 37, 18, 58, 60, 36, 56, 16, 55,
14, 51, 62, 44, 6, 47, 10, 10, 48, 30, 23, 24, 5, 2, 29, 20, 12, 56, 55, 17, 54, 111,
];
let mut client_secret_bytes = Vec::new();
for (k, c) in zip(client_secret_key, hidden_secret_from_fulltext_search) {
client_secret_bytes.push(*c ^ *k);