Add @Broken on some Dead Sources

Urls Changes
repair sources
Remove Duplicate Source
Add volume on some parser
master
devi 2 years ago
parent c03b0fc981
commit 0bcac0c639

@ -6,7 +6,6 @@ import okhttp3.Headers
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.network.OkHttpWebClient
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.network.WebClient
import org.koitharu.kotatsu.parsers.util.FaviconParser
import org.koitharu.kotatsu.parsers.util.RelatedMangaFinder

@ -11,7 +11,6 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.exception.ParseException
import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.json.isNullOrEmpty
import java.nio.charset.StandardCharsets
import java.security.MessageDigest
import java.util.*
@ -319,7 +318,8 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser(
return MangaChapter(
id = generateUid(href),
name = a.text(),
number = index + 1,
number = index + 1f,
volume = 0,
url = href,
scanlator = extra?.getElementsByAttributeValueContaining("href", "/group/")?.text(),
uploadDate = runCatching {

@ -212,7 +212,8 @@ internal class ExHentaiParser(
chapters += MangaChapter(
id = generateUid(url),
name = "${manga.title} #$i",
number = i,
number = i.toFloat(),
volume = 0,
url = url,
uploadDate = 0L,
source = source,

@ -540,7 +540,8 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
url = manga.url,
name = json.getString("title"),
scanlator = json.getString("type").toTitleCase(),
number = 1,
number = 1f,
volume = 0,
branch = json.getString("language_localname"),
source = source,
uploadDate = dateFormat.tryParse(json.getString("date").substringBeforeLast("-")),

@ -130,7 +130,8 @@ internal class ImHentai(context: MangaLoaderContext) :
MangaChapter(
id = manga.id,
name = manga.title,
number = 1,
number = 1f,
volume = 0,
url = manga.url,
scanlator = null,
uploadDate = 0,

@ -94,7 +94,8 @@ internal abstract class LineWebtoonsParser(
MangaChapter(
id = generateUid("$titleNo-$i"),
name = jo.getString("episodeTitle"),
number = jo.getInt("episodeSeq"),
number = jo.getInt("episodeSeq").toFloat(),
volume = 0,
url = "$titleNo-${jo.get("episodeNo")}",
uploadDate = jo.getLong("modifyYmdt"),
branch = null,

@ -23,8 +23,8 @@ private const val MIN_SPLIT_COUNT = 5
internal abstract class MangaFireParser(
context: MangaLoaderContext,
source: MangaSource,
private val siteLang: String
): PagedMangaParser(context, source, 30), Interceptor {
private val siteLang: String,
) : PagedMangaParser(context, source, 30), Interceptor {
override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("mangafire.to")
@ -44,7 +44,7 @@ internal abstract class MangaFireParser(
MangaTag(
title = it.selectFirstOrThrow("label").ownText().toTitleCase(sourceLocale),
key = it.selectFirstOrThrow("input").attr("value"),
source = source
source = source,
)
}.associateBy { it.title }
}
@ -73,7 +73,7 @@ internal abstract class MangaFireParser(
SortOrder.NEWEST -> "release_date"
SortOrder.ALPHABETICAL -> "title_az"
else -> ""
}
},
)
}
}
@ -97,7 +97,7 @@ internal abstract class MangaFireParser(
MangaState.ABANDONED -> "discontinued"
MangaState.PAUSED -> "on_hiatus"
MangaState.UPCOMING -> "info"
}
},
)
}
addQueryParameter(
@ -109,7 +109,7 @@ internal abstract class MangaFireParser(
SortOrder.NEWEST -> "release_date"
SortOrder.ALPHABETICAL -> "title_az"
else -> ""
}
},
)
}
@ -176,14 +176,14 @@ internal abstract class MangaFireParser(
author = document.select("div.meta a[href*=/author/]")
.joinToString { it.ownText().trim() },
description = document.selectFirstOrThrow("#synopsis div.modal-content").html(),
chapters = getChapters(manga.url, document)
chapters = getChapters(manga.url, document),
)
}
private data class ChapterBranch(
val type: String,
val langCode: String,
val langTitle: String
val langTitle: String,
)
private suspend fun getChapters(mangaUrl: String, document: Document): List<MangaChapter> {
@ -252,7 +252,7 @@ internal abstract class MangaFireParser(
scanlator = null,
uploadDate = dateFormat.tryParse(it.attr("upload-date")),
branch = "${branch.langTitle} ${branch.type.toTitleCase()}",
source = source
source = source,
)
}
}
@ -263,7 +263,7 @@ internal abstract class MangaFireParser(
override suspend fun getRelatedManga(seed: Manga): List<Manga> = coroutineScope {
val document = webClient.httpGet(seed.url.toAbsoluteUrl(domain)).parseHtml()
val total = document.select(
"section.m-related a[href*=/manga/], .side-manga:not(:has(.head:contains(trending))) .unit"
"section.m-related a[href*=/manga/], .side-manga:not(:has(.head:contains(trending))) .unit",
).size
val mangas = ArrayList<Manga>(total)
@ -322,7 +322,7 @@ internal abstract class MangaFireParser(
rating = RATING_UNKNOWN,
state = null,
tags = emptySet(),
)
),
)
}
@ -366,8 +366,8 @@ internal abstract class MangaFireParser(
"$url#scrambled_$offset"
},
preview = null,
source = source
)
source = source,
),
)
}

