From 37428bf9c09a9f584bf983de19b7c7eda11250dd Mon Sep 17 00:00:00 2001 From: devi Date: Tue, 10 Sep 2024 13:38:43 +0200 Subject: [PATCH] Add year, localeMangas filter on MangaListFilter.Advanced Add year, localeMangas and localeMangas on MangaDexParser --- .../koitharu/kotatsu/parsers/MangaParser.kt | 14 +++++++++++ .../kotatsu/parsers/model/MangaListFilter.kt | 25 ++++++++++++++++--- .../parsers/site/all/MangaDexParser.kt | 17 +++++++++++-- .../kotatsu/parsers/MangaParserTest.kt | 4 +++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt index 8b96b4205..08aab2b9f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt @@ -57,6 +57,18 @@ abstract class MangaParser @InternalParsersApi constructor( */ 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( message = "Use availableSortOrders instead", replaceWith = ReplaceWith("availableSortOrders"), @@ -166,9 +178,11 @@ abstract class MangaParser @InternalParsersApi constructor( tags = tags.orEmpty(), tagsExclude = tagsExclude.orEmpty(), locale = null, + localeMangas = null, states = emptySet(), contentRating = emptySet(), query = null, + year = 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 adebe650d..c85fbb15a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt @@ -15,7 +15,8 @@ sealed interface MangaListFilter { (tagsExclude.isEmpty() || parser.isTagsExclusionSupported) && (contentRating.isEmpty() || parser.availableContentRating.containsAll(contentRating)) && (states.isEmpty() || parser.availableStates.containsAll(states) && - (query.isNullOrEmpty() || parser.searchSupportedWithMultipleFilters)) + (parser.searchSupportedWithMultipleFilters) && + (parser.isSearchYearSupported) && (parser.isSearchOriginalLanguages)) is Search -> parser.isSearchSupported } @@ -34,21 +35,25 @@ sealed interface MangaListFilter { @JvmField val tags: Set, @JvmField val tagsExclude: Set, @JvmField val locale: Locale?, + @JvmField val localeMangas: Locale?, @JvmField val states: Set, @JvmField val contentRating: Set, @JvmField val query: String?, + @JvmField val year: Int?, ) : MangaListFilter { 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) .tags(tags) .tagsExclude(tagsExclude) .locale(locale) + .localeMangas(localeMangas) .states(states) .contentRatings(contentRating) .query(query) + .year(year) class Builder(sortOrder: SortOrder) { @@ -56,9 +61,11 @@ sealed interface MangaListFilter { private var _tags: Set? = null private var _tagsExclude: Set? = null private var _locale: Locale? = null + private var _localeMangas: Locale? = null private var _states: Set? = null private var _contentRating: Set? = null private var _query: String? = null + private var _year: Int? = null fun sortOrder(order: SortOrder) = apply { _sortOrder = order @@ -76,6 +83,10 @@ sealed interface MangaListFilter { _locale = locale } + fun localeMangas(localeMangas: Locale?) = apply { + _localeMangas = localeMangas + } + fun states(states: Set?) = apply { _states = states } @@ -84,18 +95,26 @@ sealed interface MangaListFilter { _contentRating = rating } - fun query(query: String?) { + fun query(query: String?) = apply { _query = query } + fun year(year: Int?) = apply { + _year = year + } + + + fun build() = Advanced( sortOrder = _sortOrder, tags = _tags.orEmpty(), tagsExclude = _tagsExclude.orEmpty(), locale = _locale, + localeMangas = _localeMangas, states = _states.orEmpty(), contentRating = _contentRating.orEmpty(), query = _query, + year = _year, ) } } 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 217f92e7d..09cf02117 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 @@ -41,7 +41,9 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context EnumSet.of(MangaState.ONGOING, MangaState.FINISHED, MangaState.PAUSED, MangaState.ABANDONED) 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 { val domain = domain @@ -83,9 +85,10 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context ContentRating.SAFE -> append("&contentRating[]=safe") ContentRating.SUGGESTIVE -> append("&contentRating[]=suggestive&contentRating[]=erotica") ContentRating.ADULT -> append("&contentRating[]=pornographic") + } } - } + } else append("&contentRating[]=safe&contentRating[]=suggestive&contentRating[]=erotica&contentRating[]=pornographic") append("&order") append( @@ -116,6 +119,16 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context append("&availableTranslatedLanguage[]=") append(it.language) } + + filter.localeMangas?.let { + append("&originalLanguage[]=") + append(it.language) + } + + filter.year?.let { + append("&year=") + append(filter.year) + } } null -> { diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index f3bb8401e..ccafc1491 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -56,10 +56,12 @@ internal class MangaParserTest { sortOrder = SortOrder.POPULARITY, tags = emptySet(), locale = null, + localeMangas = null, states = emptySet(), tagsExclude = emptySet(), contentRating = emptySet(), query = null, + year = null, ), ).minByOrNull { it.title.length @@ -132,9 +134,11 @@ internal class MangaParserTest { tags = setOf(), tagsExclude = setOf(), locale = locales.random(), + localeMangas = locales.random(), states = setOf(), contentRating = setOf(), query = null, + year = null, ) val list = parser.getList(offset = 0, filter) checkMangaList(list, filter.locale.toString())