From ee0bc96e5330c97e43bb7a330c115853ce2d1f5d Mon Sep 17 00:00:00 2001 From: Kelvin Date: Wed, 20 Dec 2023 00:28:21 +0100 Subject: [PATCH] Support for initial skip chapters --- app/src/main/assets/scripts/source.js | 3 ++- .../api/media/models/chapters/IChapter.kt | 3 ++- .../fragment/mainactivity/main/VideoDetailView.kt | 2 +- .../platformplayer/views/video/FutoVideoPlayer.kt | 5 +++++ .../platformplayer/views/video/FutoVideoPlayerBase.kt | 11 ++++++++++- app/src/unstable/assets/sources/youtube | 2 +- 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/main/assets/scripts/source.js b/app/src/main/assets/scripts/source.js index ebf42f59..16a3e2fe 100644 --- a/app/src/main/assets/scripts/source.js +++ b/app/src/main/assets/scripts/source.js @@ -37,7 +37,8 @@ let Type = { NORMAL: 0, SKIPPABLE: 5, - SKIP: 6 + SKIP: 6, + SKIPONCE: 7 } }; diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/chapters/IChapter.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/chapters/IChapter.kt index 1c887e18..5d7a7c7f 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/chapters/IChapter.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/chapters/IChapter.kt @@ -14,7 +14,8 @@ enum class ChapterType(val value: Int) { NORMAL(0), SKIPPABLE(5), - SKIP(6); + SKIP(6), + SKIPONCE(7); diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt index 8cdaeab4..aa8cb71b 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/VideoDetailView.kt @@ -469,7 +469,7 @@ class VideoDetailView : ConstraintLayout { if(!isScrub) { if(chapter?.type == ChapterType.SKIPPABLE) { _layoutSkip.visibility = VISIBLE; - } else if(chapter?.type == ChapterType.SKIP) { + } else if(chapter?.type == ChapterType.SKIP || chapter?.type == ChapterType.SKIPONCE) { val ad = StateCasting.instance.activeDevice if (ad != null) { ad.seekVideo(chapter.timeEnd) diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt index 6af7e0b4..7e1d20e2 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt @@ -27,6 +27,7 @@ import androidx.media3.ui.TimeBar import com.futo.platformplayer.R import com.futo.platformplayer.Settings import com.futo.platformplayer.UIDialogs +import com.futo.platformplayer.api.media.models.chapters.ChapterType import com.futo.platformplayer.api.media.models.chapters.IChapter import com.futo.platformplayer.api.media.models.streams.sources.IAudioSource import com.futo.platformplayer.api.media.models.streams.sources.IVideoSource @@ -471,6 +472,10 @@ class FutoVideoPlayer : FutoVideoPlayerBase { _control_chapter_fullscreen.text = ""; } onChapterChanged.emit(currentChapter, isScrub); + val chapt = _currentChapter; + + if(chapt?.type == ChapterType.SKIPONCE) + ignoreChapter(chapt); } return true; } diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt index 25100c2f..0239fe69 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt @@ -72,6 +72,7 @@ abstract class FutoVideoPlayerBase : RelativeLayout { private val _referenceObject = Object(); private var _connectivityLossTime_ms: Long? = null + private var _ignoredChapters: ArrayList = arrayListOf(); private var _chapters: List? = null; var exoPlayer: PlayerManager? = null @@ -273,13 +274,21 @@ abstract class FutoVideoPlayerBase : RelativeLayout { } fun setChapters(chapters: List?) { + _ignoredChapters = arrayListOf(); _chapters = chapters; } fun getChapters(): List { return _chapters?.let { it.toList() } ?: listOf(); } + fun ignoreChapter(chapter: IChapter) { + synchronized(_ignoredChapters) { + if(!_ignoredChapters.contains(chapter)) + _ignoredChapters.add(chapter); + } + } fun getCurrentChapter(pos: Long): IChapter? { - return _chapters?.let { chaps -> chaps.find { pos.toDouble() / 1000 > it.timeStart && pos.toDouble() / 1000 < it.timeEnd } }; + val toIgnore = synchronized(_ignoredChapters){ _ignoredChapters.toList() }; + return _chapters?.let { chaps -> chaps.find { pos.toDouble() / 1000 > it.timeStart && pos.toDouble() / 1000 < it.timeEnd && (toIgnore.isEmpty() || !toIgnore.contains(it)) } }; } fun setSource(videoSource: IVideoSource?, audioSource: IAudioSource? = null, play: Boolean = false, keepSubtitles: Boolean = false) { diff --git a/app/src/unstable/assets/sources/youtube b/app/src/unstable/assets/sources/youtube index d41cc8e8..13551ab6 160000 --- a/app/src/unstable/assets/sources/youtube +++ b/app/src/unstable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit d41cc8e848891ef8e949e6d49384b754e7c305c7 +Subproject commit 13551ab67fc8fb1899b5bcbfdec750855b154790