From a8e9a4002399d0653afd96f4fc5f6e972167edd4 Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Fri, 6 Aug 2021 20:01:30 +0200 Subject: [PATCH] Play series from MediaInfoFragment --- .../jellyfin/fragments/MediaInfoFragment.kt | 22 +++++++--- .../jellyfin/viewmodels/MediaInfoViewModel.kt | 40 +++++++++++++++++-- .../main/res/layout/fragment_media_info.xml | 31 ++++++++++---- 3 files changed, 77 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt index 315970c9..f9c8a415 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -83,11 +84,16 @@ class MediaInfoFragment : Fragment() { } }) - viewModel.navigateToPlayer.observe(viewLifecycleOwner, { mediaSource -> - navigateToPlayerActivity( - arrayOf(PlayerItem(args.itemId, mediaSource.id!!)), - viewModel.item.value!!.userData!!.playbackPositionTicks.div(10000) - ) + viewModel.navigateToPlayer.observe(viewLifecycleOwner, { playerItems -> + if (playerItems != null) { + navigateToPlayerActivity( + playerItems, + viewModel.item.value!!.userData!!.playbackPositionTicks.div(10000) + ) + viewModel.doneNavigatingToPlayer() + binding.playButton.setImageDrawable(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_play)) + binding.progressCircular.visibility = View.INVISIBLE + } }) viewModel.played.observe(viewLifecycleOwner, { @@ -127,6 +133,8 @@ class MediaInfoFragment : Fragment() { binding.peopleRecyclerView.adapter = PersonListAdapter() binding.playButton.setOnClickListener { + binding.playButton.setImageResource(android.R.color.transparent) + binding.progressCircular.visibility = View.VISIBLE if (args.itemType == "Movie") { if (!viewModel.mediaSources.value.isNullOrEmpty()) { if (viewModel.mediaSources.value!!.size > 1) { @@ -139,8 +147,12 @@ class MediaInfoFragment : Fragment() { arrayOf(PlayerItem(args.itemId, viewModel.mediaSources.value!![0].id!!)), viewModel.item.value!!.userData!!.playbackPositionTicks.div(10000), ) + binding.playButton.setImageDrawable(ContextCompat.getDrawable(requireActivity(), R.drawable.ic_play)) + binding.progressCircular.visibility = View.INVISIBLE } } + } else if (args.itemType == "Series") { + viewModel.preparePlayer() } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt index 74470bb6..f2b58646 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import dev.jdtech.jellyfin.models.PlayerItem import dev.jdtech.jellyfin.repository.JellyfinRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -54,8 +55,8 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { private val _mediaSources = MutableLiveData>() val mediaSources: LiveData> = _mediaSources - private val _navigateToPlayer = MutableLiveData() - val navigateToPlayer: LiveData = _navigateToPlayer + private val _navigateToPlayer = MutableLiveData>() + val navigateToPlayer: LiveData> = _navigateToPlayer private val _played = MutableLiveData() val played: LiveData = _played @@ -66,6 +67,8 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { private val _error = MutableLiveData() val error: LiveData = _error + var playerItems: MutableList = mutableListOf() + fun loadData(itemId: UUID, itemType: String) { _error.value = false viewModelScope.launch { @@ -177,7 +180,38 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { } } + fun preparePlayer() { + viewModelScope.launch { + createPlayerItems(_item.value!!) + _navigateToPlayer.value = playerItems.toTypedArray() + } + } + + private suspend fun createPlayerItems(series: BaseItemDto) { + if (nextUp.value != null) { + val startEpisode = nextUp.value!! + val episodes = jellyfinRepository.getEpisodes(startEpisode.seriesId!!, startEpisode.seasonId!!, startIndex = startEpisode.indexNumber?.minus(1)) + for (episode in episodes) { + val mediaSources = jellyfinRepository.getMediaSources(episode.id) + playerItems.add(PlayerItem(episode.id, mediaSources[0].id!!)) + } + } else { + for (season in seasons.value!!) { + if (season.indexNumber == 0) continue + val episodes = jellyfinRepository.getEpisodes(series.id, season.id) + for (episode in episodes) { + val mediaSources = jellyfinRepository.getMediaSources(episode.id) + playerItems.add(PlayerItem(episode.id, mediaSources[0].id!!)) + } + } + } + } + fun navigateToPlayer(mediaSource: MediaSourceInfo) { - _navigateToPlayer.value = mediaSource + _navigateToPlayer.value = arrayOf(PlayerItem(item.value!!.id, mediaSource.id!!)) + } + + fun doneNavigatingToPlayer() { + _navigateToPlayer.value = null } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index 2736fd97..15538f81 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -129,16 +129,31 @@ android:layout_marginHorizontal="24dp" android:layout_marginBottom="24dp"> - + android:layout_marginEnd="12dp"> + + + + +