[ComicK] Fix branching #163 #167

Koitharu 3 years ago
parent 83cca4ef12
commit 6183f6edf3
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -2,7 +2,6 @@ package org.koitharu.kotatsu.parsers.site
import androidx.collection.ArraySet import androidx.collection.ArraySet
import androidx.collection.SparseArrayCompat import androidx.collection.SparseArrayCompat
import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.MangaParser
@ -126,7 +125,6 @@ internal class ComickFunParser(context: MangaLoaderContext) : MangaParser(contex
val jo = webClient.httpGet( val jo = webClient.httpGet(
"https://api.${domain}/chapter/${chapter.url}?tachiyomi=true", "https://api.${domain}/chapter/${chapter.url}?tachiyomi=true",
).parseJson().getJSONObject("chapter") ).parseJson().getJSONObject("chapter")
val referer = "https://${domain}/"
return jo.getJSONArray("images").mapJSON { return jo.getJSONArray("images").mapJSON {
val url = it.getString("url") val url = it.getString("url")
MangaPage( MangaPage(
@ -169,37 +167,43 @@ internal class ComickFunParser(context: MangaLoaderContext) : MangaParser(contex
url = "https://api.${domain}/comic/$hid/chapters?limit=$CHAPTERS_LIMIT", url = "https://api.${domain}/comic/$hid/chapters?limit=$CHAPTERS_LIMIT",
).parseJson().getJSONArray("chapters") ).parseJson().getJSONArray("chapters")
val dateFormat = SimpleDateFormat("yyyy-MM-dd") val dateFormat = SimpleDateFormat("yyyy-MM-dd")
val counters = HashMap<Locale, Int>() val list = ja.toJSONList().reversed()
return ja.mapReversed { jo -> val dc = list.groupBy { jo -> jo.getStringOrNull("vol") to jo.getStringOrNull("chap") }
val locale = Locale.forLanguageTag(jo.getString("lang")) val branches = list.associateGrouping { jo ->
var number = counters[locale] ?: 0 jo.getString("lang") to jo.optJSONArray("group_name")
?.joinToString { it.toString() }
?.takeUnless { it.isBlank() }
}
val chaptersBuilder = ChaptersListBuilder(list.size)
var number = 0
for ((key, value) in dc) {
number++ number++
counters[locale] = number val (vol, chap) = key
MangaChapter( for (jo in value) {
val lang = jo.getString("lang")
val locale = Locale.forLanguageTag(lang)
val team = jo.optJSONArray("group_name")?.joinToString { it.toString() }?.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")), id = generateUid(jo.getLong("id")),
name = buildString { name = buildString {
jo.getStringOrNull("vol")?.let { append("Vol ").append(it).append(' ') } vol?.let { append("Vol ").append(it).append(' ') }
jo.getStringOrNull("chap")?.let { append("Chap ").append(it) } chap?.let { append("Chap ").append(it) }
jo.getStringOrNull("title")?.let { append(": ").append(it) } jo.getStringOrNull("title")?.let { append(": ").append(it) }
}, },
number = number, number = number,
url = jo.getString("hid"), url = jo.getString("hid"),
scanlator = jo.optJSONArray("group_name")?.optString(0), scanlator = team,
uploadDate = dateFormat.tryParse(jo.getString("created_at").substringBefore('T')), uploadDate = dateFormat.tryParse(jo.getString("created_at").substringBefore('T')),
branch = locale.getDisplayName(locale).toTitleCase(locale), branch = branch,
source = source, source = source,
) )
} }
} }
return chaptersBuilder.toList()
private inline fun <R> JSONArray.mapReversed(block: (JSONObject) -> R): List<R> {
val len = length()
val destination = ArrayList<R>(len)
for (i in (0 until len).reversed()) {
val jo = getJSONObject(i)
destination.add(block(jo))
}
return destination
} }
private fun JSONObject.selectGenres(name: String, tags: SparseArrayCompat<MangaTag>): Set<MangaTag> { private fun JSONObject.selectGenres(name: String, tags: SparseArrayCompat<MangaTag>): Set<MangaTag> {

@ -65,3 +65,12 @@ inline fun <T> List<T>.areItemsEquals(other: List<T>, equals: (T, T) -> Boolean)
} }
fun <T> Iterator<T>.nextOrNull(): T? = if (hasNext()) next() else null fun <T> Iterator<T>.nextOrNull(): T? = if (hasNext()) next() else null
inline fun <T, K, V> Collection<T>.associateGrouping(transform: (T) -> Pair<K, V>): Map<K, List<V>> {
val result = LinkedHashMap<K, MutableList<V>>(size)
for (item in this) {
val (k, v) = transform(item)
result.getOrPut(k) { LinkedList() }.add(v)
}
return result
}

Loading…
Cancel
Save