Skip to content

Commit 724eac9

Browse files
committed
fixed: player caption auto-selection not reflected in gui.
fixed: player caption selection skipping on multiple language variants.
1 parent a528cee commit 724eac9

1 file changed

Lines changed: 43 additions & 46 deletions

File tree

app/src/main/java/org/schabi/newpipe/player/Player.java

Lines changed: 43 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
import static org.schabi.newpipe.util.ListHelper.getPopupResolutionIndex;
6363
import static org.schabi.newpipe.util.ListHelper.getResolutionIndex;
6464
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
65-
import static org.schabi.newpipe.util.Localization.containsCaseInsensitive;
6665
import static java.util.concurrent.TimeUnit.MILLISECONDS;
6766

6867
import android.animation.Animator;
@@ -130,6 +129,7 @@
130129
import com.google.android.exoplayer2.C;
131130
import com.google.android.exoplayer2.DefaultRenderersFactory;
132131
import com.google.android.exoplayer2.ExoPlayer;
132+
import com.google.android.exoplayer2.Format;
133133
import com.google.android.exoplayer2.PlaybackException;
134134
import com.google.android.exoplayer2.PlaybackParameters;
135135
import com.google.android.exoplayer2.Player.PositionInfo;
@@ -138,7 +138,6 @@
138138
import com.google.android.exoplayer2.TracksInfo;
139139
import com.google.android.exoplayer2.source.MediaSource;
140140
import com.google.android.exoplayer2.source.TrackGroup;
141-
import com.google.android.exoplayer2.source.TrackGroupArray;
142141
import com.google.android.exoplayer2.text.Cue;
143142
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
144143
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
@@ -2530,7 +2529,7 @@ public void onTracksInfoChanged(@NonNull final TracksInfo tracksInfo) {
25302529
Log.d(TAG, "ExoPlayer - onTracksChanged(), "
25312530
+ "track group size = " + tracksInfo.getTrackGroupInfos().size());
25322531
}
2533-
onTextTracksChanged();
2532+
onTextTracksChanged(tracksInfo);
25342533
}
25352534

25362535
@Override
@@ -3516,17 +3515,7 @@ private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {
35163515
return;
35173516
}
35183517
captionPopupMenu.getMenu().removeGroup(POPUP_MENU_ID_CAPTION);
3519-
3520-
final String userPreferredLanguage =
3521-
prefs.getString(context.getString(R.string.caption_user_set_key), null);
3522-
/*
3523-
* only search for autogenerated cc as fallback
3524-
* if "(auto-generated)" was not already selected
3525-
* we are only looking for "(" instead of "(auto-generated)" to hopefully get all
3526-
* internationalized variants such as "(automatisch-erzeugt)" and so on
3527-
*/
3528-
boolean searchForAutogenerated = userPreferredLanguage != null
3529-
&& !userPreferredLanguage.contains("(");
3518+
captionPopupMenu.setOnDismissListener(this);
35303519

