aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations/Providers/ProviderManager.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Providers/ProviderManager.cs39
1 files changed, 32 insertions, 7 deletions
diff --git a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
index fa0620082..511092759 100644
--- a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
+++ b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs
@@ -4,6 +4,7 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
@@ -52,6 +53,8 @@ namespace MediaBrowser.Server.Implementations.Providers
private IImageProvider[] ImageProviders { get; set; }
private readonly IFileSystem _fileSystem;
+ private readonly IItemRepository _itemRepo;
+
/// <summary>
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
/// </summary>
@@ -59,13 +62,14 @@ namespace MediaBrowser.Server.Implementations.Providers
/// <param name="configurationManager">The configuration manager.</param>
/// <param name="directoryWatchers">The directory watchers.</param>
/// <param name="logManager">The log manager.</param>
- public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, IDirectoryWatchers directoryWatchers, ILogManager logManager, IFileSystem fileSystem)
+ public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, IDirectoryWatchers directoryWatchers, ILogManager logManager, IFileSystem fileSystem, IItemRepository itemRepo)
{
_logger = logManager.GetLogger("ProviderManager");
_httpClient = httpClient;
ConfigurationManager = configurationManager;
_directoryWatchers = directoryWatchers;
_fileSystem = fileSystem;
+ _itemRepo = itemRepo;
}
/// <summary>
@@ -102,6 +106,10 @@ namespace MediaBrowser.Server.Implementations.Providers
var enableInternetProviders = ConfigurationManager.Configuration.EnableInternetProviders;
var excludeTypes = ConfigurationManager.Configuration.InternetProviderExcludeTypes;
+ var providerHistories = item.DateLastSaved == DateTime.MinValue ?
+ new List<BaseProviderInfo>() :
+ _itemRepo.GetProviderHistory(item.Id).ToList();
+
// Run the normal providers sequentially in order of priority
foreach (var provider in MetadataProviders)
{
@@ -140,9 +148,20 @@ namespace MediaBrowser.Server.Implementations.Providers
continue;
}
+ var providerInfo = providerHistories.FirstOrDefault(i => i.ProviderId == provider.Id);
+
+ if (providerInfo == null)
+ {
+ providerInfo = new BaseProviderInfo
+ {
+ ProviderId = provider.Id
+ };
+ providerHistories.Add(providerInfo);
+ }
+
try
{
- if (!force && !provider.NeedsRefresh(item))
+ if (!force && !provider.NeedsRefresh(item, providerInfo))
{
continue;
}
@@ -152,7 +171,7 @@ namespace MediaBrowser.Server.Implementations.Providers
_logger.Error("Error determining NeedsRefresh for {0}", ex, item.Path);
}
- var updateType = await FetchAsync(provider, item, force, cancellationToken).ConfigureAwait(false);
+ var updateType = await FetchAsync(provider, item, providerInfo, force, cancellationToken).ConfigureAwait(false);
if (updateType.HasValue)
{
@@ -167,6 +186,11 @@ namespace MediaBrowser.Server.Implementations.Providers
}
}
+ if (result.HasValue || force)
+ {
+ await _itemRepo.SaveProviderHistory(item.Id, providerHistories, cancellationToken);
+ }
+
return result;
}
@@ -194,11 +218,12 @@ namespace MediaBrowser.Server.Implementations.Providers
/// </summary>
/// <param name="provider">The provider.</param>
/// <param name="item">The item.</param>
+ /// <param name="providerInfo">The provider information.</param>
/// <param name="force">if set to <c>true</c> [force].</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{System.Boolean}.</returns>
- /// <exception cref="System.ArgumentNullException"></exception>
- private async Task<ItemUpdateType?> FetchAsync(BaseMetadataProvider provider, BaseItem item, bool force, CancellationToken cancellationToken)
+ /// <exception cref="System.ArgumentNullException">item</exception>
+ private async Task<ItemUpdateType?> FetchAsync(BaseMetadataProvider provider, BaseItem item, BaseProviderInfo providerInfo, bool force, CancellationToken cancellationToken)
{
if (item == null)
{
@@ -215,7 +240,7 @@ namespace MediaBrowser.Server.Implementations.Providers
try
{
- var changed = await provider.FetchAsync(item, force, cancellationToken).ConfigureAwait(false);
+ var changed = await provider.FetchAsync(item, force, providerInfo, cancellationToken).ConfigureAwait(false);
if (changed)
{
@@ -240,7 +265,7 @@ namespace MediaBrowser.Server.Implementations.Providers
{
_logger.ErrorException("{0} failed refreshing {1} {2}", ex, provider.GetType().Name, item.Name, item.Path ?? string.Empty);
- provider.SetLastRefreshed(item, DateTime.UtcNow, ProviderRefreshStatus.Failure);
+ provider.SetLastRefreshed(item, DateTime.UtcNow, providerInfo, ProviderRefreshStatus.Failure);
return ItemUpdateType.Unspecified;
}