From 1a1f9e136f4de9377c3a78c0cbe9ae8dc323a391 Mon Sep 17 00:00:00 2001 From: Josh Patra Date: Tue, 3 Feb 2026 18:59:03 -0500 Subject: [PATCH] Fix image proxy to handle binary data instead of JSON parsing --- allstarr/Controllers/JellyfinController.cs | 50 ++++++++++++++++++---- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/allstarr/Controllers/JellyfinController.cs b/allstarr/Controllers/JellyfinController.cs index a6f5ec6..85ca1d8 100644 --- a/allstarr/Controllers/JellyfinController.cs +++ b/allstarr/Controllers/JellyfinController.cs @@ -2341,9 +2341,15 @@ public class JellyfinController : ControllerBase } } - // Handle non-JSON responses (robots.txt, etc.) - if (path.EndsWith(".txt", StringComparison.OrdinalIgnoreCase) || - path.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) + // Handle non-JSON responses (images, robots.txt, etc.) + if (path.Contains("/Images/", StringComparison.OrdinalIgnoreCase) || + path.EndsWith(".txt", StringComparison.OrdinalIgnoreCase) || + path.EndsWith(".xml", StringComparison.OrdinalIgnoreCase) || + path.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) || + path.EndsWith(".jpeg", StringComparison.OrdinalIgnoreCase) || + path.EndsWith(".png", StringComparison.OrdinalIgnoreCase) || + path.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) || + path.EndsWith(".webp", StringComparison.OrdinalIgnoreCase)) { var fullPath = path; if (Request.QueryString.HasValue) @@ -2355,14 +2361,42 @@ public class JellyfinController : ControllerBase try { - var response = await _proxyService.HttpClient.GetAsync(url); - var content = await response.Content.ReadAsStringAsync(); - var contentType = response.Content.Headers.ContentType?.ToString() ?? "text/plain"; - return Content(content, contentType); + // Forward authentication headers for image requests + using var request = new HttpRequestMessage(HttpMethod.Get, url); + + // Forward auth headers from client + if (Request.Headers.TryGetValue("X-Emby-Authorization", out var embyAuth)) + { + request.Headers.TryAddWithoutValidation("X-Emby-Authorization", embyAuth.ToString()); + } + else if (Request.Headers.TryGetValue("Authorization", out var auth)) + { + var authValue = auth.ToString(); + if (authValue.Contains("MediaBrowser", StringComparison.OrdinalIgnoreCase) || + authValue.Contains("Token=", StringComparison.OrdinalIgnoreCase)) + { + request.Headers.TryAddWithoutValidation("X-Emby-Authorization", authValue); + } + else + { + request.Headers.TryAddWithoutValidation("Authorization", authValue); + } + } + + var response = await _proxyService.HttpClient.GetAsync(request); + + if (!response.IsSuccessStatusCode) + { + return StatusCode((int)response.StatusCode); + } + + var contentBytes = await response.Content.ReadAsByteArrayAsync(); + var contentType = response.Content.Headers.ContentType?.ToString() ?? "application/octet-stream"; + return File(contentBytes, contentType); } catch (Exception ex) { - _logger.LogWarning(ex, "Failed to proxy non-JSON request for {Path}", path); + _logger.LogWarning(ex, "Failed to proxy binary request for {Path}", path); return NotFound(); } }