Display text subtitles

This commit is contained in:
Damontecres 2025-11-06 15:54:46 -05:00
parent fd6cdd78f3
commit 252e1aad07
No known key found for this signature in database
3 changed files with 39 additions and 28 deletions

View file

@ -1209,13 +1209,16 @@ private fun applyTrackSelections(
val embeddedSubtitleCount = source.embeddedSubtitleCount val embeddedSubtitleCount = source.embeddedSubtitleCount
val externalSubtitleCount = source.externalSubtitlesCount val externalSubtitleCount = source.externalSubtitlesCount
val paramsBuilder = player.trackSelectionParameters.buildUpon()
val tracks = player.currentTracks.groups
val subtitleSelected = val subtitleSelected =
if (subtitleIndex != null && subtitleIndex >= 0) { if (subtitleIndex != null && subtitleIndex >= 0) {
val subtitleIsExternal = source.findExternalSubtitle(subtitleIndex) != null val subtitleIsExternal = source.findExternalSubtitle(subtitleIndex) != null
if (subtitleIsExternal || supportsDirectPlay) { if (subtitleIsExternal || supportsDirectPlay) {
val chosenTrack = val chosenTrack =
if (subtitleIsExternal && playerBackend == PlayerBackend.EXO_PLAYER) { if (subtitleIsExternal && playerBackend == PlayerBackend.EXO_PLAYER) {
player.currentTracks.groups.firstOrNull { group -> tracks.firstOrNull { group ->
group.type == C.TRACK_TYPE_TEXT && group.isSupported && group.type == C.TRACK_TYPE_TEXT && group.isSupported &&
(0..<group.mediaTrackGroup.length) (0..<group.mediaTrackGroup.length)
.mapNotNull { .mapNotNull {
@ -1236,7 +1239,6 @@ private fun applyTrackSelections(
) )
Timber.v("Chosen subtitle ($subtitleIndex/$indexToFind) track") Timber.v("Chosen subtitle ($subtitleIndex/$indexToFind) track")
// subtitleIndex - externalSubtitleCount + 1 // subtitleIndex - externalSubtitleCount + 1
val tracks = player.currentTracks.groups
tracks.firstOrNull { group -> tracks.firstOrNull { group ->
group.type == C.TRACK_TYPE_TEXT && group.isSupported && group.type == C.TRACK_TYPE_TEXT && group.isSupported &&
(0..<group.mediaTrackGroup.length) (0..<group.mediaTrackGroup.length)
@ -1248,27 +1250,23 @@ private fun applyTrackSelections(
Timber.v("Chosen subtitle ($subtitleIndex) track: $chosenTrack") Timber.v("Chosen subtitle ($subtitleIndex) track: $chosenTrack")
chosenTrack?.let { chosenTrack?.let {
player.trackSelectionParameters = paramsBuilder
player.trackSelectionParameters .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, false)
.buildUpon() .setOverrideForType(
.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, false) TrackSelectionOverride(
.setOverrideForType( chosenTrack.mediaTrackGroup,
TrackSelectionOverride( 0,
chosenTrack.mediaTrackGroup, ),
0, )
),
).build()
} }
chosenTrack != null chosenTrack != null
} else { } else {
false false
} }
} else { } else {
player.trackSelectionParameters = paramsBuilder
player.trackSelectionParameters .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true)
.buildUpon()
.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true)
.build()
true true
} }
val audioSelected = val audioSelected =
@ -1285,7 +1283,7 @@ private fun applyTrackSelections(
false, false,
) )
val chosenTrack = val chosenTrack =
player.currentTracks.groups.firstOrNull { group -> tracks.firstOrNull { group ->
group.type == C.TRACK_TYPE_AUDIO && group.isSupported && group.type == C.TRACK_TYPE_AUDIO && group.isSupported &&
(0..<group.mediaTrackGroup.length) (0..<group.mediaTrackGroup.length)
.map { .map {
@ -1294,21 +1292,22 @@ private fun applyTrackSelections(
} }
Timber.v("Chosen audio ($audioIndex/$indexToFind) track: $chosenTrack") Timber.v("Chosen audio ($audioIndex/$indexToFind) track: $chosenTrack")
chosenTrack?.let { chosenTrack?.let {
player.trackSelectionParameters = paramsBuilder
player.trackSelectionParameters .setTrackTypeDisabled(C.TRACK_TYPE_AUDIO, false)
.buildUpon() .setOverrideForType(
.setTrackTypeDisabled(C.TRACK_TYPE_AUDIO, false) TrackSelectionOverride(
.setOverrideForType( chosenTrack.mediaTrackGroup,
TrackSelectionOverride( 0,
chosenTrack.mediaTrackGroup, ),
0, )
),
).build()
} }
chosenTrack != null chosenTrack != null
} else { } else {
audioIndex == null audioIndex == null
} }
if (audioSelected && subtitleSelected) {
player.trackSelectionParameters = paramsBuilder.build()
}
return TrackSelectionResult(audioSelected, subtitleSelected) return TrackSelectionResult(audioSelected, subtitleSelected)
} }

View file

@ -22,6 +22,7 @@ object MPVProperty {
const val MUTE = "mute" const val MUTE = "mute"
const val TRACK_AUDIO = "current-tracks/audio/selected" const val TRACK_AUDIO = "current-tracks/audio/selected"
const val SEEKABLE = "seekable" const val SEEKABLE = "seekable"
const val SUBTITLE_TEXT = "sub-text"
val observedProperties = val observedProperties =
mapOf( mapOf(
@ -40,5 +41,6 @@ object MPVProperty {
MUTE to MPV_FORMAT_FLAG, MUTE to MPV_FORMAT_FLAG,
TRACK_AUDIO to MPV_FORMAT_NONE, TRACK_AUDIO to MPV_FORMAT_NONE,
SEEKABLE to MPV_FORMAT_FLAG, SEEKABLE to MPV_FORMAT_FLAG,
SUBTITLE_TEXT to MPV_FORMAT_STRING,
) )
} }

View file

@ -25,6 +25,7 @@ import androidx.media3.common.TrackGroup
import androidx.media3.common.TrackSelectionParameters import androidx.media3.common.TrackSelectionParameters
import androidx.media3.common.Tracks import androidx.media3.common.Tracks
import androidx.media3.common.VideoSize import androidx.media3.common.VideoSize
import androidx.media3.common.text.Cue
import androidx.media3.common.text.CueGroup import androidx.media3.common.text.CueGroup
import androidx.media3.common.util.Clock import androidx.media3.common.util.Clock
import androidx.media3.common.util.ListenerSet import androidx.media3.common.util.ListenerSet
@ -556,6 +557,15 @@ class MpvPlayer(
value: String, value: String,
) { ) {
if (DEBUG) Timber.v("eventPropertyString: $property=$value") if (DEBUG) Timber.v("eventPropertyString: $property=$value")
when (property) {
MPVProperty.SUBTITLE_TEXT -> {
if (DEBUG) Timber.v("Subtitles: $value")
val cues = listOf(Cue.Builder().setText(value).build())
// TODO need to deal with presentation time?
val cueGroup = CueGroup(cues, 10.seconds.inWholeMicroseconds)
notifyListeners(EVENT_CUES) { onCues(cueGroup) }
}
}
} }
override fun eventProperty( override fun eventProperty(