From 257c9ab2484cb1b0f4ad2416c22e4cb3ac7f47cf Mon Sep 17 00:00:00 2001 From: Bogdan Date: Mon, 20 Nov 2023 02:37:13 +0200 Subject: [PATCH] Return 429 right away after release search --- .../IndexerSearch/ReleaseSearchService.cs | 19 ++++++--------- .../Indexers/NewznabController.cs | 23 +++++++++++++++---- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs index e0b5c52c0..03f546c42 100644 --- a/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs +++ b/src/NzbDrone.Core/IndexerSearch/ReleaseSearchService.cs @@ -39,19 +39,14 @@ namespace NzbDrone.Core.IndexerSearch public Task Search(NewznabRequest request, List indexerIds, bool interactiveSearch) { - switch (request.t) + return request.t switch { - case "movie": - return MovieSearch(request, indexerIds, interactiveSearch); - case "music": - return MusicSearch(request, indexerIds, interactiveSearch); - case "tvsearch": - return TvSearch(request, indexerIds, interactiveSearch); - case "book": - return BookSearch(request, indexerIds, interactiveSearch); - default: - return BasicSearch(request, indexerIds, interactiveSearch); - } + "movie" => MovieSearch(request, indexerIds, interactiveSearch), + "music" => MusicSearch(request, indexerIds, interactiveSearch), + "tvsearch" => TvSearch(request, indexerIds, interactiveSearch), + "book" => BookSearch(request, indexerIds, interactiveSearch), + _ => BasicSearch(request, indexerIds, interactiveSearch) + }; } private async Task MovieSearch(NewznabRequest request, List indexerIds, bool interactiveSearch) diff --git a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs index 2189135a8..4ee129caf 100644 --- a/src/Prowlarr.Api.V1/Indexers/NewznabController.cs +++ b/src/Prowlarr.Api.V1/Indexers/NewznabController.cs @@ -146,14 +146,13 @@ namespace NzbDrone.Api.V1.Indexers var indexer = _indexerFactory.GetInstance(indexerDef); - var blockedIndexerStatus = GetBlockedIndexerStatus(indexer); + var blockedIndexerStatusPre = GetBlockedIndexerStatus(indexer); - if (blockedIndexerStatus?.DisabledTill != null) + if (blockedIndexerStatusPre?.DisabledTill != null) { - var retryAfterDisabledTill = Convert.ToInt32(blockedIndexerStatus.DisabledTill.Value.ToLocalTime().Subtract(DateTime.Now).TotalSeconds); - AddRetryAfterHeader(retryAfterDisabledTill); + AddRetryAfterHeader(CalculateRetryAfterDisabledTill(blockedIndexerStatusPre.DisabledTill.Value)); - return CreateResponse(CreateErrorXML(429, $"Indexer is disabled till {blockedIndexerStatus.DisabledTill.Value.ToLocalTime()} due to recent failures."), statusCode: StatusCodes.Status429TooManyRequests); + return CreateResponse(CreateErrorXML(429, $"Indexer is disabled till {blockedIndexerStatusPre.DisabledTill.Value.ToLocalTime()} due to recent failures."), statusCode: StatusCodes.Status429TooManyRequests); } // TODO Optimize this so it's not called here and in ReleaseSearchService (for manual search) @@ -180,6 +179,15 @@ namespace NzbDrone.Api.V1.Indexers case "movie": var results = await _releaseSearchService.Search(request, new List { indexerDef.Id }, false); + var blockedIndexerStatusPost = GetBlockedIndexerStatus(indexer); + + if (blockedIndexerStatusPost?.DisabledTill != null) + { + AddRetryAfterHeader(CalculateRetryAfterDisabledTill(blockedIndexerStatusPost.DisabledTill.Value)); + + return CreateResponse(CreateErrorXML(429, $"Indexer is disabled till {blockedIndexerStatusPost.DisabledTill.Value.ToLocalTime()} due to recent failures."), statusCode: StatusCodes.Status429TooManyRequests); + } + foreach (var result in results.Releases) { result.DownloadUrl = result.DownloadUrl.IsNotNullOrWhiteSpace() ? _downloadMappingService.ConvertToProxyLink(new Uri(result.DownloadUrl), request.server, indexerDef.Id, result.Title).AbsoluteUri : null; @@ -336,5 +344,10 @@ namespace NzbDrone.Api.V1.Indexers HttpContext.Response.Headers.Add("Retry-After", $"{retryAfterSeconds}"); } } + + private static int CalculateRetryAfterDisabledTill(DateTime disabledTill) + { + return Convert.ToInt32(disabledTill.ToLocalTime().Subtract(DateTime.Now).TotalSeconds); + } } }