From ae78519490df271c3c83b34f35591b5607ca1020 Mon Sep 17 00:00:00 2001 From: zarzet <42882290+zarzet@users.noreply.github.com> Date: Tue, 15 Sep 2026 21:44:22 +0700 Subject: [PATCH] fix(download): log provider failures before fallback --- .../extensions/src/backend/downloads.rs | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/rust_backend/crates/extensions/src/backend/downloads.rs b/rust_backend/crates/extensions/src/backend/downloads.rs index 13339893..33bd310a 100644 --- a/rust_backend/crates/extensions/src/backend/downloads.rs +++ b/rust_backend/crates/extensions/src/backend/downloads.rs @@ -492,6 +492,7 @@ impl Backend { let quality = match manifest.resolve_download_quality(&request.quality, source.as_ref()) { Ok(quality) => quality, Err(error) => { + self.log_provider_failure(&request.download_provider, "quality selection", &error); return Ok(DownloadOutcome::Retry(failure( &request.download_provider, &error, @@ -502,7 +503,15 @@ impl Backend { }; let mut attempt = request.clone(); attempt.quality = quality; - self.download_attempt(&attempt, manifest, availability, lease) + let outcome = self.download_attempt(&attempt, manifest, availability, lease)?; + if let DownloadOutcome::Retry(response) = &outcome { + self.log_provider_failure( + &request.download_provider, + "download", + text(response, "error"), + ); + } + Ok(outcome) } fn download_availability( @@ -523,10 +532,31 @@ impl Backend { item_id: request.item_id.clone(), track: host_track(request).as_object().cloned(), }; - let raw = self + let result = self .check_availability_with_lease(id, input, 30_000, Some(lease)) - .map_err(|error| error.to_string())?; - serde_json::from_str(&raw).map_err(|error| error.to_string()) + .map_err(|error| error.to_string()) + .and_then(|raw| serde_json::from_str::(&raw).map_err(|error| error.to_string())); + match &result { + Ok(value) if value["available"] != true => { + self.log_provider_failure(id, "availability", text(value, "reason")); + } + Err(error) => self.log_provider_failure(id, "availability", error), + _ => {} + } + result + } + + fn log_provider_failure(&self, id: &str, stage: &str, reason: &str) { + let reason = if reason.trim().is_empty() { + "no reason supplied" + } else { + reason + }; + let _ = self.environment().log_buffer().add( + "WARN", + "DownloadPlanner", + &format!("Provider {id} failed during {stage}: {reason}"), + ); } fn enrich_download_source(