using System; using System.Linq; using Jellyfin.Database.Implementations; using MediaBrowser.Model.Globalization; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace Jellyfin.Server.Migrations.Routines; /// /// Migrate rating levels. /// #pragma warning disable CS0618 // Type or member is obsolete [JellyfinMigration("2025-04-20T22:00:00", nameof(MigrateRatingLevels))] #pragma warning restore CS0618 // Type or member is obsolete internal class MigrateRatingLevels : IDatabaseMigrationRoutine { private readonly ILogger _logger; private readonly IDbContextFactory _provider; private readonly ILocalizationManager _localizationManager; public MigrateRatingLevels( IDbContextFactory provider, ILoggerFactory loggerFactory, ILocalizationManager localizationManager) { _provider = provider; _localizationManager = localizationManager; _logger = loggerFactory.CreateLogger(); } /// public void Perform() { _logger.LogInformation("Recalculating parental rating levels based on rating string."); using var context = _provider.CreateDbContext(); using var transaction = context.Database.BeginTransaction(); var ratings = context.BaseItems.AsNoTracking().Select(e => e.OfficialRating).Distinct(); foreach (var rating in ratings) { if (string.IsNullOrEmpty(rating)) { int? value = null; context.BaseItems .Where(e => e.OfficialRating == null || e.OfficialRating == string.Empty) .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingValue, value)); context.BaseItems .Where(e => e.OfficialRating == null || e.OfficialRating == string.Empty) .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingSubValue, value)); } else { var ratingValue = _localizationManager.GetRatingScore(rating); var score = ratingValue?.Score; var subScore = ratingValue?.SubScore; context.BaseItems .Where(e => e.OfficialRating == rating) .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingValue, score)); context.BaseItems .Where(e => e.OfficialRating == rating) .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingSubValue, subScore)); } } transaction.Commit(); } }