diff --git a/src/fr/japscan/build.gradle b/src/fr/japscan/build.gradle index aae08cd26..0c6751a9e 100644 --- a/src/fr/japscan/build.gradle +++ b/src/fr/japscan/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Japscan' extClass = '.Japscan' - extVersionCode = 49 + extVersionCode = 50 } apply from: "$rootDir/common.gradle" diff --git a/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt b/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt index 12e584589..76bb9709c 100644 --- a/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt +++ b/src/fr/japscan/src/eu/kanade/tachiyomi/extension/fr/japscan/Japscan.kt @@ -22,6 +22,7 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup import keiyoushi.utils.getPreferencesLazy +import keiyoushi.utils.parseAs import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonArray @@ -48,7 +49,7 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { override val name = "Japscan" - override val baseUrl = "https://www.japscan.lol" + override val baseUrl = "https://www.japscan.si" override val lang = "fr" @@ -91,7 +92,7 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { element.select("a").first()!!.let { manga.setUrlWithoutDomain(it.attr("href")) manga.title = it.text() - manga.thumbnail_url = "$baseUrl/imgs/${it.attr("href").replace(Regex("/$"),".jpg").replace("manga","mangas")}".lowercase(Locale.ROOT) + manga.thumbnail_url = it.selectFirst("img")?.attr("abs:data-src") } return manga } @@ -131,7 +132,7 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { .add("X-Requested-With", "XMLHttpRequest") .build() - return POST("$baseUrl/live-search/", searchHeaders, formBody) + return POST("$baseUrl/ls/", searchHeaders, formBody) } } @@ -140,7 +141,7 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { override fun searchMangaSelector(): String = "div.card div.p-2" override fun searchMangaParse(response: Response): MangasPage { - if (response.request.url.pathSegments.first() == "live-search") { + if (response.request.url.pathSegments.first() == "ls") { val jsonResult = json.parseToJsonElement(response.body.string()).jsonArray val mangaList = jsonResult.map { jsonEl -> searchMangaFromJson(jsonEl.jsonObject) } @@ -178,10 +179,9 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { override fun mangaDetailsParse(document: Document): SManga { val infoElement = document.selectFirst("#main .card-body")!! - val manga = SManga.create() - val path = document.location().replaceFirst("$baseUrl/", "") - manga.thumbnail_url = "$baseUrl/imgs/${path.replace(Regex("/$"),".jpg").replace("manga","mangas")}".lowercase(Locale.ROOT) + + manga.thumbnail_url = infoElement.selectFirst("img")?.attr("abs:src") val infoRows = infoElement.select(".row, .d-flex") infoRows.select("p").forEach { el -> @@ -194,7 +194,7 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { } } } - manga.description = infoElement.select("div:contains(Synopsis) + p").text().orEmpty() + manga.description = infoElement.selectFirst("#synopsis")?.ownText().orEmpty() return manga } @@ -205,7 +205,7 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { else -> SManga.UNKNOWN } - override fun chapterListSelector() = "#chapters_list > div.collapse > div.chapters_list" + + override fun chapterListSelector() = "#list_chapters > div.collapse > div.list_chapters" + if (chapterListPref() == "hide") { ":not(:has(.badge:contains(SPOILER),.badge:contains(RAW),.badge:contains(VUS)))" } else { "" } // JapScan sometimes uploads some "spoiler preview" chapters, containing 2 or 3 untranslated pictures taken from a raw. Sometimes they also upload full RAWs/US versions and replace them with a translation as soon as available. // Those have a span.badge "SPOILER" or "RAW". The additional pseudo selector makes sure to exclude these from the chapter list. @@ -231,12 +231,22 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { document.body().prepend( """ """.trimIndent(), ) @@ -281,11 +291,11 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { throw Exception("Timed out decrypting image links") } - val baseUrlHost = baseUrl.toHttpUrl().host + val baseUrlHost = baseUrl.toHttpUrl().host.substringAfter("www.") return jsInterface .images - .filterNot { it.toHttpUrl().host == baseUrlHost } // Pages not served through their CDN are probably ads + .filter { it.toHttpUrl().host.endsWith(baseUrlHost) } // Pages not served through their CDN are probably ads .mapIndexed { i, url -> Page(i, imageUrl = url) } @@ -323,8 +333,6 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { } internal class JsInterface(private val latch: CountDownLatch) { - private val json: Json by injectLazy() - var images: List = listOf() private set @@ -332,9 +340,8 @@ class Japscan : ConfigurableSource, ParsedHttpSource() { @Suppress("UNUSED") fun passPayload(rawData: String) { try { - val data = json.parseToJsonElement(rawData).jsonObject - - images = data["imagesLink"]!!.jsonArray.map { it.jsonPrimitive.content } + images = rawData.parseAs>() + .map { "$it?y=1" } latch.countDown() } catch (_: Exception) { return