mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2025-09-17 17:14:18 +02:00
New: List Status Checks/Backoffs
This commit is contained in:
@@ -0,0 +1,87 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Core.HealthCheck.Checks;
|
||||||
|
using NzbDrone.Core.NetImport;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.HealthCheck.Checks
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class NetImportStatusCheckFixture : CoreTest<NetImportStatusCheck>
|
||||||
|
{
|
||||||
|
private List<INetImport> _lists = new List<INetImport>();
|
||||||
|
private List<NetImportStatus> _blockedLists = new List<NetImportStatus>();
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<INetImportFactory>()
|
||||||
|
.Setup(v => v.GetAvailableProviders())
|
||||||
|
.Returns(_lists);
|
||||||
|
|
||||||
|
Mocker.GetMock<INetImportStatusService>()
|
||||||
|
.Setup(v => v.GetBlockedProviders())
|
||||||
|
.Returns(_blockedLists);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Mock<INetImport> GivenList(int i, double backoffHours, double failureHours)
|
||||||
|
{
|
||||||
|
var id = i;
|
||||||
|
|
||||||
|
var mockList = new Mock<INetImport>();
|
||||||
|
mockList.SetupGet(s => s.Definition).Returns(new NetImportDefinition { Id = id });
|
||||||
|
mockList.SetupGet(s => s.EnableAuto).Returns(true);
|
||||||
|
|
||||||
|
_lists.Add(mockList.Object);
|
||||||
|
|
||||||
|
if (backoffHours != 0.0)
|
||||||
|
{
|
||||||
|
_blockedLists.Add(new NetImportStatus
|
||||||
|
{
|
||||||
|
ProviderId = id,
|
||||||
|
InitialFailure = DateTime.UtcNow.AddHours(-failureHours),
|
||||||
|
MostRecentFailure = DateTime.UtcNow.AddHours(-0.1),
|
||||||
|
EscalationLevel = 5,
|
||||||
|
DisabledTill = DateTime.UtcNow.AddHours(backoffHours)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return mockList;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_return_error_when_no_indexers()
|
||||||
|
{
|
||||||
|
Subject.Check().ShouldBeOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_warning_if_indexer_unavailable()
|
||||||
|
{
|
||||||
|
GivenList(1, 10.0, 24.0);
|
||||||
|
GivenList(2, 0.0, 0.0);
|
||||||
|
|
||||||
|
Subject.Check().ShouldBeWarning();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_error_if_all_indexers_unavailable()
|
||||||
|
{
|
||||||
|
GivenList(1, 10.0, 24.0);
|
||||||
|
|
||||||
|
Subject.Check().ShouldBeError();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_return_warning_if_few_indexers_unavailable()
|
||||||
|
{
|
||||||
|
GivenList(1, 10.0, 24.0);
|
||||||
|
GivenList(2, 10.0, 24.0);
|
||||||
|
GivenList(3, 0.0, 0.0);
|
||||||
|
|
||||||
|
Subject.Check().ShouldBeWarning();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,72 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using FluentAssertions;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
|
using NzbDrone.Core.NetImport;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.NetImport
|
||||||
|
{
|
||||||
|
public class NetImportStatusServiceFixture : CoreTest<NetImportStatusService>
|
||||||
|
{
|
||||||
|
private DateTime _epoch;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
_epoch = DateTime.UtcNow;
|
||||||
|
|
||||||
|
Mocker.GetMock<IRuntimeInfo>()
|
||||||
|
.SetupGet(v => v.StartTime)
|
||||||
|
.Returns(_epoch - TimeSpan.FromHours(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WithStatus(NetImportStatus status)
|
||||||
|
{
|
||||||
|
Mocker.GetMock<INetImportStatusRepository>()
|
||||||
|
.Setup(v => v.FindByProviderId(1))
|
||||||
|
.Returns(status);
|
||||||
|
|
||||||
|
Mocker.GetMock<INetImportStatusRepository>()
|
||||||
|
.Setup(v => v.All())
|
||||||
|
.Returns(new[] { status });
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VerifyUpdate()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<INetImportStatusRepository>()
|
||||||
|
.Verify(v => v.Upsert(It.IsAny<NetImportStatus>()), Times.Once());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VerifyNoUpdate()
|
||||||
|
{
|
||||||
|
Mocker.GetMock<INetImportStatusRepository>()
|
||||||
|
.Verify(v => v.Upsert(It.IsAny<NetImportStatus>()), Times.Never());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_cancel_backoff_on_success()
|
||||||
|
{
|
||||||
|
WithStatus(new NetImportStatus { EscalationLevel = 2 });
|
||||||
|
|
||||||
|
Subject.RecordSuccess(1);
|
||||||
|
|
||||||
|
VerifyUpdate();
|
||||||
|
|
||||||
|
var status = Subject.GetBlockedProviders().FirstOrDefault();
|
||||||
|
status.Should().BeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_store_update_if_already_okay()
|
||||||
|
{
|
||||||
|
WithStatus(new NetImportStatus { EscalationLevel = 0 });
|
||||||
|
|
||||||
|
Subject.RecordSuccess(1);
|
||||||
|
|
||||||
|
VerifyNoUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,20 @@
|
|||||||
|
using FluentMigrator;
|
||||||
|
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Datastore.Migration
|
||||||
|
{
|
||||||
|
[Migration(173)]
|
||||||
|
public class net_import_status : NzbDroneMigrationBase
|
||||||
|
{
|
||||||
|
protected override void MainDbUpgrade()
|
||||||
|
{
|
||||||
|
Create.TableForModel("NetImportStatus")
|
||||||
|
.WithColumn("ProviderId").AsInt32().NotNullable().Unique()
|
||||||
|
.WithColumn("InitialFailure").AsDateTime().Nullable()
|
||||||
|
.WithColumn("MostRecentFailure").AsDateTime().Nullable()
|
||||||
|
.WithColumn("EscalationLevel").AsInt32().NotNullable()
|
||||||
|
.WithColumn("DisabledTill").AsDateTime().Nullable()
|
||||||
|
.WithColumn("LastSyncListInfo").AsString().Nullable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -137,6 +137,7 @@ namespace NzbDrone.Core.Datastore
|
|||||||
|
|
||||||
Mapper.Entity<IndexerStatus>("IndexerStatus").RegisterModel();
|
Mapper.Entity<IndexerStatus>("IndexerStatus").RegisterModel();
|
||||||
Mapper.Entity<DownloadClientStatus>("DownloadClientStatus").RegisterModel();
|
Mapper.Entity<DownloadClientStatus>("DownloadClientStatus").RegisterModel();
|
||||||
|
Mapper.Entity<NetImportStatus>("NetImportStatus").RegisterModel();
|
||||||
|
|
||||||
Mapper.Entity<CustomFilter>("CustomFilters").RegisterModel();
|
Mapper.Entity<CustomFilter>("CustomFilters").RegisterModel();
|
||||||
|
|
||||||
|
44
src/NzbDrone.Core/HealthCheck/Checks/NetImportStatusCheck.cs
Normal file
44
src/NzbDrone.Core/HealthCheck/Checks/NetImportStatusCheck.cs
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Core.NetImport;
|
||||||
|
using NzbDrone.Core.ThingiProvider.Events;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.HealthCheck.Checks
|
||||||
|
{
|
||||||
|
[CheckOn(typeof(ProviderUpdatedEvent<INetImport>))]
|
||||||
|
[CheckOn(typeof(ProviderDeletedEvent<INetImport>))]
|
||||||
|
[CheckOn(typeof(ProviderStatusChangedEvent<INetImport>))]
|
||||||
|
public class NetImportStatusCheck : HealthCheckBase
|
||||||
|
{
|
||||||
|
private readonly INetImportFactory _providerFactory;
|
||||||
|
private readonly INetImportStatusService _providerStatusService;
|
||||||
|
|
||||||
|
public NetImportStatusCheck(INetImportFactory providerFactory, INetImportStatusService providerStatusService)
|
||||||
|
{
|
||||||
|
_providerFactory = providerFactory;
|
||||||
|
_providerStatusService = providerStatusService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override HealthCheck Check()
|
||||||
|
{
|
||||||
|
var enabledProviders = _providerFactory.GetAvailableProviders();
|
||||||
|
var backOffProviders = enabledProviders.Join(_providerStatusService.GetBlockedProviders(),
|
||||||
|
i => i.Definition.Id,
|
||||||
|
s => s.ProviderId,
|
||||||
|
(i, s) => new { Provider = i, Status = s })
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
if (backOffProviders.Empty())
|
||||||
|
{
|
||||||
|
return new HealthCheck(GetType());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (backOffProviders.Count == enabledProviders.Count)
|
||||||
|
{
|
||||||
|
return new HealthCheck(GetType(), HealthCheckResult.Error, "All lists are unavailable due to failures", "#lists-are-unavailable-due-to-failures");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format("Lists unavailable due to failures: {0}", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), "#lists-are-unavailable-due-to-failures");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -13,8 +13,8 @@ namespace NzbDrone.Core.NetImport.CouchPotato
|
|||||||
public override bool Enabled => true;
|
public override bool Enabled => true;
|
||||||
public override bool EnableAuto => false;
|
public override bool EnableAuto => false;
|
||||||
|
|
||||||
public CouchPotatoImport(IHttpClient httpClient, IConfigService configService, IParsingService parsingService, Logger logger)
|
public CouchPotatoImport(IHttpClient httpClient, INetImportStatusService netImportStatusService, IConfigService configService, IParsingService parsingService, Logger logger)
|
||||||
: base(httpClient, configService, parsingService, logger)
|
: base(httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
@@ -7,6 +7,8 @@ using NLog;
|
|||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
|
using NzbDrone.Core.Http.CloudFlare;
|
||||||
|
using NzbDrone.Core.Indexers.Exceptions;
|
||||||
using NzbDrone.Core.Movies;
|
using NzbDrone.Core.Movies;
|
||||||
using NzbDrone.Core.NetImport.Exceptions;
|
using NzbDrone.Core.NetImport.Exceptions;
|
||||||
using NzbDrone.Core.Parser;
|
using NzbDrone.Core.Parser;
|
||||||
@@ -28,8 +30,8 @@ namespace NzbDrone.Core.NetImport
|
|||||||
public abstract INetImportRequestGenerator GetRequestGenerator();
|
public abstract INetImportRequestGenerator GetRequestGenerator();
|
||||||
public abstract IParseNetImportResponse GetParser();
|
public abstract IParseNetImportResponse GetParser();
|
||||||
|
|
||||||
public HttpNetImportBase(IHttpClient httpClient, IConfigService configService, IParsingService parsingService, Logger logger)
|
public HttpNetImportBase(IHttpClient httpClient, INetImportStatusService netImportStatusService, IConfigService configService, IParsingService parsingService, Logger logger)
|
||||||
: base(configService, parsingService, logger)
|
: base(netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
}
|
}
|
||||||
@@ -72,10 +74,21 @@ namespace NzbDrone.Core.NetImport
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_netImportStatusService.RecordSuccess(Definition.Id);
|
||||||
}
|
}
|
||||||
catch (WebException webException)
|
catch (WebException webException)
|
||||||
{
|
{
|
||||||
anyFailure = true;
|
if (webException.Status == WebExceptionStatus.NameResolutionFailure ||
|
||||||
|
webException.Status == WebExceptionStatus.ConnectFailure)
|
||||||
|
{
|
||||||
|
_netImportStatusService.RecordConnectionFailure(Definition.Id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_netImportStatusService.RecordFailure(Definition.Id);
|
||||||
|
}
|
||||||
|
|
||||||
if (webException.Message.Contains("502") || webException.Message.Contains("503") ||
|
if (webException.Message.Contains("502") || webException.Message.Contains("503") ||
|
||||||
webException.Message.Contains("timed out"))
|
webException.Message.Contains("timed out"))
|
||||||
{
|
{
|
||||||
@@ -86,23 +99,52 @@ namespace NzbDrone.Core.NetImport
|
|||||||
_logger.Warn("{0} {1} {2}", this, url, webException.Message);
|
_logger.Warn("{0} {1} {2}", this, url, webException.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (HttpException httpException)
|
catch (TooManyRequestsException ex)
|
||||||
{
|
{
|
||||||
anyFailure = true;
|
if (ex.RetryAfter != TimeSpan.Zero)
|
||||||
if ((int)httpException.Response.StatusCode == 429)
|
|
||||||
{
|
{
|
||||||
_logger.Warn("API Request Limit reached for {0}", this);
|
_netImportStatusService.RecordFailure(Definition.Id, ex.RetryAfter);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.Warn("{0} {1}", this, httpException.Message);
|
_netImportStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.Warn("API Request Limit reached for {0}", this);
|
||||||
|
}
|
||||||
|
catch (HttpException ex)
|
||||||
|
{
|
||||||
|
_netImportStatusService.RecordFailure(Definition.Id);
|
||||||
|
_logger.Warn("{0} {1}", this, ex.Message);
|
||||||
|
}
|
||||||
|
catch (RequestLimitReachedException)
|
||||||
|
{
|
||||||
|
_netImportStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1));
|
||||||
|
_logger.Warn("API Request Limit reached for {0}", this);
|
||||||
|
}
|
||||||
|
catch (CloudFlareCaptchaException ex)
|
||||||
|
{
|
||||||
|
_netImportStatusService.RecordFailure(Definition.Id);
|
||||||
|
ex.WithData("FeedUrl", url);
|
||||||
|
if (ex.IsExpired)
|
||||||
|
{
|
||||||
|
_logger.Error(ex, "Expired CAPTCHA token for {0}, please refresh in import list settings.", this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_logger.Error(ex, "CAPTCHA token required for {0}, check import list settings.", this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception feedEx)
|
catch (NetImportException ex)
|
||||||
{
|
{
|
||||||
anyFailure = true;
|
_netImportStatusService.RecordFailure(Definition.Id);
|
||||||
feedEx.Data.Add("FeedUrl", url);
|
_logger.Warn(ex, "{0}", url);
|
||||||
_logger.Error(feedEx, "An error occurred while processing list feed {0}", url);
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_netImportStatusService.RecordFailure(Definition.Id);
|
||||||
|
ex.WithData("FeedUrl", url);
|
||||||
|
_logger.Error(ex, "An error occurred while processing feed. {0}", url);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new NetImportFetchResult { Movies = movies, AnyFailure = anyFailure };
|
return new NetImportFetchResult { Movies = movies, AnyFailure = anyFailure };
|
||||||
@@ -155,6 +197,16 @@ namespace NzbDrone.Core.NetImport
|
|||||||
return new ValidationFailure(string.Empty, "No results were returned from your list, please check your settings.");
|
return new ValidationFailure(string.Empty, "No results were returned from your list, please check your settings.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (RequestLimitReachedException)
|
||||||
|
{
|
||||||
|
_logger.Warn("Request limit reached");
|
||||||
|
}
|
||||||
|
catch (UnsupportedFeedException ex)
|
||||||
|
{
|
||||||
|
_logger.Warn(ex, "Net Import feed is not supported");
|
||||||
|
|
||||||
|
return new ValidationFailure(string.Empty, "Net Import feed is not supported: " + ex.Message);
|
||||||
|
}
|
||||||
catch (NetImportException ex)
|
catch (NetImportException ex)
|
||||||
{
|
{
|
||||||
_logger.Warn(ex, "Unable to connect to list");
|
_logger.Warn(ex, "Unable to connect to list");
|
||||||
|
@@ -18,6 +18,7 @@ namespace NzbDrone.Core.NetImport
|
|||||||
public abstract class NetImportBase<TSettings> : INetImport
|
public abstract class NetImportBase<TSettings> : INetImport
|
||||||
where TSettings : IProviderConfig, new()
|
where TSettings : IProviderConfig, new()
|
||||||
{
|
{
|
||||||
|
protected readonly INetImportStatusService _netImportStatusService;
|
||||||
protected readonly IConfigService _configService;
|
protected readonly IConfigService _configService;
|
||||||
protected readonly IParsingService _parsingService;
|
protected readonly IParsingService _parsingService;
|
||||||
protected readonly Logger _logger;
|
protected readonly Logger _logger;
|
||||||
@@ -30,8 +31,9 @@ namespace NzbDrone.Core.NetImport
|
|||||||
|
|
||||||
public abstract NetImportFetchResult Fetch();
|
public abstract NetImportFetchResult Fetch();
|
||||||
|
|
||||||
public NetImportBase(IConfigService configService, IParsingService parsingService, Logger logger)
|
public NetImportBase(INetImportStatusService netImportStatusService, IConfigService configService, IParsingService parsingService, Logger logger)
|
||||||
{
|
{
|
||||||
|
_netImportStatusService = netImportStatusService;
|
||||||
_configService = configService;
|
_configService = configService;
|
||||||
_parsingService = parsingService;
|
_parsingService = parsingService;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
10
src/NzbDrone.Core/NetImport/NetImportStatus.cs
Normal file
10
src/NzbDrone.Core/NetImport/NetImportStatus.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using NzbDrone.Core.Movies;
|
||||||
|
using NzbDrone.Core.ThingiProvider.Status;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.NetImport
|
||||||
|
{
|
||||||
|
public class NetImportStatus : ProviderStatusBase
|
||||||
|
{
|
||||||
|
public Movie LastSyncListInfo { get; set; }
|
||||||
|
}
|
||||||
|
}
|
18
src/NzbDrone.Core/NetImport/NetImportStatusRepository.cs
Normal file
18
src/NzbDrone.Core/NetImport/NetImportStatusRepository.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.Messaging.Events;
|
||||||
|
using NzbDrone.Core.ThingiProvider.Status;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.NetImport
|
||||||
|
{
|
||||||
|
public interface INetImportStatusRepository : IProviderStatusRepository<NetImportStatus>
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NetImportStatusRepository : ProviderStatusRepository<NetImportStatus>, INetImportStatusRepository
|
||||||
|
{
|
||||||
|
public NetImportStatusRepository(IMainDatabase database, IEventAggregator eventAggregator)
|
||||||
|
: base(database, eventAggregator)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
40
src/NzbDrone.Core/NetImport/NetImportStatusService.cs
Normal file
40
src/NzbDrone.Core/NetImport/NetImportStatusService.cs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
using NLog;
|
||||||
|
using NzbDrone.Common.EnvironmentInfo;
|
||||||
|
using NzbDrone.Core.Messaging.Events;
|
||||||
|
using NzbDrone.Core.Movies;
|
||||||
|
using NzbDrone.Core.ThingiProvider.Status;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.NetImport
|
||||||
|
{
|
||||||
|
public interface INetImportStatusService : IProviderStatusServiceBase<NetImportStatus>
|
||||||
|
{
|
||||||
|
Movie GetLastSyncListInfo(int importListId);
|
||||||
|
|
||||||
|
void UpdateListSyncStatus(int importListId, Movie listItemInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NetImportStatusService : ProviderStatusServiceBase<INetImport, NetImportStatus>, INetImportStatusService
|
||||||
|
{
|
||||||
|
public NetImportStatusService(INetImportStatusRepository providerStatusRepository, IEventAggregator eventAggregator, IRuntimeInfo runtimeInfo, Logger logger)
|
||||||
|
: base(providerStatusRepository, eventAggregator, runtimeInfo, logger)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Movie GetLastSyncListInfo(int importListId)
|
||||||
|
{
|
||||||
|
return GetProviderStatus(importListId).LastSyncListInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateListSyncStatus(int importListId, Movie listItemInfo)
|
||||||
|
{
|
||||||
|
lock (_syncRoot)
|
||||||
|
{
|
||||||
|
var status = GetProviderStatus(importListId);
|
||||||
|
|
||||||
|
status.LastSyncListInfo = listItemInfo;
|
||||||
|
|
||||||
|
_providerStatusRepository.Upsert(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -15,8 +15,8 @@ namespace NzbDrone.Core.NetImport.RSSImport
|
|||||||
public override bool Enabled => true;
|
public override bool Enabled => true;
|
||||||
public override bool EnableAuto => false;
|
public override bool EnableAuto => false;
|
||||||
|
|
||||||
public RSSImport(IHttpClient httpClient, IConfigService configService, IParsingService parsingService, Logger logger)
|
public RSSImport(IHttpClient httpClient, INetImportStatusService netImportStatusService, IConfigService configService, IParsingService parsingService, Logger logger)
|
||||||
: base(httpClient, configService, parsingService, logger)
|
: base(httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,10 +21,11 @@ namespace NzbDrone.Core.NetImport.Radarr
|
|||||||
public override NetImportType ListType => NetImportType.Program;
|
public override NetImportType ListType => NetImportType.Program;
|
||||||
|
|
||||||
public RadarrImport(IRadarrV3Proxy radarrV3Proxy,
|
public RadarrImport(IRadarrV3Proxy radarrV3Proxy,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(configService, parsingService, logger)
|
: base(netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
_radarrV3Proxy = radarrV3Proxy;
|
_radarrV3Proxy = radarrV3Proxy;
|
||||||
}
|
}
|
||||||
|
@@ -16,10 +16,11 @@ namespace NzbDrone.Core.NetImport.RadarrList
|
|||||||
public override bool EnableAuto => false;
|
public override bool EnableAuto => false;
|
||||||
|
|
||||||
public RadarrListImport(IHttpClient httpClient,
|
public RadarrListImport(IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(httpClient, configService, parsingService, logger)
|
: base(httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Parser;
|
using NzbDrone.Core.Parser;
|
||||||
@@ -13,8 +13,12 @@ namespace NzbDrone.Core.NetImport.StevenLu
|
|||||||
public override bool Enabled => true;
|
public override bool Enabled => true;
|
||||||
public override bool EnableAuto => false;
|
public override bool EnableAuto => false;
|
||||||
|
|
||||||
public StevenLuImport(IHttpClient httpClient, IConfigService configService, IParsingService parsingService, Logger logger)
|
public StevenLuImport(IHttpClient httpClient,
|
||||||
: base(httpClient, configService, parsingService, logger)
|
INetImportStatusService netImportStatusService,
|
||||||
|
IConfigService configService,
|
||||||
|
IParsingService parsingService,
|
||||||
|
Logger logger)
|
||||||
|
: base(httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,11 +11,12 @@ namespace NzbDrone.Core.NetImport.TMDb.Collection
|
|||||||
{
|
{
|
||||||
public TMDbCollectionImport(IRadarrCloudRequestBuilder requestBuilder,
|
public TMDbCollectionImport(IRadarrCloudRequestBuilder requestBuilder,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
ISearchForNewMovie searchForNewMovie,
|
ISearchForNewMovie searchForNewMovie,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(requestBuilder, httpClient, configService, parsingService, searchForNewMovie, logger)
|
: base(requestBuilder, httpClient, netImportStatusService, configService, parsingService, searchForNewMovie, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,11 +11,12 @@ namespace NzbDrone.Core.NetImport.TMDb.List
|
|||||||
{
|
{
|
||||||
public TMDbListImport(IRadarrCloudRequestBuilder requestBuilder,
|
public TMDbListImport(IRadarrCloudRequestBuilder requestBuilder,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
ISearchForNewMovie searchForNewMovie,
|
ISearchForNewMovie searchForNewMovie,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(requestBuilder, httpClient, configService, parsingService, searchForNewMovie, logger)
|
: base(requestBuilder, httpClient, netImportStatusService, configService, parsingService, searchForNewMovie, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,11 +11,12 @@ namespace NzbDrone.Core.NetImport.TMDb.Person
|
|||||||
{
|
{
|
||||||
public TMDbPersonImport(IRadarrCloudRequestBuilder requestBuilder,
|
public TMDbPersonImport(IRadarrCloudRequestBuilder requestBuilder,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
ISearchForNewMovie searchForNewMovie,
|
ISearchForNewMovie searchForNewMovie,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(requestBuilder, httpClient, configService, parsingService, searchForNewMovie, logger)
|
: base(requestBuilder, httpClient, netImportStatusService, configService, parsingService, searchForNewMovie, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,11 +11,12 @@ namespace NzbDrone.Core.NetImport.TMDb.Popular
|
|||||||
{
|
{
|
||||||
public TMDbPopularImport(IRadarrCloudRequestBuilder requestBuilder,
|
public TMDbPopularImport(IRadarrCloudRequestBuilder requestBuilder,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
ISearchForNewMovie searchForNewMovie,
|
ISearchForNewMovie searchForNewMovie,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(requestBuilder, httpClient, configService, parsingService, searchForNewMovie, logger)
|
: base(requestBuilder, httpClient, netImportStatusService, configService, parsingService, searchForNewMovie, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common.Cloud;
|
using NzbDrone.Common.Cloud;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
@@ -17,11 +17,12 @@ namespace NzbDrone.Core.NetImport.TMDb
|
|||||||
|
|
||||||
protected TMDbNetImportBase(IRadarrCloudRequestBuilder requestBuilder,
|
protected TMDbNetImportBase(IRadarrCloudRequestBuilder requestBuilder,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
ISearchForNewMovie skyhookProxy,
|
ISearchForNewMovie skyhookProxy,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(httpClient, configService, parsingService, logger)
|
: base(httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
_skyhookProxy = skyhookProxy;
|
_skyhookProxy = skyhookProxy;
|
||||||
_requestBuilder = requestBuilder.TMDB;
|
_requestBuilder = requestBuilder.TMDB;
|
||||||
|
@@ -13,11 +13,12 @@ namespace NzbDrone.Core.NetImport.TMDb.User
|
|||||||
{
|
{
|
||||||
public TMDbUserImport(IRadarrCloudRequestBuilder requestBuilder,
|
public TMDbUserImport(IRadarrCloudRequestBuilder requestBuilder,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
ISearchForNewMovie searchForNewMovie,
|
ISearchForNewMovie searchForNewMovie,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(requestBuilder, httpClient, configService, parsingService, searchForNewMovie, logger)
|
: base(requestBuilder, httpClient, netImportStatusService, configService, parsingService, searchForNewMovie, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -9,10 +9,11 @@ namespace NzbDrone.Core.NetImport.Trakt.List
|
|||||||
{
|
{
|
||||||
public TraktListImport(INetImportRepository netImportRepository,
|
public TraktListImport(INetImportRepository netImportRepository,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(netImportRepository, httpClient, configService, parsingService, logger)
|
: base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -9,10 +9,11 @@ namespace NzbDrone.Core.NetImport.Trakt.Popular
|
|||||||
{
|
{
|
||||||
public TraktPopularImport(INetImportRepository netImportRepository,
|
public TraktPopularImport(INetImportRepository netImportRepository,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(netImportRepository, httpClient, configService, parsingService, logger)
|
: base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,10 +18,11 @@ namespace NzbDrone.Core.NetImport.Trakt
|
|||||||
|
|
||||||
protected TraktImportBase(INetImportRepository netImportRepository,
|
protected TraktImportBase(INetImportRepository netImportRepository,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(httpClient, configService, parsingService, logger)
|
: base(httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
_netImportRepository = netImportRepository;
|
_netImportRepository = netImportRepository;
|
||||||
}
|
}
|
||||||
|
@@ -9,10 +9,11 @@ namespace NzbDrone.Core.NetImport.Trakt.User
|
|||||||
{
|
{
|
||||||
public TraktUserImport(INetImportRepository netImportRepository,
|
public TraktUserImport(INetImportRepository netImportRepository,
|
||||||
IHttpClient httpClient,
|
IHttpClient httpClient,
|
||||||
|
INetImportStatusService netImportStatusService,
|
||||||
IConfigService configService,
|
IConfigService configService,
|
||||||
IParsingService parsingService,
|
IParsingService parsingService,
|
||||||
Logger logger)
|
Logger logger)
|
||||||
: base(netImportRepository, httpClient, configService, parsingService, logger)
|
: base(netImportRepository, httpClient, netImportStatusService, configService, parsingService, logger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user