Spaces:
Running
Running
Upload 2 files
Browse files- src/main.rs +20 -32
src/main.rs
CHANGED
|
@@ -303,44 +303,32 @@ async fn media_url_for_track(
|
|
| 303 |
}
|
| 304 |
}
|
| 305 |
|
| 306 |
-
let
|
| 307 |
-
|
| 308 |
-
"song.getListData",
|
| 309 |
-
&json!({"sng_ids":[id],"array_default":["SNG_ID","TRACK_TOKEN","FALLBACK"]}),
|
| 310 |
-
)
|
| 311 |
-
.await;
|
| 312 |
|
| 313 |
-
let
|
| 314 |
-
if track_list.data.is_empty() {
|
| 315 |
-
return Err("No valid ID".to_string());
|
| 316 |
-
}
|
| 317 |
|
| 318 |
-
let track_token =
|
| 319 |
-
let
|
| 320 |
-
|
| 321 |
-
.as_ref()
|
| 322 |
-
.and_then(|f| f.TRACK_TOKEN.clone())
|
| 323 |
-
.unwrap_or_default();
|
| 324 |
|
| 325 |
-
let fallback_id =
|
| 326 |
-
.
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
|
|
|
|
|
|
| 330 |
|
| 331 |
if fallback_id > 0 {
|
| 332 |
-
let
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 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 |
}
|