fix(player): match forced subtitles to language preferences

This commit is contained in:
tapframe 2026-07-18 16:54:50 +05:30
parent 1c75fc20db
commit a8d6d8d270
3 changed files with 77 additions and 9 deletions

View file

@ -175,11 +175,7 @@ internal fun PlayerScreenRuntime.refreshTracks() {
if (!preferredSubtitleSelectionApplied) {
val preferredSubtitleTargets = resolvePreferredSubtitleLanguageTargets(
preferredSubtitleLanguage = if (subtitleStyle.useForcedSubtitles) {
SubtitleLanguageOption.FORCED
} else {
playerSettingsUiState.preferredSubtitleLanguage
},
preferredSubtitleLanguage = playerSettingsUiState.preferredSubtitleLanguage,
secondaryPreferredSubtitleLanguage = playerSettingsUiState.secondaryPreferredSubtitleLanguage,
deviceLanguages = DeviceLanguagePreferences.preferredLanguageCodes(),
)
@ -196,6 +192,7 @@ internal fun PlayerScreenRuntime.refreshTracks() {
val preferredSubtitleIndex = findPreferredSubtitleTrackIndex(
tracks = subtitleTracks,
targets = preferredSubtitleTargets,
requireForced = subtitleStyle.useForcedSubtitles,
)
if (preferredSubtitleIndex >= 0 && preferredSubtitleIndex != selectedSubtitleIndex) {
playerController?.selectSubtitleTrack(preferredSubtitleIndex)

View file

@ -68,6 +68,7 @@ internal fun <T> findPreferredTrackIndex(
internal fun findPreferredSubtitleTrackIndex(
tracks: List<SubtitleTrack>,
targets: List<String>,
requireForced: Boolean = false,
): Int {
if (targets.isEmpty()) return -1
@ -81,10 +82,11 @@ internal fun findPreferredSubtitleTrackIndex(
}
val matchIndex = tracks.indexOfFirst { track ->
languageMatchesPreference(
trackLanguage = track.language,
targetLanguage = normalizedTarget,
)
(!requireForced || track.isForced) &&
languageMatchesPreference(
trackLanguage = track.language,
targetLanguage = normalizedTarget,
)
}
if (matchIndex >= 0) return matchIndex
}

View file

@ -0,0 +1,69 @@
package com.nuvio.app.features.player
import kotlin.test.Test
import kotlin.test.assertEquals
class PlayerTrackSelectionTest {
@Test
fun forcedSelectionUsesPrimaryPreferredLanguageInsteadOfTrackOrder() {
val tracks = listOf(
subtitleTrack(index = 0, language = "ja", isForced = true),
subtitleTrack(index = 1, language = "en", isForced = false),
subtitleTrack(index = 2, language = "en", isForced = true),
)
val selectedIndex = findPreferredSubtitleTrackIndex(
tracks = tracks,
targets = listOf("en"),
requireForced = true,
)
assertEquals(2, selectedIndex)
}
@Test
fun forcedSelectionFallsBackToSecondaryPreferredLanguage() {
val tracks = listOf(
subtitleTrack(index = 0, language = "ja", isForced = true),
subtitleTrack(index = 1, language = "en", isForced = false),
subtitleTrack(index = 2, language = "fr", isForced = true),
)
val selectedIndex = findPreferredSubtitleTrackIndex(
tracks = tracks,
targets = listOf("en", "fr"),
requireForced = true,
)
assertEquals(2, selectedIndex)
}
@Test
fun forcedSelectionRejectsTracksOutsidePreferredLanguages() {
val tracks = listOf(
subtitleTrack(index = 0, language = "ja", isForced = true),
subtitleTrack(index = 1, language = "en", isForced = false),
)
val selectedIndex = findPreferredSubtitleTrackIndex(
tracks = tracks,
targets = listOf("en"),
requireForced = true,
)
assertEquals(-1, selectedIndex)
}
private fun subtitleTrack(
index: Int,
language: String,
isForced: Boolean,
) = SubtitleTrack(
index = index,
id = "track-$index",
label = "Track $index",
language = language,
isForced = isForced,
)
}