| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | using System;using System.Linq;using Jellyfin.Database.Implementations;using Jellyfin.Server.ServerSetupApp;using MediaBrowser.Model.Globalization;using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Logging;namespace Jellyfin.Server.Migrations.Routines;/// <summary>/// Migrate rating levels./// </summary>#pragma warning disable CS0618 // Type or member is obsolete[JellyfinMigration("2025-04-20T22:00:00", nameof(MigrateRatingLevels))][JellyfinMigrationBackup(JellyfinDb = true)]#pragma warning restore CS0618 // Type or member is obsoleteinternal class MigrateRatingLevels : IDatabaseMigrationRoutine{    private readonly IStartupLogger _logger;    private readonly IDbContextFactory<JellyfinDbContext> _provider;    private readonly ILocalizationManager _localizationManager;    public MigrateRatingLevels(        IDbContextFactory<JellyfinDbContext> provider,        IStartupLogger<MigrateRatingLevels> logger,        ILocalizationManager localizationManager)    {        _provider = provider;        _localizationManager = localizationManager;        _logger = logger;    }    /// <inheritdoc/>    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();    }}
 |