diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt index 5ee0df95..d3351235 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt @@ -95,6 +95,7 @@ abstract class MangaParser @InternalParsersApi constructor( offset: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List = throw NotImplementedError("Please implement getList(offset, filter) instead") @@ -130,18 +131,29 @@ abstract class MangaParser @InternalParsersApi constructor( "org.koitharu.kotatsu.parsers.model.MangaListFilter", ), ) - open suspend fun getList(offset: Int, tags: Set?, sortOrder: SortOrder?): List { + open suspend fun getList( + offset: Int, + tags: Set?, + tagsExclude: Set?, + sortOrder: SortOrder?, + ): List { return getList( offset, - MangaListFilter.Advanced(sortOrder ?: defaultSortOrder, tags.orEmpty(), null, emptySet()), + MangaListFilter.Advanced( + sortOrder ?: defaultSortOrder, + tags.orEmpty(), + tagsExclude.orEmpty(), + null, + emptySet(), + ), ) } open suspend fun getList(offset: Int, filter: MangaListFilter?): List { return when (filter) { - is MangaListFilter.Advanced -> getList(offset, null, filter.tags, filter.sortOrder) - is MangaListFilter.Search -> getList(offset, filter.query, null, defaultSortOrder) - null -> getList(offset, null, null, defaultSortOrder) + is MangaListFilter.Advanced -> getList(offset, null, filter.tags, filter.tagsExclude, filter.sortOrder) + is MangaListFilter.Search -> getList(offset, filter.query, null, null, defaultSortOrder) + null -> getList(offset, null, null, null, defaultSortOrder) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/PagedMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/PagedMangaParser.kt index fffb1d01..1017b88e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/PagedMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/PagedMangaParser.kt @@ -36,6 +36,7 @@ abstract class PagedMangaParser( offset: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List = throw UnsupportedOperationException("You should use getListPage for PagedMangaParser") @@ -43,14 +44,15 @@ abstract class PagedMangaParser( page: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List = throw NotImplementedError("Please implement getListPage(page, filter) instead") open suspend fun getListPage(page: Int, filter: MangaListFilter?): List { return when (filter) { - is MangaListFilter.Advanced -> getListPage(page, null, filter.tags, filter.sortOrder) - is MangaListFilter.Search -> getListPage(page, filter.query, null, defaultSortOrder) - null -> getListPage(page, null, null, defaultSortOrder) + is MangaListFilter.Advanced -> getListPage(page, null, filter.tags, filter.tagsExclude, filter.sortOrder) + is MangaListFilter.Search -> getListPage(page, filter.query, null, null, defaultSortOrder) + null -> getListPage(page, null, null, null, defaultSortOrder) } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt index f7e07905..bf5b76f7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/be/AnibelParser.kt @@ -31,6 +31,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context, offset: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List { if (!query.isNullOrEmpty()) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt index 15db547e..49660567 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/DesuMeParser.kt @@ -37,6 +37,7 @@ internal class DesuMeParser(context: MangaLoaderContext) : PagedMangaParser(cont page: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List { if (query != null && page != searchPaginator.firstPage) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt index abdd1c87..f1f19a68 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/NudeMoonParser.kt @@ -48,6 +48,7 @@ internal class NudeMoonParser( offset: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List { val domain = domain diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt index 95ac1174..b4b54239 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/RemangaParser.kt @@ -77,6 +77,7 @@ internal class RemangaParser( page: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List { copyCookies() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt index ab88a623..a30a7ddb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/ChanParser.kt @@ -32,6 +32,7 @@ internal abstract class ChanParser( offset: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List { val domain = domain diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt index adcad3b9..20b3e65b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/rulib/MangaLibParser.kt @@ -44,6 +44,7 @@ internal open class MangaLibParser( page: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List { if (!query.isNullOrEmpty()) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt index a5cd7080..d681cc0b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HentaiUkrParser.kt @@ -67,7 +67,13 @@ class HentaiUkrParser(context: MangaLoaderContext) : MangaParser(context, MangaS ) } - override suspend fun getList(offset: Int, query: String?, tags: Set?, sortOrder: SortOrder): List { + override suspend fun getList( + offset: Int, + query: String?, + tags: Set?, + tagsExclude: Set?, + sortOrder: SortOrder, + ): List { // Get all manga val json = allManga.get().toMutableList() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt index 0184d186..c8d37e42 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/HoneyMangaParser.kt @@ -80,6 +80,7 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, page: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List { val body = JSONObject() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt index 3b1fc2c6..7d96ff4b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/uk/MangaInUaParser.kt @@ -34,6 +34,7 @@ class MangaInUaParser(context: MangaLoaderContext) : PagedMangaParser( page: Int, query: String?, tags: Set?, + tagsExclude: Set?, sortOrder: SortOrder, ): List { val url = when { diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index b086e735..4379d41e 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -28,7 +28,7 @@ internal class MangaParserTest { @MangaSources fun list(source: MangaSource) = runTest(timeout = timeout) { val parser = context.newParserInstance(source) - val list = parser.getList(0, sortOrder = SortOrder.POPULARITY, tags = null) + val list = parser.getList(0, sortOrder = SortOrder.POPULARITY, tags = null, tagsExclude = null) checkMangaList(list, "list") assert(list.all { it.source == source }) } @@ -61,7 +61,7 @@ internal class MangaParserTest { offset = 0, filter = MangaListFilter.Advanced( sortOrder = SortOrder.POPULARITY, - tags = emptySet(), locale = null, states = emptySet(), + tags = emptySet(), locale = null, states = emptySet(), tagsExclude = emptySet(), ), ).minByOrNull { it.title.length @@ -92,7 +92,7 @@ internal class MangaParserTest { assert(tags.all { it.source == source }) val tag = tags.last() - val list = parser.getList(offset = 0, tags = setOf(tag), sortOrder = null) + val list = parser.getList(offset = 0, tags = setOf(tag), tagsExclude = setOf(tag), sortOrder = null) checkMangaList(list, "${tag.title} (${tag.key})") assert(list.all { it.source == source }) } @@ -104,7 +104,7 @@ internal class MangaParserTest { val tags = parser.getAvailableTags().shuffled().take(2).toSet() val list = try { - parser.getList(offset = 0, tags = tags, sortOrder = null) + parser.getList(offset = 0, tags = tags, tagsExclude = tags, sortOrder = null) } catch (e: IllegalArgumentException) { if (e.message == "Multiple genres are not supported by this source") { return@runTest @@ -127,6 +127,7 @@ internal class MangaParserTest { val filter = MangaListFilter.Advanced( sortOrder = parser.availableSortOrders.first(), tags = setOf(), + tagsExclude = setOf(), locale = locales.random(), states = setOf(), ) @@ -140,7 +141,7 @@ internal class MangaParserTest { @MangaSources fun details(source: MangaSource) = runTest(timeout = timeout) { val parser = context.newParserInstance(source) - val list = parser.getList(0, sortOrder = SortOrder.POPULARITY, tags = null) + val list = parser.getList(0, sortOrder = SortOrder.POPULARITY, tags = null, tagsExclude = null) val manga = list[3] parser.getDetails(manga).apply { assert(!chapters.isNullOrEmpty()) { "Chapters are null or empty" } @@ -169,7 +170,7 @@ internal class MangaParserTest { @MangaSources fun pages(source: MangaSource) = runTest(timeout = timeout) { val parser = context.newParserInstance(source) - val list = parser.getList(0, sortOrder = SortOrder.UPDATED, tags = null) + val list = parser.getList(0, sortOrder = SortOrder.UPDATED, tags = null, tagsExclude = null) val manga = list.first() val chapter = parser.getDetails(manga).chapters?.firstOrNull() ?: error("Chapter is null at ${manga.publicUrl}") val pages = parser.getPages(chapter)