From 839869061e7c89f19361503855535278d833588b Mon Sep 17 00:00:00 2001 From: dragonx943 Date: Fri, 27 Dec 2024 11:14:33 +0000 Subject: [PATCH 1/4] Rename some sources --- .../org/koitharu/kotatsu/parsers/site/madara/vi/Fecomicc.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt | 2 +- .../koitharu/kotatsu/parsers/site/madara/vi/HentaiVnPlus.kt | 4 ++-- .../koitharu/kotatsu/parsers/site/madara/vi/Quaanhdaocuteo.kt | 2 +- .../koitharu/kotatsu/parsers/site/madara/vi/RuaHapChanhDay.kt | 2 +- .../kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/madara/vi/TruyenVn.kt | 2 +- .../kotatsu/parsers/site/otakusanctuary/en/OtakusanEn.kt | 2 +- .../kotatsu/parsers/site/otakusanctuary/vi/OtakusanVi.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt | 2 +- .../org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt | 2 +- .../kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt | 4 ++-- .../kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Fecomicc.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Fecomicc.kt index aedcdbce8..6d71c4ba6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Fecomicc.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Fecomicc.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("FECOMICC", "Fecomicc", "vi") +@MangaSourceParser("FECOMICC", "Fecomic", "vi") internal class Fecomicc(context: MangaLoaderContext) : MadaraParser(context, MangaParserSource.FECOMICC, "fftruyen.net", 9) { override val listUrl = "comic/" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt index 1922b636f..8a49e2cdc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiCube.kt @@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.util.* -@MangaSourceParser("HENTAICUBE", "HentaiCube", "vi", ContentType.HENTAI) +@MangaSourceParser("HENTAICUBE", "CBHentai", "vi", ContentType.HENTAI) internal class HentaiCube(context: MangaLoaderContext) : MadaraParser(context, MangaParserSource.HENTAICUBE, "hentaicb.pro") { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiVnPlus.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiVnPlus.kt index 9baa6e8d5..cb7a276de 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiVnPlus.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/HentaiVnPlus.kt @@ -6,9 +6,9 @@ import org.koitharu.kotatsu.parsers.model.ContentType import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("HENTAIVNPLUS", "HentaiVnPlus", "vi", ContentType.HENTAI) +@MangaSourceParser("HENTAIVNPLUS", "HentaiVN.plus", "vi", ContentType.HENTAI) internal class HentaiVnPlus(context: MangaLoaderContext) : - MadaraParser(context, MangaParserSource.HENTAIVNPLUS, "hentaivn.now", 24) { + MadaraParser(context, MangaParserSource.HENTAIVNPLUS, "hentaivn.li", 24) { override val listUrl = "truyen-hentai/" override val tagPrefix = "the-loai/" override val datePattern = "dd/MM/yyyy" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Quaanhdaocuteo.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Quaanhdaocuteo.kt index 8a150fe87..078e30423 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Quaanhdaocuteo.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/Quaanhdaocuteo.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.util.* -@MangaSourceParser("QUAANHDAOCUTEO", "Quaanhdaocuteo", "vi", ContentType.HENTAI) +@MangaSourceParser("QUAANHDAOCUTEO", "Quả Anh Đào Cuteo", "vi", ContentType.HENTAI) internal class Quaanhdaocuteo(context: MangaLoaderContext) : MadaraParser(context, MangaParserSource.QUAANHDAOCUTEO, "quaanhdaocuteo.xyz") { override val datePattern = "dd/MM/yyyy" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/RuaHapChanhDay.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/RuaHapChanhDay.kt index 0010f7f36..a55f8ecff 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/RuaHapChanhDay.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/RuaHapChanhDay.kt @@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser -@MangaSourceParser("RUAHAPCHANHDAY", "RuaHapChanhDay", "vi") +@MangaSourceParser("RUAHAPCHANHDAY", "Rùa Hấp Chanh Dây", "vi") internal class RuaHapChanhDay(context: MangaLoaderContext) : MadaraParser(context, MangaParserSource.RUAHAPCHANHDAY, "ruahapchanhday.com", 30) { override val datePattern = "dd/MM/yyyy" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt index 9e487b403..fe6aea30c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenTranhDamMyy.kt @@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.util.* -@MangaSourceParser("TRUYENTRANHDAMMYY", "TruyenTranhDamMyy", "vi") +@MangaSourceParser("TRUYENTRANHDAMMYY", "Truyện Tranh Đam Mỹ", "vi") internal class TruyenTranhDamMyy(context: MangaLoaderContext) : MadaraParser(context, MangaParserSource.TRUYENTRANHDAMMYY, "truyentranhdammyy.site") { override val postReq = true diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenVn.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenVn.kt index 58642e92b..09bba1cc5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenVn.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/vi/TruyenVn.kt @@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser @MangaSourceParser("TRUYENVN", "TruyenVn", "vi", ContentType.HENTAI) internal class TruyenVn(context: MangaLoaderContext) : - MadaraParser(context, MangaParserSource.TRUYENVN, "truyenvn.vin", 20) { + MadaraParser(context, MangaParserSource.TRUYENVN, "truyenvn.live", 20) { override val listUrl = "truyen-tranh/" override val tagPrefix = "the-loai/" override val datePattern = "dd/MM/yyyy" 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 ba73dd7b9..873598cf5 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", "OtakuSan-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 a75763545..ae0b2b63d 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", "OtakuSan-Vi", "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/vi/BlogTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt index 7582fcdc2..1e4e18acf 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt @@ -15,7 +15,7 @@ import java.util.* import org.koitharu.kotatsu.parsers.Broken @Broken -@MangaSourceParser("BLOGTRUYEN", "BlogTruyen", "vi") +@MangaSourceParser("BLOGTRUYEN", "Blog Truyện", "vi") internal class BlogTruyenParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.BLOGTRUYEN, pageSize = 20) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt index 87fb7ce7b..dc98f7d29 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenVN.kt @@ -18,7 +18,7 @@ import java.text.SimpleDateFormat import java.util.* @Broken -@MangaSourceParser("BLOGTRUYENVN", "BlogTruyenVN", "vi") +@MangaSourceParser("BLOGTRUYENVN", "BlogTruyen.vn (Unofficial)", "vi") internal class BlogTruyenVN(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.BLOGTRUYENVN, pageSize = 20) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt index 38add73ca..0b134bfd0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CuuTruyenParser.kt @@ -22,7 +22,7 @@ import java.net.HttpURLConnection import java.text.SimpleDateFormat import java.util.* -@MangaSourceParser("CUUTRUYEN", "CuuTruyen", "vi") +@MangaSourceParser("CUUTRUYEN", "Cứu Truyện", "vi") internal class CuuTruyenParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.CUUTRUYEN, 20), Interceptor { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt index f5894e82d..a1ee63897 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/DuaLeoTruyen.kt @@ -10,7 +10,7 @@ import org.koitharu.kotatsu.parsers.util.* import java.text.SimpleDateFormat import java.util.* -@MangaSourceParser("DUALEOTRUYEN", "DuaLeoTruyen", "vi", type = ContentType.HENTAI) +@MangaSourceParser("DUALEOTRUYEN", "Dưa Leo Truyện", "vi", type = ContentType.HENTAI) internal class DuaLeoTruyen(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.DUALEOTRUYEN, 60) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt index 9308c5c2d..9cca6b09e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt @@ -9,10 +9,10 @@ import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import java.util.* -@MangaSourceParser("LXMANGA", "LxManga", "vi", type = ContentType.HENTAI) +@MangaSourceParser("LXMANGA", "LXManga", "vi", type = ContentType.HENTAI) internal class LxManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.LXMANGA, 60) { - override val configKeyDomain = ConfigKey.Domain("lxmanga.store") + override val configKeyDomain = ConfigKey.Domain("lxmanga.live") override fun onCreateConfig(keys: MutableCollection>) { super.onCreateConfig(keys) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt index a18a985f3..bb718e638 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/SayHentai.kt @@ -11,7 +11,7 @@ import java.util.* @MangaSourceParser("SAYHENTAI", "SayHentai", "vi", ContentType.HENTAI) internal class SayHentai(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.SAYHENTAI, 20) { - override val configKeyDomain = ConfigKey.Domain("sayhentai.one") + override val configKeyDomain = ConfigKey.Domain("sayhentai.art") override fun onCreateConfig(keys: MutableCollection>) { super.onCreateConfig(keys) From 040be87a541dc3a31d5a8f4dc9f2290c63c85ccd Mon Sep 17 00:00:00 2001 From: dragonx943 Date: Sat, 28 Dec 2024 02:27:22 +0000 Subject: [PATCH 2/4] [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 a6295dd69..87eaa9401 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 3/4] [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 873598cf5..b72792503 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 ae0b2b63d..ab019870e 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 87eaa9401..2877f8524 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, - ) - } - } } From 8852020ca8f683f68af7eca4efe195eee1baf195 Mon Sep 17 00:00:00 2001 From: dragonx943 Date: Sat, 28 Dec 2024 08:55:16 +0000 Subject: [PATCH 4/4] [MeHentaiVN] Add source --- .github/summary.yaml | 2 +- .../parsers/site/wpcomics/WpComicsParser.kt | 1 - .../parsers/site/wpcomics/vi/MeHentaiVN.kt | 74 +++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/MeHentaiVN.kt diff --git a/.github/summary.yaml b/.github/summary.yaml index f7706fbc4..da87f7001 100644 --- a/.github/summary.yaml +++ b/.github/summary.yaml @@ -1 +1 @@ -total: 1173 \ No newline at end of file +total: 1174 \ No newline at end of file diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt index f843df588..bfa537488 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt @@ -232,7 +232,6 @@ internal abstract class WpComicsParser( ) } - protected open val selectDate = "div.col-xs-4" protected open val selectChapter = "div.list-chapter li.row:not(.heading)" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/MeHentaiVN.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/MeHentaiVN.kt new file mode 100644 index 000000000..741161791 --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/vi/MeHentaiVN.kt @@ -0,0 +1,74 @@ +package org.koitharu.kotatsu.parsers.site.wpcomics.vi + +import kotlinx.coroutines.async +import androidx.collection.ArraySet +import kotlinx.coroutines.coroutineScope +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.util.* + +@MangaSourceParser("MEHENTAIVN", "MeHentaiVN", "vi", ContentType.HENTAI) +internal class MeHentaiVN(context: MangaLoaderContext) : + WpComicsParser(context, MangaParserSource.MEHENTAIVN, "www.mehentaivn.xyz", 44) { + + override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("www.mehentaivn.xyz", "www.hentaivnx.autos") + + override suspend fun getFilterOptions() = MangaListFilterOptions( + availableTags = fetchTags(), + availableStates = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED), + ) + + 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 tagMap = getOrCreateTagMap() + val tagsElement = doc.select("li.kind p.col-xs-8 a") + val mangaTags = tagsElement.mapNotNullToSet { + val tagTitle = it.text() + if (tagTitle.isNotEmpty()) + MangaTag( + title = tagTitle, + key = tagsElement.attr("href").substringAfterLast('/').trim(), + source = source + ) + else null + } + + 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(), + isNsfw = true + ) + } + + private suspend fun fetchTags(): Set { + val doc = webClient.httpGet("https://$domain/").parseHtml() + val tagItems = doc.select("ul.dropdown-menu.megamenu li a") + val tagSet = ArraySet(tagItems.size) + for (item in tagItems) { + val title = item.attr("data-title").trim() + val key = item.attr("href").substringAfterLast('/').trim() + if (key.isNotEmpty() && title.isNotEmpty()) { + tagSet.add(MangaTag(title = title, key = key, source = source)) + } + } + return tagSet + } +} \ No newline at end of file