Fixes batch
This commit is contained in:
@@ -226,7 +226,7 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser(
|
||||
jo.keys().forEach { key ->
|
||||
val item = jo.getJSONObject(key)
|
||||
result += MangaTag(
|
||||
title = item.getString("text").toTitleCase(),
|
||||
title = item.getString("text").toTitleCase(Locale.ENGLISH),
|
||||
key = item.getString("file"),
|
||||
source = source,
|
||||
)
|
||||
|
||||
@@ -34,8 +34,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c
|
||||
override val availableStates: Set<MangaState> =
|
||||
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
|
||||
|
||||
@Volatile
|
||||
private var cachedTags: SparseArrayCompat<MangaTag>? = null
|
||||
private val tagsArray = SuspendLazy(::loadTags)
|
||||
|
||||
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
|
||||
val domain = domain
|
||||
@@ -83,7 +82,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c
|
||||
}
|
||||
}
|
||||
val ja = webClient.httpGet(url.build()).parseJsonArray()
|
||||
val tagsMap = cachedTags ?: loadTags()
|
||||
val tagsMap = tagsArray.get()
|
||||
return ja.mapJSON { jo ->
|
||||
val slug = jo.getString("slug")
|
||||
Manga(
|
||||
@@ -151,7 +150,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c
|
||||
}
|
||||
|
||||
override suspend fun getAvailableTags(): Set<MangaTag> {
|
||||
val sparseArray = cachedTags ?: loadTags()
|
||||
val sparseArray = tagsArray.get()
|
||||
val set = ArraySet<MangaTag>(sparseArray.size())
|
||||
for (i in 0 until sparseArray.size()) {
|
||||
set.add(sparseArray.valueAt(i))
|
||||
@@ -166,13 +165,12 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c
|
||||
tags.append(
|
||||
jo.getInt("id"),
|
||||
MangaTag(
|
||||
title = jo.getString("name"),
|
||||
title = jo.getString("name").toTitleCase(Locale.ENGLISH),
|
||||
key = jo.getString("slug"),
|
||||
source = source,
|
||||
),
|
||||
)
|
||||
}
|
||||
cachedTags = tags
|
||||
return tags
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@ internal class ImHentai(context: MangaLoaderContext) :
|
||||
val href = it.attr("href").substringAfterLast("tag/").substringBeforeLast('/')
|
||||
MangaTag(
|
||||
key = href,
|
||||
title = it.selectFirstOrThrow("h3.list_tag").text(),
|
||||
title = it.selectFirstOrThrow("h3.list_tag").text().toTitleCase(sourceLocale),
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -200,7 +200,9 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
|
||||
.getJSONArray("data")
|
||||
return tags.mapJSONToSet { jo ->
|
||||
MangaTag(
|
||||
title = jo.getJSONObject("attributes").getJSONObject("name").firstStringValue().toTitleCase(),
|
||||
title = jo.getJSONObject("attributes").getJSONObject("name")
|
||||
.firstStringValue()
|
||||
.toTitleCase(Locale.ENGLISH),
|
||||
key = jo.getString("id"),
|
||||
source = source,
|
||||
)
|
||||
|
||||
@@ -132,7 +132,7 @@ internal class MangaPark(context: MangaLoaderContext) :
|
||||
.select("div.flex-col:contains(Genres) div.whitespace-nowrap")
|
||||
val tagMap = ArrayMap<String, MangaTag>(tagElements.size)
|
||||
for (el in tagElements) {
|
||||
val name = el.selectFirstOrThrow("span.whitespace-nowrap").text()
|
||||
val name = el.selectFirstOrThrow("span.whitespace-nowrap").text().toTitleCase(sourceLocale)
|
||||
if (name.isEmpty()) continue
|
||||
tagMap[name] = MangaTag(
|
||||
title = name,
|
||||
|
||||
@@ -191,7 +191,7 @@ internal abstract class NineMangaParser(
|
||||
val cateId = el.attr("cate_id")
|
||||
val a = el.selectFirstOrThrow("a")
|
||||
tagMap[el.text()] = MangaTag(
|
||||
title = a.text().toTitleCase(),
|
||||
title = a.text().toTitleCase(sourceLocale),
|
||||
key = cateId,
|
||||
source = source,
|
||||
)
|
||||
|
||||
@@ -99,7 +99,7 @@ internal abstract class AnimeBootstrapParser(
|
||||
val doc = webClient.httpGet("https://$domain$listUrl").parseHtml()
|
||||
return doc.select("div.product__page__filter div:contains(Genre:) option ").mapNotNullToSet { option ->
|
||||
val key = option.attr("value") ?: return@mapNotNullToSet null
|
||||
val name = option.text()
|
||||
val name = option.text().toTitleCase(sourceLocale)
|
||||
MangaTag(
|
||||
key = key,
|
||||
title = name,
|
||||
|
||||
@@ -114,7 +114,7 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex
|
||||
return doc.requireElementById("select_genre").select("option").mapNotNullToSet {
|
||||
MangaTag(
|
||||
key = it.attr("value"),
|
||||
title = it.text(),
|
||||
title = it.text().toTitleCase(sourceLocale),
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@ internal abstract class FmreaderParser(
|
||||
val href = a.attr("href").substringAfter(tagPrefix).substringBeforeLast(".html")
|
||||
MangaTag(
|
||||
key = href,
|
||||
title = a.text(),
|
||||
title = a.text().toTitleCase(sourceLocale),
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ internal abstract class HeanCms(
|
||||
id = generateUid(urlManga),
|
||||
title = j.getString("title"),
|
||||
altTitle = null,
|
||||
url = urlManga,
|
||||
url = urlManga.toRelativeUrl(domain),
|
||||
publicUrl = urlManga,
|
||||
rating = RATING_UNKNOWN,
|
||||
isNsfw = false,
|
||||
@@ -182,7 +182,7 @@ internal abstract class HeanCms(
|
||||
return tags.mapNotNullToSet {
|
||||
MangaTag(
|
||||
key = it.substringAfter("id\":").substringBefore(",\""),
|
||||
title = it.substringAfter("name\":\"").substringBefore("\"}]"),
|
||||
title = it.substringAfter("name\":\"").substringBefore("\"}]").toTitleCase(sourceLocale),
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package org.koitharu.kotatsu.parsers.site.likemanga
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||
import org.json.JSONObject
|
||||
import org.jsoup.nodes.Element
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
@@ -189,7 +190,8 @@ internal abstract class LikeMangaParser(
|
||||
MangaChapter(
|
||||
id = generateUid(url),
|
||||
name = name,
|
||||
number = chapNum.toInt(),
|
||||
number = chapNum.toFloatOrNull() ?: 0f,
|
||||
volume = 0,
|
||||
url = url,
|
||||
scanlator = null,
|
||||
uploadDate = parseChapterDate(
|
||||
@@ -239,9 +241,12 @@ internal abstract class LikeMangaParser(
|
||||
val jsonData = JSONObject(context.decodeBase64(jsonRaw).toString(Charsets.UTF_8))
|
||||
val jsonImg = context.decodeBase64(jsonData.getString("data")).toString(Charsets.UTF_8)
|
||||
val images = jsonImg.replace("\\", "").replace("[", "").replace("]", "").replace("\"", "").split(",")
|
||||
val cdn = doc.selectFirstOrThrow(".reading-detail img").src()?.substringBefore("manga/")
|
||||
val baseUrl = doc.selectFirstOrThrow(".reading-detail img").src()
|
||||
val cdn = baseUrl?.substringBefore("manga/", "")?.ifEmpty {
|
||||
baseUrl.toHttpUrl().resolve("/").toString()
|
||||
}
|
||||
return images.map { img ->
|
||||
val url = cdn + img
|
||||
val url = concatUrl(cdn.orEmpty(), img)
|
||||
MangaPage(
|
||||
id = generateUid(url),
|
||||
url = url,
|
||||
|
||||
@@ -374,9 +374,9 @@ internal abstract class MadaraParser(
|
||||
}
|
||||
MangaTag(
|
||||
key = href,
|
||||
title = a.ownText().trim().ifEmpty {
|
||||
a.selectFirst(".menu-image-title")?.text()?.trim() ?: return@mapNotNullToSet null
|
||||
}.toTitleCase(),
|
||||
title = a.ownText().ifEmpty {
|
||||
a.selectFirst(".menu-image-title")?.textOrNull()
|
||||
}?.toTitleCase(sourceLocale) ?: return@mapNotNullToSet null,
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MANGALEK", "MangaLeku", "ar")
|
||||
internal class MangaLek(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.MANGALEK, "mangaleku.com", pageSize = 10)
|
||||
MadaraParser(context, MangaSource.MANGALEK, "manga-leko.com", pageSize = 10)
|
||||
|
||||
@@ -8,6 +8,6 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("HENTAI3Z", "Hentai3z", "en", ContentType.HENTAI)
|
||||
internal class Hentai3z(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.HENTAI3Z, "hentai3z.xyz", pageSize = 20) {
|
||||
MadaraParser(context, MangaSource.HENTAI3Z, "manga18h.xyz", pageSize = 20) {
|
||||
override val withoutAjax = true
|
||||
}
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("EMPERORSCAN", "EmperorScan", "es")
|
||||
internal class EmperorScan(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.EMPERORSCAN, "emperorscan.com")
|
||||
MadaraParser(context, MangaSource.EMPERORSCAN, "emperorscan.net")
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
|
||||
@MangaSourceParser("MANGA_CRAB", "MangaCrab", "es")
|
||||
internal class MangaCrab(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.MANGA_CRAB, "mangacrab3.com") {
|
||||
MadaraParser(context, MangaSource.MANGA_CRAB, "httpmangacrab2.com") {
|
||||
override val datePattern = "dd/MM/yyyy"
|
||||
override val tagPrefix = "manga-genero/"
|
||||
override val listUrl = "series/"
|
||||
|
||||
@@ -4,11 +4,11 @@ import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import java.util.Locale
|
||||
import java.util.*
|
||||
|
||||
@MangaSourceParser("POJOKMANGA", "PojokManga", "id")
|
||||
internal class PojokManga(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.POJOKMANGA, "pojokmanga.net") {
|
||||
MadaraParser(context, MangaSource.POJOKMANGA, "pojokmanga.id") {
|
||||
override val tagPrefix = "komik-genre/"
|
||||
override val listUrl = "komik/"
|
||||
override val datePattern = "MMM d, yyyy"
|
||||
|
||||
@@ -2,12 +2,12 @@ package org.koitharu.kotatsu.parsers.site.madara.pt
|
||||
|
||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||
import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.model.ContentType
|
||||
|
||||
@MangaSourceParser("NOCSUMMER", "NocturneSummer", "pt", ContentType.HENTAI)
|
||||
internal class Nocsummer(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.NOCSUMMER, "nocsummer.com.br", 18) {
|
||||
MadaraParser(context, MangaSource.NOCSUMMER, "nocfsb.com", 18) {
|
||||
override val datePattern = "dd 'de' MMMMM 'de' yyyy"
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.*
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
import java.util.EnumSet
|
||||
import java.util.*
|
||||
|
||||
@MangaSourceParser("SAYTRUYENHAY", "PheTruyen", "vi")
|
||||
internal class Saytruyenhay(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.SAYTRUYENHAY, "phetruyen.pro", 40) {
|
||||
MadaraParser(context, MangaSource.SAYTRUYENHAY, "phetruyen.vip", 40) {
|
||||
|
||||
override val tagPrefix = "genre/"
|
||||
override val withoutAjax = true
|
||||
|
||||
@@ -6,16 +6,11 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser
|
||||
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
|
||||
import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrlOrNull
|
||||
import org.koitharu.kotatsu.parsers.util.domain
|
||||
import org.koitharu.kotatsu.parsers.util.generateUid
|
||||
import org.koitharu.kotatsu.parsers.util.mapChapters
|
||||
import org.koitharu.kotatsu.parsers.util.parseFailed
|
||||
import org.koitharu.kotatsu.parsers.util.parseHtml
|
||||
import org.koitharu.kotatsu.parsers.util.*
|
||||
|
||||
@MangaSourceParser("TRUYENTRANHDAMMYY", "TruyenTranhDamMyy", "vi")
|
||||
internal class TruyenTranhDamMyy(context: MangaLoaderContext) :
|
||||
MadaraParser(context, MangaSource.TRUYENTRANHDAMMYY, "truyentranhdammyy.com") {
|
||||
MadaraParser(context, MangaSource.TRUYENTRANHDAMMYY, "truyentranhdammyy.net") {
|
||||
override val postReq = true
|
||||
override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> {
|
||||
val mangaId = document.select("div#manga-chapters-holder").attr("data-id")
|
||||
|
||||
@@ -9,6 +9,6 @@ import org.koitharu.kotatsu.parsers.site.mangabox.MangaboxParser
|
||||
@MangaSourceParser("MANGANATO", "Manganato", "en")
|
||||
internal class Manganato(context: MangaLoaderContext) :
|
||||
MangaboxParser(context, MangaSource.MANGANATO) {
|
||||
override val configKeyDomain = ConfigKey.Domain("chapmanganato.com", "manganato.com")
|
||||
override val otherDomain = "chapmanganato.com"
|
||||
override val configKeyDomain = ConfigKey.Domain("chapmanganato.to", "chapmanganato.com", "manganato.com")
|
||||
override val otherDomain = configKeyDomain.defaultValue
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("KAISCANS", "KaiScans", "en")
|
||||
internal class KaiScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.KAISCANS, "kaiscans.com", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaSource.KAISCANS, "kaiscans.org", pageSize = 20, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
override val isTagsExclusionSupported = false
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.*
|
||||
|
||||
@MangaSourceParser("AINZSCANS", "AinzScans", "id")
|
||||
internal class AinzScans(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.AINZSCANS, "ainzscans.site", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaSource.AINZSCANS, "ainzscans.net", pageSize = 20, searchPageSize = 10) {
|
||||
override val listUrl = "/series"
|
||||
override val datePattern = "MMM d, yyyy"
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.*
|
||||
|
||||
@MangaSourceParser("KOMIKLOKAL", "KomikMirror", "id")
|
||||
internal class KomikLokalParser(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.KOMIKLOKAL, "komikmirror.sbs", pageSize = 20, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaSource.KOMIKLOKAL, "komikmirror.lol", pageSize = 20, searchPageSize = 10) {
|
||||
override val datePattern = "MMM d, yyyy"
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
|
||||
@@ -9,6 +9,6 @@ import java.util.*
|
||||
|
||||
@MangaSourceParser("KOMIKLOKALCFD", "KomikLokal.sbs", "id", ContentType.HENTAI)
|
||||
internal class KomiklokalCfd(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.KOMIKLOKALCFD, "komiklokal.sbs", pageSize = 30, searchPageSize = 10) {
|
||||
MangaReaderParser(context, MangaSource.KOMIKLOKALCFD, "komiklokal.mom", pageSize = 30, searchPageSize = 10) {
|
||||
override val sourceLocale: Locale = Locale.ENGLISH
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
|
||||
|
||||
@MangaSourceParser("SEKAIKOMIK", "SekaiKomik", "id")
|
||||
internal class SekaikomikParser(context: MangaLoaderContext) :
|
||||
MangaReaderParser(context, MangaSource.SEKAIKOMIK, "sekaikomik.bio", pageSize = 20, searchPageSize = 100) {
|
||||
MangaReaderParser(context, MangaSource.SEKAIKOMIK, "sekaikomik.guru", pageSize = 20, searchPageSize = 100) {
|
||||
override val isTagsExclusionSupported = false
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, MangaSour
|
||||
if (option.text().isEmpty()) continue
|
||||
tagMap[option.text()] = MangaTag(
|
||||
key = option.attr("value"),
|
||||
title = option.text(),
|
||||
title = option.text().toTitleCase(sourceLocale),
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser
|
||||
|
||||
@MangaSourceParser("NETTRUYENMAX", "NettruyenBing", "vi")
|
||||
internal class Nettruyenmax(context: MangaLoaderContext) :
|
||||
WpComicsParser(context, MangaSource.NETTRUYENMAX, "www.nettruyenbing.com", 36)
|
||||
WpComicsParser(context, MangaSource.NETTRUYENMAX, "www.nettruyenclub.com", 36)
|
||||
|
||||
@@ -163,7 +163,7 @@ internal abstract class ZeistMangaParser(
|
||||
}
|
||||
Manga(
|
||||
id = generateUid(href),
|
||||
url = href,
|
||||
url = href.toRelativeUrl(domain),
|
||||
publicUrl = href,
|
||||
coverUrl = urlImg.orEmpty(),
|
||||
title = name,
|
||||
@@ -183,7 +183,7 @@ internal abstract class ZeistMangaParser(
|
||||
return doc.selectFirstOrThrow("div.filter").select("ul li").mapNotNullToSet {
|
||||
MangaTag(
|
||||
key = it.selectFirstOrThrow("input").attr("value"),
|
||||
title = it.selectFirstOrThrow("label").text(),
|
||||
title = it.selectFirstOrThrow("label").text().toTitleCase(sourceLocale),
|
||||
source = source,
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user