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

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

@ -1,5 +1,6 @@
package org.koitharu.kotatsu.parsers.site.mangadventure.en package org.koitharu.kotatsu.parsers.site.mangadventure.en
import androidx.collection.ArraySet
import org.koitharu.kotatsu.parsers.MangaLoaderContext import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.MangaSourceParser
import org.koitharu.kotatsu.parsers.model.MangaSource 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 // tags that don't have any series and make the tests fail
private val emptyTags = setOf( private val emptyTags = setOf(
"Doujinshi", "Harem", "Hentai", "Mecha", "Doujinshi", "Harem", "Hentai", "Mecha",
"Shoujo Ai", "Shounen Ai", "Smut", "Yaoi" "Shoujo Ai", "Shounen Ai", "Smut", "Yaoi",
) )
override suspend fun getAvailableTags(): Set<MangaTag> = override suspend fun getAvailableTags(): Set<MangaTag> {
super.getAvailableTags().filterTo(HashSet()) { it.key !in emptyTags } 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), id = generateUid(chapterId),
url = url, url = url,
source = source, source = source,
number = number.toIntOrNull() ?: 0, number = number.toFloatOrNull() ?: 0f,
volume = volume, volume = volume,
uploadDate = dateFormat.tryParse( uploadDate = dateFormat.tryParse(
item.getString("chapter_created_at").substringBefore(" "), 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.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.getFloatOrDefault
import org.koitharu.kotatsu.parsers.util.json.getIntOrDefault 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
@ -52,7 +53,7 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context,
val chapterRequest = webClient.httpPost(chapterApi, body).parseJson() val chapterRequest = webClient.httpPost(chapterApi, body).parseJson()
return manga.copy( return manga.copy(
chapters = chapterRequest.getJSONArray("data").mapJSON { jo -> chapters = chapterRequest.getJSONArray("data").mapJSON { jo ->
val number = jo.getIntOrDefault("chapterNum", 0) val number = jo.getFloatOrDefault("chapterNum", 0f)
val volume = jo.getIntOrDefault("volume", 0) val volume = jo.getIntOrDefault("volume", 0)
MangaChapter( MangaChapter(
id = generateUid(jo.getString("id")), id = generateUid(jo.getString("id")),

@ -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(volume = x.volume, number = i + 1) } list.mapIndexed { i, x -> x.copy(volume = x.volume, number = (i + 1).toFloat()) }
} }
} }

Loading…
Cancel
Save