From 69093b8214e809af31a51253dce1e2cc8aeeb56b Mon Sep 17 00:00:00 2001 From: ViAnh Date: Sun, 9 Feb 2025 20:18:09 +0700 Subject: [PATCH 1/2] [NetTruyen] Fix fetch chapters --- .../parsers/site/wpcomics/vi/NetTruyen.kt | 35 +++++++++++++++++-- 1 file changed, 32 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 136bccc9..7c6dc372 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 @@ -6,24 +6,27 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaState import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* +import java.text.SimpleDateFormat @MangaSourceParser("NETTRUYEN", "NetTruyen", "vi") internal class NetTruyen(context: MangaLoaderContext) : - WpComicsParser(context, MangaParserSource.NETTRUYEN, "nettruyenrr.com", 44) { + WpComicsParser(context, MangaParserSource.NETTRUYEN, "nettruyenrr.com", 36) { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("nettruyenrr.com", "nettruyenww.com", "nettruyenx.com") override suspend fun getDetails(manga: Manga): Manga = coroutineScope { val fullUrl = manga.url.toAbsoluteUrl(domain) - val doc = webClient.httpGet(fullUrl).parseHtml() - val chaptersDeferred = async { getChapters(doc, reversed = false) } + val docDeferred = async { webClient.httpGet(fullUrl).parseHtml() } + val chaptersDeferred = async { fetchChapters(manga.url) } val tagMap = getOrCreateTagMap() + val doc = docDeferred.await() val tagsElement = doc.select("li.kind p.col-xs-8 a") val mangaTags = tagsElement.mapNotNullToSet { tagMap[it.text()] } manga.copy( @@ -42,4 +45,30 @@ internal class NetTruyen(context: MangaLoaderContext) : chapters = chaptersDeferred.await(), ) } + + private suspend fun fetchChapters(mangaUrl: String): List { + val slug = mangaUrl.substringAfterLast('/').substringBeforeLast('-') + val id = mangaUrl.substringAfterLast('-') + val chaptersUrl = "/Comic/Services/ComicService.asmx/ChapterList?slug=$slug&comicId=$id".toAbsoluteUrl(domain) + val df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + + val data = webClient.httpGet(chaptersUrl).parseJson().getJSONArray("data") + return List(data.length()) { i -> + val jo = data.getJSONObject(data.length() - 1 - i) + val chapterSlug = jo.getString("chapter_slug") + val chapterUrl = "/truyen-tranh/$slug/$chapterSlug" + + MangaChapter( + id = generateUid(chapterUrl), + name = jo.getString("chapter_name"), + number = i + 1f, + volume = 0, + url = chapterUrl, + scanlator = null, + uploadDate = df.tryParse(jo.getString("updated_at")), + branch = null, + source = source, + ) + } + } } From 234e23b7a56be947f92390d9470b42bf206e0a07 Mon Sep 17 00:00:00 2001 From: ViAnh Date: Sun, 9 Feb 2025 20:47:33 +0700 Subject: [PATCH 2/2] [NetTruyenVie] Fix fetch chapters --- .../parsers/site/wpcomics/vi/NetTruyenVie.kt | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) 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 8f7df42d..baa2fa97 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 @@ -5,11 +5,13 @@ import kotlinx.coroutines.coroutineScope import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaState import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser import org.koitharu.kotatsu.parsers.util.* +import java.text.SimpleDateFormat @MangaSourceParser("NETTRUYENVIE", "NetTruyenVie", "vi") internal class NetTruyenVie(context: MangaLoaderContext) : @@ -17,9 +19,10 @@ internal class NetTruyenVie(context: MangaLoaderContext) : override suspend fun getDetails(manga: Manga): Manga = coroutineScope { val fullUrl = manga.url.toAbsoluteUrl(domain) - val doc = webClient.httpGet(fullUrl).parseHtml() - val chaptersDeferred = async { getChapters(doc) } + val docDeferred = async { webClient.httpGet(fullUrl).parseHtml() } + val chaptersDeferred = async { fetchChapters(manga.url) } val tagMap = getOrCreateTagMap() + val doc = docDeferred.await() val tagsElement = doc.select("li.kind p.col-xs-8 a") val mangaTags = tagsElement.mapNotNullToSet { tagMap[it.text()] } manga.copy( @@ -38,4 +41,29 @@ internal class NetTruyenVie(context: MangaLoaderContext) : chapters = chaptersDeferred.await(), ) } + + private suspend fun fetchChapters(mangaUrl: String): List { + val slug = mangaUrl.substringAfterLast('/') + val chaptersUrl = "/Comic/Services/ComicService.asmx/ChapterList?slug=$slug".toAbsoluteUrl(domain) + val df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + + val data = webClient.httpGet(chaptersUrl).parseJson().getJSONArray("data") + return List(data.length()) { i -> + val jo = data.getJSONObject(data.length() - 1 - i) + val chapterSlug = jo.getString("chapter_slug") + val chapterUrl = "/truyen-tranh/$slug/$chapterSlug" + + MangaChapter( + id = generateUid(chapterUrl), + name = jo.getString("chapter_name"), + number = i + 1f, + volume = 0, + url = chapterUrl, + scanlator = null, + uploadDate = df.tryParse(jo.getString("updated_at")), + branch = null, + source = source, + ) + } + } }