Set starting playback position
This commit is contained in:
parent
fd4fbc7ee5
commit
be8402fb37
5 changed files with 37 additions and 23 deletions
|
@ -34,7 +34,7 @@ class PlayerActivity : AppCompatActivity() {
|
||||||
})
|
})
|
||||||
|
|
||||||
if (viewModel.player.value == null) {
|
if (viewModel.player.value == null) {
|
||||||
viewModel.initializePlayer(args.itemId, args.mediaSourceId)
|
viewModel.initializePlayer(args.itemId, args.mediaSourceId, args.playbackPosition)
|
||||||
}
|
}
|
||||||
hideSystemUI()
|
hideSystemUI()
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,8 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() {
|
||||||
binding.playButton.setOnClickListener {
|
binding.playButton.setOnClickListener {
|
||||||
viewModel.mediaSources.value?.get(0)?.id?.let { mediaSourceId ->
|
viewModel.mediaSources.value?.get(0)?.id?.let { mediaSourceId ->
|
||||||
navigateToPlayerActivity(args.episodeId,
|
navigateToPlayerActivity(args.episodeId,
|
||||||
mediaSourceId
|
mediaSourceId,
|
||||||
|
viewModel.item.value!!.userData!!.playbackPositionTicks.div(10000)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,11 +56,12 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() {
|
||||||
return binding.root
|
return binding.root
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun navigateToPlayerActivity(itemId: UUID, mediaSourceId: String) {
|
private fun navigateToPlayerActivity(itemId: UUID, mediaSourceId: String, playbackPosition: Long) {
|
||||||
findNavController().navigate(
|
findNavController().navigate(
|
||||||
EpisodeBottomSheetFragmentDirections.actionEpisodeBottomSheetFragmentToPlayerActivity(
|
EpisodeBottomSheetFragmentDirections.actionEpisodeBottomSheetFragmentToPlayerActivity(
|
||||||
itemId,
|
itemId,
|
||||||
mediaSourceId
|
mediaSourceId,
|
||||||
|
playbackPosition
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,13 @@ class MediaInfoFragment : Fragment() {
|
||||||
})
|
})
|
||||||
|
|
||||||
viewModel.navigateToPlayer.observe(viewLifecycleOwner, { mediaSource ->
|
viewModel.navigateToPlayer.observe(viewLifecycleOwner, { mediaSource ->
|
||||||
mediaSource.id?.let { navigateToPlayerActivity(args.itemId, it) }
|
mediaSource.id?.let {
|
||||||
|
navigateToPlayerActivity(
|
||||||
|
args.itemId,
|
||||||
|
it,
|
||||||
|
viewModel.item.value!!.userData!!.playbackPositionTicks.div(10000)
|
||||||
|
)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
binding.trailerButton.setOnClickListener {
|
binding.trailerButton.setOnClickListener {
|
||||||
|
@ -87,7 +93,8 @@ class MediaInfoFragment : Fragment() {
|
||||||
} else {
|
} else {
|
||||||
navigateToPlayerActivity(
|
navigateToPlayerActivity(
|
||||||
args.itemId,
|
args.itemId,
|
||||||
viewModel.mediaSources.value!![0].id!!
|
viewModel.mediaSources.value!![0].id!!,
|
||||||
|
viewModel.item.value!!.userData!!.playbackPositionTicks.div(10000)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,11 +123,16 @@ class MediaInfoFragment : Fragment() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun navigateToPlayerActivity(itemId: UUID, mediaSourceId: String) {
|
private fun navigateToPlayerActivity(
|
||||||
|
itemId: UUID,
|
||||||
|
mediaSourceId: String,
|
||||||
|
playbackPosition: Long
|
||||||
|
) {
|
||||||
findNavController().navigate(
|
findNavController().navigate(
|
||||||
MediaInfoFragmentDirections.actionMediaInfoFragmentToPlayerActivity(
|
MediaInfoFragmentDirections.actionMediaInfoFragmentToPlayerActivity(
|
||||||
itemId,
|
itemId,
|
||||||
mediaSourceId
|
mediaSourceId,
|
||||||
|
playbackPosition
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.google.android.exoplayer2.*
|
import com.google.android.exoplayer2.*
|
||||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
|
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
import dev.jdtech.jellyfin.repository.JellyfinRepository
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -33,31 +32,29 @@ constructor(
|
||||||
playbackStateListener = PlaybackStateListener()
|
playbackStateListener = PlaybackStateListener()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun initializePlayer(itemId: UUID, mediaSourceId: String) {
|
fun initializePlayer(itemId: UUID, mediaSourceId: String, playbackPosition: Long) {
|
||||||
if (player.value == null) {
|
val renderersFactory =
|
||||||
val trackSelector = DefaultTrackSelector(application)
|
DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
|
||||||
val renderersFactory = DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
|
val player = SimpleExoPlayer.Builder(application, renderersFactory)
|
||||||
trackSelector.parameters.buildUpon().setMaxVideoSizeSd()
|
.build()
|
||||||
_player.value = SimpleExoPlayer.Builder(application, renderersFactory)
|
|
||||||
.setTrackSelector(trackSelector)
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
player.value?.addListener(playbackStateListener)
|
player.addListener(playbackStateListener)
|
||||||
|
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
val streamUrl = jellyfinRepository.getStreamUrl(itemId, mediaSourceId)
|
val streamUrl = jellyfinRepository.getStreamUrl(itemId, mediaSourceId)
|
||||||
|
Log.d("PlayerActivity", streamUrl)
|
||||||
val mediaItem =
|
val mediaItem =
|
||||||
MediaItem.Builder()
|
MediaItem.Builder()
|
||||||
.setMediaId(itemId.toString())
|
.setMediaId(itemId.toString())
|
||||||
.setUri(streamUrl)
|
.setUri(streamUrl)
|
||||||
.build()
|
.build()
|
||||||
player.value?.setMediaItem(mediaItem)
|
player.setMediaItem(mediaItem, playbackPosition)
|
||||||
}
|
}
|
||||||
|
|
||||||
player.value?.playWhenReady = playWhenReady
|
player.playWhenReady = playWhenReady
|
||||||
player.value?.seekTo(currentWindow, playbackPosition)
|
player.prepare()
|
||||||
player.value?.prepare()
|
|
||||||
|
_player.value = player
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun releasePlayer() {
|
private fun releasePlayer() {
|
||||||
|
|
|
@ -143,5 +143,8 @@
|
||||||
<argument
|
<argument
|
||||||
android:name="mediaSourceId"
|
android:name="mediaSourceId"
|
||||||
app:argType="string" />
|
app:argType="string" />
|
||||||
|
<argument
|
||||||
|
android:name="playbackPosition"
|
||||||
|
app:argType="long" />
|
||||||
</activity>
|
</activity>
|
||||||
</navigation>
|
</navigation>
|
Loading…
Reference in a new issue