diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index 0cc9d37b1..1a4a98cae 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -77,6 +77,7 @@ import com.google.android.exoplayer2.source.DefaultMediaSourceFactory import com.google.android.exoplayer2.source.MediaSource import com.google.android.exoplayer2.source.MergingMediaSource import com.google.android.exoplayer2.source.ProgressiveMediaSource +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.ui.AspectRatioFrameLayout import com.google.android.exoplayer2.ui.CaptionStyleCompat import com.google.android.exoplayer2.ui.PlayerNotificationManager @@ -122,6 +123,7 @@ class PlayerFragment : Fragment() { private var isLoading = true private lateinit var exoPlayerView: StyledPlayerView private lateinit var exoPlayer: ExoPlayer + private lateinit var trackSelector: DefaultTrackSelector private lateinit var segmentData: Segments private var relatedStreamsEnabled = true @@ -1165,7 +1167,9 @@ class PlayerFragment : Fragment() { } } // create a list of subtitles - subtitle = mutableListOf() + subtitle = mutableListOf() + val subtitlesNamesList = mutableListOf(context?.getString(R.string.none)!!) + val subtitleCodesList = mutableListOf("") response.subtitles!!.forEach { subtitle.add( SubtitleConfiguration.Builder(it.url!!.toUri()) @@ -1173,7 +1177,51 @@ class PlayerFragment : Fragment() { .setLanguage(it.code) // The subtitle language (optional). .build() ) + subtitlesNamesList += it.name!! + subtitleCodesList += it.code!! } + + // captions selection dialog + // hide caption selection view if no subtitles available + if (response.subtitles.isEmpty()) playerBinding.captions.visibility = View.GONE + playerBinding.captions.setOnClickListener { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.captions) + .setItems(subtitlesNamesList.toTypedArray()) { _, index -> + val newParams = if (index != 0) { + // caption selected + + // get the caption name and language + val captionLanguage = subtitlesNamesList[index] + val captionLanguageCode = subtitleCodesList[index] + + // update the icon + playerBinding.captions.setImageResource(R.drawable.ic_caption) + playerBinding.captions.setColorFilter(Color.WHITE) + + // select the new caption preference + trackSelector.buildUponParameters() + .setPreferredTextLanguages( + captionLanguage, + captionLanguageCode + ) + .setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION) + } else { + // none selected + playerBinding.captions.setImageResource(R.drawable.ic_caption_outlined) + playerBinding.captions.setColorFilter(Color.GRAY) + + // disable captions + trackSelector.buildUponParameters() + .setPreferredTextLanguage("") + } + + // set the new caption language + trackSelector.setParameters(newParams) + } + .show() + } + // set media source and resolution in the beginning setStreamSource( response, @@ -1222,11 +1270,11 @@ class PlayerFragment : Fragment() { ) { val defRes = PreferenceHelper.getString( requireContext(), - "default_resolution", - "hls" + "default_res", + "" )!! - if (defRes != "hls") { + if (defRes != "") { videosNameArray.forEachIndexed { index, pipedStream -> // search for quality preference in the available stream sources if (pipedStream.contains(defRes)) { @@ -1290,9 +1338,12 @@ class PlayerFragment : Fragment() { ) .build() + trackSelector = DefaultTrackSelector(requireContext()) + exoPlayer = ExoPlayer.Builder(view.context) .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory)) .setLoadControl(loadControl) + .setTrackSelector(trackSelector) .build() exoPlayer.setAudioAttributes(audioAttributes, true) diff --git a/app/src/main/java/com/github/libretube/util/PlayerHelper.kt b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt index b5c7c1c96..43237e428 100644 --- a/app/src/main/java/com/github/libretube/util/PlayerHelper.kt +++ b/app/src/main/java/com/github/libretube/util/PlayerHelper.kt @@ -6,18 +6,20 @@ import com.github.libretube.obj.PipedStream import com.google.android.exoplayer2.ui.CaptionStyleCompat object PlayerHelper { + private val TAG = "PlayerHelper" + // get the best bit rate from audio streams fun getMostBitRate(audios: List): String { var bitrate = 0 - var index = 0 - for ((i, audio) in audios.withIndex()) { - val q = audio.quality!!.replace(" kbps", "").toInt() + var audioUrl = "" + audios.forEach { + val q = it.quality!!.replace(" kbps", "").toInt() if (q > bitrate) { bitrate = q - index = i + audioUrl = it.url.toString() } } - return audios[index].url!! + return audioUrl } // get the system default caption style @@ -31,4 +33,4 @@ object PlayerHelper { CaptionStyleCompat.createFromCaptionStyle(captioningManager.userStyle) } } -} \ No newline at end of file +} diff --git a/app/src/main/res/drawable/ic_aspect_ratio.xml b/app/src/main/res/drawable/ic_aspect_ratio.xml index 583bcfb31..a783c45e8 100644 --- a/app/src/main/res/drawable/ic_aspect_ratio.xml +++ b/app/src/main/res/drawable/ic_aspect_ratio.xml @@ -2,10 +2,9 @@ android:width="24dp" android:height="24dp" android:tint="@android:color/white" - android:viewportWidth="24" - android:viewportHeight="24"> - + android:viewportWidth="48" + android:viewportHeight="48"> + diff --git a/app/src/main/res/drawable/ic_caption_outlined.xml b/app/src/main/res/drawable/ic_caption_outlined.xml new file mode 100644 index 000000000..a803ff72a --- /dev/null +++ b/app/src/main/res/drawable/ic_caption_outlined.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/exo_styled_player_control_view.xml b/app/src/main/res/layout/exo_styled_player_control_view.xml index e7c188e64..9e64eb5b0 100644 --- a/app/src/main/res/layout/exo_styled_player_control_view.xml +++ b/app/src/main/res/layout/exo_styled_player_control_view.xml @@ -96,8 +96,10 @@ android:visibility="gone"> + android:id="@+id/captions" + style="@style/PlayerControlTop" + android:src="@drawable/ic_caption_outlined" + app:tint="@android:color/darker_gray" /> 144p - hls + 1080p 720p 480p diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8d53e5f21..39684473a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -250,4 +250,6 @@ Watch positions Reset watch positions System caption style + Captions + None \ No newline at end of file diff --git a/app/src/main/res/xml/player_settings.xml b/app/src/main/res/xml/player_settings.xml index a0000366a..10563cdc6 100644 --- a/app/src/main/res/xml/player_settings.xml +++ b/app/src/main/res/xml/player_settings.xml @@ -6,10 +6,10 @@