From 3bcd652e32fa0b7d94adc68796f0a33799934535 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Sun, 31 Dec 2023 00:44:39 +0100 Subject: [PATCH] feat(phone): disable audio track type And add back the option to disable the subtitle track type --- .../dialogs/TrackSelectionDialogFragment.kt | 13 ++++++------- .../java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt | 17 +++++++++++++---- .../viewmodels/PlayerActivityViewModel.kt | 17 +++++++++++++++-- player/video/src/main/res/values/strings.xml | 1 + 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt index b5c3a09b..e249ea24 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/dialogs/TrackSelectionDialogFragment.kt @@ -11,7 +11,6 @@ import dev.jdtech.jellyfin.player.video.R import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel import java.lang.IllegalStateException -// TODO add option to disable track type class TrackSelectionDialogFragment( private val type: TrackType, private val viewModel: PlayerActivityViewModel, @@ -24,12 +23,12 @@ class TrackSelectionDialogFragment( val tracksGroups = viewModel.player.currentTracks.groups.filter { it.type == C.TRACK_TYPE_AUDIO } builder.setTitle(getString(R.string.select_audio_track)) .setSingleChoiceItems( - tracksGroups.getTrackNames(), - tracksGroups.indexOfFirst { it.isSelected }, + arrayOf(getString(R.string.none)) + tracksGroups.getTrackNames(), // Add "None" at the top of the list + tracksGroups.indexOfFirst { it.isSelected } + 1, // Add 1 to the index to account for the "None" item ) { dialog, which -> viewModel.switchToTrack( TrackType.AUDIO, - tracksGroups[which], + which - 1, // Minus 1 to get the correct group without the "None" item. "None" becomes -1 ) dialog.dismiss() } @@ -42,12 +41,12 @@ class TrackSelectionDialogFragment( val tracksGroups = viewModel.player.currentTracks.groups.filter { it.type == C.TRACK_TYPE_TEXT } builder.setTitle(getString(R.string.select_subtile_track)) .setSingleChoiceItems( - tracksGroups.getTrackNames(), - tracksGroups.indexOfFirst { it.isSelected }, + arrayOf(getString(R.string.none)) + tracksGroups.getTrackNames(), + tracksGroups.indexOfFirst { it.isSelected } + 1, ) { dialog, which -> viewModel.switchToTrack( TrackType.SUBTITLE, - tracksGroups[which], + which - 1, ) dialog.dismiss() } diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt index 0ca5a931..e6bc0ec1 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt @@ -49,6 +49,7 @@ class MPVPlayer( context: Context, private val requestAudioFocus: Boolean, private val appPreferences: AppPreferences, + private var trackSelectionParameters: TrackSelectionParameters = TrackSelectionParameters.Builder(context).build(), ) : BasePlayer(), MPVLib.EventObserver, AudioManager.OnAudioFocusChangeListener { private val audioManager: AudioManager by lazy { context.getSystemService()!! } @@ -96,8 +97,8 @@ class MPVPlayer( MPVLib.setOptionString("sub-use-margins", "no") // Language - MPVLib.setOptionString("alang", appPreferences.preferredAudioLanguage) - MPVLib.setOptionString("slang", appPreferences.preferredSubtitleLanguage) + MPVLib.setOptionString("alang", trackSelectionParameters.preferredAudioLanguages.firstOrNull() ?: "") + MPVLib.setOptionString("slang", trackSelectionParameters.preferredTextLanguages.firstOrNull() ?: "") // Other options MPVLib.setOptionString("force-window", "no") @@ -175,7 +176,6 @@ class MPVPlayer( private var currentCacheDurationMs: Long? = null private var initialCommands = mutableListOf>() private var initialSeekTo: Long = 0L - private var trackSelectionParameters: TrackSelectionParameters = TrackSelectionParameters.Builder(context).build() // mpv events override fun eventProperty(property: String) { @@ -949,6 +949,11 @@ class MPVPlayer( override fun setTrackSelectionParameters(parameters: TrackSelectionParameters) { trackSelectionParameters = parameters + + // Disabled track types + val disabledTrackTypes = parameters.disabledTrackTypes.map { TrackType.fromMedia3TrackType(it) } + + // Overrides val notOverriddenTypes = mutableSetOf(TrackType.VIDEO, TrackType.AUDIO, TrackType.SUBTITLE) for (override in parameters.overrides) { val trackType = TrackType.fromMedia3TrackType(override.key.type) @@ -958,7 +963,11 @@ class MPVPlayer( selectTrack(trackType, id) } for (notOverriddenType in notOverriddenTypes) { - selectTrack(notOverriddenType, "auto") + if (notOverriddenType in disabledTrackTypes) { + selectTrack(notOverriddenType, "no") + } else { + selectTrack(notOverriddenType, "auto") + } } } diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt index 656b0b4b..e18fc7e6 100644 --- a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -11,7 +11,7 @@ import androidx.media3.common.C import androidx.media3.common.MediaItem import androidx.media3.common.MediaMetadata import androidx.media3.common.Player -import androidx.media3.common.Tracks +import androidx.media3.common.TrackSelectionParameters import androidx.media3.exoplayer.DefaultRenderersFactory import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.trackselection.DefaultTrackSelector @@ -88,10 +88,15 @@ constructor( init { if (appPreferences.playerMpv) { + val trackSelectionParameters = TrackSelectionParameters.Builder(application) + .setPreferredAudioLanguage(appPreferences.preferredAudioLanguage) + .setPreferredTextLanguage(appPreferences.preferredSubtitleLanguage) + .build() player = MPVPlayer( application, false, appPreferences, + trackSelectionParameters, ) } else { val renderersFactory = @@ -310,8 +315,16 @@ constructor( releasePlayer() } - fun switchToTrack(trackType: TrackType, tracksGroup: Tracks.Group) { + fun switchToTrack(trackType: TrackType, index: Int) { if (player is MPVPlayer) { + // Index -1 equals disable track + if (index == -1) { + player.selectTrack(trackType, id = "no") + return + } + + // Get track to select based on index + val tracksGroup = player.currentTracks.groups.filter { TrackType.fromMedia3TrackType(it.type) == trackType }[index] val format = tracksGroup.mediaTrackGroup.getFormat(0) if (format.id == null) { return diff --git a/player/video/src/main/res/values/strings.xml b/player/video/src/main/res/values/strings.xml index 03c0d121..fe54ebe6 100644 --- a/player/video/src/main/res/values/strings.xml +++ b/player/video/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ Select playback speed "Select a version" External + None Enter picture-in-picture Locks the player Skip back