Skip to content

Commit 14920aa

Browse files
committed
fix: selected caption option not properly showing current selection
1 parent 3301d11 commit 14920aa

6 files changed

Lines changed: 44 additions & 19 deletions

File tree

app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.core.graphics.drawable.IconCompat
1616
import androidx.core.net.toUri
1717
import androidx.media3.common.AudioAttributes
1818
import androidx.media3.common.C
19+
import androidx.media3.common.Format
1920
import androidx.media3.common.PlaybackParameters
2021
import androidx.media3.common.Player
2122
import androidx.media3.common.TrackSelectionOverride
@@ -33,6 +34,7 @@ import com.github.libretube.R
3334
import com.github.libretube.api.obj.ChapterSegment
3435
import com.github.libretube.api.obj.Segment
3536
import com.github.libretube.api.obj.Streams
37+
import com.github.libretube.api.obj.Subtitle
3638
import com.github.libretube.constants.PreferenceKeys
3739
import com.github.libretube.db.DatabaseHolder
3840
import com.github.libretube.db.obj.WatchPosition
@@ -56,7 +58,7 @@ object PlayerHelper {
5658
private const val ACTION_MEDIA_CONTROL = "media_control"
5759
const val CONTROL_TYPE = "control_type"
5860
const val SPONSOR_HIGHLIGHT_CATEGORY = "poi_highlight"
59-
const val ROLE_FLAG_AUTO_GEN_SUBTITLE = C.ROLE_FLAG_SUPPLEMENTARY
61+
private const val ROLE_FLAG_AUTO_GEN_SUBTITLE = C.ROLE_FLAG_SUPPLEMENTARY
6062
private const val MINIMUM_BUFFER_DURATION = 1000 * 10 // exo default is 50s
6163
const val WATCH_POSITION_TIMER_DELAY_MS = 1000L
6264

@@ -670,6 +672,28 @@ object PlayerHelper {
670672
}
671673
}
672674

