Prefer non-forced when subtitle preference is always on (#1618)

## Description
If subtitles preferences are "Always", this PR will prefer non-forced
tracks even if any forced ones are default tracks.

This is in-line with the web UI from my testing and another review of
the code.

### Related issues
Fixes
https://github.com/damontecres/Wholphin/issues/790#issuecomment-4708705576

### Testing
Unit tests

## Screenshots
N/A

## AI or LLM usage
None
This commit is contained in:
Damontecres 2026-06-23 17:23:37 -04:00 • committed by GitHub
parent 7422f15bff
commit 899e3decc2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 59 additions and 4 deletions

View file

@ -277,11 +277,13 @@ class StreamChoiceService
SubtitlePlaybackMode.ALWAYS -> {
if (subtitleLanguage.isNotNullOrBlank()) {
candidates.firstOrNull {
it.language.equals(subtitleLanguage, true) ||
it.language.isUnknown
// Prefer non-forced first
!it.isForced && it.language.equalsLangOrUnknown(subtitleLanguage)
} ?: candidates.firstOrNull {
it.language.equalsLangOrUnknown(subtitleLanguage)
}
} else {
candidates.firstOrNull()
candidates.firstOrNull { !it.isForced } ?: candidates.firstOrNull()
}
}
@ -371,3 +373,5 @@ private val String?.isUnknown: Boolean
this.equals("undetermined", true) ||
this.equals("mul", true) ||
this.equals("zxx", true)
private fun String?.equalsLangOrUnknown(lang: String): Boolean = equals(lang, ignoreCase = true) || this.isUnknown

View file

@ -102,6 +102,56 @@ class StreamChoiceServiceTest(
),
itemPlayback = itemPlayback(subtitleIndex = TrackIndex.UNSPECIFIED),
),
TestInput(
1,
SubtitlePlaybackMode.ALWAYS,
userSubtitleLang = "eng",
subtitles =
listOf(
subtitle(0, "eng", default = true, forced = true),
subtitle(1, "eng", default = false, forced = false),
),
),
TestInput(
1,
SubtitlePlaybackMode.ALWAYS,
userSubtitleLang = null,
subtitles =
listOf(
subtitle(0, "eng", default = true, forced = true),
subtitle(1, "eng", default = false, forced = false),
),
),
TestInput(
0,
SubtitlePlaybackMode.SMART,
userSubtitleLang = "eng",
subtitles =
listOf(
subtitle(0, "eng", default = true, forced = true),
subtitle(1, "eng", default = false, forced = false),
),
),
TestInput(
0,
SubtitlePlaybackMode.ONLY_FORCED,
userSubtitleLang = "eng",
subtitles =
listOf(
subtitle(0, "eng", default = true, forced = true),
subtitle(1, "eng", default = false, forced = false),
),
),
TestInput(
null,
SubtitlePlaybackMode.NONE,
userSubtitleLang = "eng",
subtitles =
listOf(
subtitle(0, "eng", default = true, forced = true),
subtitle(1, "eng", default = false, forced = false),
),
),
)
}
}
@ -277,6 +327,7 @@ class TestStreamChoiceServiceSmart(
TestInput(
0,
SubtitlePlaybackMode.SMART,
userSubtitleLang = "eng",
subtitles =
listOf(
subtitle(0, "eng", false),
@ -488,7 +539,7 @@ class TestStreamChoiceServiceMultipleChoices(
fun data(): Collection<TestInput> =
listOf(
TestInput(
0,
1,
SubtitlePlaybackMode.ALWAYS,
subtitles =
listOf(