From d866966185a82b27987a93cdcf5085d75591084e Mon Sep 17 00:00:00 2001 From: imper1aldev <23511335+imper1aldev@users.noreply.github.com> Date: Thu, 12 Sep 2024 01:09:21 -0600 Subject: [PATCH] AnimeFenix improvements --- src/es/animefenix/build.gradle | 2 +- .../es/animefenix/AnimeFenixFilters.kt | 161 ++++++++++++++++++ .../es/animefenix/Animefenix.kt | 137 +-------------- 3 files changed, 165 insertions(+), 135 deletions(-) create mode 100644 src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/AnimeFenixFilters.kt diff --git a/src/es/animefenix/build.gradle b/src/es/animefenix/build.gradle index 4d35f0be..33da8c4d 100644 --- a/src/es/animefenix/build.gradle +++ b/src/es/animefenix/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Animefenix' extClass = '.Animefenix' - extVersionCode = 39 + extVersionCode = 40 } apply from: "$rootDir/common.gradle" diff --git a/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/AnimeFenixFilters.kt b/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/AnimeFenixFilters.kt new file mode 100644 index 00000000..eaab6fbf --- /dev/null +++ b/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/AnimeFenixFilters.kt @@ -0,0 +1,161 @@ +package eu.kanade.tachiyomi.animeextension.es.animefenix + +import eu.kanade.tachiyomi.animesource.model.AnimeFilter +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import java.util.Calendar + +object AnimeFenixFilters { + open class QueryPartFilter(displayName: String, val vals: Array>) : AnimeFilter.Select( + displayName, + vals.map { it.first }.toTypedArray(), + ) { + fun toQueryPart(name: String) = vals[state].second.takeIf { it.isNotEmpty() }?.let { "&$name=${vals[state].second}" } ?: run { "" } + } + + open class CheckBoxFilterList(name: String, values: List) : AnimeFilter.Group(name, values) + + private class CheckBoxVal(name: String, state: Boolean = false) : AnimeFilter.CheckBox(name, state) + + private inline fun AnimeFilterList.parseCheckbox( + options: Array>, + name: String, + ): String { + return (this.getFirst() as CheckBoxFilterList).state + .mapNotNull { checkbox -> + if (checkbox.state) { + options.find { it.first == checkbox.name }!!.second + } else { + null + } + }.joinToString("&$name[]=").let { + if (it.isBlank()) { + "" + } else { + "&$name[]=$it" + } + } + } + + private inline fun AnimeFilterList.asQueryPart(name: String): String { + return (this.getFirst() as QueryPartFilter).toQueryPart(name) + } + + private inline fun AnimeFilterList.getFirst(): R { + return this.filterIsInstance().first() + } + + private fun String.changePrefix() = this.takeIf { it.startsWith("&") }?.let { this.replaceFirst("&", "?") } ?: run { this } + + data class FilterSearchParams(val filter: String = "") { fun getQuery() = filter.changePrefix() } + + internal fun getSearchParameters(filters: AnimeFilterList): FilterSearchParams { + if (filters.isEmpty()) return FilterSearchParams() + return FilterSearchParams( + filters.parseCheckbox(AnimeFenixFiltersData.GENRES, "genero") + + filters.parseCheckbox(AnimeFenixFiltersData.YEARS, "year") + + filters.parseCheckbox(AnimeFenixFiltersData.TYPES, "type") + + filters.parseCheckbox(AnimeFenixFiltersData.STATE, "estado") + + filters.asQueryPart("order"), + ) + } + + val FILTER_LIST get() = AnimeFilterList( + AnimeFilter.Header("La busqueda por texto ignora el filtro"), + GenresFilter(), + YearsFilter(), + TypesFilter(), + StateFilter(), + SortFilter(), + ) + + class GenresFilter : CheckBoxFilterList("Género", AnimeFenixFiltersData.GENRES.map { CheckBoxVal(it.first, false) }) + + class YearsFilter : CheckBoxFilterList("Año", AnimeFenixFiltersData.YEARS.map { CheckBoxVal(it.first, false) }) + + class TypesFilter : CheckBoxFilterList("Tipo", AnimeFenixFiltersData.TYPES.map { CheckBoxVal(it.first, false) }) + + class StateFilter : CheckBoxFilterList("Estado", AnimeFenixFiltersData.STATE.map { CheckBoxVal(it.first, false) }) + + class SortFilter : QueryPartFilter("Orden", AnimeFenixFiltersData.SORT) + + private object AnimeFenixFiltersData { + val YEARS = (1990..Calendar.getInstance().get(Calendar.YEAR)).map { Pair("$it", "$it") }.reversed().toTypedArray() + + val TYPES = arrayOf( + Pair("TV", "tv"), + Pair("Película", "movie"), + Pair("Especial", "special"), + Pair("OVA", "ova"), + Pair("DONGHUA", "donghua"), + ) + + val STATE = arrayOf( + Pair("Emisión", "1"), + Pair("Finalizado", "2"), + Pair("Próximamente", "3"), + Pair("En Cuarentena", "4"), + ) + + val SORT = arrayOf( + Pair("Por Defecto", "default"), + Pair("Recientemente Actualizados", "updated"), + Pair("Recientemente Agregados", "added"), + Pair("Nombre A-Z", "title"), + Pair("Calificación", "likes"), + Pair("Más Vistos", "visits"), + ) + + val GENRES = arrayOf( + Pair("Acción", "accion"), + Pair("Ángeles", "angeles"), + Pair("Artes Marciales", "artes-marciales"), + Pair("Aventura", "aventura"), + Pair("Ciencia Ficción", "Ciencia Ficción"), + Pair("Comedia", "comedia"), + Pair("Cyberpunk", "cyberpunk"), + Pair("Demonios", "demonios"), + Pair("Deportes", "deportes"), + Pair("Dragones", "dragones"), + Pair("Drama", "drama"), + Pair("Ecchi", "ecchi"), + Pair("Escolares", "escolares"), + Pair("Fantasía", "fantasia"), + Pair("Gore", "gore"), + Pair("Harem", "harem"), + Pair("Histórico", "historico"), + Pair("Horror", "horror"), + Pair("Infantil", "infantil"), + Pair("Isekai", "isekai"), + Pair("Josei", "josei"), + Pair("Juegos", "juegos"), + Pair("Magia", "magia"), + Pair("Mecha", "mecha"), + Pair("Militar", "militar"), + Pair("Misterio", "misterio"), + Pair("Música", "Musica"), + Pair("Ninjas", "ninjas"), + Pair("Parodia", "parodia"), + Pair("Policía", "policia"), + Pair("Psicológico", "psicologico"), + Pair("Recuerdos de la vida", "Recuerdos de la vida"), + Pair("Romance", "romance"), + Pair("Samurai", "samurai"), + Pair("Sci-Fi", "sci-fi"), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shoujo Ai", "shoujo-ai"), + Pair("Shounen", "shounen"), + Pair("Slice of life", "slice-of-life"), + Pair("Sobrenatural", "sobrenatural"), + Pair("Space", "space"), + Pair("Spokon", "spokon"), + Pair("Steampunk", "steampunk"), + Pair("Superpoder", "superpoder"), + Pair("Thriller", "thriller"), + Pair("Vampiro", "vampiro"), + Pair("Yaoi", "yaoi"), + Pair("Yuri", "yuri"), + Pair("Zombies", "zombies"), + ) + } +} diff --git a/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/Animefenix.kt b/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/Animefenix.kt index 91091963..1b72b418 100644 --- a/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/Animefenix.kt +++ b/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/Animefenix.kt @@ -5,7 +5,6 @@ import android.content.SharedPreferences import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource -import eu.kanade.tachiyomi.animesource.model.AnimeFilter import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimesPage import eu.kanade.tachiyomi.animesource.model.SAnime @@ -84,37 +83,10 @@ class Animefenix : ConfigurableAnimeSource, AnimeHttpSource() { override fun latestUpdatesParse(response: Response) = popularAnimeParse(response) override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { - val yearFilter = filters.find { it is YearFilter } as YearFilter - val stateFilter = filters.find { it is StateFilter } as StateFilter - val typeFilter = filters.find { it is TypeFilter } as TypeFilter - val orderByFilter = filters.find { it is OrderByFilter } as OrderByFilter - - val genreFilter = (filters.find { it is TagFilter } as TagFilter).state.filter { it.state } - - var filterUrl = "$baseUrl/animes?" - if (query.isNotBlank()) { - filterUrl += "&q=$query" - } // search by name - if (genreFilter.isNotEmpty()) { - genreFilter.forEach { - filterUrl += "&genero[]=${it.name}" - } - } // search by genre - if (yearFilter.state.isNotBlank()) { - filterUrl += "&year[]=${yearFilter.state}" - } // search by year - if (stateFilter.state != 0) { - filterUrl += "&estado[]=${stateFilter.toUriPart()}" - } // search by state - if (typeFilter.state != 0) { - filterUrl += "&type[]=${typeFilter.toUriPart()}" - } // search by type - filterUrl += "&order=${orderByFilter.toUriPart()}" - filterUrl += "&page=$page" // add page + val params = AnimeFenixFilters.getSearchParameters(filters) return when { - genreFilter.isEmpty() || yearFilter.state.isNotBlank() || - stateFilter.state != 0 || typeFilter.state != 0 || query.isNotBlank() -> GET(filterUrl, headers) + params.filter.isNotBlank() -> GET("$baseUrl/animes${params.getQuery()}&page=$page", headers) else -> GET("$baseUrl/animes?order=likes&page=$page ") } } @@ -273,110 +245,7 @@ class Animefenix : ConfigurableAnimeSource, AnimeHttpSource() { } } - override fun getFilterList(): AnimeFilterList = AnimeFilterList( - TagFilter("Generos", checkboxesFrom(genreList)), - StateFilter(), - TypeFilter(), - OrderByFilter(), - YearFilter(), - ) - - private val genreList = arrayOf( - Pair("Acción", "acción"), - Pair("Aventura", "aventura"), - Pair("Angeles", "angeles"), - Pair("Artes Marciales", "artes-marciales"), - Pair("Ciencia Ficcion", "ciencia-ficcion"), - Pair("Comedia", "comedia"), - Pair("Cyberpunk", "cyberpunk"), - Pair("Demonios", "demonios"), - Pair("Deportes", "deportes"), - Pair("Dragones", "dragones"), - Pair("Drama", "drama"), - Pair("Ecchi", "ecchi"), - Pair("Escolares", "escolares"), - Pair("Fantasía", "fantasía"), - Pair("Gore", "gore"), - Pair("Harem", "harem"), - Pair("Historico", "historico"), - Pair("Horror", "horror"), - Pair("Infantil", "infantil"), - Pair("Isekai", "isekai"), - Pair("Josei", "josei"), - Pair("Juegos", "juegos"), - Pair("Magia", "magia"), - Pair("Mecha", "mecha"), - Pair("Militar", "militar"), - Pair("Misterio", "misterio"), - Pair("Música", "música"), - Pair("Ninjas", "ninjas"), - Pair("Parodias", "parodias"), - Pair("Policia", "policia"), - Pair("Psicológico", "psicológico"), - Pair("Recuerdos de la vida", "recuerdos-de-la-vida"), - Pair("Romance", "romance"), - Pair("Samurai", "samurai"), - Pair("Sci-Fi", "sci-fi"), - Pair("Seinen", "seinen"), - Pair("Shoujo", "shoujo"), - Pair("Shonen", "shonen"), - Pair("Slice of life", "slice-of-life"), - Pair("Sobrenatural", "sobrenatural"), - Pair("Space", "space"), - Pair("Spokon", "spokon"), - Pair("SteamPunk", "steampunk"), - Pair("SuperPoder", "superpoder"), - Pair("Vampiros", "vampiros"), - Pair("Yaoi", "yaoi"), - Pair("Yuri", "yuri"), - ) - - private fun checkboxesFrom(tagArray: Array>): List = tagArray.map { TagCheckBox(it.second) } - - class TagCheckBox(tag: String) : AnimeFilter.CheckBox(tag, false) - - class TagFilter(name: String, checkBoxes: List) : AnimeFilter.Group(name, checkBoxes) - - private class YearFilter : AnimeFilter.Text("Año") - - private class StateFilter : UriPartFilter( - "Estado", - arrayOf( - Pair("", ""), - Pair("Emision", "1"), - Pair("Finalizado", "2"), - Pair("Proximamente", "3"), - Pair("En Cuarentena", "4"), - ), - ) - - private class TypeFilter : UriPartFilter( - "Tipo", - arrayOf( - Pair("", ""), - Pair("TV", "tv"), - Pair("Pelicula", "movie"), - Pair("Especial", "special"), - Pair("OVA", "ova"), - ), - ) - - private class OrderByFilter : UriPartFilter( - "Ordenar Por", - arrayOf( - Pair("Por defecto", "default"), - Pair("Recientemente Actualizados", "updated"), - Pair("Recientemente Agregados", "added"), - Pair("Nombre A-Z", "title"), - Pair("Calificación", "likes"), - Pair("Más vistos", "visits"), - ), - ) - - private open class UriPartFilter(displayName: String, val vals: Array>) : - AnimeFilter.Select(displayName, vals.map { it.first }.toTypedArray()) { - fun toUriPart() = vals[state].second - } + override fun getFilterList(): AnimeFilterList = AnimeFenixFilters.FILTER_LIST override fun setupPreferenceScreen(screen: PreferenceScreen) { ListPreference(screen.context).apply {