< Summary - Jellyfin

Information
Class: Jellyfin.Server.Migrations.Routines.MigrateRatingLevels
Assembly: jellyfin
File(s): /srv/git/jellyfin/Jellyfin.Server/Migrations/Routines/20260302090000_MigrateRatingLevels.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 28
Coverable lines: 28
Total lines: 68
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 8
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 2/13/2026 - 12:11:21 AM Line coverage: 0% (0/28) Branch coverage: 0% (0/8) Total lines: 695/7/2026 - 12:15:44 AM Line coverage: 0% (0/28) Branch coverage: 0% (0/8) Total lines: 68 2/13/2026 - 12:11:21 AM Line coverage: 0% (0/28) Branch coverage: 0% (0/8) Total lines: 695/7/2026 - 12:15:44 AM Line coverage: 0% (0/28) Branch coverage: 0% (0/8) Total lines: 68

Coverage delta

Coverage delta 1 -1

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
Perform()0%7280%

File(s)

/srv/git/jellyfin/Jellyfin.Server/Migrations/Routines/20260302090000_MigrateRatingLevels.cs

#LineLine coverage
 1using System.Linq;
 2using Jellyfin.Database.Implementations;
 3using Jellyfin.Server.ServerSetupApp;
 4using MediaBrowser.Model.Globalization;
 5using Microsoft.EntityFrameworkCore;
 6using Microsoft.Extensions.Logging;
 7
 8namespace Jellyfin.Server.Migrations.Routines;
 9
 10/// <summary>
 11/// Migrate rating levels.
 12/// </summary>
 13#pragma warning disable CS0618 // Type or member is obsolete
 14[JellyfinMigration("2026-03-02T09:00:00", nameof(MigrateRatingLevels))]
 15[JellyfinMigrationBackup(JellyfinDb = true)]
 16#pragma warning restore CS0618 // Type or member is obsolete
 17internal class MigrateRatingLevels : IDatabaseMigrationRoutine
 18{
 19    private readonly IStartupLogger _logger;
 20    private readonly IDbContextFactory<JellyfinDbContext> _provider;
 21    private readonly ILocalizationManager _localizationManager;
 22
 23    public MigrateRatingLevels(
 24        IDbContextFactory<JellyfinDbContext> provider,
 25        IStartupLogger<MigrateRatingLevels> logger,
 26        ILocalizationManager localizationManager)
 27    {
 028        _provider = provider;
 029        _localizationManager = localizationManager;
 030        _logger = logger;
 031    }
 32
 33    /// <inheritdoc/>
 34    public void Perform()
 35    {
 036        _logger.LogInformation("Recalculating parental rating levels based on rating string.");
 037        using var context = _provider.CreateDbContext();
 038        using var transaction = context.Database.BeginTransaction();
 039        var ratings = context.BaseItems.AsNoTracking().Select(e => e.OfficialRating).Distinct();
 040        foreach (var rating in ratings)
 41        {
 042            if (string.IsNullOrEmpty(rating))
 43            {
 044                int? value = null;
 045                context.BaseItems
 046                    .Where(e => e.OfficialRating == null || e.OfficialRating == string.Empty)
 047                    .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingValue, value));
 048                context.BaseItems
 049                    .Where(e => e.OfficialRating == null || e.OfficialRating == string.Empty)
 050                    .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingSubValue, value));
 51            }
 52            else
 53            {
 054                var ratingValue = _localizationManager.GetRatingScore(rating);
 055                var score = ratingValue?.Score;
 056                var subScore = ratingValue?.SubScore;
 057                context.BaseItems
 058                    .Where(e => e.OfficialRating == rating)
 059                    .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingValue, score));
 060                context.BaseItems
 061                    .Where(e => e.OfficialRating == rating)
 062                    .ExecuteUpdate(f => f.SetProperty(e => e.InheritedParentalRatingSubValue, subScore));
 63            }
 64        }
 65
 066        transaction.Commit();
 067    }
 68}