|
@@ -2,7 +2,6 @@
|
|
|
using MediaBrowser.Common.Net;
|
|
using MediaBrowser.Common.Net;
|
|
|
using MediaBrowser.Controller.Configuration;
|
|
using MediaBrowser.Controller.Configuration;
|
|
|
using MediaBrowser.Controller.Entities;
|
|
using MediaBrowser.Controller.Entities;
|
|
|
-using MediaBrowser.Controller.Entities.Movies;
|
|
|
|
|
using MediaBrowser.Controller.IO;
|
|
using MediaBrowser.Controller.IO;
|
|
|
using MediaBrowser.Controller.Library;
|
|
using MediaBrowser.Controller.Library;
|
|
|
using MediaBrowser.Controller.Persistence;
|
|
using MediaBrowser.Controller.Persistence;
|
|
@@ -17,7 +16,7 @@ using System.Linq;
|
|
|
using System.Threading;
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
-namespace MediaBrowser.Server.Implementations.Providers
|
|
|
|
|
|
|
+namespace MediaBrowser.Providers.Manager
|
|
|
{
|
|
{
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// Class ProviderManager
|
|
/// Class ProviderManager
|
|
@@ -37,7 +36,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// The _directory watchers
|
|
/// The _directory watchers
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
- private readonly IDirectoryWatchers _directoryWatchers;
|
|
|
|
|
|
|
+ private readonly ILibraryMonitor _libraryMonitor;
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// Gets or sets the configuration manager.
|
|
/// Gets or sets the configuration manager.
|
|
@@ -51,26 +50,32 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
/// <value>The metadata providers enumerable.</value>
|
|
/// <value>The metadata providers enumerable.</value>
|
|
|
private BaseMetadataProvider[] MetadataProviders { get; set; }
|
|
private BaseMetadataProvider[] MetadataProviders { get; set; }
|
|
|
|
|
|
|
|
|
|
+ private IRemoteImageProvider[] RemoteImageProviders { get; set; }
|
|
|
private IImageProvider[] ImageProviders { get; set; }
|
|
private IImageProvider[] ImageProviders { get; set; }
|
|
|
|
|
+
|
|
|
private readonly IFileSystem _fileSystem;
|
|
private readonly IFileSystem _fileSystem;
|
|
|
|
|
|
|
|
- private readonly IItemRepository _itemRepo;
|
|
|
|
|
|
|
+ private readonly IProviderRepository _providerRepo;
|
|
|
|
|
+
|
|
|
|
|
+ private IMetadataService[] _metadataServices = { };
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
|
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
|
|
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
/// <param name="httpClient">The HTTP client.</param>
|
|
/// <param name="httpClient">The HTTP client.</param>
|
|
|
/// <param name="configurationManager">The configuration manager.</param>
|
|
/// <param name="configurationManager">The configuration manager.</param>
|
|
|
- /// <param name="directoryWatchers">The directory watchers.</param>
|
|
|
|
|
|
|
+ /// <param name="libraryMonitor">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, IItemRepository itemRepo)
|
|
|
|
|
|
|
+ /// <param name="fileSystem">The file system.</param>
|
|
|
|
|
+ /// <param name="providerRepo">The provider repo.</param>
|
|
|
|
|
+ public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IProviderRepository providerRepo)
|
|
|
{
|
|
{
|
|
|
_logger = logManager.GetLogger("ProviderManager");
|
|
_logger = logManager.GetLogger("ProviderManager");
|
|
|
_httpClient = httpClient;
|
|
_httpClient = httpClient;
|
|
|
ConfigurationManager = configurationManager;
|
|
ConfigurationManager = configurationManager;
|
|
|
- _directoryWatchers = directoryWatchers;
|
|
|
|
|
|
|
+ _libraryMonitor = libraryMonitor;
|
|
|
_fileSystem = fileSystem;
|
|
_fileSystem = fileSystem;
|
|
|
- _itemRepo = itemRepo;
|
|
|
|
|
|
|
+ _providerRepo = providerRepo;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
@@ -78,11 +83,34 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
/// </summary>
|
|
/// </summary>
|
|
|
/// <param name="providers">The providers.</param>
|
|
/// <param name="providers">The providers.</param>
|
|
|
/// <param name="imageProviders">The image providers.</param>
|
|
/// <param name="imageProviders">The image providers.</param>
|
|
|
- public void AddParts(IEnumerable<BaseMetadataProvider> providers, IEnumerable<IImageProvider> imageProviders)
|
|
|
|
|
|
|
+ /// <param name="metadataServices">The metadata services.</param>
|
|
|
|
|
+ /// <param name="metadataProviders">The metadata providers.</param>
|
|
|
|
|
+ public void AddParts(IEnumerable<BaseMetadataProvider> providers, IEnumerable<IImageProvider> imageProviders, IEnumerable<IMetadataService> metadataServices, IEnumerable<IMetadataProvider> metadataProviders)
|
|
|
{
|
|
{
|
|
|
MetadataProviders = providers.OrderBy(e => e.Priority).ToArray();
|
|
MetadataProviders = providers.OrderBy(e => e.Priority).ToArray();
|
|
|
|
|
|
|
|
- ImageProviders = imageProviders.OrderByDescending(i => i.Priority).ToArray();
|
|
|
|
|
|
|
+ ImageProviders = imageProviders.OrderBy(i => i.Order).ToArray();
|
|
|
|
|
+ RemoteImageProviders = ImageProviders.OfType<IRemoteImageProvider>().ToArray();
|
|
|
|
|
+
|
|
|
|
|
+ _metadataServices = metadataServices.OrderBy(i => i.Order).ToArray();
|
|
|
|
|
+
|
|
|
|
|
+ var providerList = metadataProviders.ToList();
|
|
|
|
|
+ foreach (var service in _metadataServices)
|
|
|
|
|
+ {
|
|
|
|
|
+ service.AddParts(providerList, ImageProviders);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
|
|
|
|
+ {
|
|
|
|
|
+ var service = _metadataServices.FirstOrDefault(i => i.CanRefresh(item));
|
|
|
|
|
+
|
|
|
|
|
+ if (service != null)
|
|
|
|
|
+ {
|
|
|
|
|
+ return service.RefreshMetadata(item, options, cancellationToken);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return ((BaseItem)item).RefreshMetadataDirect(cancellationToken, options.ForceSave, options.ReplaceAllMetadata);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
@@ -91,9 +119,9 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
/// <param name="item">The item.</param>
|
|
/// <param name="item">The item.</param>
|
|
|
/// <param name="cancellationToken">The cancellation token.</param>
|
|
/// <param name="cancellationToken">The cancellation token.</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="allowSlowProviders">if set to <c>true</c> [allow slow providers].</param>
|
|
|
|
|
/// <returns>Task{System.Boolean}.</returns>
|
|
/// <returns>Task{System.Boolean}.</returns>
|
|
|
- public async Task<ItemUpdateType?> ExecuteMetadataProviders(BaseItem item, CancellationToken cancellationToken, bool force = false, bool allowSlowProviders = true)
|
|
|
|
|
|
|
+ /// <exception cref="System.ArgumentNullException">item</exception>
|
|
|
|
|
+ public async Task<ItemUpdateType?> ExecuteMetadataProviders(BaseItem item, CancellationToken cancellationToken, bool force = false)
|
|
|
{
|
|
{
|
|
|
if (item == null)
|
|
if (item == null)
|
|
|
{
|
|
{
|
|
@@ -108,7 +136,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
|
|
|
|
|
var providerHistories = item.DateLastSaved == default(DateTime) ?
|
|
var providerHistories = item.DateLastSaved == default(DateTime) ?
|
|
|
new List<BaseProviderInfo>() :
|
|
new List<BaseProviderInfo>() :
|
|
|
- _itemRepo.GetProviderHistory(item.Id).ToList();
|
|
|
|
|
|
|
+ _providerRepo.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)
|
|
@@ -126,12 +154,6 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Skip if is slow and we aren't allowing slow ones
|
|
|
|
|
- if (provider.IsSlow && !allowSlowProviders)
|
|
|
|
|
- {
|
|
|
|
|
- continue;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
// Put this check below the await because the needs refresh of the next tier of providers may depend on the previous ones running
|
|
// Put this check below the await because the needs refresh of the next tier of providers may depend on the previous ones running
|
|
|
// This is the case for the fan art provider which depends on the movie and tv providers having run before them
|
|
// This is the case for the fan art provider which depends on the movie and tv providers having run before them
|
|
|
if (provider.RequiresInternet && item.DontFetchMeta && provider.EnforceDontFetchMetadata)
|
|
if (provider.RequiresInternet && item.DontFetchMeta && provider.EnforceDontFetchMetadata)
|
|
@@ -179,7 +201,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
|
|
|
|
|
if (result.HasValue || force)
|
|
if (result.HasValue || force)
|
|
|
{
|
|
{
|
|
|
- await _itemRepo.SaveProviderHistory(item.Id, providerHistories, cancellationToken);
|
|
|
|
|
|
|
+ await _providerRepo.SaveProviderHistory(item.Id, providerHistories, cancellationToken);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
return result;
|
|
@@ -293,7 +315,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//Tell the watchers to ignore
|
|
//Tell the watchers to ignore
|
|
|
- _directoryWatchers.TemporarilyIgnore(path);
|
|
|
|
|
|
|
+ _libraryMonitor.ReportFileSystemChangeBeginning(path);
|
|
|
|
|
|
|
|
if (dataToSave.CanSeek)
|
|
if (dataToSave.CanSeek)
|
|
|
{
|
|
{
|
|
@@ -316,7 +338,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
finally
|
|
finally
|
|
|
{
|
|
{
|
|
|
//Remove the ignore
|
|
//Remove the ignore
|
|
|
- _directoryWatchers.RemoveTempIgnore(path);
|
|
|
|
|
|
|
+ _libraryMonitor.ReportFileSystemChangeComplete(path, false);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -358,7 +380,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
/// <returns>Task.</returns>
|
|
/// <returns>Task.</returns>
|
|
|
public Task SaveImage(BaseItem item, Stream source, string mimeType, ImageType type, int? imageIndex, string sourceUrl, CancellationToken cancellationToken)
|
|
public Task SaveImage(BaseItem item, Stream source, string mimeType, ImageType type, int? imageIndex, string sourceUrl, CancellationToken cancellationToken)
|
|
|
{
|
|
{
|
|
|
- return new ImageSaver(ConfigurationManager, _directoryWatchers, _fileSystem, _logger).SaveImage(item, source, mimeType, type, imageIndex, sourceUrl, cancellationToken);
|
|
|
|
|
|
|
+ return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger).SaveImage(item, source, mimeType, type, imageIndex, sourceUrl, cancellationToken);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
@@ -371,7 +393,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
/// <returns>Task{IEnumerable{RemoteImageInfo}}.</returns>
|
|
/// <returns>Task{IEnumerable{RemoteImageInfo}}.</returns>
|
|
|
public async Task<IEnumerable<RemoteImageInfo>> GetAvailableRemoteImages(BaseItem item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null)
|
|
public async Task<IEnumerable<RemoteImageInfo>> GetAvailableRemoteImages(BaseItem item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null)
|
|
|
{
|
|
{
|
|
|
- var providers = GetImageProviders(item);
|
|
|
|
|
|
|
+ var providers = GetRemoteImageProviders(item);
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(providerName))
|
|
if (!string.IsNullOrEmpty(providerName))
|
|
|
{
|
|
{
|
|
@@ -396,7 +418,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
/// <param name="preferredLanguage">The preferred language.</param>
|
|
/// <param name="preferredLanguage">The preferred language.</param>
|
|
|
/// <param name="type">The type.</param>
|
|
/// <param name="type">The type.</param>
|
|
|
/// <returns>Task{IEnumerable{RemoteImageInfo}}.</returns>
|
|
/// <returns>Task{IEnumerable{RemoteImageInfo}}.</returns>
|
|
|
- private async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken, IImageProvider i, string preferredLanguage, ImageType? type = null)
|
|
|
|
|
|
|
+ private async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken, IRemoteImageProvider i, string preferredLanguage, ImageType? type = null)
|
|
|
{
|
|
{
|
|
|
try
|
|
try
|
|
|
{
|
|
{
|
|
@@ -414,7 +436,7 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
}
|
|
}
|
|
|
catch (Exception ex)
|
|
catch (Exception ex)
|
|
|
{
|
|
{
|
|
|
- _logger.ErrorException("{0} failed in GetImages for type {1}", ex, i.GetType().Name, item.GetType().Name);
|
|
|
|
|
|
|
+ _logger.ErrorException("{0} failed in GetImageInfos for type {1}", ex, i.GetType().Name, item.GetType().Name);
|
|
|
return new List<RemoteImageInfo>();
|
|
return new List<RemoteImageInfo>();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -430,14 +452,9 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
return images;
|
|
return images;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /// <summary>
|
|
|
|
|
- /// Gets the supported image providers.
|
|
|
|
|
- /// </summary>
|
|
|
|
|
- /// <param name="item">The item.</param>
|
|
|
|
|
- /// <returns>IEnumerable{IImageProvider}.</returns>
|
|
|
|
|
- public IEnumerable<IImageProvider> GetImageProviders(BaseItem item)
|
|
|
|
|
|
|
+ private IEnumerable<IRemoteImageProvider> GetRemoteImageProviders(BaseItem item)
|
|
|
{
|
|
{
|
|
|
- return ImageProviders.Where(i =>
|
|
|
|
|
|
|
+ return RemoteImageProviders.Where(i =>
|
|
|
{
|
|
{
|
|
|
try
|
|
try
|
|
|
{
|
|
{
|
|
@@ -448,6 +465,22 @@ namespace MediaBrowser.Server.Implementations.Providers
|
|
|
_logger.ErrorException("{0} failed in Supports for type {1}", ex, i.GetType().Name, item.GetType().Name);
|
|
_logger.ErrorException("{0} failed in Supports for type {1}", ex, i.GetType().Name, item.GetType().Name);
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// Gets the supported image providers.
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="item">The item.</param>
|
|
|
|
|
+ /// <returns>IEnumerable{IImageProvider}.</returns>
|
|
|
|
|
+ public IEnumerable<ImageProviderInfo> GetImageProviderInfo(BaseItem item)
|
|
|
|
|
+ {
|
|
|
|
|
+ return GetRemoteImageProviders(item).Select(i => new ImageProviderInfo
|
|
|
|
|
+ {
|
|
|
|
|
+ Name = i.Name,
|
|
|
|
|
+ Order = i.Order
|
|
|
|
|
+
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|