Merge pull request #266 from KotatsuApp/devi2

Update focus on fix and remove dead sources
Koitharu 3 years ago committed by GitHub
commit 8979987344
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -14,7 +14,7 @@ import java.util.EnumSet
import java.util.Locale
@MangaSourceParser("PAPSCAN", "PapScan", "fr")
@MangaSourceParser("PAPSCAN", "Pap Scan", "fr")
internal class PapScan(context: MangaLoaderContext) :
AnimeBootstrapParser(context, MangaSource.PAPSCAN, "papscan.com") {

@ -1,12 +1,10 @@
package org.koitharu.kotatsu.parsers.site.animebootstrap.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.animebootstrap.AnimeBootstrapParser
@MangaSourceParser("KOMIKZOID", "KomikzoId", "id")
@MangaSourceParser("KOMIKZOID", "Komikzo Id", "id")
internal class KomikzoId(context: MangaLoaderContext) :
AnimeBootstrapParser(context, MangaSource.KOMIKZOID, "komikzoid.xyz")

@ -1,156 +0,0 @@
package org.koitharu.kotatsu.parsers.site.en
import okhttp3.Headers
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.PagedMangaParser
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.util.*
import java.util.*
@MangaSourceParser("COMICASTLE", "Comicastle", "en")
internal class Comicastle(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.COMICASTLE, 42) {
override val sortOrders: Set<SortOrder> = EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED)
override val configKeyDomain = ConfigKey.Domain("comicastle.org")
override val headers: Headers = Headers.Builder()
.add("User-Agent", UserAgents.CHROME_DESKTOP)
.build()
init {
paginator.firstPage = 0
searchPaginator.firstPage = 0
}
override suspend fun getFavicons(): Favicons {
return Favicons(
listOf(
Favicon("https://$domain/assets/static/app-assets/images/logo/logo-primary.png", 54, null),
),
domain,
)
}
override suspend fun getListPage(
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
val tag = tags.oneOrThrowIfMany()
val doc = if (!query.isNullOrEmpty()) {
val url = buildString {
append("https://$domain/library/search/result/")
append(page + 1)
}
val postdata = "submit=Submit&search=" + query.urlEncoded()
webClient.httpPost(url, postdata).parseHtml()
} else if (!tags.isNullOrEmpty()) {
val url = buildString {
append("https://$domain/library/search/genre/")
append(page + 1)
}
val postdata = "submit=Submit&search=" + tag?.key.orEmpty()
webClient.httpPost(url, postdata).parseHtml()
} else {
val url = buildString {
append("https://$domain")
append("/library/")
when (sortOrder) {
SortOrder.POPULARITY -> append("popular/desc/")
SortOrder.UPDATED -> append("postdate/desc")
else -> append("postdate/desc")
}
append("/index/")
append(page * pageSize)
}
webClient.httpGet(url).parseHtml()
}
return doc.select("div.card-body div.match-height div.col-6")
.map { div ->
val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href")
Manga(
id = generateUid(href),
title = div.selectFirstOrThrow("p").text(),
altTitle = null,
url = href,
publicUrl = href.toAbsoluteUrl(domain),
rating = RATING_UNKNOWN,
isNsfw = false,
coverUrl = div.selectFirstOrThrow("img").attrAsAbsoluteUrl("data-src"),
tags = emptySet(),
state = null,
author = null,
source = source,
)
}
}
override suspend fun getTags(): Set<MangaTag> {
val doc = webClient.httpGet("https://$domain/library/").parseHtml()
return doc.requireElementById("sidebar").selectFirstOrThrow(".card-body").select("button")
.mapNotNullToSet { button ->
MangaTag(
key = button.attr("value"),
title = button.text(),
source = source,
)
}
}
override suspend fun getDetails(manga: Manga): Manga {
val root = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
return manga.copy(
altTitle = null,
state = when (root.selectFirstOrThrow(".card-body p span.mr-1 strong").text()) {
"Ongoing" -> MangaState.ONGOING
"Completed" -> MangaState.FINISHED
else -> null
},
tags = root.select("p:contains(Genre) ~ div form").mapNotNullToSet { form ->
MangaTag(
key = form.selectFirstOrThrow("input").attr("value"),
title = form.selectFirstOrThrow("button").text(),
source = source,
)
},
author = root.select("thead:contains(Writer) + tbody button").text(),
description = root.getElementById("comic-desc")?.text(),
chapters = root.select("div.card-body > .table-responsive tr a")
.mapChapters { i, a ->
val url = a.attrAsRelativeUrl("href")
val name = a.text()
MangaChapter(
id = generateUid(url),
name = name,
number = i + 1,
url = url,
scanlator = null,
uploadDate = 0,
branch = null,
source = source,
)
},
)
}
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
return doc.selectFirstOrThrow(".card-content .form-control.pr-3").select("option").map { option ->
val url = option.attr("alt")
MangaPage(
id = generateUid(url),
url = url,
preview = null,
source = source,
)
}
}
}

@ -14,7 +14,7 @@ import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat
import java.util.*
@MangaSourceParser("KSKMOE", "Ksk Moe", "en", ContentType.HENTAI)
@MangaSourceParser("KSKMOE", "Ksk .Moe", "en", ContentType.HENTAI)
internal class KskMoe(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.KSKMOE, 35) {
override val sortOrders: Set<SortOrder> =
@ -145,7 +145,7 @@ internal class KskMoe(context: MangaLoaderContext) : PagedMangaParser(context, M
emptyList()
},
)
)
}
// For the moment the pages are in poor quality.

@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat
import java.util.*
@MangaSourceParser("MANGAGEKO", "MangaGeko", "en")
@MangaSourceParser("MANGAGEKO", "Manga Geko", "en")
internal class MangaGeko(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGAGEKO, 30) {
override val sortOrders: Set<SortOrder> = EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.NEWEST)

