From 5c1ddffe7ab25402b19c679f66ccb940a4b7c345 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Fri, 29 May 2026 18:09:12 +0200 Subject: [PATCH] refactor(playback): simplify getVideoStreamUrl usage and improve direct play handling --- .../data/jellyfin/client/JellyfinApiClient.kt | 12 +-------- .../playback/JellyfinPlaybackResolver.kt | 27 +++++++++---------- .../playback/PlaybackDecisionResolver.kt | 4 +-- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/data/src/main/java/hu/bbara/purefin/data/jellyfin/client/JellyfinApiClient.kt b/data/src/main/java/hu/bbara/purefin/data/jellyfin/client/JellyfinApiClient.kt index 634f70c3..0cf32ae5 100644 --- a/data/src/main/java/hu/bbara/purefin/data/jellyfin/client/JellyfinApiClient.kt +++ b/data/src/main/java/hu/bbara/purefin/data/jellyfin/client/JellyfinApiClient.kt @@ -465,21 +465,11 @@ class JellyfinApiClient @Inject constructor( } fun getVideoStreamUrl( - itemId: UUID, - mediaSourceId: String?, - container: String? = null, - tag: String? = null, - playSessionId: String? = null, - liveStreamId: String? = null, + itemId: UUID ): String = try { api.videosApi.getVideoStreamUrl( itemId = itemId, - container = container, - mediaSourceId = mediaSourceId, static = true, - tag = tag, - playSessionId = playSessionId, - liveStreamId = liveStreamId, ) } catch (error: Exception) { Timber.tag(TAG).e(error, "getVideoStreamUrl") diff --git a/data/src/main/java/hu/bbara/purefin/data/jellyfin/playback/JellyfinPlaybackResolver.kt b/data/src/main/java/hu/bbara/purefin/data/jellyfin/playback/JellyfinPlaybackResolver.kt index 861d2424..46e1d5c6 100644 --- a/data/src/main/java/hu/bbara/purefin/data/jellyfin/playback/JellyfinPlaybackResolver.kt +++ b/data/src/main/java/hu/bbara/purefin/data/jellyfin/playback/JellyfinPlaybackResolver.kt @@ -2,15 +2,15 @@ package hu.bbara.purefin.data.jellyfin.playback import hu.bbara.purefin.core.data.UserSessionRepository import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient -import java.util.UUID -import java.util.concurrent.ConcurrentHashMap -import javax.inject.Inject -import javax.inject.Singleton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.withContext import org.jellyfin.sdk.model.ServerVersion import timber.log.Timber +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap +import javax.inject.Inject +import javax.inject.Singleton @Singleton class JellyfinPlaybackResolver @Inject constructor( @@ -37,20 +37,19 @@ class JellyfinPlaybackResolver @Inject constructor( return@withContext null } + val directPlayUrl = jellyfinApiClient.getVideoStreamUrl( + itemId = mediaId, + ) + if (directPlayUrl.isBlank()) { + Timber.tag(TAG).e("Direct play URL is blank for $mediaId") + return@withContext null + } + val decision = PlaybackDecisionResolver.resolve( mediaSources = playbackInfo.mediaSources, playSessionId = playbackInfo.playSessionId, serverUrl = serverUrl, - directPlayUrl = { mediaSource -> - jellyfinApiClient.getVideoStreamUrl( - itemId = mediaId, - container = mediaSource.container, - mediaSourceId = mediaSource.id, - tag = mediaSource.eTag, - playSessionId = playbackInfo.playSessionId, - liveStreamId = mediaSource.liveStreamId, - ) - }, + directPlayUrl = directPlayUrl ) if (decision == null) { diff --git a/data/src/main/java/hu/bbara/purefin/data/jellyfin/playback/PlaybackDecisionResolver.kt b/data/src/main/java/hu/bbara/purefin/data/jellyfin/playback/PlaybackDecisionResolver.kt index e11ff79f..1f68dcb5 100644 --- a/data/src/main/java/hu/bbara/purefin/data/jellyfin/playback/PlaybackDecisionResolver.kt +++ b/data/src/main/java/hu/bbara/purefin/data/jellyfin/playback/PlaybackDecisionResolver.kt @@ -10,7 +10,7 @@ internal object PlaybackDecisionResolver { mediaSources: List, playSessionId: String?, serverUrl: String, - directPlayUrl: (MediaSourceInfo) -> String, + directPlayUrl: String, ): PlaybackDecision? { val mediaSource = mediaSources.firstOrNull { it.protocol == MediaProtocol.FILE && !it.isRemote } ?: return null @@ -23,7 +23,7 @@ internal object PlaybackDecisionResolver { } val url = when (playMethod) { - PlaybackMethod.DIRECT_PLAY -> directPlayUrl(mediaSource) + PlaybackMethod.DIRECT_PLAY -> directPlayUrl PlaybackMethod.DIRECT_STREAM, PlaybackMethod.TRANSCODE, -> absolutePlaybackUrl(serverUrl, requireNotNull(mediaSource.transcodingUrl))