[HeanCms] Fixes

master
Koitharu 2 years ago
parent 7829a2ad3b
commit 3463c8a49e
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -35,12 +35,14 @@ internal abstract class HeanCms(
.build()
protected open val pathManga = "series"
protected open val apiPath
get() = getDomain("api")
//For some sources, you need to send a json. For the moment, this part only works in Get. ( ex source need json gloriousscan.com , omegascans.org )
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val url = buildString {
append("https://api.")
append(domain)
append("https://")
append(apiPath)
append("/query?query_string=")
when (filter) {
is MangaListFilter.Search -> {
@ -159,7 +161,7 @@ internal abstract class HeanCms(
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
return doc.select("p.flex img").map { img ->
return doc.select(".flex > img:not([alt])").map { img ->
val url = img.src() ?: img.parseFailed("Image src not found")
MangaPage(
id = generateUid(url),

@ -9,8 +9,9 @@ import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.json.unescapeJson
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.*
@MangaSourceParser("OMEGASCANS", "OmegaScans", "en", ContentType.HENTAI)
internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaSource.OMEGASCANS, "omegascans.org") {
@ -130,15 +131,14 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS
override suspend fun getAvailableTags(): Set<MangaTag> {
val doc = webClient.httpGet("https://$domain/comics").parseHtml()
val tags = doc.selectFirstOrThrow("script:containsData(tags)").data()
.replace("\\", "")
.substringAfterLast("\"tags\":")
.substringBeforeLast("}],")
val regex = Regex("\"tags\\\\.*?(\\[.+?])")
val tags = doc.select("script").firstNotNullOf { script ->
regex.find(script.html())?.groupValues?.getOrNull(1)
}.unescapeJson()
return JSONArray(tags).mapJSON {
MangaTag(
key = it.getInt("id").toString(),
title = it.getString("name"),
title = it.getString("name").toTitleCase(sourceLocale),
source = source,
)
}.toSet()

@ -4,9 +4,13 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.heancms.HeanCms
import org.koitharu.kotatsu.parsers.util.domain
@MangaSourceParser("TEMPLESCAN", "TempleScan", "en")
internal class TempleScan(context: MangaLoaderContext) :
HeanCms(context, MangaSource.TEMPLESCAN, "templescan.net") {
override val pathManga = "comic"
override val apiPath: String
get() = "$domain/apiv1"
}

@ -0,0 +1,38 @@
package org.koitharu.kotatsu.parsers.util.json
fun String.unescapeJson(): String {
val builder = StringBuilder()
var i = 0
while (i < length) {
val delimiter = this[i]
i++ // consume letter or backslash
if (delimiter == '\\' && i < length) {
val ch = this[i]
i++
when (ch) {
'\\', '/', '"', '\'' -> builder.append(ch)
'n' -> builder.append('\n')
'r' -> builder.append('\r')
't' -> builder.append('\t')
'b' -> builder.append('\b')
'u' -> {
val hex = StringBuilder(4)
require(i + 4 <= length) { "Not enough unicode digits!" }
for (x in substring(i, i + 4)) {
require(x.isLetterOrDigit()) { "Bad character in unicode escape" }
hex.append(x.lowercase())
}
i += 4 // consume those four digits.
val code = hex.toString().toInt(16)
builder.append(code.toChar())
}
else -> throw IllegalArgumentException("Illegal escape sequence: \\$ch")
}
} else {
builder.append(delimiter)
}
}
return builder.toString()
}
Loading…
Cancel
Save