Merge pull request #1331 from dragonx943/final

Update domain + Fixes
Draken 1 year ago committed by GitHub
commit b1b04d2953
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1 +1 @@
total: 1173 total: 1174

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("FECOMICC", "Fecomicc", "vi") @MangaSourceParser("FECOMICC", "Fecomic", "vi")
internal class Fecomicc(context: MangaLoaderContext) : internal class Fecomicc(context: MangaLoaderContext) :
MadaraParser(context, MangaParserSource.FECOMICC, "fftruyen.net", 9) { MadaraParser(context, MangaParserSource.FECOMICC, "fftruyen.net", 9) {
override val listUrl = "comic/" override val listUrl = "comic/"

@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
@MangaSourceParser("HENTAICUBE", "HentaiCube", "vi", ContentType.HENTAI) @MangaSourceParser("HENTAICUBE", "CBHentai", "vi", ContentType.HENTAI)
internal class HentaiCube(context: MangaLoaderContext) : internal class HentaiCube(context: MangaLoaderContext) :
MadaraParser(context, MangaParserSource.HENTAICUBE, "hentaicb.pro") { MadaraParser(context, MangaParserSource.HENTAICUBE, "hentaicb.pro") {

@ -6,9 +6,9 @@ import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser 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) : 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 listUrl = "truyen-hentai/"
override val tagPrefix = "the-loai/" override val tagPrefix = "the-loai/"
override val datePattern = "dd/MM/yyyy" override val datePattern = "dd/MM/yyyy"

@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.* 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) : internal class Quaanhdaocuteo(context: MangaLoaderContext) :
MadaraParser(context, MangaParserSource.QUAANHDAOCUTEO, "quaanhdaocuteo.xyz") { MadaraParser(context, MangaParserSource.QUAANHDAOCUTEO, "quaanhdaocuteo.xyz") {
override val datePattern = "dd/MM/yyyy" override val datePattern = "dd/MM/yyyy"

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser 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) : internal class RuaHapChanhDay(context: MangaLoaderContext) :
MadaraParser(context, MangaParserSource.RUAHAPCHANHDAY, "ruahapchanhday.com", 30) { MadaraParser(context, MangaParserSource.RUAHAPCHANHDAY, "ruahapchanhday.com", 30) {
override val datePattern = "dd/MM/yyyy" override val datePattern = "dd/MM/yyyy"

@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
@MangaSourceParser("TRUYENTRANHDAMMYY", "TruyenTranhDamMyy", "vi") @MangaSourceParser("TRUYENTRANHDAMMYY", "Truyện Tranh Đam Mỹ", "vi")
internal class TruyenTranhDamMyy(context: MangaLoaderContext) : internal class TruyenTranhDamMyy(context: MangaLoaderContext) :
MadaraParser(context, MangaParserSource.TRUYENTRANHDAMMYY, "truyentranhdammyy.site") { MadaraParser(context, MangaParserSource.TRUYENTRANHDAMMYY, "truyentranhdammyy.site") {
override val postReq = true override val postReq = true

@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("TRUYENVN", "TruyenVn", "vi", ContentType.HENTAI) @MangaSourceParser("TRUYENVN", "TruyenVn", "vi", ContentType.HENTAI)
internal class TruyenVn(context: MangaLoaderContext) : 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 listUrl = "truyen-tranh/"
override val tagPrefix = "the-loai/" override val tagPrefix = "the-loai/"
override val datePattern = "dd/MM/yyyy" override val datePattern = "dd/MM/yyyy"

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.site.otakusanctuary.OtakuSanctuaryParser 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) : internal class OtakusanEn(context: MangaLoaderContext) :
OtakuSanctuaryParser(context, MangaParserSource.OTAKUSAN_EN, "otakusan.me") { OtakuSanctuaryParser(context, MangaParserSource.OTAKUSAN_EN, "otakusan.me") {
override val lang = "us" override val lang = "us"

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.site.otakusanctuary.OtakuSanctuaryParser 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) : internal class OtakusanVi(context: MangaLoaderContext) :
OtakuSanctuaryParser(context, MangaParserSource.OTAKUSAN_VI, "otakusan.me") { OtakuSanctuaryParser(context, MangaParserSource.OTAKUSAN_VI, "otakusan.me") {
override val selectState = ".table-info tr:contains(Status) td" override val selectState = ".table-info tr:contains(Status) td"

@ -15,7 +15,7 @@ import java.util.*
import org.koitharu.kotatsu.parsers.Broken import org.koitharu.kotatsu.parsers.Broken
@Broken @Broken
@MangaSourceParser("BLOGTRUYEN", "BlogTruyen", "vi") @MangaSourceParser("BLOGTRUYEN", "Blog Truyện", "vi")
internal class BlogTruyenParser(context: MangaLoaderContext) : internal class BlogTruyenParser(context: MangaLoaderContext) :
PagedMangaParser(context, MangaParserSource.BLOGTRUYEN, pageSize = 20) { PagedMangaParser(context, MangaParserSource.BLOGTRUYEN, pageSize = 20) {

@ -18,7 +18,7 @@ import java.text.SimpleDateFormat
import java.util.* import java.util.*
@Broken @Broken
@MangaSourceParser("BLOGTRUYENVN", "BlogTruyenVN", "vi") @MangaSourceParser("BLOGTRUYENVN", "BlogTruyen.vn (Unofficial)", "vi")
internal class BlogTruyenVN(context: MangaLoaderContext) : internal class BlogTruyenVN(context: MangaLoaderContext) :
PagedMangaParser(context, MangaParserSource.BLOGTRUYENVN, pageSize = 20) { PagedMangaParser(context, MangaParserSource.BLOGTRUYENVN, pageSize = 20) {

@ -22,7 +22,7 @@ import java.net.HttpURLConnection
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
@MangaSourceParser("CUUTRUYEN", "CuuTruyen", "vi") @MangaSourceParser("CUUTRUYEN", "Cứu Truyện", "vi")
internal class CuuTruyenParser(context: MangaLoaderContext) : internal class CuuTruyenParser(context: MangaLoaderContext) :
PagedMangaParser(context, MangaParserSource.CUUTRUYEN, 20), Interceptor { PagedMangaParser(context, MangaParserSource.CUUTRUYEN, 20), Interceptor {

@ -10,7 +10,7 @@ import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* 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) : internal class DuaLeoTruyen(context: MangaLoaderContext) :
PagedMangaParser(context, MangaParserSource.DUALEOTRUYEN, 60) { PagedMangaParser(context, MangaParserSource.DUALEOTRUYEN, 60) {

@ -9,10 +9,10 @@ import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
import java.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) { 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<ConfigKey<*>>) { override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
super.onCreateConfig(keys) super.onCreateConfig(keys)

@ -11,7 +11,7 @@ import java.util.*
@MangaSourceParser("SAYHENTAI", "SayHentai", "vi", ContentType.HENTAI) @MangaSourceParser("SAYHENTAI", "SayHentai", "vi", ContentType.HENTAI)
internal class SayHentai(context: MangaLoaderContext) : PagedMangaParser(context, MangaParserSource.SAYHENTAI, 20) { 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<ConfigKey<*>>) { override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
super.onCreateConfig(keys) super.onCreateConfig(keys)

@ -232,7 +232,6 @@ internal abstract class WpComicsParser(
) )
} }
protected open val selectDate = "div.col-xs-4" protected open val selectDate = "div.col-xs-4"
protected open val selectChapter = "div.list-chapter li.row:not(.heading)" protected open val selectChapter = "div.list-chapter li.row:not(.heading)"

@ -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<MangaTag> {
val doc = webClient.httpGet("https://$domain/").parseHtml()
val tagItems = doc.select("ul.dropdown-menu.megamenu li a")
val tagSet = ArraySet<MangaTag>(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
}
}

@ -1,15 +1,51 @@
package org.koitharu.kotatsu.parsers.site.wpcomics.vi 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.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaParserSource
import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser 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") @MangaSourceParser("NETTRUYEN", "NetTruyen", "vi")
internal class NetTruyen(context: MangaLoaderContext) : internal class NetTruyen(context: MangaLoaderContext) :
WpComicsParser(context, MangaParserSource.NETTRUYEN, "nettruyenww.com", 44) { 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 { getChapters(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().reversed(),
)
}
} }

Loading…
Cancel
Save