Просмотр исходного кода

Fix the fLaC/flac HLS issue also for audio-only

I moved the first application of the workaround out of the if block
so that it also applies to audio-only streams. The workaround was
extended likewise.

We should first and foremost adhere to the specifications and apply
workarounds afterwards for software that doesn't follow them. So I
turned around the workaround to first output the fLaC variant and then
the alternative flac variant.

Fixes: #10066
Jan Müller 1 год назад
Родитель
Сommit
e9f23c61c9
2 измененных файлов с 16 добавлено и 11 удалено
  1. 12 9
      Jellyfin.Api/Helpers/DynamicHlsHelper.cs
  2. 4 2
      Jellyfin.Api/Helpers/HlsCodecStringHelpers.cs

+ 12 - 9
Jellyfin.Api/Helpers/DynamicHlsHelper.cs

@@ -198,15 +198,15 @@ public class DynamicHlsHelper
 
 
         var basicPlaylist = AppendPlaylist(builder, state, playlistUrl, totalBitrate, subtitleGroup);
         var basicPlaylist = AppendPlaylist(builder, state, playlistUrl, totalBitrate, subtitleGroup);
 
 
-        if (state.VideoStream is not null && state.VideoRequest is not null)
+        // Provide a workaround for the case issue between flac and fLaC.
+        var flacWaPlaylist = ApplyFlacCaseWorkaround(state, basicPlaylist.ToString());
+        if (!string.IsNullOrEmpty(flacWaPlaylist))
         {
         {
-            // Provide a workaround for the case issue between flac and fLaC.
-            var flacWaPlaylist = ApplyFlacCaseWorkaround(state, basicPlaylist.ToString());
-            if (!string.IsNullOrEmpty(flacWaPlaylist))
-            {
-                builder.Append(flacWaPlaylist);
-            }
+            builder.Append(flacWaPlaylist);
+        }
 
 
+        if (state.VideoStream is not null && state.VideoRequest is not null)
+        {
             var encodingOptions = _serverConfigurationManager.GetEncodingOptions();
             var encodingOptions = _serverConfigurationManager.GetEncodingOptions();
 
 
             // Provide SDR HEVC entrance for backward compatibility.
             // Provide SDR HEVC entrance for backward compatibility.
@@ -775,8 +775,11 @@ public class DynamicHlsHelper
             return string.Empty;
             return string.Empty;
         }
         }
 
 
-        var newPlaylist = srcPlaylist.Replace(",flac\"", ",fLaC\"", StringComparison.Ordinal);
+        var newPlaylist = srcPlaylist;
+
+        newPlaylist = newPlaylist.Replace(",fLaC\"", ",flac\"", StringComparison.Ordinal);
+        newPlaylist = newPlaylist.Replace("\"fLaC\"", "\"flac\"", StringComparison.Ordinal);
 
 
-        return newPlaylist.Contains(",fLaC\"", StringComparison.Ordinal) ? newPlaylist : string.Empty;
+        return string.Equals(srcPlaylist, newPlaylist, StringComparison.Ordinal) ? string.Empty : newPlaylist;
     }
     }
 }
 }

+ 4 - 2
Jellyfin.Api/Helpers/HlsCodecStringHelpers.cs

@@ -5,7 +5,9 @@ using System.Text;
 namespace Jellyfin.Api.Helpers;
 namespace Jellyfin.Api.Helpers;
 
 
 /// <summary>
 /// <summary>
-/// Hls Codec string helpers.
+/// Helpers to generate HLS codec strings according to
+/// <a href="https://datatracker.ietf.org/doc/html/rfc6381#section-3.3">RFC 6381 section 3.3</a>
+/// and the <a href="https://mp4ra.org">MP4 Registration Authority</a>.
 /// </summary>
 /// </summary>
 public static class HlsCodecStringHelpers
 public static class HlsCodecStringHelpers
 {
 {
@@ -27,7 +29,7 @@ public static class HlsCodecStringHelpers
     /// <summary>
     /// <summary>
     /// Codec name for FLAC.
     /// Codec name for FLAC.
     /// </summary>
     /// </summary>
-    public const string FLAC = "flac";
+    public const string FLAC = "fLaC";
 
 
     /// <summary>
     /// <summary>
     /// Codec name for ALAC.
     /// Codec name for ALAC.