recycleactor commited on
Commit
05b69f4
·
verified ·
1 Parent(s): 6fff80b

Upload 3 files

Browse files
Files changed (2) hide show
  1. src/bin/test_media.rs +35 -0
  2. 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.as_deref().unwrap_or("");
319
  let fallback_token = track_list.data[0]
320
  .FALLBACK
321
  .as_ref()
322
- .and_then(|f| f.TRACK_TOKEN.as_deref())
323
- .unwrap_or("");
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
  }