4646import static org .schabi .newpipe .player .helper .PlayerHelper .MinimizeMode .MINIMIZE_ON_EXIT_MODE_NONE ;
4747import static org .schabi .newpipe .player .helper .PlayerHelper .MinimizeMode .MINIMIZE_ON_EXIT_MODE_POPUP ;
4848import static org .schabi .newpipe .player .helper .PlayerHelper .buildCloseOverlayLayoutParams ;
49- import static org .schabi .newpipe .player .helper .PlayerHelper .captionLanguageStemOf ;
5049import static org .schabi .newpipe .player .helper .PlayerHelper .formatSpeed ;
5150import static org .schabi .newpipe .player .helper .PlayerHelper .getMinimizeOnExitAction ;
5251import static org .schabi .newpipe .player .helper .PlayerHelper .getMinimumVideoHeight ;
138137import com .google .android .exoplayer2 .Timeline ;
139138import com .google .android .exoplayer2 .TracksInfo ;
140139import com .google .android .exoplayer2 .source .MediaSource ;
141- import com .google .android .exoplayer2 .source .TrackGroup ;
142140import com .google .android .exoplayer2 .text .Cue ;
143141import com .google .android .exoplayer2 .trackselection .DefaultTrackSelector ;
144142import com .google .android .exoplayer2 .trackselection .MappingTrackSelector ;
212210import org .schabi .newpipe .views .ExpandableSurfaceView ;
213211import org .schabi .newpipe .views .player .PlayerFastSeekOverlay ;
214212
215- import java .util .ArrayList ;
216213import java .util .Collections ;
217214import java .util .List ;
218215import java .util .Objects ;
@@ -3539,12 +3536,18 @@ private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {
35393536 captionItem .setOnMenuItemClickListener (menuItem -> {
35403537 final int textRendererIndex = getCaptionRendererIndex ();
35413538 if (textRendererIndex != RENDERER_UNAVAILABLE ) {
3542- // DefaultTrackSelector will select for tracks with similar language names
3543- // if a track of userPreferredLanguage is not found
3544- // This means (auto-generated) will be resolved automatically.
3539+ // DefaultTrackSelector will select for text tracks in the following order.
3540+ // When multiple tracks share the same rank, a random track will be chosen.
3541+ // 1. ANY track exactly matching preferred language name
3542+ // 2. ANY track exactly matching preferred language stem
3543+ // 3. ROLE_FLAG_CAPTION track matching preferred language stem
3544+ // 4. ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND track matching preferred language stem
3545+ // This means if a caption track of preferred language is not available,
3546+ // then an auto-generated track of that language will be chosen automatically.
35453547 trackSelector .setParameters (trackSelector .buildUponParameters ()
35463548 .setPreferredTextLanguages (captionLanguage ,
3547- captionLanguageStemOf (captionLanguage ))
3549+ PlayerHelper .captionLanguageStemOf (captionLanguage ))
3550+ .setPreferredTextRoleFlags (C .ROLE_FLAG_CAPTION )
35483551 .setRendererDisabled (textRendererIndex , false ));
35493552 prefs .edit ().putString (context .getString (R .string .caption_user_set_key ),
35503553 captionLanguage ).apply ();
@@ -3561,12 +3564,12 @@ private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {
35613564 final int textRendererIndex = getCaptionRendererIndex ();
35623565
35633566 if (userPreferredLanguage != null
3564- && availableLanguages .contains (userPreferredLanguage )
35653567 && !selectedPreferredLanguages .contains (userPreferredLanguage )
35663568 && textRendererIndex != RENDERER_UNAVAILABLE ) {
35673569 trackSelector .setParameters (trackSelector .buildUponParameters ()
35683570 .setPreferredTextLanguages (userPreferredLanguage ,
3569- captionLanguageStemOf (userPreferredLanguage ))
3571+ PlayerHelper .captionLanguageStemOf (userPreferredLanguage ))
3572+ .setPreferredTextRoleFlags (C .ROLE_FLAG_CAPTION )
35703573 .setRendererDisabled (textRendererIndex , false ));
35713574 }
35723575 }
@@ -3681,13 +3684,11 @@ private void onTextTracksChanged(@NonNull final TracksInfo currentTrackInfo) {
36813684 .stream ()
36823685 .filter (trackGroupInfo -> C .TRACK_TYPE_TEXT == trackGroupInfo .getTrackType ())
36833686 .collect (Collectors .toList ());
3684- final List <String > availableLanguages = new ArrayList <>(textTracks .size ());
3685- for (int i = 0 ; i < textTracks .size (); i ++) {
3686- final TrackGroup textTrack = textTracks .get (i ).getTrackGroup ();
3687- if (textTrack .length > 0 ) {
3688- availableLanguages .add (textTrack .getFormat (0 ).language );
3689- }
3690- }
3687+ final List <String > availableLanguages = textTracks .stream ()
3688+ .map (TracksInfo .TrackGroupInfo ::getTrackGroup )
3689+ .filter (textTrack -> textTrack .length > 0 )
3690+ .map (textTrack -> textTrack .getFormat (0 ).language )
3691+ .collect (Collectors .toList ());
36913692
36923693 // Find selected text track
36933694 final Optional <Format > selectedTracks = textTracks .stream ()
0 commit comments