|
@@ -4,6 +4,7 @@ using MediaBrowser.Controller.Configuration;
|
|
using MediaBrowser.Controller.Entities;
|
|
using MediaBrowser.Controller.Entities;
|
|
using MediaBrowser.Controller.IO;
|
|
using MediaBrowser.Controller.IO;
|
|
using MediaBrowser.Controller.Library;
|
|
using MediaBrowser.Controller.Library;
|
|
|
|
+using MediaBrowser.Controller.Persistence;
|
|
using MediaBrowser.Controller.Providers;
|
|
using MediaBrowser.Controller.Providers;
|
|
using MediaBrowser.Model.Entities;
|
|
using MediaBrowser.Model.Entities;
|
|
using MediaBrowser.Model.Logging;
|
|
using MediaBrowser.Model.Logging;
|
|
@@ -52,6 +53,8 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
private IImageProvider[] ImageProviders { get; set; }
|
|
private IImageProvider[] ImageProviders { get; set; }
|
|
private readonly IFileSystem _fileSystem;
|
|
private readonly IFileSystem _fileSystem;
|
|
|
|
|
|
|
|
+ private readonly IItemRepository _itemRepo;
|
|
|
|
+
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
|
|
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -59,13 +62,14 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
/// <param name="configurationManager">The configuration manager.</param>
|
|
/// <param name="configurationManager">The configuration manager.</param>
|
|
/// <param name="directoryWatchers">The directory watchers.</param>
|
|
/// <param name="directoryWatchers">The directory watchers.</param>
|
|
/// <param name="logManager">The log manager.</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");
|
|
_logger = logManager.GetLogger("ProviderManager");
|
|
_httpClient = httpClient;
|
|
_httpClient = httpClient;
|
|
ConfigurationManager = configurationManager;
|
|
ConfigurationManager = configurationManager;
|
|
_directoryWatchers = directoryWatchers;
|
|
_directoryWatchers = directoryWatchers;
|
|
_fileSystem = fileSystem;
|
|
_fileSystem = fileSystem;
|
|
|
|
+ _itemRepo = itemRepo;
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
@@ -102,6 +106,10 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
var enableInternetProviders = ConfigurationManager.Configuration.EnableInternetProviders;
|
|
var enableInternetProviders = ConfigurationManager.Configuration.EnableInternetProviders;
|
|
var excludeTypes = ConfigurationManager.Configuration.InternetProviderExcludeTypes;
|
|
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
|
|
// Run the normal providers sequentially in order of priority
|
|
foreach (var provider in MetadataProviders)
|
|
foreach (var provider in MetadataProviders)
|
|
{
|
|
{
|
|
@@ -140,9 +148,20 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ var providerInfo = providerHistories.FirstOrDefault(i => i.ProviderId == provider.Id);
|
|
|
|
+
|
|
|
|
+ if (providerInfo == null)
|
|
|
|
+ {
|
|
|
|
+ providerInfo = new BaseProviderInfo
|
|
|
|
+ {
|
|
|
|
+ ProviderId = provider.Id
|
|
|
|
+ };
|
|
|
|
+ providerHistories.Add(providerInfo);
|
|
|
|
+ }
|
|
|
|
+
|
|
try
|
|
try
|
|
{
|
|
{
|
|
- if (!force && !provider.NeedsRefresh(item))
|
|
|
|
|
|
+ if (!force && !provider.NeedsRefresh(item, providerInfo))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -152,7 +171,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
_logger.Error("Error determining NeedsRefresh for {0}", ex, item.Path);
|
|
_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)
|
|
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;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -194,11 +218,12 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
/// </summary>
|
|
/// </summary>
|
|
/// <param name="provider">The provider.</param>
|
|
/// <param name="provider">The provider.</param>
|
|
/// <param name="item">The item.</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="force">if set to <c>true</c> [force].</param>
|
|
/// <param name="cancellationToken">The cancellation token.</param>
|
|
/// <param name="cancellationToken">The cancellation token.</param>
|
|
/// <returns>Task{System.Boolean}.</returns>
|
|
/// <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)
|
|
if (item == null)
|
|
{
|
|
{
|
|
@@ -215,7 +240,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
|
|
|
try
|
|
try
|
|
{
|
|
{
|
|
- var changed = await provider.FetchAsync(item, force, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
+ var changed = await provider.FetchAsync(item, force, providerInfo, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
if (changed)
|
|
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);
|
|
_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;
|
|
return ItemUpdateType.Unspecified;
|
|
}
|
|
}
|