@@ -8,11 +8,7 @@ import {
88import { MetadataSchema } from '../types/demuxer' ;
99import { hexToArrayBuffer } from '../utils/hex' ;
1010import { stringify } from '../utils/safe-json-stringify' ;
11- import {
12- clearCurrentCues ,
13- removeCuesInRange ,
14- sendAddTrackEvent ,
15- } from '../utils/texttrack-utils' ;
11+ import { createTrackNode , removeCuesInRange } from '../utils/texttrack-utils' ;
1612import type { MediaFragment } from '../hls' ;
1713import type Hls from '../hls' ;
1814import type { DateRange } from '../loader/date-range' ;
@@ -77,7 +73,7 @@ const MAX_CUE_ENDTIME = (() => {
7773
7874class ID3TrackController implements ComponentAPI {
7975 private hls : Hls | null ;
80- private id3Track : TextTrack | null = null ;
76+ private id3Track : HTMLTrackElement | null = null ;
8177 private media : HTMLMediaElement | null = null ;
8278 private dateRangeCuesAppended : Record <
8379 string ,
@@ -146,9 +142,6 @@ class ID3TrackController implements ComponentAPI {
146142 data : MediaAttachingData ,
147143 ) : void {
148144 this . media = data . media ;
149- if ( data . overrides ?. cueRemoval === false ) {
150- this . removeCues = false ;
151- }
152145 }
153146
154147 private onMediaAttached ( ) {
@@ -168,9 +161,7 @@ class ID3TrackController implements ComponentAPI {
168161 return ;
169162 }
170163 if ( this . id3Track ) {
171- if ( this . removeCues ) {
172- clearCurrentCues ( this . id3Track , this . onEventCueEnter ) ;
173- }
164+ this . id3Track . remove ( ) ;
174165 this . id3Track = null ;
175166 }
176167 this . dateRangeCuesAppended = { } ;
@@ -180,27 +171,8 @@ class ID3TrackController implements ComponentAPI {
180171 this . dateRangeCuesAppended = { } ;
181172 }
182173
183- private createTrack ( media : HTMLMediaElement ) : TextTrack {
184- const track = this . getID3Track ( media . textTracks ) as TextTrack ;
185- track . mode = 'hidden' ;
186- return track ;
187- }
188-
189- private getID3Track ( textTracks : TextTrackList ) : TextTrack | void {
190- if ( ! this . media ) {
191- return ;
192- }
193- for ( let i = 0 ; i < textTracks . length ; i ++ ) {
194- const textTrack : TextTrack = textTracks [ i ] ;
195- if ( textTrack . kind === 'metadata' && textTrack . label === 'id3' ) {
196- // send 'addtrack' when reusing the textTrack for metadata,
197- // same as what we do for captions
198- sendAddTrackEvent ( textTrack , this . media ) ;
199-
200- return textTrack ;
201- }
202- }
203- return this . media . addTextTrack ( 'metadata' , 'id3' ) ;
174+ private createTrack ( media : HTMLMediaElement ) : HTMLTrackElement {
175+ return createTrackNode ( media , 'metadata' , 'id3' , '' , 'hidden' ) ;
204176 }
205177
206178 private onFragParsingMetadata (
@@ -264,15 +236,15 @@ class ID3TrackController implements ComponentAPI {
264236 type ,
265237 ) ;
266238 if ( cue ) {
267- this . id3Track . addCue ( cue ) ;
239+ this . id3Track . track . addCue ( cue ) ;
268240 }
269241 }
270242 }
271243 }
272244 }
273245
274246 private updateId3CueEnds ( startTime : number , type : MetadataSchema ) {
275- const cues = this . id3Track ?. cues ;
247+ const cues = this . id3Track ?. track . cues ;
276248 if ( cues ) {
277249 for ( let i = cues . length ; i -- ; ) {
278250 const cue = cues [ i ] as any ;
@@ -315,7 +287,7 @@ class ID3TrackController implements ComponentAPI {
315287 enableID3MetadataCues ) ||
316288 ( ( cue as any ) . type === MetadataSchema . emsg && enableEmsgMetadataCues ) ;
317289 }
318- removeCuesInRange ( id3Track , startOffset , endOffset , predicate ) ;
290+ removeCuesInRange ( id3Track . track , startOffset , endOffset , predicate ) ;
319291 }
320292 }
321293
@@ -372,7 +344,7 @@ class ID3TrackController implements ComponentAPI {
372344 if ( cue ) {
373345 cue . id = assetPlayerId ;
374346 this . id3Track ||= this . createTrack ( this . media ) ;
375- this . id3Track . addCue ( cue ) ;
347+ this . id3Track . track . addCue ( cue ) ;
376348 cue . addEventListener ( 'enter' , this . onEventCueEnter ) ;
377349 }
378350 }
@@ -387,7 +359,7 @@ class ID3TrackController implements ComponentAPI {
387359 let dateRangeCuesAppended = this . dateRangeCuesAppended ;
388360 // Remove cues from track not found in details.dateRanges
389361 if ( id3Track && removeOldCues ) {
390- if ( id3Track . cues ?. length ) {
362+ if ( id3Track . track . cues ?. length ) {
391363 const idsToRemove = Object . keys ( dateRangeCuesAppended ) . filter (
392364 ( id ) => ! ids . includes ( id ) ,
393365 ) ;
@@ -401,7 +373,7 @@ class ID3TrackController implements ComponentAPI {
401373 if ( cue ) {
402374 cue . removeEventListener ( 'enter' , this . onEventCueEnter ) ;
403375 try {
404- id3Track . removeCue ( cue ) ;
376+ id3Track . track . removeCue ( cue ) ;
405377 } catch ( e ) {
406378 /* no-op */
407379 }
@@ -492,7 +464,7 @@ class ID3TrackController implements ComponentAPI {
492464 ) ;
493465 if ( cue ) {
494466 cue . id = id ;
495- this . id3Track . addCue ( cue ) ;
467+ this . id3Track . track . addCue ( cue ) ;
496468 cues [ key ] = cue ;
497469 if ( __USE_INTERSTITIALS__ && interstitialsController ) {
498470 if ( key === 'X-ASSET-LIST' || key === 'X-ASSET-URL' ) {
0 commit comments