From 20cc146d825e6acab70752f9b66e45345a00946d Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 30 Dec 2023 14:40:04 +0200 Subject: [PATCH] Fixed: Don't die when grabbing releases in bulk --- frontend/src/Store/Actions/releaseActions.js | 3 +- .../Search/SearchController.cs | 42 +++++++++++++++---- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/frontend/src/Store/Actions/releaseActions.js b/frontend/src/Store/Actions/releaseActions.js index 7ade2652d..bdb3ce2df 100644 --- a/frontend/src/Store/Actions/releaseActions.js +++ b/frontend/src/Store/Actions/releaseActions.js @@ -369,8 +369,9 @@ export const actionHandlers = handleThunks({ promise.done((data) => { dispatch(batchActions([ - ...data.map((release) => { + ...data.map(({ guid }) => { return updateRelease({ + guid, isGrabbing: false, isGrabbed: true, grabError: null diff --git a/src/Prowlarr.Api.V1/Search/SearchController.cs b/src/Prowlarr.Api.V1/Search/SearchController.cs index bc421f876..23fb2ab47 100644 --- a/src/Prowlarr.Api.V1/Search/SearchController.cs +++ b/src/Prowlarr.Api.V1/Search/SearchController.cs @@ -9,6 +9,7 @@ using NLog; using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; using NzbDrone.Core.Download; +using NzbDrone.Core.Download.Clients; using NzbDrone.Core.Exceptions; using NzbDrone.Core.Indexers; using NzbDrone.Core.IndexerSearch; @@ -54,7 +55,7 @@ namespace Prowlarr.Api.V1.Search [HttpPost] [Consumes("application/json")] [Produces("application/json")] - public ActionResult GrabRelease(ReleaseResource release) + public async Task> GrabRelease(ReleaseResource release) { ValidateResource(release); @@ -73,11 +74,12 @@ namespace Prowlarr.Api.V1.Search try { - _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null).GetAwaiter().GetResult(); + await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null); } catch (ReleaseDownloadException ex) { _logger.Error(ex, "Getting release from indexer failed"); + throw new NzbDroneClientException(HttpStatusCode.Conflict, "Getting release from indexer failed"); } @@ -87,12 +89,16 @@ namespace Prowlarr.Api.V1.Search [HttpPost("bulk")] [Consumes("application/json")] [Produces("application/json")] - public ActionResult GrabReleases(List releases) + public async Task> GrabReleases(List releases) { + releases.ForEach(release => ValidateResource(release)); + var source = Request.GetSource(); var host = Request.GetHostName(); - var groupedReleases = releases.GroupBy(r => r.IndexerId); + var grabbedReleases = new List(); + + var groupedReleases = releases.GroupBy(r => r.IndexerId).ToList(); foreach (var indexerReleases in groupedReleases) { @@ -100,22 +106,42 @@ namespace Prowlarr.Api.V1.Search foreach (var release in indexerReleases) { - ValidateResource(release); - var releaseInfo = _remoteReleaseCache.Find(GetCacheKey(release)); + if (releaseInfo == null) + { + _logger.Error("Couldn't find requested release in cache, cache timeout probably expired."); + + continue; + } + try { - _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null).GetAwaiter().GetResult(); + await _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect, null); } catch (ReleaseDownloadException ex) { _logger.Error(ex, "Getting release from indexer failed"); + + continue; + } + catch (DownloadClientException ex) + { + _logger.Error(ex, "Failed to send grabbed release to download client"); + + continue; } + + grabbedReleases.Add(release); } } - return Ok(releases); + if (!grabbedReleases.Any()) + { + throw new NzbDroneClientException(HttpStatusCode.BadRequest, "Failed to grab any release"); + } + + return Ok(grabbedReleases); } [HttpGet]