mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-29 16:30:31 +05:30
Merge pull request #6771 from Bnyro/master
refactor: improve SponsorBlock segments handling logic
This commit is contained in:
commit
7d477bf54a
@ -321,7 +321,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
val maybeStreams: Streams? = mediaMetadata.extras?.parcelable(IntentData.streams)
|
val maybeStreams: Streams? = mediaMetadata.extras?.parcelable(IntentData.streams)
|
||||||
maybeStreams?.let {
|
maybeStreams?.let {
|
||||||
streams = it
|
streams = it
|
||||||
viewModel.segments = emptyList()
|
viewModel.segments.postValue(emptyList())
|
||||||
playVideo()
|
playVideo()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -330,15 +330,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
super.onPlaylistMetadataChanged(mediaMetadata)
|
super.onPlaylistMetadataChanged(mediaMetadata)
|
||||||
|
|
||||||
val segments: List<Segment>? = mediaMetadata.extras?.parcelableList(IntentData.segments)
|
val segments: List<Segment>? = mediaMetadata.extras?.parcelableList(IntentData.segments)
|
||||||
viewModel.segments = segments.orEmpty()
|
viewModel.segments.postValue(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) }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -422,6 +414,16 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
binding.player.setCurrentChapterName()
|
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) {
|
val localDownloadVersion = runBlocking(Dispatchers.IO) {
|
||||||
DatabaseHolder.Database.downloadDao().findById(videoId)
|
DatabaseHolder.Database.downloadDao().findById(videoId)
|
||||||
}
|
}
|
||||||
@ -915,11 +917,11 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
if (!playerController.isPlaying || !PlayerHelper.sponsorBlockEnabled) return
|
if (!playerController.isPlaying || !PlayerHelper.sponsorBlockEnabled) return
|
||||||
|
|
||||||
handler.postDelayed(this::checkForSegments, 100)
|
handler.postDelayed(this::checkForSegments, 100)
|
||||||
if (!PlayerHelper.sponsorBlockEnabled || viewModel.segments.isEmpty()) return
|
if (!PlayerHelper.sponsorBlockEnabled || !viewModel.segments.value.isNullOrEmpty()) return
|
||||||
|
|
||||||
playerController.checkForSegments(
|
playerController.checkForSegments(
|
||||||
requireContext(),
|
requireContext(),
|
||||||
viewModel.segments,
|
viewModel.segments.value.orEmpty(),
|
||||||
viewModel.sponsorBlockConfig,
|
viewModel.sponsorBlockConfig,
|
||||||
// skipping is done by player service
|
// skipping is done by player service
|
||||||
skipAutomaticallyIfEnabled = false
|
skipAutomaticallyIfEnabled = false
|
||||||
@ -935,7 +937,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!playerController.isInSegment(viewModel.segments)) binding.sbSkipBtn.isGone = true
|
if (!playerController.isInSegment(viewModel.segments.value.orEmpty())) binding.sbSkipBtn.isGone = true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun playVideo() {
|
private fun playVideo() {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.github.libretube.ui.models
|
package com.github.libretube.ui.models
|
||||||
|
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.media3.common.util.UnstableApi
|
import androidx.media3.common.util.UnstableApi
|
||||||
import com.github.libretube.api.obj.Segment
|
import com.github.libretube.api.obj.Segment
|
||||||
@ -9,7 +10,7 @@ import com.github.libretube.helpers.PlayerHelper
|
|||||||
@UnstableApi
|
@UnstableApi
|
||||||
class PlayerViewModel : ViewModel() {
|
class PlayerViewModel : ViewModel() {
|
||||||
|
|
||||||
var segments = listOf<Segment>()
|
var segments = MutableLiveData<List<Segment>>()
|
||||||
var currentSubtitle = Subtitle(code = PlayerHelper.defaultSubtitleCode)
|
var currentSubtitle = Subtitle(code = PlayerHelper.defaultSubtitleCode)
|
||||||
var sponsorBlockConfig = PlayerHelper.getSponsorBlockCategories()
|
var sponsorBlockConfig = PlayerHelper.getSponsorBlockCategories()
|
||||||
|
|
||||||
|
@ -233,7 +233,7 @@ class OnlinePlayerView(
|
|||||||
val duration = player?.duration?.div(1000) ?: return
|
val duration = player?.duration?.div(1000) ?: return
|
||||||
if (duration < 0) 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
|
val (start, end) = it.segmentStartAndEnd
|
||||||
end.toDouble() - start.toDouble()
|
end.toDouble() - start.toDouble()
|
||||||
}.toLong()
|
}.toLong()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user