diff options
Diffstat (limited to 'MediaBrowser.Providers/Manager/ProviderManager.cs')
| -rw-r--r-- | MediaBrowser.Providers/Manager/ProviderManager.cs | 78 |
1 files changed, 30 insertions, 48 deletions
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index dfeceed7d..a2f3d0459 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -19,8 +19,10 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using CommonIO; +using MediaBrowser.Model.IO; using MediaBrowser.Common.IO; +using MediaBrowser.Controller.IO; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; namespace MediaBrowser.Providers.Manager @@ -64,7 +66,7 @@ namespace MediaBrowser.Providers.Manager private IExternalId[] _externalIds; private readonly Func<ILibraryManager> _libraryManagerFactory; - private readonly IMemoryStreamProvider _memoryStreamProvider; + private readonly IMemoryStreamFactory _memoryStreamProvider; /// <summary> /// Initializes a new instance of the <see cref="ProviderManager" /> class. @@ -74,7 +76,7 @@ namespace MediaBrowser.Providers.Manager /// <param name="libraryMonitor">The directory watchers.</param> /// <param name="logManager">The log manager.</param> /// <param name="fileSystem">The file system.</param> - public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory, IJsonSerializer json, IMemoryStreamProvider memoryStreamProvider) + public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory, IJsonSerializer json, IMemoryStreamFactory memoryStreamProvider) { _logger = logManager.GetLogger("ProviderManager"); _httpClient = httpClient; @@ -127,7 +129,8 @@ namespace MediaBrowser.Providers.Manager { CancellationToken = cancellationToken, ResourcePool = resourcePool, - Url = url + Url = url, + BufferContent = false }).ConfigureAwait(false); @@ -147,7 +150,7 @@ namespace MediaBrowser.Providers.Manager throw new ArgumentNullException("source"); } - var fileStream = _fileSystem.GetFileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true); + var fileStream = _fileSystem.GetFileStream(source, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, true); return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, fileStream, mimeType, type, imageIndex, saveLocallyWithMedia, cancellationToken); } @@ -269,17 +272,17 @@ namespace MediaBrowser.Providers.Manager { var options = GetMetadataOptions(item); - return GetMetadataProvidersInternal<T>(item, options, false, true); + return GetMetadataProvidersInternal<T>(item, options, false, false, true); } - private IEnumerable<IMetadataProvider<T>> GetMetadataProvidersInternal<T>(IHasMetadata item, MetadataOptions options, bool includeDisabled, bool checkIsOwnedItem) + private IEnumerable<IMetadataProvider<T>> GetMetadataProvidersInternal<T>(IHasMetadata item, MetadataOptions options, bool includeDisabled, bool forceEnableInternetMetadata, bool checkIsOwnedItem) where T : IHasMetadata { // Avoid implicitly captured closure var currentOptions = options; return _metadataProviders.OfType<IMetadataProvider<T>>() - .Where(i => CanRefresh(i, item, currentOptions, includeDisabled, checkIsOwnedItem)) + .Where(i => CanRefresh(i, item, currentOptions, includeDisabled, forceEnableInternetMetadata, checkIsOwnedItem)) .OrderBy(i => GetConfiguredOrder(i, options)) .ThenBy(GetDefaultOrder); } @@ -291,7 +294,7 @@ namespace MediaBrowser.Providers.Manager return GetImageProviders(item, options, new ImageRefreshOptions(new DirectoryService(_logger, _fileSystem)), includeDisabled).OfType<IRemoteImageProvider>(); } - private bool CanRefresh(IMetadataProvider provider, IHasMetadata item, MetadataOptions options, bool includeDisabled, bool checkIsOwnedItem) + private bool CanRefresh(IMetadataProvider provider, IHasMetadata item, MetadataOptions options, bool includeDisabled, bool forceEnableInternetMetadata, bool checkIsOwnedItem) { if (!includeDisabled) { @@ -303,7 +306,7 @@ namespace MediaBrowser.Providers.Manager if (provider is IRemoteMetadataProvider) { - if (!item.IsInternetMetadataEnabled()) + if (!forceEnableInternetMetadata && !item.IsInternetMetadataEnabled()) { return false; } @@ -354,7 +357,7 @@ namespace MediaBrowser.Providers.Manager if (provider is IRemoteImageProvider) { - if (!item.IsInternetMetadataEnabled()) + if (!refreshOptions.ForceEnableInternetMetadata && !item.IsInternetMetadataEnabled()) { return false; } @@ -498,7 +501,7 @@ namespace MediaBrowser.Providers.Manager private void AddMetadataPlugins<T>(List<MetadataPlugin> list, T item, MetadataOptions options) where T : IHasMetadata { - var providers = GetMetadataProvidersInternal<T>(item, options, true, false).ToList(); + var providers = GetMetadataProvidersInternal<T>(item, options, true, false, false).ToList(); // Locals list.AddRange(providers.Where(i => (i is ILocalMetadataProvider)).Select(i => new MetadataPlugin @@ -558,8 +561,6 @@ namespace MediaBrowser.Providers.Manager new MetadataOptions(); } - private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>(); - /// <summary> /// Saves the metadata. /// </summary> @@ -583,6 +584,7 @@ namespace MediaBrowser.Providers.Manager return SaveMetadata(item, updateType, _savers.Where(i => savers.Contains(i.Name, StringComparer.OrdinalIgnoreCase))); } + private readonly SemaphoreSlim _saveLock = new SemaphoreSlim(1,1); /// <summary> /// Saves the metadata. /// </summary> @@ -612,9 +614,7 @@ namespace MediaBrowser.Providers.Manager continue; } - var semaphore = _fileLocks.GetOrAdd(path, key => new SemaphoreSlim(1, 1)); - - await semaphore.WaitAsync().ConfigureAwait(false); + await _saveLock.WaitAsync().ConfigureAwait(false); try { @@ -627,8 +627,8 @@ namespace MediaBrowser.Providers.Manager } finally { + _saveLock.Release(); _libraryMonitor.ReportFileSystemChangeComplete(path, false); - semaphore.Release(); } } else @@ -715,7 +715,7 @@ namespace MediaBrowser.Providers.Manager var options = GetMetadataOptions(dummy); - var providers = GetMetadataProvidersInternal<TItemType>(dummy, options, searchInfo.IncludeDisabledProviders, false) + var providers = GetMetadataProvidersInternal<TItemType>(dummy, options, searchInfo.IncludeDisabledProviders, false, false) .OfType<IRemoteSearchProvider<TLookupType>>(); if (!string.IsNullOrEmpty(searchInfo.SearchProviderName)) @@ -861,8 +861,8 @@ namespace MediaBrowser.Providers.Manager private readonly ConcurrentQueue<Tuple<Guid, MetadataRefreshOptions>> _refreshQueue = new ConcurrentQueue<Tuple<Guid, MetadataRefreshOptions>>(); - private readonly object _refreshTimerLock = new object(); - private Timer _refreshTimer; + private readonly object _refreshQueueLock = new object(); + private bool _isProcessingRefreshQueue; public void QueueRefresh(Guid id, MetadataRefreshOptions options) { @@ -872,38 +872,18 @@ namespace MediaBrowser.Providers.Manager } _refreshQueue.Enqueue(new Tuple<Guid, MetadataRefreshOptions>(id, options)); - StartRefreshTimer(); - } - - private void StartRefreshTimer() - { - if (_disposed) - { - return; - } - lock (_refreshTimerLock) + lock (_refreshQueueLock) { - if (_refreshTimer == null) + if (!_isProcessingRefreshQueue) { - _refreshTimer = new Timer(RefreshTimerCallback, null, 100, Timeout.Infinite); + _isProcessingRefreshQueue = true; + Task.Run(() => StartProcessingRefreshQueue()); } } } - private void StopRefreshTimer() - { - lock (_refreshTimerLock) - { - if (_refreshTimer != null) - { - _refreshTimer.Dispose(); - _refreshTimer = null; - } - } - } - - private async void RefreshTimerCallback(object state) + private async Task StartProcessingRefreshQueue() { Tuple<Guid, MetadataRefreshOptions> refreshItem; var libraryManager = _libraryManagerFactory(); @@ -937,7 +917,10 @@ namespace MediaBrowser.Providers.Manager } } - StopRefreshTimer(); + lock (_refreshQueueLock) + { + _isProcessingRefreshQueue = false; + } } private async Task RefreshItem(BaseItem item, MetadataRefreshOptions options, CancellationToken cancellationToken) @@ -1016,7 +999,6 @@ namespace MediaBrowser.Providers.Manager public void Dispose() { _disposed = true; - StopRefreshTimer(); } } }
\ No newline at end of file |
