diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt index 2c38420d..85400948 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/WaMangaParser.kt @@ -101,7 +101,7 @@ internal class WaMangaParser( number = it.getFloatOrDefault("chapter", 0f), volume = it.getIntOrDefault("volume", 0), name = it.getStringOrNull("full_title") ?: manga.title, - scanlator = it.getJSONArray("teams").optJSONObject(0, null)?.getStringOrNull("name"), + scanlator = it.getJSONArray("teams").getJSONObject(0)?.getStringOrNull("name"), uploadDate = dateFormat.tryParse(it.getStringOrNull("published_on")), branch = null, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt index 6fef8031..ec8c3156 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/CMangaParser.kt @@ -1,7 +1,6 @@ package org.koitharu.kotatsu.parsers.site.vi import androidx.collection.ArrayMap -import androidx.collection.ArraySet import org.json.JSONObject import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaParserAuthProvider @@ -24,7 +23,11 @@ import org.koitharu.kotatsu.parsers.util.domain import org.koitharu.kotatsu.parsers.util.generateUid import org.koitharu.kotatsu.parsers.util.getCookies import org.koitharu.kotatsu.parsers.util.json.asTypedList +import org.koitharu.kotatsu.parsers.util.json.getStringOrNull import org.koitharu.kotatsu.parsers.util.json.mapJSON +import org.koitharu.kotatsu.parsers.util.json.mapJSONNotNull +import org.koitharu.kotatsu.parsers.util.mapNotNullToSet +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.parsers.util.parseJson import org.koitharu.kotatsu.parsers.util.parseJsonArray import org.koitharu.kotatsu.parsers.util.parseRaw @@ -34,7 +37,6 @@ import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.parsers.util.tryParse import org.koitharu.kotatsu.parsers.util.urlBuilder import java.text.SimpleDateFormat -import java.time.Instant import java.util.EnumSet import java.util.Locale @@ -92,11 +94,11 @@ internal class CMangaParser(context: MangaLoaderContext) : .mapJSON { jo -> val chapterId = jo.getLong("id_chapter") val info = jo.parseJson("info") - val chapterNumber = info.getInt("num") + val chapterNumber = info.getString("num") MangaChapter( id = generateUid(chapterId), name = if (info.isLocked()) "Chapter $chapterNumber - locked" else "Chapter $chapterNumber", - number = chapterNumber + 1f, + number = chapterNumber.toFloatOrNull()?.plus(1) ?: 0f, volume = 0, url = "/album/$slug/chapter-$mangaId-$chapterId", uploadDate = df.tryParse(info.getString("last_update")), @@ -141,33 +143,32 @@ internal class CMangaParser(context: MangaLoaderContext) : webClient.httpGet(url).parseJsonArray() } - return mangaList.mapJSON { jo -> + return mangaList.mapJSONNotNull { jo -> val info = jo.parseJson("info") - val slug = info.getString("url") - val id = info.getLong("id") + val slug = info.getStringOrNull("url") ?: return@mapJSONNotNull null + val id = info.optLong("id").takeIf { it != 0L } ?: return@mapJSONNotNull null val relativeUrl = "/album/$slug-$id" - val mangaTags = ArraySet() - info.getJSONArray("tags").asTypedList().forEach { - tags.get()[it.lowercase()]?.let { mangaTags.add(it) } - } Manga( id = generateUid(id), - title = info.getString("name").toTitleCase(), - altTitle = info.getJSONArray("name_other").asTypedList().joinToString(), + title = info.optString("name").toTitleCase(), + altTitle = info.optJSONArray("name_other")?.asTypedList()?.joinToString()?.nullIfEmpty(), url = relativeUrl, publicUrl = relativeUrl.toAbsoluteUrl(domain), rating = RATING_UNKNOWN, isNsfw = false, coverUrl = "/assets/tmp/album/${info.getString("avatar")}".toAbsoluteUrl(domain), - tags = mangaTags, - state = when (info.getString("status")) { + tags = info.optJSONArray("tags")?.asTypedList() + ?.mapNotNullToSet { tags.get()[it.lowercase()] } + .orEmpty(), + state = when (info.optString("status")) { "doing" -> MangaState.ONGOING - else -> null // can't find any manga with other status than on going + "done" -> MangaState.FINISHED + else -> null }, author = null, largeCoverUrl = null, - description = info.optString("detail"), + description = info.getStringOrNull("detail")?.replace("\\\"", "\""), chapters = emptyList(), source = source, )