diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/AllHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/AllHentaiParser.kt new file mode 100644 index 00000000..77808eff --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/AllHentaiParser.kt @@ -0,0 +1,53 @@ +package org.koitharu.kotatsu.parsers.site.grouple + +import org.koitharu.kotatsu.parsers.MangaLoaderContext +import org.koitharu.kotatsu.parsers.MangaSourceParser +import org.koitharu.kotatsu.parsers.config.ConfigKey +import org.koitharu.kotatsu.parsers.exception.AuthRequiredException +import org.koitharu.kotatsu.parsers.exception.ParseException +import org.koitharu.kotatsu.parsers.model.MangaChapter +import org.koitharu.kotatsu.parsers.model.MangaPage +import org.koitharu.kotatsu.parsers.model.MangaSource +import org.koitharu.kotatsu.parsers.util.domain +import org.koitharu.kotatsu.parsers.util.parseFailed +import org.koitharu.kotatsu.parsers.util.parseHtml +import org.koitharu.kotatsu.parsers.util.urlEncoded + +@MangaSourceParser("ALLHENTAI", "ALlHentai", "ru") +internal class AllHentaiParser( + context: MangaLoaderContext, +) : GroupleParser(context, MangaSource.ALLHENTAI, 1) { + + override val configKeyDomain = ConfigKey.Domain( + "2023.allhen.online", + null, + ) + override val defaultIsNsfw = true + + override val authUrl: String + get() { + val targetUri = "https://${domain}/".urlEncoded() + return "https://qawa.org/internal/auth/login?targetUri=$targetUri&siteId=1" + } + + override suspend fun getPages(chapter: MangaChapter): List { + try { + return super.getPages(chapter) + } catch (e: ParseException) { + if (isAuthorized) { + throw e + } else { + throw AuthRequiredException(source) + } + } + } + + override suspend fun getUsername(): String { + val root = webClient.httpGet("https://qawa.org/").parseHtml().body() + val element = root.selectFirst("img.user-avatar") ?: throw AuthRequiredException(source) + val res = element.parent()?.text() + return if (res.isNullOrEmpty()) { + root.parseFailed("Cannot find username") + } else res + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/GroupleParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/GroupleParser.kt index cc85cd1d..12ab60b0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/GroupleParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/grouple/GroupleParser.kt @@ -37,6 +37,7 @@ internal abstract class GroupleParser( @Volatile private var cachedPagesServer: String? = null + protected open val defaultIsNsfw = false private val userAgentKey = ConfigKey.UserAgent( "Mozilla/5.0 (X11; U; UNICOS lcLinux; en-US) Gecko/20140730 (KHTML, like Gecko, Safari/419.3) Arora/0.8.0", @@ -131,7 +132,7 @@ internal abstract class GroupleParser( ?.div(5f) }.getOrNull() ?: RATING_UNKNOWN, author = tileInfo?.selectFirst("a.person-link")?.text(), - isNsfw = false, + isNsfw = defaultIsNsfw, tags = runCatching { tileInfo?.select("a.element-link") ?.mapToSet { @@ -173,7 +174,7 @@ internal abstract class GroupleParser( ) }, author = root.selectFirst("a.person-link")?.text() ?: manga.author, - isNsfw = root.select(".alert-warning").any { it.ownText().contains(NSFW_ALERT) }, + isNsfw = manga.isNsfw || root.select(".alert-warning").any { it.ownText().contains(NSFW_ALERT) }, chapters = root.selectFirst("div.chapters-link")?.selectFirst("table") ?.select("tr:has(td > a)")?.mapChapters(reversed = true) { i, tr -> val a = tr.selectFirst("a.chapter-link") ?: return@mapChapters null