using System.Linq; using System.Threading; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Entities; using Microsoft.Extensions.Logging; namespace Jellyfin.Server.Migrations.Routines { /// /// Fixes the data column of audio types to be deserializable. /// #pragma warning disable CS0618 // Type or member is obsolete [JellyfinMigration("2025-04-20T18:00:00", nameof(FixAudioData), "CF6FABC2-9FBE-4933-84A5-FFE52EF22A58")] [JellyfinMigrationBackup(LegacyLibraryDb = true)] internal class FixAudioData : IMigrationRoutine #pragma warning restore CS0618 // Type or member is obsolete { private readonly ILogger _logger; private readonly IItemRepository _itemRepository; private readonly IItemCountService _countService; private readonly IItemPersistenceService _persistenceService; public FixAudioData( ILoggerFactory loggerFactory, IItemRepository itemRepository, IItemCountService countService, IItemPersistenceService persistenceService) { _itemRepository = itemRepository; _countService = countService; _persistenceService = persistenceService; _logger = loggerFactory.CreateLogger(); } /// public void Perform() { _logger.LogInformation("Backfilling audio lyrics data to database."); var startIndex = 0; var records = _countService.GetCount(new InternalItemsQuery { IncludeItemTypes = [BaseItemKind.Audio], }); while (startIndex < records) { var results = _itemRepository.GetItemList(new InternalItemsQuery { IncludeItemTypes = [BaseItemKind.Audio], StartIndex = startIndex, Limit = 5000, SkipDeserialization = true }) .Cast