using System; using System.Linq; using System.Threading; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Configuration; namespace MediaBrowser.Controller.BaseItemManager { /// public class BaseItemManager : IBaseItemManager { private readonly IServerConfigurationManager _serverConfigurationManager; private int _metadataRefreshConcurrency = 0; /// /// Initializes a new instance of the class. /// /// Instance of the interface. public BaseItemManager(IServerConfigurationManager serverConfigurationManager) { _serverConfigurationManager = serverConfigurationManager; _metadataRefreshConcurrency = GetMetadataRefreshConcurrency(); SetupMetadataThrottler(); _serverConfigurationManager.ConfigurationUpdated += (object sender, EventArgs e) => { int newMetadataRefreshConcurrency = GetMetadataRefreshConcurrency(); if (_metadataRefreshConcurrency != newMetadataRefreshConcurrency) { _metadataRefreshConcurrency = newMetadataRefreshConcurrency; SetupMetadataThrottler(); } }; } /// public Lazy MetadataRefreshThrottler { get; private set; } /// public bool IsMetadataFetcherEnabled(BaseItem baseItem, LibraryOptions libraryOptions, string name) { if (baseItem is Channel) { // Hack alert. return true; } if (baseItem.SourceType == SourceType.Channel) { // Hack alert. return !baseItem.EnableMediaSourceDisplay; } var typeOptions = libraryOptions.GetTypeOptions(GetType().Name); if (typeOptions != null) { return typeOptions.ImageFetchers.Contains(name, StringComparer.OrdinalIgnoreCase); } if (!libraryOptions.EnableInternetProviders) { return false; } var itemConfig = _serverConfigurationManager.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, GetType().Name, StringComparison.OrdinalIgnoreCase)); return itemConfig == null || !itemConfig.DisabledImageFetchers.Contains(name, StringComparer.OrdinalIgnoreCase); } /// public bool IsImageFetcherEnabled(BaseItem baseItem, LibraryOptions libraryOptions, string name) { if (baseItem is Channel) { // Hack alert. return true; } if (baseItem.SourceType == SourceType.Channel) { // Hack alert. return !baseItem.EnableMediaSourceDisplay; } var typeOptions = libraryOptions.GetTypeOptions(GetType().Name); if (typeOptions != null) { return typeOptions.ImageFetchers.Contains(name, StringComparer.OrdinalIgnoreCase); } if (!libraryOptions.EnableInternetProviders) { return false; } var itemConfig = _serverConfigurationManager.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, GetType().Name, StringComparison.OrdinalIgnoreCase)); return itemConfig == null || !itemConfig.DisabledImageFetchers.Contains(name, StringComparer.OrdinalIgnoreCase); } /// /// Creates the metadata refresh throttler. /// private void SetupMetadataThrottler() { MetadataRefreshThrottler = new Lazy(() => new SemaphoreSlim(_metadataRefreshConcurrency)); } /// /// Returns the metadata refresh concurrency. /// private int GetMetadataRefreshConcurrency() { var concurrency = _serverConfigurationManager.Configuration.LibraryMetadataRefreshConcurrency; if (concurrency <= 0) { concurrency = Environment.ProcessorCount; } return concurrency; } } }