@@ -225,15 +225,34 @@ function withHTMLSubtitles(Video) {
225
225
if ( selectedTrack ) {
226
226
selectedTrackId = selectedTrack . id ;
227
227
delay = 0 ;
228
- function loadSubtitleFromUrl ( url , isFallback ) {
229
- fetch ( url )
230
- . then ( function ( resp ) {
231
- if ( resp . ok ) {
232
- return resp . text ( ) ;
233
- }
234
228
235
- throw new Error ( resp . status + ' (' + resp . statusText + ')' ) ;
236
- } )
229
+ function getSubtitlesData ( track ) {
230
+ if ( typeof track . url === 'string' ) {
231
+ return fetch ( track . url )
232
+ . then ( function ( resp ) {
233
+ if ( resp . ok ) {
234
+ return resp . text ( ) ;
235
+ }
236
+
237
+ throw new Error ( resp . status + ' (' + resp . statusText + ')' ) ;
238
+ } ) ;
239
+ }
240
+
241
+ if ( track . buffer instanceof ArrayBuffer ) {
242
+ try {
243
+ const uInt8Array = new Uint8Array ( track . buffer ) ;
244
+ const text = new TextDecoder ( ) . decode ( uInt8Array ) ;
245
+ return Promise . resolve ( text ) ;
246
+ } catch ( e ) {
247
+ return Promise . reject ( e ) ;
248
+ }
249
+ }
250
+
251
+ return Promise . reject ( 'No `url` or `buffer` field available for this track' ) ;
252
+ }
253
+
254
+ function loadSubtitles ( track , isFallback ) {
255
+ getSubtitlesData ( track )
237
256
. then ( function ( text ) {
238
257
return subtitlesConverter . convert ( text ) ;
239
258
} )
@@ -255,7 +274,7 @@ function withHTMLSubtitles(Video) {
255
274
}
256
275
257
276
if ( ! isFallback && typeof selectedTrack . fallbackUrl === 'string' ) {
258
- loadSubtitleFromUrl ( selectedTrack . fallbackUrl , true ) ;
277
+ loadSubtitles ( selectedTrack , true ) ;
259
278
return ;
260
279
}
261
280
@@ -266,7 +285,7 @@ function withHTMLSubtitles(Video) {
266
285
} ) ) ;
267
286
} ) ;
268
287
}
269
- loadSubtitleFromUrl ( selectedTrack . url ) ;
288
+ loadSubtitles ( selectedTrack ) ;
270
289
}
271
290
renderSubtitles ( ) ;
272
291
onPropChanged ( 'selectedExtraSubtitlesTrackId' ) ;
@@ -374,7 +393,6 @@ function withHTMLSubtitles(Video) {
374
393
. filter ( function ( track , index , tracks ) {
375
394
return track &&
376
395
typeof track . id === 'string' &&
377
- typeof track . url === 'string' &&
378
396
typeof track . lang === 'string' &&
379
397
typeof track . label === 'string' &&
380
398
typeof track . origin === 'string' &&
@@ -386,6 +404,31 @@ function withHTMLSubtitles(Video) {
386
404
387
405
return true ;
388
406
}
407
+ case 'addLocalSubtitles' : {
408
+ if ( commandArgs && typeof commandArgs . filename === 'string' && commandArgs . buffer instanceof ArrayBuffer ) {
409
+ var id = 'LOCAL_' + tracks
410
+ . filter ( function ( track ) { return track . local ; } )
411
+ . length ;
412
+
413
+ var track = {
414
+ id : id ,
415
+ url : null ,
416
+ buffer : commandArgs . buffer ,
417
+ lang : 'local' ,
418
+ label : commandArgs . filename ,
419
+ origin : 'LOCAL' ,
420
+ local : true ,
421
+ embedded : false ,
422
+ } ;
423
+
424
+ tracks . push ( track ) ;
425
+
426
+ onPropChanged ( 'extraSubtitlesTracks' ) ;
427
+ events . emit ( 'extraSubtitlesTrackAdded' , track ) ;
428
+ }
429
+
430
+ return true ;
431
+ }
389
432
case 'load' : {
390
433
command ( 'unload' ) ;
391
434
if ( commandArgs . stream && Array . isArray ( commandArgs . stream . subtitles ) ) {
@@ -485,9 +528,9 @@ function withHTMLSubtitles(Video) {
485
528
external : Video . manifest . external ,
486
529
props : Video . manifest . props . concat ( [ 'extraSubtitlesTracks' , 'selectedExtraSubtitlesTrackId' , 'extraSubtitlesDelay' , 'extraSubtitlesSize' , 'extraSubtitlesOffset' , 'extraSubtitlesTextColor' , 'extraSubtitlesBackgroundColor' , 'extraSubtitlesOutlineColor' , 'extraSubtitlesOpacity' ] )
487
530
. filter ( function ( value , index , array ) { return array . indexOf ( value ) === index ; } ) ,
488
- commands : Video . manifest . commands . concat ( [ 'load' , 'unload' , 'destroy' , 'addExtraSubtitlesTracks' ] )
531
+ commands : Video . manifest . commands . concat ( [ 'load' , 'unload' , 'destroy' , 'addExtraSubtitlesTracks' , 'addLocalSubtitles' ] )
489
532
. filter ( function ( value , index , array ) { return array . indexOf ( value ) === index ; } ) ,
490
- events : Video . manifest . events . concat ( [ 'propValue' , 'propChanged' , 'error' , 'extraSubtitlesTrackLoaded' ] )
533
+ events : Video . manifest . events . concat ( [ 'propValue' , 'propChanged' , 'error' , 'extraSubtitlesTrackLoaded' , 'extraSubtitlesTrackAdded' ] )
491
534
. filter ( function ( value , index , array ) { return array . indexOf ( value ) === index ; } )
492
535
} ;
493
536
0 commit comments