| | | 1 | | using System; |
| | | 2 | | using System.Linq; |
| | | 3 | | using System.Threading; |
| | | 4 | | using System.Threading.Tasks; |
| | | 5 | | using MediaBrowser.Controller.Entities; |
| | | 6 | | using MediaBrowser.Controller.Library; |
| | | 7 | | using MediaBrowser.Model.Entities; |
| | | 8 | | using Microsoft.Extensions.Logging; |
| | | 9 | | |
| | | 10 | | namespace Emby.Server.Implementations.Library.Validators; |
| | | 11 | | |
| | | 12 | | /// <summary> |
| | | 13 | | /// Ensures top-level library folders have a primary poster after scans. |
| | | 14 | | /// Poster extraction is attempted before library scanning. When a library is |
| | | 15 | | /// empty at that point, no poster can be extracted. This post-scan task reruns |
| | | 16 | | /// metadata extraction for top-level folders that are still missing images. |
| | | 17 | | /// </summary> |
| | | 18 | | public class CollectionPosterVerifyPostScanTask : ILibraryPostScanTask |
| | | 19 | | { |
| | | 20 | | private readonly ILibraryManager _libraryManager; |
| | | 21 | | private readonly ILogger<CollectionPosterVerifyPostScanTask> _logger; |
| | | 22 | | |
| | | 23 | | /// <summary> |
| | | 24 | | /// Initializes a new instance of the <see cref="CollectionPosterVerifyPostScanTask" /> class. |
| | | 25 | | /// </summary> |
| | | 26 | | /// <param name="libraryManager">The library manager.</param> |
| | | 27 | | /// <param name="logger">The logger.</param> |
| | | 28 | | public CollectionPosterVerifyPostScanTask( |
| | | 29 | | ILibraryManager libraryManager, |
| | | 30 | | ILogger<CollectionPosterVerifyPostScanTask> logger) |
| | | 31 | | { |
| | 22 | 32 | | _libraryManager = libraryManager; |
| | 22 | 33 | | _logger = logger; |
| | 22 | 34 | | } |
| | | 35 | | |
| | | 36 | | /// <summary> |
| | | 37 | | /// Runs the specified progress. |
| | | 38 | | /// </summary> |
| | | 39 | | /// <param name="progress">The progress.</param> |
| | | 40 | | /// <param name="cancellationToken">The cancellation token.</param> |
| | | 41 | | /// <returns>Task.</returns> |
| | | 42 | | public async Task Run(IProgress<double> progress, CancellationToken cancellationToken) |
| | | 43 | | { |
| | 18 | 44 | | var libraries = _libraryManager.GetUserRootFolder().Children.OfType<CollectionFolder>().ToList(); |
| | 18 | 45 | | var totalLibraries = libraries.Count; |
| | 18 | 46 | | var processedLibraries = 0; |
| | | 47 | | |
| | 42 | 48 | | foreach (var library in libraries) |
| | | 49 | | { |
| | 3 | 50 | | cancellationToken.ThrowIfCancellationRequested(); |
| | | 51 | | |
| | 3 | 52 | | if (!library.HasImage(ImageType.Primary)) |
| | | 53 | | { |
| | 3 | 54 | | _logger.LogDebug("Library {LibraryName} is missing a primary image. Refreshing metadata.", library.Name) |
| | 3 | 55 | | await library.RefreshMetadata(cancellationToken).ConfigureAwait(false); |
| | | 56 | | } |
| | | 57 | | |
| | 3 | 58 | | processedLibraries++; |
| | 3 | 59 | | progress.Report((double)processedLibraries / totalLibraries * 100); |
| | | 60 | | } |
| | | 61 | | |
| | 18 | 62 | | progress.Report(100); |
| | 18 | 63 | | } |
| | | 64 | | } |