mirror of
https://github.com/JustinZeus/Wholphin.git
synced 2026-07-08 15:50:16 +02:00
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:
parent
319b46983f
commit
c5c0dff705
3 changed files with 50 additions and 25 deletions
|
|
@ -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 }
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue