diff --git a/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/TubeArchivistApi.cs b/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/TubeArchivistApi.cs
index e3eeee4..a8ef3c0 100644
--- a/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/TubeArchivistApi.cs
+++ b/Jellyfin.Plugin.TubeArchivistMetadata/TubeArchivist/TubeArchivistApi.cs
@@ -17,6 +17,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
///
public class TubeArchivistApi
{
+ private const int MaxRedirectCount = 10;
private ILogger _logger;
private HttpClient client;
private static TubeArchivistApi _taApiInstance = null!;
@@ -62,11 +63,11 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
private static bool IsRedirectStatusCode(HttpStatusCode statusCode)
{
- return statusCode == HttpStatusCode.Moved
+ return statusCode == HttpStatusCode.Moved
|| statusCode == HttpStatusCode.Redirect
|| statusCode == HttpStatusCode.RedirectMethod
|| statusCode == HttpStatusCode.TemporaryRedirect
- || (int)statusCode == 308;
+ || statusCode == HttpStatusCode.PermanentRedirect;
}
private static Uri ResolveTubeArchivistUri(string? url)
@@ -80,14 +81,19 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
var response = await client.GetAsync(resolvedUrl).ConfigureAwait(true);
var redirectCount = 0;
- while (IsRedirectStatusCode(response.StatusCode) && response.Headers.Location != null && redirectCount < 10)
+ while (IsRedirectStatusCode(response.StatusCode) && response.Headers.Location != null && redirectCount < MaxRedirectCount)
{
resolvedUrl = ResolveTubeArchivistUri(response.Headers.Location.OriginalString);
- _logger.LogDebug("{Message}", "Received redirect to: " + resolvedUrl);
+ _logger.LogDebug("Received redirect to: {ResolvedUrl}", resolvedUrl);
response = await client.GetAsync(resolvedUrl).ConfigureAwait(true);
redirectCount++;
}
+ if (redirectCount >= MaxRedirectCount && IsRedirectStatusCode(response.StatusCode) && response.Headers.Location != null)
+ {
+ _logger.LogWarning("Stopped following TubeArchivist redirect chain after {RedirectCount} redirects. Last location: {RedirectLocation}", redirectCount, response.Headers.Location);
+ }
+
return response;
}
diff --git a/Jellyfin.Plugin.TubeArchivistMetadata/Utils/Utils.cs b/Jellyfin.Plugin.TubeArchivistMetadata/Utils/Utils.cs
index 454fc71..1e43fa7 100644
--- a/Jellyfin.Plugin.TubeArchivistMetadata/Utils/Utils.cs
+++ b/Jellyfin.Plugin.TubeArchivistMetadata/Utils/Utils.cs
@@ -81,8 +81,12 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Utilities
/// Resolves a URL against the configured TubeArchivist base URL.
///
/// Configured TubeArchivist base URL.
- /// The relative or absolute URL to resolve.
- /// A resolved absolute .
+ /// The relative or absolute URL to resolve. If null or whitespace, the base URL is returned.
+ ///
+ /// A resolved absolute .
+ /// Absolute URLs pointing to a different origin keep only their path, query and fragment,
+ /// so requests stay pinned to the configured TubeArchivist host.
+ ///
public static Uri ResolveUrl(string baseUrl, string? url)
{
var sanitizedBaseUrl = SanitizeUrl(baseUrl);