From 560e7cc545d87015abea249aa46d87300ef07130 Mon Sep 17 00:00:00 2001 From: Damontecres Date: Wed, 8 Oct 2025 21:37:10 -0400 Subject: [PATCH] Add max bitrate preference --- .../dolphin/preferences/AppPreference.kt | 47 +++++++++++++++++++ .../preferences/AppPreferencesSerializer.kt | 1 + .../dolphin/ui/playback/PlaybackViewModel.kt | 5 ++ app/src/main/proto/DolphinDataStore.proto | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 55 insertions(+) diff --git a/app/src/main/java/com/github/damontecres/dolphin/preferences/AppPreference.kt b/app/src/main/java/com/github/damontecres/dolphin/preferences/AppPreference.kt index 3fb86b10..d3b847a3 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/preferences/AppPreference.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/preferences/AppPreference.kt @@ -254,6 +254,52 @@ sealed interface AppPreference { }, ) + private const val MEGA_BIT = 1024 * 1024L + const val DEFAULT_BITRATE = 20 * MEGA_BIT + private val bitrateValues = + listOf( + 500 * 1024L, + 750 * 1024L, + 1 * MEGA_BIT, + 2 * MEGA_BIT, + 3 * MEGA_BIT, + 5 * MEGA_BIT, + 8 * MEGA_BIT, + 10 * MEGA_BIT, + 15 * MEGA_BIT, + DEFAULT_BITRATE, + *(30..100 step 10).map { it * MEGA_BIT }.toTypedArray(), + *(120..200 step 20).map { it * MEGA_BIT }.toTypedArray(), + ) + val MaxBitrate = + AppSliderPreference( + title = R.string.max_bitrate, + defaultValue = bitrateValues.indexOf(DEFAULT_BITRATE).toLong(), + min = 0, + max = bitrateValues.size - 1L, + interval = 1, + getter = { + bitrateValues.indexOf(it.playbackPreferences.maxBitrate).toLong() + }, + setter = { prefs, value -> + prefs.updatePlaybackPreferences { + maxBitrate = bitrateValues[value.toInt()] + } + }, + summarizer = { value -> + if (value != null) { + val v = bitrateValues.getOrNull(value.toInt()) ?: DEFAULT_BITRATE + if (v < MEGA_BIT) { + "${v / 1024} kbps" + } else { + "${v / MEGA_BIT} Mbps" + } + } else { + null + } + }, + ) + val RememberSelectedTab = AppSwitchPreference( title = R.string.remember_selected_tab, @@ -326,6 +372,7 @@ val basicPreferences = AppPreference.AutoPlayNextUp, AppPreference.AutoPlayNextDelay, AppPreference.SkipBackOnResume, + AppPreference.MaxBitrate, AppPreference.PlaybackDebugInfo, ), ), diff --git a/app/src/main/java/com/github/damontecres/dolphin/preferences/AppPreferencesSerializer.kt b/app/src/main/java/com/github/damontecres/dolphin/preferences/AppPreferencesSerializer.kt index 9cb09c05..0e0359bb 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/preferences/AppPreferencesSerializer.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/preferences/AppPreferencesSerializer.kt @@ -33,6 +33,7 @@ class AppPreferencesSerializer AppPreference.AutoPlayNextDelay.defaultValue skipBackOnResumeSeconds = AppPreference.SkipBackOnResume.defaultValue.seconds.inWholeMilliseconds + maxBitrate = AppPreference.DEFAULT_BITRATE }.build() homePagePreferences = HomePagePreferences diff --git a/app/src/main/java/com/github/damontecres/dolphin/ui/playback/PlaybackViewModel.kt b/app/src/main/java/com/github/damontecres/dolphin/ui/playback/PlaybackViewModel.kt index 4c36c8b3..e7d0dce5 100644 --- a/app/src/main/java/com/github/damontecres/dolphin/ui/playback/PlaybackViewModel.kt +++ b/app/src/main/java/com/github/damontecres/dolphin/ui/playback/PlaybackViewModel.kt @@ -16,6 +16,7 @@ import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import com.github.damontecres.dolphin.data.model.BaseItem import com.github.damontecres.dolphin.data.model.Chapter +import com.github.damontecres.dolphin.preferences.AppPreference import com.github.damontecres.dolphin.preferences.UserPreferences import com.github.damontecres.dolphin.ui.DefaultItemFields import com.github.damontecres.dolphin.ui.indexOfFirstOrNull @@ -267,6 +268,9 @@ class PlaybackViewModel Timber.i("No change in playback for changeStreams") return } + val maxBitrate = + preferences.appPreferences.playbackPreferences.maxBitrate + .takeIf { it > 0 } ?: AppPreference.DEFAULT_BITRATE val response = api.mediaInfoApi .getPostedPlaybackInfo( @@ -284,6 +288,7 @@ class PlaybackViewModel autoOpenLiveStream = true, mediaSourceId = null, alwaysBurnInSubtitleWhenTranscoding = null, + maxStreamingBitrate = maxBitrate.toInt(), ), ).content val source = response.mediaSources.firstOrNull() diff --git a/app/src/main/proto/DolphinDataStore.proto b/app/src/main/proto/DolphinDataStore.proto index d4484c61..7795cc61 100644 --- a/app/src/main/proto/DolphinDataStore.proto +++ b/app/src/main/proto/DolphinDataStore.proto @@ -12,6 +12,7 @@ message PlaybackPreferences { bool auto_play_next = 6; int64 auto_play_next_delay_seconds = 7; int64 skip_back_on_resume_seconds = 8; + int64 max_bitrate = 9; } message HomePagePreferences{ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8b90cb7f..68a0ef8d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -61,5 +61,6 @@ Confirm Remember selected tabs Director + Max bitrate