Add volume field to chapter

Koitharu 2 years ago
parent 8e7d7e0bde
commit fcaa0ea442
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -10,9 +10,13 @@ class MangaChapter(
*/
@JvmField val name: String,
/**
* Chapter number starting from 1
* Chapter number starting from 1, 0 if unknown
*/
@JvmField val number: Int,
/**
* Volume number starting from 1, 0 if unknown
*/
@JvmField val volume: Int,
/**
* Relative url to chapter (**without** a domain) or any other uri.
* Used principally in parsers
@ -32,11 +36,29 @@ class MangaChapter(
*/
@JvmField val branch: String?,
@JvmField val source: MangaSource,
) : Comparable<MangaChapter> {
) {
override fun compareTo(other: MangaChapter): Int {
return number.compareTo(other.number)
}
@Deprecated(message = "Consider using constructor with volume value")
constructor(
id: Long,
name: String,
number: Int,
url: String,
scanlator: String?,
uploadDate: Long,
branch: String?,
source: MangaSource,
) : this(
id = id,
name = name,
number = number,
volume = 0,
url = url,
scanlator = scanlator,
uploadDate = uploadDate,
branch = branch,
source = source,
)
override fun equals(other: Any?): Boolean {
if (this === other) return true
@ -47,6 +69,7 @@ class MangaChapter(
if (id != other.id) return false
if (name != other.name) return false
if (number != other.number) return false
if (volume != other.volume) return false
if (url != other.url) return false
if (scanlator != other.scanlator) return false
if (uploadDate != other.uploadDate) return false
@ -60,6 +83,7 @@ class MangaChapter(
var result = id.hashCode()
result = 31 * result + name.hashCode()
result = 31 * result + number
result = 31 * result + volume
result = 31 * result + url.hashCode()
result = 31 * result + (scanlator?.hashCode() ?: 0)
result = 31 * result + uploadDate.hashCode()
@ -72,10 +96,11 @@ class MangaChapter(
return "MangaChapter($id - #$number [$url] - $source)"
}
internal fun copy(number: Int) = MangaChapter(
internal fun copy(volume: Int, number: Int) = MangaChapter(
id = id,
name = name,
number = number,
volume = volume,
url = url,
scanlator = scanlator,
uploadDate = uploadDate,

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.ru.rulib
import androidx.collection.ArrayMap
import androidx.collection.ArraySet
import kotlinx.coroutines.withTimeoutOrNull
import okhttp3.Response
@ -108,31 +107,24 @@ internal open class MangaLibParser(
val id = json.optJSONObject("user")?.getLong("id")?.toString() ?: "not"
val total = list.length()
chapters = ChaptersListBuilder(total)
val counters = ArrayMap<Int, Int>(branches.size)
for (i in (0 until total).reversed()) {
val item = list.getJSONObject(i)
val chapterId = item.getLong("chapter_id")
val scanlator = item.getStringOrNull("username")
val volume = item.getInt("chapter_volume")
val number = item.getString("chapter_number")
val url = buildString {
append(manga.url)
append("/v")
append(volume)
append("/c")
append(number)
if (isAuthorized) {
append(manga.url)
append("/v")
append(item.getInt("chapter_volume"))
append("/c")
append(item.getString("chapter_number"))
append("?ui=")
append(id)
} else {
append(manga.url)
append("/v")
append(item.getInt("chapter_volume"))
append("/c")
append(item.getString("chapter_number"))
}
}
val nameChapter = item.getStringOrNull("chapter_name")
val volume = item.getInt("chapter_volume")
val number = item.getString("chapter_number")
val fullNameChapter = "Том $volume. Глава $number"
val branchId = item.getIntOrDefault("branch_id", 0)
chapters.add(
@ -140,7 +132,8 @@ internal open class MangaLibParser(
id = generateUid(chapterId),
url = url,
source = source,
number = counters.incrementAndGet(branchId),
number = number.toIntOrNull() ?: 0,
volume = volume,
uploadDate = dateFormat.tryParse(
item.getString("chapter_created_at").substringBefore(" "),
),
@ -347,13 +340,6 @@ internal open class MangaLibParser(
return isSuccessful && mimeType?.startsWith("image/") == true && headersContentLength() >= 1024L
}
private fun MutableMap<Int, Int>.incrementAndGet(key: Int): Int {
var v = getOrDefault(key, 0)
v++
put(key, v)
return v
}
@MangaSourceParser("MANGALIB", "MangaLib", "ru")
class Impl(context: MangaLoaderContext) : MangaLibParser(context, MangaSource.MANGALIB)

@ -11,9 +11,9 @@ import org.koitharu.kotatsu.parsers.PagedMangaParser
import org.koitharu.kotatsu.parsers.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.json.mapJSONIndexed
import java.text.SimpleDateFormat
import java.util.*
@ -51,21 +51,24 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context,
body.put("sortOrder", "ASC")
val chapterRequest = webClient.httpPost(chapterApi, body).parseJson()
return manga.copy(
chapters = chapterRequest.getJSONArray("data").mapJSONIndexed { i, jo ->
chapters = chapterRequest.getJSONArray("data").mapJSON { jo ->
val number = jo.getIntOrDefault("chapterNum", 0)
val volume = jo.getIntOrDefault("volume", 0)
MangaChapter(
id = generateUid(jo.getString("id")),
name = buildString {
append("Том ")
append(jo.optString("volume", "0"))
append(volume)
append(". ")
append("Розділ ")
append(jo.optString("chapterNum", "0"))
append(number)
if (jo.optString("title") != "Title") {
append(" - ")
append(jo.optString("title"))
}
},
number = i + 1,
number = number,
volume = volume,
url = jo.optString("chapterResourcesId"),
scanlator = null,
uploadDate = dateFormat.tryParse(jo.getString("lastUpdated")),

@ -168,7 +168,7 @@ internal class XoxoComics(context: MangaLoaderContext) :
}
list.addAll(super.getChapters(doc).asReversed())
list.reverse()
list.mapIndexed { i, x -> x.copy(number = i + 1) }
list.mapIndexed { i, x -> x.copy(volume = x.volume, number = i + 1) }
}
}

@ -34,6 +34,13 @@ internal class ChaptersListBuilder(initialSize: Int) {
return chapter != null && ids.add(chapter.id) && list.add(chapter)
}
fun addAll(chapters: Iterable<MangaChapter?>) {
if (chapters is Collection<*>) {
list.ensureCapacity(list.size + chapters.size)
}
chapters.forEach { add(it) }
}
operator fun plusAssign(chapter: MangaChapter?) {
add(chapter)
}

Loading…
Cancel
Save