@@ -330,6 +330,28 @@ function MediaController() {
330330 } ;
331331 }
332332
333+ function getTracksWithHighestSelectionPriority ( trackArr ) {
334+ let max = 0 ;
335+ let result = [ ] ;
336+
337+ trackArr . forEach ( ( track ) => {
338+ if ( ! isNaN ( track . selectionPriority ) ) {
339+ // Higher max value. Reset list and add new entry
340+ if ( track . selectionPriority > max ) {
341+ max = track . selectionPriority ;
342+ result = [ track ] ;
343+ }
344+ // Same max value add to list
345+ else if ( track . selectionPriority === max ) {
346+ result . push ( track ) ;
347+ }
348+
349+ }
350+ } )
351+
352+ return result ;
353+ }
354+
333355 function getTracksWithHighestBitrate ( trackArr ) {
334356 let max = 0 ;
335357 let result = [ ] ;
@@ -402,45 +424,87 @@ function MediaController() {
402424 if ( type === Constants . TEXT ) return tracks [ 0 ] ;
403425
404426 let mode = settings . get ( ) . streaming . selectionModeForInitialTrack ;
405- let tmpArr = [ ] ;
427+ let tmpArr ;
406428
407429 if ( customInitialTrackSelectionFunction && typeof customInitialTrackSelectionFunction === 'function' ) {
408430 tmpArr = customInitialTrackSelectionFunction ( tracks ) ;
409431 } else {
410432 switch ( mode ) {
433+ case Constants . TRACK_SELECTION_MODE_HIGHEST_SELECTION_PRIORITY :
434+ tmpArr = _trackSelectionModeHighestSelectionPriority ( tracks ) ;
435+ break ;
411436 case Constants . TRACK_SELECTION_MODE_HIGHEST_BITRATE :
412- tmpArr = getTracksWithHighestBitrate ( tracks ) ;
413-
414- if ( tmpArr . length > 1 ) {
415- tmpArr = getTracksWithWidestRange ( tmpArr ) ;
416- }
437+ tmpArr = _trackSelectionModeHighestBitrate ( tracks ) ;
417438 break ;
418439 case Constants . TRACK_SELECTION_MODE_FIRST_TRACK :
419- tmpArr . push ( tracks [ 0 ] ) ;
440+ tmpArr = _trackSelectionModeFirstTrack ( tracks ) ;
420441 break ;
421442 case Constants . TRACK_SELECTION_MODE_HIGHEST_EFFICIENCY :
422- tmpArr = getTracksWithHighestEfficiency ( tracks ) ;
423-
424- if ( tmpArr . length > 1 ) {
425- tmpArr = getTracksWithHighestBitrate ( tmpArr ) ;
426- }
443+ tmpArr = _trackSelectionModeHighestEfficiency ( tracks ) ;
427444 break ;
428445 case Constants . TRACK_SELECTION_MODE_WIDEST_RANGE :
429- tmpArr = getTracksWithWidestRange ( tracks ) ;
430-
431- if ( tmpArr . length > 1 ) {
432- tmpArr = getTracksWithHighestBitrate ( tracks ) ;
433- }
446+ tmpArr = _trackSelectionModeWidestRange ( tracks ) ;
434447 break ;
435448 default :
436- logger . warn ( 'Track selection mode is not supported: ' + mode ) ;
449+ logger . warn ( `Track selection mode ${ mode } is not supported. Falling back to TRACK_SELECTION_MODE_FIRST_TRACK` ) ;
450+ tmpArr = _trackSelectionModeFirstTrack ( tracks ) ;
437451 break ;
438452 }
439453 }
440454
441- return tmpArr [ 0 ] ;
455+ return tmpArr . length > 0 ? tmpArr [ 0 ] : tracks [ 0 ] ;
442456 }
443457
458+
459+ function _trackSelectionModeHighestSelectionPriority ( tracks ) {
460+ let tmpArr = getTracksWithHighestSelectionPriority ( tracks ) ;
461+
462+ if ( tmpArr . length > 1 ) {
463+ tmpArr = getTracksWithHighestBitrate ( tmpArr ) ;
464+ }
465+
466+ if ( tmpArr . length > 1 ) {
467+ tmpArr = getTracksWithWidestRange ( tmpArr ) ;
468+ }
469+
470+ return tmpArr ;
471+ }
472+
473+ function _trackSelectionModeHighestBitrate ( tracks ) {
474+ let tmpArr = getTracksWithHighestBitrate ( tracks ) ;
475+
476+ if ( tmpArr . length > 1 ) {
477+ tmpArr = getTracksWithWidestRange ( tmpArr ) ;
478+ }
479+
480+ return tmpArr ;
481+ }
482+
483+ function _trackSelectionModeFirstTrack ( tracks ) {
484+ return tracks [ 0 ] ;
485+ }
486+
487+ function _trackSelectionModeHighestEfficiency ( tracks ) {
488+ let tmpArr = getTracksWithHighestEfficiency ( tracks ) ;
489+
490+ if ( tmpArr . length > 1 ) {
491+ tmpArr = getTracksWithHighestBitrate ( tmpArr ) ;
492+ }
493+
494+ return tmpArr ;
495+ }
496+
497+ function _trackSelectionModeWidestRange ( tracks ) {
498+ let tmpArr = getTracksWithWidestRange ( tracks ) ;
499+
500+ if ( tmpArr . length > 1 ) {
501+ tmpArr = getTracksWithHighestBitrate ( tracks ) ;
502+ }
503+
504+ return tmpArr ;
505+ }
506+
507+
444508 function createTrackInfo ( ) {
445509 return {
446510 audio : {
0 commit comments