recycleactor commited on
Commit
849407d
·
verified ·
1 Parent(s): c45b844

Upload 2 files

Browse files
Files changed (1) hide show
  1. src/main.rs +20 -32
src/main.rs CHANGED
@@ -303,44 +303,32 @@ async fn media_url_for_track(
303
  }
304
  }
305
 
306
- let resp: Result<DeezerTrackList, APIError> = client
307
- .api_call(
308
- "song.getListData",
309
- &json!({"sng_ids":[id],"array_default":["SNG_ID","TRACK_TOKEN","FALLBACK"]}),
310
- )
311
- .await;
312
 
313
- let track_list = resp.map_err(|e| e.to_string())?;
314
- if track_list.data.is_empty() {
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
327
- .as_ref()
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
  }
 
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| e.to_string())?;
 
 
 
 
308
 
309
+ let item = r.pointer("/data/0").ok_or_else(|| "No valid ID".to_string())?;
 
 
 
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");
313
+ let fallback_token = fallback.and_then(|f| f.get("TRACK_TOKEN")).and_then(|v| v.as_str()).unwrap_or("").to_string();
 
 
 
314
 
315
+ let fallback_id = fallback.and_then(|f| {
316
+ f.get("SNG_ID").and_then(|v| {
317
+ if let Some(s) = v.as_str() { s.parse::<u64>().ok() }
318
+ else if let Some(n) = v.as_u64() { Some(n) }
319
+ else { None }
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
  if let Ok((url, fmt, _)) = fetch_media_url(client, formats, tokens).await {
330
+ // Ensure we return the high quality one if found, else let it fall through?
331
+ // Wait, no. If it succeeds at all, we should just return it.
332
  return Ok((url, fmt, fallback_id));
333
  }
334
  }