recycleactor commited on
Commit
c5ad4d7
·
verified ·
1 Parent(s): dca8032

Upload 2 files

Browse files
Files changed (1) hide show
  1. 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 upstream_dzmedia_base() -> Option<String> {
 
 
302
  let env = std::env::var("DZMEDIA_UPSTREAM").ok().unwrap_or_default();
303
- let base = env.trim();
304
- // Если переменная не задана — upstream отключён (используем только ARL)
305
- // Чтобы включить upstream — задайте DZMEDIA_UPSTREAM=https://your-instance.fly.dev
306
- if base.is_empty() || base == "-" {
307
- return None;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 Some(base) = upstream_dzmedia_base() else {
 
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 r = client
325
- .post(url)
326
- .json(&json!({ "formats": formats, "ids": ids }))
327
- .send()
328
- .await
329
- .map_err(|_| "upstream:network".to_string())?;
 
 
 
 
 
 
 
 
 
330
 
331
- let status = r.status();
332
- let text = r.text().await.map_err(|_| "upstream:read".to_string())?;
333
- if !status.is_success() {
334
- let snip: String = text.chars().take(200).collect();
335
- return Err(format!("upstream:{}:{}", status.as_u16(), snip));
 
 
 
 
 
 
 
 
 
 
 
336
  }
337
- Ok(text)
 
 
 
 
 
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> {