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);