diff options
Diffstat (limited to 'Jellyfin.Server')
| -rw-r--r-- | Jellyfin.Server/Migrations/PreStartupRoutines/MigrateEncodingOptions.cs | 4 | ||||
| -rw-r--r-- | Jellyfin.Server/Migrations/Routines/20260915104305_FixNullEncoderPreset.cs | 77 |
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; + } +} |
