Spaces:
Paused
Paused
Upload 2 files
Browse files- src/main.rs +72 -22
src/main.rs
CHANGED
|
@@ -298,22 +298,47 @@ async fn media_url_for_track(
|
|
| 298 |
Err(last_err)
|
| 299 |
}
|
| 300 |
|
| 301 |
-
fn
|
|
|
|
|
|
|
| 302 |
let env = std::env::var("DZMEDIA_UPSTREAM").ok().unwrap_or_default();
|
| 303 |
-
let
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 308 |
}
|
| 309 |
-
Some(base.trim_end_matches('/').to_string())
|
| 310 |
}
|
| 311 |
|
| 312 |
async fn upstream_get_url_text(formats: &Vec<Format>, ids: &Vec<u32>) -> Result<String, String> {
|
| 313 |
-
let
|
|
|
|
| 314 |
return Err("upstream:disabled".to_string());
|
| 315 |
-
}
|
| 316 |
-
let url = format!("{base}/get_url");
|
| 317 |
|
| 318 |
let client = reqwest::Client::builder()
|
| 319 |
.no_proxy()
|
|
@@ -321,20 +346,45 @@ async fn upstream_get_url_text(formats: &Vec<Format>, ids: &Vec<u32>) -> Result<
|
|
| 321 |
.build()
|
| 322 |
.map_err(|_| "upstream:client".to_string())?;
|
| 323 |
|
| 324 |
-
let
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 330 |
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 336 |
}
|
| 337 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 338 |
}
|
| 339 |
|
| 340 |
async fn upstream_media_url(id: u32, formats: &Vec<Format>) -> Result<String, String> {
|
|
|
|
| 298 |
Err(last_err)
|
| 299 |
}
|
| 300 |
|
| 301 |
+
fn upstream_bases() -> Vec<String> {
|
| 302 |
+
let mut out: Vec<String> = Vec::new();
|
| 303 |
+
|
| 304 |
let env = std::env::var("DZMEDIA_UPSTREAM").ok().unwrap_or_default();
|
| 305 |
+
let env = env.trim();
|
| 306 |
+
if env == "-" {
|
| 307 |
+
return out;
|
| 308 |
+
}
|
| 309 |
+
|
| 310 |
+
if !env.is_empty() {
|
| 311 |
+
for part in env.split(',') {
|
| 312 |
+
let s = part.trim();
|
| 313 |
+
if s.is_empty() {
|
| 314 |
+
continue;
|
| 315 |
+
}
|
| 316 |
+
out.push(s.trim_end_matches('/').to_string());
|
| 317 |
+
}
|
| 318 |
+
}
|
| 319 |
+
|
| 320 |
+
let fallback = "https://lufts-dzmedia.fly.dev";
|
| 321 |
+
if !out.iter().any(|x| x == fallback || x == "https://lufts-dzmedia.fly.dev/get_url") {
|
| 322 |
+
out.push(fallback.to_string());
|
| 323 |
+
}
|
| 324 |
+
|
| 325 |
+
out
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
fn upstream_get_url_endpoint(base: &str) -> String {
|
| 329 |
+
let b = base.trim_end_matches('/');
|
| 330 |
+
if b.ends_with("/get_url") {
|
| 331 |
+
b.to_string()
|
| 332 |
+
} else {
|
| 333 |
+
format!("{b}/get_url")
|
| 334 |
}
|
|
|
|
| 335 |
}
|
| 336 |
|
| 337 |
async fn upstream_get_url_text(formats: &Vec<Format>, ids: &Vec<u32>) -> Result<String, String> {
|
| 338 |
+
let bases = upstream_bases();
|
| 339 |
+
if bases.is_empty() {
|
| 340 |
return Err("upstream:disabled".to_string());
|
| 341 |
+
}
|
|
|
|
| 342 |
|
| 343 |
let client = reqwest::Client::builder()
|
| 344 |
.no_proxy()
|
|
|
|
| 346 |
.build()
|
| 347 |
.map_err(|_| "upstream:client".to_string())?;
|
| 348 |
|
| 349 |
+
let mut last_err = String::new();
|
| 350 |
+
for base in bases {
|
| 351 |
+
let url = upstream_get_url_endpoint(&base);
|
| 352 |
+
let r = match client
|
| 353 |
+
.post(url)
|
| 354 |
+
.json(&json!({ "formats": formats, "ids": ids }))
|
| 355 |
+
.send()
|
| 356 |
+
.await
|
| 357 |
+
{
|
| 358 |
+
Ok(v) => v,
|
| 359 |
+
Err(e) => {
|
| 360 |
+
last_err = format!("upstream:network:{base}:{e}");
|
| 361 |
+
continue;
|
| 362 |
+
}
|
| 363 |
+
};
|
| 364 |
|
| 365 |
+
let status = r.status();
|
| 366 |
+
let text = match r.text().await {
|
| 367 |
+
Ok(v) => v,
|
| 368 |
+
Err(e) => {
|
| 369 |
+
last_err = format!("upstream:read:{base}:{e}");
|
| 370 |
+
continue;
|
| 371 |
+
}
|
| 372 |
+
};
|
| 373 |
+
|
| 374 |
+
if !status.is_success() {
|
| 375 |
+
let snip: String = text.chars().take(200).collect();
|
| 376 |
+
last_err = format!("upstream:{}:{base}:{snip}", status.as_u16());
|
| 377 |
+
continue;
|
| 378 |
+
}
|
| 379 |
+
|
| 380 |
+
return Ok(text);
|
| 381 |
}
|
| 382 |
+
|
| 383 |
+
Err(if last_err.is_empty() {
|
| 384 |
+
"upstream:failed".to_string()
|
| 385 |
+
} else {
|
| 386 |
+
last_err
|
| 387 |
+
})
|
| 388 |
}
|
| 389 |
|
| 390 |
async fn upstream_media_url(id: u32, formats: &Vec<Format>) -> Result<String, String> {
|