add filter on bentomanga

add filter on ninemanga
pull/401/head
devi 2 years ago
parent 1293233ad9
commit ab2aad6bd0

@ -35,6 +35,11 @@ internal abstract class NineMangaParser(
SortOrder.POPULARITY, SortOrder.POPULARITY,
) )
override val availableStates: Set<MangaState> = EnumSet.of(
MangaState.ONGOING,
MangaState.FINISHED,
)
override fun intercept(chain: Interceptor.Chain): Response { override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request() val request = chain.request()
val newRequest = if (request.url.host == domain) { val newRequest = if (request.url.host == domain) {
@ -45,38 +50,61 @@ internal abstract class NineMangaParser(
return chain.proceed(newRequest) return chain.proceed(newRequest)
} }
override suspend fun getListPage( override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
val url = buildString { val url = buildString {
append("https://") append("https://")
append(domain) append(domain)
when { when (filter) {
!query.isNullOrEmpty() -> { is MangaListFilter.Search -> {
append("/search/?name_sel=&wd=") append("/search/?name_sel=&wd=")
append(query.urlEncoded()) append(filter.query.urlEncoded())
append("&page=") append("&page=")
append(page)
append(".html")
} }
!tags.isNullOrEmpty() -> { is MangaListFilter.Advanced -> {
if (filter.tags.isNotEmpty()) {
append("/search/?category_id=") append("/search/?category_id=")
for (tag in tags) { for (tag in filter.tags) {
append(tag.key) append(tag.key)
append(',') append(',')
} }
filter.states.oneOrThrowIfMany()?.let {
append("&completed_series=")
when (it) {
MangaState.ONGOING -> append("no")
MangaState.FINISHED -> append("yes")
else -> append("either")
}
}
append("&page=") append("&page=")
} else {
append("/category/")
if (filter.states.isNotEmpty()) {
filter.states.oneOrThrowIfMany()?.let {
when (it) {
MangaState.ONGOING -> append("updated_")
MangaState.FINISHED -> append("completed_")
else -> append("either")
} }
}
else -> { } else {
append("/category/index_") append("index_")
} }
} }
append(page) append(page)
append(".html") append(".html")
} }
null -> {
append("/category/index_")
append(page)
append(".html")
}
}
}
val doc = webClient.httpGet(url).parseHtml() val doc = webClient.httpGet(url).parseHtml()
val root = doc.body().selectFirst("ul.direlist") ?: doc.parseFailed("Cannot find root") val root = doc.body().selectFirst("ul.direlist") ?: doc.parseFailed("Cannot find root")
val baseHost = root.baseUri().toHttpUrl().host val baseHost = root.baseUri().toHttpUrl().host

@ -28,23 +28,28 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(
override val configKeyDomain = ConfigKey.Domain("bentomanga.com", "www.bentomanga.com") override val configKeyDomain = ConfigKey.Domain("bentomanga.com", "www.bentomanga.com")
override val availableStates: Set<MangaState> = EnumSet.allOf(MangaState::class.java)
init { init {
paginator.firstPage = 0 paginator.firstPage = 0
searchPaginator.firstPage = 0 searchPaginator.firstPage = 0
} }
override suspend fun getListPage( override suspend fun getListPage(page: Int, filter: MangaListFilter?): List<Manga> {
page: Int,
query: String?,
tags: Set<MangaTag>?,
sortOrder: SortOrder,
): List<Manga> {
val url = urlBuilder() val url = urlBuilder()
.host(domain)
.addPathSegment("manga_list") .addPathSegment("manga_list")
.addQueryParameter("limit", page.toString()) .addQueryParameter("limit", page.toString())
.addQueryParameter( when (filter) {
is MangaListFilter.Search -> {
url.addQueryParameter("search", filter.query)
}
is MangaListFilter.Advanced -> {
url.addQueryParameter(
"order_by", "order_by",
when (sortOrder) { when (filter.sortOrder) {
SortOrder.UPDATED -> "update" SortOrder.UPDATED -> "update"
SortOrder.POPULARITY -> "views" SortOrder.POPULARITY -> "views"
SortOrder.RATING -> "top" SortOrder.RATING -> "top"
@ -52,11 +57,26 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(
SortOrder.ALPHABETICAL -> "name" SortOrder.ALPHABETICAL -> "name"
}, },
) )
if (!tags.isNullOrEmpty()) {
url.addQueryParameter("withCategories", tags.joinToString(",") { it.key }) if (filter.tags.isNotEmpty()) {
url.addQueryParameter("withCategories", filter.tags.joinToString(",") { it.key })
}
filter.states.oneOrThrowIfMany()?.let {
url.addQueryParameter(
"state",
when (it) {
MangaState.ONGOING -> "1"
MangaState.FINISHED -> "2"
MangaState.PAUSED -> "3"
MangaState.ABANDONED -> "5"
},
)
} }
if (!query.isNullOrEmpty()) {
url.addQueryParameter("search", query) }
null -> url.addQueryParameter("order_by", "update")
} }
val root = webClient.httpGet(url.build()).parseHtml().requireElementById("mangas_content") val root = webClient.httpGet(url.build()).parseHtml().requireElementById("mangas_content")
return root.select(".manga[data-manga]").map { div -> return root.select(".manga[data-manga]").map { div ->
@ -109,7 +129,7 @@ internal class BentomangaParser(context: MangaLoaderContext) : PagedMangaParser(
"En pause" -> MangaState.PAUSED "En pause" -> MangaState.PAUSED
else -> null else -> null
}, },
author = root.selectFirst(".datas_more-authors-people")?.textOrNull().assertNotNull("author"), author = root.selectFirst(".datas_more-authors-people")?.textOrNull(),
chapters = run { chapters = run {
val input = root.selectFirst("input[name=\"limit\"]") ?: return@run parseChapters(root) val input = root.selectFirst("input[name=\"limit\"]") ?: return@run parseChapters(root)
val max = input.attr("max").toInt() val max = input.attr("max").toInt()

Loading…
Cancel
Save