From 306c3b02c263c1ff8c524517f34b796d53651fef Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Sat, 21 Aug 2021 17:52:39 +0200 Subject: [PATCH] Improve server discovery (no longer need to type http:// or https:// or ports) --- .../jellyfin/viewmodels/AddServerViewModel.kt | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt index 829d6dc5..3f86da36 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/AddServerViewModel.kt @@ -9,8 +9,11 @@ import dev.jdtech.jellyfin.api.JellyfinApi import dev.jdtech.jellyfin.database.Server import dev.jdtech.jellyfin.database.ServerDatabaseDao import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.jellyfin.sdk.discovery.RecommendedServerInfo +import org.jellyfin.sdk.discovery.RecommendedServerInfoScore import timber.log.Timber import javax.inject.Inject @@ -34,19 +37,32 @@ constructor( * - Connect to server and check if it is a Jellyfin server * - Check if server is not already in Database */ - fun checkServer(baseUrl: String) { + fun checkServer(inputValue: String) { _error.value = null viewModelScope.launch { - jellyfinApi.apply { - api.baseUrl = baseUrl - api.accessToken = null - } try { - val publicSystemInfo by jellyfinApi.systemApi.getPublicSystemInfo() - Timber.d("Remote server: ${publicSystemInfo.id}") + val candidates = jellyfinApi.jellyfin.discovery.getAddressCandidates(inputValue) + val recommended = jellyfinApi.jellyfin.discovery.getRecommendedServers( + candidates, + RecommendedServerInfoScore.GOOD + ) + val recommendedServer: RecommendedServerInfo - if (serverAlreadyInDatabase(publicSystemInfo.id)) { + try { + recommendedServer = recommended.first() + } catch (e: NoSuchElementException) { + throw Exception("Server not found") + } + + jellyfinApi.apply { + api.baseUrl = recommendedServer.address + api.accessToken = null + } + + Timber.d("Remote server: ${recommendedServer.systemInfo?.id}") + + if (serverAlreadyInDatabase(recommendedServer.systemInfo?.id)) { _error.value = "Server already added" _navigateToLogin.value = false } else {