From 91e53e487242cf9d1b7b8585e32237319bc0db41 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 27 Nov 2024 11:56:42 +0200 Subject: [PATCH] [AsuraScans] Fix pages parsing --- .../parsers/site/en/AsuraScansParser.kt | 32 ++++++++++++++++--- .../kotatsu/parsers/util/json/JsonExt.kt | 13 ++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt index e007b257..7e133a90 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/AsuraScansParser.kt @@ -11,6 +11,8 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.asTypedList +import org.koitharu.kotatsu.parsers.util.json.toJSONArrayOrNull +import org.koitharu.kotatsu.parsers.util.json.toJSONObjectOrNull import java.text.SimpleDateFormat import java.util.* @@ -185,14 +187,36 @@ internal class AsuraScansParser(context: MangaLoaderContext) : override suspend fun getPages(chapter: MangaChapter): List { val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - return doc.selectOrThrow("div.w-full > img.object-cover").map { img -> - val urlPage = img.requireSrc().toRelativeUrl(domain) + val data = doc.selectOrThrow("script").mapNotNull { x -> + x.data().substringBetween("self.__next_f.push(", ")", "") + .trim() + .takeUnless { it.isEmpty() } + }.flatMap { it.jsonStrings() } + .joinToString("") + .split('\n') + .mapNotNull { x -> + x.substringAfter(':').toJSONObjectOrNull() + } + val pages = data.filter { it.has("order") && it.has("url") } + .associate { it.getInt("order") to it.getString("url") }.values + return pages.map { url -> MangaPage( - id = generateUid(urlPage), - url = urlPage, + id = generateUid(url), + url = url, preview = null, source = source, ) } } + + private fun String.jsonStrings(): List { + val ja = toJSONArrayOrNull() ?: return emptyList() + val result = ArrayList(ja.length()) + repeat(ja.length()) { i -> + (ja.get(i) as? String)?.let { item -> + result.add(item) + } + } + return result + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt index 695eb6c1..b5d65b28 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/json/JsonExt.kt @@ -2,10 +2,23 @@ package org.koitharu.kotatsu.parsers.util.json import androidx.collection.ArraySet import org.json.JSONArray +import org.json.JSONException import org.json.JSONObject import java.util.* import kotlin.contracts.contract +public fun String.toJSONObjectOrNull(): JSONObject? = try { + JSONObject(this) +} catch (_: JSONException) { + null +} + +public fun String.toJSONArrayOrNull(): JSONArray? = try { + JSONArray(this) +} catch (_: JSONException) { + null +} + public inline fun > JSONArray.mapJSONTo( destination: C, block: (JSONObject) -> R,