diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaChapter.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaChapter.kt index b5aa4530..2e0d70e1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaChapter.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaChapter.kt @@ -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 { +) { - 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, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt index 20b3e65b..126149c4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt @@ -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(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.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) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt index 85550e8a..26014f9c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt @@ -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")), diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt index ac6080fa..2393f02c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt @@ -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) } } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Chapters.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Chapters.kt index 289080ec..9ebbb718 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Chapters.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Chapters.kt @@ -34,6 +34,13 @@ internal class ChaptersListBuilder(initialSize: Int) { return chapter != null && ids.add(chapter.id) && list.add(chapter) } + fun addAll(chapters: Iterable) { + if (chapters is Collection<*>) { + list.ensureCapacity(list.size + chapters.size) + } + chapters.forEach { add(it) } + } + operator fun plusAssign(chapter: MangaChapter?) { add(chapter) }