From 2c82dd5fe7e6e03963c817cd1853581006c0b199 Mon Sep 17 00:00:00 2001 From: Tomasz Oszczepalski Date: Mon, 17 Aug 2026 11:59:41 +0200 Subject: [PATCH 1/2] Adding custom headers to regular segment loader when lowLatencyMode is enabled --- src/main_thread/api/option_utils.ts | 6 ++++++ src/main_thread/api/public_api.ts | 2 ++ src/public_types.ts | 9 +++++++++ src/transports/dash/init_segment_loader.ts | 10 +++++++++- src/transports/dash/segment_loader.ts | 14 ++++++++++++-- src/transports/types.ts | 1 + 6 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/main_thread/api/option_utils.ts b/src/main_thread/api/option_utils.ts index 40b3dfe758..a6d3e1c932 100644 --- a/src/main_thread/api/option_utils.ts +++ b/src/main_thread/api/option_utils.ts @@ -124,6 +124,8 @@ interface IParsedLoadVideoOptionsBase { workerId?: string | undefined; } | undefined; + /** @see ILoadVideoOptions.segmentRequestHeaders */ + segmentRequestHeaders?: Record | undefined; /** @see ILoadVideoOptions.serverSyncInfos */ serverSyncInfos?: IServerSyncInfos | undefined; /** @see ILoadVideoOptions.mode */ @@ -567,6 +569,10 @@ function parseLoadVideoOptions(options: ILoadVideoOptions): IParsedLoadVideoOpti referenceDateTime: options.referenceDateTime, representationFilter, segmentLoader, + segmentRequestHeaders: + options.segmentRequestHeaders === undefined + ? undefined + : { ...options.segmentRequestHeaders }, serverSyncInfos: options.serverSyncInfos, startAt, textTrackElement: textTrackElement as HTMLElement, diff --git a/src/main_thread/api/public_api.ts b/src/main_thread/api/public_api.ts index 40a7a0af84..7334e0b49e 100644 --- a/src/main_thread/api/public_api.ts +++ b/src/main_thread/api/public_api.ts @@ -1017,6 +1017,7 @@ class Player extends EventEmitter { manifestLoader, referenceDateTime, segmentLoader, + segmentRequestHeaders, serverSyncInfos, experimentalOptions, __priv_manifestUpdateUrl, @@ -1146,6 +1147,7 @@ class Player extends EventEmitter { serverSyncInfos, manifestLoader, segmentLoader, + segmentRequestHeaders, representationFilter: options.representationFilter, __priv_manifestUpdateUrl, __priv_patchLastSegmentInSidx, diff --git a/src/public_types.ts b/src/public_types.ts index d5ea97cfbc..b982be49ac 100644 --- a/src/public_types.ts +++ b/src/public_types.ts @@ -96,6 +96,15 @@ export interface ILoadVideoOptions { */ lowLatencyMode?: boolean; + /** + * HTTP headers added to every DASH audio and video segment request, + * including initialization segments and low-latency chunked requests. + * + * These headers are not added to Manifest, text-track, thumbnail, or + * license requests. + */ + segmentRequestHeaders?: Record | undefined; + requestConfig?: IRequestConfig; /** Indicate the position the RxPlayer should start at on the loaded content. */ diff --git a/src/transports/dash/init_segment_loader.ts b/src/transports/dash/init_segment_loader.ts index 7f4a301ba1..a057bd6add 100644 --- a/src/transports/dash/init_segment_loader.ts +++ b/src/transports/dash/init_segment_loader.ts @@ -43,6 +43,7 @@ export default function initSegmentLoader( options: ISegmentLoaderOptions, cancelSignal: CancellationSignal, callbacks: ISegmentLoaderCallbacks>, + segmentRequestHeaders?: Record | undefined, ): Promise< | ISegmentLoaderResultSegmentLoaded> | ISegmentLoaderResultSegmentCreated> @@ -58,7 +59,10 @@ export default function initSegmentLoader( return request({ url, responseType: "arraybuffer", - headers: cmcdHeaders, + headers: + segmentRequestHeaders === undefined && cmcdHeaders === undefined + ? undefined + : { ...segmentRequestHeaders, ...cmcdHeaders }, timeout: options.timeout, connectionTimeout: options.connectionTimeout, cancelSignal, @@ -70,6 +74,7 @@ export default function initSegmentLoader( return request({ url, headers: { + ...segmentRequestHeaders, ...cmcdHeaders, Range: byteRange(segment.range), }, @@ -86,6 +91,7 @@ export default function initSegmentLoader( return request({ url, headers: { + ...segmentRequestHeaders, ...cmcdHeaders, Range: byteRange([segment.range[0], segment.indexRange[1]]), }, @@ -100,6 +106,7 @@ export default function initSegmentLoader( const rangeRequest$ = request({ url, headers: { + ...segmentRequestHeaders, ...cmcdHeaders, Range: byteRange(segment.range), }, @@ -112,6 +119,7 @@ export default function initSegmentLoader( const indexRequest$ = request({ url, headers: { + ...segmentRequestHeaders, ...cmcdHeaders, Range: byteRange(segment.indexRange), }, diff --git a/src/transports/dash/segment_loader.ts b/src/transports/dash/segment_loader.ts index c8277874ac..b50042ee56 100644 --- a/src/transports/dash/segment_loader.ts +++ b/src/transports/dash/segment_loader.ts @@ -55,6 +55,7 @@ export async function regularSegmentLoader( initialUrl: string, context: ISegmentContext, lowLatencyMode: boolean, + segmentRequestHeaders: Record | undefined, options: ISegmentLoaderOptions, callbacks: ISegmentLoaderCallbacks, cancelSignal: CancellationSignal, @@ -70,6 +71,7 @@ export async function regularSegmentLoader( options, cancelSignal, callbacks, + segmentRequestHeaders, ); } @@ -82,14 +84,18 @@ export async function regularSegmentLoader( options.cmcdPayload?.type === "headers" ? options.cmcdPayload.value : undefined; const { segment } = context; - let headers; + let headers = segmentRequestHeaders; if (segment.range !== undefined) { headers = { + ...segmentRequestHeaders, ...cmcdHeaders, Range: byteRange(segment.range), }; } else if (cmcdHeaders !== undefined) { - headers = cmcdHeaders; + headers = { + ...segmentRequestHeaders, + ...cmcdHeaders, + }; } const containerType = inferSegmentContainer(context.type, context.mimeType); @@ -132,10 +138,12 @@ export async function regularSegmentLoader( export default function generateSegmentLoader({ lowLatencyMode, segmentLoader: customSegmentLoader, + segmentRequestHeaders, checkMediaSegmentIntegrity, }: { lowLatencyMode: boolean; segmentLoader?: ICustomSegmentLoader | undefined; + segmentRequestHeaders?: Record | undefined; checkMediaSegmentIntegrity?: boolean | undefined; }): ISegmentLoader | ArrayBuffer | null> { return checkMediaSegmentIntegrity !== true @@ -174,6 +182,7 @@ export default function generateSegmentLoader({ url, context, lowLatencyMode, + segmentRequestHeaders, options, callbacks, cancelSignal, @@ -276,6 +285,7 @@ export default function generateSegmentLoader({ url, context, lowLatencyMode, + segmentRequestHeaders, options, callbacks, cancelSignal, diff --git a/src/transports/types.ts b/src/transports/types.ts index 5268c31497..e90923108e 100644 --- a/src/transports/types.ts +++ b/src/transports/types.ts @@ -908,6 +908,7 @@ export interface ITransportOptions { referenceDateTime?: number | undefined; representationFilter?: IRepresentationFilter | undefined; segmentLoader?: ICustomSegmentLoader | undefined; + segmentRequestHeaders?: Record | undefined; serverSyncInfos?: IServerSyncInfos | undefined; __priv_manifestUpdateUrl?: string | undefined; __priv_patchLastSegmentInSidx?: boolean | undefined; From 2601177f08a8af35613ae176368f16245c426337 Mon Sep 17 00:00:00 2001 From: Tomasz Oszczepalski Date: Tue, 18 Aug 2026 11:35:58 +0200 Subject: [PATCH 2/2] Simplifying segment headers solution --- src/main_thread/api/option_utils.ts | 5 +---- src/transports/dash/init_segment_loader.ts | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main_thread/api/option_utils.ts b/src/main_thread/api/option_utils.ts index a6d3e1c932..201cae5b5b 100644 --- a/src/main_thread/api/option_utils.ts +++ b/src/main_thread/api/option_utils.ts @@ -569,10 +569,7 @@ function parseLoadVideoOptions(options: ILoadVideoOptions): IParsedLoadVideoOpti referenceDateTime: options.referenceDateTime, representationFilter, segmentLoader, - segmentRequestHeaders: - options.segmentRequestHeaders === undefined - ? undefined - : { ...options.segmentRequestHeaders }, + segmentRequestHeaders: options.segmentRequestHeaders, serverSyncInfos: options.serverSyncInfos, startAt, textTrackElement: textTrackElement as HTMLElement, diff --git a/src/transports/dash/init_segment_loader.ts b/src/transports/dash/init_segment_loader.ts index a057bd6add..c7621602f4 100644 --- a/src/transports/dash/init_segment_loader.ts +++ b/src/transports/dash/init_segment_loader.ts @@ -60,8 +60,8 @@ export default function initSegmentLoader( url, responseType: "arraybuffer", headers: - segmentRequestHeaders === undefined && cmcdHeaders === undefined - ? undefined + segmentRequestHeaders === undefined + ? cmcdHeaders : { ...segmentRequestHeaders, ...cmcdHeaders }, timeout: options.timeout, connectionTimeout: options.connectionTimeout,