diff --git a/src/en/mangakakalot/build.gradle b/src/en/mangakakalot/build.gradle index e4faee801..d2678d5f0 100644 --- a/src/en/mangakakalot/build.gradle +++ b/src/en/mangakakalot/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: MangaKakalot' pkgNameSuffix = 'en.mangakakalot' extClass = '.Mangakakalot' - extVersionCode = 6 + extVersionCode = 7 libVersion = '1.2' } diff --git a/src/en/mangakakalot/src/eu/kanade/tachiyomi/extension/en/mangakakalot/Mangakakalot.kt b/src/en/mangakakalot/src/eu/kanade/tachiyomi/extension/en/mangakakalot/Mangakakalot.kt index a1698878b..cb114696b 100644 --- a/src/en/mangakakalot/src/eu/kanade/tachiyomi/extension/en/mangakakalot/Mangakakalot.kt +++ b/src/en/mangakakalot/src/eu/kanade/tachiyomi/extension/en/mangakakalot/Mangakakalot.kt @@ -1,13 +1,13 @@ package eu.kanade.tachiyomi.extension.en.mangakakalot import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.model.* import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl import okhttp3.OkHttpClient import okhttp3.Request +import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import java.text.ParseException @@ -58,9 +58,24 @@ class Mangakakalot : ParsedHttpSource() { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { // Site ignores everything after the first word val substringBefore = query.replace(" ", "_").replace(",", "_").replace(":", "_") - val url = "$baseUrl/search/$substringBefore?page=$page" - return GET(url, headers) - } + val url = HttpUrl.parse("$baseUrl/manga_list")!!.newBuilder() + url.addQueryParameter("page", page.toString()) + filters.forEach { filter -> + when (filter) { + is SortFilter -> { + url.addQueryParameter("type", filter.toUriPart()) + } + is StatusFilter -> { + url.addQueryParameter("state", filter.toUriPart()) + } + is GenreFilter -> { + url.addQueryParameter("category", filter.toUriPart()) + } + } + } + return if(query.isNotBlank()) { + GET("$baseUrl/search/$substringBefore?page=$page") + } else GET(url.build().toString(), headers) } override fun searchMangaSelector() = ".panel_story_list .story_item" @@ -68,6 +83,22 @@ class Mangakakalot : ParsedHttpSource() { override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + override fun searchMangaParse(response: Response): MangasPage { + val document = response.asJsoup() + val mangaSelector = if (document.select(searchMangaSelector()).isNotEmpty()) { + searchMangaSelector() + } else { + popularMangaSelector() + } + val mangas = document.select(mangaSelector).map { element -> + searchMangaFromElement(element) + } + val hasNextPage = searchMangaNextPageSelector().let { selector -> + document.select(selector).first() + } != null + return MangasPage(mangas, hasNextPage) + } + override fun mangaDetailsRequest(manga: SManga): Request { if (manga.url.startsWith("http")) { return GET(manga.url, headers) @@ -168,6 +199,73 @@ class Mangakakalot : ParsedHttpSource() { override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("No used") - override fun getFilterList() = FilterList() + override fun getFilterList() = FilterList( + Filter.Header("NOTE: Ignored if using text search!"), + Filter.Separator(), + SortFilter(), + StatusFilter(), + GenreFilter() + ) + private class SortFilter : UriPartFilter("Sort", arrayOf( + Pair("latest", "Latest"), + Pair("newest", "Newest"), + Pair("topview", "Top read") + )) + + private class StatusFilter : UriPartFilter("Status", arrayOf( + Pair("all", "ALL"), + Pair("completed", "Completed"), + Pair("ongoing", "Ongoing"), + Pair("drop", "Dropped") + )) + + private class GenreFilter : UriPartFilter("Category", arrayOf( + Pair("all", "ALL"), + Pair("2", "Action"), + Pair("3", "Adult"), + Pair("4", "Adventure"), + Pair("6", "Comedy"), + Pair("7", "Cooking"), + Pair("9", "Doujinshi"), + Pair("10", "Drama"), + Pair("11", "Ecchi"), + Pair("12", "Fantasy"), + Pair("13", "Gender bender"), + Pair("14", "Harem"), + Pair("15", "Historical"), + Pair("16", "Horror"), + Pair("45", "Isekai"), + Pair("17", "Josei"), + Pair("44", "Manhua"), + Pair("43", "Manhwa"), + Pair("19", "Martial arts"), + Pair("20", "Mature"), + Pair("21", "Mecha"), + Pair("22", "Medical"), + Pair("24", "Mystery"), + Pair("25", "One shot"), + Pair("26", "Psychological"), + Pair("27", "Romance"), + Pair("28", "School life"), + Pair("29", "Sci fi"), + Pair("30", "Seinen"), + Pair("31", "Shoujo"), + Pair("32", "Shoujo ai"), + Pair("33", "Shounen"), + Pair("34", "Shounen ai"), + Pair("35", "Slice of life"), + Pair("36", "Smut"), + Pair("37", "Sports"), + Pair("38", "Supernatural"), + Pair("39", "Tragedy"), + Pair("40", "Webtoons"), + Pair("41", "Yaoi"), + Pair("42", "Yuri") + )) + + private open class UriPartFilter(displayName: String, val vals: Array>) : + Filter.Select(displayName, vals.map { it.second }.toTypedArray()) { + fun toUriPart() = vals[state].first + } }