Migrate chapter number to float

Koitharu 2 years ago
parent 7c871edbca
commit a8f9423307
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -12,7 +12,7 @@ class MangaChapter(
/**
* Chapter number starting from 1, 0 if unknown
*/
@JvmField val number: Int,
@JvmField val number: Float,
/**
* Volume number starting from 1, 0 if unknown
*/
@ -51,7 +51,7 @@ class MangaChapter(
) : this(
id = id,
name = name,
number = number,
number = number.toFloat(),
volume = 0,
url = url,
scanlator = scanlator,
@ -82,7 +82,7 @@ class MangaChapter(
override fun hashCode(): Int {
var result = id.hashCode()
result = 31 * result + name.hashCode()
result = 31 * result + number
result = 31 * result + number.hashCode()
result = 31 * result + volume
result = 31 * result + url.hashCode()
result = 31 * result + (scanlator?.hashCode() ?: 0)
@ -96,7 +96,7 @@ class MangaChapter(
return "MangaChapter($id - #$number [$url] - $source)"
}
internal fun copy(volume: Int, number: Int) = MangaChapter(
internal fun copy(volume: Int, number: Float) = MangaChapter(
id = id,
name = name,
number = number,

@ -11,13 +11,13 @@ import org.koitharu.kotatsu.parsers.model.*
import org.koitharu.kotatsu.parsers.network.UserAgents
import org.koitharu.kotatsu.parsers.util.*
import org.koitharu.kotatsu.parsers.util.json.*
import java.util.EnumSet
import java.util.*
internal abstract class MangAdventureParser(
context: MangaLoaderContext,
source: MangaSource,
domain: String,
pageSize: Int = 25
pageSize: Int = 25,
) : PagedMangaParser(context, source, pageSize) {
override val configKeyDomain = ConfigKey.Domain(domain)
@ -28,7 +28,7 @@ internal abstract class MangAdventureParser(
MangaState.ONGOING,
MangaState.FINISHED,
MangaState.ABANDONED,
MangaState.PAUSED
MangaState.PAUSED,
)
override val availableContentRating: Set<ContentRating> =
@ -38,7 +38,7 @@ internal abstract class MangAdventureParser(
SortOrder.ALPHABETICAL,
SortOrder.ALPHABETICAL_DESC,
SortOrder.UPDATED,
SortOrder.POPULARITY
SortOrder.POPULARITY,
)
override val defaultSortOrder = SortOrder.ALPHABETICAL
@ -53,6 +53,7 @@ internal abstract class MangAdventureParser(
is MangaListFilter.Search -> {
url.addQueryParameter("title", filter.query)
}
is MangaListFilter.Advanced -> {
url.addQueryParameter(
"categories",
@ -65,7 +66,7 @@ internal abstract class MangAdventureParser(
} else if (filter.tagsExclude.isNotEmpty()) {
filter.tagsExclude.joinTo(this, ",") { "-" + it.key }
}
}
},
)
when (filter.states.oneOrThrowIfMany()) {
null -> url.addEncodedQueryParameter("status", "any")
@ -83,6 +84,7 @@ internal abstract class MangAdventureParser(
else -> throw IllegalArgumentException(ERROR_UNSUPPORTED_SORT_ORDER)
}
}
else -> {}
}
return runCatchingCancellable { getManga(url.get()) }.getOrElse {
@ -121,20 +123,19 @@ internal abstract class MangAdventureParser(
"hiatus" -> MangaState.PAUSED
else -> null
},
chapters = chapters?.optJSONArray("results")?.mapJSON {
val number = it.getFloat("number")
chapters = chapters?.optJSONArray("results")?.toJSONList()?.mapChapters { _, it ->
MangaChapter(
id = it.getLong("id"),
id = generateUid(it.getLong("id")),
name = it.getString("full_title"),
number = number.toInt(),
number = it.getFloatOrDefault("number", 0f),
volume = it.getIntOrDefault("volume", 0),
url = it.getString("url"),
scanlator = it.getJSONArray("groups").joinToString(),
uploadDate = it.getString("published").toLong(),
branch = null,
source = source
source = source,
)
} ?: emptyList()
}.orEmpty(),
)
}
@ -144,7 +145,12 @@ internal abstract class MangAdventureParser(
.addEncodedPathSegment("pages")
.addEncodedQueryParameter("track", "true")
return url.get()?.optJSONArray("results")?.mapJSON {
MangaPage(it.getLong("id"), it.getString("image"), null, source)
MangaPage(
id = generateUid(it.getLong("id")),
url = it.getString("image"),
preview = null,
source = source,
)
} ?: emptyList()
}
@ -182,7 +188,7 @@ internal abstract class MangAdventureParser(
tags = emptySet(),
state = null,
author = null,
source = source
source = source,
)
} ?: emptyList()
}
@ -191,10 +197,10 @@ internal abstract class MangAdventureParser(
get() = urlBuilder().addEncodedPathSegments("api/v2")
// /reader/{slug}/
private inline val Manga.slug: String
private val Manga.slug: String
get() = url.substring(8, url.length - 1)
protected suspend inline fun HttpUrl.Builder.get() =
protected suspend fun HttpUrl.Builder.get() =
webClient.httpGet(build()).body?.string()?.let(::JSONObject)
private companion object {

@ -1,5 +1,6 @@
package org.koitharu.kotatsu.parsers.site.mangadventure.en
import androidx.collection.ArraySet
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource
@ -12,9 +13,11 @@ internal class AssortedScans(context: MangaLoaderContext) :
// tags that don't have any series and make the tests fail
private val emptyTags = setOf(
"Doujinshi", "Harem", "Hentai", "Mecha",
"Shoujo Ai", "Shounen Ai", "Smut", "Yaoi"
"Shoujo Ai", "Shounen Ai", "Smut", "Yaoi",
)
override suspend fun getAvailableTags(): Set<MangaTag> =
super.getAvailableTags().filterTo(HashSet()) { it.key !in emptyTags }
override suspend fun getAvailableTags(): Set<MangaTag> {
val tags = super.getAvailableTags()
return tags.filterNotTo(ArraySet(tags.size)) { it.key in emptyTags }
}
}

@ -132,7 +132,7 @@ internal open class MangaLibParser(
id = generateUid(chapterId),
url = url,
source = source,
number = number.toIntOrNull() ?: 0,
number = number.toFloatOrNull() ?: 0f,
volume = volume,
uploadDate = dateFormat.tryParse(
item.getString("chapter_created_at").substringBefore(" "),

@ -11,6 +11,7 @@ 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.getFloatOrDefault
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault
import org.koitharu.kotatsu.parsers.util.json.getStringOrNull
import org.koitharu.kotatsu.parsers.util.json.mapJSON
@ -52,7 +53,7 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context,
val chapterRequest = webClient.httpPost(chapterApi, body).parseJson()
return manga.copy(
chapters = chapterRequest.getJSONArray("data").mapJSON { jo ->
val number = jo.getIntOrDefault("chapterNum", 0)
val number = jo.getFloatOrDefault("chapterNum", 0f)
val volume = jo.getIntOrDefault("volume", 0)
MangaChapter(
id = generateUid(jo.getString("id")),

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

Loading…
Cancel
Save