@ -193,7 +193,8 @@ internal class MangaPark(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -324,6 +324,6 @@ internal abstract class MangaPlusParser(
class German(context: MangaLoaderContext) : MangaPlusParser(
context,
MangaSource.MANGAPLUSPARSER_DE,
"GERMAN"
"GERMAN",
)
}

@ -145,7 +145,8 @@ internal abstract class NineMangaParser(
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDateByLang(li.selectFirst("span")?.text().orEmpty()),
source = source,

@ -109,7 +109,8 @@ internal abstract class WebtoonsParser(
MangaChapter(
id = generateUid("$titleNo-$i"),
name = jo.getString("episodeTitle"),
number = jo.getInt("episodeSeq"),
number = jo.getInt("episodeSeq").toFloat(),
volume = 0,
url = "$titleNo-${jo.get("episodeNo")}",
uploadDate = jo.getLong("registerYmdt"),
branch = null,
@ -223,7 +224,8 @@ internal abstract class WebtoonsParser(
description = null,
state = null,
source = source,
))
),
)
}
}

@ -146,7 +146,8 @@ internal abstract class AnimeBootstrapParser(
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = 0,
source = source,

@ -3,6 +3,7 @@ package org.koitharu.kotatsu.parsers.site.animebootstrap.fr
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
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.*
@ -12,6 +13,7 @@ import java.text.SimpleDateFormat
import java.util.EnumSet
import java.util.Locale
@Broken
@MangaSourceParser("PAPSCAN", "PapScan", "fr")
internal class PapScan(context: MangaLoaderContext) :
AnimeBootstrapParser(context, MangaSource.PAPSCAN, "papscan.com") {
@ -126,7 +128,8 @@ internal class PapScan(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = li.selectFirstOrThrow("span em").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = dateFormat.tryParse(dateText),
source = source,

@ -180,7 +180,8 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context
id = generateUid(url),
url = url,
name = j.getString("slug").replace('-', ' '),
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = dateFormat.tryParse(date),
scanlator = null,

@ -101,7 +101,8 @@ internal class MangaStorm(context: MangaLoaderContext) : PagedMangaParser(contex
MangaChapter(
id = generateUid(url),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = 0,

@ -183,7 +183,8 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex
MangaChapter(
id = generateUid(url),
name = li.selectFirstOrThrow(".epl-title").text(),
number = url.substringAfterLast('/').toIntOrNull() ?: 0,
number = url.substringAfterLast('/').toFloatOrNull() ?: 0f,
volume = 0,
url = url,
scanlator = null,
uploadDate = dateFormat.tryParse(li.selectFirstOrThrow(".epl-date").text()),

@ -144,7 +144,8 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context,
MangaChapter(
id = generateUid(jo.getString("id")),
name = "Глава $number",
number = number,
number = number.toFloat(),
volume = 0,
url = "${manga.url}/read/$number",
scanlator = null,
uploadDate = jo.getLong("released"),

@ -109,7 +109,8 @@ internal class BeeToon(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(url),
name = a.selectFirstOrThrow(".chap").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.ENGLISH)

@ -76,7 +76,8 @@ internal class CloneMangaParser(context: MangaLoaderContext) : MangaParser(conte
val chapter = MangaChapter(
id = generateUid("$series&page=$i"),
name = "Chapter ${i + 1}",
number = i + 1,
number = i + 1f,
volume = 0,
url = "$series&page=$i",
scanlator = null,
branch = null,

@ -149,7 +149,8 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex
MangaChapter(
id = generateUid(url),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = dateFormat.tryParse(dateText),

@ -181,7 +181,8 @@ internal class DynastyScans(context: MangaLoaderContext) : PagedMangaParser(cont
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = dateFormat.tryParse(dateText),
source = source,

@ -165,7 +165,8 @@ internal class FlixScansOrg(context: MangaLoaderContext) : PagedMangaParser(cont
id = generateUid(url),
url = url,
name = j.getString("slug").replace('-', ' '),
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = dateFormat.tryParse(date),
scanlator = null,

@ -137,7 +137,8 @@ internal class MangaGeko(context: MangaLoaderContext) : PagedMangaParser(context
MangaChapter(
id = generateUid(url),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = dateFormat.tryParse(dateText),

@ -27,7 +27,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
override val isMultipleTagsSupported = false
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val url = buildString {
append("https://")
append(domain)
@ -157,7 +157,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
id = generateUid(href),
url = href,
source = MangaSource.MANGATOWN,
number = i + 1,
number = i + 1f,
volume = 0,
uploadDate = parseChapterDate(
dateFormat,
li.selectFirst("span.time")?.text(),
@ -176,7 +177,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
val root = doc.body().selectFirstOrThrow("div.page_select")
val isManga = root.select("select")
if(isManga.isEmpty()){//Webtoon
if (isManga.isEmpty()) {//Webtoon
val imgElements = doc.select("div#viewer.read_img img.image")
return imgElements.map {
val href = it.attr("src")
@ -188,7 +189,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
)
}
}else{ //Manga
} else { //Manga
return isManga.select("option").mapNotNull {
val href = it.attrAsRelativeUrlOrNull("value")
if (href == null || href.endsWith("featured.html")) {
@ -205,7 +206,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
}
override suspend fun getPageUrl(page: MangaPage): String {
if(page.url.startsWith("//")){//Webtoon
if (page.url.startsWith("//")) {//Webtoon
return page.url.toAbsoluteUrl(domain)
}
@ -253,7 +254,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
id = generateUid(href),
url = href,
source = MangaSource.MANGATOWN,
number = i + 1,
number = i + 1f,
volume = 0,
uploadDate = parseChapterDate(
dateFormat,
li.selectFirst("span.time")?.text(),

@ -155,7 +155,8 @@ internal class Mangaowl(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(url),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
uploadDate = dateFormat.tryParse(date),
source = source,

@ -161,7 +161,8 @@ class Manhwa18Parser(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(chapterUrl),
name = element.selectFirst(".chapter-name")?.text().orEmpty(),
number = index + 1,
number = index + 1f,
volume = 0,
url = chapterUrl,
scanlator = null,
uploadDate = uploadDate,

@ -113,7 +113,8 @@ class ManhwasMen(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(url),
name = li.selectFirstOrThrow(".flex-grow-1 span").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = parseChapterDate(

@ -76,7 +76,8 @@ internal class Po2Scans(context: MangaLoaderContext) : MangaParser(context, Mang
MangaChapter(
id = generateUid(url),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = dateFormat.tryParse(div.select(".detail span").last()?.text()),

@ -126,7 +126,8 @@ internal class Pururin(context: MangaLoaderContext) :
MangaChapter(
id = manga.id,
name = manga.title,
number = 1,
number = 1f,
volume = 0,
url = manga.url,
scanlator = null,
uploadDate = 0,

@ -96,7 +96,8 @@ internal class TempleScanEsp(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = div.requireElementById("name").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = date,
source = source,

@ -203,7 +203,8 @@ internal abstract class FmreaderParser(
MangaChapter(
id = generateUid(href),
name = a.selectFirstOrThrow("div.chapter-name").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -125,7 +125,8 @@ internal class Manhwa18Com(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = a.selectFirstOrThrow("div.chapter-name").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -66,7 +66,8 @@ internal class Klz9(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = a.selectFirstOrThrow("a").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -25,7 +25,8 @@ internal class WeLoveManga(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = a.selectFirstOrThrow("a").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -155,7 +155,8 @@ internal abstract class FoolSlideParser(
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = if (div.selectFirstOrThrow(selectDate).text().contains(", ")) {
dateFormat.tryParse(dateText)

@ -5,9 +5,10 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser
// The source has changed template so for the moment it is dead.
@MangaSourceParser("HNISCANTRAD", "HniScantrad", "fr")
internal class HniScantrad(context: MangaLoaderContext) :
FoolSlideParser(context, MangaSource.HNISCANTRAD, "hni-scantrad.com") {
FoolSlideParser(context, MangaSource.HNISCANTRAD, "hni-scantrad.net") {
override val pagination = false
override val searchUrl = "lel/search/"
override val listUrl = "lel/directory/"

@ -5,6 +5,7 @@ import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import okhttp3.Headers
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
@ -15,6 +16,7 @@ import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault
import java.util.*
@Broken
@MangaSourceParser("BENTOMANGA", "BentoManga", "fr")
internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BENTOMANGA, 10) {

@ -109,7 +109,8 @@ internal class FuryoSociety(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = div.selectFirstOrThrow("div.title").text() + " : " + div.selectFirstOrThrow("div.name").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -1,13 +1,11 @@
package org.koitharu.kotatsu.parsers.site.fr
import okhttp3.Headers
import org.json.JSONObject
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 org.koitharu.kotatsu.parsers.util.json.mapJSON
import java.text.SimpleDateFormat
@ -146,7 +144,8 @@ internal class LegacyScansParser(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
scanlator = null,
uploadDate = dateFormat.tryParse(dateText),

@ -1,12 +1,11 @@
package org.koitharu.kotatsu.parsers.site.fr
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.text.SimpleDateFormat
import java.util.*
@ -115,7 +114,8 @@ internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context,
MangaChapter(
id = generateUid(href),
name = name,
number = i,
number = i.toFloat(),
volume = 0,
url = href,
scanlator = null,
uploadDate = dateFormat.tryParse(dateText),

@ -182,7 +182,8 @@ internal class LugnicaScans(context: MangaLoaderContext) : PagedMangaParser(cont
MangaChapter(
id = generateUid(url),
name = "Chapitre : $id",
number = i,
number = i.toFloat(),
volume = 0,
url = url,
scanlator = null,
uploadDate = dateFormat.tryParse(date),

@ -138,7 +138,8 @@ internal class ScansMangasMe(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = li.selectFirstOrThrow("span.mobile chapter").text(),
number = i + 1,
number = li.selectFirstOrThrow("span.mobile chapter").text().substringAfterLast(" ").toFloat(),
volume = 0,
url = href,
uploadDate = 0,
source = source,

@ -151,7 +151,8 @@ internal class ScantradUnion(context: MangaLoaderContext) : PagedMangaParser(con
MangaChapter(
id = generateUid(href),
name = name,
number = i,
number = i.toFloat(),
volume = 0,
url = href,
scanlator = null,
uploadDate = dateFormat.tryParse(date),

@ -1,11 +1,9 @@
package org.koitharu.kotatsu.parsers.site.heancms
import okhttp3.Headers
import org.koitharu.kotatsu.parsers.MangaLoaderContext
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 org.koitharu.kotatsu.parsers.util.json.mapJSON
import java.text.SimpleDateFormat
@ -20,8 +18,16 @@ internal abstract class HeanCms(
override val configKeyDomain = ConfigKey.Domain(domain)
private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent())
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
super.onCreateConfig(keys)
keys.add(userAgentKey)
}
override val availableSortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.ALPHABETICAL,
SortOrder.ALPHABETICAL_DESC,
SortOrder.UPDATED,
SortOrder.NEWEST,
SortOrder.POPULARITY,
@ -30,15 +36,11 @@ internal abstract class HeanCms(
override val availableStates: Set<MangaState> =
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
override val headers: Headers = Headers.Builder()
.add("User-Agent", UserAgents.CHROME_DESKTOP)
.build()
protected open val pathManga = "series"
protected open val apiPath
get() = getDomain("api")
//For some sources, you need to send a json. For the moment, this part only works in Get. ( ex source need json gloriousscan.com , omegascans.org )
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val url = buildString {
append("https://")
@ -147,7 +149,8 @@ internal abstract class HeanCms(
MangaChapter(
id = generateUid(url),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = dateFormat.tryParse(date),

@ -45,8 +45,8 @@ internal class OmegaScans(context: MangaLoaderContext) : HeanCms(context, MangaS
SortOrder.POPULARITY -> append("total_views&order=desc")
SortOrder.UPDATED -> append("latest&order=desc")
SortOrder.NEWEST -> append("created_at&order=desc")
SortOrder.ALPHABETICAL -> append("title&order=desc")
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
SortOrder.ALPHABETICAL -> append("title&order=asc")
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
else -> append("latest&order=desc")
}
append("&series_type=All&perPage=$pageSize")

@ -43,8 +43,8 @@ internal class YugenMangasEs(context: MangaLoaderContext) :
SortOrder.POPULARITY -> append("total_views&order=desc")
SortOrder.UPDATED -> append("latest&order=desc")
SortOrder.NEWEST -> append("created_at&order=desc")
SortOrder.ALPHABETICAL -> append("title&order=desc")
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
SortOrder.ALPHABETICAL -> append("title&order=asc")
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
else -> append("latest&order=desc")
}
append("&series_type=Comic&perPage=12")

@ -1,10 +1,165 @@
package org.koitharu.kotatsu.parsers.site.heancms.fr
import org.json.JSONArray
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaChapter
import org.koitharu.kotatsu.parsers.model.MangaListFilter
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.json.getFloatOrDefault
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.json.mapJSONToSet
import org.koitharu.kotatsu.parsers.util.json.unescapeJson
import org.koitharu.kotatsu.parsers.util.oneOrThrowIfMany
import org.koitharu.kotatsu.parsers.util.parseHtml
import org.koitharu.kotatsu.parsers.util.parseJson
import org.koitharu.kotatsu.parsers.util.toRelativeUrl
import org.koitharu.kotatsu.parsers.util.toTitleCase
import org.koitharu.kotatsu.parsers.util.tryParse
import org.koitharu.kotatsu.parsers.util.urlEncoded
import java.text.SimpleDateFormat
import java.util.Locale
@MangaSourceParser("PERF_SCAN", "PerfScan", "fr")
internal class PerfScan(context: MangaLoaderContext) :
HeanCms(context, MangaSource.PERF_SCAN, "perf-scan.fr")
HeanCms(context, MangaSource.PERF_SCAN, "perf-scan.fr") {
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val url = buildString {
append("https://api.")
append(domain)
append("/query?adult=true&query_string=")
when (filter) {
is MangaListFilter.Search -> {
append(filter.query.urlEncoded())
}
is MangaListFilter.Advanced -> {
filter.states.oneOrThrowIfMany()?.let {
append("&status=")
append(
when (it) {
MangaState.ONGOING -> "Ongoing"
MangaState.FINISHED -> "Completed"
MangaState.ABANDONED -> "Dropped"
MangaState.PAUSED -> "Hiatus"
else -> ""
},
)
}
append("&orderBy=")
when (filter.sortOrder) {
SortOrder.POPULARITY -> append("total_views&order=desc")
SortOrder.UPDATED -> append("latest&order=desc")
SortOrder.NEWEST -> append("created_at&order=desc")
SortOrder.ALPHABETICAL -> append("title&order=asc")
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
else -> append("latest&order=desc")
}
append("&series_type=All&perPage=")
append(pageSize)
append("&tags_ids=")
append("[".urlEncoded())
filter.tags.joinTo(this, ",") { it.key }
append("]".urlEncoded())
}
null -> {}
}
append("&page=")
append(page)
}
val json = webClient.httpGet(url).parseJson()
return json.getJSONArray("data").mapJSON { j ->
val slug = j.getString("series_slug")
val urlManga = "https://$domain/$pathManga/$slug"
val cover = if (j.getString("thumbnail").contains('/')) {
j.getString("thumbnail")
} else {
"https://api.$domain/${j.getString("thumbnail")}"
}
Manga(
id = j.getLong("id"),
title = j.getString("title"),
altTitle = null,
url = urlManga.toRelativeUrl(domain),
publicUrl = urlManga,
rating = j.getFloatOrDefault("rating", RATING_UNKNOWN) / 5f,
isNsfw = isNsfwSource,
coverUrl = cover,
tags = setOf(),
state = when (j.getStringOrNull("status")) {
"Ongoing" -> MangaState.ONGOING
"Completed" -> MangaState.FINISHED
"Dropped" -> MangaState.ABANDONED
"Hiatus" -> MangaState.PAUSED
else -> null
},
author = j.getStringOrNull("author"),
source = source,
description = j.getString("description"),
)
}
}
override suspend fun getDetails(manga: Manga): Manga {
val url = buildString {
append("https://api.")
append(domain)
append("/chapter/query?perPage=9999&series_id=")
append(manga.id)
}
val json = webClient.httpGet(url).parseJson()
val dateFormat = SimpleDateFormat(datePattern, Locale.ENGLISH)
val chaptersJsonArray = json.getJSONArray("data")
var totalChapters = json.getJSONObject("meta").getInt("total")
val chapters = chaptersJsonArray.mapJSON { j ->
val slug = j.getJSONObject("series").getString("series_slug")
val chapterUrl = "https://$domain/$pathManga/$slug/${j.getString("chapter_slug")}"
val date = j.getString("created_at").substringBeforeLast("T")
MangaChapter(
id = j.getLong("id"),
url = chapterUrl,
name = j.getString("chapter_name"),
number = totalChapters--,
branch = null,
uploadDate = dateFormat.tryParse(date),
scanlator = null,
source = source,
)
}
return manga.copy(
chapters = chapters.reversed(),
)
}
override suspend fun getAvailableTags(): Set<MangaTag> {
val doc = webClient.httpGet("https://$domain/comics").parseHtml()
val regex = Regex("\"tags\\\\.*?(\\[.+?])")
val tags = doc.select("script").firstNotNullOf { script ->
regex.find(script.html())?.groupValues?.getOrNull(1)
}.unescapeJson()
return JSONArray(tags).mapJSONToSet {
MangaTag(
key = it.getInt("id").toString(),
title = it.getString("name").toTitleCase(sourceLocale),
source = source,
)
}
}
}

@ -45,8 +45,8 @@ internal class ModeScanlator(
SortOrder.POPULARITY -> append("total_views&order=desc")
SortOrder.UPDATED -> append("latest&order=desc")
SortOrder.NEWEST -> append("created_at&order=desc")
SortOrder.ALPHABETICAL -> append("title&order=desc")
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc")
SortOrder.ALPHABETICAL -> append("title&order=asc")
SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
else -> append("latest&order=desc")
}
append("&series_type=All&perPage=")

@ -99,7 +99,8 @@ internal abstract class HeanCmsAlt(
MangaChapter(
id = generateUid(url),
name = a.selectFirstOrThrow(selectChapterTitle).text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = parseChapterDate(

@ -41,7 +41,8 @@ internal class Brakeout(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(url),
name = div.selectFirstOrThrow(selectChapterTitle).text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate = parseChapterDate(

@ -116,7 +116,8 @@ internal class MangaWorld(
MangaChapter(
id = generateUid(url),
name = a.selectFirstOrThrow("span.d-inline-block").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = url,
scanlator = null,
uploadDate =

@ -126,7 +126,8 @@ class NicovideoSeigaParser(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = li.select("div > div.description > div.title > a").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
scanlator = null,
branch = null,

@ -1,10 +0,0 @@
package org.koitharu.kotatsu.parsers.site.likemanga.en
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.site.likemanga.LikeMangaParser
@MangaSourceParser("ZINMANGA_COM", "ZinManga.com", "en")
internal class ZinManga(context: MangaLoaderContext) :
LikeMangaParser(context, MangaSource.ZINMANGA_COM, "zinmanga.com")

@ -472,7 +472,8 @@ internal abstract class MadaraParser(
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = parseChapterDate(
dateFormat,
@ -506,7 +507,8 @@ internal abstract class MadaraParser(
id = generateUid(href),
url = link,
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = parseChapterDate(
dateFormat,

@ -27,7 +27,8 @@ internal class Ero18x(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = if (dateText == "Newly Published!") {
parseChapterDate(

@ -31,7 +31,8 @@ internal class ManhwaRaw(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = if (dateText == "Newly Published!") {
parseChapterDate(

@ -36,7 +36,8 @@ internal class LekMangaCom(context: MangaLoaderContext) :
id = generateUid(href),
url = link,
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = parseChapterDate(
dateFormat,

@ -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.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@Broken
@MangaSourceParser("ANSHSCANS", "AnshScans", "en")
internal class AnshScans(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.ANSHSCANS, "anshscans.org", 10) {

@ -28,7 +28,8 @@ internal class Hentaixdickgirl(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = parseChapterDate(
dateFormat,

@ -121,7 +121,8 @@ internal class InstaManhwa(context: MangaLoaderContext) :
id = generateUid(href),
url = link,
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = parseChapterDate(
dateFormat,

@ -125,7 +125,8 @@ internal class IsekaiScan(context: MangaLoaderContext) :
id = generateUid(href),
url = link,
name = a.ownText(),
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = parseChapterDate(
dateFormat,

@ -161,7 +161,8 @@ internal class MangaDass(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = parseChapterDate(
dateFormat,

@ -33,7 +33,8 @@ internal class MangaDistrict(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = a.ownText(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -151,7 +151,8 @@ internal class MangaDna(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = parseChapterDate(
dateFormat,

@ -127,7 +127,8 @@ internal class MangaPure(context: MangaLoaderContext) :
id = generateUid(href),
url = link,
name = a.ownText(),
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = parseChapterDate(
dateFormat,

@ -39,7 +39,8 @@ internal class ManhwaTop(context: MangaLoaderContext) :
id = generateUid(href),
url = link,
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = parseChapterDate(
dateFormat,

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

@ -27,7 +27,8 @@ internal class ManhwaEs(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = if (dateText == "¡Recién publicado!") {
parseChapterDate(

@ -35,7 +35,8 @@ internal class ManhwaLatino(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = parseChapterDate(
dateFormat,

@ -99,7 +99,8 @@ internal class TmoManga(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = 0,
source = source,

@ -1,10 +1,12 @@
package org.koitharu.kotatsu.parsers.site.madara.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.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@Broken
@MangaSourceParser("BLUESOLO", "BlueSolo", "fr")
internal class BlueSolo(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.BLUESOLO, "www1.bluesolo.org", 10) {

@ -32,7 +32,8 @@ internal class Hentaizone(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
url = link,
uploadDate = parseChapterDate(
dateFormat,

@ -1,11 +1,13 @@
package org.koitharu.kotatsu.parsers.site.madara.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.ContentType
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@Broken
@MangaSourceParser("LUNARHENTAI", "LunarHentai", "fr", ContentType.HENTAI)
internal class LunarHentai(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.LUNARHENTAI, "hentai.lunarscans.fr") {

@ -8,4 +8,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("SCANHENTAIMENU", "ScanHentai.Menu", "fr", ContentType.HENTAI)
internal class ScanHentaiMenu(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.SCANHENTAIMENU, "scan.hentai.menu")
MadaraParser(context, MangaSource.SCANHENTAIMENU, "x-manga.net")

@ -1,10 +1,12 @@
package org.koitharu.kotatsu.parsers.site.madara.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.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@Broken
@MangaSourceParser("SCANTRADVF", "Scantrad-Vf", "fr")
internal class ScantradVf(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.SCANTRADVF, "scantrad-vf.me") {

@ -32,7 +32,8 @@ internal class ToonFr(context: MangaLoaderContext) :
id = generateUid(href),
url = href,
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = parseChapterDate(
dateFormat,

@ -2,9 +2,7 @@ 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.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import java.util.*

@ -28,7 +28,8 @@ internal class Neoxscans(context: MangaLoaderContext) :
id = generateUid(href),
url = link,
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = parseChapterDate(
dateFormat,

@ -24,7 +24,8 @@ internal class TitanManga(context: MangaLoaderContext) :
id = generateUid(href),
url = link,
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = 0,
scanlator = null,

@ -26,7 +26,8 @@ internal class TruyenTranhDamMyy(context: MangaLoaderContext) :
id = generateUid(href),
url = link,
name = name,
number = i + 1,
number = i + 1f,
volume = 0,
branch = null,
uploadDate = 0, // Correct datePattern not found.
scanlator = null,

@ -207,7 +207,8 @@ internal abstract class MadthemeParser(
MangaChapter(
id = generateUid(href),
name = li.selectFirstOrThrow(".chapter-title").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -26,7 +26,8 @@ internal class MangaJinx(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = li.selectFirstOrThrow(".chapter-title").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -108,7 +108,8 @@ internal class ManhuaScan(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = li.selectFirstOrThrow(".chapter-title").text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -182,7 +182,8 @@ internal abstract class Manga18Parser(
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = dateFormat.tryParse(dateText),
source = source,

@ -24,7 +24,8 @@ internal class Hanman18(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = 0,
source = source,

@ -200,7 +200,8 @@ internal abstract class MangaboxParser(
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -125,7 +125,8 @@ internal class Mangakakalot(context: MangaLoaderContext) :
MangaChapter(
id = generateUid(href),
name = a.text(),
number = i + 1,
number = i + 1f,
volume = 0,
url = href,
uploadDate = parseChapterDate(
dateFormat,

@ -5,7 +5,6 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.mangadventure.MangAdventureParser
import org.koitharu.kotatsu.parsers.util.urlEncoded
@MangaSourceParser("ARCRELIGHT", "Arc-Relight", "en")
internal class ArcRelight(context: MangaLoaderContext) :

@ -29,6 +29,13 @@ internal abstract class MangaReaderParser(
override val configKeyDomain = ConfigKey.Domain(domain)
private val userAgentKey = ConfigKey.UserAgent(context.getDefaultUserAgent())
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
super.onCreateConfig(keys)
keys.add(userAgentKey)
}
override val availableSortOrders: Set<SortOrder>
get() = EnumSet.of(
SortOrder.UPDATED,
@ -156,7 +163,8 @@ internal abstract class MangaReaderParser(
id = generateUid(url),
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
url = url,
number = index + 1,
number = index + 1f,
volume = 0,
scanlator = null,
uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()),
branch = null,

@ -9,4 +9,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
internal class ArAreaScans(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.ARAREASCANS, "ar.areascans.org", pageSize = 20, searchPageSize = 10) {
override val isTagsExclusionSupported = false
}
}

@ -1,12 +0,0 @@
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.MangaSource
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("ELITON", "ThunderScans", "ar")
internal class Eliton(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.ELITON, "thunderscans.com", pageSize = 20, searchPageSize = 10) {
override val isTagsExclusionSupported = false
}

@ -9,4 +9,4 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
internal class MangaPro(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.MANGAPRO, "promanga.pro", pageSize = 20, searchPageSize = 10) {
override val isTagsExclusionSupported = false
}
}

@ -25,7 +25,8 @@ internal class Manjanoon(context: MangaLoaderContext) :
id = generateUid(url),
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
url = url,
number = index + 1,
number = index + 1f,
volume = 0,
scanlator = null,
uploadDate = 0,
branch = null,

@ -86,7 +86,8 @@ internal class Normoyun(context: MangaLoaderContext) :
id = generateUid(url),
name = element.selectFirst("a")?.text() ?: "Chapter ${index + 1}",
url = url,
number = index + 1,
number = index + 1f,
volume = 0,
scanlator = null,
uploadDate = dateFormat.tryParse(element.selectFirst(".chapter-date")?.text()),
branch = null,

@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("THUNDERSCANS", "ThunderScans", "ar")
internal class ThunderScans(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.THUNDERSCANS, "thunderscans.com", pageSize = 32, searchPageSize = 10)
MangaReaderParser(context, MangaSource.THUNDERSCANS, "thunderscans.com", pageSize = 32, searchPageSize = 10) {
override val isTagsExclusionSupported = false
}

@ -6,7 +6,7 @@ import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("UMIMANGA", "UmiManga", "ar")
internal class BeastScans(context: MangaLoaderContext) :
internal class UmiManga(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.UMIMANGA, "www.umimanga.com", pageSize = 20, searchPageSize = 10) {
override val isTagsExclusionSupported = false
}

@ -25,7 +25,8 @@ internal class VexManga(context: MangaLoaderContext) :
id = generateUid(url),
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
url = url,
number = index + 1,
number = index + 1f,
volume = 0,
scanlator = null,
uploadDate = parseChapterDate(
dateFormat,

@ -20,7 +20,8 @@ internal class Constellarcomic(context: MangaLoaderContext) :
id = generateUid(url),
name = element.selectFirst(".chapternum")?.textOrNull() ?: "Chapter ${index + 1}",
url = url,
number = index + 1,
number = index + 1f,
volume = 0,
scanlator = null,
uploadDate = 0,
branch = null,

@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("MAGUSMANGA", "MagusManga", "en")
internal class MagusManga(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.MAGUSMANGA, "vofeg.com", pageSize = 20, searchPageSize = 10){
MangaReaderParser(context, MangaSource.MAGUSMANGA, "vofeg.com", pageSize = 20, searchPageSize = 10) {
override val listUrl = "/series"
}

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

Loading…
Cancel
Save