Spaces:
Running
Running
Upload 3 files
Browse files- src/bin/test_media.rs +35 -0
- src/main.rs +25 -5
src/bin/test_media.rs
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
use dzmedia::api::{APIClient, Format};
|
| 2 |
+
use serde_json::json;
|
| 3 |
+
|
| 4 |
+
#[tokio::main]
|
| 5 |
+
async fn main() {
|
| 6 |
+
let arl = std::env::var("ARL").unwrap_or_else(|_| "".to_string());
|
| 7 |
+
if arl.is_empty() {
|
| 8 |
+
println!("Please set ARL env var");
|
| 9 |
+
return;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
let mut client = APIClient::new_with_arl(arl);
|
| 13 |
+
|
| 14 |
+
// Get tokens from getListData
|
| 15 |
+
let q_json = json!({
|
| 16 |
+
"sng_ids": [1563075602], // The problematic track ID
|
| 17 |
+
"array_default": ["SNG_ID","TRACK_TOKEN","FALLBACK"]
|
| 18 |
+
});
|
| 19 |
+
let r: serde_json::Value = client.api_call("song.getListData", &q_json).await.unwrap();
|
| 20 |
+
let item = r.pointer("/data/0").unwrap();
|
| 21 |
+
let track_token = item.get("TRACK_TOKEN").and_then(|v| v.as_str()).unwrap_or("");
|
| 22 |
+
let fallback_token = item.pointer("/FALLBACK/TRACK_TOKEN").and_then(|v| v.as_str()).unwrap_or("");
|
| 23 |
+
|
| 24 |
+
println!("TRACK_TOKEN: {}", track_token);
|
| 25 |
+
println!("FALLBACK_TOKEN: {}", fallback_token);
|
| 26 |
+
|
| 27 |
+
// Call get_media
|
| 28 |
+
let formats = vec![Format::FLAC, Format::MP3_320, Format::MP3_128];
|
| 29 |
+
let track_tokens = vec![track_token, fallback_token];
|
| 30 |
+
|
| 31 |
+
let media_resp = client.get_media(&formats, track_tokens).await.unwrap();
|
| 32 |
+
let text = media_resp.text().await.unwrap();
|
| 33 |
+
|
| 34 |
+
println!("MEDIA RESPONSE:\n{}", text);
|
| 35 |
+
}
|
src/main.rs
CHANGED
|
@@ -315,12 +315,12 @@ async fn media_url_for_track(
|
|
| 315 |
return Err("No valid ID".to_string());
|
| 316 |
}
|
| 317 |
|
| 318 |
-
let track_token = track_list.data[0].TRACK_TOKEN.
|
| 319 |
let fallback_token = track_list.data[0]
|
| 320 |
.FALLBACK
|
| 321 |
.as_ref()
|
| 322 |
-
.and_then(|f| f.TRACK_TOKEN.
|
| 323 |
-
.
|
| 324 |
|
| 325 |
let fallback_id = track_list.data[0]
|
| 326 |
.FALLBACK
|
|
@@ -328,14 +328,34 @@ async fn media_url_for_track(
|
|
| 328 |
.and_then(|f| f.SNG_ID.as_ref().and_then(|s| s.parse::<u64>().ok()))
|
| 329 |
.unwrap_or(0);
|
| 330 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 331 |
let mut tokens = Vec::new();
|
| 332 |
let mut token_ids = Vec::new();
|
| 333 |
if !track_token.is_empty() {
|
| 334 |
-
tokens.push(track_token);
|
| 335 |
token_ids.push(id);
|
| 336 |
}
|
| 337 |
if !fallback_token.is_empty() {
|
| 338 |
-
tokens.push(fallback_token);
|
| 339 |
let fid = if fallback_id > 0 { fallback_id } else { id };
|
| 340 |
token_ids.push(fid);
|
| 341 |
}
|
|
|
|
| 315 |
return Err("No valid ID".to_string());
|
| 316 |
}
|
| 317 |
|
| 318 |
+
let track_token = track_list.data[0].TRACK_TOKEN.clone().unwrap_or_default();
|
| 319 |
let fallback_token = track_list.data[0]
|
| 320 |
.FALLBACK
|
| 321 |
.as_ref()
|
| 322 |
+
.and_then(|f| f.TRACK_TOKEN.clone())
|
| 323 |
+
.unwrap_or_default();
|
| 324 |
|
| 325 |
let fallback_id = track_list.data[0]
|
| 326 |
.FALLBACK
|
|
|
|
| 328 |
.and_then(|f| f.SNG_ID.as_ref().and_then(|s| s.parse::<u64>().ok()))
|
| 329 |
.unwrap_or(0);
|
| 330 |
|
| 331 |
+
if fallback_id > 0 {
|
| 332 |
+
let resp_fb: Result<DeezerTrackList, APIError> = client
|
| 333 |
+
.api_call(
|
| 334 |
+
"song.getListData",
|
| 335 |
+
&serde_json::json!({"sng_ids":[fallback_id],"array_default":["SNG_ID","TRACK_TOKEN","FALLBACK"]}),
|
| 336 |
+
)
|
| 337 |
+
.await;
|
| 338 |
+
|
| 339 |
+
if let Ok(list_fb) = resp_fb {
|
| 340 |
+
if !list_fb.data.is_empty() {
|
| 341 |
+
if let Some(real_tk) = &list_fb.data[0].TRACK_TOKEN {
|
| 342 |
+
let tokens = vec![real_tk.as_str()];
|
| 343 |
+
if let Ok((url, fmt, _)) = fetch_media_url(client, formats, tokens).await {
|
| 344 |
+
return Ok((url, fmt, fallback_id));
|
| 345 |
+
}
|
| 346 |
+
}
|
| 347 |
+
}
|
| 348 |
+
}
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
let mut tokens = Vec::new();
|
| 352 |
let mut token_ids = Vec::new();
|
| 353 |
if !track_token.is_empty() {
|
| 354 |
+
tokens.push(track_token.as_str());
|
| 355 |
token_ids.push(id);
|
| 356 |
}
|
| 357 |
if !fallback_token.is_empty() {
|
| 358 |
+
tokens.push(fallback_token.as_str());
|
| 359 |
let fid = if fallback_id > 0 { fallback_id } else { id };
|
| 360 |
token_ids.push(fid);
|
| 361 |
}
|