#nullable disable using System; using System.Linq; using System.Threading; using Jellyfin.Extensions; 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 += OnConfigurationUpdated; } /// public SemaphoreSlim 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(baseItem.GetType().Name); if (typeOptions != null) { return typeOptions.MetadataFetchers.Contains(name.AsSpan(), StringComparison.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.DisabledMetadataFetchers.Contains(name.AsSpan(), StringComparison.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(baseItem.GetType().Name); if (typeOptions != null) { return typeOptions.ImageFetchers.Contains(name.AsSpan(), StringComparison.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.AsSpan(), StringComparison.OrdinalIgnoreCase); } /// /// Called when the configuration is updated. /// It will refresh the metadata throttler if the relevant config changed. /// private void OnConfigurationUpdated(object sender, EventArgs e) { int newMetadataRefreshConcurrency = GetMetadataRefreshConcurrency(); if (_metadataRefreshConcurrency != newMetadataRefreshConcurrency) { _metadataRefreshConcurrency = newMetadataRefreshConcurrency; SetupMetadataThrottler(); } } /// /// Creates the metadata refresh throttler. /// private void SetupMetadataThrottler() { MetadataRefreshThrottler = new SemaphoreSlim(_metadataRefreshConcurrency); } /// /// Returns the metadata refresh concurrency. /// private int GetMetadataRefreshConcurrency() { var concurrency = _serverConfigurationManager.Configuration.LibraryMetadataRefreshConcurrency; if (concurrency <= 0) { concurrency = Environment.ProcessorCount; } return concurrency; } } }