Add new source

This commit is contained in:
devi
2023-07-01 18:33:05 +02:00
parent 07df5a81cf
commit d05d5fa911
52 changed files with 592 additions and 88 deletions

View File

@@ -32,13 +32,13 @@ class MangaInUaParser(context: MangaLoaderContext) : PagedMangaParser(
): List<Manga> {
val url = when {
!query.isNullOrEmpty() -> (
"/index.php?do=search" +
"&subaction=search" +
"&search_start=$page" +
"&full_search=1" +
"&story=$query" +
"&titleonly=3"
).toAbsoluteUrl(domain)
"/index.php?do=search" +
"&subaction=search" +
"&search_start=$page" +
"&full_search=1" +
"&story=$query" +
"&titleonly=3"
).toAbsoluteUrl(domain)
tags.isNullOrEmpty() -> "/mangas/page/$page".toAbsoluteUrl(domain)
tags.size == 1 -> "${tags.first().key}/page/$page"

View File

@@ -48,7 +48,7 @@ class NicovideoSeigaParser(context: MangaLoaderContext) :
!query.isNullOrEmpty() -> return if (offset == 0) getSearchList(query, page) else emptyList()
tags.isNullOrEmpty() -> "https://$domain/manga/list?page=$page&sort=${getSortKey(sortOrder)}"
tags.size == 1 -> "https://$domain/manga/list?category=${tags.first().key}&page=$page" +
"&sort=${getSortKey(sortOrder)}"
"&sort=${getSortKey(sortOrder)}"
tags.size > 1 -> throw IllegalArgumentException("This source supports only 1 category")
else -> "https://$domain/manga/list?page=$page&sort=${getSortKey(sortOrder)}"

View File

@@ -50,14 +50,62 @@ internal abstract class MadaraParser(
protected val ongoing: Array<String> = arrayOf(
"مستمرة", "En curso", "En Curso","Ongoing", "OnGoing","On going",
"Ativo", "En Cours", "En cours", "Đ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",
"Lançando", "In Arrivo", "Emision", "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "连载中",)
"مستمرة",
"En curso",
"En Curso",
"Ongoing",
"OnGoing",
"On going",
"Ativo",
"En Cours",
"En cours",
"En cours \uD83D\uDFE2",
"Đ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",
"Lançando",
"In Arrivo",
"Emision",
"En emision",
"مستمر",
"Curso",
"En marcha",
"Publicandose",
"连载中",
)
protected val finished: Array<String> = arrayOf(
"Completed", "Completo", "Complété", "Fini", "Terminé", "Tamamlandı", "Đã hoàn thành", "مكتملة", "Завершено",
"Finished", "Finalizado", "Completata", "One-Shot", "Bitti", "Tamat", "Completado", "Concluído", "Concluido", "已完结",)
"Completed",
"Completo",
"Complété",
"Fini",
"Terminé",
"Terminé ⚫",
"Tamamlandı",
"Đã hoàn thành",
"مكتملة",
"Завершено",
"Finished",
"Finalizado",
"Completata",
"One-Shot",
"Bitti",
"Tamat",
"Completado",
"Concluído",
"Concluido",
"已完结",
)
override suspend fun getListPage(
@@ -102,16 +150,17 @@ internal abstract class MadaraParser(
}.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",
?.lowercase()) {
"مستمرة", "En curso", "En Curso", "Ongoing", "OnGoing", "On going",
"Ativo", "En Cours", "En cours", "Đ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",
"Lançando", "In Arrivo", "Emision", "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "连载中",
-> MangaState.ONGOING
"Completed", "Completo", "Complété", "Fini", "Terminé", "Tamamlandı", "Đã hoàn thành", "مكتملة", "Завершено",
"Finished", "Finalizado", "Completata", "One-Shot", "Bitti", "Tamat", "Completado", "Concluído", "Concluido", "已完结",
-> MangaState.FINISHED
else -> null
},
source = source,
@@ -152,25 +201,29 @@ internal abstract class MadaraParser(
val testchekasync = doc.body().select("div.listing-chapters_wrap")
val chaptersDeferred = if(testchekasync.isNullOrEmpty())
{
val chaptersDeferred = if (testchekasync.isNullOrEmpty()) {
async { loadChapters(manga.url) }
}else
{
} else {
async { getChapters(manga, doc) }
}
val desc = doc.body().selectFirst("div.description-summary div.summary__content") ?:
doc.body().selectFirst("div.summary_content div.post-content_item > h5 + div") ?:
doc.body().selectFirst("div.summary_content div.manga-excerpt")
val desc = doc.body().selectFirst("div.description-summary div.summary__content") ?: doc.body()
.selectFirst("div.summary_content div.post-content_item > h5 + div") ?: doc.body()
.selectFirst("div.post-content div.manga-summary") ?: doc.body()
.selectFirst("div.post-content div.desc") ?: doc.body()
.selectFirst("div.summary_content div.manga-excerpt")
val stateselect =
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()
?: doc.body().select("div.post-content_item:contains(حالة العمل) > div.summary-content").last() ?: doc.body().select("div.post-content_item:contains(Estado) > 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()
?: 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()
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()
?: doc.body().select("div.post-content_item:contains(حالة العمل) > div.summary-content").last()
?: doc.body().select("div.post-content_item:contains(Estado) > 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()
?: 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()
?: doc.body().select("div.summary-content").last()
val state =
@@ -182,7 +235,7 @@ internal abstract class MadaraParser(
}
}
manga.copy(
manga.copy(
tags = doc.body().select("div.genres-content a").mapNotNullToSet { a ->
MangaTag(
key = a.attr("href").removeSuffix("/").substringAfterLast('/'),
@@ -190,10 +243,12 @@ internal abstract class MadaraParser(
source = source,
)
},
description = desc?.select("p")?.filterNot { it.ownText().startsWith("A brief description") }?.joinToString { it.text() },
description = desc?.select("p")?.filterNot { it.ownText().startsWith("A brief description") }
?.joinToString { it.text() },
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(),
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(),
)
@@ -281,6 +336,16 @@ internal abstract class MadaraParser(
date.startsWith("il y a", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Handle translated short 'ago'
date.endsWith(" h", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" d", ignoreCase = true) -> {
parseRelativeDate(date)
}
date.endsWith(" mins", ignoreCase = true) -> {
parseRelativeDate(date)
}
// Handle 'yesterday' and 'today', using midnight
date.startsWith("year", ignoreCase = true) -> {
Calendar.getInstance().apply {
@@ -330,16 +395,17 @@ internal abstract class MadaraParser(
"día",
"dia",
"day",
"d",
).anyWordIn(date) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis
WordSet("jam", "saat", "heure", "hora", "hour").anyWordIn(date) -> cal.apply {
WordSet("jam", "saat", "heure", "hora", "hour", "h").anyWordIn(date) -> cal.apply {
add(
Calendar.HOUR,
-number,
)
}.timeInMillis
WordSet("menit", "dakika", "min", "minute", "minuto").anyWordIn(date) -> cal.apply {
WordSet("menit", "dakika", "min", "minute", "minuto", "mins").anyWordIn(date) -> cal.apply {
add(
Calendar.MINUTE,
-number,

View File

@@ -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("AZORANOV", "Azoranov", "ar")
internal class Azoranov(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.AZORANOV, "azoranov.com", pageSize = 10,) {
override val tagPrefix = "novel-genre/"
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("ar", "AR")
}

View File

@@ -9,5 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALEK", "MangaLek", "ar")
internal class MangaLek(context: MangaLoaderContext) : MadaraParser(
context, MangaSource.MANGALEK, "mangalek.com",
pageSize = 10,
pageSize = 20,
)

View File

@@ -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("ANSHSCANS", "Ansh Scans", "en")
internal class AnshScans(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ANSHSCANS, "anshscans.org", 10){
override val tagPrefix = "genre/"
}

View File

@@ -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("BABELWUXIA", "Babelwuxia", "en")
internal class Babelwuxia(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.BABELWUXIA, "read.babelwuxia.com") {
override val datePattern = "MMMM d, yyyy"
}

View File

@@ -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("CM_READER", "Cm Reader", "en")
internal class CmReader(context: MangaLoaderContext) : MadaraParser(context, MangaSource.CM_READER, "cmreader.info") {
override val datePattern = "MMMM d, yyyy"
}

View File

@@ -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("COFFEE_MANGA", "Coffee Manga", "en")
internal class CoffeeManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.COFFEE_MANGA, "coffeemanga.io") {
override val datePattern = "MMMM d, yyyy"
}

View File

@@ -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("COLORED_MANGA", "Colored Manga", "en")
internal class ColoredManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.COLORED_MANGA, "coloredmanga.com") {
override val tagPrefix = "manga-tag"
override val datePattern = "dd-MMM"
}

View File

@@ -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("DARK_SCANS", "DarkScans", "en")
internal class DarkScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DARK_SCANS, "darkscans.com", 18) {
override val datePattern = "MMMM d, yyyy"
}

View File

@@ -8,7 +8,7 @@ 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,) {
MadaraParser(context, MangaSource.HARIMANGA, "harimanga.com", pageSize = 10) {
override val datePattern = "MMMM d, yyyy"
}

View File

@@ -9,7 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HENTAI20", "Hentai20", "en")
internal class Hentai20(context: MangaLoaderContext) : MadaraParser(context, MangaSource.HENTAI20, "hentai20.io") {
override val tagPrefix = "manga-genre/"
override val isNsfwSource = true
}

View File

@@ -7,4 +7,5 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
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,)
internal class MangaCv(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGACV, "mangacv.com", pageSize = 10)

View File

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

View File

@@ -7,4 +7,5 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
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,)
internal class MangaKomi(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGA_KOMI, "mangakomi.io", pageSize = 18)

View File

@@ -8,7 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGA_MANHUA", "Manga Manhua", "en")
internal class MangaManhua(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGA_MANHUA, "mangamanhua.online", pageSize = 10)
{
MadaraParser(context, MangaSource.MANGA_MANHUA, "mangamanhua.online", pageSize = 10) {
override val datePattern = "d MMMM، yyyy"
}

View File

@@ -7,4 +7,5 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAROCK", "MangaRock", "en")
internal class MangaRock(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGAROCK, "mangarockteam.com")
internal class MangaRock(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAROCK, "mangarockteam.com")

View File

@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGAWEEBS", "MangaWeebs", "en")
internal class MangaWeebs(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAWEEBS, "mangaweebs.in", pageSize = 20,) {
MadaraParser(context, MangaSource.MANGAWEEBS, "mangaweebs.in", pageSize = 20) {
override val datePattern = "dd MMMM HH:mm"
}

View File

@@ -7,6 +7,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGACLASH", "Mangaclash", "en")
internal class Mangaclash(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGACLASH, "mangaclash.com", pageSize = 18,) {
internal class Mangaclash(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGACLASH, "mangaclash.com", pageSize = 18) {
override val datePattern = "MM/dd/yyyy"
}

View File

@@ -7,4 +7,5 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
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,)
internal class ManhwaClan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWACLAN, "manhwaclan.com", pageSize = 10)

View File

@@ -7,7 +7,8 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
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,) {
internal class ManhwaKool(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWAKOOL, "manhwakool.com", pageSize = 10) {
override val datePattern: String = "MMMM d, yyyy"
}

View File

@@ -0,0 +1,14 @@
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.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("PARAGONSCANS", "Paragonscans", "en")
internal class Paragonscans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PARAGONSCANS, "paragonscans.com", pageSize = 50) {
override val datePattern = "MM/dd/yyyy"
}

View File

@@ -7,4 +7,5 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("STKISSMANGA", "Stkissmanga", "en")
internal class Stkissmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.STKISSMANGA, "1stkissmanga.me")
internal class Stkissmanga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.STKISSMANGA, "1stkissmanga.me")

View File

@@ -7,7 +7,8 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("TOONILY", "Toonily", "en")
internal class Toonily(context: MangaLoaderContext) : MadaraParser(context, MangaSource.TOONILY, "toonily.com", pageSize = 18,) {
internal class Toonily(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.TOONILY, "toonily.com", pageSize = 18) {
override val tagPrefix = "webtoon-genre/"

View File

@@ -7,7 +7,8 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("TOPMANHUA", "Top Manhua", "en")
internal class TopManhua(context: MangaLoaderContext) : MadaraParser(context, MangaSource.TOPMANHUA, "www.topmanhua.com") {
internal class TopManhua(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.TOPMANHUA, "www.topmanhua.com") {
override val tagPrefix = "manhua-genre/"
override val datePattern = "MM/dd/yyyy"

View File

@@ -7,7 +7,6 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ZINMANGA", "ZINMANGA", "en")
internal class Zinmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ZINMANGA, "zinmanga.com")
{
internal class Zinmanga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.ZINMANGA, "zinmanga.com") {
override val datePattern = "MM/dd/yyyy"
}

View File

@@ -9,6 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class AiyuMangaScanlation(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.AIYUMANGASCANLATION, "aiyumangascanlation.com") {
override val tagPrefix = "manga-genre/"
override val datePattern = "MM/dd/yyyy"
}

View File

@@ -0,0 +1,15 @@
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
import java.util.Locale
@MangaSourceParser("APOLL_COMICS", "Apoll Comics", "es")
internal class ApollComics(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.APOLL_COMICS, "apollcomics.com", 10) {
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("es")
}

View File

@@ -0,0 +1,15 @@
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
import java.util.Locale
@MangaSourceParser("COPYPASTESCAN", "Copypastescan", "es")
internal class Copypastescan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.COPYPASTESCAN, "copypastescan.xyz", 10) {
override val datePattern = "d MMMM, yyyy"
override val sourceLocale: Locale = Locale("es")
}

View File

@@ -0,0 +1,15 @@
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
import java.util.Locale
@MangaSourceParser("DAPROB", "Daprob", "es")
internal class Daprob(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DAPROB, "daprob.com") {
override val datePattern = "d 'de' MMMMM 'de' yyyy"
override val sourceLocale: Locale = Locale("es")
}

View File

@@ -0,0 +1,15 @@
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
import java.util.Locale
@MangaSourceParser("MUNDO_MANHWA", "Mundo Manhwa", "es")
internal class MundoManhwa(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MUNDO_MANHWA, "mundomanhwa.com", 10) {
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("es")
}

View File

@@ -0,0 +1,17 @@
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
import java.util.Locale
@MangaSourceParser("MANGASORIGINES", "Mangas Origines", "fr")
internal class MangasOrigines(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASORIGINES, "mangas-origines.xyz") {
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.FRENCH
}

View File

@@ -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("KOMIKSA", "Komiksay", "id")
internal class Komiksay(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KOMIKSA, "komiksay.site") {
override val tagPrefix = "komik-genre/"
override val datePattern = "MMMM d"
override val sourceLocale: Locale = Locale.ENGLISH
}

View File

@@ -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("WORLDMANHWAS", "Worldmanhwas", "id")
internal class Worldmanhwas(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.WORLDMANHWAS, "worldmanhwas.bar", 10) {
override val tagPrefix = "komik-genre/"
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale.ENGLISH
}

View File

@@ -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("ARTHUR_SCAN", "Arthur Scan", "pt")
internal class ArthurScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ARTHUR_SCAN, "arthurscan.xyz") {
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
}

View File

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

View File

@@ -0,0 +1,18 @@
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("CERISE_SCANS", "Cerise Scans", "pt")
internal class CeriseScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.CERISE_SCANS, "cerisescans.com") {
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
}

View File

@@ -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("NEOX_SCANS", "Neox scans", "pt")
internal class Neoxscans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NEOX_SCANS, "neoxscans.net", 18) {
override val datePattern = "dd/MM/yyyy"
}

View File

@@ -9,7 +9,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
internal class PrismaScansParser(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PRISMA_SCANS, "prismascans.net", 10) {
override val tagPrefix = "manga-genre/"
override val datePattern = "MMM dd, yyyy"
}

View File

@@ -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
import java.util.Locale
@MangaSourceParser("PRISMA_HENTAI", "Prisma hentai", "pt")
internal class Prismahentai(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PRISMA_HENTAI, "prismahentai.com", 18) {
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("pt", "PT")
}

View File

@@ -7,7 +7,8 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("BAKAMAN", "BakaMan", "th")
internal class BakaMan(context: MangaLoaderContext) : MadaraParser( context, MangaSource.BAKAMAN, "bakaman.net", pageSize = 18,) {
internal class BakaMan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.BAKAMAN, "bakaman.net", pageSize = 18) {
override val isNsfwSource = false
}

View File

@@ -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("MANGAKEYFI", "Mangakeyfi", "tr")
internal class Mangakeyfi(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGAKEYFI, "mangakeyfi.net", 20) {
override val tagPrefix = "mangalar-genre/"
override val datePattern = "d MMMM yyyy"
override val sourceLocale: Locale = Locale("tr")
}

View File

@@ -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("MANGASEHRI", "Mangasehri", "tr")
internal class Mangasehri(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASEHRI, "mangasehri.com", 18) {
override val datePattern = "dd/MM/yyyy"
}

View File

@@ -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
import java.util.Locale
@MangaSourceParser("MANGAWT", "Mangawt", "tr")
internal class Mangawt(context: MangaLoaderContext) : MadaraParser(context, MangaSource.MANGAWT, "mangawt.com") {
override val datePattern = "MMMM d, yyyy"
override val sourceLocale: Locale = Locale("tr")
}

View File

@@ -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("WEBTOONHATTI", "Webtoonhatti", "tr")
internal class Webtoonhatti(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.WEBTOONHATTI, "webtoonhatti.com", 20) {
override val tagPrefix = "webtoon-tur/"
override val datePattern = "d MMMM"
override val sourceLocale: Locale = Locale("tr")
}

View File

@@ -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("WEBTOONTR", "Webtoontr", "tr")
internal class Webtoontr(context: MangaLoaderContext) : MadaraParser(context, MangaSource.WEBTOONTR, "webtoon-tr.com", 16) {
override val tagPrefix = "webtoon-kategori/"
override val datePattern = "dd/MM/yyyy"
}

View File

@@ -14,7 +14,6 @@ import java.text.SimpleDateFormat
import java.util.*
internal abstract class MangaReaderParser(
context: MangaLoaderContext,
source: MangaSource,
@@ -61,38 +60,36 @@ internal abstract class MangaReaderParser(
val tagMap = getOrCreateTagMap()
val selecttag = if(tablemode != null)
{
val selecttag = if (tablemode != null) {
tablemode.select(".seriestugenre > a")
}else
{
} else {
docs.select(".wd-full .mgen > a")
}
val tags = selecttag.mapNotNullToSet { tagMap[it.text()] }
val stateselect = if(tablemode != null)
{
tablemode.selectFirst(".infotable td:contains(Status)") ?: tablemode.selectFirst(".infotable td:contains(Statut)")
?: tablemode.selectFirst(".infotable td:contains(حالة العمل)") ?: tablemode.selectFirst(".infotable td:contains(Estado)")
?: docs.selectFirst(".infotable td:contains(สถานะ)") ?: tablemode.selectFirst(".infotable td:contains(Stato )")
?: tablemode.selectFirst(".infotable td:contains(Durum)") ?: tablemode.selectFirst(".infotable td:contains(Statüsü)")
val stateselect = if (tablemode != null) {
tablemode.selectFirst(".infotable td:contains(Status)")
?: tablemode.selectFirst(".infotable td:contains(Statut)")
?: tablemode.selectFirst(".infotable td:contains(حالة العمل)")
?: tablemode.selectFirst(".infotable td:contains(Estado)")
?: docs.selectFirst(".infotable td:contains(สถานะ)")
?: tablemode.selectFirst(".infotable td:contains(Stato )")
?: tablemode.selectFirst(".infotable td:contains(Durum)")
?: tablemode.selectFirst(".infotable td:contains(Statüsü)")
}else
{
} else {
docs.selectFirst(".tsinfo div:contains(Status)") ?: docs.selectFirst(".tsinfo div:contains(Statut)")
?: docs.selectFirst(".tsinfo div:contains(حالة العمل)") ?: docs.selectFirst(".tsinfo div:contains(Estado)")
?: docs.selectFirst(".tsinfo div:contains(สถานะ)") ?: docs.selectFirst(".tsinfo div:contains(Stato )")
?: docs.selectFirst(".tsinfo div:contains(Durum)") ?: docs.selectFirst(".tsinfo div:contains(Statüsü)")
}
val state = if(tablemode != null)
{
val state = if (tablemode != null) {
stateselect?.lastElementSibling()
}else
{
} else {
stateselect?.lastElementChild()
}
@@ -104,28 +101,29 @@ internal abstract class MangaReaderParser(
"Devam Ediyor", "Em Andamento", "In Corso", "Güncel", "Berjalan", "Продолжается", "Updating",
"Lançando", "In Arrivo", "Emision", "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "连载中",
-> MangaState.ONGOING
"Completed", "Completo", "Complété", "Fini", "Terminé", "Tamamlandı", "Đã hoàn thành", "مكتملة", "Завершено",
"Finished", "Finalizado", "Completata", "One-Shot", "Bitti", "Tamat", "Completado", "Concluído", "Concluido", "已完结",
-> MangaState.FINISHED
else -> null
}
}
val author = tablemode?.selectFirst(".infotable td:contains(Author)")?.lastElementSibling()?.text()?:
docs.selectFirst(".tsinfo div:contains(Author)")?.lastElementChild()?.text() ?:
docs.selectFirst(".tsinfo div:contains(Auteur)")?.lastElementChild()?.text() ?:
docs.selectFirst(".tsinfo div:contains(Artist)")?.lastElementChild()?.text() ?:
docs.selectFirst(".tsinfo div:contains(Durum)")?.lastElementChild()?.text()
val author = tablemode?.selectFirst(".infotable td:contains(Author)")?.lastElementSibling()?.text()
?: docs.selectFirst(".tsinfo div:contains(Author)")?.lastElementChild()?.text()
?: docs.selectFirst(".tsinfo div:contains(Auteur)")?.lastElementChild()?.text()
?: docs.selectFirst(".tsinfo div:contains(Artist)")?.lastElementChild()?.text()
?: docs.selectFirst(".tsinfo div:contains(Durum)")?.lastElementChild()?.text()
val nsfw = docs.selectFirst(".restrictcontainer") != null
|| docs.selectFirst(".info-right .alr") != null
|| docs.selectFirst(".postbody .alr") != null
return manga.copy(
description = tablemode?.selectFirst("div.entry-content")?.html() ?:
docs.selectFirst("div.entry-content")?.html(),
description = tablemode?.selectFirst("div.entry-content")?.html() ?: docs.selectFirst("div.entry-content")
?.html(),
state = mangaState,
author = author,
isNsfw = manga.isNsfw || nsfw,
@@ -215,8 +213,7 @@ internal abstract class MangaReaderParser(
val docs = webClient.httpGet(chapterUrl).parseHtml()
val test = docs.select("script:containsData(ts_reader)")
if(test.isNullOrEmpty())
{
if (test.isNullOrEmpty()) {
return docs.select("div#readerarea img").map { img ->
val url = img.imageUrl()
MangaPage(
@@ -226,8 +223,7 @@ internal abstract class MangaReaderParser(
source = source,
)
}
}else
{
} else {
val script = docs.selectFirstOrThrow("script:containsData(ts_reader)")
val images = JSONObject(script.data().substringAfter('(').substringBeforeLast(')'))
.getJSONArray("sources")
@@ -250,8 +246,6 @@ internal abstract class MangaReaderParser(
}
}
override suspend fun getTags(): Set<MangaTag> {

View File

@@ -0,0 +1,20 @@
package org.koitharu.kotatsu.parsers.site.mangareader.ar
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
import java.text.SimpleDateFormat
import java.util.*
@MangaSourceParser("GALAXYMANGA", "Galaxymanga", "ar")
internal class Galaxymanga(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.GALAXYMANGA, pageSize = 40, searchPageSize = 30) {
override val configKeyDomain: ConfigKey.Domain
get() = ConfigKey.Domain("galaxymanga.org")
override val chapterDateFormat: SimpleDateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("ar", "AR"))
}

View File

@@ -0,0 +1,20 @@
package org.koitharu.kotatsu.parsers.site.mangareader.ar
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
import java.text.SimpleDateFormat
import java.util.*
@MangaSourceParser("MANGAATREND", "Mangaatrend", "ar")
internal class Mangaatrend(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.MANGAATREND, pageSize = 40, searchPageSize = 20) {
override val configKeyDomain: ConfigKey.Domain
get() = ConfigKey.Domain("mangaatrend.net")
override val chapterDateFormat: SimpleDateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("ar", "AR"))
}

View File

@@ -0,0 +1,23 @@
package org.koitharu.kotatsu.parsers.site.mangareader.en
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
import java.text.SimpleDateFormat
import java.util.Locale
@MangaSourceParser("LUNAR_SCAN", "Lunar Scan", "en")
internal class LunarScan(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.LUNAR_SCAN, pageSize = 20, searchPageSize = 20) {
override val configKeyDomain: ConfigKey.Domain
get() = ConfigKey.Domain("lunarscan.org")
override val listUrl = "/series"
override val isNsfwSource: Boolean = true
override val chapterDateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.ENGLISH)
}

View File

@@ -0,0 +1,18 @@
package org.koitharu.kotatsu.parsers.site.mangareader.tr
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
import java.text.SimpleDateFormat
import java.util.*
@MangaSourceParser("AYATOON", "Ayatoon", "tr")
internal class Ayatoon(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.AYATOON, pageSize = 20, searchPageSize = 20) {
override val configKeyDomain: ConfigKey.Domain
get() = ConfigKey.Domain("ayatoon.com")
override val chapterDateFormat: SimpleDateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("tr"))
}