From 040be87a541dc3a31d5a8f4dc9f2290c63c85ccd Mon Sep 17 00:00:00 2001 From: dragonx943 Date: Sat, 28 Dec 2024 02:27:22 +0000 Subject: [PATCH 1/2] [NetTruyen] Fix attempt 1 --- .../parsers/site/wpcomics/vi/NetTruyen.kt | 69 ++++++++++++++++++- 1 file changed, 66 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 a6295dd6..87eaa940 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 @@ -1,15 +1,78 @@ package org.koitharu.kotatsu.parsers.site.wpcomics.vi +import androidx.collection.ArrayMap +import androidx.collection.ArraySet +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +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.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser +import org.koitharu.kotatsu.parsers.model.* +import org.koitharu.kotatsu.parsers.util.* +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.* @MangaSourceParser("NETTRUYEN", "NetTruyen", "vi") internal class NetTruyen(context: MangaLoaderContext) : WpComicsParser(context, MangaParserSource.NETTRUYEN, "nettruyenww.com", 44) { - override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain( - "nettruyenww.com", "nettruyenx.com", - ) + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("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 { getChaps(doc) } + val tagMap = getOrCreateTagMap() + 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().orEmpty(), + altTitle = doc.selectFirst("h2.other-name")?.text().orEmpty(), + author = doc.body().select(selectAut).text(), + state = doc.selectFirst(selectState)?.let { + when (it.text()) { + in ongoing -> MangaState.ONGOING + in finished -> MangaState.FINISHED + else -> null + } + }, + tags = mangaTags, + rating = doc.selectFirst("div.star input")?.attr("value")?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, + chapters = chaptersDeferred.await(), + ) + } + + private suspend fun getChaps(doc: Document): List { + return doc.body().select(selectChapter).mapChapters(reversed = false) { i, li -> + val a = li.selectFirstOrThrow("a") + val href = a.attrAsRelativeUrl("href") + val dateText = li.selectFirst(selectDate)?.text() + val findHours = dateText?.contains(":") + val dateFormat = if (findHours == true) { + SimpleDateFormat("HH:mm dd/MM", sourceLocale) + } else { + SimpleDateFormat(datePattern, sourceLocale) + } + MangaChapter( + id = generateUid(href), + name = a.text(), + number = i + 1f, + volume = 0, + url = href, + uploadDate = parseChapterDate( + dateFormat, + dateText, + ), + source = source, + scanlator = null, + branch = null, + ) + } + } } From 58593de53db4e1955c06e58acc5b499e7d6df044 Mon Sep 17 00:00:00 2001 From: dragonx943 Date: Sat, 28 Dec 2024 03:44:29 +0000 Subject: [PATCH 2/2] [NetTruyen] Fix attempt 2 --- .../site/otakusanctuary/en/OtakusanEn.kt | 2 +- .../site/otakusanctuary/vi/OtakusanVi.kt | 2 +- .../parsers/site/wpcomics/vi/NetTruyen.kt | 33 ++----------------- 3 files changed, 5 insertions(+), 32 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/en/OtakusanEn.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/en/OtakusanEn.kt index 873598cf..b7279250 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/en/OtakusanEn.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/en/OtakusanEn.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.otakusanctuary.OtakuSanctuaryParser -@MangaSourceParser("OTAKUSAN_EN", "Otaku Sanctuary (en)", "en") +@MangaSourceParser("OTAKUSAN_EN", "Otaku Sanctuary (EN)", "en") internal class OtakusanEn(context: MangaLoaderContext) : OtakuSanctuaryParser(context, MangaParserSource.OTAKUSAN_EN, "otakusan.me") { override val lang = "us" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/vi/OtakusanVi.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/vi/OtakusanVi.kt index ae0b2b63..ab019870 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/vi/OtakusanVi.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/vi/OtakusanVi.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.otakusanctuary.OtakuSanctuaryParser -@MangaSourceParser("OTAKUSAN_VI", "Otaku Sanctuary (vn)", "vi") +@MangaSourceParser("OTAKUSAN_VI", "Otaku Sanctuary (VN)", "vi") internal class OtakusanVi(context: MangaLoaderContext) : OtakuSanctuaryParser(context, MangaParserSource.OTAKUSAN_VI, "otakusan.me") { override val selectState = ".table-info tr:contains(Status) td" 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 87eaa940..2877f852 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 @@ -22,12 +22,13 @@ import java.util.* @MangaSourceParser("NETTRUYEN", "NetTruyen", "vi") internal class NetTruyen(context: MangaLoaderContext) : WpComicsParser(context, MangaParserSource.NETTRUYEN, "nettruyenww.com", 44) { + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("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 { getChaps(doc) } + val chaptersDeferred = async { getChapters(doc) } val tagMap = getOrCreateTagMap() val tagsElement = doc.select("li.kind p.col-xs-8 a") val mangaTags = tagsElement.mapNotNullToSet { tagMap[it.text()] } @@ -44,35 +45,7 @@ internal class NetTruyen(context: MangaLoaderContext) : }, tags = mangaTags, rating = doc.selectFirst("div.star input")?.attr("value")?.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN, - chapters = chaptersDeferred.await(), + chapters = chaptersDeferred.await().reversed(), ) } - - private suspend fun getChaps(doc: Document): List { - return doc.body().select(selectChapter).mapChapters(reversed = false) { i, li -> - val a = li.selectFirstOrThrow("a") - val href = a.attrAsRelativeUrl("href") - val dateText = li.selectFirst(selectDate)?.text() - val findHours = dateText?.contains(":") - val dateFormat = if (findHours == true) { - SimpleDateFormat("HH:mm dd/MM", sourceLocale) - } else { - SimpleDateFormat(datePattern, sourceLocale) - } - MangaChapter( - id = generateUid(href), - name = a.text(), - number = i + 1f, - volume = 0, - url = href, - uploadDate = parseChapterDate( - dateFormat, - dateText, - ), - source = source, - scanlator = null, - branch = null, - ) - } - } }