diff --git a/src/en/mangarock/build.gradle b/src/en/mangarock/build.gradle index 17d633c4b..cef241da4 100644 --- a/src/en/mangarock/build.gradle +++ b/src/en/mangarock/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Manga Rock' pkgNameSuffix = "en.mangarock" extClass = '.MangaRock' - extVersionCode = 1 + extVersionCode = 2 extVersionSuffix = 1 libVersion = '1.0' } diff --git a/src/en/mangarock/src/eu/kanade/tachiyomi/extension/en/mangarock/MangaRock.kt b/src/en/mangarock/src/eu/kanade/tachiyomi/extension/en/mangarock/MangaRock.kt index bd0689bef..1bc04c07a 100644 --- a/src/en/mangarock/src/eu/kanade/tachiyomi/extension/en/mangarock/MangaRock.kt +++ b/src/en/mangarock/src/eu/kanade/tachiyomi/extension/en/mangarock/MangaRock.kt @@ -58,21 +58,56 @@ class MangaRock : HttpSource() { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { val jsonType = MediaType.parse("application/jsonType; charset=utf-8") + + // Filter + if (query.isBlank()) { + var status = "" + var rank = "" + var orderBy = "" + var genres = "" + filters.forEach { filter -> + when (filter) { + is StatusFilter -> { + status = filter.toUriPart() + } + is RankFilter -> { + rank = filter.toUriPart() + } + is SortBy -> { + orderBy = filter.toUriPart() + } + is GenreList -> { + genres = filter.state + .filter { genre -> genre.state != Filter.TriState.STATE_IGNORE } + .map { genre -> + "\"${genre.id}\": ${if (genre.state == Filter.TriState.STATE_INCLUDE) "true" else "false"}" + } + .joinToString(",") + } + } + } + + val body = RequestBody.create(jsonType, "{\"status\":\"$status\",\"genres\":{$genres},\"rank\":\"$rank\",\"order\":\"$orderBy\"}") + return POST("$baseUrl/mrs_filter", headers, body) + } + + // Regular search val body = RequestBody.create(jsonType, "{\"type\":\"series\", \"keywords\":\"$query\"}") return POST("$baseUrl/mrs_search", headers, body) } override fun searchMangaParse(response: Response): MangasPage { - val obj = JSONObject(response.body()!!.string()).getJSONArray("data") + val idArray = JSONObject(response.body()!!.string()).getJSONArray("data") val jsonType = MediaType.parse("application/jsonType; charset=utf-8") - val body = RequestBody.create(jsonType, obj.toString()) + val body = RequestBody.create(jsonType, idArray.toString()) val metaRes = client.newCall(POST("https://api.mangarockhd.com/meta", headers, body)).execute().body()!!.string() val res = JSONObject(metaRes).getJSONObject("data") val mangas = ArrayList(res.length()) - for (key in res.keys()) { - mangas.add(parseMangaJson(res.getJSONObject(key))) + for (i in 0 until idArray.length()) { + val id = idArray.get(i).toString() + mangas.add(parseMangaJson(res.getJSONObject(id))) } return MangasPage(mangas, false) } @@ -162,8 +197,7 @@ class MangaRock : HttpSource() { return pages } - override fun imageUrlParse(response: Response) - = throw UnsupportedOperationException("This method should not be called!") + override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("This method should not be called!") // See drawWebpToCanvas function in the site's client.js file // Extracted code: https://jsfiddle.net/6h2sLcs4/30/ @@ -202,20 +236,43 @@ class MangaRock : HttpSource() { return buffer } - // "{\"status\":\"all\",\"genres\":{},\"rank\":\"all\",\"order\":\"rank\"}" - private class Status : Filter.Select("Completed", arrayOf("all", "completed", "ongoing")) - private class Rank : Filter.Select("Rank", arrayOf("All", "1-999", "1000-2000")) - private class OrderBy : Filter.Select("Order", arrayOf("name", "rank")) + private class StatusFilter : UriPartFilter("Completed", arrayOf( + Pair("All", "all"), + Pair("Completed", "completed"), + Pair("Ongoing", "ongoing") + )) - private class Genre(name: String, id: String) : Filter.TriState(name) + private class RankFilter : UriPartFilter("Rank", arrayOf( + Pair("All", "all"), + Pair("1 - 999", "1-999"), + Pair("1k - 2k", "1000-2000"), + Pair("2k - 3k", "2000-3000"), + Pair("3k - 4k", "3000-4000"), + Pair("4k - 5k", "4000-5000"), + Pair("5k - 6k", "5000-6000"), + Pair("6k - 7k", "6000-7000"), + Pair("7k - 8k", "7000-8000"), + Pair("8k - 9k", "8000-9000"), + Pair("9k - 19k", "9000-10000"), + Pair("10k - 11k", "10000-11000") + )) + + private class SortBy : UriPartFilter("Sort by", arrayOf( + Pair("Name", "name"), + Pair("Rank", "rank") + )) + + private class Genre(name: String, val id: String) : Filter.TriState(name) private class GenreList(genres: List) : Filter.Group("Genres", genres) - // TODO: can only filter by status/genres/rank/ordering if you get the full list of manga override fun getFilterList() = FilterList( -// Status(), -// Rank(), -// OrderBy(), -// GenreList(getGenreList()) + // Search and filter don't work at the same time + Filter.Header("NOTE: Ignored if using text search!"), + Filter.Separator(), + StatusFilter(), + RankFilter(), + SortBy(), + GenreList(getGenreList()) ) // [... new Set($$('a[href^="/genre"]').filter(a => a.innerText !== '').map(a => `Genre("${a.innerText}", "${a.href.replace('https://mangarock.com/genre/', '')}")`))].sort().join(',\n') @@ -269,4 +326,9 @@ class MangaRock : HttpSource() { Genre("Yuri", "mrs-genre-304690") ) + private open class UriPartFilter(displayName: String, val vals: Array>) : + Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { + fun toUriPart() = vals[state].second + } + }