aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server
diff options
context:
space:
mode:
Diffstat (limited to 'Jellyfin.Server')
-rw-r--r--Jellyfin.Server/Migrations/PreStartupRoutines/MigrateEncodingOptions.cs4
-rw-r--r--Jellyfin.Server/Migrations/Routines/20260915104305_FixNullEncoderPreset.cs77
2 files changed, 79 insertions, 2 deletions
diff --git a/Jellyfin.Server/Migrations/PreStartupRoutines/MigrateEncodingOptions.cs b/Jellyfin.Server/Migrations/PreStartupRoutines/MigrateEncodingOptions.cs
index 0141b43c96..a5006c9bfa 100644
--- a/Jellyfin.Server/Migrations/PreStartupRoutines/MigrateEncodingOptions.cs
+++ b/Jellyfin.Server/Migrations/PreStartupRoutines/MigrateEncodingOptions.cs
@@ -79,8 +79,8 @@ public class MigrateEncodingOptions : IMigrationRoutine
tonemappingRange = parsedTonemappingRange;
}
- var encoderPreset = EncoderPreset.superfast;
- if (Enum.TryParse<EncoderPreset>(oldConfig.TonemappingRange, true, out var parsedEncoderPreset))
+ var encoderPreset = EncoderPreset.auto;
+ if (Enum.TryParse<EncoderPreset>(oldConfig.EncoderPreset, true, out var parsedEncoderPreset))
{
encoderPreset = parsedEncoderPreset;
}
diff --git a/Jellyfin.Server/Migrations/Routines/20260915104305_FixNullEncoderPreset.cs b/Jellyfin.Server/Migrations/Routines/20260915104305_FixNullEncoderPreset.cs
new file mode 100644
index 0000000000..f8e63f1920
--- /dev/null
+++ b/Jellyfin.Server/Migrations/Routines/20260915104305_FixNullEncoderPreset.cs
@@ -0,0 +1,77 @@
+using System;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Xml;
+using System.Xml.Linq;
+using Jellyfin.Server.Migrations.Stages;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Entities;
+using Microsoft.Extensions.Logging;
+
+namespace Jellyfin.Server.Migrations.Routines;
+
+/// <summary>
+/// Replaces the nullable encoder preset written by older versions with the default preset.
+/// </summary>
+[JellyfinMigration("2026-09-15T10:43:05", nameof(FixNullEncoderPreset), Stage = JellyfinMigrationStageTypes.PreInitialisation)]
+internal class FixNullEncoderPreset : IAsyncMigrationRoutine
+{
+ private static readonly XNamespace _xsiNamespace = "http://www.w3.org/2001/XMLSchema-instance";
+
+ private readonly IApplicationPaths _applicationPaths;
+ private readonly ILogger<FixNullEncoderPreset> _logger;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="FixNullEncoderPreset"/> class.
+ /// </summary>
+ /// <param name="applicationPaths">The application paths.</param>
+ /// <param name="logger">The logger.</param>
+ public FixNullEncoderPreset(IApplicationPaths applicationPaths, ILogger<FixNullEncoderPreset> logger)
+ {
+ _applicationPaths = applicationPaths;
+ _logger = logger;
+ }
+
+ /// <inheritdoc />
+ public Task PerformAsync(CancellationToken cancellationToken)
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var path = Path.Combine(_applicationPaths.ConfigurationDirectoryPath, "encoding.xml");
+ if (!File.Exists(path))
+ {
+ return Task.CompletedTask;
+ }
+
+ XDocument document;
+ try
+ {
+ document = XDocument.Load(path, LoadOptions.PreserveWhitespace);
+ }
+ catch (XmlException ex)
+ {
+ _logger.LogWarning(ex, "Could not parse encoding configuration; skipping null encoder preset migration");
+ return Task.CompletedTask;
+ }
+
+ var encoderPreset = document.Root?.Element(nameof(EncodingOptions.EncoderPreset));
+ if (encoderPreset is null)
+ {
+ return Task.CompletedTask;
+ }
+
+ var nilAttribute = encoderPreset.Attribute(_xsiNamespace + "nil");
+ if (!string.Equals(nilAttribute?.Value, "true", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(encoderPreset.Value))
+ {
+ return Task.CompletedTask;
+ }
+
+ nilAttribute?.Remove();
+ encoderPreset.Value = nameof(EncoderPreset.auto);
+ document.Save(path, SaveOptions.DisableFormatting);
+ _logger.LogInformation("Replaced null encoder preset with auto in encoding configuration");
+ return Task.CompletedTask;
+ }
+}