From 632407fa699612192031f7f97b75092b287b18a7 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 13 Sep 2024 14:17:21 +0200 Subject: [PATCH] make streamselect reflect reality better --- .../newpipe/newplayer/utils/StreamSelect.kt | 63 +++++++++++++------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelect.kt b/new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelect.kt index c076528..15d568d 100644 --- a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelect.kt +++ b/new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelect.kt @@ -114,6 +114,14 @@ object StreamSelect { private fun getNonDynamicAudioVariants(availableStreamVariants: List) = availableStreamVariants.filter { it.streamType == StreamType.AUDIO } + private fun hasVideoStreamVariants(availableStreamVariants: List): Boolean { + for (variant in availableStreamVariants) { + if (variant.streamType == StreamType.AUDIO_AND_VIDEO || variant.streamType == StreamType.VIDEO || variant.streamType == StreamType.DYNAMIC) + return true + } + return false + } + fun selectStream( item: String, playMode: PlayMode, @@ -123,6 +131,8 @@ object StreamSelect { preferredLanguage: List ): StreamSelection { + // filter for best fitting language stream variants + val bestFittingLanguage = getBestLanguageFit(availableStreamVariants, preferredLanguage) val availableVariantsInPreferredLanguage = if (bestFittingLanguage != null) filterVariantsByLanguage( @@ -133,10 +143,11 @@ object StreamSelect { emptyList() } - if (playMode == PlayMode.FULLSCREEN_VIDEO - || playMode == PlayMode.EMBEDDED_VIDEO - || playMode == PlayMode.PIP - ) { + + // is it a video stream or a pure audio stream? + if (hasVideoStreamVariants(availableStreamVariants)) { + + // first: try and get a dynamic stream variant getDynamicStream(availableVariantsInPreferredLanguage) ?: getDynamicStream( availableStreamVariants @@ -144,7 +155,9 @@ object StreamSelect { return SingleSelection(it) } - val bestIdentifier = + // second: try and get seperate audio and video stream variants + + val bestVideoIdentifier = getBestFittingVideoIdentifier( availableVariantsInPreferredLanguage, preferredVideoIdentifier @@ -164,10 +177,10 @@ object StreamSelect { val videoOnlyStream = getVideoOnlyVariantWithMatchingIdentifier( availableVariantsInPreferredLanguage, - bestIdentifier + bestVideoIdentifier ) ?: getVideoOnlyVariantWithMatchingIdentifier( availableStreamVariants, - bestIdentifier + bestVideoIdentifier ) if (videoOnlyStream != null) { @@ -180,20 +193,27 @@ object StreamSelect { } } - getFirstVariantMatchingIdentifier(availableVariantsInPreferredLanguage, bestIdentifier) - ?: getFirstVariantMatchingIdentifier(availableStreamVariants, bestIdentifier)?.let { + // fourth: try to get a video and audio stream variant with the best fitting identifier + + getFirstVariantMatchingIdentifier( + availableVariantsInPreferredLanguage, + bestVideoIdentifier + ) + ?: getFirstVariantMatchingIdentifier( + availableStreamVariants, + bestVideoIdentifier + )?.let { return SingleSelection(it) } + // fifth: try and get the median video and audio stream variant + return SingleSelection(run { val videoVariants = - getNonDynamicVideoVariants(availableVariantsInPreferredLanguage).let { - if (it.isNotEmpty()) { - it - } else { - getNonDynamicVideoVariants(availableStreamVariants) - } + getNonDynamicVideoVariants(availableVariantsInPreferredLanguage).ifEmpty { + getNonDynamicVideoVariants(availableStreamVariants) } + if (videoVariants.isNotEmpty()) { return@run videoVariants[videoVariants.size / 2] } else { @@ -201,7 +221,10 @@ object StreamSelect { } }) - } else { + } else { /* if(hasVideoStreamVariants(availableStreamVariants)) */ + + // first: try to get an audio stream variant with the best fitting identifier + getBestFittingAudioVariant( availableVariantsInPreferredLanguage, preferredAudioIdentifier @@ -213,10 +236,12 @@ object StreamSelect { return SingleSelection(it) } + // second: try and get the median audio stream variant + return SingleSelection(run { val audioVariants = - getNonDynamicAudioVariants(availableVariantsInPreferredLanguage).let{ - if(it.isNotEmpty()) { + getNonDynamicAudioVariants(availableVariantsInPreferredLanguage).let { + if (it.isNotEmpty()) { it } else { getNonDynamicAudioVariants(availableStreamVariants) @@ -229,7 +254,5 @@ object StreamSelect { } }) } - - } } \ No newline at end of file