Merge pull request #2656 from Bnyro/master

Get available resolutions dynamically from player
This commit is contained in:
Bnyro 2023-01-10 20:15:18 +01:00 committed by GitHub
commit 6e62a328c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1202,63 +1202,34 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions {
exoPlayer.setMediaItem(mediaItem) exoPlayer.setMediaItem(mediaItem)
} }
private fun String?.qualityToInt(): Int { /**
this ?: return 0 * Get all available player resolutions
return this.toString().split("p").first().toInt() */
}
private fun getAvailableResolutions(): List<VideoResolution> { private fun getAvailableResolutions(): List<VideoResolution> {
if (!this::streams.isInitialized) return listOf() val resolutions = exoPlayer.currentTracks.groups.map { group ->
(0..group.length - 1).map {
val resolutions = mutableListOf<VideoResolution>() group.getTrackFormat(it).width
val videoStreams = try {
// attempt to sort the qualities, catch if there was an error ih parsing
streams.videoStreams?.sortedBy {
it.quality?.toLong() ?: 0L
}?.reversed()
.orEmpty()
} catch (_: Exception) {
streams.videoStreams.orEmpty()
}
for (vid in videoStreams) {
if (resolutions.any {
it.resolution == vid.quality.qualityToInt()
} || vid.url == null
) {
continue
} }
}.flatten()
.filter { it > 0 }
.sortedDescending()
.toSet()
.toList()
runCatching { return resolutions.map {
resolutions.add( VideoResolution(
VideoResolution( name = "${it}p",
name = "${vid.quality.qualityToInt()}p", resolution = it
resolution = vid.quality.qualityToInt() )
) }.toMutableList().also {
) it.add(
} 0,
/*
// append quality to list if it has the preferred format (e.g. MPEG)
val preferredMimeType = "video/${PlayerHelper.videoFormatPreference}"
if (vid.url != null && vid.mimeType == preferredMimeType)
*/
}
if (resolutions.isEmpty()) {
return listOf(
VideoResolution( VideoResolution(
getString(R.string.hls), getString(R.string.auto_quality),
resolution = Int.MAX_VALUE, resolution = Int.MAX_VALUE
adaptiveSourceUrl = streams.hls
) )
) )
} else {
resolutions.add(0, VideoResolution(getString(R.string.auto_quality), Int.MAX_VALUE))
} }
return resolutions
} }
private fun setResolutionAndSubtitles() { private fun setResolutionAndSubtitles() {