From 95c43a06d5f4efeffdb5cbd55c7cebb2e765c13c Mon Sep 17 00:00:00 2001 From: Draken Date: Fri, 7 Feb 2025 04:23:38 +0000 Subject: [PATCH 1/4] [wpcomics/vi/nettruyen*] Fixes --- .../parsers/site/wpcomics/vi/NetTruyen.kt | 2 +- .../parsers/site/wpcomics/vi/NetTruyenFE.kt | 18 ++++++++++++++++++ .../parsers/site/wpcomics/vi/NetTruyenLL.kt | 18 ++++++++++++++++++ .../parsers/site/wpcomics/vi/NetTruyenSSR.kt | 18 ++++++++++++++++++ .../parsers/site/wpcomics/vi/NetTruyenUU.kt | 18 ++++++++++++++++++ .../parsers/site/wpcomics/vi/NetTruyenVie.kt | 4 ++-- 6 files changed, 75 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyen.kt index 173e845b5..2ace154ae 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyen.kt @@ -39,7 +39,7 @@ internal class NetTruyen(context: MangaLoaderContext) : }, tags = mangaTags, rating = doc.selectFirst("div.star input")?.attr("value")?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, - chapters = chaptersDeferred.await().reversed(), + chapters = chaptersDeferred.await(), ) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt index 782cc4f6a..b75b7c1d3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt @@ -130,4 +130,22 @@ internal class NetTruyenFE(context: MangaLoaderContext) : tagCache = result result } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + return doc.select(selectPage).map { url -> + var img = url.requireSrc().toRelativeUrl(domain) + var imgFinal = img.replace("ntcdn242.wibu.asia/qq", "ntcdn160.wibu.asia/bt") + .replace("i2.netcdn.one", "i2.wp.com/i2.netcdn.one") + .replace("i2.netcdn.one", "manga-covers.vercel.app/api/proxy?url=https://i2.netcdn.one") + .replace("i2.netcdn.one", "https://wsrv.nl/?url=https://i2.netcdn.one") + MangaPage( + id = generateUid(imgFinal), + url = imgFinal, + preview = null, + source = source, + ) + } + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt index fb1e8a0e7..ad7d4f4a1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt @@ -130,4 +130,22 @@ internal class NetTruyenLL(context: MangaLoaderContext) : tagCache = result result } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + return doc.select(selectPage).map { url -> + var img = url.requireSrc().toRelativeUrl(domain) + var imgFinal = img.replace("ntcdn242.wibu.asia/qq", "ntcdn160.wibu.asia/bt") + .replace("i2.netcdn.one", "i2.wp.com/i2.netcdn.one") + .replace("i2.netcdn.one", "manga-covers.vercel.app/api/proxy?url=https://i2.netcdn.one") + .replace("i2.netcdn.one", "https://wsrv.nl/?url=https://i2.netcdn.one") + MangaPage( + id = generateUid(imgFinal), + url = imgFinal, + preview = null, + source = source, + ) + } + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt index 8ceaaaabf..d2f4024d9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt @@ -130,4 +130,22 @@ internal class NetTruyenSSR(context: MangaLoaderContext) : tagCache = result result } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + return doc.select(selectPage).map { url -> + var img = url.requireSrc().toRelativeUrl(domain) + var imgFinal = img.replace("ntcdn242.wibu.asia/qq", "ntcdn160.wibu.asia/bt") + .replace("i2.netcdn.one", "i2.wp.com/i2.netcdn.one") + .replace("i2.netcdn.one", "manga-covers.vercel.app/api/proxy?url=https://i2.netcdn.one") + .replace("i2.netcdn.one", "https://wsrv.nl/?url=https://i2.netcdn.one") + MangaPage( + id = generateUid(imgFinal), + url = imgFinal, + preview = null, + source = source, + ) + } + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt index 61d891011..a2d2cb759 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt @@ -130,4 +130,22 @@ internal class NetTruyenUU(context: MangaLoaderContext) : tagCache = result result } + + override suspend fun getPages(chapter: MangaChapter): List { + val fullUrl = chapter.url.toAbsoluteUrl(domain) + val doc = webClient.httpGet(fullUrl).parseHtml() + return doc.select(selectPage).map { url -> + var img = url.requireSrc().toRelativeUrl(domain) + var imgFinal = img.replace("ntcdn242.wibu.asia/qq", "ntcdn160.wibu.asia/bt") + .replace("i2.netcdn.one", "i2.wp.com/i2.netcdn.one") + .replace("i2.netcdn.one", "manga-covers.vercel.app/api/proxy?url=https://i2.netcdn.one") + .replace("i2.netcdn.one", "https://wsrv.nl/?url=https://i2.netcdn.one") + MangaPage( + id = generateUid(imgFinal), + url = imgFinal, + preview = null, + source = source, + ) + } + } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenVie.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenVie.kt index 3112adda8..8f7df42d7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenVie.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenVie.kt @@ -23,7 +23,7 @@ internal class NetTruyenVie(context: MangaLoaderContext) : val tagsElement = doc.select("li.kind p.col-xs-8 a") val mangaTags = tagsElement.mapNotNullToSet { tagMap[it.text()] } manga.copy( - description = doc.selectFirst(selectDesc)?.html(), + description = doc.selectFirst("div.detail-content > div")?.html(), altTitle = doc.selectFirst("h2.other-name")?.textOrNull(), author = doc.body().select(selectAut).textOrNull(), state = doc.selectFirst(selectState)?.let { @@ -35,7 +35,7 @@ internal class NetTruyenVie(context: MangaLoaderContext) : }, tags = mangaTags, rating = doc.selectFirst("div.star input")?.attr("value")?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, - chapters = chaptersDeferred.await().reversed(), + chapters = chaptersDeferred.await(), ) } } From 9addea65d69f2a817a752451f7be1549075e28ec Mon Sep 17 00:00:00 2001 From: Draken Date: Fri, 7 Feb 2025 04:51:41 +0000 Subject: [PATCH 2/4] [wpcomics/vi/nettruyen*] Fixes --- .../kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt index b75b7c1d3..0981bed6a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt @@ -135,11 +135,7 @@ internal class NetTruyenFE(context: MangaLoaderContext) : val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() return doc.select(selectPage).map { url -> - var img = url.requireSrc().toRelativeUrl(domain) - var imgFinal = img.replace("ntcdn242.wibu.asia/qq", "ntcdn160.wibu.asia/bt") - .replace("i2.netcdn.one", "i2.wp.com/i2.netcdn.one") - .replace("i2.netcdn.one", "manga-covers.vercel.app/api/proxy?url=https://i2.netcdn.one") - .replace("i2.netcdn.one", "https://wsrv.nl/?url=https://i2.netcdn.one") + var img = url.attr("data-original").toRelativeUrl(domain) MangaPage( id = generateUid(imgFinal), url = imgFinal, From 319225d645d8d6c287724fcd8661b82ab8b1a106 Mon Sep 17 00:00:00 2001 From: Draken Date: Fri, 7 Feb 2025 04:53:33 +0000 Subject: [PATCH 3/4] [wpcomics/vi/nettruyen*] Fixes --- .../kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt | 4 ++-- .../kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt | 10 +++------- .../kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt | 10 +++------- .../kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt | 10 +++------- 4 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt index 0981bed6a..42abd4ce9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt @@ -137,8 +137,8 @@ internal class NetTruyenFE(context: MangaLoaderContext) : return doc.select(selectPage).map { url -> var img = url.attr("data-original").toRelativeUrl(domain) MangaPage( - id = generateUid(imgFinal), - url = imgFinal, + id = generateUid(img), + url = img, preview = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt index ad7d4f4a1..6cc08b9d0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt @@ -135,14 +135,10 @@ internal class NetTruyenLL(context: MangaLoaderContext) : val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() return doc.select(selectPage).map { url -> - var img = url.requireSrc().toRelativeUrl(domain) - var imgFinal = img.replace("ntcdn242.wibu.asia/qq", "ntcdn160.wibu.asia/bt") - .replace("i2.netcdn.one", "i2.wp.com/i2.netcdn.one") - .replace("i2.netcdn.one", "manga-covers.vercel.app/api/proxy?url=https://i2.netcdn.one") - .replace("i2.netcdn.one", "https://wsrv.nl/?url=https://i2.netcdn.one") + var img = url.attr("data-original").toRelativeUrl(domain) MangaPage( - id = generateUid(imgFinal), - url = imgFinal, + id = generateUid(img), + url = img, preview = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt index d2f4024d9..6b9d0db2a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt @@ -135,14 +135,10 @@ internal class NetTruyenSSR(context: MangaLoaderContext) : val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() return doc.select(selectPage).map { url -> - var img = url.requireSrc().toRelativeUrl(domain) - var imgFinal = img.replace("ntcdn242.wibu.asia/qq", "ntcdn160.wibu.asia/bt") - .replace("i2.netcdn.one", "i2.wp.com/i2.netcdn.one") - .replace("i2.netcdn.one", "manga-covers.vercel.app/api/proxy?url=https://i2.netcdn.one") - .replace("i2.netcdn.one", "https://wsrv.nl/?url=https://i2.netcdn.one") + var img = url.attr("data-original").toRelativeUrl(domain) MangaPage( - id = generateUid(imgFinal), - url = imgFinal, + id = generateUid(img), + url = img, preview = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt index a2d2cb759..318112f58 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt @@ -135,14 +135,10 @@ internal class NetTruyenUU(context: MangaLoaderContext) : val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() return doc.select(selectPage).map { url -> - var img = url.requireSrc().toRelativeUrl(domain) - var imgFinal = img.replace("ntcdn242.wibu.asia/qq", "ntcdn160.wibu.asia/bt") - .replace("i2.netcdn.one", "i2.wp.com/i2.netcdn.one") - .replace("i2.netcdn.one", "manga-covers.vercel.app/api/proxy?url=https://i2.netcdn.one") - .replace("i2.netcdn.one", "https://wsrv.nl/?url=https://i2.netcdn.one") + var img = url.attr("data-original").toRelativeUrl(domain) MangaPage( - id = generateUid(imgFinal), - url = imgFinal, + id = generateUid(img), + url = img, preview = null, source = source, ) From 576de54ef82d9d04c75372d2e64b754be1e842f6 Mon Sep 17 00:00:00 2001 From: Draken Date: Fri, 7 Feb 2025 12:15:09 +0000 Subject: [PATCH 4/4] [wpcomics/vi/nettruyen*] Fix fetch invaild format --- .../parsers/site/wpcomics/vi/NetTruyenFE.kt | 34 ++++++++++++++----- .../parsers/site/wpcomics/vi/NetTruyenLL.kt | 34 ++++++++++++++----- .../parsers/site/wpcomics/vi/NetTruyenSSR.kt | 34 ++++++++++++++----- .../parsers/site/wpcomics/vi/NetTruyenUU.kt | 34 ++++++++++++++----- 4 files changed, 100 insertions(+), 36 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt index 42abd4ce9..b02fb89bc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenFE.kt @@ -1,5 +1,9 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope +import org.jsoup.nodes.Element import androidx.collection.ArrayMap import kotlinx.coroutines.sync.withLock import org.koitharu.kotatsu.parsers.MangaLoaderContext @@ -134,14 +138,26 @@ internal class NetTruyenFE(context: MangaLoaderContext) : override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() - return doc.select(selectPage).map { url -> - var img = url.attr("data-original").toRelativeUrl(domain) - MangaPage( - id = generateUid(img), - url = img, - preview = null, - source = source, - ) + return coroutineScope { + doc.select(selectPage).map { img -> + async { fetchPage(img) } + }.awaitAll().filterNotNull() } } -} + + private suspend fun fetchPage(img: Element): MangaPage? = runCatchingCancellable { + val url = img.attrAsRelativeUrlOrNull("data-original") ?: return@runCatchingCancellable null + webClient.httpHead(url).use { response -> + if (response.mimeType?.startsWith("image/") == true) { + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } else { + null + } + } + }.getOrNull() +} \ No newline at end of file diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt index 6cc08b9d0..f38f32423 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenLL.kt @@ -1,5 +1,9 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope +import org.jsoup.nodes.Element import androidx.collection.ArrayMap import kotlinx.coroutines.sync.withLock import org.koitharu.kotatsu.parsers.MangaLoaderContext @@ -134,14 +138,26 @@ internal class NetTruyenLL(context: MangaLoaderContext) : override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() - return doc.select(selectPage).map { url -> - var img = url.attr("data-original").toRelativeUrl(domain) - MangaPage( - id = generateUid(img), - url = img, - preview = null, - source = source, - ) + return coroutineScope { + doc.select(selectPage).map { img -> + async { fetchPage(img) } + }.awaitAll().filterNotNull() } } -} + + private suspend fun fetchPage(img: Element): MangaPage? = runCatchingCancellable { + val url = img.attrAsRelativeUrlOrNull("data-original") ?: return@runCatchingCancellable null + webClient.httpHead(url).use { response -> + if (response.mimeType?.startsWith("image/") == true) { + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } else { + null + } + } + }.getOrNull() +} \ No newline at end of file diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt index 6b9d0db2a..bd9588f5d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenSSR.kt @@ -1,5 +1,9 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope +import org.jsoup.nodes.Element import androidx.collection.ArrayMap import kotlinx.coroutines.sync.withLock import org.koitharu.kotatsu.parsers.MangaLoaderContext @@ -134,14 +138,26 @@ internal class NetTruyenSSR(context: MangaLoaderContext) : override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() - return doc.select(selectPage).map { url -> - var img = url.attr("data-original").toRelativeUrl(domain) - MangaPage( - id = generateUid(img), - url = img, - preview = null, - source = source, - ) + return coroutineScope { + doc.select(selectPage).map { img -> + async { fetchPage(img) } + }.awaitAll().filterNotNull() } } -} + + private suspend fun fetchPage(img: Element): MangaPage? = runCatchingCancellable { + val url = img.attrAsRelativeUrlOrNull("data-original") ?: return@runCatchingCancellable null + webClient.httpHead(url).use { response -> + if (response.mimeType?.startsWith("image/") == true) { + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } else { + null + } + } + }.getOrNull() +} \ No newline at end of file diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt index 318112f58..8e1cc40f3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/NetTruyenUU.kt @@ -1,5 +1,9 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope +import org.jsoup.nodes.Element import androidx.collection.ArrayMap import kotlinx.coroutines.sync.withLock import org.koitharu.kotatsu.parsers.MangaLoaderContext @@ -134,14 +138,26 @@ internal class NetTruyenUU(context: MangaLoaderContext) : override suspend fun getPages(chapter: MangaChapter): List { val fullUrl = chapter.url.toAbsoluteUrl(domain) val doc = webClient.httpGet(fullUrl).parseHtml() - return doc.select(selectPage).map { url -> - var img = url.attr("data-original").toRelativeUrl(domain) - MangaPage( - id = generateUid(img), - url = img, - preview = null, - source = source, - ) + return coroutineScope { + doc.select(selectPage).map { img -> + async { fetchPage(img) } + }.awaitAll().filterNotNull() } } -} + + private suspend fun fetchPage(img: Element): MangaPage? = runCatchingCancellable { + val url = img.attrAsRelativeUrlOrNull("data-original") ?: return@runCatchingCancellable null + webClient.httpHead(url).use { response -> + if (response.mimeType?.startsWith("image/") == true) { + MangaPage( + id = generateUid(url), + url = url, + preview = null, + source = source, + ) + } else { + null + } + } + }.getOrNull() +} \ No newline at end of file