[EpsilonScan] fix close #1038
[Keyoapp] fix pages close #1192 [Yaoiflix] Fix close #1201 [Teamxnovel] fix Searching close #1176 close #1185 [ManhwaLatino] close #1181 [MiHentai] fix close #1180 [GenzToon] close #1169 [MangaGalaxy] close #1168 ( redirect to VortexScans ) [CatharsisFantasy] close #1158 [CatharsisWorld] close #1157 Update soures
This commit is contained in:
2
.github/summary.yaml
vendored
2
.github/summary.yaml
vendored
@@ -1 +1 @@
|
||||
total: 1128
|
||||
total: 1151
|
||||
@@ -480,14 +480,14 @@ internal class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context
|
||||
title = doc.selectFirstOrThrow("h1").text(),
|
||||
url = id.toString(),
|
||||
coverUrl =
|
||||
"https:" +
|
||||
doc.selectFirstOrThrow("picture > source")
|
||||
.attr("data-srcset")
|
||||
.substringBefore(" "),
|
||||
"https:" +
|
||||
doc.selectFirstOrThrow("picture > source")
|
||||
.attr("data-srcset")
|
||||
.substringBefore(" "),
|
||||
publicUrl =
|
||||
doc.selectFirstOrThrow("h1 > a")
|
||||
.attrAsRelativeUrl("href")
|
||||
.toAbsoluteUrl(domain),
|
||||
doc.selectFirstOrThrow("h1 > a")
|
||||
.attrAsRelativeUrl("href")
|
||||
.toAbsoluteUrl(domain),
|
||||
author = null,
|
||||
tags = emptySet(),
|
||||
isNsfw = true,
|
||||
@@ -510,37 +510,37 @@ internal class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context
|
||||
return manga.copy(
|
||||
title = json.getString("title"),
|
||||
largeCoverUrl =
|
||||
json.getJSONArray("files").getJSONObject(0).let {
|
||||
val hash = it.getString("hash")
|
||||
val commonId = commonImageId()
|
||||
val imageId = imageIdFromHash(hash)
|
||||
val subDomain = 'a' + subdomainOffset(imageId)
|
||||
json.getJSONArray("files").getJSONObject(0).let {
|
||||
val hash = it.getString("hash")
|
||||
val commonId = commonImageId()
|
||||
val imageId = imageIdFromHash(hash)
|
||||
val subDomain = 'a' + subdomainOffset(imageId)
|
||||
|
||||
"https://${getDomain("${subDomain}a")}/webp/$commonId$imageId/$hash.webp"
|
||||
},
|
||||
"https://${getDomain("${subDomain}a")}/webp/$commonId$imageId/$hash.webp"
|
||||
},
|
||||
author =
|
||||
json.optJSONArray("artists")
|
||||
?.mapJSON { it.getString("artist").toCamelCase() }
|
||||
?.joinToString(),
|
||||
json.optJSONArray("artists")
|
||||
?.mapJSON { it.getString("artist").toCamelCase() }
|
||||
?.joinToString(),
|
||||
publicUrl = json.getString("galleryurl").toAbsoluteUrl(domain),
|
||||
tags =
|
||||
buildSet {
|
||||
json.optJSONArray("characters")
|
||||
?.mapToTags("character")
|
||||
?.let(::addAll)
|
||||
json.optJSONArray("tags")
|
||||
?.mapToTags("tag")
|
||||
?.let(::addAll)
|
||||
json.optJSONArray("artists")
|
||||
?.mapToTags("artist")
|
||||
?.let(::addAll)
|
||||
json.optJSONArray("parodys")
|
||||
?.mapToTags("parody")
|
||||
?.let(::addAll)
|
||||
json.optJSONArray("groups")
|
||||
?.mapToTags("group")
|
||||
?.let(::addAll)
|
||||
},
|
||||
buildSet {
|
||||
json.optJSONArray("characters")
|
||||
?.mapToTags("character")
|
||||
?.let(::addAll)
|
||||
json.optJSONArray("tags")
|
||||
?.mapToTags("tag")
|
||||
?.let(::addAll)
|
||||
json.optJSONArray("artists")
|
||||
?.mapToTags("artist")
|
||||
?.let(::addAll)
|
||||
json.optJSONArray("parodys")
|
||||
?.mapToTags("parody")
|
||||
?.let(::addAll)
|
||||
json.optJSONArray("groups")
|
||||
?.mapToTags("group")
|
||||
?.let(::addAll)
|
||||
},
|
||||
chapters = listOf(
|
||||
MangaChapter(
|
||||
id = generateUid(manga.url),
|
||||
@@ -564,15 +564,15 @@ internal class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context
|
||||
mapJSON {
|
||||
MangaTag(
|
||||
title =
|
||||
it.getString(key).toCamelCase().let { title ->
|
||||
if (it.getStringOrNull("female")?.toIntOrNull() == 1) {
|
||||
"$title ♀"
|
||||
} else if (it.getStringOrNull("male")?.toIntOrNull() == 1) {
|
||||
"$title ♂"
|
||||
} else {
|
||||
title
|
||||
}
|
||||
},
|
||||
it.getString(key).toCamelCase().let { title ->
|
||||
if (it.getStringOrNull("female")?.toIntOrNull() == 1) {
|
||||
"$title ♀"
|
||||
} else if (it.getStringOrNull("male")?.toIntOrNull() == 1) {
|
||||
"$title ♂"
|
||||
} else {
|
||||
title
|
||||
}
|
||||
},
|
||||
key = it.getString("url").tagUrlToTag(),
|
||||
source = source,
|
||||
).let(tags::add)
|
||||
|
||||
@@ -18,7 +18,7 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex
|
||||
|
||||
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY)
|
||||
|
||||
override val configKeyDomain = ConfigKey.Domain("teamoney.site")
|
||||
override val configKeyDomain = ConfigKey.Domain("olympustaff.com")
|
||||
|
||||
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
|
||||
super.onCreateConfig(keys)
|
||||
@@ -28,7 +28,6 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex
|
||||
override val filterCapabilities: MangaListFilterCapabilities
|
||||
get() = MangaListFilterCapabilities(
|
||||
isSearchSupported = true,
|
||||
isSearchWithFiltersSupported = true,
|
||||
)
|
||||
|
||||
override suspend fun getFilterOptions() = MangaListFilterOptions(
|
||||
@@ -45,49 +44,55 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex
|
||||
val url = buildString {
|
||||
append("https://")
|
||||
append(domain)
|
||||
|
||||
if (order == SortOrder.UPDATED) {
|
||||
if (filter.tags.isNotEmpty() || filter.demographics.isNotEmpty()) {
|
||||
throw IllegalArgumentException("Updated sorting does not support other sorting filters")
|
||||
}
|
||||
append("/?page=")
|
||||
append(page.toString())
|
||||
} else {
|
||||
append("/series?page=")
|
||||
append(page.toString())
|
||||
|
||||
filter.query?.let {
|
||||
append("&search=")
|
||||
when {
|
||||
!filter.query.isNullOrEmpty() -> {
|
||||
append("/?search=")
|
||||
append(filter.query.urlEncoded())
|
||||
append("&page=")
|
||||
append(page)
|
||||
}
|
||||
|
||||
filter.tags.oneOrThrowIfMany()?.let {
|
||||
append("&genre=")
|
||||
append(it.key)
|
||||
}
|
||||
else -> {
|
||||
|
||||
filter.types.forEach {
|
||||
append("&type=")
|
||||
append(
|
||||
when (it) {
|
||||
ContentType.MANGA -> "مانجا ياباني"
|
||||
ContentType.MANHWA -> "مانهوا كورية"
|
||||
ContentType.MANHUA -> "مانها صيني"
|
||||
else -> ""
|
||||
},
|
||||
)
|
||||
}
|
||||
if (order == SortOrder.UPDATED) {
|
||||
if (filter.tags.isNotEmpty() || filter.demographics.isNotEmpty()) {
|
||||
throw IllegalArgumentException("Updated sorting does not support other sorting filters")
|
||||
}
|
||||
append("/?page=")
|
||||
append(page.toString())
|
||||
} else {
|
||||
append("/series?page=")
|
||||
append(page.toString())
|
||||
|
||||
filter.states.oneOrThrowIfMany()?.let {
|
||||
append("status=")
|
||||
append(
|
||||
when (it) {
|
||||
MangaState.ONGOING -> "مستمرة"
|
||||
MangaState.FINISHED -> "مكتمل"
|
||||
MangaState.ABANDONED -> "متوقف"
|
||||
else -> "مستمرة"
|
||||
},
|
||||
)
|
||||
filter.tags.oneOrThrowIfMany()?.let {
|
||||
append("&genre=")
|
||||
append(it.key)
|
||||
}
|
||||
|
||||
filter.types.forEach {
|
||||
append("&type=")
|
||||
append(
|
||||
when (it) {
|
||||
ContentType.MANGA -> "مانجا ياباني"
|
||||
ContentType.MANHWA -> "مانهوا كورية"
|
||||
ContentType.MANHUA -> "مانها صيني"
|
||||
else -> ""
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
filter.states.oneOrThrowIfMany()?.let {
|
||||
append("status=")
|
||||
append(
|
||||
when (it) {
|
||||
MangaState.ONGOING -> "مستمرة"
|
||||
MangaState.FINISHED -> "مكتمل"
|
||||
MangaState.ABANDONED -> "متوقف"
|
||||
else -> "مستمرة"
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import org.jsoup.nodes.Element
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.PagedMangaParser
|
||||
@@ -13,6 +14,7 @@ import org.koitharu.kotatsu.parsers.model.*
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import java.util.*
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("PURURIN", "Pururin", "en", ContentType.HENTAI)
|
||||
internal class Pururin(context: MangaLoaderContext) :
|
||||
PagedMangaParser(context, MangaParserSource.PURURIN, pageSize = 20) {
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package org.koitharu.kotatsu.parsers.site.fuzzydoodle.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.MangaListFilterOptions
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.fuzzydoodle.FuzzyDoodleParser
|
||||
import java.util.EnumSet
|
||||
|
||||
@MangaSourceParser("RESETSCANS", "ResetScans", "en")
|
||||
internal class ResetScans(context: MangaLoaderContext) :
|
||||
FuzzyDoodleParser(context, MangaParserSource.RESETSCANS, "reset-scans.xyz") {
|
||||
|
||||
override suspend fun getFilterOptions() = MangaListFilterOptions(
|
||||
availableContentTypes = EnumSet.of(
|
||||
ContentType.MANGA,
|
||||
ContentType.MANHWA,
|
||||
ContentType.MANHUA,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import org.koitharu.kotatsu.parsers.util.domain
|
||||
@Broken // Not dead, changed template
|
||||
@MangaSourceParser("TEMPLESCAN", "TempleScan", "en")
|
||||
internal class TempleScan(context: MangaLoaderContext) :
|
||||
HeanCms(context, MangaParserSource.TEMPLESCAN, "templescan.net") {
|
||||
HeanCms(context, MangaParserSource.TEMPLESCAN, "templetoons.com") {
|
||||
override val pathManga = "comic"
|
||||
|
||||
override val apiPath: String
|
||||
|
||||
@@ -9,4 +9,4 @@ import org.koitharu.kotatsu.parsers.site.heancms.HeanCms
|
||||
@Broken // Not dead but changed template
|
||||
@MangaSourceParser("YUGEN_MANGAS_ES", "YugenMangas.lat", "es", ContentType.HENTAI)
|
||||
internal class YugenMangasEs(context: MangaLoaderContext) :
|
||||
HeanCms(context, MangaParserSource.YUGEN_MANGAS_ES, "lectorikigai.efope.com")
|
||||
HeanCms(context, MangaParserSource.YUGEN_MANGAS_ES, "lectorikigai.acamu.net")
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.koitharu.kotatsu.parsers.model.*
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import org.koitharu.kotatsu.parsers.util.json.asTypedList
|
||||
import org.koitharu.kotatsu.parsers.util.json.getBooleanOrDefault
|
||||
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
|
||||
import org.koitharu.kotatsu.parsers.util.json.mapJSON
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
@@ -131,13 +132,17 @@ internal abstract class IkenParser(
|
||||
val seriesId = manga.id
|
||||
val url = "https://$domain/api/chapters?postId=$seriesId&skip=0&take=1000&order=desc&userid="
|
||||
val json = webClient.httpGet(url).parseJson().getJSONObject("post")
|
||||
val slug = json.getString("slug")
|
||||
val slug = json.getStringOrNull("slug")
|
||||
val data = json.getJSONArray("chapters").asTypedList<JSONObject>()
|
||||
val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH)
|
||||
return manga.copy(
|
||||
chapters = data.mapChapters(reversed = true) { i, it ->
|
||||
val chapterUrl =
|
||||
"/series/$slug/${it.getString("slug")}"
|
||||
val slugName = if (slug.isNullOrEmpty()) {
|
||||
it.getJSONObject("mangaPost").getString("slug")
|
||||
} else {
|
||||
slug
|
||||
}
|
||||
val chapterUrl = "/series/$slugName/${it.getString("slug")}"
|
||||
MangaChapter(
|
||||
id = it.getLong("id"),
|
||||
name = "Chapter : ${it.getInt("number")}",
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
package org.koitharu.kotatsu.parsers.site.iken.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.iken.IkenParser
|
||||
|
||||
@Broken // Redirect to @VORTEXSCANS
|
||||
@MangaSourceParser("MANGAGALAXY", "MangaGalaxy", "en")
|
||||
internal class MangaGalaxyParser(context: MangaLoaderContext) :
|
||||
IkenParser(context, MangaParserSource.MANGAGALAXY, "mangagalaxy.net")
|
||||
IkenParser(context, MangaParserSource.MANGAGALAXY, "vortexscans.org") {
|
||||
override val selectPages = "main section img"
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.iken.IkenParser
|
||||
|
||||
@MangaSourceParser("VORTEXSCANS", "VortexScans", "en")
|
||||
internal class VortexScans(context: MangaLoaderContext) :
|
||||
IkenParser(context, MangaParserSource.VORTEXSCANS, "vortextoon.com") {
|
||||
IkenParser(context, MangaParserSource.VORTEXSCANS, "vortexscans.org") {
|
||||
override val selectPages = "main section img"
|
||||
}
|
||||
|
||||
@@ -228,23 +228,14 @@ internal abstract class KeyoappParser(
|
||||
override suspend fun getPages(chapter: MangaChapter): List<MangaPage> {
|
||||
val fullUrl = chapter.url.toAbsoluteUrl(domain)
|
||||
val doc = webClient.httpGet(fullUrl).parseHtml()
|
||||
val cdnUrl = doc.selectFirstOrThrow("script:containsData(primaryUrl)").data().substringAfter("https://cdn.")
|
||||
.substringBefore("\${uid}")
|
||||
|
||||
if (cdnUrl.isNotEmpty()) {
|
||||
return doc.select(selectPage).map { img ->
|
||||
val uid = img.attr("uid") ?: img.parseFailed("Image src not found")
|
||||
val url = "https://cdn.$cdnUrl$uid"
|
||||
MangaPage(
|
||||
id = generateUid(url),
|
||||
url = url,
|
||||
preview = null,
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
} else {
|
||||
return doc.select(selectPage).map { img ->
|
||||
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found")
|
||||
val cdnUrl = getCdnUrl(doc)
|
||||
doc.select(selectPage)
|
||||
.map { it.attr("uid") }
|
||||
.filter { it.isNotEmpty() }
|
||||
.also { cdnUrl ?: throw Exception("Image url not found") }
|
||||
.map { img ->
|
||||
val url = "$cdnUrl/$img"
|
||||
MangaPage(
|
||||
id = generateUid(url),
|
||||
url = url,
|
||||
@@ -252,10 +243,34 @@ internal abstract class KeyoappParser(
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
.takeIf { it.isNotEmpty() }
|
||||
?.also { return it }
|
||||
|
||||
return doc.select(selectPage).map { img ->
|
||||
val url = img.src()?.toRelativeUrl(domain) ?: img.parseFailed("Image src not found")
|
||||
MangaPage(
|
||||
id = generateUid(url),
|
||||
url = url,
|
||||
preview = null,
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected open val cdnRegex = """realUrl\s*=\s*`[^`]+//(?<host>[^/]+)""".toRegex()
|
||||
|
||||
protected open fun getCdnUrl(document: Document): String? {
|
||||
return document.select("script")
|
||||
.firstOrNull { cdnRegex.containsMatchIn(it.html()) }
|
||||
?.let {
|
||||
val cdnHost = cdnRegex.find(it.html())
|
||||
?.groups?.get("host")?.value
|
||||
?.replace(cdnRegex, "")
|
||||
"https://$cdnHost/uploads"
|
||||
}
|
||||
}
|
||||
|
||||
protected fun parseChapterDate(dateFormat: DateFormat, date: String?): Long {
|
||||
val d = date?.lowercase() ?: return 0
|
||||
return when {
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.en
|
||||
package org.koitharu.kotatsu.parsers.site.keyoapp.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
import org.koitharu.kotatsu.parsers.site.keyoapp.KeyoappParser
|
||||
|
||||
@MangaSourceParser("ARVENSCANS", "ArvenComics", "en")
|
||||
internal class ArvenScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.ARVENSCANS, "arvencomics.com", pageSize = 20, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
}
|
||||
KeyoappParser(context, MangaParserSource.ARVENSCANS, "arvencomics.com")
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.keyoapp.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.keyoapp.KeyoappParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("LAIDBACKSCANS", "LaidBackScans", "en")
|
||||
internal class LaidBackScans(context: MangaLoaderContext) :
|
||||
KeyoappParser(context, MangaParserSource.LAIDBACKSCANS, "laidbackscans.org")
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.en
|
||||
package org.koitharu.kotatsu.parsers.site.keyoapp.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
import org.koitharu.kotatsu.parsers.site.keyoapp.KeyoappParser
|
||||
|
||||
@MangaSourceParser("RAISCANS", "KenScans", "en")
|
||||
internal class RaiScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.RAISCANS, "kenscans.com", pageSize = 20, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
}
|
||||
KeyoappParser(context, MangaParserSource.RAISCANS, "kenscans.com")
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.keyoapp.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.keyoapp.KeyoappParser
|
||||
|
||||
@MangaSourceParser("SURYASCANS", "GenzToon", "en")
|
||||
internal class SuryaScans(context: MangaLoaderContext) :
|
||||
KeyoappParser(context, MangaParserSource.SURYASCANS, "genzupdates.com")
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.keyoapp.fr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.keyoapp.KeyoappParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("ASTRAMES", "Astrames", "fr")
|
||||
internal class Astrames(context: MangaLoaderContext) :
|
||||
KeyoappParser(context, MangaParserSource.ASTRAMES, "astrames.fr")
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.fr
|
||||
package org.koitharu.kotatsu.parsers.site.keyoapp.fr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.site.keyoapp.KeyoappParser
|
||||
|
||||
@MangaSourceParser("REAPERSCANS_FR", "ReaperScans.fr", "fr")
|
||||
internal class ReaperScansFr(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.REAPERSCANS_FR, "reaperscans.fr") {
|
||||
override val datePattern = "MM/dd/yyyy"
|
||||
}
|
||||
KeyoappParser(context, MangaParserSource.REAPERSCANS_FR, "reaper-scans.fr")
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.all
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||
@@ -7,6 +8,7 @@ import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import java.util.*
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("EROMANHWA", "EroManhwa", "", ContentType.HENTAI)
|
||||
internal class EroManhwa(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.EROMANHWA, "eromanhwa.org") {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.ar
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("MANGAPEAK", "MangaPeak", "ar")
|
||||
internal class MangaPeak(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGAPEAK, "mangapeak.org")
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.ar
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("MANGATIME", "MangaTime", "ar")
|
||||
internal class MangaTime(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGATIME, "mangatime.us") {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("ELITEMANGA", "EliteManga", "en")
|
||||
internal class EliteManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.ELITEMANGA, "www.beinmanga.com")
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("FIRSTKISSMANHUA", "FirstKissManhua", "en")
|
||||
internal class FirstKissManhua(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.FIRSTKISSMANHUA, "1stkissmanhua.net", 20) {
|
||||
override val listUrl = "manhua/"
|
||||
}
|
||||
@@ -1,13 +1,11 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("HIPERDEX", "HiperDex", "en", ContentType.HENTAI)
|
||||
@MangaSourceParser("HIPERDEX", "HiperToon", "en", ContentType.HENTAI)
|
||||
internal class HiperDex(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.HIPERDEX, "hiperdex.com", 36)
|
||||
MadaraParser(context, MangaParserSource.HIPERDEX, "hipertoon.com", 36)
|
||||
|
||||
@@ -1,48 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.jsoup.nodes.Document
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrlOrNull
|
||||
import org.koitharu.kotatsu.parsers.util.domain
|
||||
import org.koitharu.kotatsu.parsers.util.generateUid
|
||||
import org.koitharu.kotatsu.parsers.util.mapChapters
|
||||
import org.koitharu.kotatsu.parsers.util.parseFailed
|
||||
import org.koitharu.kotatsu.parsers.util.parseHtml
|
||||
import org.koitharu.kotatsu.parsers.util.removeSuffix
|
||||
import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl
|
||||
import java.text.SimpleDateFormat
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("HUNLIGHT", "HunLight", "en")
|
||||
internal class HunLight(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.HUNLIGHT, "hunlight.com") {
|
||||
override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> {
|
||||
val url = mangaUrl.toAbsoluteUrl(domain).removeSuffix('/') + "/ajax/chapters/"
|
||||
val doc = webClient.httpPost(url, emptyMap()).parseHtml()
|
||||
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
|
||||
return doc.select(selectChapter).mapChapters { i, li ->
|
||||
val a = li.selectFirst("a")
|
||||
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
|
||||
val link = href + stylePage
|
||||
val dateText = li.selectFirst("a.c-new-tag")?.attr("title") ?: li.selectFirst(selectDate)?.text()
|
||||
val name = a.selectFirst("p")?.text() ?: a.ownText()
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = i + 1f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
dateText,
|
||||
),
|
||||
scanlator = null,
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
MadaraParser(context, MangaParserSource.HUNLIGHT, "hunlight.com")
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("HUNTERSSCANEN", "EnHuntersScan", "en")
|
||||
internal class HuntersScanEn(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.HUNTERSSCANEN, "en.huntersscan.xyz") {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("INFAMOUSSCANS", "InfamousScans", "en")
|
||||
internal class InfamousScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.INFAMOUSSCANS, "infamous-scans.com", 10)
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("LEVIATANSCANS", "LsComic", "en")
|
||||
internal class LeviatanScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.LEVIATANSCANS, "lscomic.com", 10)
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("MANGAHALL", "MangaHolic", "en", ContentType.HENTAI)
|
||||
internal class MangaHall(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGAHALL, "mangaholic.org", 24)
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("MANGATX_TO", "MangaTx.to", "en")
|
||||
internal class MangaTxTo(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGATX_TO, "mangatx.to", 10) {
|
||||
|
||||
@@ -15,7 +15,7 @@ import java.text.SimpleDateFormat
|
||||
|
||||
@MangaSourceParser("MANYTOON", "ManyToon", "en", ContentType.HENTAI)
|
||||
internal class ManyToon(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANYTOON, "manytoon.com", 20) {
|
||||
MadaraParser(context, MangaParserSource.MANYTOON, "manytoon.org", 20) {
|
||||
override val listUrl = "comic/"
|
||||
override val postReq = true
|
||||
override val withoutAjax = true
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("MSYPUBLISHER", "MsyPublisher", "en")
|
||||
internal class MsyPublisher(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MSYPUBLISHER, "msypublisher.com", 20) {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("NIGHTCOMIC", "Night Comic", "en")
|
||||
internal class NightComic(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.NIGHTCOMIC, "www.nightcomic.com") {
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("PONYMANGA", "PonyManga", "en", ContentType.HENTAI)
|
||||
internal class PonyManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.PONYMANGA, "ponymanga.com", 10)
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.select.Elements
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Collections.emptyMap
|
||||
|
||||
@MangaSourceParser("RESETSCANS", "ResetScans", "en")
|
||||
internal class ResetScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.RESETSCANS, "rspro.xyz", 18) {
|
||||
override val datePattern = "MMM dd"
|
||||
|
||||
override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> {
|
||||
val doc = if (postReq) {
|
||||
val mangaId = document.select("div#manga-chapters-holder").attr("data-id")
|
||||
val url = "https://$domain/wp-admin/admin-ajax.php"
|
||||
val postData = "action=manga_get_chapters&manga=$mangaId"
|
||||
webClient.httpPost(url, postData).parseHtml()
|
||||
} else {
|
||||
val url = mangaUrl.toAbsoluteUrl(domain).removeSuffix('/') + "/ajax/chapters/"
|
||||
webClient.httpPost(url, emptyMap()).parseHtml()
|
||||
}
|
||||
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
|
||||
return doc.select(selectChapter).mapChapters(reversed = true) { _, li ->
|
||||
val a = li.getElementsByTag("a").findWithText()
|
||||
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
|
||||
val link = href + stylePage
|
||||
val dateText = li.selectFirst("a.c-new-tag")?.attr("title") ?: li.selectFirst(selectDate)?.text()
|
||||
val name = a.text()
|
||||
MangaChapter(
|
||||
id = generateUid(href),
|
||||
url = link,
|
||||
name = name,
|
||||
number = 0f,
|
||||
volume = 0,
|
||||
branch = null,
|
||||
uploadDate = parseChapterDate(
|
||||
dateFormat,
|
||||
dateText,
|
||||
),
|
||||
scanlator = null,
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun Elements.findWithText() = firstOrNull { it.hasText() } ?: first()
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("TOONCHILL", "ToonChill", "en")
|
||||
internal class ToonChill(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.TOONCHILL, "toonchill.com", 32)
|
||||
|
||||
@@ -5,8 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("RACKUSREADS", "RackusReads", "en")
|
||||
internal class RackusReads(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.RACKUSREADS, "rackusreads.com", 20) {
|
||||
override val datePattern = "MM/dd/yyyy"
|
||||
}
|
||||
@MangaSourceParser("VYVYMANGA", "VyvyManga", "en")
|
||||
internal class VyvyManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.VYVYMANGA, "vyvymanga.org")
|
||||
@@ -6,6 +6,6 @@ import org.koitharu.kotatsu.parsers.model.ContentType
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("ZINCHANMANGA", "ZinChanManga.com", "en", ContentType.HENTAI)
|
||||
@MangaSourceParser("ZINCHANMANGA", "ZinChanManga.Com", "en", ContentType.HENTAI)
|
||||
internal class ZinChanManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.ZINCHANMANGA, "zinchanmanga.com", 10)
|
||||
MadaraParser(context, MangaParserSource.ZINCHANMANGA, "zinchangmanga.com", 10)
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("ZINCHANMANGA_NET", "ZinchanManga.net", "en")
|
||||
internal class ZinchanMangaNet(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.ZINCHANMANGA_NET, "zinchanmanga.net", 10)
|
||||
MadaraParser(context, MangaParserSource.ZINCHANMANGA_NET, "zinchangmanga.net", 10)
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("DARKNEBULUS", "Darknebulus", "es")
|
||||
internal class Darknebulus(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.DARKNEBULUS, "www.darknebulus.com")
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("EMPERORSCAN", "EmperorScan", "es")
|
||||
internal class EmperorScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.EMPERORSCAN, "seriesemperor.com")
|
||||
MadaraParser(context, MangaParserSource.EMPERORSCAN, "zonaemperor.com")
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("HOUSEOFOTAKUS", "HouseOfOtakus", "es")
|
||||
internal class HouseOfOtakus(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.HOUSEOFOTAKUS, "houseofotakus.xyz")
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.es
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("JOBSIBE", "Jobsibe", "es")
|
||||
internal class Jobsibe(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.JOBSIBE, "jobsibe.com") {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.es
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("LECTORUNM", "Lectorunm.life", "es")
|
||||
internal class Lectorunm(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.LECTORUNM, "lectorunm.life") {
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("LEGENDSCANLATIONS", "LegendScanlations", "es")
|
||||
internal class LegendScanlations(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.LEGENDSCANLATIONS, "legendscanlations.com", 10) {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MANGA_CRAB", "MangaCrab", "es")
|
||||
internal class MangaCrab(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGA_CRAB, "wikicrab.xyz") {
|
||||
MadaraParser(context, MangaParserSource.MANGA_CRAB, "toonscrab.com") {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
override val tagPrefix = "manga-genero/"
|
||||
override val listUrl = "series/"
|
||||
|
||||
@@ -5,9 +5,8 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MANGAMUNDODRAMA", "MangaMundoDrama", "es")
|
||||
@MangaSourceParser("MANGAMUNDODRAMA", "InmortalScan", "es")
|
||||
internal class MangaMundoDrama(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGAMUNDODRAMA, "manga.mundodrama.site") {
|
||||
|
||||
MadaraParser(context, MangaParserSource.MANGAMUNDODRAMA, "scaninmortal.com") {
|
||||
override val listUrl = "mg/"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.es
|
||||
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.nodes.Element
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||
@@ -10,6 +14,7 @@ import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.ArrayList
|
||||
|
||||
@MangaSourceParser("MANHWALATINO", "ManhwaLatino", "es", ContentType.HENTAI)
|
||||
internal class ManhwaLatino(context: MangaLoaderContext) :
|
||||
@@ -17,9 +22,35 @@ internal class ManhwaLatino(context: MangaLoaderContext) :
|
||||
override val datePattern = "MM/dd"
|
||||
override val selectPage = "div.page-break img.wp-manga-chapter-img"
|
||||
override suspend fun getChapters(manga: Manga, doc: Document): List<MangaChapter> {
|
||||
val root2 = doc.body().selectFirstOrThrow("div.content-area")
|
||||
val maxPageChapter = doc.selectLast("div.pagination .page")?.text()?.toInt() ?: 1
|
||||
val url = manga.url.toAbsoluteUrl(domain)
|
||||
return run {
|
||||
if (maxPageChapter == 1) {
|
||||
parseChapters(doc)
|
||||
} else {
|
||||
coroutineScope {
|
||||
val result = ArrayList(parseChapters(doc))
|
||||
result.ensureCapacity(result.size * maxPageChapter)
|
||||
(2..maxPageChapter).map { i ->
|
||||
async {
|
||||
loadChapters(url, i)
|
||||
}
|
||||
}.awaitAll()
|
||||
.flattenTo(result)
|
||||
result
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun loadChapters(url: String, page: Int): List<MangaChapter> {
|
||||
return parseChapters(webClient.httpGet("$url/?t=$page").parseHtml().body())
|
||||
}
|
||||
|
||||
private fun parseChapters(doc: Element): List<MangaChapter> {
|
||||
val root2 = doc.selectFirstOrThrow("div.content-area")
|
||||
val dateFormat = SimpleDateFormat(datePattern, sourceLocale)
|
||||
return root2.select(selectChapter).mapChapters(reversed = true) { i, li ->
|
||||
return root2.select(selectChapter).mapChapters { i, li ->
|
||||
val a = li.selectFirst("a")
|
||||
val href = a?.attrAsRelativeUrlOrNull("href") ?: li.parseFailed("Link is missing")
|
||||
val link = href + stylePage
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
// redirect to @PANCONCOLA
|
||||
@MangaSourceParser("MANTRAZSCAN", "MantrazScan", "es")
|
||||
internal class MantrazScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANTRAZSCAN, "panconcola.com") {
|
||||
MadaraParser(context, MangaParserSource.MANTRAZSCAN, "artessupremas.com") {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
override val tagPrefix = "generos-de-manga/"
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MHSCANS", "MhScans", "es")
|
||||
internal class MhScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MHSCANS, "mh.cookni.net") {
|
||||
MadaraParser(context, MangaParserSource.MHSCANS, "twobluescans.com") {
|
||||
override val datePattern = "d 'de' MMMMM 'de' yyyy"
|
||||
override val listUrl = "series/"
|
||||
}
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MI2MANGAES", "Mi2MangaEs", "es")
|
||||
internal class Mi2MangaEs(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MI2MANGAES, "es.mi2manga.com", 10)
|
||||
MadaraParser(context, MangaParserSource.MI2MANGAES, "mi2manga.lat", 10)
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("PANCONCOLA", "Panconcola", "es")
|
||||
internal class Panconcola(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.PANCONCOLA, "panconcola.com") {
|
||||
MadaraParser(context, MangaParserSource.PANCONCOLA, "artessupremas.com") {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
override val tagPrefix = "generos-de-manga/"
|
||||
}
|
||||
|
||||
@@ -8,5 +8,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
@MangaSourceParser("SAMURAISCAN", "SamuraiScan", "es")
|
||||
internal class SamuraiScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.SAMURAISCAN, "latan.visorsmr.com", 10) {
|
||||
override val listUrl = "leer/"
|
||||
override val listUrl = "read/"
|
||||
}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.es
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("SCAMBERTRASLATOR", "ScamberTraslator", "es")
|
||||
internal class Scambertraslator(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.SCAMBERTRASLATOR, "scambertraslator.com") {
|
||||
|
||||
@@ -8,6 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("TOPCOMICPORNO", "TopComicPorno", "es", ContentType.HENTAI)
|
||||
internal class TopComicPorno(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.TOPCOMICPORNO, "topcomicporno.com", 18) {
|
||||
MadaraParser(context, MangaParserSource.TOPCOMICPORNO, "topcomicporno.net", 18) {
|
||||
override val datePattern = "MMM dd, yy"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("TRADUCCIONESAMISTOSAS", "TraduccionesAmistosas", "es")
|
||||
internal class TraduccionesAmistosas(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.TRADUCCIONESAMISTOSAS, "traduccionesamistosas.eyudud.net", 10) {
|
||||
override val datePattern = "d 'de' MMMMM 'de' yyyy"
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("YAOIMANGA", "YaoiManga", "es")
|
||||
internal class YaoiManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.YAOIMANGA, "yaoimanga.es", 42)
|
||||
@@ -9,4 +9,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
internal class EpsilonSoft(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.EPSILONSOFT, "epsilonsoft.to") {
|
||||
override val datePattern = "dd/MM/yy"
|
||||
override val withoutAjax = true
|
||||
}
|
||||
|
||||
@@ -10,4 +10,5 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
internal class EpsilonscanParser(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.EPSILONSCAN, "epsilonscan.to") {
|
||||
override val datePattern = "dd/MM/yy"
|
||||
override val withoutAjax = true
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("INOVASCANMANGA", "InovaScanManga", "fr")
|
||||
internal class InovaScanManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.INOVASCANMANGA, "inovascanmanga.com") {
|
||||
override val datePattern = "d MMMM yyyy"
|
||||
}
|
||||
@@ -8,7 +8,7 @@ import java.util.*
|
||||
|
||||
@MangaSourceParser("LUMOSKOMIK", "LumosKomik", "id")
|
||||
internal class LumosKomik(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.LUMOSKOMIK, "lumoskomik.com") {
|
||||
MadaraParser(context, MangaParserSource.LUMOSKOMIK, "lumos01.com") {
|
||||
override val tagPrefix = "genre/"
|
||||
override val listUrl = "komik/"
|
||||
override val datePattern = "dd MMMM yyyy"
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.*
|
||||
|
||||
@MangaSourceParser("SHINIGAMI", "Shinigami", "id")
|
||||
internal class Shinigami(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.SHINIGAMI, "shinigami05.com", 10) {
|
||||
MadaraParser(context, MangaParserSource.SHINIGAMI, "shinigami06.com", 10) {
|
||||
override val tagPrefix = "genre/"
|
||||
override val listUrl = "series/"
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import java.util.Locale
|
||||
|
||||
@MangaSourceParser("YURAMANGA", "YuraManga", "id")
|
||||
internal class YuraManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.YURAMANGA, "yuramanga.my.id") {
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("ARCTICSCAN", "ArcticScan", "pt")
|
||||
internal class ArcticScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.ARCTICSCAN, "alonescanlator.com.br") {
|
||||
override val datePattern: String = "yyyy-MM-dd"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("BRMANGASTOP", "BrMangasTop", "pt")
|
||||
internal class BrMangasTop(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.BRMANGASTOP, "brmangas.top", 10) {
|
||||
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
|
||||
}
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("DREAMSCAN", "DreamScan", "pt")
|
||||
internal class DreamScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.DREAMSCAN, "dreamscan.com.br")
|
||||
MadaraParser(context, MangaParserSource.DREAMSCAN, "fairydream.com.br")
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.pt
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("HIKARISCAN", "HikariScan", "pt")
|
||||
internal class HikariScan(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.HIKARISCAN, "hikariscan.org", pageSize = 20, searchPageSize = 10)
|
||||
MadaraParser(context, MangaParserSource.HIKARISCAN, "hikariscan.org")
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.pt
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("NIRVANASCAN", "NirvanaScan", "pt")
|
||||
internal class NirvanaScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.NIRVANASCAN, "nirvanascan.com")
|
||||
@@ -0,0 +1,12 @@
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("PLUMACOMICS", "PlumaComics", "pt")
|
||||
internal class PlumaComics(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.PLUMACOMICS, "plumacomics.cloud") {
|
||||
override val datePattern: String = "dd 'de' MMMMM 'de' yyyy"
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.pt
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("RAINBOWFAIRYSCAN", "RainbowFairyScan", "pt")
|
||||
internal class RainbowFairyScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.RAINBOWFAIRYSCAN, "rainbowfairyscan.com", 10) {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("ATIKROST", "Atikrost", "tr")
|
||||
internal class Atikrost(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.ATIKROST, "www.mangaoku.org", 10) {
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("DECCALSCANS", "DeccalScans", "tr", ContentType.HENTAI)
|
||||
internal class DeccalScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.DECCALSCANS, "deccalscans.net") {
|
||||
MadaraParser(context, MangaParserSource.DECCALSCANS, "fuchscans.com") {
|
||||
override val tagPrefix = "turler/"
|
||||
}
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
//This source requires an account.
|
||||
@Broken // Redirect to @MANGAGEZGINI
|
||||
@MangaSourceParser("GLORYMANGA", "GloryManga", "tr")
|
||||
internal class GloryManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.GLORYMANGA, "glorymanga.com", 18) {
|
||||
MadaraParser(context, MangaParserSource.GLORYMANGA, "mangagezgini.dev", 18) {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
//This source requires an account.
|
||||
@MangaSourceParser("GRIMELEK", "Grimelek", "tr")
|
||||
internal class Grimelek(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.GRIMELEK, "grimelek.pro", 20) {
|
||||
MadaraParser(context, MangaParserSource.GRIMELEK, "grimelek.dev", 20) {
|
||||
override val datePattern = "d MMMM yyyy"
|
||||
override val listUrl = "seri/"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("JIANGZAITOON", "JiangzaiToon", "tr", ContentType.HENTAI)
|
||||
internal class Jiangzaitoon(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.JIANGZAITOON, "jiangzaitoon.pro") {
|
||||
MadaraParser(context, MangaParserSource.JIANGZAITOON, "jiangzaitoon.gay") {
|
||||
override val datePattern = "d MMMM yyyy"
|
||||
override val postReq = true
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("LICHSUBS", "LichSubs", "tr")
|
||||
internal class LichSubs(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.LICHSUBS, "www.kuroimanga.com") {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
}
|
||||
@@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MAJORSCANS", "MajorScans", "tr")
|
||||
internal class MajorScans(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MAJORSCANS, "www.mangatilkisi.com", pageSize = 18) {
|
||||
MadaraParser(context, MangaParserSource.MAJORSCANS, "www.manga-tilkisi.com", pageSize = 18) {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MANGAGEZGINI", "MangaGezgini", "tr")
|
||||
internal class MangaGezgini(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGAGEZGINI, "mangagezgini.dev", pageSize = 20) {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MANGARUHU", "MangaRuhu", "tr")
|
||||
internal class MangaRuhu(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGARUHU, "mangaruhu.com", 16)
|
||||
@@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MANGATR", "MangaTr", "tr")
|
||||
internal class MangaTr(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MANGATR, "mangatr.net") {
|
||||
MadaraParser(context, MangaParserSource.MANGATR, "mangatr.me") {
|
||||
override val tagPrefix = "tur/"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
|
||||
@MangaSourceParser("MUGIMANGA", "MugiManga", "tr")
|
||||
internal class MugiManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.MUGIMANGA, "mugimanga.com", 20) {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
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.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("YAOIFLIX", "YaoiFlix", "tr", ContentType.HENTAI)
|
||||
internal class YaoiFlix(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.YAOIFLIX, "yaoiflix.gay", 16)
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("YAOITR", "YaoiTr", "tr")
|
||||
internal class YaoiTr(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.YAOITR, "yaoitr.fun", 16) {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.tr
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("ZAMANMANGA", "ZamanManga", "tr")
|
||||
internal class ZamanManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.ZAMANMANGA, "zamanmanga.com") {
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("HENTAIVNPLUS", "HentaiVnPlus", "vi", ContentType.HENTAI)
|
||||
internal class HentaiVnPlus(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.HENTAIVNPLUS, "hentaivn.nl", 24) {
|
||||
MadaraParser(context, MangaParserSource.HENTAIVNPLUS, "hentaivn.mom", 24) {
|
||||
override val listUrl = "truyen-hentai/"
|
||||
override val tagPrefix = "the-loai/"
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.koitharu.kotatsu.parsers.site.madara.vi
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||
@@ -9,6 +10,7 @@ import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("QUAANHDAOCUTEO", "Quaanhdaocuteo", "vi", ContentType.HENTAI)
|
||||
internal class Quaanhdaocuteo(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaParserSource.QUAANHDAOCUTEO, "qadc.top") {
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("ARAREASCANS", "ArAreaScans", "ar")
|
||||
internal class ArAreaScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.ARAREASCANS, "ar.areascans.org", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaParserSource.ARAREASCANS, "ar.kenmanga.com", pageSize = 20, searchPageSize = 10) {
|
||||
|
||||
override val filterCapabilities: MangaListFilterCapabilities
|
||||
get() = super.filterCapabilities.copy(
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("AREASCANS", "AreaScans", "ar")
|
||||
internal class AreaScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.AREASCANS, "www.areascans.net", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaParserSource.AREASCANS, "ar.kenmanga.com", pageSize = 20, searchPageSize = 10) {
|
||||
|
||||
override val filterCapabilities: MangaListFilterCapabilities
|
||||
get() = super.filterCapabilities.copy(
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
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.model.MangaListFilterCapabilities
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("MANGANOON", "MangaNoon", "ar")
|
||||
internal class MangaNoon(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.MANGANOON, "vrnoin.site", pageSize = 24, searchPageSize = 10) {
|
||||
|
||||
override val filterCapabilities: MangaListFilterCapabilities
|
||||
get() = super.filterCapabilities.copy(
|
||||
isTagsExclusionSupported = false,
|
||||
)
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import org.koitharu.kotatsu.parsers.util.*
|
||||
|
||||
@MangaSourceParser("MANJANOON", "Manjanoon", "ar")
|
||||
internal class Manjanoon(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.MANJANOON, "manjanoon.com", pageSize = 21, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaParserSource.MANJANOON, "vrnoin.site", pageSize = 21, searchPageSize = 10) {
|
||||
|
||||
override suspend fun getDetails(manga: Manga): Manga {
|
||||
val docs = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml()
|
||||
|
||||
@@ -10,7 +10,7 @@ import java.text.SimpleDateFormat
|
||||
|
||||
@MangaSourceParser("NORMOYUN", "MaxLevelTeam", "ar")
|
||||
internal class Normoyun(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.NORMOYUN, "healteer.com", pageSize = 42, searchPageSize = 39) {
|
||||
MangaReaderParser(context, MangaParserSource.NORMOYUN, "swatscans.com", pageSize = 42, searchPageSize = 39) {
|
||||
|
||||
override val datePattern = "MMMM dd, yyyy"
|
||||
override val selectMangaList = ".listupd .bs .bsx"
|
||||
|
||||
@@ -11,7 +11,7 @@ internal class ThunderScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(
|
||||
context,
|
||||
MangaParserSource.THUNDERSCANS,
|
||||
"ar-thunderepic.com",
|
||||
"lavascans.com",
|
||||
pageSize = 32,
|
||||
searchPageSize = 10,
|
||||
) {
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.ar
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaListFilterCapabilities
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("UMIMANGA", "UmiManga", "ar")
|
||||
internal class UmiManga(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.UMIMANGA, "www.umimanga.com", pageSize = 20, searchPageSize = 10) {
|
||||
|
||||
@@ -10,7 +10,7 @@ import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
@Broken // Not dead but changed template
|
||||
@Broken // Redirect to @VORTEXSCANS
|
||||
@MangaSourceParser("VEXMANGA", "VexManga", "ar")
|
||||
internal class VexManga(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.VEXMANGA, "vortexscans.org", pageSize = 10, searchPageSize = 10) {
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("AGSCOMICS", "AgsComics", "en")
|
||||
internal class AgsComics(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.AGSCOMICS, "agscomics.com", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaParserSource.AGSCOMICS, "agrcomics.com", pageSize = 20, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
|
||||
override val filterCapabilities: MangaListFilterCapabilities
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("CYPHERSCANS", "CypherScans", "en")
|
||||
internal class CypherScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.CYPHERSCANS, "cypherscans.xyz", pageSize = 20, searchPageSize = 10)
|
||||
MangaReaderParser(context, MangaParserSource.CYPHERSCANS, "cyphscans.xyz", pageSize = 20, searchPageSize = 10)
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("EROSSCANS", "ErosScans", "en")
|
||||
internal class ErosScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.EROSSCANS, "eros-scans.xyz", pageSize = 20, searchPageSize = 10)
|
||||
MangaReaderParser(context, MangaParserSource.EROSSCANS, "tercoscans.xyz", pageSize = 20, searchPageSize = 10)
|
||||
|
||||
@@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("FLAMECOMICS", "FlameComics", "en")
|
||||
internal class FlameComics(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.FLAMECOMICS, "flamecomics.me", pageSize = 24, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaParserSource.FLAMECOMICS, "flamecomics.xyz", pageSize = 24, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
// Redirect to @LUACOMIC_COM
|
||||
@MangaSourceParser("KAISCANS", "KaiScans", "en")
|
||||
internal class KaiScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.KAISCANS, "ponvi.online", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaParserSource.KAISCANS, "luascans.com", pageSize = 20, searchPageSize = 10) {
|
||||
override val filterCapabilities: MangaListFilterCapabilities
|
||||
get() = super.filterCapabilities.copy(
|
||||
isTagsExclusionSupported = false,
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package org.koitharu.kotatsu.parsers.site.mangareader.en
|
||||
|
||||
import org.koitharu.kotatsu.parsers.Broken
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaListFilterCapabilities
|
||||
import org.koitharu.kotatsu.parsers.model.MangaParserSource
|
||||
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@Broken
|
||||
@MangaSourceParser("KOMIKLAB", "KomikLab", "en")
|
||||
internal class KomikLabParser(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.KOMIKLAB, "komiklab.com", pageSize = 20, searchPageSize = 10) {
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("LUACOMIC_COM", "luaComic.com", "en")
|
||||
internal class LuaComicCom(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaParserSource.LUACOMIC_COM, "ponvi.online", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaParserSource.LUACOMIC_COM, "luascans.com", pageSize = 20, searchPageSize = 10) {
|
||||
override val filterCapabilities: MangaListFilterCapabilities
|
||||
get() = super.filterCapabilities.copy(
|
||||
isTagsExclusionSupported = false,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user