Spaces:
Running
Running
Upload 2 files
Browse files- src/main.rs +46 -9
src/main.rs
CHANGED
|
@@ -297,16 +297,27 @@ async fn media_url_for_track(
|
|
| 297 |
id: u64,
|
| 298 |
formats: &Vec<Format>,
|
| 299 |
) -> Result<(String, String, u64), String> {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 300 |
if client.license_token.is_empty() {
|
| 301 |
if let Err(e) = client.force_renew().await {
|
|
|
|
| 302 |
return Err(format!("renew:{e}"));
|
| 303 |
}
|
| 304 |
}
|
| 305 |
|
| 306 |
let q_json = serde_json::json!({"sng_ids":[id],"array_default":["SNG_ID","TRACK_TOKEN","FALLBACK"]});
|
| 307 |
-
let r: serde_json::Value = client.api_call("song.getListData", &q_json).await.map_err(|e|
|
|
|
|
|
|
|
|
|
|
| 308 |
|
| 309 |
-
let item = r.pointer("/data/0").ok_or_else(||
|
|
|
|
|
|
|
|
|
|
| 310 |
|
| 311 |
let track_token = item.get("TRACK_TOKEN").and_then(|v| v.as_str()).unwrap_or("").to_string();
|
| 312 |
let fallback = item.get("FALLBACK");
|
|
@@ -320,19 +331,33 @@ async fn media_url_for_track(
|
|
| 320 |
})
|
| 321 |
}).unwrap_or(0);
|
| 322 |
|
|
|
|
|
|
|
| 323 |
if fallback_id > 0 {
|
| 324 |
let q_fb = serde_json::json!({"sng_ids":[fallback_id],"array_default":["SNG_ID","TRACK_TOKEN","FALLBACK"]});
|
|
|
|
| 325 |
if let Ok(r_fb) = client.api_call::<serde_json::Value, serde_json::Value>("song.getListData", &q_fb).await {
|
| 326 |
if let Some(item_fb) = r_fb.pointer("/data/0") {
|
| 327 |
if let Some(real_tk) = item_fb.get("TRACK_TOKEN").and_then(|v| v.as_str()) {
|
|
|
|
| 328 |
let tokens = vec![real_tk];
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 333 |
}
|
|
|
|
|
|
|
| 334 |
}
|
|
|
|
|
|
|
| 335 |
}
|
|
|
|
|
|
|
| 336 |
}
|
| 337 |
}
|
| 338 |
|
|
@@ -349,12 +374,23 @@ async fn media_url_for_track(
|
|
| 349 |
}
|
| 350 |
|
| 351 |
if tokens.is_empty() {
|
|
|
|
| 352 |
return Err("empty TRACK_TOKEN and FALLBACK".to_string());
|
| 353 |
}
|
| 354 |
|
| 355 |
-
let (
|
| 356 |
-
let
|
| 357 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 358 |
}
|
| 359 |
|
| 360 |
fn upstream_bases() -> Vec<String> {
|
|
@@ -649,6 +685,7 @@ async fn stream_info(State(state): State<AppState>, Query(q): Query<StreamParams
|
|
| 649 |
_ => vec![Format::FLAC, Format::MP3_320, Format::MP3_128],
|
| 650 |
};
|
| 651 |
|
|
|
|
| 652 |
let requested = q.format.clone().unwrap_or_else(|| "AUTO".to_string());
|
| 653 |
let mut url: String = String::new();
|
| 654 |
let mut used: String = String::new();
|
|
|
|
| 297 |
id: u64,
|
| 298 |
formats: &Vec<Format>,
|
| 299 |
) -> Result<(String, String, u64), String> {
|
| 300 |
+
use std::io::Write;
|
| 301 |
+
let mut log_file = std::fs::OpenOptions::new().create(true).append(true).open("debug_dzmedia.log").unwrap();
|
| 302 |
+
let _ = writeln!(log_file, "--- NEW REQUEST FOR ID {} ---", id);
|
| 303 |
+
|
| 304 |
if client.license_token.is_empty() {
|
| 305 |
if let Err(e) = client.force_renew().await {
|
| 306 |
+
let _ = writeln!(log_file, "force_renew err: {}", e);
|
| 307 |
return Err(format!("renew:{e}"));
|
| 308 |
}
|
| 309 |
}
|
| 310 |
|
| 311 |
let q_json = serde_json::json!({"sng_ids":[id],"array_default":["SNG_ID","TRACK_TOKEN","FALLBACK"]});
|
| 312 |
+
let r: serde_json::Value = client.api_call("song.getListData", &q_json).await.map_err(|e| {
|
| 313 |
+
let _ = writeln!(log_file, "api_call err: {}", e);
|
| 314 |
+
e.to_string()
|
| 315 |
+
})?;
|
| 316 |
|
| 317 |
+
let item = r.pointer("/data/0").ok_or_else(|| {
|
| 318 |
+
let _ = writeln!(log_file, "No valid ID");
|
| 319 |
+
"No valid ID".to_string()
|
| 320 |
+
})?;
|
| 321 |
|
| 322 |
let track_token = item.get("TRACK_TOKEN").and_then(|v| v.as_str()).unwrap_or("").to_string();
|
| 323 |
let fallback = item.get("FALLBACK");
|
|
|
|
| 331 |
})
|
| 332 |
}).unwrap_or(0);
|
| 333 |
|
| 334 |
+
let _ = writeln!(log_file, "track_token: {}, fallback_id: {}, fallback_token: {}", track_token, fallback_id, fallback_token);
|
| 335 |
+
|
| 336 |
if fallback_id > 0 {
|
| 337 |
let q_fb = serde_json::json!({"sng_ids":[fallback_id],"array_default":["SNG_ID","TRACK_TOKEN","FALLBACK"]});
|
| 338 |
+
let _ = writeln!(log_file, "Querying fallback ID: {}", fallback_id);
|
| 339 |
if let Ok(r_fb) = client.api_call::<serde_json::Value, serde_json::Value>("song.getListData", &q_fb).await {
|
| 340 |
if let Some(item_fb) = r_fb.pointer("/data/0") {
|
| 341 |
if let Some(real_tk) = item_fb.get("TRACK_TOKEN").and_then(|v| v.as_str()) {
|
| 342 |
+
let _ = writeln!(log_file, "Fetched real_tk for fallback: {}", real_tk);
|
| 343 |
let tokens = vec![real_tk];
|
| 344 |
+
match fetch_media_url(client, formats, tokens).await {
|
| 345 |
+
Ok((url, fmt, _)) => {
|
| 346 |
+
let _ = writeln!(log_file, "fetch_media_url SUCCESS for fallback: fmt={}", fmt);
|
| 347 |
+
return Ok((url, fmt, fallback_id));
|
| 348 |
+
},
|
| 349 |
+
Err(e) => {
|
| 350 |
+
let _ = writeln!(log_file, "fetch_media_url FAILED for fallback: {}", e);
|
| 351 |
+
}
|
| 352 |
}
|
| 353 |
+
} else {
|
| 354 |
+
let _ = writeln!(log_file, "NO TRACK_TOKEN in fallback response");
|
| 355 |
}
|
| 356 |
+
} else {
|
| 357 |
+
let _ = writeln!(log_file, "Empty data array in fallback response");
|
| 358 |
}
|
| 359 |
+
} else {
|
| 360 |
+
let _ = writeln!(log_file, "api_call for fallback ID FAILED");
|
| 361 |
}
|
| 362 |
}
|
| 363 |
|
|
|
|
| 374 |
}
|
| 375 |
|
| 376 |
if tokens.is_empty() {
|
| 377 |
+
let _ = writeln!(log_file, "empty TRACK_TOKEN and FALLBACK");
|
| 378 |
return Err("empty TRACK_TOKEN and FALLBACK".to_string());
|
| 379 |
}
|
| 380 |
|
| 381 |
+
let _ = writeln!(log_file, "Falling back to old logic. Tokens: {:?}", tokens);
|
| 382 |
+
let res = fetch_media_url(client, formats, tokens).await;
|
| 383 |
+
match res {
|
| 384 |
+
Ok((url, fmt, idx)) => {
|
| 385 |
+
let _ = writeln!(log_file, "Old logic SUCCESS: fmt={}", fmt);
|
| 386 |
+
let id_to_use = *token_ids.get(idx).unwrap_or(&id);
|
| 387 |
+
Ok((url, fmt, id_to_use))
|
| 388 |
+
},
|
| 389 |
+
Err(e) => {
|
| 390 |
+
let _ = writeln!(log_file, "Old logic FAILED: {}", e);
|
| 391 |
+
Err(e)
|
| 392 |
+
}
|
| 393 |
+
}
|
| 394 |
}
|
| 395 |
|
| 396 |
fn upstream_bases() -> Vec<String> {
|
|
|
|
| 685 |
_ => vec![Format::FLAC, Format::MP3_320, Format::MP3_128],
|
| 686 |
};
|
| 687 |
|
| 688 |
+
|
| 689 |
let requested = q.format.clone().unwrap_or_else(|| "AUTO".to_string());
|
| 690 |
let mut url: String = String::new();
|
| 691 |
let mut used: String = String::new();
|