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 -> jo.keys().forEach { key ->
val item = jo.getJSONObject(key) val item = jo.getJSONObject(key)
result += MangaTag( result += MangaTag(
title = item.getString("text").toTitleCase(), title = item.getString("text").toTitleCase(Locale.ENGLISH),
key = item.getString("file"), key = item.getString("file"),
source = source, source = source,
) )

@ -34,8 +34,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c
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)
@Volatile private val tagsArray = SuspendLazy(::loadTags)
private var cachedTags: SparseArrayCompat<MangaTag>? = null
override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> { override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
val domain = domain val domain = domain
@ -83,7 +82,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c
} }
} }
val ja = webClient.httpGet(url.build()).parseJsonArray() val ja = webClient.httpGet(url.build()).parseJsonArray()
val tagsMap = cachedTags ?: loadTags() val tagsMap = tagsArray.get()
return ja.mapJSON { jo -> return ja.mapJSON { jo ->
val slug = jo.getString("slug") val slug = jo.getString("slug")
Manga( Manga(
@ -151,7 +150,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c
} }
override suspend fun getAvailableTags(): Set<MangaTag> { override suspend fun getAvailableTags(): Set<MangaTag> {
val sparseArray = cachedTags ?: loadTags() val sparseArray = tagsArray.get()
val set = ArraySet<MangaTag>(sparseArray.size()) val set = ArraySet<MangaTag>(sparseArray.size())
for (i in 0 until sparseArray.size()) { for (i in 0 until sparseArray.size()) {
set.add(sparseArray.valueAt(i)) set.add(sparseArray.valueAt(i))
@ -166,13 +165,12 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c
tags.append( tags.append(
jo.getInt("id"), jo.getInt("id"),
MangaTag( MangaTag(
title = jo.getString("name"), title = jo.getString("name").toTitleCase(Locale.ENGLISH),
key = jo.getString("slug"), key = jo.getString("slug"),
source = source, source = source,
), ),
) )
} }
cachedTags = tags
return tags return tags
} }

@ -103,7 +103,7 @@ internal class ImHentai(context: MangaLoaderContext) :
val href = it.attr("href").substringAfterLast("tag/").substringBeforeLast('/') val href = it.attr("href").substringAfterLast("tag/").substringBeforeLast('/')
MangaTag( MangaTag(
key = href, key = href,
title = it.selectFirstOrThrow("h3.list_tag").text(), title = it.selectFirstOrThrow("h3.list_tag").text().toTitleCase(sourceLocale),
source = source, source = source,
) )
} }

