From 46e863ef792469143f7455cd4f52a36ce9f99762 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 25 Nov 2023 17:11:54 +0200 Subject: [PATCH] [ComicK] Fix manga state --- .../parsers/site/all/ComickFunParser.kt | 18 +++++++++--------- .../kotatsu/parsers/util/MangaParserEnv.kt | 14 ++++++++++---- .../kotatsu/parsers/MangaParserTest.kt | 15 +++++++++++---- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt index 26dcbf3e..9e579518 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt @@ -15,7 +15,7 @@ import java.text.SimpleDateFormat import java.util.* /** - * https://api.comick.fun/docs/static/index.html + * cc */ private const val CHAPTERS_LIMIT = 99999 @@ -67,7 +67,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c else -> "uploaded" }, ) - filter.states.forEach { + filter.states.oneOrThrowIfMany()?.let { url.addQueryParameter( "status", when (it) { @@ -96,13 +96,13 @@ internal class ComickFunParser(context: MangaLoaderContext) : PagedMangaParser(c largeCoverUrl = null, description = jo.getStringOrNull("desc"), tags = jo.selectGenres(tagsMap), - state = runCatching { - if (jo.getBoolean("translation_completed")) { - MangaState.FINISHED - } else { - MangaState.ONGOING - } - }.getOrNull(), + state = when (jo.getIntOrDefault("status", 0)) { + 1 -> MangaState.ONGOING + 2 -> MangaState.FINISHED + 3 -> MangaState.ABANDONED + 4 -> MangaState.PAUSED + else -> null + }, author = null, source = source, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/MangaParserEnv.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/MangaParserEnv.kt index 181745d3..95dc2954 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/MangaParserEnv.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/MangaParserEnv.kt @@ -5,10 +5,7 @@ import org.jsoup.nodes.Element import org.koitharu.kotatsu.parsers.InternalParsersApi import org.koitharu.kotatsu.parsers.MangaParser import org.koitharu.kotatsu.parsers.exception.ParseException -import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.parsers.model.MangaPage -import org.koitharu.kotatsu.parsers.model.MangaTag +import org.koitharu.kotatsu.parsers.model.* /** @@ -61,6 +58,15 @@ fun Set?.oneOrThrowIfMany(): MangaTag? { } } +@InternalParsersApi +fun Set?.oneOrThrowIfMany(): MangaState? { + return when { + isNullOrEmpty() -> null + size == 1 -> first() + else -> throw IllegalArgumentException("Multiple states are not supported by this source") + } +} + val MangaParser.domain: String get() { return config[configKeyDomain] diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index 124b6850..9cf30e86 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -6,6 +6,7 @@ import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.extension.ExtendWith import org.junit.jupiter.params.ParameterizedTest import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.parsers.model.MangaListFilter import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.parsers.util.domain @@ -35,8 +36,8 @@ internal class MangaParserTest { @MangaSources fun pagination(source: MangaSource) = runTest { val parser = context.newParserInstance(source) - val page1 = parser.getList(0, sortOrder = null, tags = null) - val page2 = parser.getList(page1.size, sortOrder = null, tags = null) + val page1 = parser.getList(0, filter = null) + val page2 = parser.getList(page1.size, filter = null) if (parser is PagedMangaParser) { assert(parser.pageSize == page1.size) { "Page size is ${page1.size} but ${parser.pageSize} expected" @@ -55,12 +56,18 @@ internal class MangaParserTest { @MangaSources fun search(source: MangaSource) = runTest { val parser = context.newParserInstance(source) - val subject = parser.getList(0, sortOrder = SortOrder.POPULARITY, tags = null).minByOrNull { + val subject = parser.getList( + offset = 0, + filter = MangaListFilter.Advanced( + sortOrder = SortOrder.POPULARITY, + tags = emptySet(), locale = null, states = emptySet(), + ), + ).minByOrNull { it.title.length } ?: error("No manga found") val query = subject.title check(query.isNotBlank()) { "Manga title '$query' is blank" } - val list = parser.getList(0, query) + val list = parser.getList(0, MangaListFilter.Search(query)) assert(list.isNotEmpty()) { "Empty search results by \"$query\"" } assert(list.singleOrNull { it.url == subject.url && it.id == subject.id } != null) { "Single subject '${subject.title} (${subject.publicUrl})' not found in search results"