diff --git a/kotatsu-parsers-ksp/src/main/kotlin/org/koitharu/kotatsu/parsers/ksp/ParserProcessor.kt b/kotatsu-parsers-ksp/src/main/kotlin/org/koitharu/kotatsu/parsers/ksp/ParserProcessor.kt index ceacbece..12cf1246 100644 --- a/kotatsu-parsers-ksp/src/main/kotlin/org/koitharu/kotatsu/parsers/ksp/ParserProcessor.kt +++ b/kotatsu-parsers-ksp/src/main/kotlin/org/koitharu/kotatsu/parsers/ksp/ParserProcessor.kt @@ -73,8 +73,6 @@ class ParserProcessor( """ package org.koitharu.kotatsu.parsers.model - import org.koitharu.kotatsu.parsers.model.MangaSource - enum class MangaSource( val title: String, val locale: String?, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt index c2453568..5574eccd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt @@ -7,7 +7,7 @@ import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.toAbsoluteUrl import java.util.* -abstract class MangaParser(val source: MangaSource) { +abstract class MangaParser @InternalParsersApi constructor(val source: MangaSource) { protected abstract val context: MangaLoaderContext @@ -27,6 +27,15 @@ abstract class MangaParser(val source: MangaSource) { */ protected abstract val configKeyDomain: ConfigKey.Domain + /** + * Used as fallback if value of `sortOrder` passed to [getList] is null + */ + protected open val defaultSortOrder: SortOrder + get() { + val supported = sortOrders + return SortOrder.values().first { it in supported } + } + /** * Parse list of manga by specified criteria * @@ -36,13 +45,36 @@ abstract class MangaParser(val source: MangaSource) { * @param tags genres for filtering, values from [getTags] and [Manga.tags]. May be null or empty * @param sortOrder one of [sortOrders] or null for default value */ + @InternalParsersApi abstract suspend fun getList( offset: Int, - query: String? = null, - tags: Set? = null, - sortOrder: SortOrder? = null, + query: String?, + tags: Set?, + sortOrder: SortOrder, ): List + /** + * Parse list of manga with search by text query + * + * @param offset starting from 0 and used for pagination. + * @param query search query + */ + suspend fun getList(offset: Int, query: String): List { + return getList(offset, query, null, defaultSortOrder) + } + + /** + * Parse list of manga by specified criteria + * + * @param offset starting from 0 and used for pagination. + * Note than passed value may not be divisible by internal page size, so you should adjust it manually. + * @param tags genres for filtering, values from [getTags] and [Manga.tags]. May be null or empty + * @param sortOrder one of [sortOrders] or null for default value + */ + suspend fun getList(offset: Int, tags: Set?, sortOrder: SortOrder?): List { + return getList(offset, null, tags, sortOrder ?: defaultSortOrder) + } + /** * Parse details for [Manga]: chapters list, description, large cover, etc. * Must return the same manga, may change any fields excepts id, url and source @@ -121,12 +153,29 @@ abstract class MangaParser(val source: MangaSource) { /** * Convert relative url to an absolute using [getDomain] */ - protected fun String.withDomain(subdomain: String? = null): String { - var domain = getDomain() - if (subdomain != null) { - domain = subdomain + "." + domain.removePrefix("www.") - } - return toAbsoluteUrl(domain) + @Deprecated( + message = "Use toAbsoluteUrl() instead", + replaceWith = ReplaceWith( + "toAbsoluteUrl(getDomain(), subdomain)", + "org.koitharu.kotatsu.parsers.util.toAbsoluteUrl", + ), + ) + protected fun String.withDomain(subdomain: String): String { + return toAbsoluteUrl(getDomain(), subdomain) + } + + /** + * Convert relative url to an absolute using [getDomain] + */ + @Deprecated( + message = "Use toAbsoluteUrl() instead", + replaceWith = ReplaceWith( + "toAbsoluteUrl(getDomain())", + "org.koitharu.kotatsu.parsers.util.toAbsoluteUrl", + ), + ) + protected fun String.withDomain(): String { + return toAbsoluteUrl(getDomain()) } @InternalParsersApi diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/AnibelParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/AnibelParser.kt index 99e11cc7..1cda9941 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/AnibelParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/AnibelParser.kt @@ -30,7 +30,7 @@ internal class AnibelParser(override val context: MangaLoaderContext) : MangaPar offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { if (!query.isNullOrEmpty()) { return if (offset == 0) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/BatoToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/BatoToParser.kt index bb41f55e..46c50ef9 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/BatoToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/BatoToParser.kt @@ -39,7 +39,7 @@ internal class BatoToParser(override val context: MangaLoaderContext) : MangaPar offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { if (!query.isNullOrEmpty()) { return search(offset, query) @@ -52,7 +52,6 @@ internal class BatoToParser(override val context: MangaLoaderContext) : MangaPar append(getDomain()) append("/browse?sort=") when (sortOrder) { - null, SortOrder.UPDATED, -> append("update.za") SortOrder.POPULARITY -> append("views_a.za") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ChanParser.kt index fc160db5..2296f5de 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ChanParser.kt @@ -19,7 +19,7 @@ internal abstract class ChanParser(source: MangaSource) : MangaParser(source) { offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val domain = getDomain() val url = when { @@ -143,16 +143,16 @@ internal abstract class ChanParser(source: MangaSource) : MangaParser(source) { } } - private fun getSortKey(sortOrder: SortOrder?) = - when (sortOrder ?: sortOrders.minByOrNull { it.ordinal }) { + private fun getSortKey(sortOrder: SortOrder) = + when (sortOrder) { SortOrder.ALPHABETICAL -> "catalog" SortOrder.POPULARITY -> "mostfavorites" SortOrder.NEWEST -> "manga/new" else -> "mostfavorites" } - private fun getSortKey2(sortOrder: SortOrder?) = - when (sortOrder ?: sortOrders.minByOrNull { it.ordinal }) { + private fun getSortKey2(sortOrder: SortOrder) = + when (sortOrder) { SortOrder.ALPHABETICAL -> "abcasc" SortOrder.POPULARITY -> "favdesc" SortOrder.NEWEST -> "datedesc" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ComickFunParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ComickFunParser.kt index c4f62999..06acadeb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ComickFunParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ComickFunParser.kt @@ -39,7 +39,7 @@ internal class ComickFunParser(override val context: MangaLoaderContext) : Manga offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val domain = getDomain() val url = buildString { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/DesuMeParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/DesuMeParser.kt index c38a8017..cb4fe36f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/DesuMeParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/DesuMeParser.kt @@ -28,7 +28,7 @@ internal class DesuMeParser(override val context: MangaLoaderContext) : MangaPar offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { if (query != null && offset != 0) { return emptyList() @@ -149,7 +149,7 @@ internal class DesuMeParser(override val context: MangaLoaderContext) : MangaPar } } - private fun getSortKey(sortOrder: SortOrder?) = + private fun getSortKey(sortOrder: SortOrder) = when (sortOrder) { SortOrder.ALPHABETICAL -> "name" SortOrder.POPULARITY -> "popular" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ExHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ExHentaiParser.kt index 5bce1ea4..89186372 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ExHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ExHentaiParser.kt @@ -61,7 +61,7 @@ internal class ExHentaiParser( offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val page = (offset / 25f).toIntUp() var search = query?.urlEncoded().orEmpty() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/GroupleParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/GroupleParser.kt index 56afa191..10022052 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/GroupleParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/GroupleParser.kt @@ -5,7 +5,6 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Response import org.json.JSONArray import org.koitharu.kotatsu.parsers.MangaParser -import org.koitharu.kotatsu.parsers.exception.ParseException import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.util.* import org.koitharu.kotatsu.parsers.util.json.mapJSON @@ -34,7 +33,7 @@ internal abstract class GroupleParser(source: MangaSource, userAgent: String) : offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val domain = getDomain() val doc = when { @@ -48,17 +47,13 @@ internal abstract class GroupleParser(source: MangaSource, userAgent: String) : ) tags.isNullOrEmpty() -> context.httpGet( "https://$domain/list?sortType=${ - getSortKey( - sortOrder, - ) + getSortKey(sortOrder) }&offset=${offset upBy PAGE_SIZE}", headers, ) tags.size == 1 -> context.httpGet( "https://$domain/list/genre/${tags.first().key}?sortType=${ - getSortKey( - sortOrder, - ) + getSortKey(sortOrder) }&offset=${offset upBy PAGE_SIZE}", headers, ) @@ -234,14 +229,13 @@ internal abstract class GroupleParser(source: MangaSource, userAgent: String) : } } - private fun getSortKey(sortOrder: SortOrder?) = - when (sortOrder ?: sortOrders.minByOrNull { it.ordinal }) { + private fun getSortKey(sortOrder: SortOrder) = + when (sortOrder) { SortOrder.ALPHABETICAL -> "name" SortOrder.POPULARITY -> "rate" SortOrder.UPDATED -> "updated" SortOrder.NEWEST -> "created" SortOrder.RATING -> "votes" - null -> "updated" } private suspend fun advancedSearch(domain: String, tags: Set): Response { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/HenChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/HenChanParser.kt index d71c6b53..b2cac4c8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/HenChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/HenChanParser.kt @@ -21,7 +21,7 @@ internal class HenChanParser(override val context: MangaLoaderContext) : ChanPar offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { return super.getList(offset, query, tags, sortOrder).map { it.copy( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MadaraParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MadaraParser.kt index 823c8c51..40074eb0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MadaraParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MadaraParser.kt @@ -34,7 +34,7 @@ internal abstract class MadaraParser( offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val tag = when { tags.isNullOrEmpty() -> null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaDexParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaDexParser.kt index ba838ce1..3e76e5e6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaDexParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaDexParser.kt @@ -35,7 +35,7 @@ internal class MangaDexParser(override val context: MangaLoaderContext) : MangaP offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val domain = getDomain() val url = buildString { @@ -60,7 +60,6 @@ internal class MangaDexParser(override val context: MangaLoaderContext) : MangaP append("&order") append( when (sortOrder) { - null, SortOrder.UPDATED, -> "[latestUploadedChapter]=desc" SortOrder.ALPHABETICAL -> "[title]=asc" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaInUaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaInUaParser.kt index 7748d330..65e00da7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaInUaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaInUaParser.kt @@ -23,7 +23,7 @@ class MangaInUaParser(override val context: MangaLoaderContext) : MangaParser(Ma offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val page = (offset / 24f).toIntUp().inc() val searchPage = (offset / 10f).toIntUp().inc() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaLibParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaLibParser.kt index 41a5b0f8..db4f267c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaLibParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaLibParser.kt @@ -41,7 +41,7 @@ internal open class MangaLibParser( offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { if (!query.isNullOrEmpty()) { return if (offset == 0) search(query) else emptyList() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaOwlParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaOwlParser.kt index 9a1cfb12..fd942e43 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaOwlParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaOwlParser.kt @@ -27,7 +27,7 @@ internal class MangaOwlParser(override val context: MangaLoaderContext) : MangaP offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val page = (offset / 36f).toIntUp().inc() val link = buildString { @@ -165,16 +165,16 @@ internal class MangaOwlParser(override val context: MangaLoaderContext) : MangaP } } - private fun getSortKey(sortOrder: SortOrder?) = - when (sortOrder ?: sortOrders.minByOrNull { it.ordinal }) { + private fun getSortKey(sortOrder: SortOrder) = + when (sortOrder) { SortOrder.POPULARITY -> "popular" SortOrder.NEWEST -> "new_release" SortOrder.UPDATED -> "lastest" else -> "lastest" } - private fun getAlternativeSortKey(sortOrder: SortOrder?) = - when (sortOrder ?: sortOrders.minByOrNull { it.ordinal }) { + private fun getAlternativeSortKey(sortOrder: SortOrder) = + when (sortOrder) { SortOrder.POPULARITY -> "0" SortOrder.NEWEST -> "2" SortOrder.UPDATED -> "3" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaTownParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaTownParser.kt index b317ca38..f03247f8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaTownParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/MangaTownParser.kt @@ -29,7 +29,7 @@ internal class MangaTownParser(override val context: MangaLoaderContext) : Manga offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val sortKey = when (sortOrder) { SortOrder.ALPHABETICAL -> "?name.az" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NineMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NineMangaParser.kt index 9d2ca8eb..9919d546 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NineMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NineMangaParser.kt @@ -38,7 +38,7 @@ internal abstract class NineMangaParser( offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val page = (offset / PAGE_SIZE.toFloat()).toIntUp() + 1 val url = buildString { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NudeMoonParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NudeMoonParser.kt index ad36a90b..18148ea6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NudeMoonParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/NudeMoonParser.kt @@ -48,7 +48,7 @@ internal class NudeMoonParser( offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { val domain = getDomain() val url = when { @@ -206,8 +206,8 @@ internal class NudeMoonParser( return "https://${getDomain()}/favicon.jpg" } - private fun getSortKey(sortOrder: SortOrder?) = - when (sortOrder ?: sortOrders.minByOrNull { it.ordinal }) { + private fun getSortKey(sortOrder: SortOrder) = + when (sortOrder) { SortOrder.POPULARITY -> "views" SortOrder.NEWEST -> "date" SortOrder.RATING -> "like" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/RemangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/RemangaParser.kt index fb5b16bd..e8e8792a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/RemangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/RemangaParser.kt @@ -57,7 +57,7 @@ internal class RemangaParser( offset: Int, query: String?, tags: Set?, - sortOrder: SortOrder?, + sortOrder: SortOrder, ): List { copyCookies() val domain = getDomain() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt index 0729b1be..01cee9af 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/util/Parse.kt @@ -105,15 +105,24 @@ fun String.toRelativeUrl(domain: String): String { } /** - * Convert url to absolute with specified [domain] + * Convert url to absolute with specified domain * @return an absolute url with [domain] if this is relative */ fun String.toAbsoluteUrl(domain: String): String = when { this.startsWith("//") -> "https:$this" - this.startsWith("/") -> "https://$domain$this" + this.startsWith('/') -> "https://$domain$this" else -> this } +/** + * Convert url to absolute with specified domain and subdomain + * @return an absolute url with [subdomain].[domain] if this is relative + */ +fun String.toAbsoluteUrl(domain: String, subdomain: String): String { + if (!this.startsWith('/')) return this + return toAbsoluteUrl(subdomain + "." + domain.removePrefix("www.")) +} + @Deprecated( message = "", level = DeprecationLevel.ERROR, diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index 347f7593..22255e80 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -25,7 +25,7 @@ internal class MangaParserTest { @MangaSources fun list(source: MangaSource) = runTest { val parser = source.newParser(context) - val list = parser.getList(20, query = null, sortOrder = SortOrder.POPULARITY, tags = null) + val list = parser.getList(20, sortOrder = SortOrder.POPULARITY, tags = null) checkMangaList(list, "list") assert(list.all { it.source == source }) } @@ -34,12 +34,12 @@ internal class MangaParserTest { @MangaSources fun search(source: MangaSource) = runTest { val parser = source.newParser(context) - val subject = parser.getList(20, query = null, sortOrder = SortOrder.POPULARITY, tags = null).minByOrNull { + val subject = parser.getList(20, sortOrder = SortOrder.POPULARITY, tags = null).minByOrNull { it.title.length } ?: error("No manga found") val query = subject.title check(query.isNotBlank()) { "Manga title '$query' is blank" } - val list = parser.getList(offset = 0, query, sortOrder = null, tags = null) + val list = parser.getList(0, query) assert(list.singleOrNull { it.url == subject.url && it.id == subject.id } != null) { "Single subject '${subject.title} (${subject.publicUrl})' not found in search results" } @@ -62,7 +62,7 @@ internal class MangaParserTest { assert(tags.all { it.source == source }) val tag = tags.last() - val list = parser.getList(offset = 0, tags = setOf(tag), query = null, sortOrder = null) + val list = parser.getList(offset = 0, tags = setOf(tag), sortOrder = null) checkMangaList(list, "${tag.title} (${tag.key})") assert(list.all { it.source == source }) } @@ -71,7 +71,7 @@ internal class MangaParserTest { @MangaSources fun details(source: MangaSource) = runTest { val parser = source.newParser(context) - val list = parser.getList(20, query = null, sortOrder = SortOrder.POPULARITY, tags = null) + val list = parser.getList(20, sortOrder = SortOrder.POPULARITY, tags = null) val manga = list[3] parser.getDetails(manga).apply { assert(!chapters.isNullOrEmpty()) { "Chapters are null or empty" } @@ -100,7 +100,7 @@ internal class MangaParserTest { @MangaSources fun pages(source: MangaSource) = runTest { val parser = source.newParser(context) - val list = parser.getList(20, query = null, sortOrder = SortOrder.POPULARITY, tags = null) + val list = parser.getList(20, sortOrder = SortOrder.POPULARITY, tags = null) val manga = list.first() val chapter = parser.getDetails(manga).chapters?.firstOrNull() ?: error("Chapter is null") val pages = parser.getPages(chapter)