Misc parsers fixes

master
Koitharu 1 year ago
parent d2b2578a3a
commit f076c8095a
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -1,6 +1,6 @@
package org.koitharu.kotatsu.parsers.site.fr package org.koitharu.kotatsu.parsers.site.fr
import kotlinx.coroutines.* import kotlinx.coroutines.coroutineScope
import org.json.JSONArray 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
@ -115,14 +115,13 @@ internal class PhenixscansParser(context: MangaLoaderContext) :
private fun parseMangaList(json: JSONArray): List<Manga> { private fun parseMangaList(json: JSONArray): List<Manga> {
return json.mapJSON { j -> return json.mapJSON { j ->
val slug = j.getString("slug") val slug = j.getString("slug")
val urlManga = "https://$domain/manga/$slug"
Manga( Manga(
id = generateUid(j.getString("_id")), id = generateUid(j.getString("_id")),
title = j.getString("title"), title = j.getString("title"),
altTitles = emptySet(), altTitles = emptySet(),
url = urlManga, url = slug,
publicUrl = urlManga, publicUrl = "https://$domain/manga/$slug",
rating = j.getFloatOrDefault("averageRating", RATING_UNKNOWN) / 10f, rating = j.getFloatOrDefault("averageRating", RATING_UNKNOWN * 10f) / 10f,
contentRating = null, contentRating = null,
description = j.getStringOrNull("synopsis"), description = j.getStringOrNull("synopsis"),
coverUrl = "https://cdn.phenix-scans.com/?url=https://api.phenix-scans.com/" + j.getString("coverImage") + "&output=webp&w=400&ll", coverUrl = "https://cdn.phenix-scans.com/?url=https://api.phenix-scans.com/" + j.getString("coverImage") + "&output=webp&w=400&ll",
@ -142,7 +141,7 @@ internal class PhenixscansParser(context: MangaLoaderContext) :
private val dateFormat = SimpleDateFormat("d MMM yyyy", sourceLocale) private val dateFormat = SimpleDateFormat("d MMM yyyy", sourceLocale)
override suspend fun getDetails(manga: Manga): Manga = coroutineScope { override suspend fun getDetails(manga: Manga): Manga = coroutineScope {
val mangaUrl = manga.url.toAbsoluteUrl(domain) val mangaUrl = "https://$domain/manga/${manga.url}"
val doc = webClient.httpGet(mangaUrl).parseHtml() val doc = webClient.httpGet(mangaUrl).parseHtml()
manga.copy( manga.copy(
@ -156,8 +155,8 @@ internal class PhenixscansParser(context: MangaLoaderContext) :
chapters = doc.select(" div.project__chapters a.project__chapter") chapters = doc.select(" div.project__chapters a.project__chapter")
.mapChapters(reversed = true) { i, a -> .mapChapters(reversed = true) { i, a ->
val href = a.attrAsRelativeUrl("href") val href = a.attrAsRelativeUrl("href")
val name = a.selectFirst(".project__chapter-title")?.text().orEmpty() val name = a.selectFirst(".project__chapter-title")?.textOrNull()
val dateText = a.selectFirst(".project__chapter-date")?.text().orEmpty() val dateText = a.selectFirst(".project__chapter-date")?.textOrNull()
MangaChapter( MangaChapter(
id = generateUid(href), id = generateUid(href),
title = name, title = name,
@ -180,7 +179,7 @@ internal class PhenixscansParser(context: MangaLoaderContext) :
val fullUrl = chapter.url.toAbsoluteUrl(domain) val fullUrl = chapter.url.toAbsoluteUrl(domain)
val doc = webClient.httpGet(fullUrl).parseHtml() val doc = webClient.httpGet(fullUrl).parseHtml()
return doc.select("div.chapter-images img.chapter-image").map { img -> return doc.select("div.chapter-images img.chapter-image").map { img ->
val url = img.src() ?: img.parseFailed("Image src not found") val url = img.requireSrc()
MangaPage( MangaPage(
id = generateUid(url), id = generateUid(url),
url = url, url = url,
@ -196,7 +195,7 @@ internal class PhenixscansParser(context: MangaLoaderContext) :
return json.mapJSONToSet { return json.mapJSONToSet {
MangaTag( MangaTag(
key = it.getString("_id"), key = it.getString("_id"),
title = it.getString("name"), title = it.getString("name").toTitleCase(sourceLocale),
source = source, source = source,
) )
} }

@ -10,6 +10,7 @@ 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.getFloatOrDefault import org.koitharu.kotatsu.parsers.util.json.getFloatOrDefault
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
import org.koitharu.kotatsu.parsers.util.suspendlazy.getOrNull import org.koitharu.kotatsu.parsers.util.suspendlazy.getOrNull
import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy
@ -23,7 +24,7 @@ internal class ComXParser(context: MangaLoaderContext) :
override val configKeyDomain = ConfigKey.Domain("com-x.life") override val configKeyDomain = ConfigKey.Domain("com-x.life")
private val availableTags = suspendLazy(initializer = ::fetchTags) private val availableTags = suspendLazy(initializer = ::fetchTags)
private val cdnImageUrl = "img.com-x.life/comix/" private val cdnImageUrl = "img.com-x.life/comix/"
override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) { override fun onCreateConfig(keys: MutableCollection<ConfigKey<*>>) {
super.onCreateConfig(keys) super.onCreateConfig(keys)
@ -86,12 +87,12 @@ internal class ComXParser(context: MangaLoaderContext) :
Manga( Manga(
id = generateUid(href), id = generateUid(href),
url = href, url = href,
publicUrl = a.attr("href"), publicUrl = a.attrAsAbsoluteUrl("href"),
title = titleElement.text(), title = titleElement.text(),
altTitles = emptySet(), altTitles = emptySet(),
authors = emptySet(), authors = emptySet(),
description = null, description = null,
tags = emptySet(), tags = emptySet(),
rating = RATING_UNKNOWN, rating = RATING_UNKNOWN,
state = null, state = null,
coverUrl = img?.attrAsAbsoluteUrlOrNull("data-src"), coverUrl = img?.attrAsAbsoluteUrlOrNull("data-src"),
@ -115,13 +116,13 @@ internal class ComXParser(context: MangaLoaderContext) :
val jsonData = JSONObject(scriptData) val jsonData = JSONObject(scriptData)
val chaptersJson = jsonData.getJSONArray("chapters") val chaptersJson = jsonData.getJSONArray("chapters")
val newsId = jsonData.getLong("news_id") val newsId = jsonData.getLong("news_id")
val chapters = List(chaptersJson.length()) { i -> val chapters = List(chaptersJson.length()) { i ->
val chapter = chaptersJson.getJSONObject(i) val chapter = chaptersJson.getJSONObject(i)
val chapterId = chapter.getLong("id") val chapterId = chapter.getLong("id")
MangaChapter( MangaChapter(
id = generateUid("$newsId/$chapterId"), id = generateUid("$newsId/$chapterId"),
url = "/reader/$newsId/$chapterId", url = "/reader/$newsId/$chapterId",
number = chapter.getFloatOrDefault("posi", 0f), number = chapter.getFloatOrDefault("posi", 0f),
title = decodeText(chapter.getStringOrNull("title")), title = decodeText(chapter.getStringOrNull("title")),
@ -129,7 +130,7 @@ internal class ComXParser(context: MangaLoaderContext) :
source = source, source = source,
scanlator = null, scanlator = null,
branch = null, branch = null,
volume = chapter.optInt("volume", 0) volume = chapter.getIntOrDefault("volume", 0),
) )
}.reversed() }.reversed()
@ -179,7 +180,7 @@ internal class ComXParser(context: MangaLoaderContext) :
?: throw ParseException("Image data not found", chapter.url) ?: throw ParseException("Image data not found", chapter.url)
return data.map { imageUrl -> return data.map { imageUrl ->
val finalUrl = "https://" + cdnImageUrl + imageUrl val finalUrl = "https://$cdnImageUrl$imageUrl"
MangaPage( MangaPage(
id = generateUid(imageUrl), id = generateUid(imageUrl),
url = finalUrl, url = finalUrl,

@ -141,7 +141,7 @@ internal class RemangaParser(
val content = try { val content = try {
data.getJSONObject("content") data.getJSONObject("content")
} catch (e: JSONException) { } catch (e: JSONException) {
throw ParseException(data.optString("msg"), manga.publicUrl, e) throw ParseException(data.getStringOrNull("msg"), manga.publicUrl, e)
} }
val branchId = content.getJSONArray("branches").optJSONObject(0) val branchId = content.getJSONArray("branches").optJSONObject(0)
?.getLong("id") ?: throw ParseException("No branches found", manga.publicUrl) ?.getLong("id") ?: throw ParseException("No branches found", manga.publicUrl)

@ -147,9 +147,12 @@ internal class CMangaParser(context: MangaLoaderContext) :
return mangaList.mapJSONNotNull { jo -> return mangaList.mapJSONNotNull { jo ->
val info = jo.parseJson("info") val info = jo.parseJson("info")
val slug = info.getStringOrNull("url") ?: return@mapJSONNotNull null val slug = info.getStringOrNull("url") ?: return@mapJSONNotNull null
val id = info.optLong("id").takeIf { it != 0L } ?: return@mapJSONNotNull null val id = info.getLongOrDefault("id", 0L)
if (id == 0L) {
return@mapJSONNotNull null
}
val relativeUrl = "/album/$slug-$id" val relativeUrl = "/album/$slug-$id"
val title = info.optString("name").replace("\\", "") val title = info.getString("name").replace("\\", "")
val altTitle = info.optJSONArray("name_other")?.asTypedList<String>()?.map { it.replace("\\", "") } val altTitle = info.optJSONArray("name_other")?.asTypedList<String>()?.map { it.replace("\\", "") }
Manga( Manga(
@ -201,7 +204,7 @@ internal class CMangaParser(context: MangaLoaderContext) :
private suspend fun getTags(): Map<String, MangaTag> { private suspend fun getTags(): Map<String, MangaTag> {
val tagList = webClient.httpGet("assets/json/album_tags_image.json".toAbsoluteUrl(domain)).parseJson() val tagList = webClient.httpGet("assets/json/album_tags_image.json".toAbsoluteUrl(domain)).parseJson()
.getJSONObject("list") .getJSONObject("list")
val tags = ArrayMap<String, MangaTag>() val tags = ArrayMap<String, MangaTag>(tagList.length())
for (key in tagList.keys()) { for (key in tagList.keys()) {
val jo = tagList.getJSONObject(key) val jo = tagList.getJSONObject(key)
val name = jo.getString("name") val name = jo.getString("name")

@ -8,6 +8,7 @@ import org.koitharu.kotatsu.parsers.core.LegacyPagedMangaParser
import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.network.UserAgents 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.getStringOrNull
import java.util.* import java.util.*
@MangaSourceParser("GOCTRUYENTRANH", "Góc Truyện Tranh", "vi") @MangaSourceParser("GOCTRUYENTRANH", "Góc Truyện Tranh", "vi")
@ -150,11 +151,11 @@ internal class GocTruyenTranh(context: MangaLoaderContext) :
url = "/$slug", url = "/$slug",
publicUrl = mangaUrl, publicUrl = mangaUrl,
title = item.getString("name"), title = item.getString("name"),
altTitles = setOfNotNull(item.optString("origin_name")?.takeUnless { it == "null" || it.isEmpty() }), altTitles = setOfNotNull(item.getStringOrNull("origin_name")?.takeUnless { it == "null" }),
description = item.optString("content"), description = item.getStringOrNull("content"),
rating = RATING_UNKNOWN, rating = RATING_UNKNOWN,
contentRating = if (checkNsfw || isNsfwSource) ContentRating.ADULT else null, contentRating = if (checkNsfw || isNsfwSource) ContentRating.ADULT else null,
coverUrl = item.optString("thumbnail"), coverUrl = item.getStringOrNull("thumbnail"),
tags = tags, tags = tags,
state = when (item.optString("status")) { state = when (item.optString("status")) {
"0" -> MangaState.ONGOING "0" -> MangaState.ONGOING

Loading…
Cancel
Save