From d3895124eff3813129aa78baa6d115d822ce3756 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 5 Mar 2023 12:37:41 +0100 Subject: [PATCH] Support for LBRY HLS --- .../libretube/constants/PreferenceKeys.kt | 1 + .../github/libretube/helpers/DashHelper.kt | 19 ++++--- .../libretube/ui/dialogs/DownloadDialog.kt | 2 +- .../libretube/ui/fragments/PlayerFragment.kt | 50 ++++++++++++------- app/src/main/res/values/strings.xml | 3 ++ app/src/main/res/xml/audio_video_settings.xml | 7 +++ 6 files changed, 55 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt index f81e1d1de..0a38fada7 100644 --- a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt +++ b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt @@ -93,6 +93,7 @@ object PreferenceKeys { const val SKIP_SILENCE = "skip_silence" const val ENABLED_VIDEO_CODECS = "video_codecs" const val AUTOPLAY_COUNTDOWN = "autoplay_countdown" + const val LBRY_HLS = "lbry_hls" /** * Background mode diff --git a/app/src/main/java/com/github/libretube/helpers/DashHelper.kt b/app/src/main/java/com/github/libretube/helpers/DashHelper.kt index c4c25948a..b5816c7a7 100644 --- a/app/src/main/java/com/github/libretube/helpers/DashHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/DashHelper.kt @@ -40,14 +40,17 @@ object DashHelper { val adapSetInfos = ArrayList() val enabledVideoCodecs = PlayerHelper.enabledVideoCodecs - // filter the codecs according to the user's preferences - for (stream in streams.videoStreams.filter { - if (enabledVideoCodecs != "all") { - it.codec?.lowercase()?.startsWith(enabledVideoCodecs) ?: true - } else { - true - } - }) { + for (stream in streams.videoStreams + // used to avoid including LBRY HLS inside the streams in the manifest + .filter { !it.format.orEmpty().contains("HLS") } + // filter the codecs according to the user's preferences + .filter { + if (enabledVideoCodecs != "all") { + it.codec?.lowercase()?.startsWith(enabledVideoCodecs) ?: true + } else { + true + } + }) { // ignore dual format streams if (!stream.videoOnly!!) { continue diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt index 3bc682bd9..4648dd170 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt @@ -81,7 +81,7 @@ class DownloadDialog( val videoStreams = streams.videoStreams.filter { !it.url.isNullOrEmpty() - }.sortedByDescending { + }.filter { !it.format.orEmpty().contains("HLS") }.sortedByDescending { it.quality.getWhileDigit() } diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index c22b37c23..3901dcb59 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -1274,26 +1274,40 @@ class PlayerFragment : Fragment(R.layout.fragment_player), OnlinePlayerOptions { val defaultResolution = PlayerHelper.getDefaultResolution(requireContext()).replace("p", "") if (defaultResolution.isNotEmpty()) setPlayerResolution(defaultResolution.toInt()) - if (!PreferenceHelper.getBoolean(PreferenceKeys.USE_HLS_OVER_DASH, false) && - streams.videoStreams.isNotEmpty() - ) { - // only use the dash manifest generated by YT if either it's a livestream or no other source is available - val uri = streams.dash?.toUri().takeIf { - streams.livestream || streams.videoStreams.isEmpty() - } ?: let { - val manifest = DashHelper.createManifest(streams) - - // encode to base64 - val encoded = Base64.encodeToString(manifest.toByteArray(), Base64.DEFAULT) - - "data:application/dash+xml;charset=utf-8;base64,$encoded".toUri() + when { + // LBRY HLS + PreferenceHelper.getBoolean(PreferenceKeys.LBRY_HLS, false) && streams.videoStreams.any { + it.quality.orEmpty().contains("LBRY HLS") + } -> { + val lbryHlsUrl = streams.videoStreams.first { + it.quality!!.contains("LBRY HLS") + }.url!! + setMediaSource(lbryHlsUrl.toUri(), MimeTypes.APPLICATION_M3U8) } + // DASH + !PreferenceHelper.getBoolean(PreferenceKeys.USE_HLS_OVER_DASH, false) && streams.videoStreams.isNotEmpty() -> { + // only use the dash manifest generated by YT if either it's a livestream or no other source is available + val uri = streams.dash?.toUri().takeIf { + streams.livestream || streams.videoStreams.isEmpty() + } ?: let { + val manifest = DashHelper.createManifest(streams) - this.setMediaSource(uri, MimeTypes.APPLICATION_MPD) - } else if (streams.hls != null) { - setMediaSource(streams.hls!!.toUri(), MimeTypes.APPLICATION_M3U8) - } else { - Toast.makeText(context, R.string.unknown_error, Toast.LENGTH_SHORT).show() + // encode to base64 + val encoded = Base64.encodeToString(manifest.toByteArray(), Base64.DEFAULT) + + "data:application/dash+xml;charset=utf-8;base64,$encoded".toUri() + } + + this.setMediaSource(uri, MimeTypes.APPLICATION_MPD) + } + // HLS + streams.hls != null -> { + setMediaSource(streams.hls!!.toUri(), MimeTypes.APPLICATION_M3U8) + } + // NO STREAM FOUND + else -> { + Toast.makeText(context, R.string.unknown_error, Toast.LENGTH_SHORT).show() + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d2552a12e..e9e968735 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -449,6 +449,9 @@ Autoplay countdown Show a 5s countdown before auto-playing the next video. Playing next in %1$s + LBRY HLS + Use LBRY HLS for streaming if available. + Download Service Shows a notification when downloading media. diff --git a/app/src/main/res/xml/audio_video_settings.xml b/app/src/main/res/xml/audio_video_settings.xml index 5daf5cf77..b3b6e75a2 100644 --- a/app/src/main/res/xml/audio_video_settings.xml +++ b/app/src/main/res/xml/audio_video_settings.xml @@ -76,6 +76,13 @@ android:title="@string/hls_instead_of_dash" app:key="use_hls" /> + +