using System.Linq; using System.Threading; using System.Threading.Tasks; using Jellyfin.Data.Enums; using Jellyfin.Database.Implementations; using Jellyfin.Server.ServerSetupApp; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace Jellyfin.Server.Migrations.Routines; /// /// Cleans up all Music artists that have been migrated in the 10.11 RC migrations. /// [JellyfinMigration("2025-10-09T20:00:00", nameof(CleanMusicArtist))] [JellyfinMigrationBackup(JellyfinDb = true)] public class CleanMusicArtist : IAsyncMigrationRoutine { private readonly IStartupLogger _startupLogger; private readonly IDbContextFactory _dbContextFactory; /// /// Initializes a new instance of the class. /// /// The startup logger. /// The Db context factory. public CleanMusicArtist(IStartupLogger startupLogger, IDbContextFactory dbContextFactory) { _startupLogger = startupLogger; _dbContextFactory = dbContextFactory; } /// public async Task PerformAsync(CancellationToken cancellationToken) { var context = await _dbContextFactory.CreateDbContextAsync(cancellationToken).ConfigureAwait(false); await using (context.ConfigureAwait(false)) { var peoples = context.Peoples.Where(e => e.PersonType == nameof(PersonKind.Artist) || e.PersonType == nameof(PersonKind.AlbumArtist)); _startupLogger.LogInformation("Delete {Number} Artist and Album Artist person types from db", await peoples.CountAsync(cancellationToken).ConfigureAwait(false)); await peoples .ExecuteDeleteAsync(cancellationToken) .ConfigureAwait(false); } } }