diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeTrackActions.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeTrackActions.kt index e4f5d2462..9a110d18b 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeTrackActions.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerScreenRuntimeTrackActions.kt @@ -17,11 +17,10 @@ internal val PlayerScreenRuntime.visibleAddonSubtitles: List get() = filterAddonSubtitlesForSettings( subtitles = addonSubtitles, settings = playerSettingsUiState, - selectedAddonSubtitleId = selectedAddonSubtitleId, ) internal val PlayerScreenRuntime.selectedAddonSubtitle: AddonSubtitle? - get() = addonSubtitles.firstOrNull { subtitle -> + get() = visibleAddonSubtitles.firstOrNull { subtitle -> subtitle.id == selectedAddonSubtitleId || subtitle.url == selectedAddonSubtitleId } diff --git a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerTrackSelection.kt b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerTrackSelection.kt index 1fef16145..9bdfdc4c7 100644 --- a/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerTrackSelection.kt +++ b/composeApp/src/commonMain/kotlin/com/nuvio/app/features/player/PlayerTrackSelection.kt @@ -97,40 +97,27 @@ internal fun findPreferredSubtitleTrackIndex( internal fun filterAddonSubtitlesForSettings( subtitles: List, settings: PlayerSettingsUiState, - selectedAddonSubtitleId: String?, ): List { val shouldFilter = settings.subtitleStyle.showOnlyPreferredLanguages || settings.addonSubtitleStartupMode == AddonSubtitleStartupMode.PREFERRED_ONLY if (!shouldFilter) return subtitles val targets = preferredSubtitleTargetsForSettings(settings) - if (targets.isEmpty()) { - return subtitles.filter { subtitle -> - subtitle.id == selectedAddonSubtitleId || subtitle.url == selectedAddonSubtitleId + if (targets.isEmpty()) return emptyList() + + return subtitles.filter { subtitle -> + targets.any { target -> + languageMatchesPreference( + trackLanguage = subtitle.language, + targetLanguage = target, + ) } } - - val filtered = subtitles.filter { subtitle -> - subtitle.id == selectedAddonSubtitleId || - subtitle.url == selectedAddonSubtitleId || - targets.any { target -> - languageMatchesPreference( - trackLanguage = subtitle.language, - targetLanguage = target, - ) - } - } - return filtered } internal fun preferredSubtitleTargetsForSettings(settings: PlayerSettingsUiState): List { - val preferredLanguage = if (settings.subtitleStyle.useForcedSubtitles) { - SubtitleLanguageOption.FORCED - } else { - settings.preferredSubtitleLanguage - } return resolvePreferredSubtitleLanguageTargets( - preferredSubtitleLanguage = preferredLanguage, + preferredSubtitleLanguage = settings.preferredSubtitleLanguage, secondaryPreferredSubtitleLanguage = settings.secondaryPreferredSubtitleLanguage, deviceLanguages = DeviceLanguagePreferences.preferredLanguageCodes(), ).filterNot { it == SubtitleLanguageOption.FORCED } diff --git a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/player/PlayerTrackSelectionTest.kt b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/player/PlayerTrackSelectionTest.kt index 050969f96..3e4fa2dc9 100644 --- a/composeApp/src/commonTest/kotlin/com/nuvio/app/features/player/PlayerTrackSelectionTest.kt +++ b/composeApp/src/commonTest/kotlin/com/nuvio/app/features/player/PlayerTrackSelectionTest.kt @@ -55,6 +55,49 @@ class PlayerTrackSelectionTest { assertEquals(-1, selectedIndex) } + @Test + fun preferredOnlyFilteringRemovesNonPreferredAddons() { + val subtitles = listOf( + addonSubtitle(id = "english", language = "en"), + addonSubtitle(id = "japanese", language = "ja"), + ) + val settings = PlayerSettingsUiState( + preferredSubtitleLanguage = "en", + subtitleStyle = SubtitleStyleState.DEFAULT.copy(showOnlyPreferredLanguages = true), + ) + + val visibleSubtitles = filterAddonSubtitlesForSettings( + subtitles = subtitles, + settings = settings, + ) + + assertEquals(listOf("english"), visibleSubtitles.map { it.id }) + } + + @Test + fun forcedToggleKeepsPreferredLanguagesForAddonFiltering() { + val subtitles = listOf( + addonSubtitle(id = "japanese", language = "ja"), + addonSubtitle(id = "french", language = "fr"), + addonSubtitle(id = "english", language = "en"), + ) + val settings = PlayerSettingsUiState( + preferredSubtitleLanguage = "en", + secondaryPreferredSubtitleLanguage = "fr", + subtitleStyle = SubtitleStyleState.DEFAULT.copy( + useForcedSubtitles = true, + showOnlyPreferredLanguages = true, + ), + ) + + val visibleSubtitles = filterAddonSubtitlesForSettings( + subtitles = subtitles, + settings = settings, + ) + + assertEquals(listOf("french", "english"), visibleSubtitles.map { it.id }) + } + private fun subtitleTrack( index: Int, language: String, @@ -66,4 +109,15 @@ class PlayerTrackSelectionTest { language = language, isForced = isForced, ) + + private fun addonSubtitle( + id: String, + language: String, + ) = AddonSubtitle( + id = id, + url = "https://example.com/$id.srt", + language = language, + display = id, + addonName = "Addon", + ) }