From 5fff2adbfb10d53ab30ded58d880d4bc19a2dd31 Mon Sep 17 00:00:00 2001 From: devi Date: Sat, 25 Nov 2023 17:57:38 +0100 Subject: [PATCH] MadaraParser add filter.states - Some sources madara, need to be changed too --- .../parsers/site/madara/MadaraParser.kt | 144 ++++++++++++------ 1 file changed, 100 insertions(+), 44 deletions(-) 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 1efb0be5..1bf55d38 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 @@ -33,6 +33,8 @@ internal abstract class MadaraParser( SortOrder.RATING, ) + override val availableStates: Set = EnumSet.allOf(MangaState::class.java) + protected open val tagPrefix = "manga-genre/" protected open val datePattern = "MMMM d, yyyy" protected open val stylePage = "?style=list" @@ -155,67 +157,121 @@ internal abstract class MadaraParser( // can be changed to retrieve tags see getTags protected open val listUrl = "manga/" - override suspend fun getListPage( - page: Int, - query: String?, - tags: Set?, - sortOrder: SortOrder, - ): List { - val tag = tags.oneOrThrowIfMany() + override suspend fun getListPage(page: Int, filter: MangaListFilter?): List { + val doc = if (withoutAjax) { + val pages = page + 1 + val url = buildString { append("https://") append(domain) - val pages = page + 1 - if (!tags.isNullOrEmpty()) { - append("/$tagPrefix") - append(tag?.key.orEmpty()) - if (pages > 1) { - append("/page/") - append(pages.toString()) + + when (filter) { + + is MangaListFilter.Search -> { + if (pages > 1) { + append("/page/") + append(pages.toString()) + } + append("/?s=") + append(filter.query.urlEncoded()) + append("&post_type=wp-manga") } - append("?") - } else { - append("/page/") - append(pages) - append("/?s=") - if (!query.isNullOrEmpty()) { - append(query.urlEncoded()) + + is MangaListFilter.Advanced -> { + + val tag = filter.tags.oneOrThrowIfMany() + if (filter.tags.isNotEmpty()) { + append("/$tagPrefix") + append(tag?.key.orEmpty()) + if (pages > 1) { + append("/page/") + append(pages.toString()) + } + append("/?") + } else { + + if (pages > 1) { + append("/page/") + append(pages.toString()) + } + append("/?s=&post_type=wp-manga") + filter.states.forEach { + append("&status[]=") + when (it) { + MangaState.ONGOING -> append("on-going") + MangaState.FINISHED -> append("end") + MangaState.ABANDONED -> append("canceled") + MangaState.PAUSED -> append("on-hold") + } + } + append("&") + } + + append("m_orderby=") + when (filter.sortOrder) { + SortOrder.POPULARITY -> append("views") + SortOrder.UPDATED -> append("latest") + SortOrder.NEWEST -> append("new-manga") + SortOrder.ALPHABETICAL -> append("alphabet") + SortOrder.RATING -> append("rating") + } + } + + null -> { + append("?s&post_type=wp-manga&m_orderby=latest") } - append("&post_type=wp-manga&") - /// &status[]= ( on-going - end - canceled - on-hold - upcoming ) - } - append("m_orderby=") - when (sortOrder) { - SortOrder.POPULARITY -> append("views") - SortOrder.UPDATED -> append("latest") - SortOrder.NEWEST -> append("new-manga") - SortOrder.ALPHABETICAL -> append("alphabet") - SortOrder.RATING -> append("rating") } } webClient.httpGet(url).parseHtml() } else { - val payload = if (sortOrder == SortOrder.RATING) { + val payload = if (filter?.sortOrder == SortOrder.RATING) { createRequestTemplate(ratingRequest) } else { createRequestTemplate(defaultRequest) } - when (sortOrder) { - SortOrder.POPULARITY -> payload["vars[meta_key]"] = "_wp_manga_views" - SortOrder.UPDATED -> payload["vars[meta_key]"] = "_latest_update" - SortOrder.NEWEST -> payload["vars[meta_key]"] = "" - SortOrder.ALPHABETICAL -> { - payload["vars[orderby]"] = "post_title" - payload["vars[order]"] = "ASC" + + payload["page"] = page.toString() + + when (filter) { + + is MangaListFilter.Search -> { + payload["vars[s]"] = filter.query.urlEncoded() + } + + is MangaListFilter.Advanced -> { + + val tag = filter.tags.oneOrThrowIfMany() + payload["vars[wp-manga-genre]"] = tag?.key.orEmpty() + + when (filter.sortOrder) { + SortOrder.POPULARITY -> payload["vars[meta_key]"] = "_wp_manga_views" + SortOrder.UPDATED -> payload["vars[meta_key]"] = "_latest_update" + SortOrder.NEWEST -> payload["vars[meta_key]"] = "" + SortOrder.ALPHABETICAL -> { + payload["vars[orderby]"] = "post_title" + payload["vars[order]"] = "ASC" + } + + SortOrder.RATING -> {} + } + + filter.states.forEach { + payload["vars[meta_query][0][0][value][]"] = + when (it) { + MangaState.ONGOING -> "on-going" + MangaState.FINISHED -> "end" + MangaState.ABANDONED -> "canceled" + MangaState.PAUSED -> "on-hold" + } + } } - SortOrder.RATING -> {} + null -> { + payload["vars[meta_key]"] = "_latest_update" + } } - payload["page"] = page.toString() - payload["vars[wp-manga-genre]"] = tag?.key.orEmpty() - payload["vars[s]"] = query?.urlEncoded().orEmpty() - /// payload["vars[meta_query][0][0][value][]"] = ( on-going - end - canceled - on-hold - upcoming ) + webClient.httpPost( "https://$domain/wp-admin/admin-ajax.php", payload,