Fixes batch

Koitharu 2 years ago
parent a03ab0e0c0
commit b11e50ab22
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

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

Loading…
Cancel
Save