mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-07-26 22:42:17 +00:00
fix(player): match forced subtitles to language preferences
This commit is contained in:
parent
1c75fc20db
commit
a8d6d8d270
3 changed files with 77 additions and 9 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
Loading…
Reference in a new issue