add new source ( lise below )

fix multiple source. ( lise below )
update madra parser :
-> new option on getListPage for take liste without Ajax
-> add format date
-> change defaut date parterne ( the news is most used by default on sites )
pull/210/head
devi 3 years ago
parent 06a043d290
commit cbbdd13c8e

@ -195,8 +195,27 @@ internal abstract class NineMangaParser(
}
private fun parseStatus(status: String) = when {
// en
status.contains("Ongoing") -> MangaState.ONGOING
status.contains("Completed") -> MangaState.FINISHED
//es
status.contains("En curso") -> MangaState.ONGOING
status.contains("Completado") -> MangaState.FINISHED
//ru
status.contains("постоянный") -> MangaState.ONGOING
status.contains("завершенный") -> MangaState.FINISHED
//de
status.contains("Laufende") -> MangaState.ONGOING
status.contains("Abgeschlossen") -> MangaState.FINISHED
//pt
status.contains("Completo") -> MangaState.ONGOING
status.contains("Em tradução") -> MangaState.FINISHED
//it
status.contains("In corso") -> MangaState.ONGOING
status.contains("Completato") -> MangaState.FINISHED
//fr
status.contains("En cours") -> MangaState.ONGOING
status.contains("Complété") -> MangaState.FINISHED
else -> null
}

