Minor daily update
This commit is contained in:
@@ -34,10 +34,15 @@ internal abstract class GalleryAdultsParser(
|
||||
append("https://")
|
||||
append(domain)
|
||||
if (!tags.isNullOrEmpty()) {
|
||||
append("/tag/")
|
||||
append(tag?.key.orEmpty())
|
||||
append("/?")
|
||||
|
||||
if (tag?.key == "languageKey") {
|
||||
append("/language")
|
||||
append(tag.title)
|
||||
append("/?")
|
||||
} else {
|
||||
append("/tag/")
|
||||
append(tag?.key.orEmpty())
|
||||
append("/?")
|
||||
}
|
||||
} else if (!query.isNullOrEmpty()) {
|
||||
append("/search/?q=")
|
||||
append(query.urlEncoded())
|
||||
@@ -92,11 +97,37 @@ internal abstract class GalleryAdultsParser(
|
||||
|
||||
protected open val pathTagUrl = "/tags/popular/pag/"
|
||||
protected open val selectTags = ".tags_page ul.tags li"
|
||||
protected open val listLanguage = arrayOf(
|
||||
"/english",
|
||||
"/french",
|
||||
"/japanese",
|
||||
"/chinese",
|
||||
"/spanish",
|
||||
"/russian",
|
||||
"/korean",
|
||||
"/german",
|
||||
"/indonesian",
|
||||
"/italian",
|
||||
"/portuguese",
|
||||
"/turkish",
|
||||
"/thai",
|
||||
"/vietnamese",
|
||||
) // The "/" is used to move them up in the tag list and therefore also in the url.
|
||||
|
||||
private suspend fun getTags(page: Int): Set<MangaTag> {
|
||||
val url = "https://$domain$pathTagUrl$page"
|
||||
val root = webClient.httpGet(url).parseHtml().selectFirstOrThrow(selectTags)
|
||||
return root.parseTags()
|
||||
val tagLanguage = ArrayList<MangaTag>(listLanguage.size)
|
||||
for (language in listLanguage) {
|
||||
tagLanguage.add(
|
||||
MangaTag(
|
||||
key = "languageKey",
|
||||
title = language,
|
||||
source = source,
|
||||
),
|
||||
)
|
||||
}
|
||||
return root.parseTags() + tagLanguage
|
||||
}
|
||||
|
||||
protected open fun Element.parseTags() = select("a.tag, .gallery_title a").mapToSet {
|
||||
@@ -111,16 +142,15 @@ internal abstract class GalleryAdultsParser(
|
||||
|
||||
protected open val selectTag = "div.tags:contains(Tags:) .tag_list"
|
||||
protected open val selectAuthor = "ul.artists a.tag_btn"
|
||||
protected open val urlReplaceBefore = "/g/"
|
||||
protected open val urlReplaceAfter = "/gallery/"
|
||||
protected open val selectLanguageChapter = "div.tags:contains(Languages:) .tag_list a span.tag"
|
||||
protected open val selectUrlChapter = "#cover a, .cover a, .left_cover a, .g_thumb a, .gallery_left a"
|
||||
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
val urlChapters = manga.url.replace(urlReplaceBefore, urlReplaceAfter) + "1/"
|
||||
val tag = doc.selectFirstOrThrow(selectTag)
|
||||
val urlChapters = doc.selectFirstOrThrow(selectUrlChapter).attr("href")
|
||||
val tag = doc.selectFirst(selectTag)?.parseTags()
|
||||
return manga.copy(
|
||||
tags = tag.parseTags(),
|
||||
tags = tag.orEmpty(),
|
||||
author = doc.selectFirst(selectAuthor)?.html()?.substringBefore("<span"),
|
||||
chapters = listOf(
|
||||
MangaChapter(
|
||||
@@ -141,7 +171,7 @@ internal abstract class GalleryAdultsParser(
|
||||
return parseMangaList(webClient.httpGet(seed.url.toAbsoluteUrl(domain)).parseHtml())
|
||||
}
|
||||
|
||||
protected open val selectTotalPage = ".total_pages"
|
||||
protected open val selectTotalPage = ".total_pages, .num-pages, .tp"
|
||||
|
||||
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
||||
val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
@@ -162,7 +192,6 @@ internal abstract class GalleryAdultsParser(
|
||||
|
||||
override suspend fun getPageUrl(page: MangaPage): String {
|
||||
val doc = webClient.httpGet(page.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
val root = doc.body()
|
||||
return root.requireElementById(idImg).src() ?: root.parseFailed("Image src not found")
|
||||
return doc.requireElementById(idImg).src() ?: doc.parseFailed("Image src not found")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,13 @@ internal class AsmHentai(context: MangaLoaderContext) :
|
||||
override val selectGalleryImg = ".image img"
|
||||
override val pathTagUrl = "/tags/?page="
|
||||
override val selectAuthor = "div.tags:contains(Artists:) .tag_list a span.tag"
|
||||
override val selectTotalPage = ".tp"
|
||||
override val idImg = "fimg"
|
||||
override val listLanguage = arrayOf(
|
||||
"/english",
|
||||
"/japanese",
|
||||
"/chinese",
|
||||
"/turkish",
|
||||
)
|
||||
|
||||
override fun Element.parseTags() = select("a").mapToSet {
|
||||
val key = it.attr("href").removeSuffix('/').substringAfterLast('/')
|
||||
|
||||
@@ -19,9 +19,16 @@ internal class HentaiEra(context: MangaLoaderContext) :
|
||||
override val selectTags = ".tags_section"
|
||||
override val selectTag = ".galleries_info li:contains(Tags) div.info_tags"
|
||||
override val selectAuthor = ".galleries_info li:contains(Artists) span.item_name"
|
||||
override val urlReplaceBefore = "/gallery/"
|
||||
override val urlReplaceAfter = "/view/"
|
||||
override val selectLanguageChapter = ".galleries_info li:contains(Languages) div.info_tags .item_name"
|
||||
override val listLanguage = arrayOf(
|
||||
"/english",
|
||||
"/japanese",
|
||||
"/spanish",
|
||||
"/french",
|
||||
"/korean",
|
||||
"/german",
|
||||
"/russian",
|
||||
)
|
||||
|
||||
override suspend fun getListPage(
|
||||
page: Int,
|
||||
@@ -34,10 +41,15 @@ internal class HentaiEra(context: MangaLoaderContext) :
|
||||
append("https://")
|
||||
append(domain)
|
||||
if (!tags.isNullOrEmpty()) {
|
||||
append("/tag/")
|
||||
append(tag?.key.orEmpty())
|
||||
append("/?")
|
||||
|
||||
if (tag?.key == "languageKey") {
|
||||
append("/language")
|
||||
append(tag.title)
|
||||
append("/?")
|
||||
} else {
|
||||
append("/tag/")
|
||||
append(tag?.key.orEmpty())
|
||||
append("/?")
|
||||
}
|
||||
} else if (!query.isNullOrEmpty()) {
|
||||
append("/search/?key=")
|
||||
append(query.urlEncoded())
|
||||
@@ -53,10 +65,10 @@ internal class HentaiEra(context: MangaLoaderContext) :
|
||||
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
val urlChapters = manga.url.replace(urlReplaceBefore, urlReplaceAfter) + "1/"
|
||||
val tag = doc.selectFirstOrThrow(selectTag)
|
||||
val urlChapters = doc.selectFirstOrThrow("#cover a, .cover a, .left_cover a").attr("href")
|
||||
val tag = doc.selectFirst(selectTag)?.parseTags()
|
||||
return manga.copy(
|
||||
tags = tag.parseTags(),
|
||||
tags = tag.orEmpty(),
|
||||
author = doc.selectFirst(selectAuthor)?.text(),
|
||||
chapters = listOf(
|
||||
MangaChapter(
|
||||
|
||||
@@ -13,11 +13,22 @@ internal class HentaiFox(context: MangaLoaderContext) :
|
||||
override val selectGallery = ".lc_galleries .thumb, .related_galleries .thumb"
|
||||
override val selectTags = ".list_tags"
|
||||
override val selectTag = "ul.tags"
|
||||
override val urlReplaceBefore = "/gallery/"
|
||||
override val urlReplaceAfter = "/g/"
|
||||
override val selectLanguageChapter = "ul.languages a.tag_btn"
|
||||
|
||||
override val selectTotalPage = ".total_pages"
|
||||
override val listLanguage = arrayOf(
|
||||
"/english",
|
||||
"/french",
|
||||
"/japanese",
|
||||
"/chinese",
|
||||
"/spanish",
|
||||
"/russian",
|
||||
"/korean",
|
||||
"/indonesian",
|
||||
"/italian",
|
||||
"/portuguese",
|
||||
"/turkish",
|
||||
"/thai",
|
||||
"/vietnamese",
|
||||
)
|
||||
|
||||
override suspend fun getListPage(
|
||||
page: Int,
|
||||
@@ -30,13 +41,19 @@ internal class HentaiFox(context: MangaLoaderContext) :
|
||||
append("https://")
|
||||
append(domain)
|
||||
if (!tags.isNullOrEmpty()) {
|
||||
append("/tag/")
|
||||
append(tag?.key.orEmpty())
|
||||
if (tag?.key == "languageKey") {
|
||||
append("/language")
|
||||
append(tag.title)
|
||||
} else {
|
||||
append("/tag/")
|
||||
append(tag?.key.orEmpty())
|
||||
}
|
||||
if (page > 1) {
|
||||
append("/pag/")
|
||||
append(page)
|
||||
append("/")
|
||||
}
|
||||
|
||||
} else if (!query.isNullOrEmpty()) {
|
||||
append("/search/?q=")
|
||||
append(query.urlEncoded())
|
||||
|
||||
@@ -13,7 +13,14 @@ internal class HentaiRox(context: MangaLoaderContext) :
|
||||
override val selectTags = ".gtags"
|
||||
override val selectTag = "li:contains(Tags:)"
|
||||
override val selectAuthor = "li:contains(Artists:) span.item_name"
|
||||
override val urlReplaceBefore = "/gallery/"
|
||||
override val urlReplaceAfter = "/view/"
|
||||
override val selectLanguageChapter = "li:contains(Languages:) .item_name"
|
||||
override val listLanguage = arrayOf(
|
||||
"/english",
|
||||
"/french",
|
||||
"/japanese",
|
||||
"/spanish",
|
||||
"/russian",
|
||||
"/korean",
|
||||
"/german",
|
||||
)
|
||||
}
|
||||
|
||||
@@ -18,13 +18,14 @@ internal class NHentaiParser(context: MangaLoaderContext) :
|
||||
override val selectTags = "#tag-container a"
|
||||
override val selectTag = ".tag-container:contains(Tags:) span.tags"
|
||||
override val selectAuthor = "#tags div.tag-container:contains(Artists:) span.name"
|
||||
override val urlReplaceBefore = "/g/"
|
||||
override val urlReplaceAfter = "/g/"
|
||||
override val selectLanguageChapter =
|
||||
".tag-container:contains(Languages:) span.tags a:not(.tag-17249) span.name" // tag-17249 = translated
|
||||
|
||||
override val selectTotalPage = ".num-pages"
|
||||
override val idImg = "image-container"
|
||||
override val listLanguage = arrayOf(
|
||||
"/english",
|
||||
"/japanese",
|
||||
"/chinese",
|
||||
)
|
||||
|
||||
override suspend fun getListPage(
|
||||
page: Int,
|
||||
@@ -40,10 +41,15 @@ internal class NHentaiParser(context: MangaLoaderContext) :
|
||||
append(domain)
|
||||
if (!tags.isNullOrEmpty()) {
|
||||
val tag = tags.single()
|
||||
append("/tag/")
|
||||
append(tag.key)
|
||||
append("/?")
|
||||
|
||||
if (tag.key == "languageKey") {
|
||||
append("/language")
|
||||
append(tag.title)
|
||||
append("/?")
|
||||
} else {
|
||||
append("/tag/")
|
||||
append(tag.key)
|
||||
append("/?")
|
||||
}
|
||||
} else if (!query.isNullOrEmpty()) {
|
||||
append("/search/?q=")
|
||||
append(query.urlEncoded())
|
||||
|
||||
@@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
@MangaSourceParser("PHENIXSCANS", "PhenixScans", "fr")
|
||||
internal class PhenixscansParser(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.PHENIXSCANS, "phenixscans.fr", pageSize = 20, searchPageSize = 10) {
|
||||
|
||||
override val datePattern = "MMM d, yyyy"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import java.util.*
|
||||
|
||||
@MangaSourceParser("MANGAKITA", "MangaKita", "id")
|
||||
internal class MangakKita(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.MANGAKITA, "mangakita.net", pageSize = 20, searchPageSize = 20) {
|
||||
override val datePattern = "MMM d, yyyy"
|
||||
MangaReaderParser(context, MangaSource.MANGAKITA, "mangakita.id", pageSize = 20, searchPageSize = 10) {
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user