@ -200,7 +200,9 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
.getJSONArray("data") .getJSONArray("data")
return tags.mapJSONToSet { jo -> return tags.mapJSONToSet { jo ->
MangaTag( MangaTag(
title = jo.getJSONObject("attributes").getJSONObject("name").firstStringValue().toTitleCase(), title = jo.getJSONObject("attributes").getJSONObject("name")
.firstStringValue()
.toTitleCase(Locale.ENGLISH),
key = jo.getString("id"), key = jo.getString("id"),
source = source, source = source,
) )

@ -132,7 +132,7 @@ internal class MangaPark(context: MangaLoaderContext) :
.select("div.flex-col:contains(Genres) div.whitespace-nowrap") .select("div.flex-col:contains(Genres) div.whitespace-nowrap")
val tagMap = ArrayMap<String, MangaTag>(tagElements.size) val tagMap = ArrayMap<String, MangaTag>(tagElements.size)
for (el in tagElements) { 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 if (name.isEmpty()) continue
tagMap[name] = MangaTag( tagMap[name] = MangaTag(
title = name, title = name,

@ -191,7 +191,7 @@ internal abstract class NineMangaParser(
val cateId = el.attr("cate_id") val cateId = el.attr("cate_id")
val a = el.selectFirstOrThrow("a") val a = el.selectFirstOrThrow("a")
tagMap[el.text()] = MangaTag( tagMap[el.text()] = MangaTag(
title = a.text().toTitleCase(), title = a.text().toTitleCase(sourceLocale),
key = cateId, key = cateId,
source = source, source = source,
) )

@ -99,7 +99,7 @@ internal abstract class AnimeBootstrapParser(
val doc = webClient.httpGet("https://$domain$listUrl").parseHtml() val doc = webClient.httpGet("https://$domain$listUrl").parseHtml()
return doc.select("div.product__page__filter div:contains(Genre:) option ").mapNotNullToSet { option -> return doc.select("div.product__page__filter div:contains(Genre:) option ").mapNotNullToSet { option ->
val key = option.attr("value") ?: return@mapNotNullToSet null val key = option.attr("value") ?: return@mapNotNullToSet null
val name = option.text() val name = option.text().toTitleCase(sourceLocale)
MangaTag( MangaTag(
key = key, key = key,
title = name, title = name,

@ -114,7 +114,7 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex
return doc.requireElementById("select_genre").select("option").mapNotNullToSet { return doc.requireElementById("select_genre").select("option").mapNotNullToSet {
MangaTag( MangaTag(
key = it.attr("value"), key = it.attr("value"),
title = it.text(), title = it.text().toTitleCase(sourceLocale),
source = source, source = source,
) )
} }

@ -147,7 +147,7 @@ internal abstract class FmreaderParser(
val href = a.attr("href").substringAfter(tagPrefix).substringBeforeLast(".html") val href = a.attr("href").substringAfter(tagPrefix).substringBeforeLast(".html")
MangaTag( MangaTag(
key = href, key = href,
title = a.text(), title = a.text().toTitleCase(sourceLocale),
source = source, source = source,
) )
} }

@ -98,7 +98,7 @@ internal abstract class HeanCms(
id = generateUid(urlManga), id = generateUid(urlManga),
title = j.getString("title"), title = j.getString("title"),
altTitle = null, altTitle = null,
url = urlManga, url = urlManga.toRelativeUrl(domain),
publicUrl = urlManga, publicUrl = urlManga,
rating = RATING_UNKNOWN, rating = RATING_UNKNOWN,
isNsfw = false, isNsfw = false,
@ -182,7 +182,7 @@ internal abstract class HeanCms(
return tags.mapNotNullToSet { return tags.mapNotNullToSet {
MangaTag( MangaTag(
key = it.substringAfter("id\":").substringBefore(",\""), key = it.substringAfter("id\":").substringBefore(",\""),
title = it.substringAfter("name\":\"").substringBefore("\"}]"), title = it.substringAfter("name\":\"").substringBefore("\"}]").toTitleCase(sourceLocale),
source = source, source = source,
) )
} }

@ -3,6 +3,7 @@ package org.koitharu.kotatsu.parsers.site.likemanga
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import okhttp3.HttpUrl.Companion.toHttpUrl
import org.json.JSONObject import org.json.JSONObject
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
@ -189,7 +190,8 @@ internal abstract class LikeMangaParser(
MangaChapter( MangaChapter(
id = generateUid(url), id = generateUid(url),
name = name, name = name,
number = chapNum.toInt(), number = chapNum.toFloatOrNull() ?: 0f,
volume = 0,
url = url, url = url,
scanlator = null, scanlator = null,
uploadDate = parseChapterDate( uploadDate = parseChapterDate(
@ -239,9 +241,12 @@ internal abstract class LikeMangaParser(
val jsonData = JSONObject(context.decodeBase64(jsonRaw).toString(Charsets.UTF_8)) val jsonData = JSONObject(context.decodeBase64(jsonRaw).toString(Charsets.UTF_8))
val jsonImg = context.decodeBase64(jsonData.getString("data")).toString(Charsets.UTF_8) val jsonImg = context.decodeBase64(jsonData.getString("data")).toString(Charsets.UTF_8)
val images = jsonImg.replace("\\", "").replace("[", "").replace("]", "").replace("\"", "").split(",") 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 -> return images.map { img ->
val url = cdn + img val url = concatUrl(cdn.orEmpty(), img)
MangaPage( MangaPage(
id = generateUid(url), id = generateUid(url),
url = url, url = url,

@ -374,9 +374,9 @@ internal abstract class MadaraParser(
} }
MangaTag( MangaTag(
key = href, key = href,
title = a.ownText().trim().ifEmpty { title = a.ownText().ifEmpty {
a.selectFirst(".menu-image-title")?.text()?.trim() ?: return@mapNotNullToSet null a.selectFirst(".menu-image-title")?.textOrNull()
}.toTitleCase(), }?.toTitleCase(sourceLocale) ?: return@mapNotNullToSet null,
source = source, source = source,
) )
} }

@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("MANGALEK", "MangaLeku", "ar") @MangaSourceParser("MANGALEK", "MangaLeku", "ar")
internal class MangaLek(context: MangaLoaderContext) : 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) @MangaSourceParser("HENTAI3Z", "Hentai3z", "en", ContentType.HENTAI)
internal class Hentai3z(context: MangaLoaderContext) : 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 override val withoutAjax = true
} }

@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
@MangaSourceParser("EMPERORSCAN", "EmperorScan", "es") @MangaSourceParser("EMPERORSCAN", "EmperorScan", "es")
internal class EmperorScan(context: MangaLoaderContext) : 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") @MangaSourceParser("MANGA_CRAB", "MangaCrab", "es")
internal class MangaCrab(context: MangaLoaderContext) : 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 datePattern = "dd/MM/yyyy"
override val tagPrefix = "manga-genero/" override val tagPrefix = "manga-genero/"
override val listUrl = "series/" 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.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
import java.util.Locale import java.util.*
@MangaSourceParser("POJOKMANGA", "PojokManga", "id") @MangaSourceParser("POJOKMANGA", "PojokManga", "id")
internal class PojokManga(context: MangaLoaderContext) : internal class PojokManga(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.POJOKMANGA, "pojokmanga.net") { MadaraParser(context, MangaSource.POJOKMANGA, "pojokmanga.id") {
override val tagPrefix = "komik-genre/" override val tagPrefix = "komik-genre/"
override val listUrl = "komik/" override val listUrl = "komik/"
override val datePattern = "MMM d, yyyy" 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.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.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.model.ContentType
@MangaSourceParser("NOCSUMMER", "NocturneSummer", "pt", ContentType.HENTAI) @MangaSourceParser("NOCSUMMER", "NocturneSummer", "pt", ContentType.HENTAI)
internal class Nocsummer(context: MangaLoaderContext) : 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" 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.model.*
import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.site.madara.MadaraParser
import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.*
import java.util.EnumSet import java.util.*
@MangaSourceParser("SAYTRUYENHAY", "PheTruyen", "vi") @MangaSourceParser("SAYTRUYENHAY", "PheTruyen", "vi")
internal class Saytruyenhay(context: MangaLoaderContext) : 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 tagPrefix = "genre/"
override val withoutAjax = true 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.MangaChapter
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
import org.koitharu.kotatsu.parsers.util.attrAsRelativeUrlOrNull import org.koitharu.kotatsu.parsers.util.*
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
@MangaSourceParser("TRUYENTRANHDAMMYY", "TruyenTranhDamMyy", "vi") @MangaSourceParser("TRUYENTRANHDAMMYY", "TruyenTranhDamMyy", "vi")
internal class TruyenTranhDamMyy(context: MangaLoaderContext) : internal class TruyenTranhDamMyy(context: MangaLoaderContext) :
MadaraParser(context, MangaSource.TRUYENTRANHDAMMYY, "truyentranhdammyy.com") { MadaraParser(context, MangaSource.TRUYENTRANHDAMMYY, "truyentranhdammyy.net") {
override val postReq = true override val postReq = true
override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> { override suspend fun loadChapters(mangaUrl: String, document: Document): List<MangaChapter> {
val mangaId = document.select("div#manga-chapters-holder").attr("data-id") 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") @MangaSourceParser("MANGANATO", "Manganato", "en")
internal class Manganato(context: MangaLoaderContext) : internal class Manganato(context: MangaLoaderContext) :
MangaboxParser(context, MangaSource.MANGANATO) { MangaboxParser(context, MangaSource.MANGANATO) {
override val configKeyDomain = ConfigKey.Domain("chapmanganato.com", "manganato.com") override val configKeyDomain = ConfigKey.Domain("chapmanganato.to", "chapmanganato.com", "manganato.com")
override val otherDomain = "chapmanganato.com" override val otherDomain = configKeyDomain.defaultValue
} }

@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("KAISCANS", "KaiScans", "en") @MangaSourceParser("KAISCANS", "KaiScans", "en")
internal class KaiScans(context: MangaLoaderContext) : 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 listUrl = "/series"
override val isTagsExclusionSupported = false override val isTagsExclusionSupported = false
} }

@ -8,7 +8,7 @@ import java.util.*
@MangaSourceParser("AINZSCANS", "AinzScans", "id") @MangaSourceParser("AINZSCANS", "AinzScans", "id")
internal class AinzScans(context: MangaLoaderContext) : 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 listUrl = "/series"
override val datePattern = "MMM d, yyyy" override val datePattern = "MMM d, yyyy"
override val sourceLocale: Locale = Locale.ENGLISH override val sourceLocale: Locale = Locale.ENGLISH

@ -8,7 +8,7 @@ import java.util.*
@MangaSourceParser("KOMIKLOKAL", "KomikMirror", "id") @MangaSourceParser("KOMIKLOKAL", "KomikMirror", "id")
internal class KomikLokalParser(context: MangaLoaderContext) : 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 datePattern = "MMM d, yyyy"
override val sourceLocale: Locale = Locale.ENGLISH override val sourceLocale: Locale = Locale.ENGLISH
} }

@ -9,6 +9,6 @@ import java.util.*
@MangaSourceParser("KOMIKLOKALCFD", "KomikLokal.sbs", "id", ContentType.HENTAI) @MangaSourceParser("KOMIKLOKALCFD", "KomikLokal.sbs", "id", ContentType.HENTAI)
internal class KomiklokalCfd(context: MangaLoaderContext) : 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 override val sourceLocale: Locale = Locale.ENGLISH
} }

@ -7,6 +7,6 @@ import org.koitharu.kotatsu.parsers.site.mangareader.MangaReaderParser
@MangaSourceParser("SEKAIKOMIK", "SekaiKomik", "id") @MangaSourceParser("SEKAIKOMIK", "SekaiKomik", "id")
internal class SekaikomikParser(context: MangaLoaderContext) : 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 override val isTagsExclusionSupported = false
} }

@ -143,7 +143,7 @@ class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, MangaSour
if (option.text().isEmpty()) continue if (option.text().isEmpty()) continue
tagMap[option.text()] = MangaTag( tagMap[option.text()] = MangaTag(
key = option.attr("value"), key = option.attr("value"),
title = option.text(), title = option.text().toTitleCase(sourceLocale),
source = source, source = source,
) )
} }

@ -7,4 +7,4 @@ import org.koitharu.kotatsu.parsers.site.wpcomics.WpComicsParser
@MangaSourceParser("NETTRUYENMAX", "NettruyenBing", "vi") @MangaSourceParser("NETTRUYENMAX", "NettruyenBing", "vi")
internal class Nettruyenmax(context: MangaLoaderContext) : 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( Manga(
id = generateUid(href), id = generateUid(href),
url = href, url = href.toRelativeUrl(domain),
publicUrl = href, publicUrl = href,
coverUrl = urlImg.orEmpty(), coverUrl = urlImg.orEmpty(),
title = name, title = name,
@ -183,7 +183,7 @@ internal abstract class ZeistMangaParser(
return doc.selectFirstOrThrow("div.filter").select("ul li").mapNotNullToSet { return doc.selectFirstOrThrow("div.filter").select("ul li").mapNotNullToSet {
MangaTag( MangaTag(
key = it.selectFirstOrThrow("input").attr("value"), key = it.selectFirstOrThrow("input").attr("value"),
title = it.selectFirstOrThrow("label").text(), title = it.selectFirstOrThrow("label").text().toTitleCase(sourceLocale),
source = source, source = source,
) )
} }

Loading…
Cancel
Save