From eb386fdcdbb39fb4fbee3a590b2cc8ee9949d4c6 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 19 Jul 2023 10:09:05 +0200 Subject: [PATCH] feat: option to force lowest audio quality --- .../github/libretube/helpers/PlayerHelper.kt | 25 ++++++++++++++++--- .../libretube/services/OnlinePlayerService.kt | 5 ++++ .../libretube/ui/fragments/PlayerFragment.kt | 2 ++ app/src/main/res/values/array.xml | 4 +-- app/src/main/res/xml/audio_video_settings.xml | 9 ++----- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt b/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt index 308ae2918..34719292c 100644 --- a/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt @@ -27,6 +27,7 @@ import androidx.media3.common.Tracks import androidx.media3.exoplayer.DefaultLoadControl import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.LoadControl +import androidx.media3.exoplayer.trackselection.DefaultTrackSelector import androidx.media3.ui.CaptionStyleCompat import com.github.libretube.R import com.github.libretube.api.obj.ChapterSegment @@ -37,6 +38,7 @@ import com.github.libretube.constants.PreferenceKeys import com.github.libretube.db.DatabaseHolder import com.github.libretube.enums.PlayerEvent import com.github.libretube.enums.SbSkipOptions +import com.github.libretube.extensions.updateParameters import com.github.libretube.obj.PreviewFrame import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.runBlocking @@ -331,6 +333,23 @@ object PlayerHelper { return PreferenceHelper.getString(prefKey, "") } + /** + * Apply the preferred audio quality: auto or worst + */ + @androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class) + fun applyPreferredAudioQuality(context: Context, trackSelector: DefaultTrackSelector) { + val prefKey = if (NetworkHelper.isNetworkMetered(context)) { + PreferenceKeys.PLAYER_AUDIO_QUALITY_MOBILE + } else { + PreferenceKeys.PLAYER_AUDIO_QUALITY + } + when (PreferenceHelper.getString(prefKey, "auto")) { + "worst" -> trackSelector.updateParameters { + setMaxAudioBitrate(1) + } + } + } + fun getIntentActon(context: Context): String { return context.packageName + "." + ACTION_MEDIA_CONTROL } @@ -659,7 +678,7 @@ object PlayerHelper { * * Duplicate audio languages with their role flags are removed. * - * @param groups the list of [Group]s of the current tracks played by the player + * @param groups the list of [Tracks.Group]s of the current tracks played by the player * @param keepOnlySelectedTracks whether to get only the selected audio languages with their * role flags among the supported ones * @return a list of distinct audio languages with their role flags from the supported formats @@ -697,9 +716,7 @@ object PlayerHelper { * @param flag a flag to check its presence in the given bitfield * @return whether the given flag is set in the given bitfield */ - private fun isFlagSet(bitField: Int, flag: Int): Boolean { - return bitField and flag == flag; - } + private fun isFlagSet(bitField: Int, flag: Int) = bitField and flag == flag /** * Check whether the given ExoPlayer role flags contain at least one flag used for audio diff --git a/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt b/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt index 5ede7d7c1..3c858e81b 100644 --- a/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt +++ b/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt @@ -17,6 +17,7 @@ import androidx.media3.common.MimeTypes import androidx.media3.common.PlaybackException import androidx.media3.common.Player import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.exoplayer.trackselection.DefaultTrackSelector import com.github.libretube.R import com.github.libretube.api.JsonHelper import com.github.libretube.api.RetrofitInstance @@ -230,11 +231,15 @@ class OnlinePlayerService : LifecycleService() { private fun initializePlayer() { if (player != null) return + val trackSelector = DefaultTrackSelector(this) + PlayerHelper.applyPreferredAudioQuality(this, trackSelector) + player = ExoPlayer.Builder(this) .setUsePlatformDiagnostics(false) .setHandleAudioBecomingNoisy(true) .setAudioAttributes(PlayerHelper.getAudioAttributes(), true) .setLoadControl(PlayerHelper.getLoadControl()) + .setTrackSelector(trackSelector) .build() .loadPlaybackParams(isBackgroundMode = true) diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index 025c67515..63fe294c3 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -1360,6 +1360,8 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { } } + PlayerHelper.applyPreferredAudioQuality(requireContext(), trackSelector) + exoPlayer = ExoPlayer.Builder(requireContext()) .setUsePlatformDiagnostics(false) .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory)) diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index 4d6201caa..5726f3e30 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -259,12 +259,12 @@ - @string/best_quality + @string/auto @string/worst_quality - best + auto worst diff --git a/app/src/main/res/xml/audio_video_settings.xml b/app/src/main/res/xml/audio_video_settings.xml index 625177a70..bd0ad391c 100644 --- a/app/src/main/res/xml/audio_video_settings.xml +++ b/app/src/main/res/xml/audio_video_settings.xml @@ -13,16 +13,14 @@ app:title="@string/defres" app:useSimpleSummaryProvider="true" /> - @@ -37,20 +35,17 @@ app:title="@string/defres" app:useSimpleSummaryProvider="true" /> - -