improve library scan progress reporting

This commit is contained in:
Luke Pulverenti 2013-03-28 15:25:36 -04:00
parent 680200864f
commit 5422b14533

View File

@ -1,4 +1,5 @@
using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Progress;
using MediaBrowser.Controller.IO; using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Localization;
@ -713,7 +714,7 @@ namespace MediaBrowser.Controller.Entities
LibraryManager.ReportLibraryChanged(changedArgs); LibraryManager.ReportLibraryChanged(changedArgs);
} }
progress.Report(15); progress.Report(10);
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
@ -732,10 +733,10 @@ namespace MediaBrowser.Controller.Entities
/// <returns>Task.</returns> /// <returns>Task.</returns>
private Task RefreshChildren(IEnumerable<Tuple<BaseItem, bool>> children, IProgress<double> progress, CancellationToken cancellationToken, bool? recursive) private Task RefreshChildren(IEnumerable<Tuple<BaseItem, bool>> children, IProgress<double> progress, CancellationToken cancellationToken, bool? recursive)
{ {
var numComplete = 0;
var list = children.ToList(); var list = children.ToList();
var percentages = new ConcurrentDictionary<Guid, double>(list.Select(i => new KeyValuePair<Guid, double>(i.Item1.Id, 0)));
var tasks = list.Select(tuple => Task.Run(async () => var tasks = list.Select(tuple => Task.Run(async () =>
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
@ -745,10 +746,6 @@ namespace MediaBrowser.Controller.Entities
//refresh it //refresh it
await child.RefreshMetadata(cancellationToken, resetResolveArgs: child.IsFolder).ConfigureAwait(false); await child.RefreshMetadata(cancellationToken, resetResolveArgs: child.IsFolder).ConfigureAwait(false);
//and add it to our valid children
//fire an added event...?
//if it is a folder we need to validate its children as well
// Refresh children if a folder and the item changed or recursive is set to true // Refresh children if a folder and the item changed or recursive is set to true
var refreshChildren = child.IsFolder && (tuple.Item2 || (recursive.HasValue && recursive.Value)); var refreshChildren = child.IsFolder && (tuple.Item2 || (recursive.HasValue && recursive.Value));
@ -765,17 +762,22 @@ namespace MediaBrowser.Controller.Entities
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
await ((Folder)child).ValidateChildren(new Progress<double> { }, cancellationToken, recursive: recursive).ConfigureAwait(false); var innerProgress = new ActionableProgress<double>();
}
lock (progress) innerProgress.RegisterAction(p =>
{ {
numComplete++; lock (progress)
{
percentages.TryUpdate(child.Id, p / 100, percentages[child.Id]);
double percent = numComplete; var percent = percentages.Values.Sum();
percent /= list.Count; percent /= list.Count;
progress.Report((85 * percent) + 15); progress.Report((90 * percent) + 10);
}
});
await ((Folder)child).ValidateChildren(innerProgress, cancellationToken, recursive: recursive).ConfigureAwait(false);
} }
})); }));