diff --git a/src/id/mangkomik/build.gradle b/src/id/mangkomik/build.gradle index 742d2dce4..deea1a0c4 100644 --- a/src/id/mangkomik/build.gradle +++ b/src/id/mangkomik/build.gradle @@ -3,7 +3,7 @@ ext { extClass = '.SirenKomik' themePkg = 'mangathemesia' baseUrl = 'https://sirenkomik.my.id' - overrideVersionCode = 5 + overrideVersionCode = 6 } apply from: "$rootDir/common.gradle" diff --git a/src/id/mangkomik/src/eu/kanade/tachiyomi/extension/id/mangkomik/SirenKomik.kt b/src/id/mangkomik/src/eu/kanade/tachiyomi/extension/id/mangkomik/SirenKomik.kt index 840768cbf..cff59c279 100644 --- a/src/id/mangkomik/src/eu/kanade/tachiyomi/extension/id/mangkomik/SirenKomik.kt +++ b/src/id/mangkomik/src/eu/kanade/tachiyomi/extension/id/mangkomik/SirenKomik.kt @@ -4,8 +4,11 @@ import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter +import kotlinx.serialization.json.decodeFromStream +import okhttp3.HttpUrl.Companion.toHttpUrl import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import java.io.IOException import java.text.SimpleDateFormat import java.util.Locale @@ -27,9 +30,6 @@ class SirenKomik : MangaThemesia( override fun chapterListSelector() = ".list-chapter a" - // Overridden since MangeThemesia doesn't search for jsonData in script tags, because it finds the bait images with the default selector - override val pageSelector: String = ":not(*)" - override fun chapterFromElement(element: Element) = SChapter.create().apply { name = element.selectFirst(".nomer-chapter")!!.text() date_upload = element.selectFirst(".tgl-chapter")?.text().parseChapterDate() @@ -37,19 +37,25 @@ class SirenKomik : MangaThemesia( } override fun pageListParse(document: Document): List { - // Get external JS for image urls - val scriptEl = document.selectFirst("script[data-minify]") - val scriptUrl = scriptEl?.attr("src") - if (scriptUrl.isNullOrEmpty()) { - return super.pageListParse(document) + val postId = document.select("script").map(Element::data) + .firstOrNull(postIdRegex::containsMatchIn) + ?.let { postIdRegex.find(it)?.groups?.get(1)?.value } + ?: throw IOException("Post ID not found") + + val pageUrl = "$baseUrl/wp-json/extras/v1/get-img-json".toHttpUrl().newBuilder() + .addQueryParameter("post_id", postId) + .build() + + val dto = client.newCall(GET(pageUrl, headers)).execute().use { + json.decodeFromStream(it.body.byteStream()) } - val scriptResponse = client.newCall( - GET(scriptUrl, headers), - ).execute() + return dto.pages.mapIndexed { index, imageUrl -> + Page(index, document.location(), imageUrl) + } + } - // Inject external JS - scriptEl.text(scriptResponse.body.string()) - return super.pageListParse(document) + companion object { + val postIdRegex = """postId.:(\d+)""".toRegex() } } diff --git a/src/id/mangkomik/src/eu/kanade/tachiyomi/extension/id/mangkomik/SirenKomikDto.kt b/src/id/mangkomik/src/eu/kanade/tachiyomi/extension/id/mangkomik/SirenKomikDto.kt new file mode 100644 index 000000000..74056e1b5 --- /dev/null +++ b/src/id/mangkomik/src/eu/kanade/tachiyomi/extension/id/mangkomik/SirenKomikDto.kt @@ -0,0 +1,21 @@ +package eu.kanade.tachiyomi.extension.id.mangkomik + +import kotlinx.serialization.Serializable + +@Serializable +data class SirenKomikDto( + val `data`: Data, +) { + val pages get() = data.sources.firstOrNull()?.images ?: emptyList() +} + +@Serializable +class Source( + val images: List, + val source: String, +) + +@Serializable +class Data( + val sources: List, +)