[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")
number++ ?.joinToString { it.toString() }
counters[locale] = number ?.takeUnless { it.isBlank() }
MangaChapter(
id = generateUid(jo.getLong("id")),
name = buildString {
jo.getStringOrNull("vol")?.let { append("Vol ").append(it).append(' ') }
jo.getStringOrNull("chap")?.let { append("Chap ").append(it) }
jo.getStringOrNull("title")?.let { append(": ").append(it) }
},
number = number,
url = jo.getString("hid"),
scanlator = jo.optJSONArray("group_name")?.optString(0),
uploadDate = dateFormat.tryParse(jo.getString("created_at").substringBefore('T')),
branch = locale.getDisplayName(locale).toTitleCase(locale),
source = source,
)
} }
} val chaptersBuilder = ChaptersListBuilder(list.size)
var number = 0
private inline fun <R> JSONArray.mapReversed(block: (JSONObject) -> R): List<R> { for ((key, value) in dc) {
val len = length() number++
val destination = ArrayList<R>(len) val (vol, chap) = key
for (i in (0 until len).reversed()) { for (jo in value) {
val jo = getJSONObject(i) val lang = jo.getString("lang")
destination.add(block(jo)) 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")),
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,
)
}
} }
return destination return chaptersBuilder.toList()
} }
private fun JSONObject.selectGenres(name: String, tags: SparseArrayCompat<MangaTag>): Set<MangaTag> { private fun JSONObject.selectGenres(name: String, tags: SparseArrayCompat<MangaTag>): Set<MangaTag> {

@ -64,4 +64,13 @@ inline fun <T> List<T>.areItemsEquals(other: List<T>, equals: (T, T) -> Boolean)
return true return true
} }
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