[HeanCms] Fixes

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

@ -35,12 +35,14 @@ internal abstract class HeanCms(
.build() .build()
protected open val pathManga = "series" 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 ) //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> { override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val url = buildString { val url = buildString {
append("https://api.") append("https://")
append(domain) append(apiPath)
append("/query?query_string=") append("/query?query_string=")
when (filter) { when (filter) {
is MangaListFilter.Search -> { is MangaListFilter.Search -> {
@ -159,7 +161,7 @@ internal abstract class HeanCms(
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> { override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain) val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml() 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") val url = img.src() ?: img.parseFailed("Image src not found")
MangaPage( MangaPage(
id = generateUid(url), 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.getFloatOrDefault
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
import org.koitharu.kotatsu.parsers.util.json.mapJSON import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.json.unescapeJson
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.*
@MangaSourceParser("OMEGASCANS", "OmegaScans", "en", ContentType.HENTAI) @MangaSourceParser("OMEGASCANS", "OmegaScans", "en", ContentType.HENTAI)
internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaSource.OMEGASCANS, "omegascans.org") { 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> { override suspend fun getAvailableTags(): Set<MangaTag> {
val doc = webClient.httpGet("https://$domain/comics").parseHtml() val doc = webClient.httpGet("https://$domain/comics").parseHtml()
val tags = doc.selectFirstOrThrow("script:containsData(tags)").data() val regex = Regex("\"tags\\\\.*?(\\[.+?])")
.replace("\\", "") val tags = doc.select("script").firstNotNullOf { script ->
.substringAfterLast("\"tags\":") regex.find(script.html())?.groupValues?.getOrNull(1)
.substringBeforeLast("}],") }.unescapeJson()
return JSONArray(tags).mapJSON { return JSONArray(tags).mapJSON {
MangaTag( MangaTag(
key = it.getInt("id").toString(), key = it.getInt("id").toString(),
title = it.getString("name"), title = it.getString("name").toTitleCase(sourceLocale),
source = source, source = source,
) )
}.toSet() }.toSet()

@ -4,9 +4,13 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.heancms.HeanCms import org.koitharu.kotatsu.parsers.site.heancms.HeanCms
import org.koitharu.kotatsu.parsers.util.domain
@MangaSourceParser("TEMPLESCAN", "TempleScan", "en") @MangaSourceParser("TEMPLESCAN", "TempleScan", "en")
internal class TempleScan(context: MangaLoaderContext) : internal class TempleScan(context: MangaLoaderContext) :
HeanCms(context, MangaSource.TEMPLESCAN, "templescan.net") { HeanCms(context, MangaSource.TEMPLESCAN, "templescan.net") {
override val pathManga = "comic" 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