using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Lyrics; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Tasks; using Microsoft.Extensions.Logging; namespace Jellyfin.Plugin.LrcLib; /// /// Task to download lyrics. /// public class LyricDownloadTask : IScheduledTask { private const int QueryPageLimit = 100; private static readonly BaseItemKind[] ItemKinds = [BaseItemKind.Audio]; private static readonly MediaType[] MediaTypes = [MediaType.Audio]; private static readonly SourceType[] SourceTypes = [SourceType.Library]; private static readonly DtoOptions DtoOptions = new(false); private readonly ILibraryManager _libraryManager; private readonly ILyricManager _lyricManager; private readonly ILogger _logger; private readonly ILocalizationManager _localizationManager; /// /// Initializes a new instance of the class. /// /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. /// Instance of the interface. public LyricDownloadTask( ILibraryManager libraryManager, ILyricManager lyricManager, ILogger logger, ILocalizationManager localizationManager) { _libraryManager = libraryManager; _lyricManager = lyricManager; _logger = logger; _localizationManager = localizationManager; } /// public string Name => "Download missing lyrics"; /// public string Key => "DownloadLrcLibLyrics"; /// public string Description => "Task to download missing lyrics"; /// public string Category => _localizationManager.GetLocalizedString("TasksLibraryCategory"); /// public async Task ExecuteAsync(IProgress progress, CancellationToken cancellationToken) { var query = new InternalItemsQuery { Recursive = true, IsVirtualItem = false, IncludeItemTypes = ItemKinds, DtoOptions = DtoOptions, MediaTypes = MediaTypes, SourceTypes = SourceTypes, Limit = QueryPageLimit }; var totalCount = _libraryManager.GetCount(query); var startIndex = 0; var completed = 0; while (startIndex < totalCount) { query.StartIndex = startIndex; var audioItems = _libraryManager.GetItemList(query); foreach (var audioItem in audioItems.OfType