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

@ -1,6 +1,5 @@
package org.koitharu.kotatsu.parsers.site.ru.rulib package org.koitharu.kotatsu.parsers.site.ru.rulib
import androidx.collection.ArrayMap
import androidx.collection.ArraySet import androidx.collection.ArraySet
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeoutOrNull
import okhttp3.Response import okhttp3.Response
@ -108,31 +107,24 @@ internal open class MangaLibParser(
val id = json.optJSONObject("user")?.getLong("id")?.toString() ?: "not" val id = json.optJSONObject("user")?.getLong("id")?.toString() ?: "not"
val total = list.length() val total = list.length()
chapters = ChaptersListBuilder(total) chapters = ChaptersListBuilder(total)
val counters = ArrayMap<Int, Int>(branches.size)
for (i in (0 until total).reversed()) { for (i in (0 until total).reversed()) {
val item = list.getJSONObject(i) val item = list.getJSONObject(i)
val chapterId = item.getLong("chapter_id") val chapterId = item.getLong("chapter_id")
val scanlator = item.getStringOrNull("username") val scanlator = item.getStringOrNull("username")
val volume = item.getInt("chapter_volume")
val number = item.getString("chapter_number")
val url = buildString { val url = buildString {
if (isAuthorized) {
append(manga.url) append(manga.url)
append("/v") append("/v")
append(item.getInt("chapter_volume")) append(volume)
append("/c") append("/c")
append(item.getString("chapter_number")) append(number)
if (isAuthorized) {
append("?ui=") append("?ui=")
append(id) 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 nameChapter = item.getStringOrNull("chapter_name")
val volume = item.getInt("chapter_volume")
val number = item.getString("chapter_number")
val fullNameChapter = "Том $volume. Глава $number" val fullNameChapter = "Том $volume. Глава $number"
val branchId = item.getIntOrDefault("branch_id", 0) val branchId = item.getIntOrDefault("branch_id", 0)
chapters.add( chapters.add(
@ -140,7 +132,8 @@ internal open class MangaLibParser(
id = generateUid(chapterId), id = generateUid(chapterId),
url = url, url = url,
source = source, source = source,
number = counters.incrementAndGet(branchId), number = number.toIntOrNull() ?: 0,
volume = volume,
uploadDate = dateFormat.tryParse( uploadDate = dateFormat.tryParse(
item.getString("chapter_created_at").substringBefore(" "), item.getString("chapter_created_at").substringBefore(" "),
), ),
@ -347,13 +340,6 @@ internal open class MangaLibParser(
return isSuccessful && mimeType?.startsWith("image/") == true && headersContentLength() >= 1024L 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") @MangaSourceParser("MANGALIB", "MangaLib", "ru")
class Impl(context: MangaLoaderContext) : MangaLibParser(context, MangaSource.MANGALIB) 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.config.ConfigKey
import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.util.* 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.getStringOrNull
import org.koitharu.kotatsu.parsers.util.json.mapJSON import org.koitharu.kotatsu.parsers.util.json.mapJSON
import org.koitharu.kotatsu.parsers.util.json.mapJSONIndexed
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
@ -51,21 +51,24 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context,
body.put("sortOrder", "ASC") body.put("sortOrder", "ASC")
val chapterRequest = webClient.httpPost(chapterApi, body).parseJson() val chapterRequest = webClient.httpPost(chapterApi, body).parseJson()
return manga.copy( 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( MangaChapter(
id = generateUid(jo.getString("id")), id = generateUid(jo.getString("id")),
name = buildString { name = buildString {
append("Том ") append("Том ")
append(jo.optString("volume", "0")) append(volume)
append(". ") append(". ")
append("Розділ ") append("Розділ ")
append(jo.optString("chapterNum", "0")) append(number)
if (jo.optString("title") != "Title") { if (jo.optString("title") != "Title") {
append(" - ") append(" - ")
append(jo.optString("title")) append(jo.optString("title"))
} }
}, },
number = i + 1, number = number,
volume = volume,
url = jo.optString("chapterResourcesId"), url = jo.optString("chapterResourcesId"),
scanlator = null, scanlator = null,
uploadDate = dateFormat.tryParse(jo.getString("lastUpdated")), uploadDate = dateFormat.tryParse(jo.getString("lastUpdated")),

@ -168,7 +168,7 @@ internal class XoxoComics(context: MangaLoaderContext) :
} }
list.addAll(super.getChapters(doc).asReversed()) list.addAll(super.getChapters(doc).asReversed())
list.reverse() 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) 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?) { operator fun plusAssign(chapter: MangaChapter?) {
add(chapter) add(chapter)
} }

Loading…
Cancel
Save