From d53fbf3369123faa2dd90002d1b78706d4cd0a76 Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Wed, 25 Aug 2021 11:00:58 +0200 Subject: [PATCH] Handle empty mediaSources --- .../jellyfin/fragments/EpisodeBottomSheetFragment.kt | 2 +- .../jdtech/jellyfin/fragments/MediaInfoFragment.kt | 2 +- .../jdtech/jellyfin/repository/JellyfinRepository.kt | 2 +- .../jellyfin/repository/JellyfinRepositoryImpl.kt | 4 ++-- .../viewmodels/EpisodeBottomSheetViewModel.kt | 6 ++++-- .../jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt | 11 +++++++++-- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt index 123391e0..a6535000 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/EpisodeBottomSheetFragment.kt @@ -37,7 +37,7 @@ class EpisodeBottomSheetFragment : BottomSheetDialogFragment() { binding.playButton.setOnClickListener { binding.playButton.setImageResource(android.R.color.transparent) binding.progressCircular.visibility = View.VISIBLE - viewModel.preparePlayer() + viewModel.preparePlayerItems() } binding.checkButton.setOnClickListener { 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 87df83de..b02f3991 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -190,7 +190,7 @@ class MediaInfoFragment : Fragment() { } } } else if (args.itemType == "Series") { - viewModel.preparePlayer() + viewModel.preparePlayerItems() } } diff --git a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt index 69bf92ea..526d0745 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepository.kt @@ -32,7 +32,7 @@ interface JellyfinRepository { seriesId: UUID, seasonId: UUID, fields: List? = null, - startIndex: Int? = null + startItemId: UUID? = null ): List suspend fun getMediaSources(itemId: UUID): List diff --git a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt index 393b87ef..4dc70436 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt @@ -115,7 +115,7 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep seriesId: UUID, seasonId: UUID, fields: List?, - startIndex: Int? + startItemId: UUID? ): List { val episodes: List withContext(Dispatchers.IO) { @@ -124,7 +124,7 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep jellyfinApi.userId!!, seasonId = seasonId, fields = fields, - startIndex = startIndex + startItemId = startItemId ).content.items ?: listOf() } return episodes diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt index c86cb355..383deb1d 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt @@ -61,7 +61,7 @@ constructor( } } - fun preparePlayer() { + fun preparePlayerItems() { _playerItemsError.value = null viewModelScope.launch { try { @@ -77,12 +77,14 @@ constructor( val episodes = jellyfinRepository.getEpisodes( startEpisode.seriesId!!, startEpisode.seasonId!!, - startIndex = startEpisode.indexNumber?.minus(1) + startItemId = startEpisode.id ) for (episode in episodes) { val mediaSources = jellyfinRepository.getMediaSources(episode.id) + if (mediaSources.isEmpty()) continue playerItems.add(PlayerItem(episode.id, mediaSources[0].id!!)) } + if (playerItems.isEmpty()) throw Exception("No playable items found") } fun markAsPlayed(itemId: UUID) { 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 5a8695ec..ac3a068d 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -183,7 +183,7 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { } } - fun preparePlayer() { + fun preparePlayerItems() { _playerItemsError.value = null viewModelScope.launch { try { @@ -198,9 +198,14 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { 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)) + val episodes = jellyfinRepository.getEpisodes( + startEpisode.seriesId!!, + startEpisode.seasonId!!, + startItemId = startEpisode.id + ) for (episode in episodes) { val mediaSources = jellyfinRepository.getMediaSources(episode.id) + if (mediaSources.isEmpty()) continue playerItems.add(PlayerItem(episode.id, mediaSources[0].id!!)) } } else { @@ -209,10 +214,12 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { val episodes = jellyfinRepository.getEpisodes(series.id, season.id) for (episode in episodes) { val mediaSources = jellyfinRepository.getMediaSources(episode.id) + if (mediaSources.isEmpty()) continue playerItems.add(PlayerItem(episode.id, mediaSources[0].id!!)) } } } + if (playerItems.isEmpty()) throw Exception("No playable items found") } fun navigateToPlayer(mediaSource: MediaSourceInfo) {