From f783e8152b33f8ab0f1dfdb2a668a55727e8e760 Mon Sep 17 00:00:00 2001 From: Test User Date: Mon, 20 Jul 2026 15:29:44 +0200 Subject: [PATCH] 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 --- tidaldy/src/config.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tidaldy/src/config.rs b/tidaldy/src/config.rs index 05b1219..57d7821 100644 --- a/tidaldy/src/config.rs +++ b/tidaldy/src/config.rs @@ -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);