diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt index 2dc793f4f..1e1c2362f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/MangaParser.kt @@ -23,7 +23,27 @@ abstract class MangaParser @InternalParsersApi constructor( * * For better performance use [EnumSet] for more than one item. */ - abstract val sortOrders: Set + abstract val availableSortOrders: Set + + /** + * Supported [MangaState] variants for filtering. May be empty. + * + * For better performance use [EnumSet] for more than one item. + */ + open val availableStates: Set + get() = emptySet() + + /** + * Whether parser supports filtering by more than one tag + */ + open val isMultipleTagsSupported: Boolean = true + + @Deprecated( + message = "Use availableSortOrders instead", + replaceWith = ReplaceWith("availableSortOrders"), + ) + val sortOrders: Set + get() = availableSortOrders val config by lazy { context.getConfig(source) } @@ -49,7 +69,7 @@ abstract class MangaParser @InternalParsersApi constructor( */ protected open val defaultSortOrder: SortOrder get() { - val supported = sortOrders + val supported = availableSortOrders return SortOrder.entries.first { it in supported } } @@ -62,11 +82,15 @@ abstract class MangaParser @InternalParsersApi constructor( * @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 query search query, may be null or empty if no search needed - * @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 + * @param tags genres for filtering, values from [getAvailableTags] and [Manga.tags]. May be null or empty + * @param sortOrder one of [availableSortOrders] or null for default value */ @JvmSynthetic @InternalParsersApi + @Deprecated( + "Use getList with filter instead", + replaceWith = ReplaceWith("getList(offset, filter)"), + ) abstract suspend fun getList( offset: Int, query: String?, @@ -80,8 +104,15 @@ abstract class MangaParser @InternalParsersApi constructor( * @param offset starting from 0 and used for pagination. * @param query search query */ + @Deprecated( + "Use getList with filter instead", + ReplaceWith( + "getList(offset, MangaListFilter.Search(query))", + "org.koitharu.kotatsu.parsers.model.MangaListFilter", + ), + ) open suspend fun getList(offset: Int, query: String): List { - return getList(offset, query, null, defaultSortOrder) + return getList(offset, MangaListFilter.Search(query)) } /** @@ -89,11 +120,29 @@ abstract class MangaParser @InternalParsersApi constructor( * * @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 + * @param tags genres for filtering, values from [getAvailableTags] and [Manga.tags]. May be null or empty + * @param sortOrder one of [availableSortOrders] or null for default value */ + @Deprecated( + "Use getList with filter instead", + ReplaceWith( + "getList(offset, MangaListFilter.Advanced(sortOrder, tags, null, emptySet()))", + "org.koitharu.kotatsu.parsers.model.MangaListFilter", + ), + ) open suspend fun getList(offset: Int, tags: Set?, sortOrder: SortOrder?): List { - return getList(offset, null, tags, sortOrder ?: defaultSortOrder) + return getList( + offset, + MangaListFilter.Advanced(sortOrder ?: defaultSortOrder, tags.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) + } } /** @@ -117,7 +166,18 @@ abstract class MangaParser @InternalParsersApi constructor( /** * Fetch available tags (genres) for source */ - abstract suspend fun getTags(): Set + abstract suspend fun getAvailableTags(): Set + + /** + * Fetch available locales for multilingual sources + */ + open suspend fun getAvailableLocales(): Set = emptySet() + + @Deprecated( + message = "Use getAvailableTags instead", + replaceWith = ReplaceWith("getAvailableTags()"), + ) + suspend fun getTags(): Set = getAvailableTags() /** * Parse favicons from the main page of the source`s website diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt new file mode 100644 index 000000000..b861068de --- /dev/null +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaListFilter.kt @@ -0,0 +1,29 @@ +package org.koitharu.kotatsu.parsers.model + +import java.util.* + +sealed interface MangaListFilter { + + fun isEmpty(): Boolean + + val sortOrder: SortOrder? + + data class Search( + @JvmField val query: String, + ) : MangaListFilter { + + override val sortOrder: SortOrder? = null + + override fun isEmpty() = query.isBlank() + } + + data class Advanced( + override val sortOrder: SortOrder, + @JvmField val tags: Set, + @JvmField val locale: Locale?, + @JvmField val states: Set, + ) : MangaListFilter { + + override fun isEmpty(): Boolean = tags.isEmpty() && locale == null && states.isEmpty() + } +} diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaState.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaState.kt index 8ade60493..1d964722a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaState.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/model/MangaState.kt @@ -1,5 +1,5 @@ package org.koitharu.kotatsu.parsers.model enum class MangaState { - ONGOING, FINISHED, ABANDONED + ONGOING, FINISHED, ABANDONED, PAUSED } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt index 521f52660..c9da08f54 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/BatoToParser.kt @@ -26,7 +26,7 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser( searchPageSize = 20, ) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.NEWEST, SortOrder.UPDATED, SortOrder.POPULARITY, @@ -159,7 +159,7 @@ internal class BatoToParser(context: MangaLoaderContext) : PagedMangaParser( throw ParseException("Cannot find images list", fullUrl) } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val scripts = webClient.httpGet( "https://${domain}/browse", ).parseHtml().selectOrThrow("script") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt index 38aeb2569..586c57342 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ComickFunParser.kt @@ -25,7 +25,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : MangaParser(contex override val configKeyDomain = ConfigKey.Domain("comick.app") - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.RATING, @@ -137,7 +137,7 @@ internal class ComickFunParser(context: MangaLoaderContext) : MangaParser(contex } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val sparseArray = cachedTags ?: loadTags() val set = ArraySet(sparseArray.size()) for (i in 0 until sparseArray.size()) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt index 99da0ec9b..66e6b100b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ExHentaiParser.kt @@ -23,7 +23,7 @@ internal class ExHentaiParser( context: MangaLoaderContext, ) : PagedMangaParser(context, MangaSource.EXHENTAI, pageSize = 25), MangaParserAuthProvider { - override val sortOrders: Set = Collections.singleton( + override val availableSortOrders: Set = Collections.singleton( SortOrder.NEWEST, ) @@ -213,7 +213,7 @@ internal class ExHentaiParser( return doc.body().requireElementById("img").attrAsAbsoluteUrl("src") } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://${domain}").parseHtml() val root = doc.body().requireElementById("searchbox").selectFirstOrThrow("table") return root.select("div.cs").mapNotNullToSet { div -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt index 4ecc1c1e3..845259d32 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/ImHentai.kt @@ -17,11 +17,13 @@ import java.util.* internal class ImHentai(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.IMHENTAI, pageSize = 20) { - override val sortOrders: Set = + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.RATING) override val configKeyDomain = ConfigKey.Domain("imhentai.xxx") + override val isMultipleTagsSupported = false + override suspend fun getListPage( page: Int, query: String?, @@ -83,7 +85,7 @@ internal class ImHentai(context: MangaLoaderContext) : //Tags are deliberately reduced because there are too many and this slows down the application. //only the most popular ones are taken. - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return coroutineScope { (1..3).map { page -> async { getTags(page) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt index 6459d7eea..33cbe5afb 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/LineWebtoonsParser.kt @@ -24,6 +24,8 @@ internal abstract class LineWebtoonsParser( source: MangaSource, ) : MangaParser(context, source) { + override val isMultipleTagsSupported = false + private val signer by lazy { WebtoonsUrlSigner("gUtPzJFZch4ZyAGviiyH94P99lQ3pFdRTwpJWDlSGFfwgpr6ses5ALOxWHOIT7R1") } @@ -39,7 +41,7 @@ internal abstract class LineWebtoonsParser( private val apiDomain = "global.apis.naver.com" private val staticDomain = "webtoon-phinf.pstatic.net" - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, // doesn't actually sort by rating, but by likes // this should be fine though @@ -235,7 +237,7 @@ internal abstract class LineWebtoonsParser( ) } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return makeRequest("/lineWebtoon/webtoon/challengeGenreList.json") .getJSONObject("genreList") .getJSONArray("challengeGenres") 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 b3698d5e7..7edcff84a 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 @@ -30,7 +30,7 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context override val configKeyDomain = ConfigKey.Domain("mangadex.org") - override val sortOrders: EnumSet = EnumSet.of( + override val availableSortOrders: EnumSet = EnumSet.of( SortOrder.UPDATED, SortOrder.ALPHABETICAL, SortOrder.NEWEST, @@ -159,7 +159,7 @@ internal class MangaDexParser(context: MangaLoaderContext) : MangaParser(context } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val tags = webClient.httpGet("https://api.${domain}/manga/tag").parseJson() .getJSONArray("data") return tags.mapJSONToSet { jo -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt index eaa2adbb4..5d9ef8438 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/all/NineMangaParser.kt @@ -31,7 +31,7 @@ internal abstract class NineMangaParser( .add("Accept-Language", "en-US;q=0.7,en;q=0.3") .build() - override val sortOrders: Set = Collections.singleton( + override val availableSortOrders: Set = Collections.singleton( SortOrder.POPULARITY, ) @@ -158,7 +158,7 @@ internal abstract class NineMangaParser( private var tagCache: ArrayMap? = null private val mutex = Mutex() - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return getOrCreateTagMap().values.toSet() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt index 1df0d2c6c..c5a89e1d4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/AnimeBootstrapParser.kt @@ -22,7 +22,9 @@ internal abstract class AnimeBootstrapParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val isMultipleTagsSupported = false + + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, @@ -93,7 +95,7 @@ internal abstract class AnimeBootstrapParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain$listUrl").parseHtml() return doc.select("div.product__page__filter div:contains(Genre:) option ").mapNotNullToSet { option -> val key = option.attr("value") ?: return@mapNotNullToSet null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt index 38601e645..0833785dd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/animebootstrap/fr/PapScan.kt @@ -20,6 +20,8 @@ internal class PapScan(context: MangaLoaderContext) : override val sourceLocale: Locale = Locale.ENGLISH + override val isMultipleTagsSupported = false + override val listUrl = "/liste-manga" override val selectState = "div.anime__details__widget li:contains(En cours)" @@ -27,7 +29,7 @@ internal class PapScan(context: MangaLoaderContext) : override val selectChapter = "ul.chapters li" - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, SortOrder.ALPHABETICAL, ) @@ -85,7 +87,7 @@ internal class PapScan(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain$listUrl").parseHtml() return doc.select("a.category ").mapNotNullToSet { a -> val key = a.attr("href").substringAfterLast('=') diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt index 5ead1fbee..95a121253 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/FlixScans.kt @@ -18,7 +18,7 @@ import java.util.* @MangaSourceParser("FLIXSCANS", "FlixScans", "ar") internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.FLIXSCANS, 18) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("flixscans.com") override suspend fun getListPage( @@ -70,7 +70,7 @@ internal class FlixScans(context: MangaLoaderContext) : PagedMangaParser(context } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/search/advance").parseHtml() val json = JSONArray(doc.requireElementById("__NUXT_DATA__").data()) val tagsList = json.getJSONArray(3).toString().replace("[", "").replace("]", "").split(",") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt index 1a8045173..74aec2203 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/MangaStorm.kt @@ -13,8 +13,9 @@ import java.util.* @MangaSourceParser("MANGASTORM", "MangaStorm", "ar") internal class MangaStorm(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGASTORM, 30) { - override val sortOrders: Set = EnumSet.of(SortOrder.POPULARITY) + override val availableSortOrders: Set = EnumSet.of(SortOrder.POPULARITY) override val configKeyDomain = ConfigKey.Domain("mangastorm.org") + override val isMultipleTagsSupported = false override val headers: Headers = Headers.Builder() .add("User-Agent", UserAgents.CHROME_DESKTOP) @@ -69,7 +70,7 @@ internal class MangaStorm(context: MangaLoaderContext) : PagedMangaParser(contex } } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt index 7a7cee353..a28056010 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ar/TeamXNovel.kt @@ -16,8 +16,9 @@ import java.util.* @MangaSourceParser("TEAMXNOVEL", "TeamXNovel", "ar") internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.TEAMXNOVEL, 10) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY) override val configKeyDomain = ConfigKey.Domain("team11x11.com") + override val isMultipleTagsSupported = false override suspend fun getListPage( page: Int, @@ -82,7 +83,7 @@ internal class TeamXNovel(context: MangaLoaderContext) : PagedMangaParser(contex } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/series").parseHtml() return doc.requireElementById("select_genre").select("option").mapNotNullToSet { MangaTag( 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 4290f79de..f7e079059 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 @@ -23,7 +23,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context, override val configKeyDomain = ConfigKey.Domain("anibel.net") - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.NEWEST, ) @@ -176,7 +176,7 @@ internal class AnibelParser(context: MangaLoaderContext) : MangaParser(context, } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val json = apiCall( """ getFilters(mediaType: manga) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt index 9fa1266af..cb073d18b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/BeeToon.kt @@ -13,10 +13,12 @@ import java.util.* internal class BeeToon(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BEETOON, pageSize = 30) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY) override val configKeyDomain = ConfigKey.Domain("ww7.beetoon.net") + override val isMultipleTagsSupported = false + override suspend fun getListPage( page: Int, query: String?, @@ -80,7 +82,7 @@ internal class BeeToon(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/").parseHtml() return doc.requireElementById("menu-item-3").select("ul.sub-menu li a").mapNotNullToSet { MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt index 5e5327e26..7d36dab39 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/CloneMangaParser.kt @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("CLONEMANGA", "CloneManga", "en") internal class CloneMangaParser(context: MangaLoaderContext) : MangaParser(context, MangaSource.CLONEMANGA) { - override val sortOrders: Set = Collections.singleton( + override val availableSortOrders: Set = Collections.singleton( SortOrder.POPULARITY, ) @@ -89,5 +89,5 @@ internal class CloneMangaParser(context: MangaLoaderContext) : MangaParser(conte ) } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt index bc39794f3..1b1b40e26 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ComicExtra.kt @@ -14,10 +14,13 @@ import java.util.* @MangaSourceParser("COMICEXTRA", "ComicExtra", "en") internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.COMICEXTRA, 25) { - override val sortOrders: Set = EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.NEWEST) + override val availableSortOrders: Set = + EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.NEWEST) override val configKeyDomain = ConfigKey.Domain("comicextra.me") + override val isMultipleTagsSupported = false + override val headers: Headers = Headers.Builder() .add("User-Agent", UserAgents.CHROME_DESKTOP) .build() @@ -80,7 +83,7 @@ internal class ComicExtra(context: MangaLoaderContext) : PagedMangaParser(contex } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/popular-comic").parseHtml() return doc.select("li.tag-item a").mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt index a5fbe2062..634dc9ecc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/DynastyScans.kt @@ -15,7 +15,7 @@ import java.util.* @MangaSourceParser("DYNASTYSCANS", "DynastyScans", "en") internal class DynastyScans(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.DYNASTYSCANS, 117) { - override val sortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) override val configKeyDomain = ConfigKey.Domain("dynasty-scans.com") override val headers: Headers = Headers.Builder() @@ -100,7 +100,7 @@ internal class DynastyScans(context: MangaLoaderContext) : PagedMangaParser(cont } } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Fakku.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Fakku.kt index cfc72d1b3..b231da154 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Fakku.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Fakku.kt @@ -15,11 +15,13 @@ import java.util.* internal class Fakku(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.FAKKU, pageSize = 25) { - override val sortOrders: Set = + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.NEWEST, SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("fakku.cc") + override val isMultipleTagsSupported = false + override suspend fun getListPage( page: Int, query: String?, @@ -77,7 +79,7 @@ internal class Fakku(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val root = webClient.httpGet("https://$domain/tags").parseHtml() return root.select("div.entries .entry a").mapToSet { MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/KskMoe.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/KskMoe.kt index e886c0ea5..e9c22fe84 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/KskMoe.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/KskMoe.kt @@ -20,9 +20,10 @@ import java.util.* @MangaSourceParser("KSKMOE", "Ksk.moe", "en", ContentType.HENTAI) internal class KskMoe(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.KSKMOE, 35) { - override val sortOrders: Set = + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST, SortOrder.ALPHABETICAL) override val configKeyDomain = ConfigKey.Domain("ksk.moe") + override val isMultipleTagsSupported = false override suspend fun getListPage( page: Int, @@ -91,7 +92,7 @@ internal class KskMoe(context: MangaLoaderContext) : PagedMangaParser(context, M } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return coroutineScope { (1..2).map { page -> async { getTags(page) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt index 01d70193a..81327a2d3 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaGeko.kt @@ -14,10 +14,13 @@ import java.util.* @MangaSourceParser("MANGAGEKO", "MangaGeko", "en") internal class MangaGeko(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGAGEKO, 30) { - override val sortOrders: Set = EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.NEWEST) + override val availableSortOrders: Set = + EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.NEWEST) override val configKeyDomain = ConfigKey.Domain("www.mangageko.com") + override val isMultipleTagsSupported = false + override val headers: Headers = Headers.Builder() .add("User-Agent", UserAgents.CHROME_DESKTOP) .build() @@ -77,7 +80,7 @@ internal class MangaGeko(context: MangaLoaderContext) : PagedMangaParser(context } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/browse-comics/").parseHtml() return doc.select("label.checkbox-inline").mapNotNullToSet { label -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt index 6b1ea9fee..4cb4ed8fa 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/MangaTownParser.kt @@ -15,7 +15,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : MangaParser(contex override val configKeyDomain = ConfigKey.Domain("www.mangatown.com") - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, SortOrder.RATING, SortOrder.POPULARITY, @@ -157,7 +157,7 @@ internal class MangaTownParser(context: MangaLoaderContext) : MangaParser(contex return doc.requireElementById("image").attrAsAbsoluteUrl("src") } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("/directory/".toAbsoluteUrl(domain)).parseHtml() val root = doc.body().selectFirst("aside.right") ?.getElementsContainingOwnText("Genres") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt index d1aa828cd..71f1d23ae 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Mangaowl.kt @@ -18,7 +18,7 @@ import java.util.* internal class Mangaowl(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGAOWL, pageSize = 24) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, SortOrder.NEWEST, SortOrder.UPDATED, @@ -94,7 +94,7 @@ internal class Mangaowl(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/8-genres").parseHtml() return doc.select("div.genres-container span.genre-item a").mapNotNullToSet { a -> val key = a.attr("href").substringAfterLast("/") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt index 35547adda..76f774530 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Manhwa18Parser.kt @@ -15,7 +15,7 @@ class Manhwa18Parser(context: MangaLoaderContext) : override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("manhwa18.net") - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST) private val tagsMap = SuspendLazy(::parseTags) @@ -169,7 +169,7 @@ class Manhwa18Parser(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return tagsMap.get().values.toSet() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt index 11904ea1e..8bb514caa 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/ManhwasMen.kt @@ -16,7 +16,9 @@ class ManhwasMen(context: MangaLoaderContext) : override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("manhwas.men") - override val sortOrders: Set + override val isMultipleTagsSupported = false + + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.POPULARITY) override suspend fun getListPage( @@ -64,7 +66,7 @@ class ManhwasMen(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val tags = webClient.httpGet("https://$domain/manga-list").parseHtml() .selectLastOrThrow(".filter-bx .form-group select.custom-select").select("option").drop(1) return tags.mapNotNullToSet { option -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt index bf5b78384..1659a2c58 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Po2Scans.kt @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("PO2SCANS", "Po2Scans", "en") internal class Po2Scans(context: MangaLoaderContext) : MangaParser(context, MangaSource.PO2SCANS) { - override val sortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) override val configKeyDomain = ConfigKey.Domain("po2scans.com") override suspend fun getList(offset: Int, query: String?, tags: Set?, sortOrder: SortOrder): List { @@ -46,7 +46,7 @@ internal class Po2Scans(context: MangaLoaderContext) : MangaParser(context, Mang } } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt index 1e9e71170..1940df62c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/en/Pururin.kt @@ -17,11 +17,13 @@ import java.util.* internal class Pururin(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.PURURIN, pageSize = 20) { - override val sortOrders: Set = + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.RATING, SortOrder.ALPHABETICAL) override val configKeyDomain = ConfigKey.Domain("pururin.to") + override val isMultipleTagsSupported = false + override suspend fun getListPage( page: Int, query: String?, @@ -76,7 +78,7 @@ internal class Pururin(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return coroutineScope { (1..4).map { page -> async { getTags(page) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt index 6df4def3c..1413e7b10 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TempleScanEsp.kt @@ -16,7 +16,7 @@ import java.util.* internal class TempleScanEsp(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.TEMPLESCANESP, pageSize = 15) { - override val sortOrders: Set = EnumSet.of(SortOrder.NEWEST, SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.NEWEST, SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("templescanesp.net") @@ -66,7 +66,7 @@ internal class TempleScanEsp(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() override suspend fun getDetails(manga: Manga): Manga = coroutineScope { val fullUrl = manga.url.toAbsoluteUrl(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt index 00b63e47a..595831eaa 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/es/TuMangaOnlineParser.kt @@ -24,7 +24,7 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser( private val chapterDateFormat = SimpleDateFormat("yyyy-MM-dd", sourceLocale) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, SortOrder.UPDATED, SortOrder.NEWEST, @@ -207,7 +207,7 @@ class TuMangaOnlineParser(context: MangaLoaderContext) : PagedMangaParser( return document } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/library", headers).parseHtml() val elements = doc.body().select("div#books-genders > div > div") return elements.mapNotNullToSet { element -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt index 02783a9c5..3dbceae2b 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/FmreaderParser.kt @@ -21,12 +21,14 @@ internal abstract class FmreaderParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, ) + override val isMultipleTagsSupported = false + protected open val listUrl = "/manga-list.html" protected open val datePattern = "MMMM d, yyyy" protected open val tagPrefix = "manga-list-genre-" @@ -113,7 +115,7 @@ internal abstract class FmreaderParser( protected open val selectBodyTag = "ul.filter-type li a" - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() return doc.select(selectBodyTag).mapNotNullToSet { a -> val href = a.attr("href").substringAfter(tagPrefix).substringBeforeLast(".html") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/en/Manhwa18Com.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/en/Manhwa18Com.kt index 252b4fa1d..e3a86ef5d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/en/Manhwa18Com.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fmreader/en/Manhwa18Com.kt @@ -86,7 +86,7 @@ internal class Manhwa18Com(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() return doc.select(selectBodyTag).mapNotNullToSet { a -> val href = a.attr("href").substringAfterLast("/") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt index 77b750e93..f0b5211c7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/foolslide/FoolSlideParser.kt @@ -20,7 +20,7 @@ internal abstract class FoolSlideParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) protected open val listUrl = "directory/" protected open val searchUrl = "search/" @@ -81,7 +81,7 @@ internal abstract class FoolSlideParser( } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() protected open val selectInfo = "div.info" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt index 2ba817585..7b029cd59 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/BentomangaParser.kt @@ -18,7 +18,7 @@ import java.util.* @MangaSourceParser("BENTOMANGA", "BentoManga", "fr") internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BENTOMANGA, 10) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.RATING, @@ -99,11 +99,14 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser( val root = webClient.httpGet(mangaUrl).parseHtml() .requireElementById("container_manga_show") return manga.copy( - altTitle = root.selectFirst(".component-manga-title_alt")?.textOrNull().assertNotNull("altTitle"), + altTitle = root.selectFirst(".component-manga-title_alt")?.text(), description = root.selectFirst(".datas_synopsis")?.html().assertNotNull("description") ?: manga.description, state = when (root.selectFirst(".datas_more-status-data")?.textOrNull().assertNotNull("status")) { "En cours" -> MangaState.ONGOING + "Terminé" -> MangaState.FINISHED + "Abandonné" -> MangaState.ABANDONED + "En pause" -> MangaState.PAUSED else -> null }, author = root.selectFirst(".datas_more-authors-people")?.textOrNull().assertNotNull("author"), @@ -156,7 +159,7 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val root = webClient.httpGet(urlBuilder().addPathSegment("manga_list").build()) .parseHtml() .requireElementById("search_options-form") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FmTeam.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FmTeam.kt index cb66169ce..73f68a4f0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FmTeam.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FmTeam.kt @@ -17,7 +17,7 @@ import java.util.* internal class FmTeam(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.FMTEAM, 0) { - override val sortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) override val configKeyDomain = ConfigKey.Domain("fmteam.fr") override suspend fun getListPage( @@ -29,11 +29,9 @@ internal class FmTeam(context: MangaLoaderContext) : if (page > 1) { return emptyList() } - val jsonManga = if (!query.isNullOrEmpty()) { //3 letters minimum webClient.httpGet("https://$domain/api/search/${query.urlEncoded()}").parseJson().getJSONArray("comics") - } else { webClient.httpGet("https://$domain/api/comics").parseJson().getJSONArray("comics") } @@ -99,7 +97,7 @@ internal class FmTeam(context: MangaLoaderContext) : } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() override suspend fun getDetails(manga: Manga): Manga = coroutineScope { val fullUrl = manga.url.toAbsoluteUrl(domain) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt index 71910c82d..2363c9949 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/FuryoSociety.kt @@ -18,7 +18,7 @@ import java.util.* internal class FuryoSociety(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.FURYOSOCIETY, 0) { - override val sortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("furyosociety.com") @@ -76,7 +76,7 @@ internal class FuryoSociety(context: MangaLoaderContext) : } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() override suspend fun getDetails(manga: Manga): Manga = coroutineScope { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt index 16e369af5..cdb877439 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LegacyScansParser.kt @@ -16,7 +16,7 @@ import java.util.* internal class LegacyScansParser(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.LEGACY_SCANS, 18) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, ) @@ -151,7 +151,7 @@ internal class LegacyScansParser(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/comics").parseHtml() val script = doc.requireElementById("__NUXT_DATA__").data() .substringAfterLast("\"genres\"").substringBeforeLast("\"comics\"") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt index d8fd12c02..6b3ca5314 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LireScan.kt @@ -14,10 +14,12 @@ import java.util.* @MangaSourceParser("LIRESCAN", "LireScan", "fr") internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.LIRESCAN, 20) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("lire-scan.me") + override val isMultipleTagsSupported = false + override val headers: Headers = Headers.Builder() .add("User-Agent", UserAgents.CHROME_MOBILE) .build() @@ -130,7 +132,7 @@ internal class LireScan(context: MangaLoaderContext) : PagedMangaParser(context, } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/").parseHtml() return doc.select(".nav-menu li a").mapNotNullToSet { a -> val key = a.attr("href").removeSuffix('/').substringAfterLast("manga/", "") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt index 681ec5367..7ad9c2791 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/LugnicaScans.kt @@ -16,7 +16,7 @@ import java.util.* @MangaSourceParser("LUGNICASCANS", "LugnicaScans", "fr") internal class LugnicaScans(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.LUGNICASCANS, 10) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, SortOrder.UPDATED, ) @@ -176,6 +176,6 @@ internal class LugnicaScans(context: MangaLoaderContext) : PagedMangaParser(cont return pages } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt index e2c489afe..15c285c2d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScansMangasMe.kt @@ -17,7 +17,7 @@ import java.util.* internal class ScansMangasMe(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.SCANS_MANGAS_ME, 0) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, SortOrder.UPDATED, SortOrder.NEWEST, @@ -91,7 +91,7 @@ internal class ScansMangasMe(context: MangaLoaderContext) : } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/tous-nos-mangas/").parseHtml() return doc.select("ul.genre li").mapNotNullToSet { li -> val key = li.selectFirstOrThrow("a").attr("href").removeSuffix('/').substringAfterLast('/') diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt index 017eec9b4..07f8dcc2f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/fr/ScantradUnion.kt @@ -15,7 +15,7 @@ import java.util.* @MangaSourceParser("SCANTRADUNION", "ScantradUnion", "fr") internal class ScantradUnion(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.SCANTRADUNION, 10) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, SortOrder.UPDATED, ) @@ -174,7 +174,7 @@ internal class ScantradUnion(context: MangaLoaderContext) : PagedMangaParser(con } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/").parseHtml() val body = doc.body() val root = body.select(".asp_gochosen")[1] diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt index 7706b51f7..2f94f40b5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/galleryadults/GalleryAdultsParser.kt @@ -20,8 +20,9 @@ internal abstract class GalleryAdultsParser( pageSize: Int = 20, ) : PagedMangaParser(context, source, pageSize) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain(domain) + override val isMultipleTagsSupported = false override suspend fun getListPage( page: Int, @@ -87,7 +88,7 @@ internal abstract class GalleryAdultsParser( //Tags are deliberately reduced because there are too many and this slows down the application. //only the most popular ones are taken. - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return coroutineScope { (1..3).map { page -> async { getTags(page) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt index 59966096f..e196f8d9d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/HeanCms.kt @@ -20,7 +20,7 @@ internal abstract class HeanCms( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, SortOrder.UPDATED, SortOrder.NEWEST, @@ -100,6 +100,7 @@ internal abstract class HeanCms( "Ongoing" -> MangaState.ONGOING "Completed" -> MangaState.FINISHED "Dropped" -> MangaState.ABANDONED + "Hiatus" -> MangaState.PAUSED else -> null }, author = null, @@ -159,7 +160,7 @@ internal abstract class HeanCms( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/comics").parseHtml() val tags = doc.selectFirstOrThrow("script:containsData(Genres)").data() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt index 9467a3176..e1700bbb0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancms/es/YugenMangasEs.kt @@ -84,6 +84,7 @@ internal class YugenMangasEs(context: MangaLoaderContext) : "Ongoing" -> MangaState.ONGOING "Completed" -> MangaState.FINISHED "Dropped" -> MangaState.ABANDONED + "Hiatus" -> MangaState.PAUSED else -> null }, author = null, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt index 1c0b310db..a6768be41 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/heancmsalt/HeanCmsAlt.kt @@ -20,7 +20,7 @@ internal abstract class HeanCmsAlt( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) protected open val listUrl = "/comics" protected open val datePattern = "MMMM d, yyyy" @@ -73,7 +73,7 @@ internal abstract class HeanCmsAlt( } } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() protected open val selectDesc = "div.description-container" protected open val selectAlt = "div.series-alternative-names" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt index 047d439a0..babd84fc4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/id/DoujinDesuParser.kt @@ -15,7 +15,7 @@ class DoujinDesuParser(context: MangaLoaderContext) : PagedMangaParser(context, override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("doujindesu.tv") - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.UPDATED, SortOrder.NEWEST, SortOrder.ALPHABETICAL, SortOrder.POPULARITY) override suspend fun getDetails(manga: Manga): Manga { @@ -125,7 +125,7 @@ class DoujinDesuParser(context: MangaLoaderContext) : PagedMangaParser(context, } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return webClient.httpGet("/genre/".toAbsoluteUrl(domain)).parseHtml() .requireElementById("taxonomy") .selectFirstOrThrow(".entries") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt index dfec0e093..17cff2ea0 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ja/NicovideoSeigaParser.kt @@ -34,7 +34,7 @@ class NicovideoSeigaParser(context: MangaLoaderContext) : return body.selectFirst("#userinfo > div > div > strong")?.text() ?: throw AuthRequiredException(source) } - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, ) @@ -143,7 +143,7 @@ class NicovideoSeigaParser(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://${getDomain("seiga")}/manga/list").parseHtml() val root = doc.body().selectOrThrow("#mg_category_list > ul > li") return root.mapToSet { li -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt index a6884cfb2..cb5b17c95 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/likemanga/LikeMangaParser.kt @@ -20,8 +20,10 @@ internal abstract class LikeMangaParser( pageSize: Int = 36, ) : PagedMangaParser(context, source, pageSize) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST) + override val availableSortOrders: Set = + EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST) override val configKeyDomain = ConfigKey.Domain(domain) + override val isMultipleTagsSupported = false override suspend fun getListPage( page: Int, @@ -79,7 +81,7 @@ internal abstract class LikeMangaParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/genres/").parseHtml() return doc.select("ul.nav-genres li:not(.text-center) a").mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt index 2bfbccaeb..1efb0be59 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/MadaraParser.kt @@ -23,7 +23,9 @@ internal abstract class MadaraParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val isMultipleTagsSupported = false + + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST, @@ -137,6 +139,16 @@ internal abstract class MadaraParser( "Abandonné", ) + @JvmField + protected val paused: Set = hashSetOf( + "Hiatus", + "On Hold", + "Pausado", + "En espera", + "En pause", + "En attente", + ) + // Change these values only if the site does not support manga listings via ajax protected open val withoutAjax = false @@ -232,11 +244,11 @@ internal abstract class MadaraParser( ) }.orEmpty(), author = summary?.selectFirst(".mg_author")?.selectFirst("a")?.ownText(), - state = when (summary?.selectFirst(".mg_status")?.selectFirst(".summary-content")?.ownText() - ?.lowercase()) { + state = when (summary?.selectFirst(".mg_status")?.selectFirst(".summary-content")?.ownText()) { in ongoing -> MangaState.ONGOING in finished -> MangaState.FINISHED in abandoned -> MangaState.ABANDONED + in paused -> MangaState.PAUSED else -> null }, source = source, @@ -245,7 +257,7 @@ internal abstract class MadaraParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() val body = doc.body() val root1 = body.selectFirst("header")?.selectFirst("ul.second-menu") @@ -314,6 +326,7 @@ internal abstract class MadaraParser( in ongoing -> MangaState.ONGOING in finished -> MangaState.FINISHED in abandoned -> MangaState.ABANDONED + in paused -> MangaState.PAUSED else -> null } } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manga18Fx.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manga18Fx.kt index 11cd59e61..5547d042d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manga18Fx.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manga18Fx.kt @@ -5,9 +5,7 @@ import org.koitharu.kotatsu.parsers.MangaSourceParser import org.koitharu.kotatsu.parsers.model.* import org.koitharu.kotatsu.parsers.site.madara.MadaraParser import org.koitharu.kotatsu.parsers.util.* -import java.util.EnumSet -import java.util.HashSet -import java.util.Locale +import java.util.* @MangaSourceParser("MANGA18FX", "Manga18Fx", "", ContentType.HENTAI) internal class Manga18Fx(context: MangaLoaderContext) : @@ -15,7 +13,7 @@ internal class Manga18Fx(context: MangaLoaderContext) : override val sourceLocale: Locale = Locale.ENGLISH override val datePattern = "dd MMM yy" - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val listUrl = "" override val selectTestAsync = "ul.row-content-chapter" override val selectDate = "span.chapter-time" @@ -79,7 +77,7 @@ internal class Manga18Fx(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() val list = doc.body().selectFirstOrThrow("div.genre-menu").select("ul li").orEmpty() val keySet = HashSet(list.size) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manhwa18Cc.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manhwa18Cc.kt index 50f9c9f03..832748032 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manhwa18Cc.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/all/Manhwa18Cc.kt @@ -90,7 +90,7 @@ internal class Manhwa18Cc(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() val list = doc.body().selectFirstOrThrow("div.sub-menu").select("ul li").orEmpty() val keySet = HashSet(list.size) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/InstaManhwa.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/InstaManhwa.kt index fe21d595e..1febb7994 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/InstaManhwa.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/InstaManhwa.kt @@ -17,7 +17,7 @@ internal class InstaManhwa(context: MangaLoaderContext) : override val postReq = true override val datePattern = "d MMMM, yyyy" - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, SortOrder.UPDATED, SortOrder.NEWEST, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt index 3ef8acd1b..6464a2de5 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/IsekaiScan.kt @@ -17,7 +17,7 @@ internal class IsekaiScan(context: MangaLoaderContext) : override val listUrl = "latest-manga/" override val datePattern = "MMMM d, HH:mm" - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, SortOrder.UPDATED, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt index 45f97d76a..44e53ff66 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/en/MangaPure.kt @@ -16,7 +16,7 @@ internal class MangaPure(context: MangaLoaderContext) : override val listUrl = "latest-manga/" override val datePattern = "MMMM d, HH:mm" - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, SortOrder.UPDATED, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/DragonTranslationParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/DragonTranslationParser.kt index 59d5b5f4c..a4afe5176 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/DragonTranslationParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/DragonTranslationParser.kt @@ -14,7 +14,7 @@ import java.util.* internal class DragonTranslationParser(context: MangaLoaderContext) : MadaraParser(context, MangaSource.DRAGONTRANSLATION, "dragontranslation.net", 30) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val selectPage = "div#chapter_imgs img" diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt index b1e04c4f9..641b79f77 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/es/TmoManga.kt @@ -22,7 +22,7 @@ internal class TmoManga(context: MangaLoaderContext) : searchPaginator.firstPage = 1 } - override val sortOrders: Set = EnumSet.of(SortOrder.POPULARITY) + override val availableSortOrders: Set = EnumSet.of(SortOrder.POPULARITY) override suspend fun getListPage( page: Int, query: String?, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/ManhwaHub.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/ManhwaHub.kt index adb239621..36f06b33a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/ManhwaHub.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madara/id/ManhwaHub.kt @@ -105,7 +105,7 @@ internal class ManhwaHub(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain").parseHtml() return doc.select("div.genres li").mapNotNullToSet { li -> val a = li.selectFirst("a") ?: return@mapNotNullToSet null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt index d25942d16..2e795f130 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/madtheme/MadthemeParser.kt @@ -21,7 +21,7 @@ internal abstract class MadthemeParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, @@ -115,7 +115,7 @@ internal abstract class MadthemeParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() return doc.select("div.genres label.checkbox").mapNotNullToSet { checkbox -> val key = checkbox.selectFirstOrThrow("input").attr("value") ?: return@mapNotNullToSet null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt index 3b13ab1ca..3ec81dc27 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/Manga18Parser.kt @@ -20,7 +20,7 @@ internal abstract class Manga18Parser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, @@ -109,7 +109,7 @@ internal abstract class Manga18Parser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl/").parseHtml() return doc.select("div.grid_cate li").mapNotNullToSet { li -> val a = li.selectFirst("a") ?: return@mapNotNullToSet null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/zh/Hanman18.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/zh/Hanman18.kt index 967bc44db..a46b7e270 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/zh/Hanman18.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/manga18/zh/Hanman18.kt @@ -34,5 +34,5 @@ internal class Hanman18(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set = emptySet() // search by tag does not work + override suspend fun getAvailableTags(): Set = emptySet() // search by tag does not work } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt index 0db621e92..0954d6962 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/MangaboxParser.kt @@ -17,7 +17,7 @@ internal abstract class MangaboxParser( pageSize: Int = 24, ) : PagedMangaParser(context, source, pageSize) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST, @@ -107,7 +107,7 @@ internal abstract class MangaboxParser( protected open val selectTagMap = "div.panel-genres-list a:not(.genres-select)" - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() return doc.select(selectTagMap).mapNotNullToSet { a -> val key = a.attr("href").removeSuffix('/').substringAfterLast('/') diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangairo.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangairo.kt index d2a136646..51eb5e02f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangairo.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/Mangairo.kt @@ -99,7 +99,7 @@ internal class Mangairo(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl/type-latest/ctg-all/state-all/page-1").parseHtml() return doc.select("div.panel_category a:not(.ctg_select)").mapNotNullToSet { a -> val key = a.attr("href").substringAfterLast("ctg-").substringBefore("/") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/MangakakalotTv.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/MangakakalotTv.kt index fa77b4788..0531c0051 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/MangakakalotTv.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangabox/en/MangakakalotTv.kt @@ -73,7 +73,7 @@ internal class MangakakalotTv(context: MangaLoaderContext) : override val selectTagMap = "ul.tag li a" - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() return doc.select(selectTagMap).mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt index 0c573b3f8..a28442d6c 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/MangaReaderParser.kt @@ -29,7 +29,7 @@ internal abstract class MangaReaderParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.NEWEST) protected open val listUrl = "/manga" @@ -181,20 +181,24 @@ internal abstract class MangaReaderParser( val mangaState = state?.let { when (it.text()) { - "مستمرة", "En curso", "En Curso", "Ongoing", "OnGoing", "On going", "Ativo", "En Cours", "En cours", - "En cours \uD83D\uDFE2", "En cours de publication", "Đang tiến hành", "Em lançamento", "em lançamento", "Em Lançamento", - "Онгоінг", "Publishing", "Devam Ediyor", "Em Andamento", "In Corso", "Güncel", "Berjalan", "Продолжается", "Updating", - "Lançando", "In Arrivo", "Emision", "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "Publicando", "连载中", - "Devam ediyor", "Devam Etmekte", + + "مستمرة", "En curso", "En Curso", "Ongoing", "OnGoing", "On going", "Ativo", "En Cours", "En cours", "En cours \uD83D\uDFE2", + "En cours de publication", "Đang tiến hành", "Em lançamento", "em lançamento", "Em Lançamento", "Онгоінг", "Publishing", + "Devam Ediyor", "Em Andamento", "In Corso", "Güncel", "Berjalan", "Продолжается", "Updating", "Lançando", "In Arrivo", "Emision", + "En emision", "مستمر", "Curso", "En marcha", "Publicandose", "Publicando", "连载中", "Devam ediyor", "Devam Etmekte", -> MangaState.ONGOING - "Completed", "Completo", "Complété", "Fini", "Achevé", "Terminé", "Terminé ⚫", "Tamamlandı", "Đã hoàn thành", "Hoàn Thành", "مكتملة", - "Завершено", "Finished", "Finalizado", "Completata", "One-Shot", "Bitti", "Tamat", "Completado", "Concluído", "Concluido", "已完结", "Bitmiş", + "Completed", "Completo", "Complété", "Fini", "Achevé", "Terminé", "Terminé ⚫", "Tamamlandı", "Đã hoàn thành", "Hoàn Thành", + "مكتملة", "Завершено", "Finished", "Finalizado", "Completata", "One-Shot", "Bitti", "Tamat", "Completado", "Concluído", + "Concluido", "已完结", "Bitmiş", -> MangaState.FINISHED "Canceled", "Cancelled", "Cancelado", "cancellato", "Cancelados", "Dropped", "Discontinued", "abandonné", "Abandonné", -> MangaState.ABANDONED + "Hiatus", "On Hold", "Pausado", "En espera", "En pause", "En Pause", "En attente", + -> MangaState.PAUSED + else -> null } } @@ -283,7 +287,7 @@ internal abstract class MangaReaderParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return getOrCreateTagMap().values.toSet() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt index 946d0cc70..ae6863399 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/ManhwaFreak.kt @@ -75,7 +75,7 @@ internal class ManhwaFreak(context: MangaLoaderContext) : return parseMangaList(webClient.httpGet(url).parseHtml()) } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/genres/").parseHtml() return doc.select("ul.genre-list li a").mapNotNullToSet { a -> val href = a.attr("href").substringAfterLast("=") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt index 5c5eb31f7..c1eb518d7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/RizzComic.kt @@ -19,7 +19,7 @@ internal class RizzComic(context: MangaLoaderContext) : override val datePattern = "dd MMM yyyy" override val listUrl = "/series" - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.ALPHABETICAL) override suspend fun getListPage( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/Zahard.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/Zahard.kt index ac007d50b..ef1064cec 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/Zahard.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/en/Zahard.kt @@ -21,7 +21,7 @@ internal class Zahard(context: MangaLoaderContext) : override val selectPage = "div#chapter_imgs img" - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.NEWEST) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt index d9fc72502..06afc82ba 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/es/TuManhwas.kt @@ -19,10 +19,10 @@ internal class TuManhwas(context: MangaLoaderContext) : override val selectPage = "div#readerarea img" - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.NEWEST) - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() override suspend fun getListPage( page: Int, query: String?, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/ManhwaFreakFr.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/ManhwaFreakFr.kt index d4fc4794f..ac5a6929d 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/ManhwaFreakFr.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/fr/ManhwaFreakFr.kt @@ -77,7 +77,7 @@ internal class ManhwaFreakFr(context: MangaLoaderContext) : return parseMangaList(webClient.httpGet(url).parseHtml()) } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/genres/").parseHtml() return doc.select("ul.genre-list li a").mapNotNullToSet { a -> val href = a.attr("href").substringAfterLast("=") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt index c57ec637e..63fd834ff 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mangareader/id/Komikcast.kt @@ -18,7 +18,7 @@ internal class Komikcast(context: MangaLoaderContext) : override val listUrl = "/daftar-komik" override val datePattern = "MMM d, yyyy" override val sourceLocale: Locale = Locale.ENGLISH - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL) override suspend fun getListPage( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt index 0b934b708..86385d294 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/MmrcmsParser.kt @@ -20,7 +20,7 @@ internal abstract class MmrcmsParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, SortOrder.UPDATED, SortOrder.ALPHABETICAL, @@ -138,7 +138,7 @@ internal abstract class MmrcmsParser( } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$tagUrl/").parseHtml() return doc.select("ul.list-category li").mapNotNullToSet { li -> val a = li.selectFirst("a") ?: return@mapNotNullToSet null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/pt/Animaregia.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/pt/Animaregia.kt index 82434a9f3..1a1b0c54a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/pt/Animaregia.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/mmrcms/pt/Animaregia.kt @@ -22,7 +22,7 @@ internal class Animaregia(context: MangaLoaderContext) : override val sourceLocale: Locale = Locale.ENGLISH //temporary - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, SortOrder.ALPHABETICAL, ) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt index 89e94ec64..2845daec8 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/nepnep/NepnepParser.kt @@ -23,7 +23,7 @@ internal abstract class NepnepParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) override val headers: Headers = Headers.Builder() .add("User-Agent", UserAgents.CHROME_DESKTOP) @@ -104,7 +104,7 @@ internal abstract class NepnepParser( ) } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/search/").parseHtml() val tags = doc.selectFirstOrThrow("script:containsData(vm.AvailableFilters)").data() .substringAfter("\"Genre\"") @@ -138,12 +138,18 @@ internal abstract class NepnepParser( return manga.copy( altTitle = null, state = when (doc.selectFirstOrThrow(".list-group-item:contains(Status:) a").text()) { - "Ongoing (Scan)", "Ongoing (Publish)" -> MangaState.ONGOING + "Ongoing (Scan)", "Ongoing (Publish)", + -> MangaState.ONGOING + "Complete (Scan)", "Complete (Publish)", + -> MangaState.FINISHED + "Cancelled (Scan)", "Cancelled (Publish)", "Discontinued (Scan)", "Discontinued (Publish)", + -> MangaState.ABANDONED + "Hiatus (Scan)", "Hiatus (Publish)", - -> MangaState.FINISHED + -> MangaState.PAUSED else -> null }, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt index 04c2fc5ae..b4d6918c4 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/otakusanctuary/OtakuSanctuaryParser.kt @@ -20,7 +20,7 @@ internal abstract class OtakuSanctuaryParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.NEWEST, ) @@ -114,7 +114,7 @@ internal abstract class OtakuSanctuaryParser( protected open val selectBodyTag = "div#genre-table a" - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/Home/LoadingGenresMenu").parseHtml() return doc.select(selectBodyTag).mapNotNullToSet { a -> val href = a.attr("href").substringAfterLast("/").substringBefore("?") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/Bakai.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/Bakai.kt index 511f464e0..aee33c960 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/Bakai.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/Bakai.kt @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("BAKAI", "Bakai", "pt", ContentType.HENTAI) internal class Bakai(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BAKAI, 15) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("bakai.org") override val headers: Headers = Headers.Builder() .add("User-Agent", UserAgents.CHROME_MOBILE) @@ -89,7 +89,7 @@ internal class Bakai(context: MangaLoaderContext) : PagedMangaParser(context, Ma } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain").parseHtml() return doc.requireElementById("elNavigation_17_menu").select("li.ipsMenu_item a").mapNotNullToSet { a -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt index a894c0f57..688b63bb2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/BrMangas.kt @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("BRMANGAS", "BrMangas", "pt") internal class BrMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.BRMANGAS, 25) { - override val sortOrders: Set = EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.POPULARITY, SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("www.brmangas.net") @@ -81,7 +81,7 @@ internal class BrMangas(context: MangaLoaderContext) : PagedMangaParser(context, } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/lista-de-generos-de-manga/").parseHtml() return doc.select(".genres_page a").mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt index 5a87bf027..2f548ea3f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/LerMangaOnline.kt @@ -14,7 +14,7 @@ import java.util.* @MangaSourceParser("LERMANGAONLINE", "LerMangaOnline", "pt") class LerMangaOnline(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.LERMANGAONLINE, 20) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("lermangaonline.com.br") @@ -67,7 +67,7 @@ class LerMangaOnline(context: MangaLoaderContext) : PagedMangaParser(context, Ma } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/").parseHtml().requireElementById("sub-menu") return doc.select("ul.container li a").mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt index 2d561bdaf..dd41b478e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/MangaOnline.kt @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("MANGAONLINE", "MangaOnline.biz", "pt") class MangaOnline(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGAONLINE, 20) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("mangaonline.biz") @@ -71,7 +71,7 @@ class MangaOnline(context: MangaLoaderContext) : PagedMangaParser(context, Manga } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/generos/").parseHtml() return doc.select(".wp-content p a").mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt index 9d2fdc481..6ab8e4037 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/pt/YugenMangas.kt @@ -13,7 +13,7 @@ import java.util.* @MangaSourceParser("YUGENMANGAS", "YugenMangas.org", "pt") class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.YUGENMANGAS, 28) { - override val sortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL, SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("yugenmangas.org") override suspend fun getListPage( @@ -142,5 +142,5 @@ class YugenMangas(context: MangaLoaderContext) : PagedMangaParser(context, Manga return pages } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() } 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 ab529a69f..15db547e0 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 @@ -20,7 +20,7 @@ internal class DesuMeParser(context: MangaLoaderContext) : PagedMangaParser(cont override val configKeyDomain = ConfigKey.Domain("desu.me", "desu.win") - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST, @@ -148,7 +148,7 @@ internal class DesuMeParser(context: MangaLoaderContext) : PagedMangaParser(cont } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return tagsCache.get().values.toSet() } 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 56c16df1e..abdd1c871 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 @@ -30,7 +30,7 @@ internal class NudeMoonParser( } } - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.NEWEST, SortOrder.POPULARITY, SortOrder.RATING, @@ -144,7 +144,7 @@ internal class NudeMoonParser( return page.url.toAbsoluteUrl("img.$domain") } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val domain = domain val doc = webClient.httpGet("https://$domain/tags").parseHtml() val root = doc.body().getElementsByAttributeValue("name", "multitags").first() 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 5aeb808aa..95ac11744 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 @@ -47,7 +47,7 @@ internal class RemangaParser( override val authUrl: String get() = "https://${domain}/user/login" - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.RATING, @@ -221,7 +221,7 @@ internal class RemangaParser( return result } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val domain = domain val content = webClient.httpGet("https://api.$domain/api/forms/titles/?get=genres") .parseJson().getJSONObject("content").getJSONArray("genres") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt index 60fa95a5a..911e8e0a6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/grouple/GroupleParser.kt @@ -46,7 +46,7 @@ internal abstract class GroupleParser( override val headers: Headers = Headers.Builder().add("User-Agent", config[userAgentKey]).build() - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST, @@ -218,7 +218,7 @@ internal abstract class GroupleParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://${domain}/list/genres/sort_name").parseHtml() val root = doc.body().getElementById("mangaBox")?.selectFirst("div.leftContent")?.selectFirst("table.table") ?: doc.parseFailed("Cannot find root") 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 58848ec8e..ab88a6233 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 @@ -15,7 +15,7 @@ internal abstract class ChanParser( source: MangaSource, ) : MangaParser(context, source), MangaParserAuthProvider { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.NEWEST, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, @@ -126,7 +126,7 @@ internal abstract class ChanParser( doc.parseFailed("Pages list not found at ${chapter.url}") } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val domain = domain val doc = webClient.httpGet("https://$domain/mostfavorites&sort=manga").parseHtml() val root = doc.body().selectFirst("div.main_fon")?.getElementById("side") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/HenChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/HenChanParser.kt index f36442362..a9ec7b7e1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/HenChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/HenChanParser.kt @@ -21,7 +21,7 @@ internal class HenChanParser(context: MangaLoaderContext) : ChanParser(context, "hentaichan.pro", ) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.NEWEST, SortOrder.POPULARITY, SortOrder.RATING, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/YaoiChanParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/YaoiChanParser.kt index f2fd26830..ca87f21bc 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/YaoiChanParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ru/multichan/YaoiChanParser.kt @@ -17,7 +17,7 @@ internal class YaoiChanParser(context: MangaLoaderContext) : ChanParser(context, "yaoi-chan.me", ) - override val sortOrders: Set = setOf(SortOrder.NEWEST) + override val availableSortOrders: Set = setOf(SortOrder.NEWEST) override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() 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 722f2cca4..adcad3b95 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 @@ -32,7 +32,7 @@ internal open class MangaLibParser( override val authUrl: String get() = "https://$domain/login" - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.RATING, SortOrder.ALPHABETICAL, SortOrder.POPULARITY, @@ -232,7 +232,7 @@ internal open class MangaLibParser( } ?: concatUrl(defaultServer, pageUrl) } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val url = "https://$domain/manga-list" val doc = webClient.httpGet(url).parseHtml() val scripts = doc.body().select("script") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt index 093292952..3af8d4acd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/sinmh/SinmhParser.kt @@ -18,7 +18,7 @@ internal abstract class SinmhParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, ) @@ -101,7 +101,7 @@ internal abstract class SinmhParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() return doc.select(".filter-item:contains(按剧情) li a:not(.active)").mapNotNullToSet { a -> val href = a.attr("href").removeSuffix('/').substringAfterLast('/') diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt index 4a70b5de3..d55cb8a30 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/MangaAy.kt @@ -15,7 +15,7 @@ import java.util.* @MangaSourceParser("MANGAAY", "MangaAy", "tr") class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.MANGAAY, 45) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("manga-ay.com") @@ -93,7 +93,7 @@ class MangaAy(context: MangaLoaderContext) : PagedMangaParser(context, MangaSour private var tagCache: ArrayMap? = null private val mutex = Mutex() - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return getOrCreateTagMap().values.toSet() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt index 3e0594a30..381331bfd 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/SadScans.kt @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("SADSCANS", "SadScans", "tr") internal class SadScans(context: MangaLoaderContext) : MangaParser(context, MangaSource.SADSCANS) { - override val sortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) + override val availableSortOrders: Set = EnumSet.of(SortOrder.ALPHABETICAL) override val configKeyDomain = ConfigKey.Domain("sadscans.com") override suspend fun getList(offset: Int, query: String?, tags: Set?, sortOrder: SortOrder): List { @@ -46,7 +46,7 @@ internal class SadScans(context: MangaLoaderContext) : MangaParser(context, Mang } } - override suspend fun getTags(): Set = emptySet() + override suspend fun getAvailableTags(): Set = emptySet() override suspend fun getDetails(manga: Manga): Manga { val doc = webClient.httpGet(manga.url.toAbsoluteUrl(domain)).parseHtml() diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt index c79392b95..1d16a585e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/TrWebtoon.kt @@ -16,7 +16,7 @@ class TrWebtoon(context: MangaLoaderContext) : override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("trwebtoon.com") - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.POPULARITY, SortOrder.ALPHABETICAL, SortOrder.UPDATED) override suspend fun getListPage( @@ -112,7 +112,7 @@ class TrWebtoon(context: MangaLoaderContext) : return mangas } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val tags = webClient.httpGet("https://$domain/webtoon-listesi").parseHtml().requireElementById("collapseExample") .select(".pt-12 a").drop(1) diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/YaoiFlix.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/YaoiFlix.kt index 39e0f1d3b..ef915b6f1 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/YaoiFlix.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/tr/YaoiFlix.kt @@ -12,7 +12,7 @@ import java.util.* @MangaSourceParser("YAOIFLIX", "YaoiFlix", "tr", ContentType.HENTAI) class YaoiFlix(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.YAOIFLIX, 8) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) override val configKeyDomain = ConfigKey.Domain("www.yaoiflix.pro") @@ -79,7 +79,7 @@ class YaoiFlix(context: MangaLoaderContext) : PagedMangaParser(context, MangaSou } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain").parseHtml() return doc.select(".tags .cat-item a").mapNotNullToSet { a -> MangaTag( 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 126718fac..25df5f129 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 @@ -33,7 +33,7 @@ class HentaiUkrParser(context: MangaLoaderContext) : MangaParser(context, MangaS override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("hentaiukr.com") - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.NEWEST, ) @@ -119,7 +119,7 @@ class HentaiUkrParser(context: MangaLoaderContext) : MangaParser(context, MangaS } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return allManga.get().flatMapTo(HashSet()) { x -> x.getJSONArray("tags").mapJSON { t -> MangaTag( 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 1bde8e97e..0319651c8 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 @@ -37,7 +37,7 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("honey-manga.com.ua") - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.POPULARITY, SortOrder.NEWEST, ) @@ -166,7 +166,7 @@ class HoneyMangaParser(context: MangaLoaderContext) : PagedMangaParser(context, } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { // https://data.api.honey-manga.com.ua/genres-tags/genres-list val content = webClient.httpGet(genresListApi).parseJsonArray() val tagsSet = ArraySet(content.length()) 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 60468af67..29b216682 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 @@ -19,7 +19,7 @@ class MangaInUaParser(context: MangaLoaderContext) : PagedMangaParser( searchPageSize = 10, ) { - override val sortOrders: Set = setOf(SortOrder.UPDATED) + override val availableSortOrders: Set = setOf(SortOrder.UPDATED) override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("manga.in.ua") @@ -151,7 +151,7 @@ class MangaInUaParser(context: MangaLoaderContext) : PagedMangaParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val domain = domain val doc = webClient.httpGet("https://$domain/mangas").parseHtml() val root = doc.body().requireElementById("menu_1").selectFirstOrThrow("div.menu__wrapper") diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt index d78153604..3ec7263ba 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/BlogTruyenParser.kt @@ -22,7 +22,7 @@ class BlogTruyenParser(context: MangaLoaderContext) : override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("blogtruyenmoi.com") - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.UPDATED) override val headers: Headers = Headers.Builder() @@ -219,7 +219,7 @@ class BlogTruyenParser(context: MangaLoaderContext) : return pages } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return cacheTags.get().values.toSet() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt index 330f68916..54edb7a6e 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/HentaiVNParser.kt @@ -28,7 +28,7 @@ class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSo // hentaivn has created 2 different interfaces for mobile and desktop, and Cloudflare detects whether it's mobile or not even with a desktop user agent. override val headers: Headers = Headers.Builder().add("User-Agent", UserAgents.CHROME_MOBILE).build() - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.RATING, @@ -137,7 +137,7 @@ class HentaiVNParser(context: MangaLoaderContext) : MangaParser(context, MangaSo private var tagCache: ArrayMap? = null private val mutex = Mutex() - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return getOrCreateTagMap().values.toSet() } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt index 10c8aa903..6fdd9b0af 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/LxManga.kt @@ -14,7 +14,7 @@ import java.util.* @MangaSourceParser("LXMANGA", "LxManga", "vi") internal class LxManga(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.LXMANGA, 60) { - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.ALPHABETICAL, SortOrder.UPDATED, SortOrder.NEWEST, @@ -150,7 +150,7 @@ internal class LxManga(context: MangaLoaderContext) : PagedMangaParser(context, } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/").parseHtml() val body = doc.body() return body.select("ul.absolute.w-full a").mapToSet { a -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NetTruyenParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NetTruyenParser.kt index a7ed93da7..db799ac04 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NetTruyenParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/NetTruyenParser.kt @@ -26,7 +26,7 @@ class NetTruyenParser(context: MangaLoaderContext) : "nettruyenin.com", ) - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST, SortOrder.RATING) private val mutex = Mutex() @@ -194,7 +194,7 @@ class NetTruyenParser(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val map = getOrCreateTagMap() val tagSet = ArraySet(map.size) for (entry in map) { diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt index b307ff318..6341e2be6 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/Truyenqq.kt @@ -12,7 +12,8 @@ import java.util.* @MangaSourceParser("TRUYENQQ", "Truyenqq", "vi") internal class Truyenqq(context: MangaLoaderContext) : PagedMangaParser(context, MangaSource.TRUYENQQ, 42) { - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST) + override val availableSortOrders: Set = + EnumSet.of(SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.NEWEST) override val configKeyDomain = ConfigKey.Domain("truyenqqvn.com") override suspend fun getListPage( @@ -67,7 +68,7 @@ internal class Truyenqq(context: MangaLoaderContext) : PagedMangaParser(context, } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/tim-kiem-nang-cao.html").parseHtml() return doc.select(".advsearch-form div.genre-item").mapNotNullToSet { MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyentranhLHParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyentranhLHParser.kt index 65c3447b6..640a089b7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyentranhLHParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/TruyentranhLHParser.kt @@ -18,7 +18,7 @@ class TruyentranhLHParser(context: MangaLoaderContext) : PagedMangaParser(context, source = MangaSource.TRUYENTRANHLH, pageSize = 18) { override val configKeyDomain: ConfigKey.Domain = ConfigKey.Domain("truyentranhlh.net") - override val sortOrders: Set = EnumSet.allOf(SortOrder::class.java) + override val availableSortOrders: Set = EnumSet.allOf(SortOrder::class.java) private val mutex = Mutex() private var tagCache: Map? = null @@ -130,7 +130,7 @@ class TruyentranhLHParser(context: MangaLoaderContext) : } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return ArraySet(getOrCreateTagMap().values) } diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt index bf77e787a..1cdd0b6e2 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vi/YurinekoParser.kt @@ -38,7 +38,7 @@ class YurinekoParser(context: MangaLoaderContext) : PagedMangaParser(context, Ma override val configKeyDomain: ConfigKey.Domain get() = ConfigKey.Domain("yurineko.net") - override val sortOrders: Set + override val availableSortOrders: Set get() = EnumSet.of(SortOrder.UPDATED) private val apiDomain @@ -138,7 +138,7 @@ class YurinekoParser(context: MangaLoaderContext) : PagedMangaParser(context, Ma } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { return webClient.httpGet("https://$apiDomain/tag/find?query=") .parseJsonArray() .mapJSONToSet { jo -> diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt index 5fa9d06c7..5cbd58441 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/vmp/VmpParser.kt @@ -16,7 +16,7 @@ internal abstract class VmpParser( ) : PagedMangaParser(context, source, pageSize) { override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of(SortOrder.UPDATED) + override val availableSortOrders: Set = EnumSet.of(SortOrder.UPDATED) protected open val listUrl = "xxx/" protected open val geneUrl = "genero/" @@ -73,7 +73,7 @@ internal abstract class VmpParser( } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() return doc.select("div.tagcloud a").mapNotNullToSet { a -> MangaTag( diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt index 6906942da..952f365f7 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/WpComicsParser.kt @@ -21,7 +21,9 @@ internal abstract class WpComicsParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val isMultipleTagsSupported = false + + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.NEWEST, SortOrder.POPULARITY, @@ -104,7 +106,7 @@ internal abstract class WpComicsParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain$listUrl").parseHtml() return doc.select("div.genres ul li:not(.active)").mapNotNullToSet { li -> val a = li.selectFirst("a") ?: return@mapNotNullToSet null diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt index 80641d34b..581cacfaa 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/wpcomics/en/XoxoComics.kt @@ -14,7 +14,7 @@ internal class XoxoComics(context: MangaLoaderContext) : override val listUrl = "/genre" override val datePattern = "MM/dd/yyyy" - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.NEWEST, SortOrder.POPULARITY, diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt index ec1aa9c2f..486f0b25a 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/zmanga/ZMangaParser.kt @@ -21,7 +21,7 @@ internal abstract class ZMangaParser( override val configKeyDomain = ConfigKey.Domain(domain) - override val sortOrders: Set = EnumSet.of( + override val availableSortOrders: Set = EnumSet.of( SortOrder.UPDATED, SortOrder.POPULARITY, SortOrder.ALPHABETICAL, @@ -117,7 +117,7 @@ internal abstract class ZMangaParser( } } - override suspend fun getTags(): Set { + override suspend fun getAvailableTags(): Set { val doc = webClient.httpGet("https://$domain/$listUrl").parseHtml() return doc.select("tr.gnrx div.custom-control").mapNotNullToSet { checkbox -> val key = checkbox.selectFirstOrThrow("input").attr("value") ?: return@mapNotNullToSet null diff --git a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt index 2e9c5ef15..124b6850f 100644 --- a/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt +++ b/src/test/kotlin/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -73,7 +73,7 @@ internal class MangaParserTest { @MangaSources fun tags(source: MangaSource) = runTest { val parser = context.newParserInstance(source) - val tags = parser.getTags() + val tags = parser.getAvailableTags() assert(tags.isNotEmpty()) { "No tags found" } val keys = tags.map { it.key } assert(keys.isDistinct()) @@ -93,7 +93,7 @@ internal class MangaParserTest { @MangaSources fun tagsMultiple(source: MangaSource) = runTest { val parser = context.newParserInstance(source) - val tags = parser.getTags().shuffled().take(2).toSet() + val tags = parser.getAvailableTags().shuffled().take(2).toSet() val list = try { parser.getList(offset = 0, tags = tags, sortOrder = null)