From 352d998680353921be82f513ee2b89117cb62045 Mon Sep 17 00:00:00 2001 From: dragonx943 Date: Mon, 21 Jul 2025 23:12:24 +0700 Subject: [PATCH] [TruyenHentai18] Fix attempt 1 --- .../parsers/site/all/MyReadingManga.kt | 2 - .../kotatsu/parsers/site/vi/TruyenHentai18.kt | 75 ++++++++----------- 2 files changed, 32 insertions(+), 45 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MyReadingManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MyReadingManga.kt index f7913b94..269da32c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MyReadingManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MyReadingManga.kt @@ -1,13 +1,11 @@ package org.koitharu.kotatsu.parsers.site.all -import androidx.collection.ArraySet import org.jsoup.nodes.Document import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.core.PagedMangaParser -import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentai18.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentai18.kt index 7987bb3a..e2b9509a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentai18.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyenHentai18.kt @@ -18,12 +18,12 @@ import org.koitharu.kotatsu.parsers.Broken @Broken @MangaSourceParser("TRUYENHENTAI18", "TruyenHentai18", "vi", ContentType.HENTAI) internal class TruyenHentai18(context: MangaLoaderContext): - PagedMangaParser(context, MangaParserSource.TRUYENHENTAI18, 18) { + PagedMangaParser(context, MangaParserSource.TRUYENHENTAI18, 18) { override val configKeyDomain = ConfigKey.Domain("truyenhentai18.app") - private val apiSuffix = "api.th18.app" - private val cdnSuffix = "vi-api.th18.app" + private val apiSuffix = "api.th18.app" + private val cdnSuffix = "vi-api.th18.app" override fun onCreateConfig(keys: MutableCollection>) { super.onCreateConfig(keys) @@ -32,8 +32,8 @@ internal class TruyenHentai18(context: MangaLoaderContext): override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, - SortOrder.NEWEST, - SortOrder.NEWEST_ASC, + SortOrder.NEWEST, + SortOrder.NEWEST_ASC, ) override val filterCapabilities: MangaListFilterCapabilities @@ -83,11 +83,10 @@ internal class TruyenHentai18(context: MangaLoaderContext): } } - val fullUrl = "https://" + url return when { - filter.tags.isNotEmpty() -> parseNextList(webClient.httpGet(fullUrl).parseHtml()) + filter.tags.isNotEmpty() -> parseNextList(webClient.httpGet("https://$url").parseHtml()) else -> { - val doc = webClient.httpGet(fullUrl).parseJson() + val doc = webClient.httpGet("https://$url").parseJson() parseJSONList(doc) } } @@ -231,41 +230,31 @@ internal class TruyenHentai18(context: MangaLoaderContext): ) } - override suspend fun getPages(chapter: MangaChapter): List { - val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() - val scriptContent = doc.select("script") - .firstOrNull { it.data().startsWith("self.__next_f.push([1,\"\\u003cp\\u003e\\u003c") } - ?.data() - - if (scriptContent != null) { - val regex = Regex("""self\.__next_f\.push\(\[1,\"(.*)\"\]\)""") - val htmlEncoded = regex.find(scriptContent)?.groupValues?.getOrNull(1) - if (!htmlEncoded.isNullOrEmpty()) { - val html = try { - JSONArray("[\"$htmlEncoded\"]").getString(0) - } catch (e: Exception) { - htmlEncoded - .replace("\\u003c", "<") - .replace("\\u003e", ">") - .replace("\\\"", "\"") - .replace("\\/", "/") - } - - val imageUrls = Jsoup.parse(html).select("img").mapNotNull { it.attr("src") } - if (imageUrls.isNotEmpty()) { - return imageUrls.map { url -> - MangaPage( - id = generateUid(url), - url = url, - preview = null, - source = source, - ) - } - } else return emptyList() - } - } - return emptyList() - } + override suspend fun getPages(chapter: MangaChapter): List { + val doc = webClient.httpGet(chapter.url.toAbsoluteUrl(domain)).parseHtml() + val scriptContent = doc.select("script") + .firstOrNull { it.data().contains("img src") } + ?.data() + ?: return emptyList() + + val decoded = scriptContent + .replace("\\u003c", "<") + .replace("\\u003e", ">") + .replace("\\\"", "\"") + .replace("\\/", "/") + + val regex = Regex("""img\s+src=["'](https?://[^"']+)["']""") + val imageUrls = regex.findAll(decoded).map { it.groupValues[1] }.toList() + + return imageUrls.map { url -> + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + } private fun parseChapterDate(date: String?): Long { if (date == null) return 0