Migrate chapter number to float
This commit is contained in:
@@ -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()) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user