| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | 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 StudiosValidator    {        /// <summary>        /// The _library manager        /// </summary>        private readonly ILibraryManager _libraryManager;        /// <summary>        /// The _logger        /// </summary>        private readonly ILogger _logger;        public StudiosValidator(ILibraryManager libraryManager, ILogger logger)        {            _libraryManager = libraryManager;            _logger = logger;        }        /// <summary>        /// Runs the specified progress.        /// </summary>        /// <param name="progress">The progress.</param>        /// <param name="cancellationToken">The cancellation token.</param>        /// <returns>Task.</returns>        public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)        {            var items = _libraryManager.RootFolder.GetRecursiveChildren()                .SelectMany(i => i.Studios)                .DistinctNames()                .ToList();            var numComplete = 0;            var count = items.Count;            var validIds = new List<Guid>();            foreach (var name in items)            {                try                {                    var itemByName = _libraryManager.GetStudio(name);                    validIds.Add(itemByName.Id);                    await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);                }                catch (OperationCanceledException)                {                    // Don't clutter the log                    break;                }                catch (Exception ex)                {                    _logger.ErrorException("Error refreshing {0}", ex, name);                }                numComplete++;                double percent = numComplete;                percent /= count;                percent *= 100;                progress.Report(percent);            }            var allIds = _libraryManager.GetItemIds(new InternalItemsQuery            {                IncludeItemTypes = new[] { typeof(Studio).Name }            });            var invalidIds = allIds                .Except(validIds)                .ToList();            foreach (var id in invalidIds)            {                cancellationToken.ThrowIfCancellationRequested();                                var item = _libraryManager.GetItemById(id);                await _libraryManager.DeleteItem(item, new DeleteOptions                {                    DeleteFileLocation = false                }).ConfigureAwait(false);            }            progress.Report(100);        }    }}
 |