Merge pull request #6771 from Bnyro/master

refactor: improve SponsorBlock segments handling logic
This commit is contained in:
Bnyro 2024-11-18 22:05:19 +01:00 committed by GitHub
commit 7d477bf54a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 15 deletions

View File

@ -321,7 +321,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
val maybeStreams: Streams? = mediaMetadata.extras?.parcelable(IntentData.streams)
maybeStreams?.let {
streams = it
viewModel.segments = emptyList()
viewModel.segments.postValue(emptyList())
playVideo()
}
}
@ -330,15 +330,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
super.onPlaylistMetadataChanged(mediaMetadata)
val segments: List<Segment>? = 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 }
?.let {
lifecycleScope.launch(Dispatchers.IO) { initializeHighlight(it) }
}
viewModel.segments.postValue(segments.orEmpty())
}
/**
@ -422,6 +414,16 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
binding.player.setCurrentChapterName()
}
viewModel.segments.observe(viewLifecycleOwner) { segments ->
binding.descriptionLayout.setSegments(segments)
playerBinding.exoProgress.setSegments(segments)
playerBinding.sbToggle.isVisible = segments.isNotEmpty()
segments.firstOrNull { it.category == PlayerHelper.SPONSOR_HIGHLIGHT_CATEGORY }
?.let {
lifecycleScope.launch(Dispatchers.IO) { initializeHighlight(it) }
}
}
val localDownloadVersion = runBlocking(Dispatchers.IO) {
DatabaseHolder.Database.downloadDao().findById(videoId)
}
@ -915,11 +917,11 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
if (!playerController.isPlaying || !PlayerHelper.sponsorBlockEnabled) return
handler.postDelayed(this::checkForSegments, 100)
if (!PlayerHelper.sponsorBlockEnabled || viewModel.segments.isEmpty()) return
if (!PlayerHelper.sponsorBlockEnabled || !viewModel.segments.value.isNullOrEmpty()) return
playerController.checkForSegments(
requireContext(),
viewModel.segments,
viewModel.segments.value.orEmpty(),
viewModel.sponsorBlockConfig,
// skipping is done by player service
skipAutomaticallyIfEnabled = false
@ -935,7 +937,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
return
}
if (!playerController.isInSegment(viewModel.segments)) binding.sbSkipBtn.isGone = true
if (!playerController.isInSegment(viewModel.segments.value.orEmpty())) binding.sbSkipBtn.isGone = true
}
private fun playVideo() {

View File

@ -1,5 +1,6 @@
package com.github.libretube.ui.models
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.media3.common.util.UnstableApi
import com.github.libretube.api.obj.Segment
@ -9,7 +10,7 @@ import com.github.libretube.helpers.PlayerHelper
@UnstableApi
class PlayerViewModel : ViewModel() {
var segments = listOf<Segment>()
var segments = MutableLiveData<List<Segment>>()
var currentSubtitle = Subtitle(code = PlayerHelper.defaultSubtitleCode)
var sponsorBlockConfig = PlayerHelper.getSponsorBlockCategories()

View File

@ -233,7 +233,7 @@ class OnlinePlayerView(
val duration = player?.duration?.div(1000) ?: return
if (duration < 0) return
val durationWithoutSegments = duration - playerViewModel?.segments.orEmpty().sumOf {
val durationWithoutSegments = duration - playerViewModel?.segments?.value.orEmpty().sumOf {
val (start, end) = it.segmentStartAndEnd
end.toDouble() - start.toDouble()
}.toLong()