|
|
|
|
@ -6,7 +6,7 @@ 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.EnumSet
|
|
|
|
|
import java.util.*
|
|
|
|
|
|
|
|
|
|
@MangaSourceParser("HENTAIERA", "HentaiEra", type = ContentType.HENTAI)
|
|
|
|
|
internal class HentaiEra(context: MangaLoaderContext) :
|
|
|
|
|
@ -15,20 +15,22 @@ internal class HentaiEra(context: MangaLoaderContext) :
|
|
|
|
|
override val selectTag = ".galleries_info li:contains(Tags) div.info_tags"
|
|
|
|
|
override val selectAuthor = ".galleries_info li:contains(Artists) span.item_name"
|
|
|
|
|
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 val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY)
|
|
|
|
|
|
|
|
|
|
override val isMultipleTagsSupported = true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override suspend fun getAvailableLocales(): Set<Locale> = setOf(
|
|
|
|
|
Locale.ENGLISH,
|
|
|
|
|
Locale.FRENCH,
|
|
|
|
|
Locale.JAPANESE,
|
|
|
|
|
Locale("es"),
|
|
|
|
|
Locale("ru"),
|
|
|
|
|
Locale("ko"),
|
|
|
|
|
Locale.GERMAN,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
override fun Element.parseTags() = select("a.tag, .gallery_title a").mapToSet {
|
|
|
|
|
val key = it.attr("href").removeSuffix('/').substringAfterLast('/')
|
|
|
|
|
val name = it.selectFirst(".item_name")?.text() ?: it.text()
|
|
|
|
|
@ -52,24 +54,31 @@ internal class HentaiEra(context: MangaLoaderContext) :
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
is MangaListFilter.Advanced -> {
|
|
|
|
|
if (filter.tags.isNotEmpty() && filter.tags.size > 1) {
|
|
|
|
|
if (filter.tags.size > 1 || (filter.tags.isNotEmpty() && filter.locale != null)) {
|
|
|
|
|
append("/search/?key=")
|
|
|
|
|
if (filter.sortOrder == SortOrder.POPULARITY) {
|
|
|
|
|
append(buildQuery(filter.tags).replace("<=1&dl=0&pp=0&tr=0", "<=0&dl=0&pp=1&tr=0"))
|
|
|
|
|
append(
|
|
|
|
|
buildQuery(filter.tags, filter.locale)
|
|
|
|
|
.replace("<=1&dl=0&pp=0&tr=0", "<=0&dl=0&pp=1&tr=0"),
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
append(buildQuery(filter.tags))
|
|
|
|
|
append(buildQuery(filter.tags, filter.locale))
|
|
|
|
|
}
|
|
|
|
|
append("&")
|
|
|
|
|
} else if (filter.tags.isNotEmpty()) {
|
|
|
|
|
filter.tags.oneOrThrowIfMany()?.let {
|
|
|
|
|
if (it.key == "languageKey") {
|
|
|
|
|
append("/language")
|
|
|
|
|
append(it.title)
|
|
|
|
|
} else {
|
|
|
|
|
append("/tag/")
|
|
|
|
|
append(it.key)
|
|
|
|
|
}
|
|
|
|
|
append("/")
|
|
|
|
|
|
|
|
|
|
if (filter.sortOrder == SortOrder.POPULARITY) {
|
|
|
|
|
append("popular/")
|
|
|
|
|
}
|
|
|
|
|
append("?")
|
|
|
|
|
} else if (filter.locale != null) {
|
|
|
|
|
append("/language/")
|
|
|
|
|
append(filter.locale.toLanguagePath())
|
|
|
|
|
append("/")
|
|
|
|
|
|
|
|
|
|
if (filter.sortOrder == SortOrder.POPULARITY) {
|
|
|
|
|
@ -90,40 +99,20 @@ internal class HentaiEra(context: MangaLoaderContext) :
|
|
|
|
|
return parseMangaList(webClient.httpGet(url).parseHtml())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun buildQuery(tags: Collection<MangaTag>): String {
|
|
|
|
|
private fun buildQuery(tags: Collection<MangaTag>, locale: Locale?): String {
|
|
|
|
|
val queryDefault =
|
|
|
|
|
"&search=&mg=1&dj=1&ws=1&is=1&ac=1&gc=1&en=0&jp=0&es=0&fr=0&kr=0&de=0&ru=0<=1&dl=0&pp=0&tr=0"
|
|
|
|
|
var tag = ""
|
|
|
|
|
var queryMod = ""
|
|
|
|
|
tags.map {
|
|
|
|
|
if (it.key == "languageKey" && it.title == "/english") {
|
|
|
|
|
queryMod = queryDefault.replace("en=0", "en=1")
|
|
|
|
|
}
|
|
|
|
|
if (it.key == "languageKey" && it.title == "/japanese") {
|
|
|
|
|
queryMod = queryDefault.replace("jp=0", "jp=1")
|
|
|
|
|
}
|
|
|
|
|
if (it.key == "languageKey" && it.title == "/spanish") {
|
|
|
|
|
queryMod = queryDefault.replace("es=0", "es=1")
|
|
|
|
|
}
|
|
|
|
|
if (it.key == "languageKey" && it.title == "/french") {
|
|
|
|
|
queryMod = queryDefault.replace("fr=0", "fr=1")
|
|
|
|
|
}
|
|
|
|
|
if (it.key == "languageKey" && it.title == "/korean") {
|
|
|
|
|
queryMod = queryDefault.replace("kr=0", "kr=1")
|
|
|
|
|
}
|
|
|
|
|
if (it.key == "languageKey" && it.title == "/russian") {
|
|
|
|
|
queryMod = queryDefault.replace("ru=0", "ru=1")
|
|
|
|
|
}
|
|
|
|
|
if (it.key == "languageKey" && it.title == "/german") {
|
|
|
|
|
queryMod = queryDefault.replace("de=0", "de=1")
|
|
|
|
|
}
|
|
|
|
|
if (it.key != "languageKey") {
|
|
|
|
|
tag += it.key + " "
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (queryMod.isEmpty()) {
|
|
|
|
|
queryMod = "&search=&mg=1&dj=1&ws=1&is=1&ac=1&gc=1&en=1&jp=1&es=1&fr=1&kr=1&de=1&ru=1<=1&dl=0&pp=0&tr=0"
|
|
|
|
|
val tag = tags.joinToString(" ", postfix = " ") { it.key }
|
|
|
|
|
val queryMod = when (val lp = locale?.toLanguagePath()) {
|
|
|
|
|
"english" -> queryDefault.replace("en=0", "en=1")
|
|
|
|
|
"japanese" -> queryDefault.replace("jp=0", "jp=1")
|
|
|
|
|
"spanish" -> queryDefault.replace("es=0", "es=1")
|
|
|
|
|
"french" -> queryDefault.replace("fr=0", "fr=1")
|
|
|
|
|
"korean" -> queryDefault.replace("kr=0", "kr=1")
|
|
|
|
|
"russian" -> queryDefault.replace("ru=0", "ru=1")
|
|
|
|
|
"german" -> queryDefault.replace("de=0", "de=1")
|
|
|
|
|
null -> "&search=&mg=1&dj=1&ws=1&is=1&ac=1&gc=1&en=1&jp=1&es=1&fr=1&kr=1&de=1&ru=1<=1&dl=0&pp=0&tr=0"
|
|
|
|
|
else -> throw IllegalArgumentException("Unsupported locale: $lp")
|
|
|
|
|
}
|
|
|
|
|
return tag + queryMod
|
|
|
|
|
}
|
|
|
|
|
|