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

View file

@ -22,6 +22,7 @@ object MPVProperty {
const val MUTE = "mute"
const val TRACK_AUDIO = "current-tracks/audio/selected"
const val SEEKABLE = "seekable"
const val SUBTITLE_TEXT = "sub-text"
val observedProperties =
mapOf(
@ -40,5 +41,6 @@ object MPVProperty {
MUTE to MPV_FORMAT_FLAG,
TRACK_AUDIO to MPV_FORMAT_NONE,
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.Tracks
import androidx.media3.common.VideoSize
import androidx.media3.common.text.Cue
import androidx.media3.common.text.CueGroup
import androidx.media3.common.util.Clock
import androidx.media3.common.util.ListenerSet
@ -556,6 +557,15 @@ class MpvPlayer(
value: String,
) {
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(