Fix subtitle smart mode to check chosen audio language (#420)

Fixes how the smart subtitle mode logic works

Fixes #406
This commit is contained in:
damontecres 2025-12-11 12:52:21 -05:00 committed by GitHub
parent 319b46983f
commit c5c0dff705
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 50 additions and 25 deletions

View file

@ -59,6 +59,7 @@ class ItemPlaybackRepository
) )
val subtitleStream = val subtitleStream =
streamChoiceService.chooseSubtitleStream( streamChoiceService.chooseSubtitleStream(
audioStream = audioStream,
candidates = candidates =
source.mediaStreams source.mediaStreams
?.filter { it.type == MediaStreamType.SUBTITLE } ?.filter { it.type == MediaStreamType.SUBTITLE }

View file

@ -91,22 +91,17 @@ class StreamChoiceService
result result
} }
suspend fun chooseStream( suspend fun chooseAudioStream(
source: MediaSourceInfo, source: MediaSourceInfo,
seriesId: UUID?, seriesId: UUID?,
itemPlayback: ItemPlayback?, itemPlayback: ItemPlayback?,
plc: PlaybackLanguageChoice?, plc: PlaybackLanguageChoice?,
type: MediaStreamType,
prefs: UserPreferences, prefs: UserPreferences,
): MediaStream? { ): MediaStream? {
val plc = plc ?: seriesId?.let { playbackLanguageChoiceDao.get(serverRepository.currentUser.value!!.rowId, it) } val plc = plc ?: seriesId?.let { playbackLanguageChoiceDao.get(serverRepository.currentUser.value!!.rowId, it) }
return source.mediaStreams?.letNotEmpty { streams -> return source.mediaStreams?.letNotEmpty { streams ->
val candidates = streams.filter { it.type == type } val candidates = streams.filter { it.type == MediaStreamType.AUDIO }
when (type) { chooseAudioStream(candidates, itemPlayback, plc, prefs)
MediaStreamType.AUDIO -> chooseAudioStream(candidates, itemPlayback, plc, prefs)
MediaStreamType.SUBTITLE -> chooseSubtitleStream(candidates, itemPlayback, plc, prefs)
else -> candidates.firstOrNull()
}
} }
} }
@ -142,7 +137,35 @@ class StreamChoiceService
} }
} }
suspend fun chooseSubtitleStream(
source: MediaSourceInfo,
audioStream: MediaStream?,
seriesId: UUID?,
itemPlayback: ItemPlayback?,
plc: PlaybackLanguageChoice?,
prefs: UserPreferences,
): MediaStream? {
val plc =
plc ?: seriesId?.let {
playbackLanguageChoiceDao.get(
serverRepository.currentUser.value!!.rowId,
it,
)
}
return source.mediaStreams?.letNotEmpty { streams ->
val candidates = streams.filter { it.type == MediaStreamType.SUBTITLE }
chooseSubtitleStream(
audioStream,
candidates,
itemPlayback,
plc,
prefs,
)
}
}
fun chooseSubtitleStream( fun chooseSubtitleStream(
audioStream: MediaStream?,
candidates: List<MediaStream>, candidates: List<MediaStream>,
itemPlayback: ItemPlayback?, itemPlayback: ItemPlayback?,
playbackLanguageChoice: PlaybackLanguageChoice?, playbackLanguageChoice: PlaybackLanguageChoice?,
@ -202,7 +225,8 @@ class StreamChoiceService
SubtitlePlaybackMode.SMART -> { SubtitlePlaybackMode.SMART -> {
val audioLanguage = prefs.userConfig.audioLanguagePreference val audioLanguage = prefs.userConfig.audioLanguagePreference
if (audioLanguage != null && subtitleLanguage != null && audioLanguage != subtitleLanguage) { val audioStreamLang = audioStream?.language
if (audioLanguage.isNotNullOrBlank() && audioStreamLang.isNotNullOrBlank() && audioLanguage != audioStreamLang) {
candidates.firstOrNull { it.language == subtitleLanguage } candidates.firstOrNull { it.language == subtitleLanguage }
} else { } else {
null null

View file

@ -366,26 +366,26 @@ class PlaybackViewModel
?.sortedWith(compareBy<AudioStream> { it.language }.thenByDescending { it.channels }) ?.sortedWith(compareBy<AudioStream> { it.language }.thenByDescending { it.channels })
.orEmpty() .orEmpty()
val audioIndex = val audioStream =
streamChoiceService streamChoiceService
.chooseStream( .chooseAudioStream(
mediaSource, source = mediaSource,
base.seriesId, seriesId = base.seriesId,
playbackConfig, itemPlayback = playbackConfig,
plc, plc = plc,
MediaStreamType.AUDIO, prefs = preferences,
preferences, )
)?.index val audioIndex = audioStream?.index
val subtitleIndex = val subtitleIndex =
streamChoiceService streamChoiceService
.chooseStream( .chooseSubtitleStream(
mediaSource, source = mediaSource,
base.seriesId, audioStream = audioStream,
playbackConfig, seriesId = base.seriesId,
plc, itemPlayback = playbackConfig,
MediaStreamType.SUBTITLE, plc = plc,
preferences, prefs = preferences,
)?.index )?.index
Timber.d("Selected mediaSource=${mediaSource.id}, audioIndex=$audioIndex, subtitleIndex=$subtitleIndex") Timber.d("Selected mediaSource=${mediaSource.id}, audioIndex=$audioIndex, subtitleIndex=$subtitleIndex")