diff options
Diffstat (limited to 'MediaBrowser.Providers/Manager/ProviderManager.cs')
| -rw-r--r-- | MediaBrowser.Providers/Manager/ProviderManager.cs | 298 |
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 |
