feat(phone): disable audio track type
And add back the option to disable the subtitle track type
This commit is contained in:
parent
e3ce8f5252
commit
3bcd652e32
4 changed files with 35 additions and 13 deletions
|
@ -11,7 +11,6 @@ import dev.jdtech.jellyfin.player.video.R
|
||||||
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
|
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
|
||||||
import java.lang.IllegalStateException
|
import java.lang.IllegalStateException
|
||||||
|
|
||||||
// TODO add option to disable track type
|
|
||||||
class TrackSelectionDialogFragment(
|
class TrackSelectionDialogFragment(
|
||||||
private val type: TrackType,
|
private val type: TrackType,
|
||||||
private val viewModel: PlayerActivityViewModel,
|
private val viewModel: PlayerActivityViewModel,
|
||||||
|
@ -24,12 +23,12 @@ class TrackSelectionDialogFragment(
|
||||||
val tracksGroups = viewModel.player.currentTracks.groups.filter { it.type == C.TRACK_TYPE_AUDIO }
|
val tracksGroups = viewModel.player.currentTracks.groups.filter { it.type == C.TRACK_TYPE_AUDIO }
|
||||||
builder.setTitle(getString(R.string.select_audio_track))
|
builder.setTitle(getString(R.string.select_audio_track))
|
||||||
.setSingleChoiceItems(
|
.setSingleChoiceItems(
|
||||||
tracksGroups.getTrackNames(),
|
arrayOf(getString(R.string.none)) + tracksGroups.getTrackNames(), // Add "None" at the top of the list
|
||||||
tracksGroups.indexOfFirst { it.isSelected },
|
tracksGroups.indexOfFirst { it.isSelected } + 1, // Add 1 to the index to account for the "None" item
|
||||||
) { dialog, which ->
|
) { dialog, which ->
|
||||||
viewModel.switchToTrack(
|
viewModel.switchToTrack(
|
||||||
TrackType.AUDIO,
|
TrackType.AUDIO,
|
||||||
tracksGroups[which],
|
which - 1, // Minus 1 to get the correct group without the "None" item. "None" becomes -1
|
||||||
)
|
)
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
}
|
}
|
||||||
|
@ -42,12 +41,12 @@ class TrackSelectionDialogFragment(
|
||||||
val tracksGroups = viewModel.player.currentTracks.groups.filter { it.type == C.TRACK_TYPE_TEXT }
|
val tracksGroups = viewModel.player.currentTracks.groups.filter { it.type == C.TRACK_TYPE_TEXT }
|
||||||
builder.setTitle(getString(R.string.select_subtile_track))
|
builder.setTitle(getString(R.string.select_subtile_track))
|
||||||
.setSingleChoiceItems(
|
.setSingleChoiceItems(
|
||||||
tracksGroups.getTrackNames(),
|
arrayOf(getString(R.string.none)) + tracksGroups.getTrackNames(),
|
||||||
tracksGroups.indexOfFirst { it.isSelected },
|
tracksGroups.indexOfFirst { it.isSelected } + 1,
|
||||||
) { dialog, which ->
|
) { dialog, which ->
|
||||||
viewModel.switchToTrack(
|
viewModel.switchToTrack(
|
||||||
TrackType.SUBTITLE,
|
TrackType.SUBTITLE,
|
||||||
tracksGroups[which],
|
which - 1,
|
||||||
)
|
)
|
||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ class MPVPlayer(
|
||||||
context: Context,
|
context: Context,
|
||||||
private val requestAudioFocus: Boolean,
|
private val requestAudioFocus: Boolean,
|
||||||
private val appPreferences: AppPreferences,
|
private val appPreferences: AppPreferences,
|
||||||
|
private var trackSelectionParameters: TrackSelectionParameters = TrackSelectionParameters.Builder(context).build(),
|
||||||
) : BasePlayer(), MPVLib.EventObserver, AudioManager.OnAudioFocusChangeListener {
|
) : BasePlayer(), MPVLib.EventObserver, AudioManager.OnAudioFocusChangeListener {
|
||||||
|
|
||||||
private val audioManager: AudioManager by lazy { context.getSystemService()!! }
|
private val audioManager: AudioManager by lazy { context.getSystemService()!! }
|
||||||
|
@ -96,8 +97,8 @@ class MPVPlayer(
|
||||||
MPVLib.setOptionString("sub-use-margins", "no")
|
MPVLib.setOptionString("sub-use-margins", "no")
|
||||||
|
|
||||||
// Language
|
// Language
|
||||||
MPVLib.setOptionString("alang", appPreferences.preferredAudioLanguage)
|
MPVLib.setOptionString("alang", trackSelectionParameters.preferredAudioLanguages.firstOrNull() ?: "")
|
||||||
MPVLib.setOptionString("slang", appPreferences.preferredSubtitleLanguage)
|
MPVLib.setOptionString("slang", trackSelectionParameters.preferredTextLanguages.firstOrNull() ?: "")
|
||||||
|
|
||||||
// Other options
|
// Other options
|
||||||
MPVLib.setOptionString("force-window", "no")
|
MPVLib.setOptionString("force-window", "no")
|
||||||
|
@ -175,7 +176,6 @@ class MPVPlayer(
|
||||||
private var currentCacheDurationMs: Long? = null
|
private var currentCacheDurationMs: Long? = null
|
||||||
private var initialCommands = mutableListOf<Array<String>>()
|
private var initialCommands = mutableListOf<Array<String>>()
|
||||||
private var initialSeekTo: Long = 0L
|
private var initialSeekTo: Long = 0L
|
||||||
private var trackSelectionParameters: TrackSelectionParameters = TrackSelectionParameters.Builder(context).build()
|
|
||||||
|
|
||||||
// mpv events
|
// mpv events
|
||||||
override fun eventProperty(property: String) {
|
override fun eventProperty(property: String) {
|
||||||
|
@ -949,6 +949,11 @@ class MPVPlayer(
|
||||||
|
|
||||||
override fun setTrackSelectionParameters(parameters: TrackSelectionParameters) {
|
override fun setTrackSelectionParameters(parameters: TrackSelectionParameters) {
|
||||||
trackSelectionParameters = parameters
|
trackSelectionParameters = parameters
|
||||||
|
|
||||||
|
// Disabled track types
|
||||||
|
val disabledTrackTypes = parameters.disabledTrackTypes.map { TrackType.fromMedia3TrackType(it) }
|
||||||
|
|
||||||
|
// Overrides
|
||||||
val notOverriddenTypes = mutableSetOf(TrackType.VIDEO, TrackType.AUDIO, TrackType.SUBTITLE)
|
val notOverriddenTypes = mutableSetOf(TrackType.VIDEO, TrackType.AUDIO, TrackType.SUBTITLE)
|
||||||
for (override in parameters.overrides) {
|
for (override in parameters.overrides) {
|
||||||
val trackType = TrackType.fromMedia3TrackType(override.key.type)
|
val trackType = TrackType.fromMedia3TrackType(override.key.type)
|
||||||
|
@ -958,7 +963,11 @@ class MPVPlayer(
|
||||||
selectTrack(trackType, id)
|
selectTrack(trackType, id)
|
||||||
}
|
}
|
||||||
for (notOverriddenType in notOverriddenTypes) {
|
for (notOverriddenType in notOverriddenTypes) {
|
||||||
selectTrack(notOverriddenType, "auto")
|
if (notOverriddenType in disabledTrackTypes) {
|
||||||
|
selectTrack(notOverriddenType, "no")
|
||||||
|
} else {
|
||||||
|
selectTrack(notOverriddenType, "auto")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ import androidx.media3.common.C
|
||||||
import androidx.media3.common.MediaItem
|
import androidx.media3.common.MediaItem
|
||||||
import androidx.media3.common.MediaMetadata
|
import androidx.media3.common.MediaMetadata
|
||||||
import androidx.media3.common.Player
|
import androidx.media3.common.Player
|
||||||
import androidx.media3.common.Tracks
|
import androidx.media3.common.TrackSelectionParameters
|
||||||
import androidx.media3.exoplayer.DefaultRenderersFactory
|
import androidx.media3.exoplayer.DefaultRenderersFactory
|
||||||
import androidx.media3.exoplayer.ExoPlayer
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
|
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
|
||||||
|
@ -88,10 +88,15 @@ constructor(
|
||||||
|
|
||||||
init {
|
init {
|
||||||
if (appPreferences.playerMpv) {
|
if (appPreferences.playerMpv) {
|
||||||
|
val trackSelectionParameters = TrackSelectionParameters.Builder(application)
|
||||||
|
.setPreferredAudioLanguage(appPreferences.preferredAudioLanguage)
|
||||||
|
.setPreferredTextLanguage(appPreferences.preferredSubtitleLanguage)
|
||||||
|
.build()
|
||||||
player = MPVPlayer(
|
player = MPVPlayer(
|
||||||
application,
|
application,
|
||||||
false,
|
false,
|
||||||
appPreferences,
|
appPreferences,
|
||||||
|
trackSelectionParameters,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
val renderersFactory =
|
val renderersFactory =
|
||||||
|
@ -310,8 +315,16 @@ constructor(
|
||||||
releasePlayer()
|
releasePlayer()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun switchToTrack(trackType: TrackType, tracksGroup: Tracks.Group) {
|
fun switchToTrack(trackType: TrackType, index: Int) {
|
||||||
if (player is MPVPlayer) {
|
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)
|
val format = tracksGroup.mediaTrackGroup.getFormat(0)
|
||||||
if (format.id == null) {
|
if (format.id == null) {
|
||||||
return
|
return
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
<string name="select_playback_speed">Select playback speed</string>
|
<string name="select_playback_speed">Select playback speed</string>
|
||||||
<string name="select_a_version">"Select a version"</string>
|
<string name="select_a_version">"Select a version"</string>
|
||||||
<string name="external">External</string>
|
<string name="external">External</string>
|
||||||
|
<string name="none">None</string>
|
||||||
<string name="player_controls_picture_in_picture">Enter picture-in-picture</string>
|
<string name="player_controls_picture_in_picture">Enter picture-in-picture</string>
|
||||||
<string name="player_controls_lock">Locks the player</string>
|
<string name="player_controls_lock">Locks the player</string>
|
||||||
<string name="player_controls_skip_back">Skip back</string>
|
<string name="player_controls_skip_back">Skip back</string>
|
||||||
|
|
Loading…
Reference in a new issue