aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/Manager/ProviderManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/Manager/ProviderManager.cs')
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs298
1 files changed, 210 insertions, 88 deletions
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index 030b3cbd9..f49bbb6ae 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -205,26 +205,31 @@ namespace MediaBrowser.Providers.Manager
/// Gets the available remote images.
/// </summary>
/// <param name="item">The item.</param>
+ /// <param name="query">The query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
- /// <param name="providerName">Name of the provider.</param>
- /// <param name="type">The type.</param>
/// <returns>Task{IEnumerable{RemoteImageInfo}}.</returns>
- public async Task<IEnumerable<RemoteImageInfo>> GetAvailableRemoteImages(IHasImages item, CancellationToken cancellationToken, string providerName = null, ImageType? type = null)
+ public async Task<IEnumerable<RemoteImageInfo>> GetAvailableRemoteImages(IHasImages item, RemoteImageQuery query, CancellationToken cancellationToken)
{
- var providers = GetRemoteImageProviders(item);
+ var providers = GetRemoteImageProviders(item, query.IncludeDisabledProviders);
- if (!string.IsNullOrEmpty(providerName))
+ if (!string.IsNullOrEmpty(query.ProviderName))
{
+ var providerName = query.ProviderName;
+
providers = providers.Where(i => string.Equals(i.Name, providerName, StringComparison.OrdinalIgnoreCase));
}
var preferredLanguage = item.GetPreferredMetadataLanguage();
- var tasks = providers.Select(i => GetImages(item, cancellationToken, i, preferredLanguage, type));
+ var language = query.IncludeAllLanguages ? null : preferredLanguage;
+
+ var tasks = providers.Select(i => GetImages(item, cancellationToken, i, language, query.ImageType));
var results = await Task.WhenAll(tasks).ConfigureAwait(false);
- return results.SelectMany(i => i);
+ var images = results.SelectMany(i => i);
+
+ return images;
}
/// <summary>
@@ -244,12 +249,15 @@ namespace MediaBrowser.Providers.Manager
{
var result = await i.GetImages(item, type.Value, cancellationToken).ConfigureAwait(false);
- return FilterImages(result, preferredLanguage);
+ return string.IsNullOrEmpty(preferredLanguage) ? result :
+ FilterImages(result, preferredLanguage);
}
else
{
var result = await i.GetAllImages(item, cancellationToken).ConfigureAwait(false);
- return FilterImages(result, preferredLanguage);
+
+ return string.IsNullOrEmpty(preferredLanguage) ? result :
+ FilterImages(result, preferredLanguage);
}
}
catch (Exception ex)
@@ -275,66 +283,111 @@ namespace MediaBrowser.Providers.Manager
/// </summary>
/// <param name="item">The item.</param>
/// <returns>IEnumerable{IImageProvider}.</returns>
- public IEnumerable<ImageProviderInfo> GetImageProviderInfo(IHasImages item)
+ public IEnumerable<ImageProviderInfo> GetRemoteImageProviderInfo(IHasImages item)
{
- return GetRemoteImageProviders(item).Select(i => new ImageProviderInfo
+ return GetRemoteImageProviders(item, true).Select(i => new ImageProviderInfo
{
Name = i.Name,
- Order = GetOrder(item, i)
+ SupportedImages = i.GetSupportedImages(item).ToList()
});
}
public IEnumerable<IImageProvider> GetImageProviders(IHasImages item)
{
- return ImageProviders.Where(i =>
+ return GetImageProviders(item, GetMetadataOptions(item), false);
+ }
+
+ private IEnumerable<IImageProvider> GetImageProviders(IHasImages item, MetadataOptions options, bool includeDisabled)
+ {
+ return ImageProviders.Where(i => CanRefresh(i, item, options, includeDisabled))
+ .OrderBy(i =>
{
- try
- {
- return i.Supports(item);
- }
- catch (Exception ex)
+ // See if there's a user-defined order
+ if (!(i is ILocalImageProvider))
{
- _logger.ErrorException("{0} failed in Supports for type {1}", ex, i.GetType().Name, item.GetType().Name);
- return false;
+ var index = Array.IndexOf(options.ImageFetcherOrder, i.Name);
+
+ if (index != -1)
+ {
+ return index;
+ }
}
- }).OrderBy(i => GetOrder(item, i));
+ // Not configured. Just return some high number to put it at the end.
+ return 100;
+ })
+ .ThenBy(GetOrder);
}
public IEnumerable<IMetadataProvider<T>> GetMetadataProviders<T>(IHasMetadata item)
where T : IHasMetadata
{
- return GetMetadataProvidersInternal<T>(item, false);
+ var options = GetMetadataOptions(item);
+
+ return GetMetadataProvidersInternal<T>(item, options, false);
}
- private IEnumerable<IMetadataProvider<T>> GetMetadataProvidersInternal<T>(IHasMetadata item, bool includeDisabled)
+ private IEnumerable<IMetadataProvider<T>> GetMetadataProvidersInternal<T>(IHasMetadata item, MetadataOptions options, bool includeDisabled)
where T : IHasMetadata
{
return _metadataProviders.OfType<IMetadataProvider<T>>()
- .Where(i => CanRefresh(i, item, includeDisabled))
- .OrderBy(i => GetOrder(item, i));
+ .Where(i => CanRefresh(i, item, options, includeDisabled))
+ .OrderBy(i =>
+ {
+ // See if there's a user-defined order
+ if (i is ILocalMetadataProvider)
+ {
+ var index = Array.IndexOf(options.LocalMetadataReaderOrder, i.Name);
+
+ if (index != -1)
+ {
+ return index;
+ }
+ }
+
+ // See if there's a user-defined order
+ if (i is IRemoteMetadataProvider)
+ {
+ var index = Array.IndexOf(options.MetadataFetcherOrder, i.Name);
+
+ if (index != -1)
+ {
+ return index;
+ }
+ }
+
+ // Not configured. Just return some high number to put it at the end.
+ return 100;
+ })
+ .ThenBy(GetOrder);
}
- private IEnumerable<IRemoteImageProvider> GetRemoteImageProviders(IHasImages item)
+ private IEnumerable<IRemoteImageProvider> GetRemoteImageProviders(IHasImages item, bool includeDisabled)
{
- return GetImageProviders(item).OfType<IRemoteImageProvider>();
+ var options = GetMetadataOptions(item);
+
+ return GetImageProviders(item, options, includeDisabled).OfType<IRemoteImageProvider>();
}
- /// <summary>
- /// Determines whether this instance can refresh the specified provider.
- /// </summary>
- /// <param name="provider">The provider.</param>
- /// <param name="item">The item.</param>
- /// <param name="includeDisabled">if set to <c>true</c> [include disabled].</param>
- /// <returns><c>true</c> if this instance can refresh the specified provider; otherwise, <c>false</c>.</returns>
- private bool CanRefresh(IMetadataProvider provider, IHasMetadata item, bool includeDisabled)
+ private bool CanRefresh(IMetadataProvider provider, IHasMetadata item, MetadataOptions options, bool includeDisabled)
{
- if (!includeDisabled && !ConfigurationManager.Configuration.EnableInternetProviders && provider is IRemoteMetadataProvider)
+ if (!includeDisabled)
{
- return false;
+ if (provider is IRemoteMetadataProvider)
+ {
+ if (!ConfigurationManager.Configuration.EnableInternetProviders)
+ {
+ return false;
+ }
+
+ if (Array.IndexOf(options.DisabledMetadataFetchers, provider.Name) != -1)
+ {
+ return false;
+ }
+ }
}
- if (item.LocationType != LocationType.FileSystem && provider is ILocalMetadataProvider)
+ if (!item.SupportsLocalMetadata && provider is ILocalMetadataProvider)
{
return false;
}
@@ -351,13 +404,46 @@ namespace MediaBrowser.Providers.Manager
return true;
}
+ private bool CanRefresh(IImageProvider provider, IHasImages item, MetadataOptions options, bool includeDisabled)
+ {
+ if (!includeDisabled)
+ {
+ if (provider is IRemoteImageProvider)
+ {
+ if (!ConfigurationManager.Configuration.EnableInternetProviders)
+ {
+ return false;
+ }
+
+ if (Array.IndexOf(options.DisabledImageFetchers, provider.Name) != -1)
+ {
+ return false;
+ }
+ }
+ }
+
+ if (!item.SupportsLocalMetadata && provider is ILocalImageProvider)
+ {
+ return false;
+ }
+
+ try
+ {
+ return provider.Supports(item);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("{0} failed in Supports for type {1}", ex, provider.GetType().Name, item.GetType().Name);
+ return false;
+ }
+ }
+
/// <summary>
/// Gets the order.
/// </summary>
- /// <param name="item">The item.</param>
/// <param name="provider">The provider.</param>
/// <returns>System.Int32.</returns>
- private int GetOrder(IHasImages item, IImageProvider provider)
+ private int GetOrder(IImageProvider provider)
{
var hasOrder = provider as IHasOrder;
@@ -372,52 +458,49 @@ namespace MediaBrowser.Providers.Manager
/// <summary>
/// Gets the order.
/// </summary>
- /// <param name="item">The item.</param>
/// <param name="provider">The provider.</param>
/// <returns>System.Int32.</returns>
- private int GetOrder(IHasMetadata item, IMetadataProvider provider)
+ private int GetOrder(IMetadataProvider provider)
{
var hasOrder = provider as IHasOrder;
- if (hasOrder == null)
+ if (hasOrder != null)
{
- return 0;
+ return hasOrder.Order;
}
- return hasOrder.Order;
+ return 0;
}
public IEnumerable<MetadataPluginSummary> GetAllMetadataPlugins()
{
- var list = new List<MetadataPluginSummary>();
-
- list.Add(GetPluginSummary<Game>());
- list.Add(GetPluginSummary<GameSystem>());
- list.Add(GetPluginSummary<Movie>());
- list.Add(GetPluginSummary<Trailer>());
- list.Add(GetPluginSummary<BoxSet>());
- list.Add(GetPluginSummary<Book>());
- list.Add(GetPluginSummary<Series>());
- list.Add(GetPluginSummary<Season>());
- list.Add(GetPluginSummary<Episode>());
- list.Add(GetPluginSummary<Person>());
- list.Add(GetPluginSummary<MusicAlbum>());
- list.Add(GetPluginSummary<MusicArtist>());
- list.Add(GetPluginSummary<Audio>());
-
- list.Add(GetPluginSummary<Genre>());
- list.Add(GetPluginSummary<Studio>());
- list.Add(GetPluginSummary<GameGenre>());
- list.Add(GetPluginSummary<MusicGenre>());
-
- list.Add(GetPluginSummary<AdultVideo>());
- list.Add(GetPluginSummary<MusicVideo>());
- list.Add(GetPluginSummary<Video>());
-
- list.Add(GetPluginSummary<LiveTvChannel>());
- list.Add(GetPluginSummary<LiveTvProgram>());
- list.Add(GetPluginSummary<LiveTvVideoRecording>());
- list.Add(GetPluginSummary<LiveTvAudioRecording>());
+ var list = new List<MetadataPluginSummary>
+ {
+ GetPluginSummary<Game>(),
+ GetPluginSummary<GameSystem>(),
+ GetPluginSummary<Movie>(),
+ GetPluginSummary<Trailer>(),
+ GetPluginSummary<BoxSet>(),
+ GetPluginSummary<Book>(),
+ GetPluginSummary<Series>(),
+ GetPluginSummary<Season>(),
+ GetPluginSummary<Episode>(),
+ GetPluginSummary<Person>(),
+ GetPluginSummary<MusicAlbum>(),
+ GetPluginSummary<MusicArtist>(),
+ GetPluginSummary<Audio>(),
+ GetPluginSummary<Genre>(),
+ GetPluginSummary<Studio>(),
+ GetPluginSummary<GameGenre>(),
+ GetPluginSummary<MusicGenre>(),
+ GetPluginSummary<AdultVideo>(),
+ GetPluginSummary<MusicVideo>(),
+ GetPluginSummary<Video>(),
+ GetPluginSummary<LiveTvChannel>(),
+ GetPluginSummary<LiveTvProgram>(),
+ GetPluginSummary<LiveTvVideoRecording>(),
+ GetPluginSummary<LiveTvAudioRecording>()
+ };
return list;
}
@@ -434,14 +517,16 @@ namespace MediaBrowser.Providers.Manager
Parent = new Folder()
};
+ var options = GetMetadataOptions(dummy);
+
var summary = new MetadataPluginSummary
{
ItemType = typeof(T).Name
};
- var imageProviders = GetImageProviders(dummy).ToList();
+ var imageProviders = GetImageProviders(dummy, options, true).ToList();
- AddMetadataPlugins(summary.Plugins, dummy);
+ AddMetadataPlugins(summary.Plugins, dummy, options);
AddImagePlugins(summary.Plugins, dummy, imageProviders);
summary.SupportedImageTypes = imageProviders.OfType<IRemoteImageProvider>()
@@ -452,10 +537,10 @@ namespace MediaBrowser.Providers.Manager
return summary;
}
- private void AddMetadataPlugins<T>(List<MetadataPlugin> list, T item)
+ private void AddMetadataPlugins<T>(List<MetadataPlugin> list, T item, MetadataOptions options)
where T : IHasMetadata
{
- var providers = GetMetadataProvidersInternal<T>(item, true).ToList();
+ var providers = GetMetadataProvidersInternal<T>(item, options, true).ToList();
// Locals
list.AddRange(providers.Where(i => (i is ILocalMetadataProvider)).Select(i => new MetadataPlugin
@@ -472,7 +557,7 @@ namespace MediaBrowser.Providers.Manager
}));
// Savers
- list.AddRange(_savers.Where(i => i.IsEnabledFor(item, ItemUpdateType.MetadataEdit)).OrderBy(i => i.Name).Select(i => new MetadataPlugin
+ list.AddRange(_savers.Where(i => IsSaverEnabledForItem(i, item, ItemUpdateType.MetadataEdit, false)).OrderBy(i => i.Name).Select(i => new MetadataPlugin
{
Name = i.Name,
Type = MetadataPluginType.MetadataSaver
@@ -498,8 +583,21 @@ namespace MediaBrowser.Providers.Manager
}));
}
- private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
+ public MetadataOptions GetMetadataOptions(IHasImages item)
+ {
+ var type = item.GetType().Name;
+
+ if (item is Trailer)
+ {
+ type = typeof(Movie).Name;
+ }
+ return ConfigurationManager.Configuration.MetadataOptions
+ .FirstOrDefault(i => string.Equals(i.ItemType, type, StringComparison.OrdinalIgnoreCase)) ??
+ new MetadataOptions();
+ }
+
+ private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
/// <summary>
/// Saves the metadata.
/// </summary>
@@ -508,21 +606,25 @@ namespace MediaBrowser.Providers.Manager
/// <returns>Task.</returns>
public async Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType)
{
- foreach (var saver in _savers.Where(i => i.IsEnabledFor(item, updateType)))
+ foreach (var saver in _savers.Where(i => IsSaverEnabledForItem(i, item, updateType, true)))
{
_logger.Debug("Saving {0} to {1}.", item.Path ?? item.Name, saver.Name);
-
+
var fileSaver = saver as IMetadataFileSaver;
if (fileSaver != null)
{
- var locationType = item.LocationType;
- if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+ string path = null;
+
+ try
{
- throw new ArgumentException("Only file-system based items can save metadata.");
+ path = fileSaver.GetSavePath(item);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in {0} GetSavePath", ex, saver.Name);
+ continue;
}
-
- var path = fileSaver.GetSavePath(item);
var semaphore = _fileLocks.GetOrAdd(path, key => new SemaphoreSlim(1, 1));
@@ -556,5 +658,25 @@ namespace MediaBrowser.Providers.Manager
}
}
}
+
+ private bool IsSaverEnabledForItem(IMetadataSaver saver, IHasMetadata item, ItemUpdateType updateType, bool enforceConfiguration)
+ {
+ var options = GetMetadataOptions(item);
+
+ try
+ {
+ if (enforceConfiguration && options.DisabledMetadataSavers.Contains(saver.Name, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ return saver.IsEnabledFor(item, updateType);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error in {0}.IsEnabledFor", ex, saver.Name);
+ return false;
+ }
+ }
}
-}
+} \ No newline at end of file