| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 | using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Threading;using System.Threading.Tasks;using MediaBrowser.Common.Configuration;using MediaBrowser.Controller.Dto;using MediaBrowser.Controller.Entities;using MediaBrowser.Controller.Library;using MediaBrowser.Controller.MediaEncoding;using MediaBrowser.Controller.Persistence;using MediaBrowser.Controller.Providers;using MediaBrowser.Model.Entities;using MediaBrowser.Model.Globalization;using MediaBrowser.Model.IO;using MediaBrowser.Model.Tasks;namespace Emby.Server.Implementations.ScheduledTasks{    /// <summary>    /// Class ChapterImagesTask.    /// </summary>    public class ChapterImagesTask : IScheduledTask    {        /// <summary>        /// The _library manager.        /// </summary>        private readonly ILibraryManager _libraryManager;        private readonly IItemRepository _itemRepo;        private readonly IApplicationPaths _appPaths;        private readonly IEncodingManager _encodingManager;        private readonly IFileSystem _fileSystem;        private readonly ILocalizationManager _localization;        /// <summary>        /// Initializes a new instance of the <see cref="ChapterImagesTask" /> class.        /// </summary>        /// <param name="libraryManager">The library manager.</param>.        /// <param name="itemRepo">The item repository.</param>        /// <param name="appPaths">The application paths.</param>        /// <param name="encodingManager">The encoding manager.</param>        /// <param name="fileSystem">The filesystem.</param>        /// <param name="localization">The localization manager.</param>        public ChapterImagesTask(            ILibraryManager libraryManager,            IItemRepository itemRepo,            IApplicationPaths appPaths,            IEncodingManager encodingManager,            IFileSystem fileSystem,            ILocalizationManager localization)        {            _libraryManager = libraryManager;            _itemRepo = itemRepo;            _appPaths = appPaths;            _encodingManager = encodingManager;            _fileSystem = fileSystem;            _localization = localization;        }        /// <inheritdoc />        public string Name => _localization.GetLocalizedString("TaskRefreshChapterImages");        /// <inheritdoc />        public string Description => _localization.GetLocalizedString("TaskRefreshChapterImagesDescription");        /// <inheritdoc />        public string Category => _localization.GetLocalizedString("TasksLibraryCategory");        /// <inheritdoc />        public string Key => "RefreshChapterImages";        /// <inheritdoc />        public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()        {            return new[]            {                new TaskTriggerInfo                {                    Type = TaskTriggerInfo.TriggerDaily,                    TimeOfDayTicks = TimeSpan.FromHours(2).Ticks,                    MaxRuntimeTicks = TimeSpan.FromHours(4).Ticks                }            };        }        /// <summary>        /// Returns the task to be executed.        /// </summary>        /// <param name="cancellationToken">The cancellation token.</param>        /// <param name="progress">The progress.</param>        /// <returns>Task.</returns>        public async Task Execute(CancellationToken cancellationToken, IProgress<double> progress)        {            var videos = _libraryManager.GetItemList(new InternalItemsQuery            {                MediaTypes = new[] { MediaType.Video },                IsFolder = false,                Recursive = true,                DtoOptions = new DtoOptions(false)                {                    EnableImages = false                },                SourceTypes = new SourceType[] { SourceType.Library },                HasChapterImages = false,                IsVirtualItem = false            })                .OfType<Video>()                .ToList();            var numComplete = 0;            var failHistoryPath = Path.Combine(_appPaths.CachePath, "chapter-failures.txt");            List<string> previouslyFailedImages;            if (File.Exists(failHistoryPath))            {                try                {                    previouslyFailedImages = File.ReadAllText(failHistoryPath)                        .Split('|', StringSplitOptions.RemoveEmptyEntries)                        .ToList();                }                catch (IOException)                {                    previouslyFailedImages = new List<string>();                }            }            else            {                previouslyFailedImages = new List<string>();            }            var directoryService = new DirectoryService(_fileSystem);            foreach (var video in videos)            {                cancellationToken.ThrowIfCancellationRequested();                var key = video.Path + video.DateModified.Ticks;                var extract = !previouslyFailedImages.Contains(key, StringComparer.OrdinalIgnoreCase);                try                {                    var chapters = _itemRepo.GetChapters(video);                    var success = await _encodingManager.RefreshChapterImages(video, directoryService, chapters, extract, true, cancellationToken).ConfigureAwait(false);                    if (!success)                    {                        previouslyFailedImages.Add(key);                        var parentPath = Path.GetDirectoryName(failHistoryPath);                        if (parentPath != null)                        {                            Directory.CreateDirectory(parentPath);                        }                        string text = string.Join('|', previouslyFailedImages);                        File.WriteAllText(failHistoryPath, text);                    }                    numComplete++;                    double percent = numComplete;                    percent /= videos.Count;                    progress.Report(100 * percent);                }                catch (ObjectDisposedException)                {                    // TODO Investigate and properly fix.                    break;                }            }        }    }}
 |