diff --git a/app/shared/app-data/src/commonMain/kotlin/data/source/media/source/web/SelectorSearchConfig.kt b/app/shared/app-data/src/commonMain/kotlin/data/source/media/source/web/SelectorSearchConfig.kt index 7209f6cfc5..46af844eb3 100644 --- a/app/shared/app-data/src/commonMain/kotlin/data/source/media/source/web/SelectorSearchConfig.kt +++ b/app/shared/app-data/src/commonMain/kotlin/data/source/media/source/web/SelectorSearchConfig.kt @@ -11,6 +11,7 @@ package me.him188.ani.app.data.source.media.source.web import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable +import io.ktor.http.URLBuilder import kotlinx.serialization.Serializable import me.him188.ani.app.data.source.media.source.web.format.SelectorChannelFormat import me.him188.ani.app.data.source.media.source.web.format.SelectorChannelFormatFlattened @@ -59,7 +60,24 @@ data class SelectorSearchConfig( val matchVideo: MatchVideoConfig = MatchVideoConfig(), ) { // TODO: add Engine version capabilities val baseUrl by lazy(LazyThreadSafetyMode.PUBLICATION) { - searchUrl.substringBeforeLast("/") + kotlin.runCatching { + URLBuilder(searchUrl).apply { + pathSegments = emptyList() + parameters.clear() + }.toString() + }.getOrElse { + val schemaIndex = searchUrl.indexOf("//") + if (schemaIndex == -1) { + searchUrl.removeSuffix("/") + } else { + val slashIndex = searchUrl.indexOf('/', startIndex = schemaIndex + 2) + if (slashIndex == -1) { + searchUrl.removeSuffix("/") + } else { + searchUrl.substring(0, slashIndex) + } + } + } } @Serializable diff --git a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/mediasource/selector/test/SelectorTestState.kt b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/mediasource/selector/test/SelectorTestState.kt index 9af573d0f6..c7a46a4cf0 100644 --- a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/mediasource/selector/test/SelectorTestState.kt +++ b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/mediasource/selector/test/SelectorTestState.kt @@ -130,11 +130,15 @@ class SelectorTestState( null } else { try { - engine.searchEpisodes( - selectedSubject.subjectDetailsPageUrl, + Result.success( + engine.searchEpisodes( + selectedSubject.subjectDetailsPageUrl, + ), ) } catch (e: CancellationException) { throw e + } catch (e: Throwable) { + Result.failure(e) } } } @@ -159,10 +163,13 @@ class SelectorTestState( } else -> { - convertEpisodeResult( - subjectDetailsPageDocument, - searchConfig, - queryState, + subjectDetailsPageDocument.fold( + onSuccess = { document -> + convertEpisodeResult(document, searchConfig, queryState) + }, + onFailure = { + SelectorTestEpisodeListResult.UnknownError(it) + }, ) } }