Merge pull request #1456 - palaks-1/sources/nhentai_to

[NHentai.to] Add source
master
Draken 1 year ago committed by GitHub
commit 35334e82ae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1 +1 @@
total: 1183
total: 1184

@ -152,6 +152,7 @@ internal abstract class GalleryAdultsParser(
)
}
protected open val selectTitle = "h1.title"
protected open val selectTag = "div.tags:contains(Tags:) .tag_list"
protected open val selectAuthor = "ul.artists a.tag_btn"
protected open val selectLanguageChapter = "div.tags:contains(Languages:) .tag_list a span.tag"
@ -166,7 +167,7 @@ internal abstract class GalleryAdultsParser(
}
return manga.copy(
tags = tag.orEmpty(),
title = doc.selectFirst("h1.title")?.textOrNull()?.cleanupTitle() ?: manga.title,
title = doc.selectFirst(selectTitle)?.textOrNull()?.cleanupTitle() ?: manga.title,
author = doc.selectFirst(selectAuthor)?.html()?.substringBefore("<span"),
chapters = listOf(
MangaChapter(

@ -0,0 +1,115 @@
package org.koitharu.kotatsu.parsers.site.galleryadults.all
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.koitharu.kotatsu.parsers.ErrorMessages
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.site.galleryadults.GalleryAdultsParser
import org.koitharu.kotatsu.parsers.util.*
import java.util.*
@MangaSourceParser("NHENTAI_TO", "NHentai.to", type = ContentType.HENTAI)
internal class NHentaiToParser(context: MangaLoaderContext) :
GalleryAdultsParser(context, MangaParserSource.NHENTAI_TO, "nhentai.to", 25) {
override val selectGallery = "div.index-container:not(.index-popular) .gallery, #related-container .gallery"
override val selectGalleryLink = "a"
override val selectGalleryTitle = ".caption"
override val pathTagUrl = "/tags?page="
override val selectTitle = "h1"
override val selectTags = "#tag-container"
override val selectTag = ".tag-container:contains(Tags) span.tags"
override val selectAuthor = "#tags div.tag-container:contains(Artists) span.name"
override val selectLanguageChapter =
".tag-container:contains(Languages) span.tags a:not(.tag-17) span.name" // tag-17 = translated
override val idImg = "image-container"
override val availableSortOrders: Set<SortOrder> =
EnumSet.of(SortOrder.UPDATED)
override val filterCapabilities: MangaListFilterCapabilities
get() = super.filterCapabilities.copy(
isMultipleTagsSupported = false,
)
override suspend fun getFilterOptions() = super.getFilterOptions().copy(
availableLocales = setOf(Locale.ENGLISH, Locale.JAPANESE, Locale.CHINESE),
)
override suspend fun getListPage(page: Int, order: SortOrder, filter: MangaListFilter): List<Manga> {
val url = buildString {
append("https://")
append(domain)
when {
filter.tags.isEmpty() && filter.locale == null -> {
append("/search/?q=")
append(if (filter.query.isNullOrEmpty()) "" else filter.query.urlEncoded())
append("&")
}
else -> {
val tag = filter.tags.oneOrThrowIfMany()
val lang = filter.locale
if (tag != null && lang != null) {
throw IllegalArgumentException(ErrorMessages.FILTER_BOTH_LOCALE_GENRES_NOT_SUPPORTED)
}
if (tag != null) {
append("/tag/")
append(tag.key)
append("/?")
} else if (filter.locale != null) {
append("/language/")
append(filter.locale.toLanguagePath())
append("/?")
} else {
append("/?")
}
}
}
append("page=")
append(page)
}
return parseMangaList(webClient.httpGet(url).parseHtml())
}
override fun parseMangaList(doc: Document): List<Manga> {
return doc.select(selectGallery).map { div ->
val href = div.selectFirstOrThrow(selectGalleryLink).attrAsRelativeUrl("href")
Manga(
id = generateUid(href),
title = div.select(selectGalleryTitle).text().cleanupTitle(),
altTitle = null,
url = href,
publicUrl = href.toAbsoluteUrl(domain),
rating = RATING_UNKNOWN,
contentRating = ContentRating.ADULT,
coverUrl = div.selectFirstOrThrow(selectGalleryImg).src().orEmpty(),
tags = emptySet(),
state = null,
author = null,
largeCoverUrl = null,
description = "N/A",
chapters = null,
source = source,
)
}
}
override suspend fun getPageUrl(page: MangaPage): String {
val doc = webClient.httpGet(page.url.toAbsoluteUrl(domain)).parseHtml()
val root = doc.body()
return root.requireElementById(idImg).selectFirstOrThrow("img").requireSrc()
}
override fun Element.parseTags() = select("a").mapToSet {
val key = it.attr("href").removeSuffix('/').substringAfterLast('/')
val name = it.selectFirst(".name")?.text() ?: it.text()
MangaTag(
key = key,
title = name.toTitleCase(sourceLocale),
source = source,
)
}
}
Loading…
Cancel
Save