From c30def8c16c15f7198970e12607e8ef4eaa95c67 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 24 Aug 2023 17:12:27 +0200 Subject: [PATCH] fix: don't show the highlight as chapter for the whole remaining video --- .../com/github/libretube/api/obj/ChapterSegment.kt | 11 +++++++++-- .../com/github/libretube/helpers/PlayerHelper.kt | 11 ++++++++++- .../github/libretube/ui/adapters/ChaptersAdapter.kt | 13 +++++++++---- .../github/libretube/ui/fragments/PlayerFragment.kt | 2 +- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/github/libretube/api/obj/ChapterSegment.kt b/app/src/main/java/com/github/libretube/api/obj/ChapterSegment.kt index aec5819fb..be9d9629a 100644 --- a/app/src/main/java/com/github/libretube/api/obj/ChapterSegment.kt +++ b/app/src/main/java/com/github/libretube/api/obj/ChapterSegment.kt @@ -10,5 +10,12 @@ data class ChapterSegment( val image: String = "", val start: Long, // Used only for video highlights - @Transient var drawable: Drawable? = null -) + @Transient var highlightDrawable: Drawable? = null +) { + companion object { + /** + * Length to show for a highlight in seconds + */ + const val HIGHLIGHT_LENGTH = 10L + } +} 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 ec949518e..4673b8bff 100644 --- a/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt +++ b/app/src/main/java/com/github/libretube/helpers/PlayerHelper.kt @@ -533,7 +533,16 @@ object PlayerHelper { */ fun getCurrentChapterIndex(exoPlayer: ExoPlayer, chapters: List): Int? { val currentPosition = exoPlayer.currentPosition / 1000 - return chapters.indexOfLast { currentPosition >= it.start }.takeIf { it >= 0 } + return chapters + .filter { + it.highlightDrawable == null || + // remove the video highlight if it's already longer ago than [ChapterSegment.HIGHLIGHT_LENGTH], + // otherwise the SponsorBlock highlight would be shown from its starting point to the end + (currentPosition - it.start) < ChapterSegment.HIGHLIGHT_LENGTH + } + .sortedBy { it.start } + .indexOfLast { currentPosition >= it.start } + .takeIf { it >= 0 } } fun getPosition(videoId: String, duration: Long?): Long? { diff --git a/app/src/main/java/com/github/libretube/ui/adapters/ChaptersAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/ChaptersAdapter.kt index 777858cf6..83e5c1970 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/ChaptersAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/ChaptersAdapter.kt @@ -28,16 +28,21 @@ class ChaptersAdapter( override fun onBindViewHolder(holder: ChaptersViewHolder, position: Int) { val chapter = chapters[position] holder.binding.apply { - if (chapter.drawable != null) { - chapterImage.setImageDrawable(chapter.drawable) + if (chapter.highlightDrawable != null) { + chapterImage.setImageDrawable(chapter.highlightDrawable) } else { ImageHelper.loadImage(chapter.image, chapterImage) } chapterTitle.text = chapter.title timeStamp.text = DateUtils.formatElapsedTime(chapter.start) - val chapterEnd = chapters.getOrNull(position + 1)?.start - ?: (exoPlayer.duration / 1000) + val playerDurationSeconds = exoPlayer.duration / 1000 + val chapterEnd = if (chapter.highlightDrawable == null) { + chapters.getOrNull(position + 1)?.start ?: playerDurationSeconds + } else { + // the duration for chapters is hardcoded, since it's not provided by the SB API + minOf(chapter.start + ChapterSegment.HIGHLIGHT_LENGTH, playerDurationSeconds) + } val durationSpan = chapterEnd - chapter.start duration.text = root.context.getString( R.string.duration_span, 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 381ab5960..57c73eab5 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 @@ -1175,7 +1175,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { val highlightChapter = ChapterSegment( title = getString(R.string.chapters_videoHighlight), start = highlight.segmentStartAndEnd.first.toLong(), - drawable = frame?.toDrawable(requireContext().resources) + highlightDrawable = frame?.toDrawable(requireContext().resources) ) chapters.add(highlightChapter) chapters.sortBy { it.start }