diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/multichan/ChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/multichan/ChanParser.kt index d89a4a87..2d3fae0b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/multichan/ChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/multichan/ChanParser.kt @@ -20,6 +20,8 @@ internal abstract class ChanParser( SortOrder.ALPHABETICAL, ) + protected open val isNsfwSource = false + override val authUrl: String get() = "https://${domain}" @@ -79,7 +81,7 @@ internal abstract class ChanParser( }.getOrNull().orEmpty(), rating = RATING_UNKNOWN, state = null, - isNsfw = false, + isNsfw = isNsfwSource, source = source, ) } @@ -87,7 +89,7 @@ internal abstract class ChanParser( override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() - val root = doc.body().getElementById("dle-content") ?: doc.parseFailed("Cannot find root") + val root = doc.body().requireElementById("dle-content") val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US) return manga.copy( description = root.getElementById("description")?.html()?.substringBeforeLast(" { + val doc = webClient.httpGet(seed.url.replace("/manga/", "/related/").toAbsoluteUrl(domain)).parseHtml() + val root = doc.body().requireElementById("right") + return root.select("div.related").mapNotNull { div -> + val info = div.selectFirst(".related_info") ?: return@mapNotNull null + val a = info.selectFirst("a") ?: return@mapNotNull null + val href = a.attrAsRelativeUrl("href") + Manga( + id = generateUid(href), + url = href, + publicUrl = href.toAbsoluteUrl(a.host ?: domain), + altTitle = a.attr("title"), + title = a.text().substringAfterLast('(').substringBeforeLast(')'), + author = info.getElementsByAttributeValueStarting( + "href", + "/mangaka", + ).firstOrNull()?.text(), + coverUrl = div.selectFirst("img")?.absUrl("src").orEmpty(), + tags = emptySet(), + rating = RATING_UNKNOWN, + state = null, + isNsfw = isNsfwSource, + source = source, + ) + } + } + private fun getSortKey(sortOrder: SortOrder) = when (sortOrder) { SortOrder.ALPHABETICAL -> "catalog" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/multichan/HenChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/multichan/HenChanParser.kt index 08343c03..14c60dd3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/multichan/HenChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/multichan/HenChanParser.kt @@ -3,7 +3,10 @@ package org.koitharu.kotatsu.parsers.site.multichan import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey -import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaChapter +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.util.* @MangaSourceParser("HENCHAN", "Хентай-тян", "ru") @@ -17,19 +20,7 @@ internal class HenChanParser(context: MangaLoaderContext) : ChanParser(context, "hentaichan.pro", ) - override suspend fun getList( - offset: Int, - query: String?, - tags: Set?, - sortOrder: SortOrder, - ): List { - return super.getList(offset, query, tags, sortOrder).map { - it.copy( - coverUrl = it.coverUrl.replace("_blur", ""), - isNsfw = true, - ) - } - } + override val isNsfwSource = true override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index 872997dd..2e9c5ef1 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.parsers import kotlinx.coroutines.test.runTest import okhttp3.HttpUrl import org.junit.jupiter.api.Disabled -import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.junit.jupiter.params.ParameterizedTest import org.koitharu.kotatsu.parsers.model.Manga @@ -23,14 +22,6 @@ internal class MangaParserTest { private val context = MangaLoaderContextMock - @Test - fun related() = runTest { - val parser = context.newParserInstance(MangaSource.READMANGA_RU) - val seed = parser.getList(0, "emanon").first() - val related = parser.getRelatedManga(seed) - assert(related.isNotEmpty() && seed !in related) - } - @ParameterizedTest(name = "{index}|list|{0}") @MangaSources fun list(source: MangaSource) = runTest {