feat(tracks): add track indexes

This commit is contained in:
2026-08-03 19:10:45 +02:00
parent 685d3beb2a
commit e80c382a25
8 changed files with 57 additions and 45 deletions
@@ -117,21 +117,13 @@ class EventMap(private val tracks: TrackProvider) : HybridOmniEventMapSpec(), Pl
}
private fun selectedTrack(trackType: Int): Track? {
val groups = player.currentTracks.groups.filter { it.type == trackType }
for (group in groups) {
val mediaGroup = group.mediaTrackGroup
for (i in 0 until group.length) {
if (!group.isTrackSelected(i)) continue
val format = group.getTrackFormat(i)
return Track(
id = format.id ?: mediaGroup.id,
label = format.label,
language = format.language,
selected = true
)
}
val list = when (trackType) {
TRACK_TYPE_VIDEO -> tracks.videos
TRACK_TYPE_AUDIO -> tracks.audios
TRACK_TYPE_TEXT -> tracks.subtitles
else -> return null
}
return null
return list.firstOrNull { it.selected }
}
private fun getCurrentRendition(): Rendition? {
@@ -265,9 +257,8 @@ class EventMap(private val tracks: TrackProvider) : HybridOmniEventMapSpec(), Pl
selectedTrack(TRACK_TYPE_AUDIO)?.let { track ->
onAudioTrackChangeListeners.forEach { it(track) }
}
selectedTrack(TRACK_TYPE_TEXT)?.let { track ->
onSubtitleChangeListeners.forEach { it(track) }
}
val subtitle = selectedTrack(TRACK_TYPE_TEXT)
onSubtitleChangeListeners.forEach { it(subtitle) }
emitTracks()
emitIsAutoQualityChange()
emitRenditionChange()
@@ -451,13 +451,19 @@ class OmniPlayer(
// when casting tracks are stripped of some metadata, recover it
val castTracks = castMediaTracksById()
// external (sideloaded) subs aren't in the container, so their index is -1
val sideloadedIds = source?.subtitles?.map { it.id }?.toHashSet().orEmpty()
var index = 0
return groups.map { group ->
val format = group.getTrackFormat(0)
val castTrackId = group.mediaTrackGroup.id.substringAfterLast("track=", "").toLongOrNull()
val id = group.mediaTrackGroup.id
val castTrackId = id.substringAfterLast("track=", "").toLongOrNull()
val cast = castTracks[castTrackId]
val sideloaded = trackType == C.TRACK_TYPE_TEXT && id in sideloadedIds
Track(
id = group.mediaTrackGroup.id,
id = id,
index = if (sideloaded) -1.0 else (index++).toDouble(),
label = cast?.name ?: format.label,
language = cast?.language ?: format.language,
selected = group.isSelected