using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using Microsoft.Extensions.Logging; namespace Emby.Server.Implementations.Library.Validators; /// /// Ensures top-level library folders have a primary poster after scans. /// Poster extraction is attempted before library scanning. When a library is /// empty at that point, no poster can be extracted. This post-scan task reruns /// metadata extraction for top-level folders that are still missing images. /// public class CollectionPosterVerifyPostScanTask : ILibraryPostScanTask { private readonly ILibraryManager _libraryManager; private readonly ILogger _logger; /// /// Initializes a new instance of the class. /// /// The library manager. /// The logger. public CollectionPosterVerifyPostScanTask( ILibraryManager libraryManager, ILogger logger) { _libraryManager = libraryManager; _logger = logger; } /// /// Runs the specified progress. /// /// The progress. /// The cancellation token. /// Task. public async Task Run(IProgress progress, CancellationToken cancellationToken) { var libraries = _libraryManager.GetUserRootFolder().Children.OfType().ToList(); var totalLibraries = libraries.Count; var processedLibraries = 0; foreach (var library in libraries) { cancellationToken.ThrowIfCancellationRequested(); if (!library.HasImage(ImageType.Primary)) { _logger.LogDebug("Library {LibraryName} is missing a primary image. Refreshing metadata.", library.Name); await library.RefreshMetadata(cancellationToken).ConfigureAwait(false); } processedLibraries++; progress.Report((double)processedLibraries / totalLibraries * 100); } progress.Report(100); } }