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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -157,7 +157,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
id = generateUid(href), id = generateUid(href),
url = href, url = href,
source = MangaSource.MANGATOWN, source = MangaSource.MANGATOWN,
number = i + 1, number = i + 1f,
volume = 0,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(
dateFormat, dateFormat,
li.selectFirst("span.time")?.text(), li.selectFirst("span.time")?.text(),
@ -253,7 +254,8 @@ internal class MangaTownParser(context: MangaLoaderContext) : PagedMangaParser(c
id = generateUid(href), id = generateUid(href),
url = href, url = href,
source = MangaSource.MANGATOWN, source = MangaSource.MANGATOWN,
number = i + 1, number = i + 1f,
volume = 0,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(
dateFormat, dateFormat,
li.selectFirst("span.time")?.text(), li.selectFirst("span.time")?.text(),

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

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

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

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

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

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

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

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

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

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

@ -155,7 +155,8 @@ internal abstract class FoolSlideParser(
MangaChapter( MangaChapter(
id = generateUid(href), id = generateUid(href),
name = a.text(), name = a.text(),
number = i + 1, number = i + 1f,
volume = 0,
url = href, url = href,
uploadDate = if (div.selectFirstOrThrow(selectDate).text().contains(", ")) { uploadDate = if (div.selectFirstOrThrow(selectDate).text().contains(", ")) {
dateFormat.tryParse(dateText) 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.model.MangaSource
import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser import org.koitharu.kotatsu.parsers.site.foolslide.FoolSlideParser
// The source has changed template so for the moment it is dead.
@MangaSourceParser("HNISCANTRAD", "HniScantrad", "fr") @MangaSourceParser("HNISCANTRAD", "HniScantrad", "fr")
internal class HniScantrad(context: MangaLoaderContext) : 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 pagination = false
override val searchUrl = "lel/search/" override val searchUrl = "lel/search/"
override val listUrl = "lel/directory/" override val listUrl = "lel/directory/"

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

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

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

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

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

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

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

@ -1,11 +1,9 @@
package org.koitharu.kotatsu.parsers.site.heancms package org.koitharu.kotatsu.parsers.site.heancms
import okhttp3.Headers
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.PagedMangaParser import org.koitharu.kotatsu.parsers.PagedMangaParser
import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.* 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.*
import org.koitharu.kotatsu.parsers.util.json.mapJSON import org.koitharu.kotatsu.parsers.util.json.mapJSON
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -20,8 +18,16 @@ internal abstract class HeanCms(
override val configKeyDomain = ConfigKey.Domain(domain) 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( override val availableSortOrders: Set<SortOrder> = EnumSet.of(
SortOrder.ALPHABETICAL, SortOrder.ALPHABETICAL,
SortOrder.ALPHABETICAL_DESC,
SortOrder.UPDATED, SortOrder.UPDATED,
SortOrder.NEWEST, SortOrder.NEWEST,
SortOrder.POPULARITY, SortOrder.POPULARITY,
@ -30,15 +36,11 @@ internal abstract class HeanCms(
override val availableStates: Set<MangaState> = override val availableStates: Set<MangaState> =
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED) 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 pathManga = "series"
protected open val apiPath protected open val apiPath
get() = getDomain("api") 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> { override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val url = buildString { val url = buildString {
append("https://") append("https://")
@ -147,7 +149,8 @@ internal abstract class HeanCms(
MangaChapter( MangaChapter(
id = generateUid(url), id = generateUid(url),
name = name, name = name,
number = i + 1, number = i + 1f,
volume = 0,
url = url, url = url,
scanlator = null, scanlator = null,
uploadDate = dateFormat.tryParse(date), uploadDate = dateFormat.tryParse(date),

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

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

@ -1,10 +1,165 @@
package org.koitharu.kotatsu.parsers.site.heancms.fr package org.koitharu.kotatsu.parsers.site.heancms.fr
import org.json.JSONArray
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser 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.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.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") @MangaSourceParser("PERF_SCAN", "PerfScan", "fr")
internal class PerfScan(context: MangaLoaderContext) : 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.POPULARITY -> append("total_views&order=desc")
SortOrder.UPDATED -> append("latest&order=desc") SortOrder.UPDATED -> append("latest&order=desc")
SortOrder.NEWEST -> append("created_at&order=desc") SortOrder.NEWEST -> append("created_at&order=desc")
SortOrder.ALPHABETICAL -> append("title&order=desc") SortOrder.ALPHABETICAL -> append("title&order=asc")
SortOrder.ALPHABETICAL_DESC -> append("title&order=asc") SortOrder.ALPHABETICAL_DESC -> append("title&order=desc")
else -> append("latest&order=desc") else -> append("latest&order=desc")
} }
append("&series_type=All&perPage=") append("&series_type=All&perPage=")

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

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

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

@ -126,7 +126,8 @@ class NicovideoSeigaParser(context: MangaLoaderContext) :
MangaChapter( MangaChapter(
id = generateUid(href), id = generateUid(href),
name = li.select("div > div.description > div.title > a").text(), name = li.select("div > div.description > div.title > a").text(),
number = i + 1, number = i + 1f,
volume = 0,
url = href, url = href,
scanlator = null, scanlator = null,
branch = 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( MangaChapter(
id = generateUid(href), id = generateUid(href),
name = name, name = name,
number = i + 1, number = i + 1f,
volume = 0,
url = link, url = link,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(
dateFormat, dateFormat,
@ -506,7 +507,8 @@ internal abstract class MadaraParser(
id = generateUid(href), id = generateUid(href),
url = link, url = link,
name = name, name = name,
number = i + 1, number = i + 1f,
volume = 0,
branch = null, branch = null,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(
dateFormat, dateFormat,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -29,6 +29,13 @@ internal abstract class MangaReaderParser(
override val configKeyDomain = ConfigKey.Domain(domain) 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> override val availableSortOrders: Set<SortOrder>
get() = EnumSet.of( get() = EnumSet.of(
SortOrder.UPDATED, SortOrder.UPDATED,
@ -156,7 +163,8 @@ internal abstract class MangaReaderParser(
id = generateUid(url), id = generateUid(url),
name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}", name = element.selectFirst(".chapternum")?.text() ?: "Chapter ${index + 1}",
url = url, url = url,
number = index + 1, number = index + 1f,
volume = 0,
scanlator = null, scanlator = null,
uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()), uploadDate = dateFormat.tryParse(element.selectFirst(".chapterdate")?.text()),
branch = null, branch = null,

@ -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
}

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

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

@ -7,4 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("THUNDERSCANS", "ThunderScans", "ar") @MangaSourceParser("THUNDERSCANS", "ThunderScans", "ar")
internal class ThunderScans(context: MangaLoaderContext) : 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 import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("UMIMANGA", "UmiManga", "ar") @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) { MangaReaderParser(context, MangaSource.UMIMANGA, "www.umimanga.com", pageSize = 20, searchPageSize = 10) {
override val isTagsExclusionSupported = false override val isTagsExclusionSupported = false
} }

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

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

@ -90,7 +90,8 @@ internal class ManhwaFreak(context: MangaLoaderContext) :
id = generateUid(url), id = generateUid(url),
name = a.selectFirst(".chapter-info p:contains(Chapter)")?.text() ?: "Chapter ${index + 1}", name = a.selectFirst(".chapter-info p:contains(Chapter)")?.text() ?: "Chapter ${index + 1}",
url = url, url = url,
number = index + 1, number = index + 1f,
volume = 0,
scanlator = null, scanlator = null,
uploadDate = if (dateText == "NEW") { uploadDate = if (dateText == "NEW") {
parseChapterDate( parseChapterDate(

@ -17,8 +17,15 @@ internal class RizzComic(context: MangaLoaderContext) :
MangaReaderParser(context, MangaSource.RIZZCOMIC, "rizzfables.com", pageSize = 50, searchPageSize = 20) { MangaReaderParser(context, MangaSource.RIZZCOMIC, "rizzfables.com", pageSize = 50, searchPageSize = 20) {
override val datePattern = "dd MMM yyyy" override val datePattern = "dd MMM yyyy"
override val listUrl = "/series" override val listUrl = "/series"
override val availableSortOrders: Set<SortOrder> = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED, SortOrder.NEWEST, SortOrder.POPULARITY, SortOrder.ALPHABETICAL_DESC) override val availableSortOrders: Set<SortOrder> = EnumSet.of(
override val availableStates: Set<MangaState> = EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED) SortOrder.ALPHABETICAL,
SortOrder.UPDATED,
SortOrder.NEWEST,
SortOrder.POPULARITY,
SortOrder.ALPHABETICAL_DESC,
)
override val availableStates: Set<MangaState> =
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED)
override val isMultipleTagsSupported = true override val isMultipleTagsSupported = true
override val isSearchSupported = true override val isSearchSupported = true
override val isTagsExclusionSupported = false override val isTagsExclusionSupported = false
@ -64,6 +71,7 @@ internal class RizzComic(context: MangaLoaderContext) :
null null
} }
} }
is MangaListFilter.Advanced -> { is MangaListFilter.Advanced -> {
val state = filter.states.oneOrThrowIfMany()?.toPayloadValue() ?: "all" val state = filter.states.oneOrThrowIfMany()?.toPayloadValue() ?: "all"
@ -79,6 +87,7 @@ internal class RizzComic(context: MangaLoaderContext) :
} }
formBuilder.build() formBuilder.build()
} }
else -> { else -> {
FormBody.Builder() FormBody.Builder()
.add("StatusValue", "all") .add("StatusValue", "all")
@ -146,6 +155,7 @@ internal class RizzComic(context: MangaLoaderContext) :
MangaState.PAUSED -> "hiatus" MangaState.PAUSED -> "hiatus"
else -> "all" else -> "all"
} }
override suspend fun getAvailableTags(): Set<MangaTag> { override suspend fun getAvailableTags(): Set<MangaTag> {
val url = "https://$domain/series" val url = "https://$domain/series"
val doc = webClient.httpGet(url).parseHtml() val doc = webClient.httpGet(url).parseHtml()

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

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

Loading…
Cancel
Save