From da02a82d74b88ca842caac49f9e8ef084db93089 Mon Sep 17 00:00:00 2001 From: dragonx943 Date: Sat, 15 Mar 2025 14:24:01 +0700 Subject: [PATCH 1/2] [DocTruyen5s] Fixes --- .../parsers/site/liliana/vi/DocTruyen5s.kt | 60 +++++++++++++++---- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt index 1cb5f391..2f093653 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt @@ -1,20 +1,25 @@ package org.koitharu.kotatsu.parsers.site.liliana.vi import org.jsoup.Jsoup +import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.liliana.LilianaParser -import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.getBooleanOrDefault -import org.koitharu.kotatsu.parsers.Broken +import org.koitharu.kotatsu.parsers.util.* -@Broken // cant fetch pages @MangaSourceParser("DOCTRUYEN5S", "DocTruyen5s", "vi") internal class DocTruyen5s(context: MangaLoaderContext) : - LilianaParser(context, MangaParserSource.DOCTRUYEN5S, "manga.io.vn", 42) { + LilianaParser(context, MangaParserSource.DOCTRUYEN5S, "dongmoe.com", 42) { + + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("dongmoe.com", "manga.io.vn") + + override fun getRequestHeaders() = super.getRequestHeaders().newBuilder() + .add("referer", "no-referrer") + .build() override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) @@ -35,14 +40,45 @@ internal class DocTruyen5s(context: MangaLoaderContext) : val pageListDoc = Jsoup.parse(responseJson.getString("html")) - return pageListDoc.selectOrThrow("div.separator a").map { element -> - val url = element.attr("href") - MangaPage( - id = generateUid(url), - url = url, - preview = null, - source = source, - ) + return pageListDoc.selectOrThrow("div.separator a, div.separator img").mapNotNull { element -> + val originalUrl = element.attr("href").takeIf { it.isNotEmpty() } ?: element.attr("src") + if (originalUrl.isEmpty()) return@mapNotNull null + + val workingUrl = addCdnServers(originalUrl).firstOrNull { url -> + checkMangaImgs(url) + } + + workingUrl?.let { url -> + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } + } + } + + private fun addCdnServers(url: String): List { + if (!url.startsWith("http")) return emptyList() + + val urlFinal = url.replace("https://", "") + return listOf( + url, + "https://proxy.luce.workers.dev/$url", + "https://images2-focus-opensocial.googleusercontent.com/gadgets/proxy?url=$url&container=focus&gadget=a&no_expand=1&resize_h=0&rewriteMime=image/*", + "https://i0.wp.com/$urlFinal", + "https://cdn.statically.io/img/$urlFinal" + ) + } + + private suspend fun checkMangaImgs(url: String): Boolean { + return try { + val response = webClient.httpHead(url) + val contentType = response.header("Content-Type") ?: "" + contentType.startsWith("image/") + } catch (e: Exception) { + false } } } From f4b975c865cb39ca11fae52f70e7e73ed3fa3f7d Mon Sep 17 00:00:00 2001 From: dragonx943 Date: Sat, 15 Mar 2025 14:38:34 +0700 Subject: [PATCH 2/2] [DocTruyen5s] Fixes --- .../org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt index 2f093653..a5843bfa 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/liliana/vi/DocTruyen5s.kt @@ -40,7 +40,7 @@ internal class DocTruyen5s(context: MangaLoaderContext) : val pageListDoc = Jsoup.parse(responseJson.getString("html")) - return pageListDoc.selectOrThrow("div.separator a, div.separator img").mapNotNull { element -> + return pageListDoc.selectOrThrow("div.separator a").mapNotNull { element -> val originalUrl = element.attr("href").takeIf { it.isNotEmpty() } ?: element.attr("src") if (originalUrl.isEmpty()) return@mapNotNull null