From 98fe8306355be8b9e936644597d42456ffaf9b7d Mon Sep 17 00:00:00 2001 From: Arian Moeini Date: Sat, 3 Oct 2026 14:38:37 +0200 Subject: [PATCH] Share inband text tracks with segment loaders --- src/playlist-controller.js | 15 +++++++++------ test/playlist-controller.test.js | 21 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/playlist-controller.js b/src/playlist-controller.js index d4181509f..9e071f906 100644 --- a/src/playlist-controller.js +++ b/src/playlist-controller.js @@ -298,19 +298,22 @@ export class PlaylistController extends videojs.EventTarget { // setup segment loaders // combined audio/video or just video when alternate audio track is selected this.mainSegmentLoader_ = - new SegmentLoader(merge(segmentLoaderSettings, { + new SegmentLoader({ + ...segmentLoaderSettings, segmentMetadataTrack: this.segmentMetadataTrack_, loaderType: 'main' - }), options); + }, options); // alternate audio track this.audioSegmentLoader_ = - new SegmentLoader(merge(segmentLoaderSettings, { + new SegmentLoader({ + ...segmentLoaderSettings, loaderType: 'audio' - }), options); + }, options); this.subtitleSegmentLoader_ = - new VTTSegmentLoader(merge(segmentLoaderSettings, { + new VTTSegmentLoader({ + ...segmentLoaderSettings, loaderType: 'vtt', featuresNativeTextTracks: this.tech_.featuresNativeTextTracks, loadVttJs: () => new Promise((resolve, reject) => { @@ -330,7 +333,7 @@ export class PlaylistController extends videojs.EventTarget { // safe to call multiple times, script will be loaded only once: tech.addWebVttScript_(); }) - }), options); + }, options); const getBandwidth = () => { return this.mainSegmentLoader_.bandwidth; diff --git a/test/playlist-controller.test.js b/test/playlist-controller.test.js index 77dfe527e..5c855fc2a 100644 --- a/test/playlist-controller.test.js +++ b/test/playlist-controller.test.js @@ -108,6 +108,27 @@ const sharedHooks = { QUnit.module('PlaylistController', sharedHooks); +QUnit.test('segment removal clears inband metadata cues created by the controller', function(assert) { + const controller = this.playlistController; + const loader = controller.mainSegmentLoader_; + const cue = {startTime: 2, endTime: 3}; + const track = { + cues: [cue], + removeCue(removedCue) { + this.cues.splice(this.cues.indexOf(removedCue), 1); + } + }; + + controller.inbandTextTracks_.metadataTrack_ = track; + sinon.stub(loader, 'getMediaInfo_').returns({}); + sinon.stub(loader.sourceUpdater_, 'removeAudio').callsFake((start, end, done) => done()); + sinon.stub(loader.sourceUpdater_, 'removeVideo').callsFake((start, end, done) => done()); + + loader.remove(0, 4); + + assert.strictEqual(track.cues.length, 0, 'evicted metadata cue is removed'); +}); + QUnit.test('getAudioTrackPlaylists_ works', function(assert) { const pc = this.playlistController; const mainPlaylist = {playlists: [{uri: 'testing'}]};