From 456ef1e6c08dc873e7055186f79ad7905a51e38a Mon Sep 17 00:00:00 2001 From: Bnyro Date: Wed, 15 Jun 2022 22:00:36 +0200 Subject: [PATCH] added player video format option --- .../libretube/fragments/PlayerFragment.kt | 171 ++++++------------ app/src/main/res/values/array.xml | 5 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/advanced_settings.xml | 13 +- 4 files changed, 71 insertions(+), 119 deletions(-) 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 4c275471d..c62d2d566 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -642,13 +642,53 @@ class PlayerFragment : Fragment() { } } + private fun setMediaSource( + streams: Streams, + subtitle: MutableList, + videoUri: Uri + ) { + val dataSourceFactory: DataSource.Factory = + DefaultHttpDataSource.Factory() + val videoItem: MediaItem = MediaItem.Builder() + .setUri(videoUri) + .setSubtitleConfigurations(subtitle) + .build() + val videoSource: MediaSource = + DefaultMediaSourceFactory(dataSourceFactory) + .createMediaSource(videoItem) + var audioSource: MediaSource = + ProgressiveMediaSource.Factory(dataSourceFactory) + .createMediaSource( + fromUri( + streams.audioStreams!![ + getMostBitRate( + streams.audioStreams + ) + ].url!! + ) + ) + val mergeSource: MediaSource = + MergingMediaSource(videoSource, audioSource) + exoPlayer.setMediaSource(mergeSource) + } + private fun setResolutionAndSubtitles(view: View, response: Streams) { + val sharedPreferences = + PreferenceManager.getDefaultSharedPreferences(requireContext()) + var videosNameArray: Array = arrayOf() + var videosUrlArray: Array = arrayOf() videosNameArray += "HLS" + + // append quality to list if it has the preferred format + val videoFormatPreference = sharedPreferences.getString("player_video_format", "WEBM") for (vid in response.videoStreams!!) { - val name = vid.quality + " " + vid.format - videosNameArray += name + if (vid.format.equals(videoFormatPreference)) { + videosNameArray += vid.quality!! + videosUrlArray += vid.url!!.toUri() + } } + // create a list of subtitles val subtitle = mutableListOf() if (response.subtitles!!.isNotEmpty()) { subtitle.add( @@ -658,49 +698,18 @@ class PlayerFragment : Fragment() { .build() ) } - val sharedPreferences = - PreferenceManager.getDefaultSharedPreferences(requireContext()) + // set resolution in the beginning val defres = sharedPreferences.getString("default_res", "")!! when { + // search for the default resolution in the videoNamesArray, select quality if found defres != "" -> { run lit@{ - response.videoStreams.forEachIndexed { index, pipedStream -> - if (pipedStream.quality!!.contains(defres)) { - val dataSourceFactory: DataSource.Factory = - DefaultHttpDataSource.Factory() - val videoItem: MediaItem = MediaItem.Builder() - .setUri(response.videoStreams[index].url) - .setSubtitleConfigurations(subtitle) - .build() - val videoSource: MediaSource = - DefaultMediaSourceFactory(dataSourceFactory) - .createMediaSource(videoItem) - var audioSource: MediaSource = - DefaultMediaSourceFactory(dataSourceFactory) - .createMediaSource( - fromUri(response.audioStreams!![0].url!!) - ) - if (response.videoStreams[index].quality == "720p" || - response.videoStreams[index].quality == "1080p" || - response.videoStreams[index].quality == "480p" - ) { - audioSource = - ProgressiveMediaSource.Factory(dataSourceFactory) - .createMediaSource( - fromUri( - response.audioStreams[ - getMostBitRate( - response.audioStreams - ) - ].url!! - ) - ) - } - val mergeSource: MediaSource = - MergingMediaSource(videoSource, audioSource) - exoPlayer.setMediaSource(mergeSource) + videosNameArray.forEachIndexed { index, pipedStream -> + if (pipedStream.contains(defres)) { + val videoUri = videosUrlArray[index - 1] + setMediaSource(response, subtitle, videoUri) view.findViewById(R.id.quality_text).text = - videosNameArray[index + 1] + videosNameArray[index] return@lit } else if (index + 1 == response.videoStreams.size) { val mediaItem: MediaItem = MediaItem.Builder() @@ -720,36 +729,8 @@ class PlayerFragment : Fragment() { exoPlayer.setMediaItem(mediaItem) } else -> { - val dataSourceFactory: DataSource.Factory = - DefaultHttpDataSource.Factory() - val videoItem: MediaItem = MediaItem.Builder() - .setUri(response.videoStreams[0].url) - .setSubtitleConfigurations(subtitle) - .build() - val videoSource: MediaSource = - DefaultMediaSourceFactory(dataSourceFactory) - .createMediaSource(videoItem) - var audioSource: MediaSource = - DefaultMediaSourceFactory(dataSourceFactory) - .createMediaSource(fromUri(response.audioStreams!![0].url!!)) - if (response.videoStreams[0].quality == "720p" || - response.videoStreams[0].quality == "1080p" || - response.videoStreams[0].quality == "480p" - ) { - audioSource = ProgressiveMediaSource.Factory(dataSourceFactory) - .createMediaSource( - fromUri( - response.audioStreams[ - getMostBitRate( - response.audioStreams - ) - ].url!! - ) - ) - } - val mergeSource: MediaSource = - MergingMediaSource(videoSource, audioSource) - exoPlayer.setMediaSource(mergeSource) + val videoUri = response.videoStreams[1].url?.toUri()!! + setMediaSource(response, subtitle, videoUri) view.findViewById(R.id.quality_text).text = videosNameArray[1] } } @@ -765,18 +746,6 @@ class PlayerFragment : Fragment() { videosNameArray ) { _, which -> whichQuality = which - if (response.subtitles.isNotEmpty()) { - val subtitle = - mutableListOf() - subtitle.add( - SubtitleConfiguration.Builder( - response.subtitles[0].url!!.toUri() - ) - .setMimeType(response.subtitles[0].mimeType!!) // The correct MIME type (required). - .setLanguage(response.subtitles[0].code) // The subtitle language (optional). - .build() - ) - } if (which == 0) { val mediaItem: MediaItem = MediaItem.Builder() .setUri(response.hls) @@ -784,43 +753,11 @@ class PlayerFragment : Fragment() { .build() exoPlayer.setMediaItem(mediaItem) } else { - val dataSourceFactory: DataSource.Factory = - DefaultHttpDataSource.Factory() - val videoItem: MediaItem = MediaItem.Builder() - .setUri(response.videoStreams[which - 1].url) - .setSubtitleConfigurations(subtitle) - .build() - val videoSource: MediaSource = - DefaultMediaSourceFactory(dataSourceFactory) - .createMediaSource(videoItem) - var audioSource: MediaSource = - DefaultMediaSourceFactory(dataSourceFactory) - .createMediaSource( - fromUri(response.audioStreams!![0].url!!) - ) - if (response.videoStreams[which - 1].quality == "720p" || - response.videoStreams[which - 1].quality == "1080p" || - response.videoStreams[which - 1].quality == "480p" - ) { - audioSource = - ProgressiveMediaSource.Factory(dataSourceFactory) - .createMediaSource( - fromUri( - response.audioStreams[ - getMostBitRate( - response.audioStreams - ) - ].url!! - ) - ) - } - val mergeSource: MediaSource = - MergingMediaSource(videoSource, audioSource) - exoPlayer.setMediaSource(mergeSource) + val videoUri = videosUrlArray[which - 1] + setMediaSource(response, subtitle, videoUri) } exoPlayer.seekTo(lastPosition) - view.findViewById(R.id.quality_text).text = - videosNameArray[which] + view.findViewById(R.id.quality_text).text = videosNameArray[which] } val dialog = builder.create() dialog.show() diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index e1e4cfcac..85c925c48 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -667,4 +667,9 @@ 450 + + WEBM + MPEG_4 + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 70863c848..3caa8f4fa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -183,4 +183,5 @@ Hide chapters Buffering goal The amount of seconds videos get preloaded at maximum. + Player video format diff --git a/app/src/main/res/xml/advanced_settings.xml b/app/src/main/res/xml/advanced_settings.xml index a2337d75f..a82c50bba 100644 --- a/app/src/main/res/xml/advanced_settings.xml +++ b/app/src/main/res/xml/advanced_settings.xml @@ -13,6 +13,15 @@ app:title="@string/defres" app:useSimpleSummaryProvider="true" /> + + + app:summary="@string/buffering_goal_summary" + app:title="@string/buffering_goal" />