From 62b4a21cef094629e2ecc1ee4f5b29429ed47c45 Mon Sep 17 00:00:00 2001 From: devi Date: Tue, 10 Sep 2024 12:25:29 +0200 Subject: [PATCH] Add query filter on MangaListFilter.Advanced Add query.filer Advanced on MangaDexParser --- .../org/koitharu/kotatsu/parsers/MangaParser.kt | 6 ++++++ .../kotatsu/parsers/model/MangaListFilter.kt | 13 +++++++++++-- .../kotatsu/parsers/site/all/MangaDexParser.kt | 6 ++++++ .../org/koitharu/kotatsu/parsers/MangaParserTest.kt | 2 ++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt index 7de7f70e..8b96b420 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt @@ -52,6 +52,11 @@ abstract class MangaParser @InternalParsersApi constructor( */ open val isSearchSupported: Boolean = true + /** + * Whether parser supports searching by string query using [MangaListFilter.Advanced] + */ + open val searchSupportedWithMultipleFilters: Boolean = false + @Deprecated( message = "Use availableSortOrders instead", replaceWith = ReplaceWith("availableSortOrders"), @@ -163,6 +168,7 @@ abstract class MangaParser @InternalParsersApi constructor( locale = null, states = emptySet(), contentRating = emptySet(), + query = null, ), ) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt index 2abe61f6..adebe650 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt @@ -14,7 +14,8 @@ sealed interface MangaListFilter { (tags.size <= 1 || parser.isMultipleTagsSupported) && (tagsExclude.isEmpty() || parser.isTagsExclusionSupported) && (contentRating.isEmpty() || parser.availableContentRating.containsAll(contentRating)) && - (states.isEmpty() || parser.availableStates.containsAll(states)) + (states.isEmpty() || parser.availableStates.containsAll(states) && + (query.isNullOrEmpty() || parser.searchSupportedWithMultipleFilters)) is Search -> parser.isSearchSupported } @@ -35,10 +36,11 @@ sealed interface MangaListFilter { @JvmField val locale: Locale?, @JvmField val states: Set, @JvmField val contentRating: Set, + @JvmField val query: String?, ) : MangaListFilter { override fun isEmpty(): Boolean = - tags.isEmpty() && tagsExclude.isEmpty() && locale == null && states.isEmpty() && contentRating.isEmpty() + tags.isEmpty() && tagsExclude.isEmpty() && locale == null && states.isEmpty() && contentRating.isEmpty() && query == null fun newBuilder() = Builder(sortOrder) .tags(tags) @@ -46,6 +48,7 @@ sealed interface MangaListFilter { .locale(locale) .states(states) .contentRatings(contentRating) + .query(query) class Builder(sortOrder: SortOrder) { @@ -55,6 +58,7 @@ sealed interface MangaListFilter { private var _locale: Locale? = null private var _states: Set? = null private var _contentRating: Set? = null + private var _query: String? = null fun sortOrder(order: SortOrder) = apply { _sortOrder = order @@ -80,6 +84,10 @@ sealed interface MangaListFilter { _contentRating = rating } + fun query(query: String?) { + _query = query + } + fun build() = Advanced( sortOrder = _sortOrder, tags = _tags.orEmpty(), @@ -87,6 +95,7 @@ sealed interface MangaListFilter { locale = _locale, states = _states.orEmpty(), contentRating = _contentRating.orEmpty(), + query = _query, ) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt index 3f7980f2..217f92e7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/MangaDexParser.kt @@ -61,6 +61,12 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context } is MangaListFilter.Advanced -> { + + filter.query.let { + append("&title=") + append(filter.query) + } + filter.tags.forEach { append("&includedTags[]=") append(it.key) diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index bdb66622..f3bb8401 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -59,6 +59,7 @@ internal class MangaParserTest { states = emptySet(), tagsExclude = emptySet(), contentRating = emptySet(), + query = null, ), ).minByOrNull { it.title.length @@ -133,6 +134,7 @@ internal class MangaParserTest { locale = locales.random(), states = setOf(), contentRating = setOf(), + query = null, ) val list = parser.getList(offset = 0, filter) checkMangaList(list, filter.locale.toString())