diff options
| author | Bond-009 <bond.009@outlook.com> | 2026-11-06 09:36:29 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-11-06 09:36:29 +0100 |
| commit | de93ba4f545c278fbc81ec9c69e9d4f7814b01bc (patch) | |
| tree | f6a8a8138ae5e7f3a2817d454b996ff27fa0beb1 | |
| parent | b3713b370f80b09b79ef7c0a2ed297742d15e1f7 (diff) | |
| parent | 73348492d614f182f5f2dc0036e4b2f1a4bf01d5 (diff) | |
Merge pull request #18425 from bernarden/remove-starttimeticks-for-hls
Removes StartTimeTicks from HLS variant playlist query.
| -rw-r--r-- | Jellyfin.Api/Helpers/DynamicHlsHelper.cs | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/Jellyfin.Api/Helpers/DynamicHlsHelper.cs b/Jellyfin.Api/Helpers/DynamicHlsHelper.cs index f6b6c98c0c..b60ab5eef7 100644 --- a/Jellyfin.Api/Helpers/DynamicHlsHelper.cs +++ b/Jellyfin.Api/Helpers/DynamicHlsHelper.cs @@ -151,27 +151,27 @@ public class DynamicHlsHelper var isLiveStream = state.IsSegmentedLiveStream; var queryString = _httpContextAccessor.HttpContext.Request.QueryString.ToString(); + var playlistQuery = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(queryString); + + // From universal audio service: timeline is determined by segment index and runtime ticks, not StartTimeTicks + playlistQuery.Remove("StartTimeTicks"); - // from universal audio service, need to override the AudioCodec when the actual request differs from original query + // From universal audio service: override AudioCodec when the actual request differs from original query if (!string.Equals(state.OutputAudioCodec, _httpContextAccessor.HttpContext.Request.Query["AudioCodec"].ToString(), StringComparison.OrdinalIgnoreCase)) { - var newQuery = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(queryString); - newQuery["AudioCodec"] = state.OutputAudioCodec; - queryString = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(string.Empty, newQuery); + playlistQuery["AudioCodec"] = state.OutputAudioCodec; } - // from universal audio service - if (!string.IsNullOrWhiteSpace(state.Request.SegmentContainer) - && !queryString.Contains("SegmentContainer", StringComparison.OrdinalIgnoreCase)) + // From universal audio service + if (!string.IsNullOrWhiteSpace(state.Request.SegmentContainer)) { - queryString += "&SegmentContainer=" + state.Request.SegmentContainer; + playlistQuery.TryAdd("SegmentContainer", state.Request.SegmentContainer); } - // from universal audio service - if (!string.IsNullOrWhiteSpace(state.Request.TranscodeReasons) - && !queryString.Contains("TranscodeReasons=", StringComparison.OrdinalIgnoreCase)) + // From universal audio service + if (!string.IsNullOrWhiteSpace(state.Request.TranscodeReasons)) { - queryString += "&TranscodeReasons=" + state.Request.TranscodeReasons; + playlistQuery.TryAdd("TranscodeReasons", state.Request.TranscodeReasons); } // Video rotation metadata is only supported in fMP4 remuxing @@ -182,13 +182,12 @@ public class DynamicHlsHelper && !string.IsNullOrWhiteSpace(state.Request.SegmentContainer) && !string.Equals(state.Request.SegmentContainer, "mp4", StringComparison.OrdinalIgnoreCase)) { - queryString += "&AllowVideoStreamCopy=false"; + playlistQuery["AllowVideoStreamCopy"] = "false"; } // Main stream var baseUrl = isLiveStream ? "live.m3u8" : "main.m3u8"; - var playlistUrl = baseUrl + queryString; - var playlistQuery = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(queryString); + var playlistUrl = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(baseUrl, playlistQuery); var subtitleStreams = state.MediaSource .MediaStreams |
