using System; using System.Threading; using System.Threading.Tasks; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; using Kyoo.Abstractions.Models.Attributes; using Microsoft.Extensions.Logging; namespace Kyoo.Core.Tasks { /// /// A task to remove orphaned episode and series. /// [TaskMetadata("housekeeping", "Housekeeping", "Remove orphaned episode and series.", RunOnStartup = true)] public class Housekeeping : ITask { /// /// The library manager used to get libraries or remove deleted episodes. /// private readonly ILibraryManager _libraryManager; /// /// The file manager used walk inside directories and check they existences. /// private readonly IFileSystem _fileSystem; /// /// The logger used to inform the user that episodes has been removed. /// private readonly ILogger _logger; /// /// Create a new task. /// /// The library manager used to get libraries or remove deleted episodes. /// The file manager used walk inside directories and check they existences. /// The logger used to inform the user that episodes has been removed. public Housekeeping(ILibraryManager libraryManager, IFileSystem fileSystem, ILogger logger) { _libraryManager = libraryManager; _fileSystem = fileSystem; _logger = logger; } /// public TaskParameters GetParameters() { return new(); } /// public async Task Run(TaskParameters arguments, IProgress progress, CancellationToken cancellationToken) { int count = 0; int delCount = await _libraryManager.GetCount() + await _libraryManager.GetCount(); progress.Report(0); foreach (Show show in await _libraryManager.GetAll()) { progress.Report(count / delCount * 100); count++; if (await _fileSystem.Exists(show.Path)) continue; _logger.LogWarning("Show {Name}'s folder has been deleted (was {Path}), removing it from kyoo", show.Title, show.Path); await _libraryManager.Delete(show); } foreach (Episode episode in await _libraryManager.GetAll()) { progress.Report(count / delCount * 100); count++; if (await _fileSystem.Exists(episode.Path)) continue; _logger.LogWarning("Episode {Slug}'s file has been deleted (was {Path}), removing it from kyoo", episode.Slug, episode.Path); await _libraryManager.Delete(episode); } progress.Report(100); } } }