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 )
This commit is contained in:
@@ -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,38 +121,88 @@ 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 tag = tags.oneOrThrowIfMany()
|
||||
val payload = createRequestTemplate()
|
||||
payload["page"] = page.toString()
|
||||
when (sortOrder) {
|
||||
SortOrder.POPULARITY -> payload["vars[meta_key]"] = "_wp_manga_views"
|
||||
SortOrder.UPDATED -> payload["vars[meta_key]"] = "_latest_update"
|
||||
SortOrder.NEWEST -> payload["vars[meta_key]"] = ""
|
||||
SortOrder.ALPHABETICAL -> {
|
||||
payload["vars[orderby]"] = "post_title"
|
||||
payload["vars[order]"] = "ASC"
|
||||
|
||||
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()
|
||||
when (sortOrder) {
|
||||
SortOrder.POPULARITY -> payload["vars[meta_key]"] = "_wp_manga_views"
|
||||
SortOrder.UPDATED -> payload["vars[meta_key]"] = "_latest_update"
|
||||
SortOrder.NEWEST -> payload["vars[meta_key]"] = ""
|
||||
SortOrder.ALPHABETICAL -> {
|
||||
payload["vars[orderby]"] = "post_title"
|
||||
payload["vars[order]"] = "ASC"
|
||||
}
|
||||
|
||||
else -> payload["vars[meta_key]"] = "_latest_update"
|
||||
|
||||
else -> payload["vars[meta_key]"] = "_latest_update"
|
||||
}
|
||||
payload["vars[wp-manga-genre]"] = tag?.key.orEmpty()
|
||||
payload["vars[s]"] = query?.urlEncoded().orEmpty()
|
||||
webClient.httpPost(
|
||||
"https://$domain/wp-admin/admin-ajax.php",
|
||||
payload,
|
||||
).parseHtml()
|
||||
}
|
||||
|
||||
payload["vars[wp-manga-genre]"] = tag?.key.orEmpty()
|
||||
payload["vars[s]"] = query?.urlEncoded().orEmpty()
|
||||
val doc = 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("há ", 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
Reference in New Issue
Block a user