added player video format option

This commit is contained in:
Bnyro 2022-06-15 22:00:36 +02:00
parent 3f900d5be7
commit 456ef1e6c0
4 changed files with 71 additions and 119 deletions

View File

@ -642,13 +642,53 @@ class PlayerFragment : Fragment() {
}
}
private fun setResolutionAndSubtitles(view: View, response: Streams) {
var videosNameArray: Array<CharSequence> = arrayOf()
videosNameArray += "HLS"
for (vid in response.videoStreams!!) {
val name = vid.quality + " " + vid.format
videosNameArray += name
private fun setMediaSource(
streams: Streams,
subtitle: MutableList<SubtitleConfiguration>,
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<CharSequence> = arrayOf()
var videosUrlArray: Array<Uri> = 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!!) {
if (vid.format.equals(videoFormatPreference)) {
videosNameArray += vid.quality!!
videosUrlArray += vid.url!!.toUri()
}
}
// create a list of subtitles
val subtitle = mutableListOf<SubtitleConfiguration>()
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<TextView>(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<TextView>(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<SubtitleConfiguration>()
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<TextView>(R.id.quality_text).text =
videosNameArray[which]
view.findViewById<TextView>(R.id.quality_text).text = videosNameArray[which]
}
val dialog = builder.create()
dialog.show()

View File

@ -667,4 +667,9 @@
<item>450</item>
</string-array>
<string-array name="playerVideoFormats">
<item>WEBM</item>
<item>MPEG_4</item>
</string-array>
</resources>

View File

@ -183,4 +183,5 @@
<string name="hide_chapters">Hide chapters</string>
<string name="buffering_goal">Buffering goal</string>
<string name="buffering_goal_summary">The amount of seconds videos get preloaded at maximum.</string>
<string name="playerVideoFormat">Player video format</string>
</resources>

View File

@ -13,6 +13,15 @@
app:title="@string/defres"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:icon="@drawable/ic_hd"
app:defaultValue="WEBM"
app:entries="@array/playerVideoFormats"
app:entryValues="@array/playerVideoFormats"
app:key="player_video_format"
app:title="@string/playerVideoFormat"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:icon="@drawable/ic_play"
app:defaultValue="1F"
@ -28,8 +37,8 @@
app:entries="@array/bufferingGoal"
app:entryValues="@array/bufferingGoal"
app:key="buffering_goal"
app:title="@string/buffering_goal"
app:summary="@string/buffering_goal_summary" />
app:summary="@string/buffering_goal_summary"
app:title="@string/buffering_goal" />
</PreferenceCategory>