pull/259/head
devi 3 years ago
parent 7debe6d7e2
commit e25656c090

@ -26,15 +26,15 @@ internal class FmTeam(context: MangaLoaderContext) :
tags: Set<MangaTag>?, tags: Set<MangaTag>?,
sortOrder: SortOrder, sortOrder: SortOrder,
): List<Manga> { ): List<Manga> {
if (page > 1) { return emptyList() } if (page > 1) {
return emptyList()
}
val jsonManga = if(!query.isNullOrEmpty()) val jsonManga = if (!query.isNullOrEmpty()) {
{
//3 letters minimum //3 letters minimum
webClient.httpGet("https://$domain/api/search/${query.urlEncoded()}").parseJson().getJSONArray("comics") webClient.httpGet("https://$domain/api/search/${query.urlEncoded()}").parseJson().getJSONArray("comics")
}else } else {
{
webClient.httpGet("https://$domain/api/comics").parseJson().getJSONArray("comics") webClient.httpGet("https://$domain/api/comics").parseJson().getJSONArray("comics")
} }
@ -53,14 +53,14 @@ internal class FmTeam(context: MangaLoaderContext) :
} }
if (found) { if (found) {
manga.add( manga.add(
addManga(href, j) addManga(href, j),
) )
} }
} }
else -> { else -> {
manga.add( manga.add(
addManga(href, j) addManga(href, j),
) )
} }
} }
@ -68,34 +68,34 @@ internal class FmTeam(context: MangaLoaderContext) :
return manga return manga
} }
private fun addManga(href : String, j : JSONObject): Manga { private fun addManga(href: String, j: JSONObject): Manga {
return Manga( return Manga(
id = generateUid(href), id = generateUid(href),
url = href, url = href,
publicUrl = href.toAbsoluteUrl(domain), publicUrl = href.toAbsoluteUrl(domain),
coverUrl = j.getString("thumbnail"), coverUrl = j.getString("thumbnail"),
title = j.getString("title"), title = j.getString("title"),
description = j.getString("description"), description = j.getString("description"),
altTitle = j.getJSONArray("alt_titles").toString() altTitle = j.getJSONArray("alt_titles").toString()
.replace("[\"", "") .replace("[\"", "")
.replace("\"]", "") .replace("\"]", "")
.replace("\",\"", " , "), .replace("\",\"", " , "),
rating = j.getString("rating").toFloatOrNull()?.div(10f) rating = j.getString("rating").toFloatOrNull()?.div(10f)
?: RATING_UNKNOWN, ?: RATING_UNKNOWN,
tags = emptySet(), tags = emptySet(),
author = j.getString("author"), author = j.getString("author"),
state = when (j.getString("status").lowercase()) { state = when (j.getString("status").lowercase()) {
"en cours" -> MangaState.ONGOING "en cours" -> MangaState.ONGOING
"terminé" -> MangaState.FINISHED "terminé" -> MangaState.FINISHED
else -> null else -> null
}, },
source = source, source = source,
isNsfw = when (j.getString("adult").toInt()) { isNsfw = when (j.getString("adult").toInt()) {
0 -> false 0 -> false
1 -> true 1 -> true
else -> true else -> true
}, },
) )
} }
@ -115,7 +115,7 @@ internal class FmTeam(context: MangaLoaderContext) :
source = source, source = source,
) )
}, },
chapters = chapters.mapJSONIndexed { i,j -> chapters = chapters.mapJSONIndexed { i, j ->
val url = "/api" + j.getString("url").toRelativeUrl(domain) val url = "/api" + j.getString("url").toRelativeUrl(domain)
val name = j.getString("full_title") val name = j.getString("full_title")
val date = j.getStringOrNull("updated_at") val date = j.getStringOrNull("updated_at")

@ -42,8 +42,7 @@ internal abstract class HeanCmsAlt(
sortOrder: SortOrder, sortOrder: SortOrder,
): List<Manga> { ): List<Manga> {
//No search or tag //No search or tag
if(!query.isNullOrEmpty()) if (!query.isNullOrEmpty()) {
{
return emptyList() return emptyList()
} }
val url = buildString { val url = buildString {

@ -13,7 +13,6 @@ import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
internal abstract class MangaReaderParser( internal abstract class MangaReaderParser(
context: MangaLoaderContext, context: MangaLoaderContext,
source: MangaSource, source: MangaSource,
@ -34,6 +33,84 @@ internal abstract class MangaReaderParser(
private val mutex = Mutex() private val mutex = Mutex()
protected open var lastSearchPage = 1 protected open var lastSearchPage = 1
override suspend fun getListPage(
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
if (!query.isNullOrEmpty()) {
if (page > lastSearchPage) {
return emptyList()
}
val url = buildString {
append("https://")
append(domain)
append("/page/")
append(page)
append("/?s=")
append(query.urlEncoded())
}
val docs = webClient.httpGet(url).parseHtml()
lastSearchPage = docs.selectFirst(".pagination .next")
?.previousElementSibling()
?.text()?.toIntOrNull() ?: 1
return parseMangaList(docs)
}
val sortQuery = when (sortOrder) {
SortOrder.ALPHABETICAL -> "title"
SortOrder.NEWEST -> "latest"
SortOrder.POPULARITY -> "popular"
SortOrder.UPDATED -> "update"
else -> ""
}
val tagKey = "genre[]".urlEncoded()
val tagQuery =
if (tags.isNullOrEmpty()) "" else tags.joinToString(separator = "&", prefix = "&") { "$tagKey=${it.key}" }
val url = buildString {
append("https://")
append(domain)
append(listUrl)
append("/?order=")
append(sortQuery)
append(tagQuery)
append("&page=")
append(page)
}
return parseMangaList(webClient.httpGet(url).parseHtml())
}
protected open val selectMangalist = ".postbody .listupd .bs .bsx"
protected open val selectMangaListImg = "img.ts-post-image"
protected open val selectMangaListTitle = "div.tt"
protected open fun parseMangaList(docs: Document): List<Manga> {
return docs.select(selectMangalist).mapNotNull {
val a = it.selectFirst("a") ?: return@mapNotNull null
val relativeUrl = a.attrAsRelativeUrl("href")
val rating = it.selectFirst(".numscore")?.text()
?.toFloatOrNull()?.div(10) ?: RATING_UNKNOWN
Manga(
id = generateUid(relativeUrl),
url = relativeUrl,
title = it.selectFirst(selectMangaListTitle)?.text() ?: a.attr("title"),
altTitle = null,
publicUrl = a.attrAsAbsoluteUrl("href"),
rating = rating,
isNsfw = isNsfwSource,
coverUrl = it.selectFirst(selectMangaListImg)?.src().orEmpty(),
tags = emptySet(),
state = null,
author = null,
source = source,
)
}
}
protected open val selectChapter = "#chapterlist > ul > li" protected open val selectChapter = "#chapterlist > ul > li"
override suspend fun getDetails(manga: Manga): Manga { override suspend fun getDetails(manga: Manga): Manga {
val docs = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() val docs = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
@ -61,7 +138,6 @@ internal abstract class MangaReaderParser(
docs.selectFirst("div.seriestucontent > div.seriestucontentr") ?: docs.selectFirst("div.seriestucontentr") docs.selectFirst("div.seriestucontent > div.seriestucontentr") ?: docs.selectFirst("div.seriestucontentr")
?: docs.selectFirst("div.seriestucon") ?: docs.selectFirst("div.seriestucon")
val tagMap = getOrCreateTagMap() val tagMap = getOrCreateTagMap()
val selectTag = if (tablemode != null) { val selectTag = if (tablemode != null) {
@ -72,7 +148,6 @@ internal abstract class MangaReaderParser(
val tags = selectTag.mapNotNullToSet { tagMap[it.text()] } val tags = selectTag.mapNotNullToSet { tagMap[it.text()] }
val stateSelect = if (tablemode != null) { val stateSelect = if (tablemode != null) {
tablemode.selectFirst(".infotable td:contains(Status)") tablemode.selectFirst(".infotable td:contains(Status)")
?: tablemode.selectFirst(".infotable td:contains(Statut)") ?: tablemode.selectFirst(".infotable td:contains(Statut)")
@ -141,86 +216,6 @@ internal abstract class MangaReaderParser(
) )
} }
override suspend fun getListPage(
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
if (!query.isNullOrEmpty()) {
if (page > lastSearchPage) {
return emptyList()
}
val url = buildString {
append("https://")
append(domain)
append("/page/")
append(page)
append("/?s=")
append(query.urlEncoded())
}
val docs = webClient.httpGet(url).parseHtml()
lastSearchPage = docs.selectFirst(".pagination .next")
?.previousElementSibling()
?.text()?.toIntOrNull() ?: 1
return parseMangaList(docs)
}
val sortQuery = when (sortOrder) {
SortOrder.ALPHABETICAL -> "title"
SortOrder.NEWEST -> "latest"
SortOrder.POPULARITY -> "popular"
SortOrder.UPDATED -> "update"
else -> ""
}
val tagKey = "genre[]".urlEncoded()
val tagQuery =
if (tags.isNullOrEmpty()) "" else tags.joinToString(separator = "&", prefix = "&") { "$tagKey=${it.key}" }
val url = buildString {
append("https://")
append(domain)
append(listUrl)
append("/?order=")
append(sortQuery)
append(tagQuery)
append("&page=")
append(page)
}
return parseMangaList(webClient.httpGet(url).parseHtml())
}
protected open val selectMangalist = ".postbody .listupd .bs .bsx"
protected open val selectMangaListImg = "img.ts-post-image"
protected open val selectMangaListTitle = "div.tt"
protected open fun parseMangaList(docs: Document): List<Manga> {
return docs.select(selectMangalist).mapNotNull {
val a = it.selectFirst("a") ?: return@mapNotNull null
val relativeUrl = a.attrAsRelativeUrl("href")
val rating = it.selectFirst(".numscore")?.text()
?.toFloatOrNull()?.div(10) ?: RATING_UNKNOWN
Manga(
id = generateUid(relativeUrl),
url = relativeUrl,
title = it.selectFirst(selectMangaListTitle)?.text() ?: a.attr("title"),
altTitle = null,
publicUrl = a.attrAsAbsoluteUrl("href"),
rating = rating,
isNsfw = isNsfwSource,
coverUrl = it.selectFirst(selectMangaListImg)?.src().orEmpty(),
tags = emptySet(),
state = null,
author = null,
source = source,
)
}
}
protected open val encodedSrc = false protected open val encodedSrc = false
protected open val selectScript = "div.wrapper script" protected open val selectScript = "div.wrapper script"
protected open val selectPage = "div#readerarea img" protected open val selectPage = "div#readerarea img"
@ -280,10 +275,7 @@ internal abstract class MangaReaderParser(
} }
return pages return pages
} }
} }
override suspend fun getTags(): Set<MangaTag> { override suspend fun getTags(): Set<MangaTag> {
@ -293,22 +285,17 @@ internal abstract class MangaReaderParser(
protected suspend fun getOrCreateTagMap(): Map<String, MangaTag> = mutex.withLock { protected suspend fun getOrCreateTagMap(): Map<String, MangaTag> = mutex.withLock {
tagCache?.let { return@withLock it } tagCache?.let { return@withLock it }
val tagMap = ArrayMap<String, MangaTag>() val tagMap = ArrayMap<String, MangaTag>()
val url = listUrl.toAbsoluteUrl(domain) val url = listUrl.toAbsoluteUrl(domain)
val tagElements = webClient.httpGet(url).parseHtml().select("ul.genrez > li") val tagElements = webClient.httpGet(url).parseHtml().select("ul.genrez > li")
for (el in tagElements) { for (el in tagElements) {
if (el.text().isEmpty()) continue if (el.text().isEmpty()) continue
tagMap[el.text()] = MangaTag( tagMap[el.text()] = MangaTag(
title = el.text(), title = el.text(),
key = el.selectFirst("input")?.attr("value") ?: continue, key = el.selectFirst("input")?.attr("value") ?: continue,
source = source, source = source,
) )
} }
tagCache = tagMap tagCache = tagMap
return@withLock tagMap return@withLock tagMap
} }
} }

@ -8,7 +8,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("HENTAISSSSSCANLATOR", "Sssscanlator Hentai", "pt", type = ContentType.HENTAI) @MangaSourceParser("HENTAISSSSSCANLATOR", "Sssscanlator Hentai", "pt", type = ContentType.HENTAI)
internal class HentaiSsssscanlator(context: MangaLoaderContext) : internal class HentaiSsssscanlator(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.HENTAISSSSSCANLATOR, "hentais.sssscanlator.com", pageSize = 20, searchPageSize = 10) { MangaReaderParser(context, MangaSource.HENTAISSSSSCANLATOR, "hentais.sssscanlator.com", pageSize = 20, searchPageSize = 10,) {
override val datePattern = "MMM d, yyyy" override val datePattern = "MMM d, yyyy"
} }

@ -53,10 +53,11 @@ internal abstract class NepnepParser(
!query.isNullOrEmpty() -> { !query.isNullOrEmpty() -> {
if (m.getString("i").contains(query.urlEncoded(), ignoreCase = true)) { if (m.getString("i").contains(query.urlEncoded(), ignoreCase = true)) {
manga.add( manga.add(
addManga(href, imgUrl, m) addManga(href, imgUrl, m),
) )
} }
} }
!tags.isNullOrEmpty() -> { !tags.isNullOrEmpty() -> {
val a = m.getJSONArray("g").toString() val a = m.getJSONArray("g").toString()
var found = true var found = true
@ -67,14 +68,14 @@ internal abstract class NepnepParser(
} }
if (found) { if (found) {
manga.add( manga.add(
addManga(href, imgUrl, m) addManga(href, imgUrl, m),
) )
} }
} }
else -> { else -> {
manga.add( manga.add(
addManga(href, imgUrl, m) addManga(href, imgUrl, m),
) )
} }
} }
@ -84,7 +85,7 @@ internal abstract class NepnepParser(
return manga return manga
} }
private fun addManga(href : String, imgUrl : String, m : JSONObject): Manga { private fun addManga(href: String, imgUrl: String, m: JSONObject): Manga {
return Manga( return Manga(
id = generateUid(href), id = generateUid(href),
title = m.getString("i").replace('-', ' '), title = m.getString("i").replace('-', ' '),

Loading…
Cancel
Save