Add query filter on MangaListFilter.Advanced

Add query.filer Advanced on MangaDexParser
master
devi 2 years ago committed by Koitharu
parent 0540da57e6
commit 62b4a21cef

@ -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,
),
)
}

@ -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<MangaState>,
@JvmField val contentRating: Set<ContentRating>,
@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<MangaState>? = null
private var _contentRating: Set<ContentRating>? = 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,
)
}
}

@ -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)

@ -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())

Loading…
Cancel
Save