mirror of
https://github.com/JustinZeus/Wholphin.git
synced 2026-07-08 15:50:16 +02:00
Display text subtitles
This commit is contained in:
parent
fd6cdd78f3
commit
252e1aad07
3 changed files with 39 additions and 28 deletions
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue