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 open val isSearchSupported: Boolean = true
/**
* Whether parser supports searching by string query using [MangaListFilter.Advanced]
*/
open val searchSupportedWithMultipleFilters: Boolean = false
@Deprecated( @Deprecated(
message = "Use availableSortOrders instead", message = "Use availableSortOrders instead",
replaceWith = ReplaceWith("availableSortOrders"), replaceWith = ReplaceWith("availableSortOrders"),
@ -163,6 +168,7 @@ abstract class MangaParser @InternalParsersApi constructor(
locale = null, locale = null,
states = emptySet(), states = emptySet(),
contentRating = emptySet(), contentRating = emptySet(),
query = null,
), ),
) )
} }

@ -14,7 +14,8 @@ sealed interface MangaListFilter {
(tags.size <= 1 || parser.isMultipleTagsSupported) && (tags.size <= 1 || parser.isMultipleTagsSupported) &&
(tagsExclude.isEmpty() || parser.isTagsExclusionSupported) && (tagsExclude.isEmpty() || parser.isTagsExclusionSupported) &&
(contentRating.isEmpty() || parser.availableContentRating.containsAll(contentRating)) && (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 is Search -> parser.isSearchSupported
} }
@ -35,10 +36,11 @@ sealed interface MangaListFilter {
@JvmField val locale: Locale?, @JvmField val locale: Locale?,
@JvmField val states: Set<MangaState>, @JvmField val states: Set<MangaState>,
@JvmField val contentRating: Set<ContentRating>, @JvmField val contentRating: Set<ContentRating>,
@JvmField val query: String?,
) : MangaListFilter { ) : MangaListFilter {
override fun isEmpty(): Boolean = 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) fun newBuilder() = Builder(sortOrder)
.tags(tags) .tags(tags)
@ -46,6 +48,7 @@ sealed interface MangaListFilter {
.locale(locale) .locale(locale)
.states(states) .states(states)
.contentRatings(contentRating) .contentRatings(contentRating)
.query(query)
class Builder(sortOrder: SortOrder) { class Builder(sortOrder: SortOrder) {
@ -55,6 +58,7 @@ sealed interface MangaListFilter {
private var _locale: Locale? = null private var _locale: Locale? = null
private var _states: Set<MangaState>? = null private var _states: Set<MangaState>? = null
private var _contentRating: Set<ContentRating>? = null private var _contentRating: Set<ContentRating>? = null
private var _query: String? = null
fun sortOrder(order: SortOrder) = apply { fun sortOrder(order: SortOrder) = apply {
_sortOrder = order _sortOrder = order
@ -80,6 +84,10 @@ sealed interface MangaListFilter {
_contentRating = rating _contentRating = rating
} }
fun query(query: String?) {
_query = query
}
fun build() = Advanced( fun build() = Advanced(
sortOrder = _sortOrder, sortOrder = _sortOrder,
tags = _tags.orEmpty(), tags = _tags.orEmpty(),
@ -87,6 +95,7 @@ sealed interface MangaListFilter {
locale = _locale, locale = _locale,
states = _states.orEmpty(), states = _states.orEmpty(),
contentRating = _contentRating.orEmpty(), contentRating = _contentRating.orEmpty(),
query = _query,
) )
} }
} }

@ -61,6 +61,12 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
} }
is MangaListFilter.Advanced -> { is MangaListFilter.Advanced -> {
filter.query.let {
append("&title=")
append(filter.query)
}
filter.tags.forEach { filter.tags.forEach {
append("&includedTags[]=") append("&includedTags[]=")
append(it.key) append(it.key)

@ -59,6 +59,7 @@ internal class MangaParserTest {
states = emptySet(), states = emptySet(),
tagsExclude = emptySet(), tagsExclude = emptySet(),
contentRating = emptySet(), contentRating = emptySet(),
query = null,
), ),
).minByOrNull { ).minByOrNull {
it.title.length it.title.length
@ -133,6 +134,7 @@ internal class MangaParserTest {
locale = locales.random(), locale = locales.random(),
states = setOf(), states = setOf(),
contentRating = setOf(), contentRating = setOf(),
query = null,
) )
val list = parser.getList(offset = 0, filter) val list = parser.getList(offset = 0, filter)
checkMangaList(list, filter.locale.toString()) checkMangaList(list, filter.locale.toString())

Loading…
Cancel
Save