1
0
Fork 0
mirror of https://github.com/lidarr/Lidarr synced 2024-12-26 17:47:08 +00:00

New: Limit grabs to 1 per second to reduce rapid API calls

This commit is contained in:
Mark McDowall 2015-05-05 08:13:21 -07:00
parent 0c6ca6971d
commit 1275d8098d

View file

@ -2,8 +2,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Common;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Download.Pending; using NzbDrone.Core.Download.Pending;
using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.Download namespace NzbDrone.Core.Download
{ {
@ -37,50 +39,55 @@ public ProcessedDecisions ProcessDecisions(List<DownloadDecision> decisions)
var grabbed = new List<DownloadDecision>(); var grabbed = new List<DownloadDecision>();
var pending = new List<DownloadDecision>(); var pending = new List<DownloadDecision>();
foreach (var report in prioritizedDecisions) //Limits to 1 grab every 1 second to reduce rapid API hits
using (var rateGate = new RateGate(1, TimeSpan.FromSeconds(1)))
{ {
var remoteEpisode = report.RemoteEpisode; foreach (var report in prioritizedDecisions)
var episodeIds = remoteEpisode.Episodes.Select(e => e.Id).ToList();
//Skip if already grabbed
if (grabbed.SelectMany(r => r.RemoteEpisode.Episodes)
.Select(e => e.Id)
.ToList()
.Intersect(episodeIds)
.Any())
{ {
continue; var remoteEpisode = report.RemoteEpisode;
}
if (report.TemporarilyRejected) var episodeIds = remoteEpisode.Episodes.Select(e => e.Id).ToList();
{
_pendingReleaseService.Add(report);
pending.Add(report);
continue;
}
if (pending.SelectMany(r => r.RemoteEpisode.Episodes) //Skip if already grabbed
.Select(e => e.Id) if (grabbed.SelectMany(r => r.RemoteEpisode.Episodes)
.ToList() .Select(e => e.Id)
.Intersect(episodeIds) .ToList()
.Any()) .Intersect(episodeIds)
{ .Any())
continue; {
} continue;
}
try if (report.TemporarilyRejected)
{ {
_downloadService.DownloadReport(remoteEpisode); _pendingReleaseService.Add(report);
grabbed.Add(report); pending.Add(report);
continue;
}
if (pending.SelectMany(r => r.RemoteEpisode.Episodes)
.Select(e => e.Id)
.ToList()
.Intersect(episodeIds)
.Any())
{
continue;
}
try
{
rateGate.WaitToProceed();
_downloadService.DownloadReport(remoteEpisode);
grabbed.Add(report);
}
catch (Exception e)
{
//TODO: support for store & forward
//We'll need to differentiate between a download client error and an indexer error
_logger.WarnException("Couldn't add report to download queue. " + remoteEpisode, e);
}
} }
catch (Exception e) }
{
//TODO: support for store & forward
//We'll need to differentiate between a download client error and an indexer error
_logger.WarnException("Couldn't add report to download queue. " + remoteEpisode, e);
}
}
return new ProcessedDecisions(grabbed, pending, decisions.Where(d => d.Rejected).ToList()); return new ProcessedDecisions(grabbed, pending, decisions.Where(d => d.Rejected).ToList());
} }