Set starting playback position

This commit is contained in:
Jarne Demeulemeester 2021-07-12 13:26:51 +02:00
parent fd4fbc7ee5
commit be8402fb37
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
5 changed files with 37 additions and 23 deletions

View file

@ -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()
} }

View file

@ -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
) )
) )
} }

View file

@ -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
) )
) )
} }

View file

@ -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() {

View file

@ -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>