@ -10,7 +10,7 @@ import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.*
@MangaSourceParser("MANGATOWN", "MangaTown", "en")
@MangaSourceParser("MANGATOWN", "Manga Town", "en")
internal class MangaTownParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.MANGATOWN) {
override val configKeyDomain = ConfigKey.Domain("www.mangatown.com")

@ -30,13 +30,11 @@ internal abstract class FmreaderParser(
protected open val listeurl = "/manga-list.html"
protected open val datePattern = "MMMM d, yyyy"
init {
paginator.firstPage = 1
searchPaginator.firstPage = 1
}
@JvmField
protected val ongoing: Set<String> = setOf(
"On going",
@ -73,7 +71,6 @@ internal abstract class FmreaderParser(
append(tag?.key.orEmpty())
}
}
append("&sort=")
when (sortOrder) {
SortOrder.POPULARITY -> append("views")
@ -83,9 +80,7 @@ internal abstract class FmreaderParser(
}
}
val doc = webClient.httpGet(url).parseHtml()
return doc.select("div.thumb-item-flow").map { div ->
val href = div.selectFirstOrThrow("div.series-title a").attrAsRelativeUrl("href")
Manga(
id = generateUid(href),
@ -129,13 +124,9 @@ internal abstract class FmreaderParser(
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
val fullUrl = manga.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
val chaptersDeferred = async { getChapters(manga, doc) }
val desc = doc.selectFirstOrThrow(selectDesc).html()
val stateDiv = doc.selectFirst(selectState)
val state = stateDiv?.let {
when (it.text()) {
in ongoing -> MangaState.ONGOING
@ -248,7 +239,6 @@ internal abstract class FmreaderParser(
private fun parseRelativeDate(date: String): Long {
val number = Regex("""(\d+)""").find(date)?.value?.toIntOrNull() ?: return 0
val cal = Calendar.getInstance()
return when {
WordSet(
"day",

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.fmreader.en
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import org.jsoup.nodes.Document
@ -11,12 +10,11 @@ import org.koitharu.kotatsu.parsers.site.fmreader.FmreaderParser
import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat
@MangaSourceParser("MANHWA18COM", "Manhwa18 Com", "en", ContentType.HENTAI)
@MangaSourceParser("MANHWA18COM", "Manhwa18 .Com", "en", ContentType.HENTAI)
internal class Manhwa18Com(context: MangaLoaderContext) :
FmreaderParser(context, MangaSource.MANHWA18COM, "manhwa18.com") {
override val listeurl = "/tim-kiem"
override val selectState = "div.info-item:contains(Status) span.info-value "
override val selectAlt = "div.info-item:contains(Other name) span.info-value "
override val selectTag = "div.info-item:contains(Genre) span.info-value a"
@ -31,7 +29,6 @@ internal class Manhwa18Com(context: MangaLoaderContext) :
sortOrder: SortOrder,
): List<Manga> {
val tag = tags.oneOrThrowIfMany()
val url = buildString {
append("https://")
append(domain)
@ -57,7 +54,6 @@ internal class Manhwa18Com(context: MangaLoaderContext) :
append(query.urlEncoded())
}
}
append("&sort=")
when (sortOrder) {
SortOrder.POPULARITY -> append("views")
@ -69,9 +65,7 @@ internal class Manhwa18Com(context: MangaLoaderContext) :
}
}
val doc = webClient.httpGet(url).parseHtml()
return doc.select("div.thumb-item-flow").map { div ->
val href = div.selectFirstOrThrow("div.series-title a").attrAsRelativeUrl("href")
Manga(
id = generateUid(href),
@ -107,13 +101,9 @@ internal class Manhwa18Com(context: MangaLoaderContext) :
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
val fullUrl = manga.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
val chaptersDeferred = async { getChapters(manga, doc) }
val desc = doc.selectFirstOrThrow(selectDesc).html()
val stateDiv = doc.selectFirst(selectState)
val state = stateDiv?.let {
when (it.text()) {
in ongoing -> MangaState.ONGOING
@ -121,7 +111,6 @@ internal class Manhwa18Com(context: MangaLoaderContext) :
else -> null
}
}
val alt = doc.body().selectFirst(selectAlt)?.text()?.replace("Other name", "")
val auth = doc.body().selectFirst(selectAut)?.text()
manga.copy(

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.fmreader.ja
import org.jsoup.nodes.Document
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
@ -15,7 +14,6 @@ import org.koitharu.kotatsu.parsers.site.fmreader.FmreaderParser
import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat
@MangaSourceParser("KLZ9", "Klz9", "ja")
internal class Klz9(context: MangaLoaderContext) :
FmreaderParser(context, MangaSource.KLZ9, "klz9.com") {
@ -54,7 +52,6 @@ internal class Klz9(context: MangaLoaderContext) :
append(tag?.key.orEmpty())
}
}
append("&sort=")
when (sortOrder) {
SortOrder.POPULARITY -> append("views")
@ -64,7 +61,6 @@ internal class Klz9(context: MangaLoaderContext) :
}
}
val doc = webClient.httpGet(url).parseHtml()
return doc.select("div.thumb-item-flow").map { div ->
val href = "/" + div.selectFirstOrThrow("a").attrAsRelativeUrl("href")
Manga(
@ -112,10 +108,8 @@ internal class Klz9(context: MangaLoaderContext) :
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
val cid = doc.selectFirstOrThrow("#chapter").attr("value")
val docload = webClient.httpGet("https://$domain/app/manga/controllers/cont.listImg.php?cid=$cid").parseHtml()
return docload.select(selectPage).map { img ->
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found")

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.fmreader.ja
import org.jsoup.nodes.Document
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
@ -12,7 +11,6 @@ import org.koitharu.kotatsu.parsers.site.fmreader.FmreaderParser
import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat
@MangaSourceParser("WELOVEMANGA", "WeLoveManga", "ja")
internal class WeLoveManga(context: MangaLoaderContext) :
FmreaderParser(context, MangaSource.WELOVEMANGA, "welovemanga.one") {
@ -44,7 +42,6 @@ internal class WeLoveManga(context: MangaLoaderContext) :
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml()
val cid = doc.selectFirstOrThrow("#chapter").attr("value")
val docload = webClient.httpGet("https://$domain/app/manga/controllers/cont.listImg.php?cid=$cid").parseHtml()
return docload.select("img").map { img ->

@ -1,12 +1,10 @@
package org.koitharu.kotatsu.parsers.site.fmreader.ja
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.fmreader.FmreaderParser
@MangaSourceParser("WELOMA", "Weloma", "ja")
internal class Weloma(context: MangaLoaderContext) :
FmreaderParser(context, MangaSource.WELOMA, "weloma.art")

@ -40,10 +40,8 @@ internal abstract class FoolSlideParser(
): List<Manga> {
val doc = if (!query.isNullOrEmpty()) {
val url = buildString {
append("https://$domain/$searchUrl")
if (page > 1) {
return emptyList()
}

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.foolslide.en
import kotlinx.coroutines.coroutineScope
import org.jsoup.nodes.Document
import org.koitharu.kotatsu.parsers.MangaLoaderContext
@ -9,8 +8,7 @@ import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser
import org.koitharu.kotatsu.parsers.util.*
@MangaSourceParser("ASSORTEDSCANS", "AssortedScans", "en")
@MangaSourceParser("ASSORTEDSCANS", "Assorted Scans", "en")
internal class AssortedScans(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.ASSORTEDSCANS, "assortedscans.com", 56) {
@ -26,11 +24,9 @@ internal class AssortedScans(context: MangaLoaderContext) :
): List<Manga> {
val doc = if (!query.isNullOrEmpty()) {
if (page > 1) {
return emptyList()
}
val url = buildString {
append("https://")
append(domain)
@ -54,7 +50,6 @@ internal class AssortedScans(context: MangaLoaderContext) :
}
webClient.httpGet(url).parseHtml()
}
return doc.select("section.series, tr.result").map { div ->
val href = div.selectFirstOrThrow("a").attrAsRelativeUrl("href")
Manga(
@ -77,14 +72,12 @@ internal class AssortedScans(context: MangaLoaderContext) :
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
val fullUrl = manga.url.toAbsoluteUrl(domain)
val testAdultPage = webClient.httpGet(fullUrl).parseHtml()
val doc = if (testAdultPage.selectFirst("div.info form") != null) {
webClient.httpPost(fullUrl, "adult=true").parseHtml()
} else {
testAdultPage
}
val chapters = getChapters(manga, doc)
val desc = doc.getElementById("series-desc")?.selectFirst("div")?.html()
val alt = doc.getElementById("series-aliases")?.selectFirst("div.alias")?.text()
val author = doc.getElementById("series-authors")?.selectFirst("div.author")?.text()
@ -139,6 +132,4 @@ internal class AssortedScans(context: MangaLoaderContext) :
val root = doc.body()
return root.requireElementById("page-image").attr("src") ?: doc.parseFailed("Page image not found")
}
}

@ -1,12 +1,10 @@
package org.koitharu.kotatsu.parsers.site.foolslide.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.foolslide.FoolSlideParser
@MangaSourceParser("DEATHTOLLSCANS", "Deathtollscans", "en")
@MangaSourceParser("DEATHTOLLSCANS", "DeathToll Scans", "en")
internal class Deathtollscans(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.DEATHTOLLSCANS, "reader.deathtollscans.net", 26)

@ -1,12 +1,10 @@
package org.koitharu.kotatsu.parsers.site.foolslide.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.foolslide.FoolSlideParser
@MangaSourceParser("MANGATELLERS", "Mangatellers", "en")
internal class Mangatellers(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.MANGATELLERS, "reader.mangatellers.gr") {

@ -1,12 +1,10 @@
package org.koitharu.kotatsu.parsers.site.foolslide.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.foolslide.FoolSlideParser
@MangaSourceParser("READER_EVILFLOWERS", "Evilflowers", "en")
@MangaSourceParser("READER_EVILFLOWERS", "Evil Flowers", "en")
internal class ReaderEvilflowers(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.READER_EVILFLOWERS, "reader.evilflowers.com")

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.foolslide.en
import kotlinx.coroutines.coroutineScope
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
@ -8,7 +7,6 @@ import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser
import org.koitharu.kotatsu.parsers.util.*
@MangaSourceParser("SEINAGI", "Seinagi", "en")
internal class Seinagi(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.SEINAGI, "reader.seinagi.org.es") {
@ -18,26 +16,22 @@ internal class Seinagi(context: MangaLoaderContext) :
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
val fullUrl = manga.url.toAbsoluteUrl(domain)
val testAdultPage = webClient.httpGet(fullUrl).parseHtml()
val doc = if (testAdultPage.selectFirst("div.info form") != null) {
webClient.httpPost(fullUrl, "adult=true").parseHtml()
} else {
testAdultPage
}
val chapters = getChapters(manga, doc)
val desc = if (doc.selectFirstOrThrow(selectInfo).html().contains("Description")) {
doc.selectFirstOrThrow(selectInfo).text().substringAfter("Description: ").substringBefore("Readings")
} else {
doc.selectFirstOrThrow(selectInfo).text()
}
val author = if (doc.selectFirstOrThrow(selectInfo).html().contains("Author")) {
doc.selectFirstOrThrow(selectInfo).text().substringAfter("Author: ").substringBefore("Art")
} else {
null
}
manga.copy(
coverUrl = doc.selectFirst(".thumbnail img")?.src() ?: manga.coverUrl,
description = desc,

@ -1,14 +0,0 @@
package org.koitharu.kotatsu.parsers.site.foolslide.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.foolslide.FoolSlideParser
@MangaSourceParser("SILENTSKYSCANS", "Silent Sky Scans", "en")
internal class SilentskyScans(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.SILENTSKYSCANS, "reader.silentsky-scans.net") {
override val pagination = false
}

@ -1,12 +1,10 @@
package org.koitharu.kotatsu.parsers.site.foolslide.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.foolslide.FoolSlideParser
@MangaSourceParser("MENUDO_FANSUB", "Menudo Fansub", "es")
internal class MenudoFansub(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.MENUDO_FANSUB, "www.menudo-fansub.com", 25) {

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.foolslide.es
import kotlinx.coroutines.coroutineScope
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
@ -8,7 +7,6 @@ import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser
import org.koitharu.kotatsu.parsers.util.*
@MangaSourceParser("PZYKOSIS666HFANSUB", "Pzykosis666h Fansub", "es", ContentType.HENTAI)
internal class Pzykosis666hFansub(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.PZYKOSIS666HFANSUB, "lector.pzykosis666hfansub.com") {
@ -16,26 +14,22 @@ internal class Pzykosis666hFansub(context: MangaLoaderContext) :
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
val fullUrl = manga.url.toAbsoluteUrl(domain)
val testAdultPage = webClient.httpGet(fullUrl).parseHtml()
val doc = if (testAdultPage.selectFirst("div.info form") != null) {
webClient.httpPost(fullUrl, "adult=true").parseHtml()
} else {
testAdultPage
}
val chapters = getChapters(manga, doc)
val desc = if (doc.selectFirstOrThrow(selectInfo).html().contains("Descripción")) {
doc.selectFirstOrThrow(selectInfo).text().substringAfter("Descripción: ").substringBefore("Lecturas")
} else {
doc.selectFirstOrThrow(selectInfo).text()
}
val author = if (doc.selectFirstOrThrow(selectInfo).html().contains("Author")) {
doc.selectFirstOrThrow(selectInfo).text().substringAfter("Author: ").substringBefore("Art")
} else {
null
}
manga.copy(
coverUrl = doc.selectFirst(".thumbnail img")?.src() ?: manga.coverUrl,
description = desc,

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.foolslide.es
import kotlinx.coroutines.coroutineScope
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
@ -14,35 +13,29 @@ import org.koitharu.kotatsu.parsers.util.selectFirstOrThrow
import org.koitharu.kotatsu.parsers.util.src
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
@MangaSourceParser("SEINAGIADULTO", "Seinagi Adulto", "es", ContentType.HENTAI)
internal class SeinagiAdulto(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.SEINAGIADULTO, "adulto.seinagi.org.es") {
override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
val fullUrl = manga.url.toAbsoluteUrl(domain)
val testAdultPage = webClient.httpGet(fullUrl).parseHtml()
val doc = if (testAdultPage.selectFirst("div.info form") != null) {
webClient.httpPost(fullUrl, "adult=true").parseHtml()
} else {
testAdultPage
}
val chapters = getChapters(manga, doc)
val desc = if (doc.selectFirstOrThrow(selectInfo).html().contains("Descripción")) {
doc.selectFirstOrThrow(selectInfo).text().substringAfter("Descripción: ").substringBefore("Lecturas")
} else {
doc.selectFirstOrThrow(selectInfo).text()
}
val author = if (doc.selectFirstOrThrow(selectInfo).html().contains("Author")) {
doc.selectFirstOrThrow(selectInfo).text().substringAfter("Author: ").substringBefore("Art")
} else {
null
}
manga.copy(
coverUrl = doc.selectFirst(".thumbnail img")?.src().orEmpty(),// for manga result on search
description = desc,

@ -1,16 +1,13 @@
package org.koitharu.kotatsu.parsers.site.foolslide.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.foolslide.FoolSlideParser
@MangaSourceParser("HNISCANTRAD", "Hni Scantrad", "fr")
internal class HniScantrad(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.HNISCANTRAD, "hni-scantrad.com") {
override val pagination = false
override val searchUrl = "lel/search/"
override val listUrl = "lel/directory/"

@ -1,12 +0,0 @@
package org.koitharu.kotatsu.parsers.site.foolslide.pl
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.foolslide.FoolSlideParser
@MangaSourceParser("ONEPIECENAKAMA", "Onepiecenakama", "pl")
internal class Onepiecenakama(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.ONEPIECENAKAMA, "reader.onepiecenakama.pl")

@ -15,7 +15,7 @@ import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault
import java.util.*
@MangaSourceParser("BENTOMANGA", "Bentomanga", "fr")
@MangaSourceParser("BENTOMANGA", "BentoManga", "fr")
internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BENTOMANGA, 10) {
override val sortOrders: Set<SortOrder> = EnumSet.of(

@ -13,7 +13,7 @@ import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.util.*
import java.util.*
@MangaSourceParser("SCANS_MANGAS_ME", "Scans Mangas Me", "fr")
@MangaSourceParser("SCANS_MANGAS_ME", "Scans Mangas .Me", "fr")
internal class ScansMangasMe(context: MangaLoaderContext) :
PagedMangaParser(context, MangaSource.SCANS_MANGAS_ME, 0) {

@ -164,7 +164,7 @@ internal class ScantradUnion(context: MangaLoaderContext) : PagedMangaParser(con
?: throw ParseException("Root not found", fullUrl)
return root.select("img").map { img ->
val url = img.attrAsRelativeUrlOrNull("data-src") ?: img.attrAsRelativeUrlOrNull("src")
?: img.parseFailed("Image src not found")
?: img.parseFailed("Image src not found")
MangaPage(
id = generateUid(url),
url = url,

@ -3,9 +3,92 @@ package org.koitharu.kotatsu.parsers.site.heancms.es
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.ContentType
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.heancms.HeanCms
import org.koitharu.kotatsu.parsers.util.domain
import org.koitharu.kotatsu.parsers.util.generateUid
import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.parseJson
import org.koitharu.kotatsu.parsers.util.urlEncoded
@MangaSourceParser("YUGEN_MANGAS_ES", "Yugen Mangas Es", "es", ContentType.HENTAI)
@MangaSourceParser("YUGEN_MANGAS_ES", "Yugen Mangas", "es", ContentType.HENTAI)
internal class YugenMangasEs(context: MangaLoaderContext) :
HeanCms(context, MangaSource.YUGEN_MANGAS_ES, "yugenmangas.net")
HeanCms(context, MangaSource.YUGEN_MANGAS_ES, "yugenmangas.lat") {
private val domainAlt = "yugenmangas.net"
override suspend fun getListPage(
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
var firstTag = false
val url = buildString {
append("https://api.")
append(domainAlt)
append("/query?query_string=")
if (!query.isNullOrEmpty()) {
append(query.urlEncoded())
}
append("&series_status=All&order=desc&orderBy=")
when (sortOrder) {
SortOrder.POPULARITY -> append("total_views")
SortOrder.UPDATED -> append("latest")
SortOrder.NEWEST -> append("created_at")
SortOrder.ALPHABETICAL -> append("title")
else -> append("latest")
}
append("&series_type=Comic&page=")
append(page)
append("&perPage=12&tags_ids=")
append("[".urlEncoded())
if (!tags.isNullOrEmpty()) {
for (tag in tags) {
// Just to make it fit [1,2,44] ect
if (!firstTag) {
firstTag = true
} else {
append(",")
}
append(tag.key)
}
}
append("]".urlEncoded())
}
val json = webClient.httpGet(url).parseJson()
return json.getJSONArray("data").mapJSON { j ->
val slug = j.getString("series_slug")
val urlManga = "https://$domain/series/$slug"
val cover = if (j.getString("thumbnail").contains('/')) {
j.getString("thumbnail")
} else {
"https://api.$domainAlt/${j.getString("thumbnail")}"
}
Manga(
id = generateUid(urlManga),
title = j.getString("title"),
altTitle = null,
url = urlManga,
publicUrl = urlManga,
rating = RATING_UNKNOWN,
isNsfw = false,
coverUrl = cover,
tags = setOf(),
state = when (j.getString("status")) {
"Ongoing" -> MangaState.ONGOING
"Completed" -> MangaState.FINISHED
"Dropped" -> MangaState.ABANDONED
else -> null
},
author = null,
source = source,
)
}
}
}

@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.heancms.HeanCms
@MangaSourceParser("REAPERSCANSPT", "ReaperScans Pt", "pt")
@MangaSourceParser("REAPERSCANSPT", "Reaper Scans", "pt")
internal class ReaperScansPt(context: MangaLoaderContext) :
HeanCms(context, MangaSource.REAPERSCANSPT, "reaperscans.net")

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.heancmsalt.HeanCmsAlt
@MangaSourceParser("MANGAESP", "MangaEsp", "es")
@MangaSourceParser("MANGAESP", "Manga Esp", "es")
internal class MangaEsp(context: MangaLoaderContext) :
HeanCmsAlt(context, MangaSource.MANGAESP, "mangaesp.co", 15) {

@ -13,7 +13,7 @@ import java.util.*
class DoujinDesuParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.DOUJINDESU, pageSize = 18) {
override val configKeyDomain: ConfigKey.Domain
get() = ConfigKey.Domain("212.32.226.234")
get() = ConfigKey.Domain("doujindesu.tv")
override val sortOrders: Set<SortOrder>
get() = EnumSet.of(SortOrder.UPDATED, SortOrder.NEWEST, SortOrder.ALPHABETICAL, SortOrder.POPULARITY)

@ -1,20 +1,26 @@
package org.koitharu.kotatsu.parsers.site.ja
import okhttp3.Headers
import org.koitharu.kotatsu.parsers.*
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.exception.AuthRequiredException
import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.util.*
import java.util.*
private const val STATUS_ONGOING = "連載"
private const val STATUS_FINISHED = "完結"
@MangaSourceParser("NICOVIDEO_SEIGA", "Nicovideo Seiga", "ja")
@MangaSourceParser("NICOVIDEO_SEIGA", "NicoVideo Seiga", "ja")
class NicovideoSeigaParser(context: MangaLoaderContext) :
MangaParser(context, MangaSource.NICOVIDEO_SEIGA),
MangaParserAuthProvider {
override val headers: Headers = Headers.Builder()
.add("User-Agent", UserAgents.CHROME_DESKTOP)
.build()
override val authUrl: String
get() = "https://${getDomain("account")}/login?site=seiga"
@ -89,7 +95,7 @@ class NicovideoSeigaParser(context: MangaLoaderContext) :
override suspend fun getDetails(manga: Manga): Manga {
val doc = webClient.httpGet(manga.url.toAbsoluteUrl(getDomain("seiga"))).parseHtml()
val contents = doc.body().selectFirstOrThrow("#contents")
val contents = doc.body().requireElementById("contents")
val statusText = contents
.select("div.mg_work_detail > div > div:nth-child(2) > div.tip.content_status.status_series > span")
.text()

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.madara.all
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.*

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.madara.all
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.ContentType
@ -11,6 +10,5 @@ import java.util.Locale
@MangaSourceParser("MANGACRAZY", "Manga Crazy", "", ContentType.HENTAI)
internal class MangaCrazy(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGACRAZY, "mangacrazy.net") {
override val sourceLocale: Locale = Locale.ENGLISH
}

@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.util.*
import java.util.HashSet
import java.util.Locale
@MangaSourceParser("MANHWA18CC", "Manhwa 18 Cc", "", ContentType.HENTAI)
@MangaSourceParser("MANHWA18CC", "Manhwa 18 .Cc", "", ContentType.HENTAI)
internal class Manhwa18Cc(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHWA18CC, "manhwa18.cc", 24) {
override val datePattern = "dd MMM yyyy"
@ -21,6 +21,11 @@ internal class Manhwa18Cc(context: MangaLoaderContext) :
override val selectChapter = "li.a-h"
override val selectBodyPage = "div.read-content"
init {
paginator.firstPage = 1
searchPaginator.firstPage = 1
}
override suspend fun getListPage(
page: Int,
query: String?,
@ -28,36 +33,30 @@ internal class Manhwa18Cc(context: MangaLoaderContext) :
sortOrder: SortOrder,
): List<Manga> {
val tag = tags.oneOrThrowIfMany()
val url = buildString {
append("https://")
append(domain)
val pages = page + 1
when {
!query.isNullOrEmpty() -> {
append("/page/")
append(pages.toString())
append("/?s=")
append("/search?q=")
append(query.urlEncoded())
append("&post_type=wp-manga&")
append("&page=")
append(page.toString())
}
!tags.isNullOrEmpty() -> {
append("/$tagPrefix")
append(tag?.key.orEmpty())
if (pages > 1) {
append("/page/")
append(pages.toString())
if (page > 1) {
append(page.toString())
}
append("?")
}
else -> {
append("/$listUrl")
if (pages > 1) {
append("page/")
append(pages)
if (page > 1) {
append(page)
}
append("?")
}
@ -72,7 +71,6 @@ internal class Manhwa18Cc(context: MangaLoaderContext) :
}
}
val doc = webClient.httpGet(url).parseHtml()
return doc.select("div.manga-lists div.manga-item").map { div ->
val href = div.selectFirst("a")?.attrAsRelativeUrlOrNull("href") ?: div.parseFailed("Link not found")
Manga(
@ -126,5 +124,4 @@ internal class Manhwa18Cc(context: MangaLoaderContext) :
)
}
}
}

@ -22,7 +22,6 @@ internal class ManhwaRaw(context: MangaLoaderContext) :
override val sourceLocale: Locale = Locale.ENGLISH
override val withoutAjax = true
override suspend fun getChapters(manga: Manga, doc: Document): List<MangaChapter> {
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
return doc.body().select(selectChapter).mapChapters(reversed = true) { i, li ->

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.madara.all
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.ContentType
@ -8,7 +7,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.Locale
@MangaSourceParser("MANYTOON_CLUB", "Many Toon Club", "", ContentType.HENTAI)
@MangaSourceParser("MANYTOON_CLUB", "Many Toon .Club", "", ContentType.HENTAI)
internal class ManyToonClub(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANYTOON_CLUB, "manytoon.club") {
override val postreq = true

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.madara.ar
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
@ -10,6 +9,5 @@ import java.util.Locale
@MangaSourceParser("AKUMANGA", "Aku Manga", "ar")
internal class AkuManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.AKUMANGA, "akumanga.com") {
override val sourceLocale: Locale = Locale.ENGLISH
}

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.madara.ar
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.ContentType
@ -10,6 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ARABTOONS", "Arab Toons", "ar", ContentType.HENTAI)
internal class ArabToons(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ARABTOONS, "arabtoons.net") {
override val datePattern = "dd-MM-yyyy"
}

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.madara.ar
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
@ -9,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ASQORG", "3Asq", "ar")
internal class Asq(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ASQORG, "3asq.org") {
override val datePattern = "d MMMM، yyyy"
}

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.madara.ar
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource

@ -1,12 +1,11 @@
package org.koitharu.kotatsu.parsers.site.madara.ar
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("COMICARAB", "ComicArab", "ar")
@MangaSourceParser("COMICARAB", "Comic Arab", "ar")
internal class ComicArab(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.COMICARAB, "comicarab.com", pageSize = 24) {
override val datePattern = "d MMMM، yyyy"

@ -1,14 +1,12 @@
package org.koitharu.kotatsu.parsers.site.madara.ar
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("FALCONMANGA", "FalconManga", "ar")
@MangaSourceParser("FALCONMANGA", "Falcon Manga", "ar")
internal class FalconManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.FALCONMANGA, "falconmanga.com") {
override val datePattern = "d MMMM، yyyy"
}

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.madara.ar
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
@ -9,8 +8,8 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("GATEMANGA", "Gate Manga", "ar")
internal class GateManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.GATEMANGA, "gatemanga.com") {
override val postreq = true
override val datePattern = "d MMMM، yyyy"
override val listUrl = "ar/"
override val withoutAjax = true
}

@ -5,8 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALEK", "MangaLek", "ar")
@MangaSourceParser("MANGALEK", "Manga Lek", "ar")
internal class MangaLek(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGALEK, "mangalek.com", pageSize = 20) {
override val datePattern = "dd-MM-yyyy"
}
MadaraParser(context, MangaSource.MANGALEK, "mangaleku.com", pageSize = 10)

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALEK_ORG", "MangaLek Org", "ar")
@MangaSourceParser("MANGALEK_ORG", "Manga Lek .Org", "ar")
internal class MangaLekOrg(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGALEK_ORG, "ww.mangalek.org", pageSize = 10) {
override val listUrl = "comics/"

@ -5,10 +5,9 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALEKS", "MangaLeks", "ar")
@MangaSourceParser("MANGALEKS", "Manga Leks", "ar")
internal class MangaLeks(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGALEKS, "mangaleks.com") {
override val datePattern = "yyyy/MM/dd"
override val postreq = true
}

@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALIKE", "MangaLike", "ar")
@MangaSourceParser("MANGALIKE", "Manga Like", "ar")
internal class MangaLike(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGALIKE, "mangalike.me", pageSize = 10)

@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGASTARZ", "Manga Starz", "ar")
internal class MangaStarz(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASTARZ, "mangastarz.com", pageSize = 10) {
override val datePattern = "d MMMM، yyyy"
}

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGASTARZCOM", "MangaStarz Com", "ar")
@MangaSourceParser("MANGASTARZCOM", "Manga Starz .Com", "ar")
internal class MangaStarzCom(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASTARZCOM, "mangastarz.com", 10) {
override val datePattern = "d MMMM، yyyy"

@ -5,6 +5,9 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALIKE_ORG", "MangaLike Org", "ar")
internal class MangaLikeOrg(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGALIKE_ORG, "mangalike.org", pageSize = 10)
@MangaSourceParser("MANGA_LEK", "Manga-Lek", "ar")
internal class Manga_Lek(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGA_LEK, "manga-lek.com") {
override val listUrl = "mangalek/"
override val postreq = true
}

@ -5,6 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALINK_AR", "Mangalink", "ar")
@MangaSourceParser("MANGALINK_AR", "Manga Link", "ar")
internal class MangalinkParser(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGALINK_AR, "mangalink.online", pageSize = 10)
MadaraParser(context, MangaSource.MANGALINK_AR, "manga-link.org", pageSize = 10) {
override val listUrl = "readcomics/"
}

@ -5,10 +5,9 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGASPARK", "Mangaspark", "ar")
@MangaSourceParser("MANGASPARK", "Manga Spark", "ar")
internal class Mangaspark(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANGASPARK, "mangaspark.com", pageSize = 10) {
MadaraParser(context, MangaSource.MANGASPARK, "mangaspark.org", pageSize = 10) {
override val postreq = true
override val datePattern = "d MMMM، yyyy"
}

@ -10,6 +10,5 @@ import java.util.*
@MangaSourceParser("MANHATIC", "Manhatic", "ar", ContentType.HENTAI)
internal class Manhatic(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.MANHATIC, "manhatic.com") {
override val sourceLocale: Locale = Locale.ENGLISH
}

@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("NIJITRANSLATIONS", "Niji Translations", "ar")
internal class NijiTranslations(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NIJITRANSLATIONS, "niji-translations.com") {
override val postreq = true
}

@ -5,9 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("NOVELSTOWN", "Novelstown", "ar")
@MangaSourceParser("NOVELSTOWN", "Novels Town", "ar")
internal class Novelstown(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.NOVELSTOWN, "novelstown.cyou") {
MadaraParser(context, MangaSource.NOVELSTOWN, "novelstown.com") {
override val datePattern = "d MMMM، yyyy"
}

@ -1,11 +1,10 @@
package org.koitharu.kotatsu.parsers.site.madara.ar
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("KOLMANGA", "KolManga", "ar")
internal class KolManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.KOLMANGA, "kolmanga.com")
@MangaSourceParser("PEWPIECE", "PewPiece", "ar")
internal class PewPiece(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.PEWPIECE, "pewpiece.com")

@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("SHADOWXMANGA", "Shadow X Manga", "ar")
internal class ShadowxManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.SHADOWXMANGA, "shadowxmanga.com") {
override val datePattern = "yyyy/MM/dd"
}

@ -7,8 +7,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("WEBTOONEMPIRE", "Webtoon Empire", "ar")
internal class WebtoonEmpire(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.WEBTOONEMPIRE, "webtoonempire.org", pageSize = 10) {
MadaraParser(context, MangaSource.WEBTOONEMPIRE, "webtoonsempireron.com", pageSize = 10) {
override val listUrl = "webtoon/"
override val datePattern = "d MMMM yyyy"
override val datePattern = "d MMMM، yyyy"
}

@ -1,17 +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.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ADULT_WEBTOON", "Adult Webtoon", "en", ContentType.HENTAI)
internal class AdultWebtoon(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ADULT_WEBTOON, "adultwebtoon.com") {
override val tagPrefix = "adult-webtoon-genre/"
override val postreq = true
}

@ -9,7 +9,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ALLPORN_COMIC", "All Porn Comic", "en", ContentType.HENTAI)
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"
}

@ -8,8 +8,6 @@ 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/"
override val datePattern = "MMMM dd, yyyy"
}

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

@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ARCANESCANS", "ArcaneScans", "en")
@MangaSourceParser("ARCANESCANS", "Arcane Scans", "en")
internal class ArcaneScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ARCANESCANS, "arcanescans.com", 10)

@ -1,10 +0,0 @@
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("ARCHERSCANS", "ArcherScans", "en")
internal class ArcherScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ARCHERSCANS, "www.archerscans.com", 10)

@ -5,10 +5,9 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ASTRALLIBRARY", "Astrallibrary", "en")
@MangaSourceParser("ASTRALLIBRARY", "Astral Library", "en")
internal class Astrallibrary(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ASTRALLIBRARY, "astrallibrary.net", 18) {
override val datePattern = "dd MMM"
override val postreq = true
}

@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("ASURASCANS_US", "AsuraScans Us", "en")
@MangaSourceParser("ASURASCANS_US", "Asura Scans .Us", "en")
internal class AsuraScansUs(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ASURASCANS_US, "asurascans.us")

@ -7,4 +7,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")
MadaraParser(context, MangaSource.BABELWUXIA, "babelwuxia.com")

@ -11,7 +11,7 @@ import org.koitharu.kotatsu.parsers.model.SortOrder
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.*
@MangaSourceParser("BESTMANHUACOM", "BestManhua Com", "en")
@MangaSourceParser("BESTMANHUACOM", "Best Manhua .Com", "en")
internal class BestManhuaCom(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.BESTMANHUACOM, "bestmanhua.com", 20) {
override val datePattern = "dd MMMM yyyy"

@ -6,8 +6,7 @@ import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("BIBIMANGA", "BibiManga", "en", ContentType.HENTAI)
@MangaSourceParser("BIBIMANGA", "Bibi Manga", "en", ContentType.HENTAI)
internal class BibiManga(context: MangaLoaderContext) : MadaraParser(context, MangaSource.BIBIMANGA, "bibimanga.com") {
override val datePattern = "MMMM dd, yyyy"
}

@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("BLOG_MANGA", "Blog Manga", "en")
internal class BlogManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.BLOG_MANGA, "blogmanga.net") {
override val postreq = true
}

@ -9,7 +9,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("BOYS_LOVE", "Boys Love", "en", ContentType.HENTAI)
internal class BoysLove(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.BOYS_LOVE, "boyslove.me", 20) {
override val tagPrefix = "boyslove-genre/"
override val listUrl = "boyslove/"
override val postreq = true

@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat
import java.util.EnumSet
@MangaSourceParser("COFFEE_MANGA_TOP", "Coffee Manga Top", "en")
@MangaSourceParser("COFFEE_MANGA_TOP", "Coffee Manga .Top", "en")
internal class CoffeeMangaTop(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.COFFEE_MANGA_TOP, "coffeemanga.top") {
override val tagPrefix = "mangas/"

@ -8,6 +8,5 @@ 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 datePattern = "dd-MMM"
}

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("CREEPYSCANS", "CreepyScans", "en")
@MangaSourceParser("CREEPYSCANS", "Creepy Scans", "en")
internal class CreepyScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.CREEPYSCANS, "creepyscans.com") {
override val stylepage = ""

@ -5,7 +5,7 @@ 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")
@MangaSourceParser("DARK_SCANS", "Dark Scans", "en")
internal class DarkScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DARK_SCANS, "darkscans.com", 18) {
override val listUrl = "mangas/"

@ -5,9 +5,8 @@ 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")
@MangaSourceParser("DRAGONTEA", "Dragon Tea", "en")
internal class DragonTea(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DRAGONTEA, "dragontea.ink") {
override val datePattern = "MM/dd/yyyy"
}

@ -8,7 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("DRAKESCANS", "Drake Scans", "en")
internal class DrakeScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DRAKESCANS, "drakescans.com", 10) {
override val datePattern = "dd/MM/yyyy"
override val tagPrefix = "series-genre/"
override val listUrl = "series/"

@ -6,6 +6,6 @@ import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("DUCKMANGA", "DuckManga", "en", ContentType.HENTAI)
@MangaSourceParser("DUCKMANGA", "Duck Manga", "en", ContentType.HENTAI)
internal class DuckManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.DUCKMANGA, "duckmanga.com", 20)

@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("FACTMANGA", "FactManga", "en")
@MangaSourceParser("FACTMANGA", "Fact Manga", "en")
internal class FactManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.FACTMANGA, "factmanga.com")

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

@ -8,6 +8,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("FREEMANGATOP", "Free Manga Top", "en")
internal class FreeMangaTop(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.FREEMANGATOP, "freemangatop.com") {
override val datePattern = "MM/dd/yyyy"
}

@ -8,7 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("FREEWEBTOONCOINS", "Free Webtoon Coins", "en")
internal class FreeWebtoonCoins(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.FREEWEBTOONCOINS, "freewebtooncoins.com") {
override val tagPrefix = "webtoon-genre/"
override val listUrl = "webtoon/"
}

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

@ -5,7 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("GOODGIRLS", "GoodGirls", "en")
@MangaSourceParser("GOODGIRLS", "Good Girls", "en")
internal class GoodGirls(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.GOODGIRLS, "goodgirls.moe", 10) {
override val selectDesc = "div.post-content_item:contains(Synopsis) div.summary-content"

@ -8,7 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("GOURMETSCANS", "Gourmet Scans", "en")
internal class GourmetScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.GOURMETSCANS, "gourmetscans.net") {
override val listUrl = "project/"
override val tagPrefix = "genre/"
override val stylepage = ""

@ -8,7 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("GRABBER", "Grabber", "en")
internal class Grabber(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.GRABBER, "grabber.zone", 20) {
override val tagPrefix = "type/"
override val listUrl = "comics/"
override val datePattern = "dd.MM.yyyy"

@ -9,7 +9,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HMANHWA", "HManhwa", "en", ContentType.HENTAI)
internal class HManhwa(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HMANHWA, "hmanhwa.com") {
override val tagPrefix = "manhwa-genre/"
override val listUrl = "manhwa/"
override val datePattern = "dd MMM"

@ -5,8 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HSCANS", "Hscans", "en")
internal class Hscans(context: MangaLoaderContext) :
@MangaSourceParser("HSCANS", "HScans", "en")
internal class HScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HSCANS, "hscans.com", 10) {
override val datePattern = "dd/MM/yyyy"

@ -5,6 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HARIMANGA", "HariManga", "en")
@MangaSourceParser("HARIMANGA", "Hari Manga", "en")
internal class HariManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HARIMANGA, "harimanga.com", pageSize = 10)

@ -9,6 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HENTAI3Z", "Hentai3z", "en", ContentType.HENTAI)
internal class Hentai3z(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAI3Z, "hentai3z.xyz", pageSize = 20) {
override val withoutAjax = true
}

@ -9,6 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HENTAIMANGA", "Hentai Manga", "en", ContentType.HENTAI)
internal class HentaiManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIMANGA, "hentaimanga.me", 36) {
override val postreq = true
}

@ -9,7 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HENTAIWEBTOON", "Hentai Webtoon", "en", ContentType.HENTAI)
internal class HentaiWebtoon(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIWEBTOON, "hentaiwebtoon.com") {
override val postreq = true
}

@ -9,6 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HENTAIXCOMIC", "Hentai x Comic", "en", ContentType.HENTAI)
internal class HentaixComic(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIXCOMIC, "hentaixcomic.com", 16) {
override val postreq = true
}

@ -9,6 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HENTAIXYURI", "Hentai x Yuri", "en", ContentType.HENTAI)
internal class HentaixYuri(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIXYURI, "hentaixyuri.com", 16) {
override val postreq = true
}

@ -16,7 +16,6 @@ internal class Hentaixdickgirl(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HENTAIXDICKGIRL, "hentaixdickgirl.com", 16) {
override val postreq = true
override suspend fun getChapters(manga: Manga, doc: Document): List<MangaChapter> {
val root2 = doc.body().selectFirstOrThrow("div.listing-chapters_wrap")
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)

@ -6,6 +6,6 @@ import org.koitharu.kotatsu.parsers.model.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HIPERDEX", "HiperDex", "en", ContentType.HENTAI)
@MangaSourceParser("HIPERDEX", "Hiper Dex", "en", ContentType.HENTAI)
internal class HiperDex(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HIPERDEX, "hiperdex.xyz", 36)
MadaraParser(context, MangaSource.HIPERDEX, "hiperdex.com", 36)

@ -5,10 +5,9 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("HUNTERSSCANEN", "Hunters Scan En", "en")
@MangaSourceParser("HUNTERSSCANEN", "Hunters Scan", "en")
internal class HuntersScanEn(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.HUNTERSSCANEN, "en.huntersscan.xyz") {
override val withoutAjax = true
override val datePattern = "MM/dd/yyyy"
override val tagPrefix = "series-genre/"

@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.util.*
import java.text.SimpleDateFormat
import java.util.*
@MangaSourceParser("ISEKAISCAN", "Isekai Scan Top", "en")
@MangaSourceParser("ISEKAISCAN", "Isekai Scan .Top", "en")
internal class IsekaiScan(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ISEKAISCAN, "isekaiscan.top", 16) {

@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.*
@MangaSourceParser("ISEKAISCAN_EU", "Isekai Scan To", "en")
@MangaSourceParser("ISEKAISCAN_EU", "Isekai Scan .To", "en")
internal class IsekaiScanEuParser(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ISEKAISCAN_EU, "m.isekaiscan.to") {

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

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

Loading…
Cancel
Save