diff options
Diffstat (limited to 'MediaBrowser.Providers/Manager/ProviderManager.cs')
| -rw-r--r-- | MediaBrowser.Providers/Manager/ProviderManager.cs | 99 |
1 files changed, 94 insertions, 5 deletions
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index 3cdda2cbb..ce995fe64 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -18,8 +18,10 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Common.Progress; using MediaBrowser.Model.IO; using MediaBrowser.Controller.Dto; +using MediaBrowser.Model.Events; using MediaBrowser.Model.Serialization; using Priority_Queue; @@ -67,6 +69,10 @@ namespace MediaBrowser.Providers.Manager private readonly IMemoryStreamFactory _memoryStreamProvider; private CancellationTokenSource _disposeCancellationTokenSource = new CancellationTokenSource(); + public event EventHandler<GenericEventArgs<BaseItem>> RefreshStarted; + public event EventHandler<GenericEventArgs<BaseItem>> RefreshCompleted; + public event EventHandler<GenericEventArgs<Tuple<BaseItem, double>>> RefreshProgress; + /// <summary> /// Initializes a new instance of the <see cref="ProviderManager" /> class. /// </summary> @@ -849,6 +855,89 @@ namespace MediaBrowser.Providers.Manager }); } + private Dictionary<Guid, double> _activeRefreshes = new Dictionary<Guid, double>(); + + public Dictionary<Guid, Guid> GetRefreshQueue() + { + lock (_refreshQueueLock) + { + var dict = new Dictionary<Guid, Guid>(); + + foreach (var item in _refreshQueue) + { + dict[item.Item1] = item.Item1; + } + return dict; + } + } + + public void OnRefreshStart(BaseItem item) + { + //_logger.Info("OnRefreshStart {0}", item.Id.ToString("N")); + var id = item.Id; + + lock (_activeRefreshes) + { + _activeRefreshes[id] = 0; + } + + if (RefreshStarted != null) + { + RefreshStarted(this, new GenericEventArgs<BaseItem>(item)); + } + } + + public void OnRefreshComplete(BaseItem item) + { + //_logger.Info("OnRefreshComplete {0}", item.Id.ToString("N")); + lock (_activeRefreshes) + { + _activeRefreshes.Remove(item.Id); + } + + if (RefreshCompleted != null) + { + RefreshCompleted(this, new GenericEventArgs<BaseItem>(item)); + } + } + + public double? GetRefreshProgress(Guid id) + { + lock (_activeRefreshes) + { + double value; + if (_activeRefreshes.TryGetValue(id, out value)) + { + return value; + } + + return null; + } + } + + public void OnRefreshProgress(BaseItem item, double progress) + { + //_logger.Info("OnRefreshProgress {0} {1}", item.Id.ToString("N"), progress); + var id = item.Id; + + lock (_activeRefreshes) + { + if (_activeRefreshes.ContainsKey(id)) + { + _activeRefreshes[id] = progress; + + if (RefreshProgress != null) + { + RefreshProgress(this, new GenericEventArgs<Tuple<BaseItem, double>>(new Tuple<BaseItem, double>(item, progress))); + } + } + else + { + throw new Exception(string.Format("Refresh for item {0} {1} is not in progress", item.GetType().Name, item.Id.ToString("N"))); + } + } + } + private readonly SimplePriorityQueue<Tuple<Guid, MetadataRefreshOptions>> _refreshQueue = new SimplePriorityQueue<Tuple<Guid, MetadataRefreshOptions>>(); @@ -906,7 +995,7 @@ namespace MediaBrowser.Providers.Manager var folder = item as Folder; if (folder != null) { - await folder.ValidateChildren(new Progress<double>(), cancellationToken).ConfigureAwait(false); + await folder.ValidateChildren(new SimpleProgress<double>(), cancellationToken).ConfigureAwait(false); } } @@ -951,14 +1040,14 @@ namespace MediaBrowser.Providers.Manager if (folder != null) { - await folder.ValidateChildren(new Progress<double>(), cancellationToken, options).ConfigureAwait(false); + await folder.ValidateChildren(new SimpleProgress<double>(), cancellationToken, options).ConfigureAwait(false); } } } private async Task RefreshCollectionFolderChildren(MetadataRefreshOptions options, CollectionFolder collectionFolder, CancellationToken cancellationToken) { - foreach (var child in collectionFolder.Children.ToList()) + foreach (var child in collectionFolder.GetPhysicalFolders().ToList()) { await child.RefreshMetadata(options, cancellationToken).ConfigureAwait(false); @@ -966,7 +1055,7 @@ namespace MediaBrowser.Providers.Manager { var folder = (Folder)child; - await folder.ValidateChildren(new Progress<double>(), cancellationToken, options, true).ConfigureAwait(false); + await folder.ValidateChildren(new SimpleProgress<double>(), cancellationToken, options, true).ConfigureAwait(false); } } } @@ -991,7 +1080,7 @@ namespace MediaBrowser.Providers.Manager .Where(i => i != null) .ToList(); - var musicArtistRefreshTasks = musicArtists.Select(i => i.ValidateChildren(new Progress<double>(), cancellationToken, options, true)); + var musicArtistRefreshTasks = musicArtists.Select(i => i.ValidateChildren(new SimpleProgress<double>(), cancellationToken, options, true)); await Task.WhenAll(musicArtistRefreshTasks).ConfigureAwait(false); |
