From dbb04d2051d4b39e195905fc7a8f654683c2296f Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 28 Mar 2025 09:03:36 +0200 Subject: [PATCH] Fix link resolver --- .../kotatsu/parsers/util/LinkResolver.kt | 28 +++++++++++-------- .../parsers/util/IntentFilterGenerator.kt | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt index 2a3fbcde..c92b7b43 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/LinkResolver.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.runInterruptible import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy @@ -19,15 +20,14 @@ public class LinkResolver internal constructor( public suspend fun getSource(): MangaParserSource? = source.get() public suspend fun getManga(): Manga? { - val parser = context.newParserInstance(source.get() ?: return null) as? LegacyMangaParser - ?: return null + val parser = context.newParserInstance(source.get() ?: return null) return parser.resolveLink(this, link) ?: resolveManga(parser) } private suspend fun resolveSource(): MangaParserSource? = runInterruptible(Dispatchers.Default) { val domains = setOfNotNull(link.host, link.topPrivateDomain()) for (s in MangaParserSource.entries) { - val parser = context.newParserInstance(s) as LegacyMangaParser + val parser = context.newParserInstance(s) for (d in parser.configKeyDomain.presetValues) { if (d in domains) { return@runInterruptible s @@ -38,7 +38,7 @@ public class LinkResolver internal constructor( } internal suspend fun resolveManga( - parser: LegacyMangaParser, + parser: MangaParser, url: String = link.toString().toRelativeUrl(link.host), id: Long = parser.generateUid(url), title: String = STUB_TITLE, @@ -63,7 +63,7 @@ public class LinkResolver internal constructor( ), ) - private suspend fun resolveBySeed(parser: LegacyMangaParser, s: Manga): Manga? { + private suspend fun resolveBySeed(parser: MangaParser, s: Manga): Manga? { val seed = parser.getDetails(s) if (!parser.filterCapabilities.isSearchSupported) { return seed.takeUnless { it.chapters.isNullOrEmpty() } @@ -75,12 +75,7 @@ public class LinkResolver internal constructor( else -> return seed // unfortunately we do not know a real manga title so unable to find it } val resolved = runCatchingCancellable { - val order = if (SortOrder.RELEVANCE in parser.availableSortOrders) { - SortOrder.RELEVANCE - } else { - parser.defaultSortOrder - } - val list = parser.getList(0, order, MangaListFilter(query = query)) + val list = parser.getList(0, parser.bestSortOrder(), MangaListFilter(query = query)) list.singleOrNull { manga -> isSameUrl(manga.publicUrl) } }.getOrNull() if (resolved == null) { @@ -111,6 +106,17 @@ public class LinkResolver internal constructor( && link.encodedPath == httpUrl.encodedPath } + private fun MangaParser.bestSortOrder(): SortOrder { + val supported = availableSortOrders + if (SortOrder.RELEVANCE in supported) { + return SortOrder.RELEVANCE + } + if (this is LegacyMangaParser) { + return defaultSortOrder + } + return SortOrder.entries.first { it in supported } + } + private companion object { const val STUB_TITLE = "Unknown manga" diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/util/IntentFilterGenerator.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/util/IntentFilterGenerator.kt index fd5b78df..e6fdecab 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/util/IntentFilterGenerator.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/util/IntentFilterGenerator.kt @@ -26,7 +26,7 @@ class IntentFilterGenerator { if (source == MangaParserSource.DUMMY) { continue } - val parser = source.newParser(MangaLoaderContextMock) as LegacyMangaParser + val parser = source.newParser(MangaLoaderContextMock) parser.configKeyDomain.presetValues.forEach { domain -> writer.appendTab().append("") }