Skip to content

Commit 9818f17

Browse files
committed
fixed: auto-generated captions to have lower selection priority as manual captions.
1 parent 55fc3fc commit 9818f17

2 files changed

Lines changed: 22 additions & 16 deletions

File tree

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

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_NONE;
4747
import static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_POPUP;
4848
import static org.schabi.newpipe.player.helper.PlayerHelper.buildCloseOverlayLayoutParams;
49-
import static org.schabi.newpipe.player.helper.PlayerHelper.captionLanguageStemOf;
5049
import static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed;
5150
import static org.schabi.newpipe.player.helper.PlayerHelper.getMinimizeOnExitAction;
5251
import static org.schabi.newpipe.player.helper.PlayerHelper.getMinimumVideoHeight;
@@ -138,7 +137,6 @@
138137
import com.google.android.exoplayer2.Timeline;
139138
import com.google.android.exoplayer2.TracksInfo;
140139
import com.google.android.exoplayer2.source.MediaSource;
141-
import com.google.android.exoplayer2.source.TrackGroup;
142140
import com.google.android.exoplayer2.text.Cue;
143141
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
144142
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
@@ -212,7 +210,6 @@
212210
import org.schabi.newpipe.views.ExpandableSurfaceView;
213211
import org.schabi.newpipe.views.player.PlayerFastSeekOverlay;
214212

215-
import java.util.ArrayList;
216213
import java.util.Collections;
217214
import java.util.List;
218215
import 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()

app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import androidx.annotation.NonNull;
77
import androidx.annotation.Nullable;
88

9+
import com.google.android.exoplayer2.C;
910
import com.google.android.exoplayer2.MediaItem;
1011
import com.google.android.exoplayer2.source.MediaSource;
1112
import com.google.android.exoplayer2.source.MergingMediaSource;
@@ -116,9 +117,13 @@ public MediaSource resolve(@NonNull final StreamInfo info) {
116117
if (mimeType == null) {
117118
continue;
118119
}
120+
final @C.RoleFlags int textRoleFlag = subtitle.isAutoGenerated()
121+
? C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND
122+
: C.ROLE_FLAG_CAPTION;
119123
final MediaItem.SubtitleConfiguration textMediaItem =
120124
new MediaItem.SubtitleConfiguration.Builder(Uri.parse(subtitle.getUrl()))
121125
.setMimeType(mimeType)
126+
.setRoleFlags(textRoleFlag)
122127
.setLanguage(PlayerHelper.captionLanguageOf(context, subtitle))
123128
.build();
124129
final MediaSource textSource = dataSource

0 commit comments

Comments
 (0)