675+
fun getCurrentPlayedCaptionFormat(player: Player): Format? {
676+
for (trackGroup in player.currentTracks.groups) {
677+
if (trackGroup.type != C.TRACK_TYPE_TEXT) continue
678+
679+
for (i in 0 until trackGroup.length) {
680+
if (trackGroup.isTrackSelected(i)) return trackGroup.getTrackFormat(i)
681+
}
682+
}
683+
684+
return null
685+
}
686+
687+
fun getSubtitleRoleFlags(subtitle: Subtitle?): Int {
688+
if (subtitle?.code == null) return 0
689+
690+
return if (subtitle.autoGenerated != true) {
691+
C.ROLE_FLAG_CAPTION
692+
} else {
693+
ROLE_FLAG_AUTO_GEN_SUBTITLE
694+
}
695+
}
696+
673697
/**
674698
* Get the track type string resource corresponding to ExoPlayer role flags used for audio
675699
* track types.

app/src/main/java/com/github/libretube/services/AbstractPlayerService.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import com.github.libretube.extensions.parcelableExtra
3232
import com.github.libretube.extensions.toastFromMainThread
3333
import com.github.libretube.extensions.updateParameters
3434
import com.github.libretube.helpers.PlayerHelper
35+
import com.github.libretube.helpers.PlayerHelper.getSubtitleRoleFlags
3536
import com.github.libretube.ui.activities.MainActivity
3637
import com.github.libretube.util.NowPlayingNotification
3738
import com.github.libretube.util.PauseableTimer
@@ -169,8 +170,7 @@ abstract class AbstractPlayerService : MediaLibraryService(), MediaLibrarySessio
169170
val subtitle: Subtitle? = args.parcelable(PlayerCommand.SET_SUBTITLE.name)
170171

171172
trackSelector?.updateParameters {
172-
val roleFlags =
173-
if (subtitle?.code != null) getSubtitleRoleFlags(subtitle) else 0
173+
val roleFlags = getSubtitleRoleFlags(subtitle)
174174
setPreferredTextRoleFlags(roleFlags)
175175
setPreferredTextLanguage(subtitle?.code)
176176
}
@@ -190,14 +190,6 @@ abstract class AbstractPlayerService : MediaLibraryService(), MediaLibrarySessio
190190
}
191191
}
192192

193-
fun getSubtitleRoleFlags(subtitle: Subtitle?): Int {
194-
return if (subtitle?.autoGenerated != true) {
195-
C.ROLE_FLAG_CAPTION
196-
} else {
197-
PlayerHelper.ROLE_FLAG_AUTO_GEN_SUBTITLE
198-
}
199-
}
200-
201193
/**
202194
* Update the [videoId] to the new videoId and change the playlist metadata
203195
* to reflect that videoId change

app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.github.libretube.extensions.toastFromMainDispatcher
2626
import com.github.libretube.extensions.toastFromMainThread
2727
import com.github.libretube.helpers.PlayerHelper
2828
import com.github.libretube.helpers.PlayerHelper.checkForSegments
29+
import com.github.libretube.helpers.PlayerHelper.getSubtitleRoleFlags
2930
import com.github.libretube.helpers.PreferenceHelper
3031
import com.github.libretube.helpers.ProxyHelper
3132
import com.github.libretube.parcelable.PlayerData

app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,10 @@ class PlayerFragment : Fragment(R.layout.fragment_player), OnlinePlayerOptions {
335335
}
336336

337337
// JSON-encode as work-around for https://github.com/androidx/media/issues/564
338-
val segments: List<Segment>? = mediaMetadata.extras?.getString(IntentData.segments)?.let {
339-
JsonHelper.json.decodeFromString(it)
340-
}
338+
val segments: List<Segment>? =
339+
mediaMetadata.extras?.getString(IntentData.segments)?.let {
340+
JsonHelper.json.decodeFromString(it)
341+
}
341342
viewModel.segments.postValue(segments.orEmpty())
342343
}
343344

@@ -521,9 +522,10 @@ class PlayerFragment : Fragment(R.layout.fragment_player), OnlinePlayerOptions {
521522
if (!startNewSession) {
522523
// JSON-encode as work-around for https://github.com/androidx/media/issues/564
523524
val streams: Streams? =
524-
playerController.mediaMetadata.extras?.getString(IntentData.streams)?.let { json ->
525-
JsonHelper.json.decodeFromString(json)
526-
}
525+
playerController.mediaMetadata.extras?.getString(IntentData.streams)
526+
?.let { json ->
527+
JsonHelper.json.decodeFromString(json)
528+
}
527529

528530
// reload the streams data and playback, metadata apparently no longer exists
529531
if (streams == null) {
@@ -1296,7 +1298,11 @@ class PlayerFragment : Fragment(R.layout.fragment_player), OnlinePlayerOptions {
12961298
BaseBottomSheet()
12971299
.setSimpleItems(
12981300
subtitles.map { it.getDisplayName(requireContext()) },
1299-
preselectedItem = subtitles.firstOrNull { it == viewModel.currentSubtitle }
1301+
preselectedItem = subtitles.firstOrNull {
1302+
val roleFlags = PlayerHelper.getSubtitleRoleFlags(it)
1303+
val currentSubtitle = PlayerHelper.getCurrentPlayedCaptionFormat(playerController)
1304+
it.code == currentSubtitle?.language && currentSubtitle?.roleFlags == roleFlags
1305+
}
13001306
?.getDisplayName(requireContext()) ?: getString(R.string.none)
13011307
) { index ->
13021308
val subtitle = subtitles.getOrNull(index) ?: return@setSimpleItems

app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import com.github.libretube.helpers.PlayerHelper
1111
class PlayerViewModel : ViewModel() {
1212

1313
var segments = MutableLiveData<List<Segment>>()
14+
// this is only used to restore the subtitle after leaving PiP, the actual caption state
15+
// should always be read from the player's selected tracks!
1416
var currentSubtitle = Subtitle(code = PlayerHelper.defaultSubtitleCode)
1517
var sponsorBlockConfig = PlayerHelper.getSponsorBlockCategories()
1618

app/src/main/java/com/github/libretube/ui/views/OnlinePlayerView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class OnlinePlayerView(
7676
context.getString(R.string.captions),
7777
R.drawable.ic_caption,
7878
{
79-
playerViewModel?.currentSubtitle?.code
79+
player?.let { PlayerHelper.getCurrentPlayedCaptionFormat(it)?.language }
8080
?: context.getString(R.string.none)
8181
}
8282
) {

0 commit comments

Comments
 (0)