Fix link resolver

Koitharu 1 year ago
parent 84562d7b36
commit dbb04d2051
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -5,6 +5,7 @@ import kotlinx.coroutines.runInterruptible
import okhttp3.HttpUrl import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaParser
import org.koitharu.kotatsu.parsers.core.LegacyMangaParser import org.koitharu.kotatsu.parsers.core.LegacyMangaParser
import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy 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 getSource(): MangaParserSource? = source.get()
public suspend fun getManga(): Manga? { public suspend fun getManga(): Manga? {
val parser = context.newParserInstance(source.get() ?: return null) as? LegacyMangaParser val parser = context.newParserInstance(source.get() ?: return null)
?: return null
return parser.resolveLink(this, link) ?: resolveManga(parser) return parser.resolveLink(this, link) ?: resolveManga(parser)
} }
private suspend fun resolveSource(): MangaParserSource? = runInterruptible(Dispatchers.Default) { private suspend fun resolveSource(): MangaParserSource? = runInterruptible(Dispatchers.Default) {
val domains = setOfNotNull(link.host, link.topPrivateDomain()) val domains = setOfNotNull(link.host, link.topPrivateDomain())
for (s in MangaParserSource.entries) { for (s in MangaParserSource.entries) {
val parser = context.newParserInstance(s) as LegacyMangaParser val parser = context.newParserInstance(s)
for (d in parser.configKeyDomain.presetValues) { for (d in parser.configKeyDomain.presetValues) {
if (d in domains) { if (d in domains) {
return@runInterruptible s return@runInterruptible s
@ -38,7 +38,7 @@ public class LinkResolver internal constructor(
} }
internal suspend fun resolveManga( internal suspend fun resolveManga(
parser: LegacyMangaParser, parser: MangaParser,
url: String = link.toString().toRelativeUrl(link.host), url: String = link.toString().toRelativeUrl(link.host),
id: Long = parser.generateUid(url), id: Long = parser.generateUid(url),
title: String = STUB_TITLE, 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) val seed = parser.getDetails(s)
if (!parser.filterCapabilities.isSearchSupported) { if (!parser.filterCapabilities.isSearchSupported) {
return seed.takeUnless { it.chapters.isNullOrEmpty() } 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 else -> return seed // unfortunately we do not know a real manga title so unable to find it
} }
val resolved = runCatchingCancellable { val resolved = runCatchingCancellable {
val order = if (SortOrder.RELEVANCE in parser.availableSortOrders) { val list = parser.getList(0, parser.bestSortOrder(), MangaListFilter(query = query))
SortOrder.RELEVANCE
} else {
parser.defaultSortOrder
}
val list = parser.getList(0, order, MangaListFilter(query = query))
list.singleOrNull { manga -> isSameUrl(manga.publicUrl) } list.singleOrNull { manga -> isSameUrl(manga.publicUrl) }
}.getOrNull() }.getOrNull()
if (resolved == null) { if (resolved == null) {
@ -111,6 +106,17 @@ public class LinkResolver internal constructor(
&& link.encodedPath == httpUrl.encodedPath && 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 { private companion object {
const val STUB_TITLE = "Unknown manga" const val STUB_TITLE = "Unknown manga"

@ -26,7 +26,7 @@ class IntentFilterGenerator {
if (source == MangaParserSource.DUMMY) { if (source == MangaParserSource.DUMMY) {
continue continue
} }
val parser = source.newParser(MangaLoaderContextMock) as LegacyMangaParser val parser = source.newParser(MangaLoaderContextMock)
parser.configKeyDomain.presetValues.forEach { domain -> parser.configKeyDomain.presetValues.forEach { domain ->
writer.appendTab().append("<data android:host=\"").append(domain).appendLine("\" />") writer.appendTab().append("<data android:host=\"").append(domain).appendLine("\" />")
} }

Loading…
Cancel
Save