From 97ac680c51259eca08d306c017a1826cb66fb0ea Mon Sep 17 00:00:00 2001 From: happywillow0 <45346080+happywillow0@users.noreply.github.com> Date: Thu, 14 Nov 2019 07:24:33 -0500 Subject: [PATCH] Mangamx - Add Filters (#1781) Mangamx - Add Filters --- src/es/mangamx/build.gradle | 2 +- .../tachiyomi/extension/es/mangamx/MangaMx.kt | 153 +++++++++++++++++- 2 files changed, 149 insertions(+), 6 deletions(-) diff --git a/src/es/mangamx/build.gradle b/src/es/mangamx/build.gradle index 1d27cb51a..c1f6d5a4c 100644 --- a/src/es/mangamx/build.gradle +++ b/src/es/mangamx/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: MangaMx' pkgNameSuffix = 'es.mangamx' extClass = '.MangaMx' - extVersionCode = 2 + extVersionCode = 3 libVersion = '1.2' } diff --git a/src/es/mangamx/src/eu/kanade/tachiyomi/extension/es/mangamx/MangaMx.kt b/src/es/mangamx/src/eu/kanade/tachiyomi/extension/es/mangamx/MangaMx.kt index fbcee03de..520b100b4 100644 --- a/src/es/mangamx/src/eu/kanade/tachiyomi/extension/es/mangamx/MangaMx.kt +++ b/src/es/mangamx/src/eu/kanade/tachiyomi/extension/es/mangamx/MangaMx.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.extension.es.mangamx +import android.net.Uri import com.github.salomonbrys.kotson.get import com.github.salomonbrys.kotson.string import com.google.gson.JsonElement @@ -11,7 +12,6 @@ import eu.kanade.tachiyomi.source.model.* import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.util.asJsoup import okhttp3.FormBody -import okhttp3.HttpUrl import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document @@ -33,14 +33,25 @@ class MangaMx : ParsedHttpSource() { override fun popularMangaNextPageSelector() = "a[href*=directorio]:containsOwn(Última)" override fun latestUpdatesNextPageSelector() = "a[href*=reciente]:containsOwn(Última)" - override fun searchMangaNextPageSelector() = "a[href*=/?s]:containsOwn(Última)" + override fun searchMangaNextPageSelector() = "a[href*=/?s]:containsOwn(Última), a[href*=directorio]:containsOwn(Última)" override fun popularMangaRequest(page: Int) = GET("$baseUrl/directorio/?orden=visitas&p=$page", headers) override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/reciente/capitulos?p=$page", headers) override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = HttpUrl.parse("$baseUrl/?s=$query")?.newBuilder() - return GET(url.toString(), headers) + val uri = if (query.isNotBlank()) { + Uri.parse(baseUrl).buildUpon() + .appendQueryParameter("s", query) + } else { + val uri = Uri.parse("$baseUrl/directorio").buildUpon() + //Append uri filters + filters.forEach { + if (it is UriFilter) + it.addToUri(uri) + } + uri.appendQueryParameter("p", page.toString()) + } + return GET(uri.toString(), headers) } //override fun mangaDetailsRequest(manga: SManga) = GET(baseUrl + manga.url, headers) @@ -151,7 +162,139 @@ class MangaMx : ParsedHttpSource() { override fun pageListParse(document: Document)= throw Exception("Not Used") override fun imageUrlParse(document: Document) = throw Exception("Not Used") - //TODO Genre Filter Request #1756 + override fun getFilterList() = FilterList( + Filter.Header("NOTA: ¡Ignorado si usa la búsqueda de texto!"), + Filter.Separator(), + GenreFilter(), + LetterFilter(), + StatusFilter(), + TypeFilter(), + AdultFilter(), + SortFilter() + ) + private class GenreFilter : UriPartFilter("Género", "genero", arrayOf( + Pair("all","All"), + Pair("3","Acción"), + Pair("35","Artes Marciales"), + Pair("7","Aventura"), + Pair("31","Ciencia ficción"), + Pair("1","Comedia"), + Pair("37","Demonios"), + Pair("10","Deportes"), + Pair("2","Drama"), + Pair("6","Ecchi"), + Pair("42","Eroge"), + Pair("4","Escolar"), + Pair("12","Fantasía"), + Pair("20","Ficción"), + Pair("14","Gore"), + Pair("21","Harem"), + Pair("27","Histórico"), + Pair("36","Horror"), + Pair("43","Isekai"), + Pair("33","Josei"), + Pair("34","Magia"), + Pair("13","Mecha"), + Pair("41","Militar"), + Pair("17","Misterio"), + Pair("30","Músical"), + Pair("11","Psicológico"), + Pair("39","Recuentos de la vida"), + Pair("5","Romance"), + Pair("19","Seinen"), + Pair("9","Shōjo"), + Pair("32","Shōjo-ai"), + Pair("8","Shōnen"), + Pair("40","Shōnen ai"), + Pair("18","Sobrenatural"), + Pair("38","Supervivencia"), + Pair("25","Webtoon"), + Pair("15","Yaoi"), + Pair("16","Yuri") + )) + + private class LetterFilter : UriPartFilter("Letra","letra", arrayOf( + Pair("all","All"), + Pair("a","A"), + Pair("b","B"), + Pair("c","C"), + Pair("d","D"), + Pair("e","E"), + Pair("f","F"), + Pair("g","G"), + Pair("h","H"), + Pair("i","I"), + Pair("j","J"), + Pair("k","K"), + Pair("l","L"), + Pair("m","M"), + Pair("n","N"), + Pair("o","O"), + Pair("p","P"), + Pair("q","Q"), + Pair("r","R"), + Pair("s","S"), + Pair("t","T"), + Pair("u","U"), + Pair("v","V"), + Pair("w","W"), + Pair("x","X"), + Pair("y","Y"), + Pair("z","Z") + )) + + private class StatusFilter : UriPartFilter("Estado", "estado", arrayOf( + Pair("all","All"),Pair("1","En desarrollo"), Pair("0","Finalizado"))) + + private class TypeFilter : UriPartFilter("Tipo", "tipo", arrayOf( + Pair("all","All"), + Pair("0","Manga"), + Pair("1","Manhwa"), + Pair("2","One Shot"), + Pair("3","Manhua"), + Pair("4","Novela") + )) + + private class AdultFilter : UriPartFilter("Filtro adulto", "adulto", arrayOf( + Pair("all","All"),Pair("0","Mostrar solo +18"), Pair("1","No mostrar +18"))) + + private class SortFilter : UriPartFilterreq("Sort", "orden", arrayOf( + Pair("visitas","Visitas"), + Pair("desc","Descendente"), + Pair("asc","Ascendente"), + Pair("lanzamiento","Lanzamiento"), + Pair("nombre","Nombre") + )) + + /** + * Class that creates a select filter. Each entry in the dropdown has a name and a display name. + * If an entry is selected it is appended as a query parameter onto the end of the URI. + * If `firstIsUnspecified` is set to true, if the first entry is selected, nothing will be appended on the the URI. + */ + //vals: + private open class UriPartFilter(displayName: String, val uriParam: String, val vals: Array>, + val firstIsUnspecified: Boolean = true, + defaultValue: Int = 0) : + Filter.Select(displayName, vals.map { it.second }.toTypedArray(), defaultValue), UriFilter { + override fun addToUri(uri: Uri.Builder) { + if (state != 0 || !firstIsUnspecified) + uri.appendQueryParameter(uriParam, vals[state].first) + } + } + + private open class UriPartFilterreq(displayName: String, val uriParam: String, val vals: Array>) : + Filter.Select(displayName, vals.map { it.second }.toTypedArray()), UriFilter { + override fun addToUri(uri: Uri.Builder) { + uri.appendQueryParameter(uriParam, vals[state].first) + } + } + + /** + * Represents a filter that is able to modify a URI. + */ + private interface UriFilter { + fun addToUri(uri: Uri.Builder) + } }