PlaybackProfilePolicy should not require server version

This commit is contained in:
2026-06-01 20:06:05 +02:00
parent b1b154800c
commit 0eea3165de
3 changed files with 6 additions and 30 deletions

View File

@@ -74,7 +74,6 @@ internal object JellyfinAndroidTvDeviceProfile {
fun create( fun create(
capabilities: DeviceProfileCapabilities, capabilities: DeviceProfileCapabilities,
serverVersion: ServerVersion,
config: JellyfinAndroidTvProfileConfig = fixedConfig, config: JellyfinAndroidTvProfileConfig = fixedConfig,
): DeviceProfile = buildDeviceProfile { ): DeviceProfile = buildDeviceProfile {
val allowedAudioCodecs = when { val allowedAudioCodecs = when {
@@ -108,7 +107,7 @@ internal object JellyfinAndroidTvDeviceProfile {
val supportsHevcDolbyVisionEl = capabilities.supportsHevcDolbyVisionEl() val supportsHevcDolbyVisionEl = capabilities.supportsHevcDolbyVisionEl()
val supportsHevcHdr10 = capabilities.supportsHevcHdr10() val supportsHevcHdr10 = capabilities.supportsHevcHdr10()
val supportsHevcHdr10Plus = capabilities.supportsHevcHdr10Plus() val supportsHevcHdr10Plus = capabilities.supportsHevcHdr10Plus()
val supportsExtendedRangeTypes = serverVersion >= extendedRangeTypesServerVersion val supportsExtendedRangeTypes = true
name = "AndroidTV-Default" name = "AndroidTV-Default"
maxStaticBitrate = config.maxBitrate maxStaticBitrate = config.maxBitrate

View File

@@ -5,10 +5,8 @@ import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.jellyfin.sdk.model.ServerVersion
import timber.log.Timber import timber.log.Timber
import java.util.UUID import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@@ -18,7 +16,6 @@ class JellyfinPlaybackResolver @Inject constructor(
private val userSessionRepository: UserSessionRepository, private val userSessionRepository: UserSessionRepository,
private val playbackProfilePolicy: PlaybackProfilePolicy, private val playbackProfilePolicy: PlaybackProfilePolicy,
) { ) {
private val serverVersionCache = ConcurrentHashMap<String, ServerVersion>()
suspend fun getPlaybackDecision(mediaId: UUID): PlaybackDecision? = withContext(Dispatchers.IO) { suspend fun getPlaybackDecision(mediaId: UUID): PlaybackDecision? = withContext(Dispatchers.IO) {
val serverUrl = userSessionRepository.serverUrl.first().trim() val serverUrl = userSessionRepository.serverUrl.first().trim()
@@ -26,10 +23,9 @@ class JellyfinPlaybackResolver @Inject constructor(
return@withContext null return@withContext null
} }
val serverVersion = getServerVersion(serverUrl)
val playbackInfo = jellyfinApiClient.getPlaybackInfo( val playbackInfo = jellyfinApiClient.getPlaybackInfo(
mediaId = mediaId, mediaId = mediaId,
deviceProfile = playbackProfilePolicy.create(serverVersion), deviceProfile = playbackProfilePolicy.create(),
) ?: return@withContext null ) ?: return@withContext null
if (playbackInfo.errorCode != null) { if (playbackInfo.errorCode != null) {
@@ -60,19 +56,6 @@ class JellyfinPlaybackResolver @Inject constructor(
decision decision
} }
private suspend fun getServerVersion(serverUrl: String): ServerVersion {
serverVersionCache[serverUrl]?.let { return it }
val resolvedVersion = runCatching {
jellyfinApiClient.getPublicSystemInfoVersion()?.let(ServerVersion::fromString)
}.onFailure { error ->
Timber.tag(TAG).w(error, "Unable to fetch server version for $serverUrl")
}.getOrNull() ?: PlaybackProfileDefaults.fallbackServerVersion
serverVersionCache[serverUrl] = resolvedVersion
return resolvedVersion
}
private companion object { private companion object {
private const val TAG = "PlaybackResolver" private const val TAG = "PlaybackResolver"
} }

View File

@@ -1,29 +1,23 @@
package hu.bbara.purefin.data.jellyfin.playback package hu.bbara.purefin.data.jellyfin.playback
import org.jellyfin.sdk.model.ServerVersion
import org.jellyfin.sdk.model.api.DeviceProfile import org.jellyfin.sdk.model.api.DeviceProfile
interface PlaybackProfilePolicy { interface PlaybackProfilePolicy {
fun create(serverVersion: ServerVersion): DeviceProfile fun create(): DeviceProfile
}
internal object PlaybackProfileDefaults {
val fallbackServerVersion = ServerVersion(10, 10, 0)
} }
internal class MobilePlaybackProfilePolicy( internal class MobilePlaybackProfilePolicy(
private val capabilities: DeviceProfileCapabilities, private val capabilities: DeviceProfileCapabilities,
) : PlaybackProfilePolicy { ) : PlaybackProfilePolicy {
override fun create(serverVersion: ServerVersion): DeviceProfile = override fun create(): DeviceProfile =
JellyfinAndroidMobileDeviceProfile.create(capabilities = capabilities) JellyfinAndroidMobileDeviceProfile.create(capabilities = capabilities)
} }
internal class TvPlaybackProfilePolicy( internal class TvPlaybackProfilePolicy(
private val capabilities: DeviceProfileCapabilities, private val capabilities: DeviceProfileCapabilities,
) : PlaybackProfilePolicy { ) : PlaybackProfilePolicy {
override fun create(serverVersion: ServerVersion): DeviceProfile = override fun create(): DeviceProfile =
JellyfinAndroidTvDeviceProfile.create( JellyfinAndroidTvDeviceProfile.create(
capabilities = capabilities, capabilities = capabilities
serverVersion = serverVersion,
) )
} }