Add year, localeMangas filter on MangaListFilter.Advanced
Add year, localeMangas and localeMangas on MangaDexParser
This commit is contained in:
@@ -57,6 +57,18 @@ abstract class MangaParser @InternalParsersApi constructor(
|
|||||||
*/
|
*/
|
||||||
open val searchSupportedWithMultipleFilters: Boolean = false
|
open val searchSupportedWithMultipleFilters: Boolean = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether parser supports searching by year
|
||||||
|
*/
|
||||||
|
|
||||||
|
open val isSearchYearSupported: Boolean = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether parser supports searching Original Languages
|
||||||
|
*/
|
||||||
|
open val isSearchOriginalLanguages: Boolean = false
|
||||||
|
|
||||||
|
|
||||||
@Deprecated(
|
@Deprecated(
|
||||||
message = "Use availableSortOrders instead",
|
message = "Use availableSortOrders instead",
|
||||||
replaceWith = ReplaceWith("availableSortOrders"),
|
replaceWith = ReplaceWith("availableSortOrders"),
|
||||||
@@ -166,9 +178,11 @@ abstract class MangaParser @InternalParsersApi constructor(
|
|||||||
tags = tags.orEmpty(),
|
tags = tags.orEmpty(),
|
||||||
tagsExclude = tagsExclude.orEmpty(),
|
tagsExclude = tagsExclude.orEmpty(),
|
||||||
locale = null,
|
locale = null,
|
||||||
|
localeMangas = null,
|
||||||
states = emptySet(),
|
states = emptySet(),
|
||||||
contentRating = emptySet(),
|
contentRating = emptySet(),
|
||||||
query = null,
|
query = null,
|
||||||
|
year = null,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ sealed interface MangaListFilter {
|
|||||||
(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))
|
(parser.searchSupportedWithMultipleFilters) &&
|
||||||
|
(parser.isSearchYearSupported) && (parser.isSearchOriginalLanguages))
|
||||||
|
|
||||||
is Search -> parser.isSearchSupported
|
is Search -> parser.isSearchSupported
|
||||||
}
|
}
|
||||||
@@ -34,21 +35,25 @@ sealed interface MangaListFilter {
|
|||||||
@JvmField val tags: Set<MangaTag>,
|
@JvmField val tags: Set<MangaTag>,
|
||||||
@JvmField val tagsExclude: Set<MangaTag>,
|
@JvmField val tagsExclude: Set<MangaTag>,
|
||||||
@JvmField val locale: Locale?,
|
@JvmField val locale: Locale?,
|
||||||
|
@JvmField val localeMangas: 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?,
|
@JvmField val query: String?,
|
||||||
|
@JvmField val year: Int?,
|
||||||
) : MangaListFilter {
|
) : MangaListFilter {
|
||||||
|
|
||||||
override fun isEmpty(): Boolean =
|
override fun isEmpty(): Boolean =
|
||||||
tags.isEmpty() && tagsExclude.isEmpty() && locale == null && states.isEmpty() && contentRating.isEmpty() && query == null
|
tags.isEmpty() && tagsExclude.isEmpty() && locale == null && localeMangas == null && states.isEmpty() && contentRating.isEmpty() && query == null && year == null
|
||||||
|
|
||||||
fun newBuilder() = Builder(sortOrder)
|
fun newBuilder() = Builder(sortOrder)
|
||||||
.tags(tags)
|
.tags(tags)
|
||||||
.tagsExclude(tagsExclude)
|
.tagsExclude(tagsExclude)
|
||||||
.locale(locale)
|
.locale(locale)
|
||||||
|
.localeMangas(localeMangas)
|
||||||
.states(states)
|
.states(states)
|
||||||
.contentRatings(contentRating)
|
.contentRatings(contentRating)
|
||||||
.query(query)
|
.query(query)
|
||||||
|
.year(year)
|
||||||
|
|
||||||
class Builder(sortOrder: SortOrder) {
|
class Builder(sortOrder: SortOrder) {
|
||||||
|
|
||||||
@@ -56,9 +61,11 @@ sealed interface MangaListFilter {
|
|||||||
private var _tags: Set<MangaTag>? = null
|
private var _tags: Set<MangaTag>? = null
|
||||||
private var _tagsExclude: Set<MangaTag>? = null
|
private var _tagsExclude: Set<MangaTag>? = null
|
||||||
private var _locale: Locale? = null
|
private var _locale: Locale? = null
|
||||||
|
private var _localeMangas: 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
|
private var _query: String? = null
|
||||||
|
private var _year: Int? = null
|
||||||
|
|
||||||
fun sortOrder(order: SortOrder) = apply {
|
fun sortOrder(order: SortOrder) = apply {
|
||||||
_sortOrder = order
|
_sortOrder = order
|
||||||
@@ -76,6 +83,10 @@ sealed interface MangaListFilter {
|
|||||||
_locale = locale
|
_locale = locale
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun localeMangas(localeMangas: Locale?) = apply {
|
||||||
|
_localeMangas = localeMangas
|
||||||
|
}
|
||||||
|
|
||||||
fun states(states: Set<MangaState>?) = apply {
|
fun states(states: Set<MangaState>?) = apply {
|
||||||
_states = states
|
_states = states
|
||||||
}
|
}
|
||||||
@@ -84,18 +95,26 @@ sealed interface MangaListFilter {
|
|||||||
_contentRating = rating
|
_contentRating = rating
|
||||||
}
|
}
|
||||||
|
|
||||||
fun query(query: String?) {
|
fun query(query: String?) = apply {
|
||||||
_query = query
|
_query = query
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun year(year: Int?) = apply {
|
||||||
|
_year = year
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fun build() = Advanced(
|
fun build() = Advanced(
|
||||||
sortOrder = _sortOrder,
|
sortOrder = _sortOrder,
|
||||||
tags = _tags.orEmpty(),
|
tags = _tags.orEmpty(),
|
||||||
tagsExclude = _tagsExclude.orEmpty(),
|
tagsExclude = _tagsExclude.orEmpty(),
|
||||||
locale = _locale,
|
locale = _locale,
|
||||||
|
localeMangas = _localeMangas,
|
||||||
states = _states.orEmpty(),
|
states = _states.orEmpty(),
|
||||||
contentRating = _contentRating.orEmpty(),
|
contentRating = _contentRating.orEmpty(),
|
||||||
query = _query,
|
query = _query,
|
||||||
|
year = _year,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,9 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
|
|||||||
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
|
EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED)
|
||||||
|
|
||||||
override val isTagsExclusionSupported: Boolean = true
|
override val isTagsExclusionSupported: Boolean = true
|
||||||
|
override val searchSupportedWithMultipleFilters: Boolean = true
|
||||||
|
override val isSearchYearSupported: Boolean = true
|
||||||
|
override val isSearchOriginalLanguages: Boolean = true
|
||||||
|
|
||||||
override suspend fun getList(offset: Int, filter: MangaListFilter?): List<Manga> {
|
override suspend fun getList(offset: Int, filter: MangaListFilter?): List<Manga> {
|
||||||
val domain = domain
|
val domain = domain
|
||||||
@@ -83,9 +85,10 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
|
|||||||
ContentRating.SAFE -> append("&contentRating[]=safe")
|
ContentRating.SAFE -> append("&contentRating[]=safe")
|
||||||
ContentRating.SUGGESTIVE -> append("&contentRating[]=suggestive&contentRating[]=erotica")
|
ContentRating.SUGGESTIVE -> append("&contentRating[]=suggestive&contentRating[]=erotica")
|
||||||
ContentRating.ADULT -> append("&contentRating[]=pornographic")
|
ContentRating.ADULT -> append("&contentRating[]=pornographic")
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else append("&contentRating[]=safe&contentRating[]=suggestive&contentRating[]=erotica&contentRating[]=pornographic")
|
||||||
|
|
||||||
append("&order")
|
append("&order")
|
||||||
append(
|
append(
|
||||||
@@ -116,6 +119,16 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context
|
|||||||
append("&availableTranslatedLanguage[]=")
|
append("&availableTranslatedLanguage[]=")
|
||||||
append(it.language)
|
append(it.language)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filter.localeMangas?.let {
|
||||||
|
append("&originalLanguage[]=")
|
||||||
|
append(it.language)
|
||||||
|
}
|
||||||
|
|
||||||
|
filter.year?.let {
|
||||||
|
append("&year=")
|
||||||
|
append(filter.year)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
null -> {
|
null -> {
|
||||||
|
|||||||
@@ -56,10 +56,12 @@ internal class MangaParserTest {
|
|||||||
sortOrder = SortOrder.POPULARITY,
|
sortOrder = SortOrder.POPULARITY,
|
||||||
tags = emptySet(),
|
tags = emptySet(),
|
||||||
locale = null,
|
locale = null,
|
||||||
|
localeMangas = null,
|
||||||
states = emptySet(),
|
states = emptySet(),
|
||||||
tagsExclude = emptySet(),
|
tagsExclude = emptySet(),
|
||||||
contentRating = emptySet(),
|
contentRating = emptySet(),
|
||||||
query = null,
|
query = null,
|
||||||
|
year = null,
|
||||||
),
|
),
|
||||||
).minByOrNull {
|
).minByOrNull {
|
||||||
it.title.length
|
it.title.length
|
||||||
@@ -132,9 +134,11 @@ internal class MangaParserTest {
|
|||||||
tags = setOf(),
|
tags = setOf(),
|
||||||
tagsExclude = setOf(),
|
tagsExclude = setOf(),
|
||||||
locale = locales.random(),
|
locale = locales.random(),
|
||||||
|
localeMangas = locales.random(),
|
||||||
states = setOf(),
|
states = setOf(),
|
||||||
contentRating = setOf(),
|
contentRating = setOf(),
|
||||||
query = null,
|
query = null,
|
||||||
|
year = 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())
|
||||||
|
|||||||
Reference in New Issue
Block a user