aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs
diff options
context:
space:
mode:
authorShadowghost <Shadowghost@users.noreply.github.com>2023-05-11 01:38:54 +0200
committerGitHub <noreply@github.com>2023-05-10 17:38:54 -0600
commitbcf92b57220d92242ef6ae82118d469f2401e27f (patch)
tree6ec356065f2ce9327da66a664320d886db0ed52a /Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs
parentd5fec4963ee69460a84025c456eb7d928634e765 (diff)
Fix MigrateRatingLevels (#9461)
Diffstat (limited to 'Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs')
-rw-r--r--Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs103
1 files changed, 103 insertions, 0 deletions
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs b/Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs
new file mode 100644
index 000000000..9dee520a5
--- /dev/null
+++ b/Jellyfin.Server/Migrations/Routines/MigrateRatingLevels.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Globalization;
+using System.IO;
+
+using Emby.Server.Implementations.Data;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Model.Globalization;
+using Microsoft.Extensions.Logging;
+using SQLitePCL.pretty;
+
+namespace Jellyfin.Server.Migrations.Routines
+{
+ /// <summary>
+ /// Migrate rating levels to new rating level system.
+ /// </summary>
+ internal class MigrateRatingLevels : IMigrationRoutine
+ {
+ private const string DbFilename = "library.db";
+ private readonly ILogger<MigrateRatingLevels> _logger;
+ private readonly IServerApplicationPaths _applicationPaths;
+ private readonly ILocalizationManager _localizationManager;
+ private readonly IItemRepository _repository;
+
+ public MigrateRatingLevels(
+ IServerApplicationPaths applicationPaths,
+ ILoggerFactory loggerFactory,
+ ILocalizationManager localizationManager,
+ IItemRepository repository)
+ {
+ _applicationPaths = applicationPaths;
+ _localizationManager = localizationManager;
+ _repository = repository;
+ _logger = loggerFactory.CreateLogger<MigrateRatingLevels>();
+ }
+
+ /// <inheritdoc/>
+ public Guid Id => Guid.Parse("{67445D54-B895-4B24-9F4C-35CE0690EA07}");
+
+ /// <inheritdoc/>
+ public string Name => "MigrateRatingLevels";
+
+ /// <inheritdoc/>
+ public bool PerformOnNewInstall => false;
+
+ /// <inheritdoc/>
+ public void Perform()
+ {
+ var dbPath = Path.Combine(_applicationPaths.DataPath, DbFilename);
+
+ // Back up the database before modifying any entries
+ for (int i = 1; ; i++)
+ {
+ var bakPath = string.Format(CultureInfo.InvariantCulture, "{0}.bak{1}", dbPath, i);
+ if (!File.Exists(bakPath))
+ {
+ try
+ {
+ File.Copy(dbPath, bakPath);
+ _logger.LogInformation("Library database backed up to {BackupPath}", bakPath);
+ break;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Cannot make a backup of {Library} at path {BackupPath}", DbFilename, bakPath);
+ throw;
+ }
+ }
+ }
+
+ // Migrate parental rating strings to new levels
+ _logger.LogInformation("Recalculating parental rating levels based on rating string.");
+ using (var connection = SQLite3.Open(
+ dbPath,
+ ConnectionFlags.ReadWrite,
+ null))
+ {
+ var queryResult = connection.Query("SELECT DISTINCT OfficialRating FROM TypedBaseItems");
+ foreach (var entry in queryResult)
+ {
+ var ratingString = entry[0].ToString();
+ if (string.IsNullOrEmpty(ratingString))
+ {
+ connection.Execute("UPDATE TypedBaseItems SET InheritedParentalRatingValue = NULL WHERE OfficialRating IS NULL OR OfficialRating='';");
+ }
+ else
+ {
+ var ratingValue = _localizationManager.GetRatingLevel(ratingString).ToString();
+ if (string.IsNullOrEmpty(ratingValue))
+ {
+ ratingValue = "NULL";
+ }
+
+ var statement = connection.PrepareStatement("UPDATE TypedBaseItems SET InheritedParentalRatingValue = @Value WHERE OfficialRating = @Rating;");
+ statement.TryBind("@Value", ratingValue);
+ statement.TryBind("@Rating", ratingString);
+ statement.ExecuteQuery();
+ }
+ }
+ }
+ }
+ }
+}