From 08beeff40110f08888deaac42ef46e11a37127e1 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 12:56:36 +0000 Subject: [PATCH 1/4] feat(OPTIP-303): bridge inBandMetadataTrackDispatchType to React Native Add inBandMetadataTrackDispatchType property to the TextTrack TypeScript interface and bridge it from native Android and iOS SDKs. - TypeScript: add readonly inBandMetadataTrackDispatchType: string to TextTrack - Android: serialize via TrackListAdapter.fromTextTrack() - iOS: serialize via THEOplayerRCTTrackMetadataAggregator.aggregatedTextTrackInfo() Co-Authored-By: daniel.dallos --- .../src/main/java/com/theoplayer/track/TrackListAdapter.kt | 2 ++ ios/THEOplayerRCTTrackMetadataAggregator.swift | 2 ++ src/api/track/TextTrack.ts | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt b/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt index 27b46dde2..39171f6a3 100644 --- a/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +++ b/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt @@ -26,6 +26,7 @@ private const val PROP_NAME = "name" private const val PROP_ENABLED = "enabled" private const val PROP_SRC = "src" private const val PROP_FORCED = "forced" +private const val PROP_IN_BAND_METADATA_TRACK_DISPATCH_TYPE = "inBandMetadataTrackDispatchType" private const val PROP_CAPTION_CHANNEL = "captionChannel" private const val PROP_AUDIO_SAMPLING_RATE = "audioSamplingRate" private const val PROP_BANDWIDTH = "bandwidth" @@ -71,6 +72,7 @@ object TrackListAdapter { textTrackPayload.putBoolean(PROP_FORCED, textTrack.isForced) // THEOplayer v10.13+ + textTrack.inBandMetadataTrackDispatchType?.let { textTrackPayload.putString(PROP_IN_BAND_METADATA_TRACK_DISPATCH_TYPE, it) } textTrack.captionChannel?.let { textTrackPayload.putInt(PROP_CAPTION_CHANNEL, it) } // Optionally pass cue list. diff --git a/ios/THEOplayerRCTTrackMetadataAggregator.swift b/ios/THEOplayerRCTTrackMetadataAggregator.swift index 8e0700e93..370204599 100644 --- a/ios/THEOplayerRCTTrackMetadataAggregator.swift +++ b/ios/THEOplayerRCTTrackMetadataAggregator.swift @@ -29,6 +29,7 @@ let PROP_CUE_CONTENT: String = "content" let PROP_CUE_CUSTOM_ATTRIBUTES: String = "customAttributes" let PROP_SRC: String = "src" let PROP_FORCED: String = "forced" +let PROP_IN_BAND_METADATA_TRACK_DISPATCH_TYPE: String = "inBandMetadataTrackDispatchType" let PROP_START_DATE: String = "startDate" let PROP_END_DATE: String = "endDate" let PROP_ATTRIBUTE_CLASS: String = "class" @@ -78,6 +79,7 @@ class THEOplayerRCTTrackMetadataAggregator { entry[PROP_TYPE] = textTrack.type entry[PROP_SRC] = textTrack.src entry[PROP_FORCED] = textTrack.forced + entry[PROP_IN_BAND_METADATA_TRACK_DISPATCH_TYPE] = textTrack.inBandMetadataTrackDispatchType // process cues when texttrack contains them if !textTrack.cues.isEmpty { var cueList: [[String:Any]] = [] diff --git a/src/api/track/TextTrack.ts b/src/api/track/TextTrack.ts index 1ddfe517d..ce77c5853 100644 --- a/src/api/track/TextTrack.ts +++ b/src/api/track/TextTrack.ts @@ -150,6 +150,11 @@ export interface TextTrack extends Track { */ readonly forced: boolean; + /** + * The in-band metadata track dispatch type of the text track. + */ + readonly inBandMetadataTrackDispatchType: string; + /** * The closed caption service number of the text track. * From 3f70ed8dd989d14f581468eceb08ab6761bde529 Mon Sep 17 00:00:00 2001 From: "daniel.dallos" Date: Fri, 5 Jun 2026 11:35:52 +0000 Subject: [PATCH 2/4] feat(OPTIP-303): add inBandMetadataTrackDispatchType to fromNativeTextTrack in TrackUtils Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- src/internal/adapter/web/TrackUtils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/internal/adapter/web/TrackUtils.ts b/src/internal/adapter/web/TrackUtils.ts index bd0ff83e0..429b0fd4a 100644 --- a/src/internal/adapter/web/TrackUtils.ts +++ b/src/internal/adapter/web/TrackUtils.ts @@ -41,7 +41,7 @@ export function fromNativeTextTrackList(tracks: NativeTextTrackList): TextTrack[ } export function fromNativeTextTrack(track: NativeTextTrack): TextTrack { - const { id, uid, kind, label, language, mode, type, src, forced, captionChannel } = track; + const { id, uid, kind, label, language, mode, type, src, forced, inBandMetadataTrackDispatchType, captionChannel } = track; return { id, @@ -53,6 +53,7 @@ export function fromNativeTextTrack(track: NativeTextTrack): TextTrack { type, src, forced, + inBandMetadataTrackDispatchType, captionChannel, cues: track.cues ? track.cues.map((cue) => fromNativeCue(cue)) : [], } as TextTrack; From d55fafb4941bcbdffddedf826058d317098602d0 Mon Sep 17 00:00:00 2001 From: "daniel.dallos" Date: Fri, 5 Jun 2026 11:40:28 +0000 Subject: [PATCH 3/4] feat(OPTIP-303): default inBandMetadataTrackDispatchType to empty string for sideloaded tracks Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- ios/THEOplayerRCTTrackMetadataAggregator.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/ios/THEOplayerRCTTrackMetadataAggregator.swift b/ios/THEOplayerRCTTrackMetadataAggregator.swift index 370204599..7799cccf8 100644 --- a/ios/THEOplayerRCTTrackMetadataAggregator.swift +++ b/ios/THEOplayerRCTTrackMetadataAggregator.swift @@ -313,6 +313,7 @@ class THEOplayerRCTTrackMetadataAggregator { track[PROP_LABEL] = trackDescription.label ?? "no label" track[PROP_TYPE] = "webvtt" track[PROP_SRC] = trackDescription.src.absoluteString + track[PROP_IN_BAND_METADATA_TRACK_DISPATCH_TYPE] = "" var cueList: [[String:Any]] = [] var cueIndex = 0 for c in cues { From f9a04d8041a9f81651afcda44f4d4699451594fe Mon Sep 17 00:00:00 2001 From: "daniel.dallos" Date: Fri, 5 Jun 2026 13:44:06 +0000 Subject: [PATCH 4/4] feat(OPTIP-303): default inBandMetadataTrackDispatchType to empty string on Android when null Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- android/src/main/java/com/theoplayer/track/TrackListAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt b/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt index 39171f6a3..7b81c9050 100644 --- a/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +++ b/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt @@ -72,7 +72,7 @@ object TrackListAdapter { textTrackPayload.putBoolean(PROP_FORCED, textTrack.isForced) // THEOplayer v10.13+ - textTrack.inBandMetadataTrackDispatchType?.let { textTrackPayload.putString(PROP_IN_BAND_METADATA_TRACK_DISPATCH_TYPE, it) } + textTrackPayload.putString(PROP_IN_BAND_METADATA_TRACK_DISPATCH_TYPE, textTrack.inBandMetadataTrackDispatchType ?: "") textTrack.captionChannel?.let { textTrackPayload.putInt(PROP_CAPTION_CHANNEL, it) } // Optionally pass cue list.