Merge pull request #1529 - dragonx943/fixes
[Madara] Fixes + Update sources domain [vi]
This commit is contained in:
2
.github/summary.yaml
vendored
2
.github/summary.yaml
vendored
@@ -1 +1 @@
|
|||||||
total: 1192
|
total: 1192
|
||||||
@@ -578,7 +578,7 @@ internal abstract class MadaraParser(
|
|||||||
altTitles = setOfNotNull(alt),
|
altTitles = setOfNotNull(alt),
|
||||||
state = state,
|
state = state,
|
||||||
chapters = chaptersDeferred.await(),
|
chapters = chaptersDeferred.await(),
|
||||||
contentRating = if (doc.selectFirst(".adult-confirm") != null) {
|
contentRating = if (doc.selectFirst(".adult-confirm") != null || isNsfwSource) {
|
||||||
ContentRating.ADULT
|
ContentRating.ADULT
|
||||||
} else {
|
} else {
|
||||||
ContentRating.SAFE
|
ContentRating.SAFE
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import java.util.*
|
|||||||
internal class HentaiCube(context: MangaLoaderContext) :
|
internal class HentaiCube(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaParserSource.HENTAICUBE, "hentaicube.xyz") {
|
MadaraParser(context, MangaParserSource.HENTAICUBE, "hentaicube.xyz") {
|
||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain("hentaicube.xyz", "hentaicb.love") // hentaicb.love broken
|
override val configKeyDomain = ConfigKey.Domain("hentaicube.xyz")
|
||||||
|
|
||||||
override val datePattern = "dd/MM/yyyy"
|
override val datePattern = "dd/MM/yyyy"
|
||||||
override val postReq = true
|
override val postReq = true
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
|||||||
|
|
||||||
@MangaSourceParser("HENTAIVNPLUS", "HentaiVN.plus", "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.men", 24) {
|
MadaraParser(context, MangaParserSource.HENTAIVNPLUS, "hentaivn.art", 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"
|
||||||
|
|||||||
@@ -1,15 +1,66 @@
|
|||||||
package org.koitharu.kotatsu.parsers.site.madara.vi
|
package org.koitharu.kotatsu.parsers.site.madara.vi
|
||||||
|
|
||||||
|
import kotlinx.coroutines.async
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
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.model.ContentType
|
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
|
||||||
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
|
import org.koitharu.kotatsu.parsers.util.*
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
@MangaSourceParser("HENTAIZ", "HentaiZ", "vi", ContentType.HENTAI)
|
@MangaSourceParser("HENTAIZ", "HentaiZ", "vi", ContentType.HENTAI)
|
||||||
internal class HentaiZ(context: MangaLoaderContext) :
|
internal class HentaiZ(context: MangaLoaderContext) :
|
||||||
MadaraParser(context, MangaParserSource.HENTAIZ, "hentaiz.pw", 24) {
|
MadaraParser(context, MangaParserSource.HENTAIZ, "hentaiz.run", 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"
|
||||||
|
|
||||||
|
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
|
||||||
|
val fullUrl = manga.url.toAbsoluteUrl(domain)
|
||||||
|
val doc = webClient.httpGet(fullUrl).parseHtml()
|
||||||
|
|
||||||
|
val href = doc.selectFirst("head meta[property='og:url']")?.attr("content")?.toRelativeUrl(domain) ?: manga.url
|
||||||
|
val testCheckAsync = doc.select(selectTestAsync)
|
||||||
|
val chaptersDeferred = if (testCheckAsync.isNullOrEmpty()) {
|
||||||
|
async { loadChapters(href, doc) }
|
||||||
|
} else {
|
||||||
|
async { getChapters(manga, doc) }
|
||||||
|
}
|
||||||
|
|
||||||
|
val desc = doc.select(selectDesc).html()
|
||||||
|
|
||||||
|
val stateDiv = doc.selectFirst(selectState)?.selectLast("div.summary-content")
|
||||||
|
|
||||||
|
val state = stateDiv?.let {
|
||||||
|
when (it.text().lowercase()) {
|
||||||
|
in ongoing -> MangaState.ONGOING
|
||||||
|
in finished -> MangaState.FINISHED
|
||||||
|
in abandoned -> MangaState.ABANDONED
|
||||||
|
in paused -> MangaState.PAUSED
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val alt = doc.body().select(selectAlt).firstOrNull()?.tableValue()?.textOrNull()
|
||||||
|
|
||||||
|
manga.copy(
|
||||||
|
url = href,
|
||||||
|
publicUrl = href.toAbsoluteUrl(domain),
|
||||||
|
tags = doc.body().select(selectGenre).mapToSet { a ->
|
||||||
|
MangaTag(
|
||||||
|
key = a.attr("href").removeSuffix("/").substringAfterLast('/'),
|
||||||
|
title = a.text().toTitleCase(),
|
||||||
|
source = source,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
description = desc,
|
||||||
|
altTitles = setOfNotNull(alt),
|
||||||
|
state = state,
|
||||||
|
chapters = chaptersDeferred.await(),
|
||||||
|
contentRating = ContentRating.ADULT,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.tech", 20) {
|
MadaraParser(context, MangaParserSource.TRUYENVN, "truyenvn.nl", 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"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ private const val PAGE_SIZE = 20
|
|||||||
internal class CMangaParser(context: MangaLoaderContext) :
|
internal class CMangaParser(context: MangaLoaderContext) :
|
||||||
LegacyPagedMangaParser(context, MangaParserSource.CMANGA, PAGE_SIZE), MangaParserAuthProvider {
|
LegacyPagedMangaParser(context, MangaParserSource.CMANGA, PAGE_SIZE), MangaParserAuthProvider {
|
||||||
|
|
||||||
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("cmangax.com")
|
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("cmangav.com")
|
||||||
|
|
||||||
override val availableSortOrders: Set<SortOrder>
|
override val availableSortOrders: Set<SortOrder>
|
||||||
get() = EnumSet.of(
|
get() = EnumSet.of(
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ internal class DuaLeoTruyen(context: MangaLoaderContext) :
|
|||||||
LegacyPagedMangaParser(context, MangaParserSource.DUALEOTRUYEN, 60) {
|
LegacyPagedMangaParser(context, MangaParserSource.DUALEOTRUYEN, 60) {
|
||||||
|
|
||||||
override val configKeyDomain: ConfigKey.Domain
|
override val configKeyDomain: ConfigKey.Domain
|
||||||
get() = ConfigKey.Domain("dualeotruyenxxy.com")
|
get() = ConfigKey.Domain("dualeotruyenbot1.com")
|
||||||
|
|
||||||
override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_DESKTOP)
|
override val userAgentKey = ConfigKey.UserAgent(UserAgents.CHROME_DESKTOP)
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import java.util.*
|
|||||||
internal class Hentai18VN(context: MangaLoaderContext) :
|
internal class Hentai18VN(context: MangaLoaderContext) :
|
||||||
LegacyPagedMangaParser(context, MangaParserSource.HENTAI18VN, 30) {
|
LegacyPagedMangaParser(context, MangaParserSource.HENTAI18VN, 30) {
|
||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain("hentai18vn.art")
|
override val configKeyDomain = ConfigKey.Domain("hentai18vn.online")
|
||||||
|
|
||||||
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
||||||
super.onCreateConfig(keys)
|
super.onCreateConfig(keys)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import java.util.*
|
|||||||
internal class HentaiVnBuzz(context: MangaLoaderContext) :
|
internal class HentaiVnBuzz(context: MangaLoaderContext) :
|
||||||
LegacyPagedMangaParser(context, MangaParserSource.HENTAIVNBUZZ, 24) {
|
LegacyPagedMangaParser(context, MangaParserSource.HENTAIVNBUZZ, 24) {
|
||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain("hentaivn.buzz")
|
override val configKeyDomain = ConfigKey.Domain("hentaivn.bar")
|
||||||
|
|
||||||
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("LXMANGA", "LXManga", "vi", type = ContentType.HENTAI)
|
@MangaSourceParser("LXMANGA", "LXManga", "vi", type = ContentType.HENTAI)
|
||||||
internal class LxManga(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.LXMANGA, 60) {
|
internal class LxManga(context: MangaLoaderContext) : LegacyPagedMangaParser(context, MangaParserSource.LXMANGA, 60) {
|
||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain("lxmanga.cloud")
|
override val configKeyDomain = ConfigKey.Domain("lxmanga.art")
|
||||||
|
|
||||||
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
||||||
super.onCreateConfig(keys)
|
super.onCreateConfig(keys)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ internal class VcomycsParser(context: MangaLoaderContext) :
|
|||||||
LegacyPagedMangaParser(context, MangaParserSource.VCOMYCS, 36) {
|
LegacyPagedMangaParser(context, MangaParserSource.VCOMYCS, 36) {
|
||||||
|
|
||||||
override val configKeyDomain: ConfigKey.Domain
|
override val configKeyDomain: ConfigKey.Domain
|
||||||
get() = ConfigKey.Domain("vivicomi.org")
|
get() = ConfigKey.Domain("vivicomi.info")
|
||||||
|
|
||||||
override val availableSortOrders: Set<SortOrder>
|
override val availableSortOrders: Set<SortOrder>
|
||||||
get() = EnumSet.of(SortOrder.UPDATED)
|
get() = EnumSet.of(SortOrder.UPDATED)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
|
|||||||
|
|
||||||
@MangaSourceParser("HAMTRUYEN", "Ham Truyện", "vi")
|
@MangaSourceParser("HAMTRUYEN", "Ham Truyện", "vi")
|
||||||
internal class HamTruyen(context: MangaLoaderContext) :
|
internal class HamTruyen(context: MangaLoaderContext) :
|
||||||
WpComicsParser(context, MangaParserSource.HAMTRUYEN, "hamtruyen.vn", 44) {
|
WpComicsParser(context, MangaParserSource.HAMTRUYEN, "hamtruyen.net", 44) {
|
||||||
|
|
||||||
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
|
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
|
||||||
val fullUrl = manga.url.toAbsoluteUrl(domain)
|
val fullUrl = manga.url.toAbsoluteUrl(domain)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import java.text.SimpleDateFormat
|
|||||||
|
|
||||||
@MangaSourceParser("NETTRUYEN", "NetTruyen", "vi")
|
@MangaSourceParser("NETTRUYEN", "NetTruyen", "vi")
|
||||||
internal class NetTruyen(context: MangaLoaderContext) :
|
internal class NetTruyen(context: MangaLoaderContext) :
|
||||||
WpComicsParser(context, MangaParserSource.NETTRUYEN, "nettruyenvng.com", 36) {
|
WpComicsParser(context, MangaParserSource.NETTRUYEN, "nettruyenrr.com", 36) {
|
||||||
|
|
||||||
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain(
|
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain(
|
||||||
"nettruyenrr.com",
|
"nettruyenrr.com",
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import java.util.EnumSet
|
|||||||
|
|
||||||
@MangaSourceParser("NETTRUYENFE", "NetTruyenFE", "vi")
|
@MangaSourceParser("NETTRUYENFE", "NetTruyenFE", "vi")
|
||||||
internal class NetTruyenFE(context: MangaLoaderContext) :
|
internal class NetTruyenFE(context: MangaLoaderContext) :
|
||||||
WpComicsParser(context, MangaParserSource.NETTRUYENFE, "nettruyenedu.com", 20) {
|
WpComicsParser(context, MangaParserSource.NETTRUYENFE, "nettruyenid.com", 20) {
|
||||||
|
|
||||||
override val listUrl = "/tim-kiem-nang-cao"
|
override val listUrl = "/tim-kiem-nang-cao"
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import java.util.EnumSet
|
|||||||
|
|
||||||
@MangaSourceParser("NETTRUYENLL", "NetTruyenLL", "vi")
|
@MangaSourceParser("NETTRUYENLL", "NetTruyenLL", "vi")
|
||||||
internal class NetTruyenLL(context: MangaLoaderContext) :
|
internal class NetTruyenLL(context: MangaLoaderContext) :
|
||||||
WpComicsParser(context, MangaParserSource.NETTRUYENLL, "nettruyenedu.com", 20) {
|
WpComicsParser(context, MangaParserSource.NETTRUYENLL, "nettruyenid.com", 20) {
|
||||||
|
|
||||||
override val listUrl = "/tim-kiem-nang-cao"
|
override val listUrl = "/tim-kiem-nang-cao"
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import java.util.EnumSet
|
|||||||
|
|
||||||
@MangaSourceParser("NETTRUYENSSR", "NetTruyenSSR", "vi")
|
@MangaSourceParser("NETTRUYENSSR", "NetTruyenSSR", "vi")
|
||||||
internal class NetTruyenSSR(context: MangaLoaderContext) :
|
internal class NetTruyenSSR(context: MangaLoaderContext) :
|
||||||
WpComicsParser(context, MangaParserSource.NETTRUYENSSR, "nettruyenedu.com", 20) {
|
WpComicsParser(context, MangaParserSource.NETTRUYENSSR, "nettruyenid.com", 20) {
|
||||||
|
|
||||||
override val listUrl = "/tim-kiem-nang-cao"
|
override val listUrl = "/tim-kiem-nang-cao"
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import java.util.*
|
|||||||
|
|
||||||
@MangaSourceParser("NETTRUYENUU", "NetTruyenUU", "vi")
|
@MangaSourceParser("NETTRUYENUU", "NetTruyenUU", "vi")
|
||||||
internal class NetTruyenUU(context: MangaLoaderContext) :
|
internal class NetTruyenUU(context: MangaLoaderContext) :
|
||||||
WpComicsParser(context, MangaParserSource.NETTRUYENUU, "nettruyenedu.com", 20) {
|
WpComicsParser(context, MangaParserSource.NETTRUYENUU, "nettruyenid.com", 20) {
|
||||||
|
|
||||||
override val listUrl = "/tim-kiem-nang-cao"
|
override val listUrl = "/tim-kiem-nang-cao"
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import java.util.*
|
|||||||
|
|
||||||
@MangaSourceParser("NEWTRUYEN", "NewTruyen", "vi")
|
@MangaSourceParser("NEWTRUYEN", "NewTruyen", "vi")
|
||||||
internal class NewTruyen(context: MangaLoaderContext) :
|
internal class NewTruyen(context: MangaLoaderContext) :
|
||||||
WpComicsParser(context, MangaParserSource.NEWTRUYEN, "newtruyen2.com", 36) {
|
WpComicsParser(context, MangaParserSource.NEWTRUYEN, "newtruyen4.com", 36) {
|
||||||
|
|
||||||
override suspend fun getFilterOptions() = MangaListFilterOptions(
|
override suspend fun getFilterOptions() = MangaListFilterOptions(
|
||||||
availableTags = getAvailableTags(),
|
availableTags = getAvailableTags(),
|
||||||
|
|||||||
@@ -12,13 +12,12 @@ import java.util.*
|
|||||||
|
|
||||||
@MangaSourceParser("TOPTRUYEN", "TopTruyen", "vi")
|
@MangaSourceParser("TOPTRUYEN", "TopTruyen", "vi")
|
||||||
internal class TopTruyen(context: MangaLoaderContext) :
|
internal class TopTruyen(context: MangaLoaderContext) :
|
||||||
WpComicsParser(context, MangaParserSource.TOPTRUYEN, "www.toptruyen369.net", 36) {
|
WpComicsParser(context, MangaParserSource.TOPTRUYEN, "www.toptruyentv.pro", 36) {
|
||||||
|
|
||||||
override val configKeyDomain = ConfigKey.Domain(
|
override val configKeyDomain = ConfigKey.Domain(
|
||||||
"www.toptruyen369.net", // Main domain
|
"www.toptruyentv.pro", // Main domain
|
||||||
"www.toptruyen28.net",
|
"www.toptruyen28.net",
|
||||||
"www.toptruyento.pro",
|
"www.toptruyento.pro",
|
||||||
"www.toptruyenpro1.com",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
override val datePattern = "dd/MM/yyyy"
|
override val datePattern = "dd/MM/yyyy"
|
||||||
|
|||||||
Reference in New Issue
Block a user