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.cs99
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);