@ -33,7 +33,7 @@ internal abstract class MadaraParser(
protected open val tagPrefix = "manga-genre/"
protected open val isNsfwSource = false
protected open val datePattern = "MMMM dd, yyyy"
protected open val datePattern = "MMMM d, yyyy"
protected open val stylepage = "?style=list"
protected open val postreq = false
@ -62,6 +62,7 @@ internal abstract class MadaraParser(
"Ongoing",
"OnGoing",
"On going",
"On Going",
"Ativo",
"En Cours",
"En cours",
@ -120,14 +121,64 @@ internal abstract class MadaraParser(
"Concluido",
"已完结",
"Bitmiş",
"End",
)
// Change these values only if the site does not support manga listings via ajax
protected open val withoutAjax = false
protected open val listeurl = "manga/"
override suspend fun getListPage(
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
val doc = if (withoutAjax) {
val url = buildString {
append("https://")
append(domain)
val pages = page + 1
when {
!query.isNullOrEmpty() -> {
append("/page/")
append(pages.toString())
append("/?s=")
append(query.urlEncoded())
append("&post_type=wp-manga&")
}
!tags.isNullOrEmpty() -> {
append("/$tagPrefix")
for (tag in tags) {
append(tag.key)
}
append("/page/")
append(pages.toString())
append("?")
}
else -> {
append("/$listeurl")
append("/page/")
append(pages.toString())
append("?")
}
}
append("m_orderby=")
when (sortOrder) {
SortOrder.POPULARITY -> append("views")
SortOrder.UPDATED -> append("latest")
SortOrder.NEWEST -> append("new-manga")
SortOrder.ALPHABETICAL -> append("alphabet")
else -> append("latest")
}
}
webClient.httpGet(url).parseHtml()
} else {
val tag = tags.oneOrThrowIfMany()
val payload = createRequestTemplate()
payload["page"] = page.toString()
@ -141,17 +192,17 @@ internal abstract class MadaraParser(
}
else -> payload["vars[meta_key]"] = "_latest_update"
}
payload["vars[wp-manga-genre]"] = tag?.key.orEmpty()
payload["vars[s]"] = query?.urlEncoded().orEmpty()
val doc = webClient.httpPost(
webClient.httpPost(
"https://$domain/wp-admin/admin-ajax.php",
payload,
).parseHtml()
}
return doc.select("div.row.c-tabs-item__content").ifEmpty {
doc.select("div.page-item-detail.manga")
doc.select("div.page-item-detail")
}.map { div ->
val href = div.selectFirst("a")?.attrAsRelativeUrlOrNull("href") ?: div.parseFailed("Link not found")
val summary = div.selectFirst(".tab-summary") ?: div.selectFirst(".item-summary")
@ -284,14 +335,16 @@ internal abstract class MadaraParser(
val a = li.selectFirst("a")
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
val link = href + stylepage
val dateText = li.selectFirst("a.c-new-tag")?.attr("title") ?: li.selectFirst(selectdate)?.text()
val name = a.selectFirst("p")?.text() ?: a.ownText()
MangaChapter(
id = generateUid(href),
name = a.ownText(),
name = name,
number = i + 1,
url = link,
uploadDate = parseChapterDate(
dateFormat,
li.selectFirst(selectdate)?.text(),
dateText,
),
source = source,
scanlator = null,
@ -317,15 +370,17 @@ internal abstract class MadaraParser(
val a = li.selectFirst("a")
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
val link = href + stylepage
val dateText = li.selectFirst("a.c-new-tag")?.attr("title") ?: li.selectFirst(selectdate)?.text()
val name = a.selectFirst("p")?.text() ?: a.ownText()
MangaChapter(
id = generateUid(href),
url = link,
name = a.ownText(),
name = name,
number = i + 1,
branch = null,
uploadDate = parseChapterDate(
dateFormat,
li.selectFirst(selectdate)?.text(),
dateText,
),
scanlator = null,
source = source,
@ -364,6 +419,10 @@ internal abstract class MadaraParser(
date.startsWith("", ignoreCase = true) -> {
parseRelativeDate(date)
}
// other translated 'ago' in Spanish
date.endsWith(" hace", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Handle translated 'ago' in Turkish.
date.endsWith(" önce", ignoreCase = true) -> {
parseRelativeDate(date)
@ -376,15 +435,18 @@ internal abstract class MadaraParser(
date.startsWith("il y a", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Handle translated short 'ago'
//If there is no ago but just a motion of time
// short Hours
date.endsWith(" h", ignoreCase = true) -> {
parseRelativeDate(date)
}
// short Day
date.endsWith(" d", ignoreCase = true) -> {
parseRelativeDate(date)
}
//If there is no ago but just a motion of time
// Day in Portuguese
date.endsWith(" días", ignoreCase = true) -> {
parseRelativeDate(date)
}
@ -392,7 +454,15 @@ internal abstract class MadaraParser(
date.endsWith(" día", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Day in French
date.endsWith(" jour", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" jours", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Hours in Portuguese
date.endsWith(" horas", ignoreCase = true) -> {
parseRelativeDate(date)
}
@ -400,7 +470,20 @@ internal abstract class MadaraParser(
date.endsWith(" hora", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Hours in french
date.endsWith(" heure", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" heures", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Minutes in English
date.endsWith(" mins", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Minutes in Portuguese
date.endsWith(" minutos", ignoreCase = true) -> {
parseRelativeDate(date)
}
@ -408,6 +491,14 @@ internal abstract class MadaraParser(
date.endsWith(" minuto", ignoreCase = true) -> {
parseRelativeDate(date)
}
//Minutes in French
date.endsWith(" minute", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" minutes", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Handle 'yesterday' and 'today', using midnight
date.startsWith("year", ignoreCase = true) -> {
@ -458,17 +549,27 @@ internal abstract class MadaraParser(
"día",
"dia",
"day",
"days",
"d",
).anyWordIn(date) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis
WordSet("jam", "saat", "heure", "hora", "horas", "hour", "h").anyWordIn(date) -> cal.apply {
WordSet("jam", "saat", "heure", "hora", "horas", "hour", "hours", "h").anyWordIn(date) -> cal.apply {
add(
Calendar.HOUR,
-number,
)
}.timeInMillis
WordSet("menit", "dakika", "min", "minute", "minuto", "mins", "phút").anyWordIn(date) -> cal.apply {
WordSet(
"menit",
"dakika",
"min",
"minute",
"minutes",
"minuto",
"mins",
"phút",
).anyWordIn(date) -> cal.apply {
add(
Calendar.MINUTE,
-number,
@ -482,7 +583,7 @@ internal abstract class MadaraParser(
)
}.timeInMillis
WordSet("month").anyWordIn(date) -> cal.apply { add(Calendar.MONTH, -number) }.timeInMillis
WordSet("month", "months").anyWordIn(date) -> cal.apply { add(Calendar.MONTH, -number) }.timeInMillis
WordSet("year").anyWordIn(date) -> cal.apply { add(Calendar.YEAR, -number) }.timeInMillis
else -> 0
}

@ -11,5 +11,4 @@ internal class Azoranov(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.AZORANOV, "azoranov.com", pageSize = 10) {
override val tagPrefix = "novel-genre/"
override val datePattern = "MMMM d, yyyy"
}

@ -12,6 +12,5 @@ internal class Manhatic(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHATIC, "manhatic.com") {
override val isNsfwSource = true
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.ENGLISH
}

@ -11,5 +11,4 @@ internal class NijiTranslations(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NIJITRANSLATIONS, "niji-translations.com") {
override val postreq = true
override val datePattern = "MMMM d, yyyy"
}

@ -13,6 +13,5 @@ internal class AdultWebtoon(context: MangaLoaderContext) :
override val isNsfwSource = true
override val tagPrefix = "adult-webtoon-genre/"
override val datePattern = "MMMM d, yyyy"
override val postreq = true
}

@ -11,7 +11,7 @@ internal class AllPornComic(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ALLPORN_COMIC, "allporncomic.com", pageSize = 24) {
override val tagPrefix = "porncomic-genre/"
override val datePattern = "MMMM dd, yyyy"
override val isNsfwSource = true
}

@ -11,5 +11,6 @@ internal class AnshScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ANSHSCANS, "anshscans.org", 10) {
override val tagPrefix = "genre/"
override val datePattern = "MMMM dd, yyyy"
}

@ -7,4 +7,9 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("AQUAMANGA", "AquaManga", "en")
internal class AquaManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.AQUAMANGA, "aquamanga.com")
internal class AquaManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.AQUAMANGA, "aquamanga.com") {
override val datePattern = "MMMM dd, yyyy"
override val withoutAjax = true
}

@ -8,6 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("BABELWUXIA", "Babelwuxia", "en")
internal class Babelwuxia(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.BABELWUXIA, "read.babelwuxia.com") {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.BABELWUXIA, "read.babelwuxia.com")

@ -10,4 +10,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class BibiManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.BIBIMANGA, "bibimanga.com") {
override val isNsfwSource = false
override val datePattern = "MMMM dd, yyyy"
}

@ -11,6 +11,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class BlogManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.BLOG_MANGA, "blogmanga.net") {
override val datePattern = "MMMM d, yyyy"
override val postreq = true
}

@ -13,6 +13,5 @@ internal class BoysLove(context: MangaLoaderContext) :
override val isNsfwSource = true
override val tagPrefix = "boyslove-genre/"
override val datePattern = "MMMM d, yyyy"
override val postreq = true
}

@ -7,7 +7,4 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("CM_READER", "Cm Reader", "en")
internal class CmReader(context: MangaLoaderContext) : MadaraParser(context, MangaSource.CM_READER, "cmreader.info") {
override val datePattern = "MMMM d, yyyy"
}
internal class CmReader(context: MangaLoaderContext) : MadaraParser(context, MangaSource.CM_READER, "cmreader.info")

@ -8,7 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("COFFEE_MANGA", "Coffee Manga", "en")
internal class CoffeeManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.COFFEE_MANGA, "coffeemanga.io") {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.COFFEE_MANGA, "coffeemanga.io")

@ -10,6 +10,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class ColoredManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.COLORED_MANGA, "coloredmanga.com") {
override val tagPrefix = "manga-tag/"
override val datePattern = "dd-MMM"
}

@ -8,6 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("DARK_SCANS", "DarkScans", "en")
internal class DarkScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DARK_SCANS, "darkscans.com", 18) {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.DARK_SCANS, "darkscans.com", 18)

@ -10,6 +10,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class DecadenceScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DECADENCESCANS, "reader.decadencescans.com", 10) {
override val datePattern = "MMMM d, yyyy"
override val isNsfwSource = true
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("DRAGONTEA", "DragonTea", "en")
internal class DragonTea(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DRAGONTEA, "dragontea.ink") {
override val datePattern = "MM/dd/yyyy"
}

@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("FREEMANGA", "FreeManga", "en")
internal class FreeManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.FREEMANGA, "freemanga.me")
internal class FreeManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.FREEMANGA, "freemanga.me") {
override val datePattern = "MMMM dd, yyyy"
}

@ -9,6 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class FreeWebtoonCoins(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.FREEWEBTOONCOINS, "freewebtooncoins.com") {
override val datePattern = "MMMM d, yyyy"
override val tagPrefix = "webtoon-genre/"
}

@ -9,6 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class GdScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.GDSCANS, "gdscans.com", 10) {
override val datePattern = "MMMM d, yyyy"
override val tagPrefix = "webtoon-genre/"
}

@ -10,7 +10,6 @@ internal class HManhwa(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HMANHWA, "hmanhwa.com") {
override val tagPrefix = "manhwa-genre/"
override val isNsfwSource = true
override val datePattern = "dd MMM"
override val postreq = true

@ -8,7 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HARIMANGA", "HariManga", "en")
internal class HariManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HARIMANGA, "harimanga.com", pageSize = 10) {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.HARIMANGA, "harimanga.com", pageSize = 10)

@ -10,4 +10,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class Hentai20(context: MangaLoaderContext) : MadaraParser(context, MangaSource.HENTAI20, "hentai20.io") {
override val isNsfwSource = true
override val datePattern = "MMMM dd, yyyy"
}

@ -11,7 +11,7 @@ internal class Hentai4Free(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAI_4FREE, "hentai4free.net", pageSize = 24) {
override val tagPrefix = "hentai-tag/"
override val datePattern = "MMMM dd, yyyy"
override val isNsfwSource = true
}

@ -10,7 +10,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class HentaiManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIMANGA, "hentaimanga.me", 36) {
override val datePattern = "MMMM d, yyyy"
override val isNsfwSource = true
override val postreq = true
}

@ -10,7 +10,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class HentaiWebtoon(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIWEBTOON, "hentaiwebtoon.com") {
override val datePattern = "MMMM d, yyyy"
override val isNsfwSource = true
override val postreq = true

@ -10,7 +10,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class HentaixComic(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIXCOMIC, "hentaixcomic.com", 16) {
override val datePattern = "MMMM d, yyyy"
override val isNsfwSource = true
override val postreq = true
}

@ -10,7 +10,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class HentaixYuri(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIXYURI, "hentaixyuri.com", 16) {
override val datePattern = "MMMM d, yyyy"
override val isNsfwSource = true
override val postreq = true
}

@ -9,7 +9,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class Hscans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HSCANS, "hscans.com", 10) {
override val tagPrefix = "manga-tag/"
override val datePattern = "dd/MM/yyyy"
}

@ -8,8 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("IMMORTALUPDATES", "Immortal Updates", "en")
internal class ImmortalUpdates(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.IMMORTALUPDATES, "immortalupdates.com") {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.IMMORTALUPDATES, "immortalupdates.com")

@ -3,13 +3,113 @@ package org.koitharu.kotatsu.parsers.site.madara.en
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.MangaSource
import org.koitharu.kotatsu.parsers.model.MangaState
import org.koitharu.kotatsu.parsers.model.MangaTag
import org.koitharu.kotatsu.parsers.model.SortOrder
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrlOrNull
import org.koitharu.kotatsu.parsers.util.domain
import org.koitharu.kotatsu.parsers.util.generateUid
import org.koitharu.kotatsu.parsers.util.host
import org.koitharu.kotatsu.parsers.util.mapNotNullToSet
import org.koitharu.kotatsu.parsers.util.parseFailed
import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.removeSuffix
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
import org.koitharu.kotatsu.parsers.util.toTitleCase
import org.koitharu.kotatsu.parsers.util.urlEncoded
@MangaSourceParser("ISEKAISCAN_EU", "IsekaiScan", "en")
internal class IsekaiScanEuParser(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ISEKAISCAN_EU, "isekaiscan.to") {
MadaraParser(context, MangaSource.ISEKAISCAN_EU, "m.isekaiscan.to") {
override val datePattern = "MM/dd/yyyy"
override val withoutAjax = true
override val listeurl = "mangax/"
override suspend fun getListPage(
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
val url = buildString {
append("https://")
append(domain)
val pages = page + 1
when {
!query.isNullOrEmpty() -> {
append("/page/")
append(pages.toString())
append("/?s=")
append(query.urlEncoded())
append("&post_type=wp-manga&")
}
!tags.isNullOrEmpty() -> {
append("/$tagPrefix")
for (tag in tags) {
append(tag.key)
}
append("/page/")
append(pages.toString())
append("?")
}
else -> {
append("/$listeurl")
append("/page/")
append(pages.toString())
append("?")
}
}
append("m_orderby=")
when (sortOrder) {
SortOrder.POPULARITY -> append("views")
SortOrder.UPDATED -> append("latest")
SortOrder.NEWEST -> append("new-manga")
SortOrder.ALPHABETICAL -> append("alphabet")
else -> append("latest")
}
}
val doc = webClient.httpGet(url).parseHtml()
return doc.select("div.row.c-tabs-item__content").ifEmpty {
doc.select("div.page-item-detail")
}.map { div ->
val href = div.selectFirst("a")?.attrAsRelativeUrlOrNull("href") ?: div.parseFailed("Link not found")
val summary = div.selectFirst(".tab-summary") ?: div.selectFirst(".item-summary")
Manga(
id = generateUid(href),
url = href,
publicUrl = href.toAbsoluteUrl(div.host ?: domain),
coverUrl = div.selectFirst("img")?.src().orEmpty(),
title = (summary?.selectFirst("h3") ?: summary?.selectFirst("h4")
?: summary?.selectFirst("div.post-title p.juduldepan"))?.text().orEmpty(),
altTitle = null,
rating = div.selectFirst("span.total_votes")?.ownText()?.toFloatOrNull()?.div(5f) ?: -1f,
tags = summary?.selectFirst(".mg_genres")?.select("a")?.mapNotNullToSet { a ->
MangaTag(
key = a.attr("href").removeSuffix('/').substringAfterLast('/'),
title = a.text().ifEmpty { return@mapNotNullToSet null }.toTitleCase(),
source = source,
)
}.orEmpty(),
author = summary?.selectFirst(".mg_author")?.selectFirst("a")?.ownText(),
state = when (summary?.selectFirst(".mg_status")?.selectFirst(".summary-content")?.ownText()
?.lowercase()) {
in ongoing -> MangaState.ONGOING
in finished -> MangaState.FINISHED
else -> null
},
source = source,
isNsfw = isNsfwSource,
)
}
}
}

@ -8,8 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ITSYOURIGHTMANHUA", "Itsyourightmanhua", "en")
internal class Itsyourightmanhua(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ITSYOURIGHTMANHUA, "itsyourightmanhua.com", 10) {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.ITSYOURIGHTMANHUA, "itsyourightmanhua.com", 10)

@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("KISSMANGA", "KissManga", "en")
internal class KissManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.KISSMANGA, "kissmanga.in")
internal class KissManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.KISSMANGA, "kissmanga.in") {
override val datePattern = "MMMM dd, yyyy"
}

@ -8,8 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("KSGROUPSCANS", "Ks Group Scans", "en")
internal class KsGroupScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KSGROUPSCANS, "ksgroupscans.com") {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.KSGROUPSCANS, "ksgroupscans.com")

@ -8,8 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("KUNMANGA", "Kun Manga", "en")
internal class KunManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KUNMANGA, "kunmanga.com", 10) {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.KUNMANGA, "kunmanga.com", 10)

@ -8,7 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("LADYMANGA", "Lady Manga", "en")
internal class LadyManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LADYMANGA, "ladymanga.com") {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.LADYMANGA, "ladymanga.com")

@ -0,0 +1,11 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("LEVIATANSCANS", "Leviatan Scans", "en")
internal class LeviatanScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LEVIATANSCANS, "en.leviatanscans.com", 10)

@ -13,5 +13,4 @@ internal class LoliconMobi(context: MangaLoaderContext) :
override val postreq = true
override val isNsfwSource = true
override val tagPrefix = "lolicon-genre/"
override val datePattern = "MMMM d, yyyy"
}

@ -8,7 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("LUXMANGA", "LuxManga", "en")
internal class LuxManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LUXMANGA, "luxmanga.net") {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.LUXMANGA, "luxmanga.net")

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGA1ST", "Manga1st", "en")
internal class Manga1st(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGA1ST, "manga1st.online") {
override val datePattern = "d MMMM، yyyy"
}

@ -9,4 +9,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGA_247", "247MANGA", "en")
internal class Manga247(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGA_247, "247manga.com") {
override val tagPrefix = "manhwa-genre/"
override val datePattern = "MMMM dd, yyyy"
override val withoutAjax = true
override val listeurl = "manhwa/"
}

@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGA_365", "365Manga", "en")
internal class Manga365(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGA_365, "365manga.com")
internal class Manga365(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGA_365, "365manga.com") {
override val datePattern = "MMMM dd, yyyy"
}

@ -10,4 +10,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class Manga3s(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGA_3S, "manga3s.com") {
override val tagPrefix = "manhwa-genre/"
override val datePattern = "MMMM dd, yyyy"
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGA68", "Manga68", "en")
internal class Manga68(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGA68, "manga68.com") {
override val withoutAjax = true
}

@ -8,7 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAACTION", "Manga Action", "en")
internal class MangaAction(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAACTION, "mangaaction.com") {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.MANGAACTION, "mangaaction.com")

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGABAZ", "MangaBaz", "en")
internal class MangaBaz(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGABAZ, "mangabaz.net")

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGABOB", "MangaBob", "en")
internal class MangaBob(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGABOB, "mangabob.com") {
override val postreq = true
}

@ -8,4 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGACV", "Manga Cv", "en")
internal class MangaCv(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGACV, "mangacv.com", pageSize = 10)
MadaraParser(context, MangaSource.MANGACV, "mangacv.com", pageSize = 10) {
override val datePattern = "MMMM dd, yyyy"
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGADODS", "MangaDods", "en")
internal class MangaDods(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGADODS, "www.mangadods.com") {
override val selectdesc = "div.description-summary"
override val datePattern = "dd-MMM"
}

@ -10,4 +10,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class MangaEffect(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAEFFECT, "mangaeffect.com") {
override val datePattern = "dd.MM.yyyy"
override val withoutAjax = true
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAFAST", "Manga Fast", "en")
internal class MangaFast(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAFAST, "manga-fast.com") {
override val datePattern = "d MMMM، yyyy"
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAFORFREE", "MangaForFree", "en")
internal class MangaForFree(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAFORFREE, "mangaforfree.com", 10) {
override val postreq = true
override val isNsfwSource = true
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAFOXFULL", "MangaFoxFull", "en")
internal class MangaFoxFull(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAFOXFULL, "mangafoxfull.com") {
override val postreq = true
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAFREAK", "MangaFreak", "en")
internal class MangaFreak(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAFREAK, "mangafreak.online") {
override val postreq = true
override val datePattern = "dd MMMM، yyyy"
}

@ -0,0 +1,11 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAGREAT", "MangaGreat", "en")
internal class MangaGreat(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAGREAT, "mangagreat.com")

@ -0,0 +1,15 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAHENTAI", "Manga Hentai", "en")
internal class MangaHentai(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAHENTAI, "mangahentai.me", 20) {
override val isNsfwSource = true
override val tagPrefix = "manga-hentai-genre/"
}

@ -0,0 +1,11 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAKING", "MangaKing", "en")
internal class MangaKing(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAKING, "mangaking.net")

@ -0,0 +1,11 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAKIO", "Manga Kio", "en")
internal class MangaKio(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAKIO, "mangakio.me", 10)

@ -0,0 +1,11 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAKISS", "Manga Kiss", "en")
internal class MangaKiss(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAKISS, "mangakiss.org", 10)

@ -8,4 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGA_KOMI", "MangaKomi", "en")
internal class MangaKomi(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGA_KOMI, "mangakomi.io", pageSize = 18)
MadaraParser(context, MangaSource.MANGA_KOMI, "mangakomi.io", pageSize = 18) {
override val datePattern = "MMMM dd, yyyy"
}

@ -0,0 +1,17 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALEVELING", "Manga Leveling", "en")
internal class MangaLeveling(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGALEVELING, "mangaleveling.com", 30) {
override val postreq = true
override val tagPrefix = "comics-genre/"
override val datePattern = "MM/dd/yyyy"
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAMANIACS", "MangaManiacs", "en")
internal class MangaManiacs(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAMANIACS, "mangamaniacs.org", 10) {
override val isNsfwSource = true
}

@ -0,0 +1,11 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAONLINETEAM", "Manga Online Team", "en")
internal class MangaOnlineTeam(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAONLINETEAM, "mangaonlineteam.com", 10)

@ -1,27 +1,9 @@
package org.koitharu.kotatsu.parsers.site.madara.en
import androidx.collection.arraySetOf
import org.jsoup.nodes.Element
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.exception.ParseException
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.model.MangaState
import org.koitharu.kotatsu.parsers.model.MangaTag
import org.koitharu.kotatsu.parsers.model.RATING_UNKNOWN
import org.koitharu.kotatsu.parsers.model.SortOrder
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.attrAsAbsoluteUrl
import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrl
import org.koitharu.kotatsu.parsers.util.generateUid
import org.koitharu.kotatsu.parsers.util.mapToSet
import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.removeSuffix
import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow
import org.koitharu.kotatsu.parsers.util.selectLastOrThrow
import org.koitharu.kotatsu.parsers.util.urlBuilder
import java.util.EnumSet
@MangaSourceParser("MANGAREAD", "MangaRead", "en")
internal class MangaRead(context: MangaLoaderContext) :
@ -29,103 +11,6 @@ internal class MangaRead(context: MangaLoaderContext) :
override val tagPrefix = "genres/"
override val datePattern = "dd.MM.yyyy"
private val nsfwTags = arraySetOf("yaoi", "yuri", "mature")
override val withoutAjax = true
init {
paginator.firstPage = 1
searchPaginator.firstPage = 1
}
override val sortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.UPDATED,
SortOrder.POPULARITY,
SortOrder.ALPHABETICAL,
SortOrder.RATING,
SortOrder.POPULARITY,
)
override suspend fun getListPage(
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
val url = urlBuilder()
.addPathSegment("page")
.addPathSegment(page.toString())
.addQueryParameter("s", query.orEmpty())
.addQueryParameter("post_type", "wp-manga")
tags?.forEachIndexed { index, tag ->
url.addQueryParameter("genre[$index]", tag.key)
}
url.addQueryParameter("op", "")
.addQueryParameter("author", "")
.addQueryParameter("artist", "")
.addQueryParameter("release", "")
.addQueryParameter("adult", "")
if (query.isNullOrEmpty()) {
url.addQueryParameter(
"&m_orderby=",
when (sortOrder) {
SortOrder.RATING -> "trending"
SortOrder.ALPHABETICAL -> "alphabet"
SortOrder.POPULARITY -> "views"
SortOrder.NEWEST -> "new-manga"
SortOrder.UPDATED -> "latest"
},
)
}
val body = webClient.httpGet(url.build()).parseHtml().body()
val root = body.selectFirst(".search-wrap") ?: if (body.selectFirst(".not-found-content") != null) {
return emptyList()
} else {
throw ParseException(".search-wrap not found", body.baseUri())
}
return root.select(".c-tabs-item__content").map { div ->
val a = div.selectFirstOrThrow("a")
val img = div.selectLastOrThrow("img")
val href = a.attrAsRelativeUrl("href")
val postContent = root.selectFirstOrThrow(".post-content")
val tagSet = postContent.getElementsContainingOwnText("Genre")
.firstOrNull()?.tableValue()
?.getElementsByAttributeValueContaining("href", tagPrefix)
?.mapToSet { it.asMangaTag() }.orEmpty()
Manga(
id = generateUid(href),
title = a.attr("title"),
altTitle = postContent.getElementsContainingOwnText("Alternative")
.firstOrNull()?.tableValue()?.text()?.trim(),
url = href,
publicUrl = a.attrAsAbsoluteUrl("href"),
coverUrl = img.src().orEmpty(),
author = postContent.getElementsContainingOwnText("Author")
.firstOrNull()?.tableValue()?.text()?.trim(),
state = postContent.getElementsContainingOwnText("Status")
.firstOrNull()?.tableValue()?.text()?.asMangaState(),
isNsfw = isNsfw(tagSet),
rating = div.selectFirstOrThrow(".score").text()
.toFloatOrNull()?.div(5f) ?: RATING_UNKNOWN,
tags = tagSet,
source = source,
)
}
}
private fun isNsfw(tags: Set<MangaTag>): Boolean {
return tags.any { it.key in nsfwTags }
}
private fun String.asMangaState() = when (trim().lowercase(sourceLocale)) {
"ongoing" -> MangaState.ONGOING
"completed" -> MangaState.FINISHED
else -> null
}
private fun Element.asMangaTag() = MangaTag(
title = ownText(),
key = attr("href").removeSuffix('/').substringAfterLast('/')
.replace('-', '+'),
source = source,
)
}

@ -0,0 +1,15 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAREADCO", "Manga Read Co", "en")
internal class MangaReadCo(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAREADCO, "mangaread.co", 16) {
override val tagPrefix = "m-genre/"
override val datePattern = "yyyy-MM-dd"
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAREADING", "MangaReading", "en")
internal class MangaReading(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAREADING, "mangareading.org") {
override val datePattern = "dd.MM.yyyy"
}

@ -8,4 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAROCK", "MangaRock", "en")
internal class MangaRock(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAROCK, "mangarockteam.com")
MadaraParser(context, MangaSource.MANGAROCK, "mangarockteam.com") {
override val datePattern = "MMMM dd, yyyy"
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAROCKY", "Manga Rocky", "en")
internal class MangaRocky(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAROCKY, "mangarocky.com") {
override val postreq = true
}

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAROLLS", "MangaRolls", "en")
internal class MangaRolls(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAROLLS, "mangarolls.net")

@ -10,4 +10,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class MangaRosie(context: MangaLoaderContext) : MadaraParser(
context, MangaSource.MANGAROSIE, "mangarosie.in",
pageSize = 16,
)
) {
override val datePattern = "MMMM dd, yyyy"
}

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGASUSHI", "MangaSushi", "en")
internal class MangaSushi(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASUSHI, "mangasushi.org")

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGATONE", "MangaTone", "en")
internal class MangaTone(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGATONE, "mangatone.com") {
override val postreq = true
}

@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGATX", "MangaTx", "en")
internal class MangaTx(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGATX, "mangatx.com")
internal class MangaTx(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGATX, "mangatx.com") {
override val datePattern = "MMMM dd, yyyy"
}

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGATXUNOFFICIAL", "Manga Tx ( Unofficial )", "en")
internal class MangaTxUnofficial(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGATXUNOFFICIAL, "manga-tx.com")

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAVISA", "MangaVisa", "en")
internal class MangaVisa(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAVISA, "mangavisa.com") {
override val withoutAjax = true
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAGG", "Mangagg", "en")
internal class Mangagg(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAGG, "mangagg.com") {
override val tagPrefix = "genre/"
override val datePattern = "MM/dd/yyyy"
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAK2", "Mangak2", "en")
internal class Mangak2(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAK2, "mangak2.com", 10) {
override val isNsfwSource = true
}

@ -8,7 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGASTIC", "Mangastic", "en")
internal class Mangastic(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASTIC, "mangastic.cc", 20) {
override val datePattern = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.MANGASTIC, "mangastic.cc", 20)

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGASTIC9", "Mangastic9", "en")
internal class Mangastic9(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASTIC9, "mangastic.cc", 20)

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAUS", "Mangaus", "en")
internal class Mangaus(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAUS, "mangaus.xyz") {
override val withoutAjax = true
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAX1", "Mangax1", "en")
internal class Mangax1(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAX1, "mangax1.com") {
override val postreq = true
}

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHUAZONE", "ManhuaZone", "en")
internal class ManhuaZone(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHUAZONE, "manhuazone.net")

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHUAES", "Manhuaes", "en")
internal class Manhuaes(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHUAES, "manhuaes.com") {
override val postreq = true
}

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHUAFAST", "Manhuafast", "en")
internal class Manhuafast(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHUAFAST, "manhuafast.com")

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHUAGA", "Manhuaga", "en")
internal class Manhuaga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHUAGA, "manhuaga.com")

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHUAHOT", "Manhuahot", "en")
internal class Manhuahot(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHUAHOT, "manhuahot.com", 10)

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHUAMIX", "Manhuamix", "en")
internal class Manhuamix(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHUAMIX, "manhuamix.com", 20) {
override val tagPrefix = "manhua-genre/"
}

@ -0,0 +1,39 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.exception.ParseException
import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.model.MangaPage
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.domain
import org.koitharu.kotatsu.parsers.util.generateUid
import org.koitharu.kotatsu.parsers.util.parseFailed
import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
import org.koitharu.kotatsu.parsers.util.toRelativeUrl
@MangaSourceParser("MANHUAPLUS", "Manhuaplus", "en")
internal class Manhuaplus(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHUAPLUS, "manhuaplus.com") {
override val withoutAjax = true
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
val root = doc.body().selectFirst("div.main-col-inner")?.selectFirst("div.reading-content")
?: throw ParseException("Root not found", fullUrl)
return root.select("img").map { img ->
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found")
MangaPage(
id = generateUid(url),
url = url,
preview = null,
source = source,
)
}
}
}

@ -0,0 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHUAUS", "Manhuaus", "en")
internal class Manhuaus(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHUAUS, "manhuaus.com")

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHWA18APP", "Manhwa18 App", "en")
internal class Manhwa18App(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWA18APP, "manhwa18.app") {
override val isNsfwSource = true
override val postreq = true
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHWA18ORG", "Manhwa18 Org", "en")
internal class Manhwa18Org(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWA18ORG, "manhwa18.org") {
override val isNsfwSource = true
override val postreq = true
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHWA68", "Manhwa 68", "en")
internal class Manhwa68(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWA68, "manhwa68.com") {
override val isNsfwSource = true
}

@ -8,4 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHWACLAN", "ManhwaClan", "en")
internal class ManhwaClan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWACLAN, "manhwaclan.com", pageSize = 10)
MadaraParser(context, MangaSource.MANHWACLAN, "manhwaclan.com", pageSize = 10) {
override val datePattern = "MMMM dd, yyyy"
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHWAFULL", "ManhwaFull", "en")
internal class ManhwaFull(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWAFULL, "manhwafull.com") {
override val datePattern = "MM/dd/yyyy"
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHWAHENTAI", "Manhwa Hentai", "en")
internal class ManhwaHentai(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWAHENTAI, "manhwahentai.me", 20) {
override val isNsfwSource = true
override val tagPrefix = "webtoon-genre/"
}

@ -8,7 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHWAKOOL", "Manhwa Kool", "en")
internal class ManhwaKool(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWAKOOL, "manhwakool.com", pageSize = 10) {
override val datePattern: String = "MMMM d, yyyy"
}
MadaraParser(context, MangaSource.MANHWAKOOL, "manhwakool.com", pageSize = 10)

@ -0,0 +1,58 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.jsoup.nodes.Document
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrlOrNull
import org.koitharu.kotatsu.parsers.util.domain
import org.koitharu.kotatsu.parsers.util.generateUid
import org.koitharu.kotatsu.parsers.util.mapChapters
import org.koitharu.kotatsu.parsers.util.parseFailed
import org.koitharu.kotatsu.parsers.util.parseHtml
import java.text.SimpleDateFormat
@MangaSourceParser("MANHWATOP", "ManhwaTop", "en")
internal class ManhwaTop(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWATOP, "manhwatop.com") {
override val postreq = true
override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> {
val mangaId = document.select("div#manga-chapters-holder").attr("data-id")
val url = "https://$domain/wp-admin/admin-ajax.php"
val postdata = "action=manga_get_chapters&manga=$mangaId"
val doc = webClient.httpPost(url, postdata).parseHtml()
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
return doc.select(selectchapter).mapChapters(reversed = true) { i, li ->
val a = li.selectFirst("a")
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
val link = href + stylepage
val dateText = li.selectFirst("a.c-new-tag")?.attr("title") ?: li.selectFirst(selectdate)?.text()
val name = a.selectFirst("p")?.text() ?: a.ownText()
val dateText2 = if (dateText != "Complete") {
dateText
} else {
null
}
MangaChapter(
id = generateUid(href),
url = link,
name = name,
number = i + 1,
branch = null,
uploadDate = parseChapterDate(
dateFormat,
dateText2,
),
scanlator = null,
source = source,
)
}
}
}

@ -0,0 +1,11 @@
package org.koitharu.kotatsu.parsers.site.madara.pt
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANHWAWORLD", "Manhwa World", "en")
internal class ManhwaWorld(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWAWORLD, "manhwaworld.com")

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save