Add volume field to chapter
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user