From 1e4958b8be45452f5b8a33c56b5a333df296a876 Mon Sep 17 00:00:00 2001 From: FineFindus Date: Wed, 13 Nov 2024 20:32:52 +0100 Subject: [PATCH] feat: display full video sponsorblock categories --- .../java/com/github/libretube/api/PipedApi.kt | 3 ++- .../com/github/libretube/api/obj/Segment.kt | 4 ++++ .../github/libretube/helpers/PlayerHelper.kt | 3 ++- .../libretube/services/OnlinePlayerService.kt | 3 ++- .../libretube/ui/fragments/PlayerFragment.kt | 1 + .../libretube/ui/views/DescriptionLayout.kt | 21 +++++++++++++++++++ .../main/res/layout/description_layout.xml | 17 +++++++++++++++ app/src/main/res/values/array.xml | 1 + app/src/main/res/values/strings.xml | 1 + 9 files changed, 51 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/github/libretube/api/PipedApi.kt b/app/src/main/java/com/github/libretube/api/PipedApi.kt index 92a355884..b185b4fe2 100644 --- a/app/src/main/java/com/github/libretube/api/PipedApi.kt +++ b/app/src/main/java/com/github/libretube/api/PipedApi.kt @@ -43,7 +43,8 @@ interface PipedApi { @GET("sponsors/{videoId}") suspend fun getSegments( @Path("videoId") videoId: String, - @Query("category") category: String + @Query("category") category: String, + @Query("actionType") actionType: String? = null ): SegmentData @GET("dearrow") diff --git a/app/src/main/java/com/github/libretube/api/obj/Segment.kt b/app/src/main/java/com/github/libretube/api/obj/Segment.kt index c092a0892..0b7068fad 100644 --- a/app/src/main/java/com/github/libretube/api/obj/Segment.kt +++ b/app/src/main/java/com/github/libretube/api/obj/Segment.kt @@ -25,4 +25,8 @@ data class Segment( @Transient @IgnoredOnParcel val segmentStartAndEnd = FloatFloatPair(segment[0], segment[1]) + + companion object { + const val TYPE_FULL = "full" + } } diff --git a/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt b/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt index 2b645ffac..1a70db157 100644 --- a/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt @@ -81,7 +81,8 @@ object PlayerHelper { */ private val sbDefaultValues = mapOf( "sponsor" to SbSkipOptions.AUTOMATIC, - "selfpromo" to SbSkipOptions.AUTOMATIC + "selfpromo" to SbSkipOptions.AUTOMATIC, + "exclusive_access" to SbSkipOptions.AUTOMATIC, ) /** diff --git a/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt b/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt index e0d9b87ff..fbd500bb2 100644 --- a/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt +++ b/app/src/main/java/com/github/libretube/services/OnlinePlayerService.kt @@ -212,7 +212,8 @@ open class OnlinePlayerService : AbstractPlayerService() { if (sponsorBlockConfig.isEmpty()) return@runCatching sponsorBlockSegments = RetrofitInstance.api.getSegments( videoId, - JsonHelper.json.encodeToString(sponsorBlockConfig.keys) + JsonHelper.json.encodeToString(sponsorBlockConfig.keys), + """["skip","mute","full","poi","chapter"]""" ).segments withContext(Dispatchers.Main) { 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 ed4b3ffdb..d6aed0db6 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 @@ -319,6 +319,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { val segments: List? = mediaMetadata.extras?.parcelableList(IntentData.segments) viewModel.segments = segments.orEmpty() + binding.descriptionLayout.setSegments(viewModel.segments) playerBinding.exoProgress.setSegments(viewModel.segments) playerBinding.sbToggle.isVisible = true viewModel.segments.firstOrNull { it.category == PlayerHelper.SPONSOR_HIGHLIGHT_CATEGORY } diff --git a/app/src/main/java/com/github/libretube/ui/views/DescriptionLayout.kt b/app/src/main/java/com/github/libretube/ui/views/DescriptionLayout.kt index 89fd3cefd..dd27f5af1 100644 --- a/app/src/main/java/com/github/libretube/ui/views/DescriptionLayout.kt +++ b/app/src/main/java/com/github/libretube/ui/views/DescriptionLayout.kt @@ -12,10 +12,13 @@ import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import com.github.libretube.R +import com.github.libretube.api.obj.Segment import com.github.libretube.api.obj.Streams import com.github.libretube.databinding.DescriptionLayoutBinding +import com.github.libretube.enums.SbSkipOptions import com.github.libretube.extensions.formatShort import com.github.libretube.helpers.ClipboardHelper +import com.github.libretube.helpers.PlayerHelper import com.github.libretube.ui.activities.VideoTagsAdapter import com.github.libretube.util.HtmlParser import com.github.libretube.util.LinkHandler @@ -40,6 +43,23 @@ class DescriptionLayout( } } + fun setSegments(segments: List) { + if (PlayerHelper.getSponsorBlockCategories()[SB_SPONSOR_CATEGORY] == SbSkipOptions.OFF) { + // only show the badge if the user requested to show sponsors + return + } + + val segment = segments.filter { it.actionType == Segment.TYPE_FULL }.firstNotNullOfOrNull { + when (it.category) { + "sponsor" -> context.getString(R.string.category_sponsor) + "exclusive_access" -> context.getString(R.string.category_exclusive_access) + else -> null + } + } + binding.playerSponsorBadge.isVisible = segment != null + binding.playerSponsorBadge.text = segment + } + @SuppressLint("SetTextI18n") fun setStreams(streams: Streams) { this.streams = streams @@ -149,5 +169,6 @@ class DescriptionLayout( companion object { private const val ANIMATION_DURATION = 250L + private const val SB_SPONSOR_CATEGORY = "sponsor_category" } } diff --git a/app/src/main/res/layout/description_layout.xml b/app/src/main/res/layout/description_layout.xml index b95757cd6..0d0985dd3 100644 --- a/app/src/main/res/layout/description_layout.xml +++ b/app/src/main/res/layout/description_layout.xml @@ -8,6 +8,23 @@ android:orientation="vertical" android:paddingVertical="12dp"> + + + + + + filler music_offtopic preview + exclusive_access diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 09244cebe..cd38b6e60 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -107,6 +107,7 @@ For segments detailing future content without additional info. If it includes clips that only appear here, this is very likely the wrong category Show video highlight Could either be the advertised title, the thumbnail or the most interesting part of the video. You can skip to it by tapping on it in the chapters section + Exclusive Access License Accents Resting red