[Chan] Add related manga implementation

pull/203/head
Koitharu 3 years ago
parent 9861a9aa6b
commit 07df5a81cf
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -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("<div"),
@ -162,6 +164,33 @@ internal abstract class ChanParser(
return a.attr("href").removeSuffix('/').substringAfterLast('/')
}
override suspend fun getRelatedManga(seed: Manga): List<Manga> {
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"

@ -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<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
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()

@ -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 {

Loading…
Cancel
Save