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.cs82
1 files changed, 80 insertions, 2 deletions
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index 55a454977..392fcd5ae 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -26,7 +26,7 @@ namespace MediaBrowser.Providers.Manager
/// <summary>
/// Class ProviderManager
/// </summary>
- public class ProviderManager : IProviderManager
+ public class ProviderManager : IProviderManager, IDisposable
{
/// <summary>
/// The _logger
@@ -63,6 +63,8 @@ namespace MediaBrowser.Providers.Manager
private IExternalId[] _externalIds;
+ private readonly Func<ILibraryManager> _libraryManagerFactory;
+
/// <summary>
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
/// </summary>
@@ -71,7 +73,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)
+ public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory)
{
_logger = logManager.GetLogger("ProviderManager");
_httpClient = httpClient;
@@ -79,6 +81,7 @@ namespace MediaBrowser.Providers.Manager
_libraryMonitor = libraryMonitor;
_fileSystem = fileSystem;
_appPaths = appPaths;
+ _libraryManagerFactory = libraryManagerFactory;
}
/// <summary>
@@ -841,5 +844,80 @@ 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;
+
+ public void QueueRefresh(Guid id, MetadataRefreshOptions options)
+ {
+ if (_disposed)
+ {
+ return;
+ }
+
+ _refreshQueue.Enqueue(new Tuple<Guid, MetadataRefreshOptions>(id, options));
+ StartRefreshTimer();
+ }
+
+ private void StartRefreshTimer()
+ {
+ lock (_refreshTimerLock)
+ {
+ if (_refreshTimer == null)
+ {
+ _refreshTimer = new Timer(RefreshTimerCallback, null, 100, Timeout.Infinite);
+ }
+ }
+ }
+
+ private void StopRefreshTimer()
+ {
+ lock (_refreshTimerLock)
+ {
+ if (_refreshTimer != null)
+ {
+ _refreshTimer.Dispose();
+ _refreshTimer = null;
+ }
+ }
+ }
+
+ private async void RefreshTimerCallback(object state)
+ {
+ Tuple<Guid, MetadataRefreshOptions> refreshItem;
+ var libraryManager = _libraryManagerFactory();
+
+ while (_refreshQueue.TryDequeue(out refreshItem))
+ {
+ if (_disposed)
+ {
+ return;
+ }
+
+ try
+ {
+ var item = libraryManager.GetItemById(refreshItem.Item1);
+ if (item != null)
+ {
+ await item.RefreshMetadata(refreshItem.Item2, CancellationToken.None).ConfigureAwait(false);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error refreshing item", ex);
+ }
+ }
+
+ StopRefreshTimer();
+ }
+
+ private bool _disposed;
+ public void Dispose()
+ {
+ _disposed = true;
+ }
}
} \ No newline at end of file