From d481ff416fcff3d9dbec56f10249d7de874f88bb Mon Sep 17 00:00:00 2001 From: Naga <94557604+NagaYZ@users.noreply.github.com> Date: Mon, 7 Jul 2025 21:22:16 +0200 Subject: [PATCH] [Flamecomics] Fix search and genre fitlering (#1923) --- .../kotatsu/parsers/site/en/FlameComics.kt | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt index ce370722..3d46ba1f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/FlameComics.kt @@ -20,6 +20,7 @@ internal class FlameComics(context: MangaLoaderContext) : LegacySinglePageMangaParser(context, MangaParserSource.FLAMECOMICS) { private val commonPrefix = suspendLazy(initializer = ::fetchCommonPrefix) + private val removeSpecialCharsRegex = Regex("[^A-Za-z0-9 ]") override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, @@ -41,13 +42,36 @@ internal class FlameComics(context: MangaLoaderContext) : .addPathSegment("data") .addPathSegment(commonPrefix.get()) .addPathSegment("browse.json") - if (!filter.query.isNullOrEmpty()) { - url.addQueryParameter("search", filter.query) - } - val json = webClient.httpGet(url.build()).parseJson().getJSONObject("pageProps").getJSONArray("series") - return json.mapJSONNotNull { jo -> + .build() + + val json = webClient.httpGet(url).parseJson().getJSONObject("pageProps").getJSONArray("series") + + val allManga = json.mapJSONNotNull { jo -> parseManga(jo).takeIf { it.tags.matches(filter) } } + + // Filter by search if provided + val filteredManga = if (!filter.query.isNullOrEmpty()) { + val normalizedQuery = removeSpecialCharsRegex.replace(filter.query.lowercase(), "") + allManga.filter { manga -> + val titles = mutableListOf(manga.title) + titles.addAll(manga.altTitles) + + titles.any { title -> + normalizedQuery in removeSpecialCharsRegex.replace(title.lowercase(), "") + } + } + } else { + allManga + } + + return filteredManga + .let { list -> + when (order) { + SortOrder.ALPHABETICAL -> list.sortedBy { it.title } + else -> list + } + } } override suspend fun getDetails(manga: Manga): Manga = getDetailsImpl(manga.url.toLong()) @@ -208,5 +232,9 @@ internal class FlameComics(context: MangaLoaderContext) : return true } - private fun String.toMangaTag() = MangaTag(this.toTitleCase(sourceLocale), this, source) + private fun String.toMangaTag() = MangaTag( + title = this.toTitleCase(sourceLocale), + key = this.lowercase().trim(), + source = source + ) }