35313520
// Add option for turning off caption
35323521
final MenuItem captionOffItem = captionPopupMenu.getMenu().add(POPUP_MENU_ID_CAPTION,
@@ -3549,6 +3538,9 @@ private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {
35493538
captionItem.setOnMenuItemClickListener(menuItem -> {
35503539
final int textRendererIndex = getCaptionRendererIndex();
35513540
if (textRendererIndex != RENDERER_UNAVAILABLE) {
3541+
// DefaultTrackSelector will select for tracks with similar language names
3542+
// if a track of userPreferredLanguage is not found
3543+
// This means (auto-generated) will be resolved automatically.
35523544
trackSelector.setParameters(trackSelector.buildUponParameters()
35533545
.setPreferredTextLanguage(captionLanguage)
35543546
.setRendererDisabled(textRendererIndex, false));
@@ -3557,22 +3549,23 @@ private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {
35573549
}
35583550
return true;
35593551
});
3560-
// apply caption language from previous user preference
3561-
if (userPreferredLanguage != null
3562-
&& (captionLanguage.equals(userPreferredLanguage)
3563-
|| (searchForAutogenerated && captionLanguage.startsWith(userPreferredLanguage))
3564-
|| (userPreferredLanguage.contains("(") && captionLanguage.startsWith(
3565-
userPreferredLanguage.substring(0, userPreferredLanguage.indexOf('(')))))) {
3566-
final int textRendererIndex = getCaptionRendererIndex();
3567-
if (textRendererIndex != RENDERER_UNAVAILABLE) {
3568-
trackSelector.setParameters(trackSelector.buildUponParameters()
3569-
.setPreferredTextLanguage(captionLanguage)
3570-
.setRendererDisabled(textRendererIndex, false));
3571-
}
3572-
searchForAutogenerated = false;
3573-
}
35743552
}
3575-
captionPopupMenu.setOnDismissListener(this);
3553+
3554+
// apply caption language from previous user preference
3555+
final List<String> selectedPreferredLanguages =
3556+
trackSelector.getParameters().preferredTextLanguages;
3557+
final String userPreferredLanguage =
3558+
prefs.getString(context.getString(R.string.caption_user_set_key), null);
3559+
final int textRendererIndex = getCaptionRendererIndex();
3560+
3561+
if (userPreferredLanguage != null
3562+
&& availableLanguages.contains(userPreferredLanguage)
3563+
&& !selectedPreferredLanguages.contains(userPreferredLanguage)
3564+
&& textRendererIndex != RENDERER_UNAVAILABLE) {
3565+
trackSelector.setParameters(trackSelector.buildUponParameters()
3566+
.setPreferredTextLanguage(userPreferredLanguage)
3567+
.setRendererDisabled(textRendererIndex, false));
3568+
}
35763569
}
35773570

35783571
/**
@@ -3668,41 +3661,45 @@ private void setupSubtitleView() {
36683661
binding.subtitleView.setStyle(captionStyle);
36693662
}
36703663

3671-
private void onTextTracksChanged() {
3672-
final int textRenderer = getCaptionRendererIndex();
3673-
3664+
private void onTextTracksChanged(@NonNull final TracksInfo currentTrackInfo) {
36743665
if (binding == null) {
36753666
return;
36763667
}
3668+
36773669
if (trackSelector.getCurrentMappedTrackInfo() == null
3678-
|| textRenderer == RENDERER_UNAVAILABLE) {
3670+
|| !currentTrackInfo.isTypeSupportedOrEmpty(C.TRACK_TYPE_TEXT)) {
36793671
binding.captionTextView.setVisibility(View.GONE);
36803672
return;
36813673
}
36823674

3683-
final TrackGroupArray textTracks = trackSelector.getCurrentMappedTrackInfo()
3684-
.getTrackGroups(textRenderer);
3685-
36863675
// Extract all loaded languages
3687-
final List<String> availableLanguages = new ArrayList<>(textTracks.length);
3688-
for (int i = 0; i < textTracks.length; i++) {
3689-
final TrackGroup textTrack = textTracks.get(i);
3676+
final List<TracksInfo.TrackGroupInfo> textTracks = currentTrackInfo
3677+
.getTrackGroupInfos()
3678+
.stream()
3679+
.filter(trackGroupInfo -> C.TRACK_TYPE_TEXT == trackGroupInfo.getTrackType())
3680+
.collect(Collectors.toList());
3681+
final List<String> availableLanguages = new ArrayList<>(textTracks.size());
3682+
for (int i = 0; i < textTracks.size(); i++) {
3683+
final TrackGroup textTrack = textTracks.get(i).getTrackGroup();
36903684
if (textTrack.length > 0) {
36913685
availableLanguages.add(textTrack.getFormat(0).language);
36923686
}
36933687
}
36943688

3695-
// Normalize mismatching language strings
3696-
final String preferredLanguage = trackSelector.getParameters()
3697-
.preferredTextLanguages.stream().findFirst().orElse(null);
3689+
// Find selected text track
3690+
final Optional<Format> selectedTracks = textTracks.stream()
3691+
.filter(TracksInfo.TrackGroupInfo::isSelected)
3692+
.filter(info -> info.getTrackGroup().length >= 1)
3693+
.map(info -> info.getTrackGroup().getFormat(0))
3694+
.findFirst();
3695+
36983696
// Build UI
36993697
buildCaptionMenu(availableLanguages);
3700-
if (trackSelector.getParameters().getRendererDisabled(textRenderer)
3701-
|| preferredLanguage == null || (!availableLanguages.contains(preferredLanguage)
3702-
&& !containsCaseInsensitive(availableLanguages, preferredLanguage))) {
3698+
if (trackSelector.getParameters().getRendererDisabled(getCaptionRendererIndex())
3699+
|| !selectedTracks.isPresent()) {
37033700
binding.captionTextView.setText(R.string.caption_none);
37043701
} else {
3705-
binding.captionTextView.setText(preferredLanguage);
3702+
binding.captionTextView.setText(selectedTracks.get().language);
37063703
}
37073704
binding.captionTextView.setVisibility(
37083705
availableLanguages.isEmpty() ? View.GONE : View.VISIBLE);

0 commit comments

Comments
 (0)