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 2e0d70e1..2493a25d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaChapter.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaChapter.kt @@ -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, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt index 13f0b0ed..d41ddcc0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/MangAdventureParser.kt @@ -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 = @@ -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 { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/en/AssortedScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/en/AssortedScans.kt index df93bb83..2f601428 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/en/AssortedScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangadventure/en/AssortedScans.kt @@ -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 = - super.getAvailableTags().filterTo(HashSet()) { it.key !in emptyTags } + override suspend fun getAvailableTags(): Set { + val tags = super.getAvailableTags() + return tags.filterNotTo(ArraySet(tags.size)) { it.key in emptyTags } + } } 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 126149c4..e8a343eb 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 @@ -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(" "), 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 26014f9c..38f2bb55 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,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")), 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 2393f02c..d1f0f52f 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(volume = x.volume, number = i + 1) } + list.mapIndexed { i, x -> x.copy(volume = x.volume, number = (i + 1).toFloat()) } } }