diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ComickFunParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ComickFunParser.kt index 6e4c6945..0d9d75e6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ComickFunParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ComickFunParser.kt @@ -168,41 +168,36 @@ internal class ComickFunParser(context: MangaLoaderContext) : MangaParser(contex ).parseJson().getJSONArray("chapters") val dateFormat = SimpleDateFormat("yyyy-MM-dd") val list = ja.toJSONList().reversed() - val dc = list.groupBy { jo -> jo.getStringOrNull("vol") to jo.getStringOrNull("chap") } - val branches = list.associateGrouping { jo -> - jo.getString("lang") to jo.optJSONArray("group_name") - ?.asIterable() - ?.joinToString() - ?.takeUnless { it.isBlank() } - } + val chaptersBuilder = ChaptersListBuilder(list.size) - var number = 0 - for ((key, value) in dc) { - number++ - val (vol, chap) = key - for (jo in value) { - val lang = jo.getString("lang") - val locale = Locale.forLanguageTag(lang) - val team = - jo.optJSONArray("group_name")?.asIterable()?.joinToString()?.takeUnless { it.isBlank() } - var branch = locale.getDisplayName(locale).toTitleCase(locale) - if (branches[lang].orEmpty().size > 1 && team != null) { - branch += " ($team)" - } - chaptersBuilder += MangaChapter( - id = generateUid(jo.getLong("id")), - name = buildString { - vol?.let { append("Vol ").append(it).append(' ') } - chap?.let { append("Chap ").append(it) } - jo.getStringOrNull("title")?.let { append(": ").append(it) } - }, - number = number, - url = jo.getString("hid"), - scanlator = team, - uploadDate = dateFormat.tryParse(jo.getString("created_at").substringBefore('T')), - branch = branch, - source = source, - ) + val branchedChapters = HashMap, MangaChapter>>() + for (jo in list) { + val vol = jo.getStringOrNull("vol") + val chap = jo.getStringOrNull("chap") + val volChap = vol to chap + val locale = Locale.forLanguageTag(jo.getString("lang")) + val lc = locale.getDisplayName(locale).toTitleCase(locale) + val branch = (list.indices).firstNotNullOf { i -> + val b = if (i == 0) lc else "$lc ($i)" + if (branchedChapters[b]?.get(volChap) == null) b else null + } + val chapter = MangaChapter( + id = generateUid(jo.getLong("id")), + name = buildString { + vol?.let { append("Vol ").append(it).append(' ') } + chap?.let { append("Chap ").append(it) } + jo.getStringOrNull("title")?.let { append(": ").append(it) } + }, + number = branchedChapters[branch]?.size?.plus(1) ?: 0, + url = jo.getString("hid"), + scanlator = jo.optJSONArray("group_name")?.asIterable()?.joinToString() + ?.takeUnless { it.isBlank() }, + uploadDate = dateFormat.tryParse(jo.getString("created_at").substringBefore('T')), + branch = branch, + source = source, + ) + if (chaptersBuilder.add(chapter)) { + branchedChapters.getOrPut(branch, ::HashMap)[volChap] = chapter } } return chaptersBuilder.toList() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaDexParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaDexParser.kt index a19b58e6..3c41a170 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaDexParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaDexParser.kt @@ -243,43 +243,38 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context "yyyy-MM-dd'T'HH:mm:ss'+00:00'", Locale.ROOT, ) - val branches = list.associateGrouping { jo -> - jo.getJSONObject("attributes").getStringOrNull("translatedLanguage") to - jo.getJSONArray("relationships").associateByKey("type")["scanlation_group"] - ?.getJSONObject("attributes")?.getStringOrNull("name") - } - val dc = list.groupBy { jo -> jo.getJSONObject("attributes").getFloatOrDefault("chapter", 0f) } val chaptersBuilder = ChaptersListBuilder(list.size) - var index = 0 - for ((number, value) in dc) { - for (jo in value) { - val id = jo.getString("id") - val attrs = jo.getJSONObject("attributes") - if (!attrs.isNull("externalUrl")) { - continue - } - val lang = attrs.getStringOrNull("translatedLanguage") - val locale = lang?.let { Locale.forLanguageTag(it) } - val relations = jo.getJSONArray("relationships").associateByKey("type") - val team = relations["scanlation_group"]?.getJSONObject("attributes")?.getStringOrNull("name") - ?.takeUnless { it.isBlank() } - var branch = locale?.getDisplayName(locale)?.toTitleCase(locale) - if (branches[lang].orEmpty().size > 1 && team != null) { - branch += " ($team)" - } - chaptersBuilder += MangaChapter( - id = generateUid(id), - name = attrs.getStringOrNull("title")?.takeUnless(String::isEmpty) - ?: "Chapter #$number", - number = if (number <= 0f) (index + 1) else number.toInt(), - url = id, - scanlator = team, - uploadDate = dateFormat.tryParse(attrs.getString("publishAt")), - branch = branch, - source = source, - ) + val branchedChapters = HashMap>() + for (jo in list) { + val id = jo.getString("id") + val attrs = jo.getJSONObject("attributes") + if (!attrs.isNull("externalUrl")) { + continue + } + val number = jo.getJSONObject("attributes").getFloatOrDefault("chapter", 0f) + val locale = attrs.getStringOrNull("translatedLanguage")?.let { Locale.forLanguageTag(it) } + val lc = locale?.getDisplayName(locale)?.toTitleCase(locale) + val relations = jo.getJSONArray("relationships").associateByKey("type") + val team = relations["scanlation_group"]?.getJSONObject("attributes")?.getStringOrNull("name") + ?.takeUnless { it.isBlank() } + val branch = (list.indices).firstNotNullOf { i -> + val b = if (i == 0) lc else "$lc ($i)" + if (branchedChapters[b]?.get(number) == null) b else null + } + val chapter = MangaChapter( + id = generateUid(id), + name = attrs.getStringOrNull("title")?.takeUnless(String::isEmpty) + ?: "Chapter #${number.toString().removeSuffix(".0")}", + number = if (number <= 0f) (branchedChapters[branch]?.size?.plus(1) ?: 0) else number.toInt(), + url = id, + scanlator = team, + uploadDate = dateFormat.tryParse(attrs.getString("publishAt")), + branch = branch, + source = source, + ) + if (chaptersBuilder.add(chapter)) { + branchedChapters.getOrPut(branch, ::HashMap)[number] = chapter } - index++ } return chaptersBuilder.toList() }