diff --git a/android/app/src/main/kotlin/nl/jknaapen/fladder/composables/dialogs/SubtitlePicker.kt b/android/app/src/main/kotlin/nl/jknaapen/fladder/composables/dialogs/SubtitlePicker.kt index 50cd852..b5a8d86 100644 --- a/android/app/src/main/kotlin/nl/jknaapen/fladder/composables/dialogs/SubtitlePicker.kt +++ b/android/app/src/main/kotlin/nl/jknaapen/fladder/composables/dialogs/SubtitlePicker.kt @@ -34,29 +34,21 @@ fun SubtitlePicker( val subTitles by VideoPlayerObject.subtitleTracks.collectAsState(emptyList()) val internalSubTracks by VideoPlayerObject.exoSubTracks.collectAsState(emptyList()) - if (internalSubTracks.isEmpty()) return + if (subTitles.isEmpty()) return - val focusOffTrack = remember { FocusRequester() } - - val focusRequesters = remember(internalSubTracks) { - internalSubTracks.associateWith { FocusRequester() } + val focusRequesters = remember(subTitles) { + subTitles.associateWith { FocusRequester() } } val listState = rememberLazyListState() - LaunchedEffect(selectedIndex, subTitles, internalSubTracks) { - val serverSubIndex = subTitles.indexOfFirst { it.index == selectedIndex.toLong() } + LaunchedEffect(selectedIndex, subTitles) { + val selectedSubIndex = subTitles.indexOfFirst { it.index == selectedIndex.toLong() } - if (serverSubIndex <= 0) { - focusOffTrack.requestFocus() - return@LaunchedEffect + if (selectedSubIndex in subTitles.indices) { + listState.scrollToItem(selectedSubIndex) + focusRequesters[subTitles[selectedSubIndex]]?.requestFocus() } - - val internalIndex = serverSubIndex - 1 - val lazyColumnIndex = internalIndex + 1 - - listState.scrollToItem(lazyColumnIndex) - focusRequesters[internalSubTracks[internalIndex]]?.requestFocus() } CustomModalBottomSheet( @@ -69,42 +61,42 @@ fun SubtitlePicker( .wrapContentWidth() .padding(horizontal = 8.dp, vertical = 16.dp), ) { - item { - val selectedOff = -1 == selectedIndex - TrackButton( - modifier = Modifier - .fillMaxWidth() - .focusRequester(focusOffTrack), - onClick = { - VideoPlayerObject.setSubtitleTrackIndex(-1) - player.clearSubtitleTrack() - }, - selected = selectedOff - ) { - Translate(Localized::off) { - Text(it) - } - } - } - internalSubTracks.forEachIndexed { index, subtitle -> - val serverSub = subTitles.elementAtOrNull(index + 1) - val selected = serverSub?.index == selectedIndex.toLong() + subTitles.forEachIndexed { index, serverSub -> + val isOffTrack = index == 0 + val selected = serverSub.index == selectedIndex.toLong() + item { TrackButton( modifier = Modifier .fillMaxWidth() - .focusRequester(focusRequesters[subtitle]!!), + .focusRequester(focusRequesters[serverSub]!!), onClick = { - serverSub?.index?.let { - VideoPlayerObject.setSubtitleTrackIndex(it.toInt()) + if (isOffTrack) { + VideoPlayerObject.setSubtitleTrackIndex(-1) + player.clearSubtitleTrack() + } else { + val internalTrackIndex = index - 1 + + val internalSubTrack = + internalSubTracks.elementAtOrNull(internalTrackIndex) + + if (internalSubTrack != null) { + VideoPlayerObject.setSubtitleTrackIndex(serverSub.index.toInt()) + player.setInternalSubtitleTrack(internalSubTrack) + } } - player.setInternalSubtitleTrack(subtitle) }, selected = selected, ) { - Text( - text = serverSub?.name ?: "", - ) + if (isOffTrack) { + Translate(Localized::off) { + Text(it) + } + } else { + Text( + text = serverSub.name, + ) + } } } } diff --git a/lib/models/playback/playback_model.dart b/lib/models/playback/playback_model.dart index 7f17379..5bf54e1 100644 --- a/lib/models/playback/playback_model.dart +++ b/lib/models/playback/playback_model.dart @@ -22,6 +22,7 @@ import 'package:fladder/models/playback/direct_playback_model.dart'; import 'package:fladder/models/playback/offline_playback_model.dart'; import 'package:fladder/models/playback/playback_options_dialogue.dart'; import 'package:fladder/models/playback/transcode_playback_model.dart'; +import 'package:fladder/models/settings/video_player_settings.dart'; import 'package:fladder/models/syncing/sync_item.dart'; import 'package:fladder/models/video_stream_model.dart'; import 'package:fladder/profiles/default_profile.dart'; @@ -277,12 +278,18 @@ class PlaybackModelHelper { oldModel?.mediaStreams?.currentAudioStream, newStreamModel?.audioStreams, newStreamModel?.defaultAudioStreamIndex); + final subStreamIndex = selectSubStream( ref.read(userProvider.select((value) => value?.userConfiguration?.rememberSubtitleSelections ?? true)), oldModel?.mediaStreams?.currentSubStream, newStreamModel?.subStreams, newStreamModel?.defaultSubStreamIndex); + //Native player does not allow for loading external subtitles with transcoding + final isNativePlayer = + ref.read(videoPlayerSettingsProvider.select((value) => value.wantedPlayer == PlayerOptions.nativePlayer)); + final isExternalSub = newStreamModel?.currentSubStream?.isExternal == true; + final Response response = await api.itemsItemIdPlaybackInfoPost( itemId: item.id, body: PlaybackInfoDto( @@ -295,6 +302,7 @@ class PlaybackModelHelper { userId: userId, enableDirectPlay: type != PlaybackType.transcode, enableDirectStream: type != PlaybackType.transcode, + alwaysBurnInSubtitleWhenTranscoding: isNativePlayer && isExternalSub, maxStreamingBitrate: qualityOptions.enabledFirst.keys.firstOrNull?.bitRate, mediaSourceId: newStreamModel?.currentVersionStream?.id, ),