[MangaDex][ComicK] Fix branching again

pull/180/head
Koitharu 3 years ago
parent 0366ad0e57
commit cae7073f87
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -168,41 +168,36 @@ internal class ComickFunParser(context: MangaLoaderContext) : MangaParser(contex
).parseJson().getJSONArray("chapters") ).parseJson().getJSONArray("chapters")
val dateFormat = SimpleDateFormat("yyyy-MM-dd") val dateFormat = SimpleDateFormat("yyyy-MM-dd")
val list = ja.toJSONList().reversed() 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<String>()
?.joinToString()
?.takeUnless { it.isBlank() }
}
val chaptersBuilder = ChaptersListBuilder(list.size) val chaptersBuilder = ChaptersListBuilder(list.size)
var number = 0 val branchedChapters = HashMap<String?, HashMap<Pair<String?, String?>, MangaChapter>>()
for ((key, value) in dc) { for (jo in list) {
number++ val vol = jo.getStringOrNull("vol")
val (vol, chap) = key val chap = jo.getStringOrNull("chap")
for (jo in value) { val volChap = vol to chap
val lang = jo.getString("lang") val locale = Locale.forLanguageTag(jo.getString("lang"))
val locale = Locale.forLanguageTag(lang) val lc = locale.getDisplayName(locale).toTitleCase(locale)
val team = val branch = (list.indices).firstNotNullOf { i ->
jo.optJSONArray("group_name")?.asIterable<String>()?.joinToString()?.takeUnless { it.isBlank() } val b = if (i == 0) lc else "$lc ($i)"
var branch = locale.getDisplayName(locale).toTitleCase(locale) if (branchedChapters[b]?.get(volChap) == null) b else null
if (branches[lang].orEmpty().size > 1 && team != null) { }
branch += " ($team)" val chapter = MangaChapter(
} id = generateUid(jo.getLong("id")),
chaptersBuilder += MangaChapter( name = buildString {
id = generateUid(jo.getLong("id")), vol?.let { append("Vol ").append(it).append(' ') }
name = buildString { chap?.let { append("Chap ").append(it) }
vol?.let { append("Vol ").append(it).append(' ') } jo.getStringOrNull("title")?.let { append(": ").append(it) }
chap?.let { append("Chap ").append(it) } },
jo.getStringOrNull("title")?.let { append(": ").append(it) } number = branchedChapters[branch]?.size?.plus(1) ?: 0,
}, url = jo.getString("hid"),
number = number, scanlator = jo.optJSONArray("group_name")?.asIterable<String>()?.joinToString()
url = jo.getString("hid"), ?.takeUnless { it.isBlank() },
scanlator = team, uploadDate = dateFormat.tryParse(jo.getString("created_at").substringBefore('T')),
uploadDate = dateFormat.tryParse(jo.getString("created_at").substringBefore('T')), branch = branch,
branch = branch, source = source,
source = source, )
) if (chaptersBuilder.add(chapter)) {
branchedChapters.getOrPut(branch, ::HashMap)[volChap] = chapter
} }
} }
return chaptersBuilder.toList() return chaptersBuilder.toList()

@ -243,43 +243,38 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
"yyyy-MM-dd'T'HH:mm:ss'+00:00'", "yyyy-MM-dd'T'HH:mm:ss'+00:00'",
Locale.ROOT, 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) val chaptersBuilder = ChaptersListBuilder(list.size)
var index = 0 val branchedChapters = HashMap<String?, HashMap<Float, MangaChapter>>()
for ((number, value) in dc) { for (jo in list) {
for (jo in value) { val id = jo.getString("id")
val id = jo.getString("id") val attrs = jo.getJSONObject("attributes")
val attrs = jo.getJSONObject("attributes") if (!attrs.isNull("externalUrl")) {
if (!attrs.isNull("externalUrl")) { continue
continue }
} val number = jo.getJSONObject("attributes").getFloatOrDefault("chapter", 0f)
val lang = attrs.getStringOrNull("translatedLanguage") val locale = attrs.getStringOrNull("translatedLanguage")?.let { Locale.forLanguageTag(it) }
val locale = lang?.let { Locale.forLanguageTag(it) } val lc = locale?.getDisplayName(locale)?.toTitleCase(locale)
val relations = jo.getJSONArray("relationships").associateByKey("type") val relations = jo.getJSONArray("relationships").associateByKey("type")
val team = relations["scanlation_group"]?.getJSONObject("attributes")?.getStringOrNull("name") val team = relations["scanlation_group"]?.getJSONObject("attributes")?.getStringOrNull("name")
?.takeUnless { it.isBlank() } ?.takeUnless { it.isBlank() }
var branch = locale?.getDisplayName(locale)?.toTitleCase(locale) val branch = (list.indices).firstNotNullOf { i ->
if (branches[lang].orEmpty().size > 1 && team != null) { val b = if (i == 0) lc else "$lc ($i)"
branch += " ($team)" if (branchedChapters[b]?.get(number) == null) b else null
} }
chaptersBuilder += MangaChapter( val chapter = MangaChapter(
id = generateUid(id), id = generateUid(id),
name = attrs.getStringOrNull("title")?.takeUnless(String::isEmpty) name = attrs.getStringOrNull("title")?.takeUnless(String::isEmpty)
?: "Chapter #$number", ?: "Chapter #${number.toString().removeSuffix(".0")}",
number = if (number <= 0f) (index + 1) else number.toInt(), number = if (number <= 0f) (branchedChapters[branch]?.size?.plus(1) ?: 0) else number.toInt(),
url = id, url = id,
scanlator = team, scanlator = team,
uploadDate = dateFormat.tryParse(attrs.getString("publishAt")), uploadDate = dateFormat.tryParse(attrs.getString("publishAt")),
branch = branch, branch = branch,
source = source, source = source,
) )
if (chaptersBuilder.add(chapter)) {
branchedChapters.getOrPut(branch, ::HashMap)[number] = chapter
} }
index++
} }
return chaptersBuilder.toList() return chaptersBuilder.toList()
} }

Loading…
Cancel
Save