mirror of https://github.com/Radarr/Radarr
Optional 'downloadClientId' for pushed releases
(cherry picked from commit fa5bfc3742c24c5730b77bf8178a423d98fdf50e) Closes #9190
This commit is contained in:
parent
3bc4197b4a
commit
ce145a3050
|
@ -14,6 +14,7 @@ namespace NzbDrone.Core.Download
|
|||
public interface IProcessDownloadDecisions
|
||||
{
|
||||
Task<ProcessedDecisions> ProcessDecisions(List<DownloadDecision> decisions);
|
||||
Task<ProcessedDecisionResult> ProcessDecision(DownloadDecision decision, int? downloadClientId);
|
||||
}
|
||||
|
||||
public class ProcessDownloadDecisions : IProcessDownloadDecisions
|
||||
|
@ -49,7 +50,6 @@ namespace NzbDrone.Core.Download
|
|||
|
||||
foreach (var report in prioritizedDecisions)
|
||||
{
|
||||
var remoteMovie = report.RemoteMovie;
|
||||
var downloadProtocol = report.RemoteMovie.Release.DownloadProtocol;
|
||||
|
||||
// Skip if already grabbed
|
||||
|
@ -71,37 +71,48 @@ namespace NzbDrone.Core.Download
|
|||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_logger.Trace("Grabbing from Indexer {0} at priority {1}.", remoteMovie.Release.Indexer, remoteMovie.Release.IndexerPriority);
|
||||
await _downloadService.DownloadReport(remoteMovie, null);
|
||||
grabbed.Add(report);
|
||||
}
|
||||
catch (ReleaseUnavailableException)
|
||||
{
|
||||
_logger.Warn("Failed to download release from indexer, no longer available. " + remoteMovie);
|
||||
rejected.Add(report);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (ex is DownloadClientUnavailableException || ex is DownloadClientAuthenticationException)
|
||||
{
|
||||
_logger.Debug(ex, "Failed to send release to download client, storing until later. " + remoteMovie);
|
||||
PreparePending(pendingAddQueue, grabbed, pending, report, PendingReleaseReason.DownloadClientUnavailable);
|
||||
var result = await ProcessDecisionInternal(report);
|
||||
|
||||
if (downloadProtocol == DownloadProtocol.Usenet)
|
||||
switch (result)
|
||||
{
|
||||
case ProcessedDecisionResult.Grabbed:
|
||||
{
|
||||
usenetFailed = true;
|
||||
grabbed.Add(report);
|
||||
break;
|
||||
}
|
||||
else if (downloadProtocol == DownloadProtocol.Torrent)
|
||||
|
||||
case ProcessedDecisionResult.Pending:
|
||||
{
|
||||
torrentFailed = true;
|
||||
PreparePending(pendingAddQueue, grabbed, pending, report, PendingReleaseReason.Delay);
|
||||
break;
|
||||
}
|
||||
|
||||
case ProcessedDecisionResult.Rejected:
|
||||
{
|
||||
rejected.Add(report);
|
||||
break;
|
||||
}
|
||||
|
||||
case ProcessedDecisionResult.Failed:
|
||||
{
|
||||
PreparePending(pendingAddQueue, grabbed, pending, report, PendingReleaseReason.DownloadClientUnavailable);
|
||||
|
||||
if (downloadProtocol == DownloadProtocol.Usenet)
|
||||
{
|
||||
usenetFailed = true;
|
||||
}
|
||||
else if (downloadProtocol == DownloadProtocol.Torrent)
|
||||
{
|
||||
torrentFailed = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ProcessedDecisionResult.Skipped:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Warn(ex, "Couldn't add report to download queue. " + remoteMovie);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -113,6 +124,30 @@ namespace NzbDrone.Core.Download
|
|||
return new ProcessedDecisions(grabbed, pending, rejected);
|
||||
}
|
||||
|
||||
public async Task<ProcessedDecisionResult> ProcessDecision(DownloadDecision decision, int? downloadClientId)
|
||||
{
|
||||
if (decision == null)
|
||||
{
|
||||
return ProcessedDecisionResult.Skipped;
|
||||
}
|
||||
|
||||
if (decision.TemporarilyRejected)
|
||||
{
|
||||
_pendingReleaseService.Add(decision, PendingReleaseReason.Delay);
|
||||
|
||||
return ProcessedDecisionResult.Pending;
|
||||
}
|
||||
|
||||
var result = await ProcessDecisionInternal(decision, downloadClientId);
|
||||
|
||||
if (result == ProcessedDecisionResult.Failed)
|
||||
{
|
||||
_pendingReleaseService.Add(decision, PendingReleaseReason.DownloadClientUnavailable);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
internal List<DownloadDecision> GetQualifiedReports(IEnumerable<DownloadDecision> decisions)
|
||||
{
|
||||
// Process both approved and temporarily rejected
|
||||
|
@ -145,5 +180,38 @@ namespace NzbDrone.Core.Download
|
|||
queue.Add(Tuple.Create(report, reason));
|
||||
pending.Add(report);
|
||||
}
|
||||
|
||||
private async Task<ProcessedDecisionResult> ProcessDecisionInternal(DownloadDecision decision, int? downloadClientId = null)
|
||||
{
|
||||
var remoteMovie = decision.RemoteMovie;
|
||||
|
||||
try
|
||||
{
|
||||
_logger.Trace("Grabbing from Indexer {0} at priority {1}.", remoteMovie.Release.Indexer, remoteMovie.Release.IndexerPriority);
|
||||
await _downloadService.DownloadReport(remoteMovie, downloadClientId);
|
||||
|
||||
return ProcessedDecisionResult.Grabbed;
|
||||
}
|
||||
catch (ReleaseUnavailableException)
|
||||
{
|
||||
_logger.Warn("Failed to download release from indexer, no longer available. " + remoteMovie);
|
||||
return ProcessedDecisionResult.Rejected;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (ex is DownloadClientUnavailableException || ex is DownloadClientAuthenticationException)
|
||||
{
|
||||
_logger.Debug(ex,
|
||||
"Failed to send release to download client, storing until later. " + remoteMovie);
|
||||
|
||||
return ProcessedDecisionResult.Failed;
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Warn(ex, "Couldn't add report to download queue. " + remoteMovie);
|
||||
return ProcessedDecisionResult.Skipped;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
namespace NzbDrone.Core.Download
|
||||
{
|
||||
public enum ProcessedDecisionResult
|
||||
{
|
||||
Grabbed,
|
||||
Pending,
|
||||
Rejected,
|
||||
Failed,
|
||||
Skipped
|
||||
}
|
||||
}
|
|
@ -44,6 +44,7 @@ namespace Radarr.Api.V3.Indexers
|
|||
}
|
||||
|
||||
[HttpPost]
|
||||
[Consumes("application/json")]
|
||||
public ActionResult<List<ReleaseResource>> Create(ReleaseResource release)
|
||||
{
|
||||
_logger.Info("Release pushed: {0} - {1}", release.Title, release.DownloadUrl);
|
||||
|
@ -56,22 +57,23 @@ namespace Radarr.Api.V3.Indexers
|
|||
|
||||
ResolveIndexer(info);
|
||||
|
||||
List<DownloadDecision> decisions;
|
||||
DownloadDecision decision;
|
||||
|
||||
lock (PushLock)
|
||||
{
|
||||
decisions = _downloadDecisionMaker.GetRssDecision(new List<ReleaseInfo> { info });
|
||||
_downloadDecisionProcessor.ProcessDecisions(decisions).GetAwaiter().GetResult();
|
||||
var decisions = _downloadDecisionMaker.GetRssDecision(new List<ReleaseInfo> { info });
|
||||
|
||||
decision = decisions.FirstOrDefault();
|
||||
|
||||
_downloadDecisionProcessor.ProcessDecision(decision, release.DownloadClientId).GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
var firstDecision = decisions.FirstOrDefault();
|
||||
|
||||
if (firstDecision?.RemoteMovie.ParsedMovieInfo == null)
|
||||
if (decision?.RemoteMovie.ParsedMovieInfo == null)
|
||||
{
|
||||
throw new ValidationException(new List<ValidationFailure> { new ValidationFailure("Title", "Unable to parse", release.Title) });
|
||||
}
|
||||
|
||||
return MapDecisions(new[] { firstDecision });
|
||||
return MapDecisions(new[] { decision });
|
||||
}
|
||||
|
||||
private void ResolveIndexer(ReleaseInfo release)
|
||||
|
|
Loading…
Reference in New Issue