using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Library.Validators { class PeoplePostScanTask : ILibraryPostScanTask { /// /// The _library manager /// private readonly ILibraryManager _libraryManager; /// /// The _user manager /// private readonly IUserManager _userManager; /// /// The _logger /// private readonly ILogger _logger; public PeoplePostScanTask(ILibraryManager libraryManager, IUserManager userManager, ILogger logger) { _libraryManager = libraryManager; _userManager = userManager; _logger = logger; } /// /// Runs the specified progress. /// /// The progress. /// The cancellation token. /// Task. public Task Run(IProgress progress, CancellationToken cancellationToken) { return RunInternal(progress, cancellationToken); //return Task.Run(() => RunInternal(progress, cancellationToken)); } private async Task RunInternal(IProgress progress, CancellationToken cancellationToken) { var allItems = _libraryManager.RootFolder.RecursiveChildren.ToList(); var userLibraries = _userManager.Users .Select(i => new Tuple>(i.Id, i.RootFolder.GetRecursiveChildren(i).ToList())) .ToList(); var allLibraryItems = allItems; var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); // Populate counts of items //SetItemCounts(null, allLibraryItems, masterDictionary); progress.Report(2); var numComplete = 0; foreach (var lib in userLibraries) { cancellationToken.ThrowIfCancellationRequested(); SetItemCounts(lib.Item1, lib.Item2, masterDictionary); numComplete++; double percent = numComplete; percent /= userLibraries.Count; percent *= 8; progress.Report(percent); } progress.Report(10); var count = masterDictionary.Count; numComplete = 0; foreach (var name in masterDictionary.Keys) { cancellationToken.ThrowIfCancellationRequested(); try { var counts = masterDictionary[name]; var itemByName = await _libraryManager.GetPerson(name).ConfigureAwait(false); foreach (var libraryId in counts.Keys) { var itemCounts = CountHelpers.GetCounts(counts[libraryId]); itemByName.UserItemCounts[libraryId] = itemCounts; } } catch (Exception ex) { _logger.ErrorException("Error updating counts for {0}", ex, name); } numComplete++; double percent = numComplete; percent /= count; percent *= 90; progress.Report(percent + 10); } progress.Report(100); } private void SetItemCounts(Guid userId, IEnumerable allItems, Dictionary>> masterDictionary) { foreach (var media in allItems) { var names = media .People.Select(i => i.Name) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); CountHelpers.SetItemCounts(userId, media, names, masterDictionary); } } } }