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 {