diff --git a/komf-mediaserver/src/commonMain/kotlin/snd/komf/mediaserver/komga/KomgaMediaServerClientAdapter.kt b/komf-mediaserver/src/commonMain/kotlin/snd/komf/mediaserver/komga/KomgaMediaServerClientAdapter.kt index 7af0b62c..1f0221f6 100644 --- a/komf-mediaserver/src/commonMain/kotlin/snd/komf/mediaserver/komga/KomgaMediaServerClientAdapter.kt +++ b/komf-mediaserver/src/commonMain/kotlin/snd/komf/mediaserver/komga/KomgaMediaServerClientAdapter.kt @@ -1,7 +1,9 @@ package snd.komf.mediaserver.komga import io.github.oshai.kotlinlogging.KotlinLogging +import io.ktor.http.parseUrl import snd.komf.mediaserver.MediaServerClient +import snd.komf.util.toStingEncoded import snd.komf.mediaserver.model.MediaServerAlternativeTitle import snd.komf.mediaserver.model.MediaServerAuthor import snd.komf.mediaserver.model.MediaServerBook @@ -51,6 +53,19 @@ import snd.komga.client.series.KomgaSeriesThumbnail private val logger = KotlinLogging.logger {} +private fun safeUrlOrNull(raw: String?): String? { + val trimmed = raw?.trim() + if (trimmed.isNullOrEmpty()) return null + + return try { + val url = parseUrl(trimmed) + url.toStingEncoded() + } catch (e: Throwable) { + logger.warn("Dropping invalid URL from metadata: {}", trimmed, e) + null + } +} + class KomgaMediaServerClientAdapter( private val komgaBookClient: KomgaBookClient, private val komgaSeriesClient: KomgaSeriesClient, @@ -398,8 +413,11 @@ class KomgaMediaServerClientAdapter( language = patchIfNotNull(language), genres = patchIfNotNull(genres), tags = patchIfNotNull(tags), - totalBookCount = patchIfNotNull(totalBookCount), - links = patchIfNotNull(links?.map { KomgaWebLink(it.label, it.url) }), + // Komga rejects totalBookCount <= 0, so omit invalid values + totalBookCount = patchIfNotNull(totalBookCount?.takeIf { it > 0 }), + links = patchIfNotNull(links?.mapNotNull { link -> + safeUrlOrNull(link.url)?.let { KomgaWebLink(link.label, it) } + }), statusLock = patchIfNotNull(statusLock), titleLock = patchIfNotNull(titleLock), @@ -447,7 +465,9 @@ class KomgaMediaServerClientAdapter( authors = patchIfNotNull(authors?.map { KomgaAuthor(it.name, it.role) }), tags = patchIfNotNull(tags), isbn = patchIfNotNull(isbn), - links = patchIfNotNull(links?.map { KomgaWebLink(it.label, it.url) }), + links = patchIfNotNull(links?.mapNotNull { link -> + safeUrlOrNull(link.url)?.let { KomgaWebLink(link.label, it) } + }), titleLock = patchIfNotNull(titleLock), summaryLock = patchIfNotNull(summaryLock),