From 96739da0e2706808efb237c30cd4d8e0da65d0c7 Mon Sep 17 00:00:00 2001 From: Secozzi <49240133+Secozzi@users.noreply.github.com> Date: Tue, 28 Jan 2025 13:48:01 +0100 Subject: [PATCH 1/3] fix(player): Fix audio selection not working on external audio tracks (#1901) --- .../java/eu/kanade/domain/DomainModule.kt | 3 ++ .../tachiyomi/ui/player/PlayerActivity.kt | 5 --- .../tachiyomi/ui/player/PlayerViewModel.kt | 15 +++++++-- .../{SubtitleSelect.kt => TrackSelect.kt} | 33 ++++++++++++++----- 4 files changed, 41 insertions(+), 15 deletions(-) rename app/src/main/java/eu/kanade/tachiyomi/util/{SubtitleSelect.kt => TrackSelect.kt} (59%) diff --git a/app/src/main/java/eu/kanade/domain/DomainModule.kt b/app/src/main/java/eu/kanade/domain/DomainModule.kt index dcc485f868..5fb37d4208 100644 --- a/app/src/main/java/eu/kanade/domain/DomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/DomainModule.kt @@ -41,6 +41,7 @@ import eu.kanade.domain.track.manga.interactor.AddMangaTracks import eu.kanade.domain.track.manga.interactor.RefreshMangaTracks import eu.kanade.domain.track.manga.interactor.SyncChapterProgressWithTrack import eu.kanade.domain.track.manga.interactor.TrackChapter +import eu.kanade.tachiyomi.util.TrackSelect import mihon.data.repository.anime.AnimeExtensionRepoRepositoryImpl import mihon.data.repository.manga.MangaExtensionRepoRepositoryImpl import mihon.domain.extensionrepo.anime.interactor.CreateAnimeExtensionRepo @@ -385,5 +386,7 @@ class DomainModule : InjektModule { addFactory { UpdateCustomButton(get()) } addFactory { ReorderCustomButton(get()) } addFactory { ToggleFavoriteCustomButton(get()) } + + addFactory { TrackSelect(get(), get()) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt index d1291fc0cf..62ebff69bb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt @@ -74,9 +74,7 @@ import eu.kanade.tachiyomi.ui.player.settings.AdvancedPlayerPreferences import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import eu.kanade.tachiyomi.ui.player.settings.GesturePreferences import eu.kanade.tachiyomi.ui.player.settings.PlayerPreferences -import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences import eu.kanade.tachiyomi.util.Stamp -import eu.kanade.tachiyomi.util.SubtitleSelect import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast import `is`.xyz.mpv.MPVLib @@ -119,14 +117,11 @@ class PlayerActivity : BaseActivity() { private var mediaSession: MediaSession? = null private val gesturePreferences: GesturePreferences by lazy { viewModel.gesturePreferences } private val playerPreferences: PlayerPreferences by lazy { viewModel.playerPreferences } - private val subtitlePreferences: SubtitlePreferences = Injekt.get() private val audioPreferences: AudioPreferences = Injekt.get() private val advancedPlayerPreferences: AdvancedPlayerPreferences = Injekt.get() private val networkPreferences: NetworkPreferences = Injekt.get() private val storageManager: StorageManager = Injekt.get() - internal val subtitleSelect by lazy { SubtitleSelect(subtitlePreferences) } - private var audioFocusRequest: AudioFocusRequestCompat? = null private var restoreAudioFocus: () -> Unit = {} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt index 51f9ab130d..9281fed315 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt @@ -66,6 +66,7 @@ import eu.kanade.tachiyomi.ui.reader.SaveImageNotifier import eu.kanade.tachiyomi.util.AniSkipApi import eu.kanade.tachiyomi.util.SkipType import eu.kanade.tachiyomi.util.Stamp +import eu.kanade.tachiyomi.util.TrackSelect import eu.kanade.tachiyomi.util.editCover import eu.kanade.tachiyomi.util.episode.filterDownloadedEpisodes import eu.kanade.tachiyomi.util.lang.byteSize @@ -146,6 +147,7 @@ class PlayerViewModel @JvmOverloads constructor( internal val gesturePreferences: GesturePreferences = Injekt.get(), private val basePreferences: BasePreferences = Injekt.get(), private val getCustomButtons: GetCustomButtons = Injekt.get(), + private val trackSelect: TrackSelect = Injekt.get(), uiPreferences: UiPreferences = Injekt.get(), ) : ViewModel() { @@ -398,13 +400,22 @@ class PlayerViewModel @JvmOverloads constructor( } } + /** + * When all subtitle/audio tracks are loaded, select the preferred one based on preferences, + * or select the first one in the list if trackSelect fails. + */ fun onFinishLoadingTracks() { - val preferredSubtitle = activity.subtitleSelect.getPreferredSubtitleIndex(subtitleTracks.value) - preferredSubtitle?.let { + val preferredSubtitle = trackSelect.getPreferredTrackIndex(subtitleTracks.value) + (preferredSubtitle ?: subtitleTracks.value.firstOrNull())?.let { activity.player.sid = it.id activity.player.secondarySid = -1 } + val preferredAudio = trackSelect.getPreferredTrackIndex(audioTracks.value, subtitle = false) + (preferredAudio ?: audioTracks.value.getOrNull(1))?.let { + activity.player.aid = it.id + } + isLoadingTracks.update { _ -> true } updateIsLoadingEpisode(false) setPausedState() diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/SubtitleSelect.kt b/app/src/main/java/eu/kanade/tachiyomi/util/TrackSelect.kt similarity index 59% rename from app/src/main/java/eu/kanade/tachiyomi/util/SubtitleSelect.kt rename to app/src/main/java/eu/kanade/tachiyomi/util/TrackSelect.kt index f848e61ef5..a2bfd66036 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/SubtitleSelect.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/TrackSelect.kt @@ -2,18 +2,35 @@ package eu.kanade.tachiyomi.util import androidx.core.os.LocaleListCompat import eu.kanade.tachiyomi.ui.player.PlayerViewModel.VideoTrack +import eu.kanade.tachiyomi.ui.player.settings.AudioPreferences import eu.kanade.tachiyomi.ui.player.settings.SubtitlePreferences +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get import java.util.Locale -class SubtitleSelect(private val subtitlePreferences: SubtitlePreferences) { +class TrackSelect( + private val subtitlePreferences: SubtitlePreferences = Injekt.get(), + private val audioPreferences: AudioPreferences = Injekt.get(), +) { - fun getPreferredSubtitleIndex(tracks: List): VideoTrack? { - val prefLangs = subtitlePreferences.preferredSubLanguages().get().split(",") - .filter { it.isNotEmpty() } - val whitelist = subtitlePreferences.subtitleWhitelist().get().split(",") - .filter { it.isNotEmpty() } - val blacklist = subtitlePreferences.subtitleBlacklist().get().split(",") - .filter { it.isNotEmpty() } + fun getPreferredTrackIndex(tracks: List, subtitle: Boolean = true): VideoTrack? { + val prefLangs = if (subtitle) { + subtitlePreferences.preferredSubLanguages().get() + } else { + audioPreferences.preferredAudioLanguages().get() + }.split(",").filter { it.isNotEmpty() } + + val whitelist = if (subtitle) { + subtitlePreferences.subtitleWhitelist().get() + } else { + "" + }.split(",").filter { it.isNotEmpty() } + + val blacklist = if (subtitle) { + subtitlePreferences.subtitleBlacklist().get() + } else { + "" + }.split(",").filter { it.isNotEmpty() } val locales = prefLangs.map(::Locale).ifEmpty { listOf(LocaleListCompat.getDefault()[0]!!) From 3c3c81b85d0e2f5efa4c5b529b7e229e61ba4142 Mon Sep 17 00:00:00 2001 From: Secozzi <49240133+Secozzi@users.noreply.github.com> Date: Tue, 28 Jan 2025 13:48:30 +0100 Subject: [PATCH 2/3] fix(player): Reset "hide player controls time" when pressing custom button (#1902) --- .../ui/player/controls/BottomRightPlayerControls.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/BottomRightPlayerControls.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/BottomRightPlayerControls.kt index f68513c858..dc83ccb0f0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/BottomRightPlayerControls.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/BottomRightPlayerControls.kt @@ -48,6 +48,8 @@ fun BottomRightPlayerControls( onPipClick: () -> Unit, modifier: Modifier = Modifier, ) { + val clickEvent = LocalPlayerButtonsClickEvent.current + Row(modifier) { if (aniskipButton != null) { Box( @@ -60,7 +62,10 @@ fun BottomRightPlayerControls( modifier = Modifier .matchParentSize() .combinedClickable( - onClick = onPressAniSkipButton, + onClick = { + clickEvent() + onPressAniSkipButton() + }, interactionSource = remember { MutableInteractionSource() }, indication = null, ), @@ -77,7 +82,10 @@ fun BottomRightPlayerControls( modifier = Modifier .matchParentSize() .combinedClickable( - onClick = { customButton.execute() }, + onClick = { + clickEvent() + customButton.execute() + }, onLongClick = { customButton.executeLongPress() }, interactionSource = remember { MutableInteractionSource() }, indication = null, From 3297236c1727fb42f01a8656cbb5af5eac8f4910 Mon Sep 17 00:00:00 2001 From: Secozzi <49240133+Secozzi@users.noreply.github.com> Date: Tue, 28 Jan 2025 13:48:46 +0100 Subject: [PATCH 3/3] fix(player): Don't unpause on share and save (#1905) --- .../ui/player/controls/components/sheets/ScreenshotSheet.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/ScreenshotSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/ScreenshotSheet.kt index ee8837684c..b24b5a8ebf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/ScreenshotSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/sheets/ScreenshotSheet.kt @@ -64,7 +64,6 @@ fun ScreenshotSheet( icon = Icons.Outlined.Share, onClick = { onShare { takeScreenshot(cachePath, showSubtitles)!! } - onDismissRequest() }, ) ActionButton( @@ -73,7 +72,6 @@ fun ScreenshotSheet( icon = Icons.Outlined.Save, onClick = { onSave { takeScreenshot(cachePath, showSubtitles)!! } - onDismissRequest() }, ) }