aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBond-009 <bond.009@outlook.com>2026-11-06 09:36:29 +0100
committerGitHub <noreply@github.com>2026-11-06 09:36:29 +0100
commitde93ba4f545c278fbc81ec9c69e9d4f7814b01bc (patch)
treef6a8a8138ae5e7f3a2817d454b996ff27fa0beb1
parentb3713b370f80b09b79ef7c0a2ed297742d15e1f7 (diff)
parent73348492d614f182f5f2dc0036e4b2f1a4bf01d5 (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.cs29
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