diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt index e60683fea..23f736e83 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt @@ -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 { 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 { 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), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt index d814235dd..dfadba46c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/OmegaScans.kt @@ -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 { 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() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/TempleScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/TempleScan.kt index e6ffc2e09..8fc5adbee 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/TempleScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/en/TempleScan.kt @@ -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" } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/EscapeUtils.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/EscapeUtils.kt new file mode 100644 index 000000000..0cb24050e --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/EscapeUtils.kt @@ -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() +}