New: Resolve download client by name using 'downloadClient' for pushed releases

This commit is contained in:
Bogdan 2023-10-30 23:53:48 +02:00 committed by Mark McDowall
parent 0a2090237a
commit 0496e728dc
2 changed files with 31 additions and 2 deletions

View File

@ -21,6 +21,7 @@ namespace Sonarr.Api.V3.Indexers
private readonly IMakeDownloadDecision _downloadDecisionMaker; private readonly IMakeDownloadDecision _downloadDecisionMaker;
private readonly IProcessDownloadDecisions _downloadDecisionProcessor; private readonly IProcessDownloadDecisions _downloadDecisionProcessor;
private readonly IIndexerFactory _indexerFactory; private readonly IIndexerFactory _indexerFactory;
private readonly IDownloadClientFactory _downloadClientFactory;
private readonly Logger _logger; private readonly Logger _logger;
private static readonly object PushLock = new object(); private static readonly object PushLock = new object();
@ -28,6 +29,7 @@ namespace Sonarr.Api.V3.Indexers
public ReleasePushController(IMakeDownloadDecision downloadDecisionMaker, public ReleasePushController(IMakeDownloadDecision downloadDecisionMaker,
IProcessDownloadDecisions downloadDecisionProcessor, IProcessDownloadDecisions downloadDecisionProcessor,
IIndexerFactory indexerFactory, IIndexerFactory indexerFactory,
IDownloadClientFactory downloadClientFactory,
IQualityProfileService qualityProfileService, IQualityProfileService qualityProfileService,
Logger logger) Logger logger)
: base(qualityProfileService) : base(qualityProfileService)
@ -35,6 +37,7 @@ namespace Sonarr.Api.V3.Indexers
_downloadDecisionMaker = downloadDecisionMaker; _downloadDecisionMaker = downloadDecisionMaker;
_downloadDecisionProcessor = downloadDecisionProcessor; _downloadDecisionProcessor = downloadDecisionProcessor;
_indexerFactory = indexerFactory; _indexerFactory = indexerFactory;
_downloadClientFactory = downloadClientFactory;
_logger = logger; _logger = logger;
PostValidator.RuleFor(s => s.Title).NotEmpty(); PostValidator.RuleFor(s => s.Title).NotEmpty();
@ -57,6 +60,8 @@ namespace Sonarr.Api.V3.Indexers
ResolveIndexer(info); ResolveIndexer(info);
var downloadClientId = ResolveDownloadClientId(release);
DownloadDecision decision; DownloadDecision decision;
lock (PushLock) lock (PushLock)
@ -65,12 +70,12 @@ namespace Sonarr.Api.V3.Indexers
decision = decisions.FirstOrDefault(); decision = decisions.FirstOrDefault();
_downloadDecisionProcessor.ProcessDecision(decision, release.DownloadClientId).GetAwaiter().GetResult(); _downloadDecisionProcessor.ProcessDecision(decision, downloadClientId).GetAwaiter().GetResult();
} }
if (decision?.RemoteEpisode.ParsedEpisodeInfo == null) if (decision?.RemoteEpisode.ParsedEpisodeInfo == null)
{ {
throw new ValidationException(new List<ValidationFailure> { new ValidationFailure("Title", "Unable to parse", release.Title) }); throw new ValidationException(new List<ValidationFailure> { new ("Title", "Unable to parse", release.Title) });
} }
return MapDecisions(new[] { decision }); return MapDecisions(new[] { decision });
@ -110,5 +115,26 @@ namespace Sonarr.Api.V3.Indexers
_logger.Debug("Push Release {0} not associated with an indexer.", release.Title); _logger.Debug("Push Release {0} not associated with an indexer.", release.Title);
} }
} }
private int? ResolveDownloadClientId(ReleaseResource release)
{
var downloadClientId = release.DownloadClientId.GetValueOrDefault();
if (downloadClientId == 0 && release.DownloadClient.IsNotNullOrWhiteSpace())
{
var downloadClient = _downloadClientFactory.All().FirstOrDefault(v => v.Name.EqualsIgnoreCase(release.DownloadClient));
if (downloadClient != null)
{
_logger.Debug("Push Release {0} associated with download client {1} - {2}.", release.Title, downloadClientId, release.DownloadClient);
return downloadClient.Id;
}
_logger.Debug("Push Release {0} not associated with known download client {1}.", release.Title, release.DownloadClient);
}
return release.DownloadClientId;
}
} }
} }

View File

@ -85,6 +85,9 @@ namespace Sonarr.Api.V3.Indexers
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public int? DownloadClientId { get; set; } public int? DownloadClientId { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string DownloadClient { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public bool? ShouldOverride { get; set; } public bool? ShouldOverride { get; set; }
} }