add new source and add other

pull/208/head
devi 3 years ago
parent 31476a55f9
commit c2e90a210c

@ -202,7 +202,7 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(
private fun parseChapters(root: Element): List<MangaChapter> { private fun parseChapters(root: Element): List<MangaChapter> {
return root.requireElementById("chapters_content") return root.requireElementById("chapters_content")
.select(".component-chapter").map { div -> .select(".component-chapter").map { div ->
val a = div.selectFirstOrThrow("a") val a = div.selectFirstOrThrow("a:not([style*='display:none'])")
val href = a.attrAsRelativeUrl("href") val href = a.attrAsRelativeUrl("href")
val title = div.selectFirstOrThrow(".chapter_volume").text() val title = div.selectFirstOrThrow(".chapter_volume").text()
val name = div.selectFirst(".chapter_title")?.textOrNull() val name = div.selectFirst(".chapter_title")?.textOrNull()

@ -51,11 +51,14 @@ internal abstract class MadaraParser(
override val sortOrders: Set<SortOrder> = EnumSet.of( override val sortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.UPDATED, SortOrder.UPDATED,
SortOrder.POPULARITY, SortOrder.POPULARITY,
SortOrder.NEWEST,
SortOrder.ALPHABETICAL,
) )
protected open val tagPrefix = "manga-genre/" protected open val tagPrefix = "manga-genre/"
protected open val isNsfwSource = false protected open val isNsfwSource = false
protected open val datePattern = "MMMM dd, yyyy" protected open val datePattern = "MMMM dd, yyyy"
protected open val stylepage = "?style=list"
protected open val postreq = false protected open val postreq = false
@ -87,6 +90,7 @@ internal abstract class MadaraParser(
"En cours", "En cours",
"En cours \uD83D\uDFE2", "En cours \uD83D\uDFE2",
"En cours de publication", "En cours de publication",
"Activo",
"Đang tiến hành", "Đang tiến hành",
"Em lançamento", "Em lançamento",
"em lançamento", "em lançamento",
@ -95,6 +99,7 @@ internal abstract class MadaraParser(
"Publishing", "Publishing",
"Devam Ediyor", "Devam Ediyor",
"Em Andamento", "Em Andamento",
"Em andamento",
"In Corso", "In Corso",
"Güncel", "Güncel",
"Berjalan", "Berjalan",
@ -149,11 +154,19 @@ internal abstract class MadaraParser(
val tag = tags.oneOrThrowIfMany() val tag = tags.oneOrThrowIfMany()
val payload = createRequestTemplate() val payload = createRequestTemplate()
payload["page"] = page.toString() payload["page"] = page.toString()
payload["vars[meta_key]"] = when (sortOrder) { when (sortOrder) {
SortOrder.POPULARITY -> "_wp_manga_views" SortOrder.POPULARITY -> payload["vars[meta_key]"] = "_wp_manga_views"
SortOrder.UPDATED -> "_latest_update" SortOrder.UPDATED -> payload["vars[meta_key]"] = "_latest_update"
else -> "_wp_manga_views" SortOrder.NEWEST -> payload["vars[meta_key]"] = ""
SortOrder.ALPHABETICAL -> {
payload["vars[orderby]"] = "post_title"
payload["vars[order]"] = "ASC"
} }
else -> payload["vars[meta_key]"] = "_latest_update"
}
payload["vars[wp-manga-genre]"] = tag?.key.orEmpty() payload["vars[wp-manga-genre]"] = tag?.key.orEmpty()
payload["vars[s]"] = query?.urlEncoded().orEmpty() payload["vars[s]"] = query?.urlEncoded().orEmpty()
val doc = webClient.httpPost( val doc = webClient.httpPost(
@ -183,9 +196,9 @@ internal abstract class MadaraParser(
author = summary?.selectFirst(".mg_author")?.selectFirst("a")?.ownText(), author = summary?.selectFirst(".mg_author")?.selectFirst("a")?.ownText(),
state = when (summary?.selectFirst(".mg_status")?.selectFirst(".summary-content")?.ownText()?.trim() state = when (summary?.selectFirst(".mg_status")?.selectFirst(".summary-content")?.ownText()?.trim()
?.lowercase()) { ?.lowercase()) {
"مستمرة", "En curso", "En Curso", "Ongoing", "OnGoing", "On going", "Ativo", "En Cours", "En cours", "مستمرة", "En curso", "En Curso", "Ongoing", "OnGoing", "On going", "Ativo", "En Cours", "En cours", "Activo",
"En cours \uD83D\uDFE2", "En cours de publication", "Đang tiến hành", "Em lançamento", "em lançamento", "Em Lançamento", "En cours \uD83D\uDFE2", "En cours de publication", "Đang tiến hành", "Em lançamento", "em lançamento", "Em Lançamento",
"Онгоінг", "Publishing", "Devam Ediyor", "Em Andamento", "In Corso", "Güncel", "Berjalan", "Продолжается", "Updating", "Онгоінг", "Publishing", "Devam Ediyor", "Em Andamento", "Em andamento", "In Corso", "Güncel", "Berjalan", "Продолжается", "Updating",
"Lançando", "In Arrivo", "Emision", "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "Publicando", "连载中", "Lançando", "In Arrivo", "Emision", "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "Publicando", "连载中",
"Devam ediyor", "Devam ediyor",
-> MangaState.ONGOING -> MangaState.ONGOING
@ -228,6 +241,12 @@ internal abstract class MadaraParser(
} }
} }
protected open val selectdesc =
"div.description-summary div.summary__content, div.summary_content div.post-content_item > h5 + div, div.summary_content div.manga-excerpt, div.post-content div.manga-summary, div.post-content div.desc, div.c-page__content div.summary__content"
protected open val selectgenre = "div.genres-content a"
protected open val selectdate = "span.chapter-release-date i"
protected open val selectchapter = "li.wp-manga-chapter"
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)
val doc = webClient.httpGet(fullUrl).parseHtml() val doc = webClient.httpGet(fullUrl).parseHtml()
@ -240,23 +259,27 @@ internal abstract class MadaraParser(
async { getChapters(manga, doc) } async { getChapters(manga, doc) }
} }
val desc = doc.body().selectFirst("div.description-summary div.summary__content") ?: doc.body() val desc = doc.select(selectdesc).let {
.selectFirst("div.summary_content div.post-content_item > h5 + div") ?: doc.body() if (it.select("p").text().isNotEmpty()) {
.selectFirst("div.post-content div.manga-summary") ?: doc.body() it.select("p").joinToString(separator = "\n\n") { p ->
.selectFirst("div.post-content div.desc") ?: doc.body() p.text().replace("<br>", "\n")
.selectFirst("div.summary_content div.manga-excerpt") }
} else {
it.text()
}
}
val stateselect = val stateselect =
doc.body().select("div.post-content_item:contains(Status) > div.summary-content").last() ?: doc.body() doc.body().select("div.post-content_item:contains(Status) > div.summary-content").last() ?: doc.body()
.select("div.post-content_item:contains(Statut) > div.summary-content").last() .select("div.post-content_item:contains(Statut) > div.summary-content").last() ?: doc.body()
?: doc.body().select("div.post-content_item:contains(حالة العمل) > div.summary-content").last() .select("div.post-content_item:contains(حالة العمل) > div.summary-content").last() ?: doc.body()
?: doc.body().select("div.post-content_item:contains(Estado) > div.summary-content").last() .select("div.post-content_item:contains(Estado) > div.summary-content").last() ?: doc.body()
?: doc.body().select("div.post-content_item:contains(สถานะ) > div.summary-content").last() ?: doc.body() .select("div.post-content_item:contains(สถานะ) > div.summary-content").last() ?: doc.body()
.select("div.post-content_item:contains(Stato) > div.summary-content").last() .select("div.post-content_item:contains(Stato) > div.summary-content").last() ?: doc.body()
?: doc.body().select("div.post-content_item:contains(Durum) > div.summary-content").last() ?: doc.body() .select("div.post-content_item:contains(Durum) > div.summary-content").last() ?: doc.body()
.select("div.post-content_item:contains(Statüsü) > div.summary-content").last() .select("div.post-content_item:contains(Statüsü) > div.summary-content").last() ?: doc.body()
?: doc.body().select("div.summary-content").last() .select("div.post-content_item:contains(状态) > div.summary-content").last() ?: doc.body()
.select("div.summary-content").last()
val state = val state =
stateselect?.let { stateselect?.let {
@ -267,20 +290,21 @@ internal abstract class MadaraParser(
} }
} }
val alt =
doc.body().select(".post-content_item:contains(Alt) .summary-content").firstOrNull()?.tableValue()?.text()
?.trim() ?: doc.body().select(".post-content_item:contains(Nomes alternativos: ) .summary-content")
.firstOrNull()?.tableValue()?.text()?.trim()
manga.copy( manga.copy(
tags = doc.body().select("div.genres-content a").mapNotNullToSet { a -> tags = doc.body().select(selectgenre).mapNotNullToSet { a ->
MangaTag( MangaTag(
key = a.attr("href").removeSuffix("/").substringAfterLast('/'), key = a.attr("href").removeSuffix("/").substringAfterLast('/'),
title = a.text().toTitleCase(), title = a.text().toTitleCase(),
source = source, source = source,
) )
}, },
description = desc?.select("p")?.filterNot { it.ownText().startsWith("A brief description") } description = desc,
?.joinToString { it.text() }, altTitle = alt,
altTitle =
doc.body().select(".post-content_item:contains(Alt) .summary-content").firstOrNull()?.tableValue()?.text()
?.trim() ?: doc.body().select(".post-content_item:contains(Nomes alternativos: ) .summary-content")
.firstOrNull()?.tableValue()?.text()?.trim(),
state = state, state = state,
chapters = chaptersDeferred.await(), chapters = chaptersDeferred.await(),
) )
@ -289,10 +313,10 @@ internal abstract class MadaraParser(
protected open suspend fun getChapters(manga: Manga, doc: Document): List<MangaChapter> { protected open suspend fun getChapters(manga: Manga, doc: Document): List<MangaChapter> {
val root2 = doc.body().selectFirstOrThrow("div.content-area") val root2 = doc.body().selectFirstOrThrow("div.content-area")
val dateFormat = SimpleDateFormat(datePattern, sourceLocale) val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
return root2.select("li.wp-manga-chapter").mapChapters(reversed = true) { i, li -> return root2.select(selectchapter).mapChapters(reversed = true) { i, li ->
val a = li.selectFirst("a") val a = li.selectFirst("a")
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing") val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
val link = href + "?style=list" val link = href + stylepage
MangaChapter( MangaChapter(
id = generateUid(href), id = generateUid(href),
name = a.ownText(), name = a.ownText(),
@ -300,7 +324,7 @@ internal abstract class MadaraParser(
url = link, url = link,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(
dateFormat, dateFormat,
li.selectFirst("span.chapter-release-date i")?.text(), li.selectFirst(selectdate)?.text(),
), ),
source = source, source = source,
scanlator = null, scanlator = null,
@ -323,19 +347,19 @@ internal abstract class MadaraParser(
} }
val dateFormat = SimpleDateFormat(datePattern, sourceLocale) val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
return doc.select("li.wp-manga-chapter").mapChapters(reversed = true) { i, li -> return doc.select(selectchapter).mapChapters(reversed = true) { i, li ->
val a = li.selectFirst("a") val a = li.selectFirst("a")
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing") val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
val link = href + "?style=list" val link = href + stylepage
MangaChapter( MangaChapter(
id = generateUid(href), id = generateUid(href),
url = link, url = link,
name = a.text(), name = a.ownText(),
number = i + 1, number = i + 1,
branch = null, branch = null,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(
dateFormat, dateFormat,
li.selectFirst("span.chapter-release-date i")?.text(), li.selectFirst(selectdate)?.text(),
), ),
scanlator = null, scanlator = null,
source = source, source = source,
@ -370,6 +394,10 @@ internal abstract class MadaraParser(
date.endsWith(" atrás", ignoreCase = true) -> { date.endsWith(" atrás", ignoreCase = true) -> {
parseRelativeDate(date) parseRelativeDate(date)
} }
// other translated 'ago' in Portuguese.
date.startsWith("", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Handle translated 'ago' in Turkish. // Handle translated 'ago' in Turkish.
date.endsWith(" önce", ignoreCase = true) -> { date.endsWith(" önce", ignoreCase = true) -> {
parseRelativeDate(date) parseRelativeDate(date)
@ -390,10 +418,31 @@ internal abstract class MadaraParser(
date.endsWith(" d", ignoreCase = true) -> { date.endsWith(" d", ignoreCase = true) -> {
parseRelativeDate(date) parseRelativeDate(date)
} }
//If there is no ago but just a motion of time
date.endsWith(" días", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" día", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" horas", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" hora", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" mins", ignoreCase = true) -> { date.endsWith(" minutos", ignoreCase = true) -> {
parseRelativeDate(date) parseRelativeDate(date)
} }
date.endsWith(" minuto", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Handle 'yesterday' and 'today', using midnight // Handle 'yesterday' and 'today', using midnight
date.startsWith("year", ignoreCase = true) -> { date.startsWith("year", ignoreCase = true) -> {
Calendar.getInstance().apply { Calendar.getInstance().apply {
@ -446,7 +495,7 @@ internal abstract class MadaraParser(
"d", "d",
).anyWordIn(date) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis ).anyWordIn(date) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis
WordSet("jam", "saat", "heure", "hora", "hour", "h").anyWordIn(date) -> cal.apply { WordSet("jam", "saat", "heure", "hora", "horas", "hour", "h").anyWordIn(date) -> cal.apply {
add( add(
Calendar.HOUR, Calendar.HOUR,
-number, -number,

@ -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("ARABTOONS", "Arab Toons", "ar")
internal class ArabToons(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ARABTOONS, "arabtoons.net") {
override val isNsfwSource = true
override val datePattern = "dd-MM-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("ASQORG", "3Asq", "ar")
internal class Asq(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ASQORG, "3asq.org") {
override val datePattern = "d MMMM، yyyy"
}

@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("AZORANOV", "Azoranov", "ar") @MangaSourceParser("AZORANOV", "Azoranov", "ar")
internal class Azoranov(context: MangaLoaderContext) : internal class Azoranov(context: MangaLoaderContext) :
@ -13,5 +12,4 @@ internal class Azoranov(context: MangaLoaderContext) :
override val tagPrefix = "novel-genre/" override val tagPrefix = "novel-genre/"
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("ar", "AR")
} }

@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("GATEMANGA", "Gate Manga", "ar") @MangaSourceParser("GATEMANGA", "Gate Manga", "ar")
internal class GateManga(context: MangaLoaderContext) : internal class GateManga(context: MangaLoaderContext) :
@ -13,5 +12,4 @@ internal class GateManga(context: MangaLoaderContext) :
override val postreq = true override val postreq = true
override val datePattern = "d MMMM، yyyy" override val datePattern = "d MMMM، yyyy"
override val sourceLocale: Locale = Locale("ar", "AR")
} }

@ -7,7 +7,5 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALEK", "MangaLek", "ar") @MangaSourceParser("MANGALEK", "MangaLek", "ar")
internal class MangaLek(context: MangaLoaderContext) : MadaraParser( internal class MangaLek(context: MangaLoaderContext) :
context, MangaSource.MANGALEK, "mangalek.com", MadaraParser(context, MangaSource.MANGALEK, "mangalek.com", pageSize = 20)
pageSize = 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("MANGALIONZ", "Manga Lionz", "ar")
internal class MangaLionz(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGALIONZ, "mangalionz.com", pageSize = 10) {
override val datePattern = "MMMM d, 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("MANGASTARZ", "Manga Starz", "ar")
internal class MangaStarz(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASTARZ, "mangastarz.com", pageSize = 10) {
override val datePattern = "d MMMM، yyyy"
}

@ -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("MANGASPARK", "Mangaspark", "ar")
internal class Mangaspark(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASPARK, "mangaspark.com", pageSize = 10) {
override val postreq = true
override val datePattern = "d MMMM، 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
import java.util.Locale
@MangaSourceParser("MANHATIC", "Manhatic", "ar")
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
}

@ -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("NIJITRANSLATIONS", "Niji Translations", "ar")
internal class NijiTranslations(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NIJITRANSLATIONS, "niji-translations.com") {
override val postreq = true
override val datePattern = "MMMM d, 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("NOVELSTOWN", "Novelstown", "ar")
internal class Novelstown(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NOVELSTOWN, "novelstown.cyou") {
override val datePattern = "d MMMM، yyyy"
}

@ -5,12 +5,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("WEBTOONEMPIRE", "Webtoon Empire", "ar") @MangaSourceParser("WEBTOONEMPIRE", "Webtoon Empire", "ar")
internal class WebtoonEmpire(context: MangaLoaderContext) : internal class WebtoonEmpire(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.WEBTOONEMPIRE, "webtoonempire.org", pageSize = 10) { MadaraParser(context, MangaSource.WEBTOONEMPIRE, "webtoonempire.org", pageSize = 10) {
override val datePattern = "d MMMM yyyy" override val datePattern = "d MMMM yyyy"
override val sourceLocale: Locale = Locale("ar", "AR")
} }

@ -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("IMMORTALUPDATES", "Immortal Updates", "en")
internal class ImmortalUpdates(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.IMMORTALUPDATES, "immortalupdates.com") {
override val datePattern = "MMMM d, yyyy"
}

@ -0,0 +1,172 @@
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.Manga
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.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.mapChapters
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
import java.text.SimpleDateFormat
import java.util.EnumSet
@MangaSourceParser("ISEKAISCAN", "Isekai Scan", "en")
internal class IsekaiScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ISEKAISCAN, "isekaiscan.top", 16) {
override val tagPrefix = "mangas/"
override val datePattern = "MMMM d, HH:mm"
override val sortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.POPULARITY,
SortOrder.UPDATED,
)
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("/?search=")
append(query.urlEncoded())
append("&page=")
append(pages.toString())
append("&post_type=wp-manga")
}
!tags.isNullOrEmpty() -> {
append("/mangas/")
for (tag in tags) {
append(tag.key)
}
append("?orderby=2&page=")
append(pages.toString())
}
else -> {
if (sortOrder == SortOrder.POPULARITY) {
append("/popular-manga")
}
if (sortOrder == SortOrder.UPDATED) {
append("/latest-manga")
}
append("?page=")
append(pages.toString())
}
}
}
val doc = webClient.httpGet(url).parseHtml()
return doc.select("div.row.c-tabs-item__content").ifEmpty {
doc.select("div.page-item-detail.manga")
}.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"))?.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()?.trim()
?.lowercase()) {
"مستمرة", "En curso", "En Curso", "Ongoing", "OnGoing", "On going", "Ativo", "En Cours", "En cours", "Activo",
"En cours \uD83D\uDFE2", "En cours de publication", "Đang tiến hành", "Em lançamento", "em lançamento", "Em Lançamento",
"Онгоінг", "Publishing", "Devam Ediyor", "Em Andamento", "Em andamento", "In Corso", "Güncel", "Berjalan", "Продолжается", "Updating",
"Lançando", "In Arrivo", "Emision", "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "Publicando", "连载中",
"Devam ediyor",
-> MangaState.ONGOING
"Completed", "Completo", "Complété", "Fini", "Achevé", "Terminé", "Terminé ⚫", "Tamamlandı", "Đã hoàn thành", "Hoàn Thành", "مكتملة",
"Завершено", "Finished", "Finalizado", "Completata", "One-Shot", "Bitti", "Tamat", "Completado", "Concluído", "Concluido", "已完结", "Bitmiş",
-> MangaState.FINISHED
else -> null
},
source = source,
isNsfw = isNsfwSource,
)
}
}
override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> {
val mangaId = document.select("div[id^=manga-chapters-holder]").attr("data-id")
val doc = webClient.httpGet("https://$domain/ajax-list-chapter?mangaID=$mangaId").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
MangaChapter(
id = generateUid(href),
url = link,
name = a.ownText(),
number = i + 1,
branch = null,
uploadDate = parseChapterDate(
dateFormat,
li.selectFirst(selectdate)?.text(),
),
scanlator = null,
source = source,
)
}
}
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
val urlarray = doc.select("p#arraydata").text().split(",").toTypedArray()
return urlarray.map { url ->
MangaPage(
id = generateUid(url),
url = url,
preview = null,
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("ITSYOURIGHTMANHUA", "Itsyourightmanhua", "en")
internal class Itsyourightmanhua(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ITSYOURIGHTMANHUA, "itsyourightmanhua.com", 10) {
override val datePattern = "MMMM d, yyyy"
}

@ -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("KSGROUPSCANS", "Ks Group Scans", "en")
internal class KsGroupScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KSGROUPSCANS, "ksgroupscans.com") {
override val datePattern = "MMMM d, yyyy"
}

@ -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("KUNMANGA", "Kun Manga", "en")
internal class KunManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KUNMANGA, "kunmanga.com", 10) {
override val datePattern = "MMMM d, 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("LADYMANGA", "Lady Manga", "en")
internal class LadyManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LADYMANGA, "ladymanga.com") {
override val datePattern = "MMMM d, yyyy"
}

@ -0,0 +1,16 @@
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("LILYMANGA", "LilyManga", "en")
internal class LilyManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LILYMANGA, "lilymanga.net") {
override val isNsfwSource = true
override val tagPrefix = "ys-genre/"
override val datePattern = "yyyy-MM-dd"
}

@ -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("LOLICONMOBI", "LoliconMobi", "en")
internal class LoliconMobi(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LOLICONMOBI, "lolicon.mobi") {
override val postreq = true
override val isNsfwSource = true
override val tagPrefix = "lolicon-genre/"
override val datePattern = "MMMM d, 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("LUXMANGA", "LuxManga", "en")
internal class LuxManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LUXMANGA, "luxmanga.net") {
override val datePattern = "MMMM d, 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("MANGAACTION", "Manga Action", "en")
internal class MangaAction(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAACTION, "mangaaction.com") {
override val datePattern = "MMMM d, 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("MANGAGALAXY", "Manga Galaxy", "en")
internal class MangaGalaxy(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAGALAXY, "mangagalaxy.me", 16) {
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("MANGASTIC", "Mangastic", "en")
internal class Mangastic(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASTIC, "mangastic.cc", 20) {
override val datePattern = "MMMM d, 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("TOONCHILL", "Toon Chill", "en")
internal class ToonChill(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.TOONCHILL, "toonchill.com", 32) {
override val datePattern = "MMMM d, yyyy"
}

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("APOLL_COMICS", "Apoll Comics", "es") @MangaSourceParser("APOLL_COMICS", "Apoll Comics", "es")
internal class ApollComics(context: MangaLoaderContext) : internal class ApollComics(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.APOLL_COMICS, "apollcomics.com", 10) { MadaraParser(context, MangaSource.APOLL_COMICS, "apollcomics.com", 10) {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("es")
} }

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("COPYPASTESCAN", "Copypastescan", "es") @MangaSourceParser("COPYPASTESCAN", "Copypastescan", "es")
internal class Copypastescan(context: MangaLoaderContext) : internal class Copypastescan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.COPYPASTESCAN, "copypastescan.xyz", 10) { MadaraParser(context, MangaSource.COPYPASTESCAN, "copypastescan.xyz", 10) {
override val datePattern = "d MMMM, yyyy" override val datePattern = "d MMMM, yyyy"
override val sourceLocale: Locale = Locale("es")
} }

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("DAPROB", "Daprob", "es") @MangaSourceParser("DAPROB", "Daprob", "es")
internal class Daprob(context: MangaLoaderContext) : internal class Daprob(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DAPROB, "daprob.com") { MadaraParser(context, MangaSource.DAPROB, "daprob.com") {
override val datePattern = "d 'de' MMMMM 'de' yyyy" override val datePattern = "d 'de' MMMMM 'de' yyyy"
override val sourceLocale: Locale = Locale("es")
} }

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("DOKKOMANGA", "Dokko Manga", "es") @MangaSourceParser("DOKKOMANGA", "Dokko Manga", "es")
internal class DokkoManga(context: MangaLoaderContext) : internal class DokkoManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DOKKOMANGA, "dokkomanga.com", 10) { MadaraParser(context, MangaSource.DOKKOMANGA, "dokkomanga.com", 10) {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("es")
} }

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("EMPERORSCAN", "Emperor Scan", "es") @MangaSourceParser("EMPERORSCAN", "Emperor Scan", "es")
internal class EmperorScan(context: MangaLoaderContext) : internal class EmperorScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.EMPERORSCAN, "dokkomanga.com") { MadaraParser(context, MangaSource.EMPERORSCAN, "dokkomanga.com") {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("es")
} }

@ -4,7 +4,6 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("EROMIAU", "Eromiau", "es") @MangaSourceParser("EROMIAU", "Eromiau", "es")
internal class Eromiau(context: MangaLoaderContext) : internal class Eromiau(context: MangaLoaderContext) :
@ -12,5 +11,4 @@ internal class Eromiau(context: MangaLoaderContext) :
override val isNsfwSource = true override val isNsfwSource = true
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("es")
} }

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("HERENSCAN", "Heren Scan", "es") @MangaSourceParser("HERENSCAN", "Heren Scan", "es")
internal class HerenScan(context: MangaLoaderContext) : internal class HerenScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HERENSCAN, "herenscan.com") { MadaraParser(context, MangaSource.HERENSCAN, "herenscan.com") {
override val datePattern = "d 'de' MMMMM 'de' yyyy" override val datePattern = "d 'de' MMMMM 'de' yyyy"
override val sourceLocale: Locale = Locale("es")
} }

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("INFRAFANDUB", "infrafandub", "es")
internal class Infrafandub(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.INFRAFANDUB, "infrafandub.xyz", 10) {
override val datePattern = "dd/MM/yyyy"
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("MANGAMUNDODRAMA", "Manga Mundo Drama", "es")
internal class MangaMundoDrama(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAMUNDODRAMA, "inmortalscan.com") {
override val datePattern = "MMMM d, yyyy"
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("MANGAPT", "Mangapt", "es")
internal class Mangapt(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAPT, "mangapt.com") {
override val datePattern = "dd/MM/yyyy"
}

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("MUNDO_MANHWA", "Mundo Manhwa", "es") @MangaSourceParser("MUNDO_MANHWA", "Mundo Manhwa", "es")
internal class MundoManhwa(context: MangaLoaderContext) : internal class MundoManhwa(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MUNDO_MANHWA, "mundomanhwa.com", 10) { MadaraParser(context, MangaSource.MUNDO_MANHWA, "mundomanhwa.com", 10) {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("es")
} }

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("NOBLESSETRANSLATIONS", "Noblesse Translations", "es")
internal class NoblesseTranslations(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NOBLESSETRANSLATIONS, "www.noblessetranslations.com") {
override val datePattern = "d MMMM, yyyy"
}

@ -0,0 +1,16 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("RAGNAROKSCAN", "Ragnarok Scan", "es")
internal class RagnarokScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.RAGNAROKSCAN, "ragnarokscan.com") {
override val stylepage = ""
override val tagPrefix = "genero/"
override val datePattern = "MMMM d, yyyy"
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("RAGNAROKSCANLATION", "Ragnarok Scanlation", "es")
internal class RagnarokScanlation(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.RAGNAROKSCANLATION, "ragnarokscanlation.com") {
override val datePattern = "MMMM d, yyyy"
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("SAMURAISCAN", "Samurai Scan", "es")
internal class SamuraiScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.SAMURAISCAN, "samuraiscan.com", 10) {
override val datePattern = "dd/MM/yyyy"
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("SCAMBERTRASLATOR", "Scambertraslator", "es")
internal class Scambertraslator(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.SCAMBERTRASLATOR, "scambertraslator.com") {
override val datePattern = "dd/MM/yyyy"
}

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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("TECNOSCANN", "TecnoScann", "es")
internal class TecnoScann(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.TECNOSCANN, "tecnoscann.com", 24) {
override val datePattern = "MMMM d, yyyy"
}

@ -0,0 +1,137 @@
package org.koitharu.kotatsu.parsers.site.madara.es
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
import java.util.EnumSet
@MangaSourceParser("VERMANHWA", "Vermanhwa", "es")
internal class Vermanhwa(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.VERMANHWA, "vermanhwa.es", 10) {
override val isNsfwSource = true
override val datePattern = "MMMM d, yyyy"
override val sortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.NEWEST,
SortOrder.ALPHABETICAL,
SortOrder.RATING,
SortOrder.POPULARITY,
SortOrder.UPDATED,
)
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("/manga-genre/")
for (tag in tags) {
append(tag.key)
}
append("/page/")
append(pages.toString())
}
else -> {
append("/manga/")
append("/page/")
append(pages.toString())
append("?m_orderby=")
if (sortOrder == SortOrder.NEWEST) {
append("new-manga")
}
if (sortOrder == SortOrder.ALPHABETICAL) {
append("alphabet")
}
if (sortOrder == SortOrder.RATING) {
append("rating")
}
if (sortOrder == SortOrder.POPULARITY) {
append("views")
}
if (sortOrder == SortOrder.UPDATED) {
append("latest")
}
}
}
}
val doc = webClient.httpGet(url).parseHtml()
return doc.select("div.row.c-tabs-item__content").ifEmpty {
doc.select("div.page-item-detail.manga")
}.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"))?.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()?.trim()
?.lowercase()) {
"مستمرة", "En curso", "En Curso", "Ongoing", "OnGoing", "On going", "Ativo", "En Cours", "En cours", "Activo",
"En cours \uD83D\uDFE2", "En cours de publication", "Đang tiến hành", "Em lançamento", "em lançamento", "Em Lançamento",
"Онгоінг", "Publishing", "Devam Ediyor", "Em Andamento", "Em andamento", "In Corso", "Güncel", "Berjalan", "Продолжается", "Updating",
"Lançando", "In Arrivo", "Emision", "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "Publicando", "连载中",
"Devam ediyor",
-> MangaState.ONGOING
"Completed", "Completo", "Complété", "Fini", "Achevé", "Terminé", "Terminé ⚫", "Tamamlandı", "Đã hoàn thành", "Hoàn Thành", "مكتملة",
"Завершено", "Finished", "Finalizado", "Completata", "One-Shot", "Bitti", "Tamat", "Completado", "Concluído", "Concluido", "已完结", "Bitmiş",
-> MangaState.FINISHED
else -> null
},
source = source,
isNsfw = isNsfwSource,
)
}
}
}

@ -11,5 +11,4 @@ internal class AstralManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ASTRALMANGA, "astral-manga.fr", pageSize = 12) { MadaraParser(context, MangaSource.ASTRALMANGA, "astral-manga.fr", pageSize = 12) {
override val datePattern = "dd/MM/yyyy" override val datePattern = "dd/MM/yyyy"
} }

@ -4,13 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("FRSCAN", "FrScan", "fr") @MangaSourceParser("FRSCAN", "FrScan", "fr")
internal class FrScan(context: MangaLoaderContext) : internal class FrScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.FRSCAN, "fr-scan.com") { MadaraParser(context, MangaSource.FRSCAN, "fr-scan.com") {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.FRENCH
} }

@ -1,20 +1,9 @@
package org.koitharu.kotatsu.parsers.site.madara.fr package org.koitharu.kotatsu.parsers.site.madara.fr
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.Manga
import org.koitharu.kotatsu.parsers.model.MangaSource 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.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.domain
import org.koitharu.kotatsu.parsers.util.mapNotNullToSet
import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
import org.koitharu.kotatsu.parsers.util.toTitleCase
import java.util.Locale
@MangaSourceParser("HENTAISCANTRADVF", "Hentai-Scantrad", "fr") @MangaSourceParser("HENTAISCANTRADVF", "Hentai-Scantrad", "fr")
internal class HentaiScantradVf(context: MangaLoaderContext) : internal class HentaiScantradVf(context: MangaLoaderContext) :
@ -22,42 +11,4 @@ internal class HentaiScantradVf(context: MangaLoaderContext) :
override val isNsfwSource = true override val isNsfwSource = true
override val datePattern = "d MMMM, yyyy" override val datePattern = "d MMMM, yyyy"
override val sourceLocale: Locale = Locale.FRENCH
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
val fullUrl = manga.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
val chaptersDeferred = async { loadChapters(manga.url, doc) }
val stateselect = doc.body().select("div.summary-content").last()
val state =
stateselect?.let {
when (it.text()) {
in ongoing -> MangaState.ONGOING
in finished -> MangaState.FINISHED
else -> null
}
}
val desc = doc.body().selectFirst("div.description-summary div.summary__content")?.text()
?: doc.body() .selectFirst("div.datas_synopsis")?.text()
manga.copy(
tags = doc.body().select("div.genres-content a").mapNotNullToSet { a ->
MangaTag(
key = a.attr("href").removeSuffix("/").substringAfterLast('/'),
title = a.text().toTitleCase(),
source = source,
)
},
description = desc,
altTitle =
doc.body().select(".post-content_item:contains(Alt) .summary-content").firstOrNull()?.tableValue()?.text()
?.trim() ?: doc.body().select(".post-content_item:contains(Nomes alternativos: ) .summary-content")
.firstOrNull()?.tableValue()?.text()?.trim(),
state = state,
chapters = chaptersDeferred.await(),
)
}
} }

@ -6,16 +6,12 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.domain import org.koitharu.kotatsu.parsers.util.domain
import org.koitharu.kotatsu.parsers.util.insertCookies import org.koitharu.kotatsu.parsers.util.insertCookies
import java.util.Locale
@MangaSourceParser("HHENTAIFR", "HhentaiFr", "fr") @MangaSourceParser("HHENTAIFR", "HhentaiFr", "fr")
internal class HhentaiFr(context: MangaLoaderContext) : internal class HhentaiFr(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HHENTAIFR, "hhentai.fr") { MadaraParser(context, MangaSource.HHENTAIFR, "hhentai.fr") {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.FRENCH
override val isNsfwSource = true override val isNsfwSource = true
init { init {

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.fr
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("KARATCAMSCANS", "Karatcam Scans", "fr")
internal class KaratcamScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KARATCAMSCANS, "karatcam-scans.fr") {
override val tagPrefix = "webtoon-genre/"
override val datePattern = "dd/MM/yyyy"
}

@ -0,0 +1,14 @@
package org.koitharu.kotatsu.parsers.site.madara.fr
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("MANGAHUB", "Manga Hub", "fr")
internal class MangaHub(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAHUB, "mangahub.fr") {
override val isNsfwSource = true
override val datePattern = "d MMMM yyyy"
}

@ -4,13 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("MANGA_SCANTRAD", "Manga Scantrad", "fr") @MangaSourceParser("MANGA_SCANTRAD", "Manga Scantrad", "fr")
internal class MangaScantrad(context: MangaLoaderContext) : internal class MangaScantrad(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGA_SCANTRAD, "manga-scantrad.io") { MadaraParser(context, MangaSource.MANGA_SCANTRAD, "manga-scantrad.io") {
override val datePattern = "d MMMM yyyy" override val datePattern = "d MMMM yyyy"
override val sourceLocale: Locale = Locale.FRENCH
} }

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.fr
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("MANGASCANTRADUNOFFICIAL", "Manga Scantrad ( Unofficial )", "fr")
internal class MangaScantradUnofficial(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASCANTRADUNOFFICIAL, "www.mangascantrad.fr", 10) {
override val datePattern = "dd/MM/yyyy"
}

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("MANGASORIGINES", "Mangas Origines", "fr") @MangaSourceParser("MANGASORIGINES", "Mangas Origines", "fr")
internal class MangasOrigines(context: MangaLoaderContext) : internal class MangasOrigines(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASORIGINES, "mangas-origines.fr") { MadaraParser(context, MangaSource.MANGASORIGINES, "mangas-origines.fr") {
override val datePattern = "dd/MM/yyyy" override val datePattern = "dd/MM/yyyy"
override val sourceLocale: Locale = Locale.FRENCH
} }

@ -4,14 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("MANGASORIGINESUNOFFICIAL", "Mangas Origines ( unofficial )", "fr") @MangaSourceParser("MANGASORIGINESUNOFFICIAL", "Mangas Origines ( unofficial )", "fr")
internal class MangasOriginesUnofficial(context: MangaLoaderContext) : internal class MangasOriginesUnofficial(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASORIGINESUNOFFICIAL, "mangas-origines.xyz") { MadaraParser(context, MangaSource.MANGASORIGINESUNOFFICIAL, "mangas-origines.xyz") {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.FRENCH
} }

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("PANTHEONSCAN", "Pantheon Scan", "fr") @MangaSourceParser("PANTHEONSCAN", "Pantheon Scan", "fr")
internal class PantheonScan(context: MangaLoaderContext) : internal class PantheonScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PANTHEONSCAN, "pantheon-scan.com") { MadaraParser(context, MangaSource.PANTHEONSCAN, "pantheon-scan.com") {
override val datePattern = "d MMMM yyyy" override val datePattern = "d MMMM yyyy"
override val sourceLocale: Locale = Locale.FRENCH
} }

@ -0,0 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.fr
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("RAIJINSCANS", "Raijin Scans", "fr")
internal class RaijinScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.RAIJINSCANS, "raijinscans.fr") {
override val datePattern = "dd/MM/yyyy"
}

@ -4,7 +4,6 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("SCANHENTAIMENU", "Scan Hentai Menu", "fr") @MangaSourceParser("SCANHENTAIMENU", "Scan Hentai Menu", "fr")
internal class ScanHentaiMenu(context: MangaLoaderContext) : internal class ScanHentaiMenu(context: MangaLoaderContext) :
@ -12,5 +11,4 @@ internal class ScanHentaiMenu(context: MangaLoaderContext) :
override val isNsfwSource = true override val isNsfwSource = true
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.FRENCH
} }

@ -10,6 +10,5 @@ internal class ScantradVf(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.SCANTRADVF, "scantrad-vf.co") { MadaraParser(context, MangaSource.SCANTRADVF, "scantrad-vf.co") {
override val datePattern = "d MMMM yyyy" override val datePattern = "d MMMM yyyy"
override val tagPrefix = "genre/" override val tagPrefix = "genre/"
} }

@ -0,0 +1,63 @@
package org.koitharu.kotatsu.parsers.site.madara.fr
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.attrAsRelativeUrl
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.parseHtml
import org.koitharu.kotatsu.parsers.util.removeSuffix
import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
import java.text.SimpleDateFormat
@MangaSourceParser("TOONFR", "Toon Fr", "fr")
internal class ToonFr(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.TOONFR, "toonfr.com") {
override val isNsfwSource = true
override val tagPrefix = "webtoon-genre/"
override val datePattern = "MMM d"
override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> {
val url = mangaUrl.toAbsoluteUrl(domain).removeSuffix('/') + "/ajax/chapters/"
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
val doc = webClient.httpPost(url, emptyMap()).parseHtml()
return doc.select("li.wp-manga-chapter").mapChapters(reversed = true) { i, li ->
val a = li.selectFirstOrThrow("a")
val href = a.attrAsRelativeUrl("href") + "?style=list"
// correct parse date missing a "."
val date_org = li.selectFirst("span.chapter-release-date i")?.text() ?: "janv 1, 2000"
val date_corect_parse = date_org
.replace("Jan", "janv.")
.replace("Févr", "févr.")
.replace("Avr", "avr.")
.replace("Juil", "juil.")
.replace("Sept", "sept.")
.replace("Nov", "nov.")
.replace("Oct", "oct.")
.replace("Déc", "déc.")
MangaChapter(
id = generateUid(href),
url = href,
name = a.text(),
number = i + 1,
branch = null,
uploadDate = parseChapterDate(
dateFormat,
date_corect_parse,
),
scanlator = null,
source = source,
)
}
}
}

@ -0,0 +1,15 @@
package org.koitharu.kotatsu.parsers.site.madara.id
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("KLIKMANGA", "Klik Manga", "id")
internal class KlikManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KLIKMANGA, "klikmanga.id", 36) {
override val isNsfwSource = true
override val tagPrefix = "genre/"
override val datePattern = "MMM d, yyyy"
}

@ -0,0 +1,16 @@
package org.koitharu.kotatsu.parsers.site.madara.id
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
import java.util.Locale
@MangaSourceParser("MGKOMIK", "Mgkomik", "id")
internal class Mgkomik(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MGKOMIK, "mgkomik.com", 20) {
override val tagPrefix = "genres/"
override val datePattern = "dd MMM yy"
override val sourceLocale: Locale = Locale.ENGLISH
}

@ -0,0 +1,16 @@
package org.koitharu.kotatsu.parsers.site.madara.id
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
import java.util.Locale
@MangaSourceParser("POJOKMANGA", "PojokManga", "id")
internal class PojokManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.POJOKMANGA, "pojokmanga.net") {
override val tagPrefix = "komik-genre/"
override val datePattern = "MMM d, yyyy"
override val sourceLocale: Locale = Locale.ENGLISH
}

@ -0,0 +1,16 @@
package org.koitharu.kotatsu.parsers.site.madara.id
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
import java.util.Locale
@MangaSourceParser("SHINIGAMI", "Shinigami", "id")
internal class Shinigami(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.SHINIGAMI, "shinigami.id", 10) {
override val tagPrefix = "genre/"
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.ENGLISH
}

@ -0,0 +1,16 @@
package org.koitharu.kotatsu.parsers.site.madara.ko
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
import java.util.Locale
@MangaSourceParser("RAWDEX", "Raw Dex", "ko")
internal class RawDex(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.RAWDEX, "rawdex.net", 40) {
override val isNsfwSource = true
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.ENGLISH
}

@ -4,14 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("ARTHUR_SCAN", "Arthur Scan", "pt") @MangaSourceParser("ARTHUR_SCAN", "Arthur Scan", "pt")
internal class ArthurScan(context: MangaLoaderContext) : internal class ArthurScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ARTHUR_SCAN, "arthurscan.xyz") { MadaraParser(context, MangaSource.ARTHUR_SCAN, "arthurscan.xyz") {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
} }

@ -5,11 +5,9 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ATLANTISSCAN", "Atlantisscan", "pt") @MangaSourceParser("ATLANTISSCAN", "Atlantisscan", "pt")
internal class Atlantisscan(context: MangaLoaderContext) : internal class Atlantisscan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ATLANTISSCAN, "br.atlantisscan.com", pageSize = 50) { MadaraParser(context, MangaSource.ATLANTISSCAN, "br.atlantisscan.com", pageSize = 50) {
override val datePattern = "dd/MM/yyyy" override val datePattern = "dd/MM/yyyy"
} }

@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("CABAREDOWATAME", "Dessert Scan", "pt") @MangaSourceParser("CABAREDOWATAME", "Dessert Scan", "pt")
internal class Cabaredowatame(context: MangaLoaderContext) : internal class Cabaredowatame(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.CABAREDOWATAME, "cabaredowatame.site", 10) { MadaraParser(context, MangaSource.CABAREDOWATAME, "cabaredowatame.site", 10) {

@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("CAFECOMYAOI", "Cafecom Yaoi", "pt") @MangaSourceParser("CAFECOMYAOI", "Cafecom Yaoi", "pt")
internal class CafecomYaoi(context: MangaLoaderContext) : internal class CafecomYaoi(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.CAFECOMYAOI, "cafecomyaoi.com.br") { MadaraParser(context, MangaSource.CAFECOMYAOI, "cafecomyaoi.com.br") {

@ -4,13 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("CERISE_SCANS", "Cerise Scans", "pt") @MangaSourceParser("CERISE_SCANS", "Cerise Scans", "pt")
internal class CeriseScans(context: MangaLoaderContext) : internal class CeriseScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.CERISE_SCANS, "cerisescans.com") { MadaraParser(context, MangaSource.CERISE_SCANS, "cerisescans.com") {
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy" override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
} }

@ -4,14 +4,11 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("FINALSCANS", "Final Scans", "pt") @MangaSourceParser("FINALSCANS", "Final Scans", "pt")
internal class FinalScans(context: MangaLoaderContext) : internal class FinalScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.FINALSCANS, "finalscans.com") { MadaraParser(context, MangaSource.FINALSCANS, "finalscans.com") {
override val datePattern: String = "MMMM d, yyyy" override val datePattern: String = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
override val isNsfwSource = true override val isNsfwSource = true
} }

@ -4,13 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("FOXWHITE", "Fox White", "pt") @MangaSourceParser("FOXWHITE", "Fox White", "pt")
internal class FoxWhite(context: MangaLoaderContext) : internal class FoxWhite(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.FOXWHITE, "foxwhite.com.br") { MadaraParser(context, MangaSource.FOXWHITE, "foxwhite.com.br") {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
} }

@ -4,8 +4,6 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("GEKKOU", "Gekkou", "pt") @MangaSourceParser("GEKKOU", "Gekkou", "pt")
internal class Gekkou(context: MangaLoaderContext) : internal class Gekkou(context: MangaLoaderContext) :
@ -13,5 +11,4 @@ internal class Gekkou(context: MangaLoaderContext) :
override val tagPrefix = "genero/" override val tagPrefix = "genero/"
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy" override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
} }

@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("GOOFFANSUB", "Goof Fansub", "pt") @MangaSourceParser("GOOFFANSUB", "Goof Fansub", "pt")
internal class GoofFansub(context: MangaLoaderContext) : internal class GoofFansub(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.GOOFFANSUB, "gooffansub.com") { MadaraParser(context, MangaSource.GOOFFANSUB, "gooffansub.com") {

@ -4,8 +4,6 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("HENTAIGEKKOU", "Hentai Gekkou", "pt") @MangaSourceParser("HENTAIGEKKOU", "Hentai Gekkou", "pt")
internal class HentaiGekkou(context: MangaLoaderContext) : internal class HentaiGekkou(context: MangaLoaderContext) :
@ -13,6 +11,5 @@ internal class HentaiGekkou(context: MangaLoaderContext) :
override val tagPrefix = "genero/" override val tagPrefix = "genero/"
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy" override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
override val isNsfwSource = true override val isNsfwSource = true
} }

@ -10,8 +10,6 @@ internal class Hentaiteca(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAITECA, "hentaiteca.net", pageSize = 10) { MadaraParser(context, MangaSource.HENTAITECA, "hentaiteca.net", pageSize = 10) {
override val datePattern = "MM/dd/yyyy" override val datePattern = "MM/dd/yyyy"
override val tagPrefix = "genero/" override val tagPrefix = "genero/"
override val isNsfwSource = true override val isNsfwSource = true
} }

@ -5,15 +5,11 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HIPERCOOL", "Hipercool", "pt") @MangaSourceParser("HIPERCOOL", "Hipercool", "pt")
internal class Hipercool(context: MangaLoaderContext) : internal class Hipercool(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HIPERCOOL, "hipercool.xyz", pageSize = 20) { MadaraParser(context, MangaSource.HIPERCOOL, "hipercool.xyz", pageSize = 20) {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val tagPrefix = "manga-tag/" override val tagPrefix = "manga-tag/"
override val isNsfwSource = true override val isNsfwSource = 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("ILLUSIONSCAN", "Illusion Scan", "pt")
internal class IllusionScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ILLUSIONSCAN, "illusionscan.com") {
override val isNsfwSource = true
override val datePattern: String = "dd 'de' MMMMM 'de' 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("IMPERIOSCANS", "Imperio Scans", "pt")
internal class ImperioScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.IMPERIOSCANS, "imperioscans.com.br") {
override val datePattern: String = "dd/MM/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("LEITORKAMISAMA", "Leitor Kamisama", "pt")
internal class LeitorKamisama(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LEITORKAMISAMA, "leitor.kamisama.com.br", 10) {
override val tagPrefix = "manga-tag/"
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
}

@ -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("LERYAOI", "LerYaoi", "pt")
internal class LerYaoi(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LERYAOI, "leryaoi.com", 10) {
override val isNsfwSource = true
override val tagPrefix = "genero/"
override val datePattern: String = "dd/MM/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("MOMONOHANASCAN", "Momonohana Scan", "pt")
internal class MomonohanaScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MOMONOHANASCAN, "momonohanascan.com", 10) {
override val datePattern: String = "dd/MM/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("MOONLOVERSSCAN", "Moon Lovers Scan", "pt")
internal class MoonLoversScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MOONLOVERSSCAN, "moonloversscan.com.br", 10) {
override val isNsfwSource = true
override val datePattern = "MMMM d, 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("MOONWITCHINLOVESCAN", "Moon Witchin Love Scan", "pt")
internal class Moonwitchinlovescan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MOONWITCHINLOVESCAN, "moonwitchinlovescan.com", 10) {
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
}

@ -4,13 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("NOCSUMMER", "Nocturne Summer", "pt") @MangaSourceParser("NOCSUMMER", "Nocturne Summer", "pt")
internal class Nocsummer(context: MangaLoaderContext) : internal class Nocsummer(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NOCSUMMER, "nocsummer.com.br", 18) { MadaraParser(context, MangaSource.NOCSUMMER, "nocsummer.com.br", 18) {
override val datePattern = "dd 'de' MMMMM 'de' yyyy" override val datePattern = "dd 'de' MMMMM 'de' yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
} }

@ -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("NOINDEXSCAN", "Noindex Scan", "pt")
internal class NoindexScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NOINDEXSCAN, "noindexscan.com") {
override val isNsfwSource = true
override val datePattern: String = "dd/MM/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("PEACHSCAN", "Peach Scan", "pt")
internal class PeachScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PEACHSCAN, "www.peachscan.com", 10) {
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
}

@ -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("PIRULITOROSA", "Pirulitorosa", "pt")
internal class Pirulitorosa(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PIRULITOROSA, "pirulitorosa.site") {
override val postreq = true
override val isNsfwSource = true
override val datePattern: String = "dd/MM/yyyy"
}

@ -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("PORTALYAOI", "PortalYaoi", "pt")
internal class PortalYaoi(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PORTALYAOI, "portalyaoi.com", 10) {
override val isNsfwSource = true
override val tagPrefix = "genero/"
override val datePattern: String = "dd/MM"
}

@ -4,12 +4,10 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("PRISMA_HENTAI", "Prisma hentai", "pt") @MangaSourceParser("PRISMA_HENTAI", "Prisma hentai", "pt")
internal class Prismahentai(context: MangaLoaderContext) : internal class Prismahentai(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PRISMA_HENTAI, "prismahentai.com", 18) { MadaraParser(context, MangaSource.PRISMA_HENTAI, "prismahentai.com", 18) {
override val datePattern = "MMMM d, yyyy" override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
} }

@ -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("PROJETOSCANLATOR", "Projeto Scanlator", "pt")
internal class ProjetoScanlator(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PROJETOSCANLATOR, "projetoscanlator.com", 10) {
override val datePattern: String = "dd/MM/yyyy"
}

@ -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("PSUNICORN", "Psunicorn", "pt")
internal class Psunicorn(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PSUNICORN, "psunicorn.com") {
override val isNsfwSource = true
override val datePattern: String = "MMMM d, 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("RAINBOWFAIRYSCAN", "Rainbow Fairy Scan", "pt")
internal class RainbowFairyScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.RAINBOWFAIRYSCAN, "rainbowfairyscan.com", 10) {
override val datePattern: String = "dd/MM/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("RANDOMSCANS", "Random Scans", "pt")
internal class RandomScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.RANDOMSCANS, "randomscans.com") {
override val datePattern: String = "MMMM d, 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("ROGMANGAS", "Rog Mangas", "pt")
internal class RogMangas(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ROGMANGAS, "rogmangas.com", 51) {
override val datePattern: String = "dd/MM/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("TANKOUHENTAI", "Tankou Hentai", "pt")
internal class TankouHentai(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.TANKOUHENTAI, "tankouhentai.com", pageSize = 16) {
override val isNsfwSource = true
override val datePattern: String = "dd 'de' MMMMM 'de' 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("THESUGARSCAN", "The Sugar Scan", "pt")
internal class TheSugarScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.THESUGARSCAN, "thesugarscan.com", pageSize = 15) {
override val isNsfwSource = true
override val datePattern: String = "dd/MM/yyyy"
}

@ -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("VALKYRIESCAN", "Valkyrie Scan", "pt")
internal class ValkyrieScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.VALKYRIESCAN, "valkyriescan.com", pageSize = 10) {
override val isNsfwSource = true
override val datePattern: String = "dd/MM/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("WINTERSCAN", "Winter Scan", "pt")
internal class WinterScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.WINTERSCAN, "winterscan.com", pageSize = 20) {
override val datePattern: String = "dd 'de' MMMMM 'de' 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("WONDERLANDSCAN", "Wonderland Scan", "pt")
internal class WonderlandScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.WONDERLANDSCAN, "wonderlandscan.com") {
override val datePattern: String = "dd/MM/yyyy"
}

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

Loading…
Cancel
Save