From 815a99ca833ac9cc7f7aa31b1838dc91021099f9 Mon Sep 17 00:00:00 2001 From: imper1aldev <23511335+imper1aldev@users.noreply.github.com> Date: Thu, 12 Sep 2024 02:23:21 -0600 Subject: [PATCH] AnimeFlv Improvements --- .../es/animefenix/Animefenix.kt | 3 +- src/es/animeflv/build.gradle | 2 +- .../animeextension/es/animeflv/AnimeFlv.kt | 113 +------------ .../es/animeflv/AnimeFlvFilters.kt | 148 ++++++++++++++++++ 4 files changed, 157 insertions(+), 109 deletions(-) create mode 100644 src/es/animeflv/src/eu/kanade/tachiyomi/animeextension/es/animeflv/AnimeFlvFilters.kt 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 1b72b418..4ccd7ea5 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 @@ -86,8 +86,9 @@ class Animefenix : ConfigurableAnimeSource, AnimeHttpSource() { val params = AnimeFenixFilters.getSearchParameters(filters) return when { + query.isNotBlank() -> GET("$baseUrl/animes?q=$query&page=$page", headers) params.filter.isNotBlank() -> GET("$baseUrl/animes${params.getQuery()}&page=$page", headers) - else -> GET("$baseUrl/animes?order=likes&page=$page ") + else -> GET("$baseUrl/animes?order=likes&page=$page") } } diff --git a/src/es/animeflv/build.gradle b/src/es/animeflv/build.gradle index dc05b096..d3205a94 100644 --- a/src/es/animeflv/build.gradle +++ b/src/es/animeflv/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'AnimeFLV' extClass = '.AnimeFlv' - extVersionCode = 56 + extVersionCode = 57 } apply from: "$rootDir/common.gradle" diff --git a/src/es/animeflv/src/eu/kanade/tachiyomi/animeextension/es/animeflv/AnimeFlv.kt b/src/es/animeflv/src/eu/kanade/tachiyomi/animeextension/es/animeflv/AnimeFlv.kt index be897e0a..eb3079a0 100644 --- a/src/es/animeflv/src/eu/kanade/tachiyomi/animeextension/es/animeflv/AnimeFlv.kt +++ b/src/es/animeflv/src/eu/kanade/tachiyomi/animeextension/es/animeflv/AnimeFlv.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.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode @@ -132,116 +131,16 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun videoFromElement(element: Element) = throw UnsupportedOperationException() override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { - val filterList = if (filters.isEmpty()) getFilterList() else filters - val genreFilter = filterList.find { it is GenreFilter } as GenreFilter - val stateFilter = filterList.find { it is StateFilter } as StateFilter - val typeFilter = filterList.find { it is TypeFilter } as TypeFilter - val orderByFilter = filterList.find { it is OrderByFilter } as OrderByFilter - var uri = "$baseUrl/browse?" - uri += if (query.isNotBlank()) "&q=$query" else "" - uri += if (genreFilter.state != 0) "&genre[]=${genreFilter.toUriPart()}" else "" - uri += if (stateFilter.state != 0) "&status[]=${stateFilter.toUriPart()}" else "" - uri += if (typeFilter.state != 0) "&type[]=${typeFilter.toUriPart()}" else "" - uri += "&order=${orderByFilter.toUriPart()}" - uri += "&page=$page" + val params = AnimeFlvFilters.getSearchParameters(filters) + return when { - query.isNotBlank() || genreFilter.state != 0 || stateFilter.state != 0 || orderByFilter.state != 0 || typeFilter.state != 0 -> GET(uri) - else -> GET("$baseUrl/browse?page=$page&order=rating") + query.isNotBlank() -> GET("$baseUrl/browse?q=$query&page=$page") + params.filter.isNotBlank() -> GET("$baseUrl/browse${params.getQuery()}&page=$page") + else -> popularAnimeRequest(page) } } - override fun getFilterList(): AnimeFilterList = AnimeFilterList( - AnimeFilter.Header("La busqueda por texto ignora el filtro"), - GenreFilter(), - StateFilter(), - TypeFilter(), - OrderByFilter(), - ) - - private class GenreFilter : UriPartFilter( - "Géneros", - arrayOf( - Pair("", "all"), - Pair("Todo", "all"), - Pair("Acción", "accion"), - Pair("Artes Marciales", "artes_marciales"), - Pair("Aventuras", "aventura"), - Pair("Carreras", "carreras"), - Pair("Ciencia Ficción", "ciencia_ficcion"), - Pair("Comedia", "comedia"), - Pair("Demencia", "demencia"), - Pair("Demonios", "demonios"), - Pair("Deportes", "deportes"), - Pair("Drama", "drama"), - Pair("Ecchi", "ecchi"), - Pair("Escolares", "escolares"), - Pair("Espacial", "espacial"), - Pair("Fantasía", "fantasia"), - Pair("Harem", "harem"), - Pair("Historico", "historico"), - Pair("Infantil", "infantil"), - Pair("Josei", "josei"), - Pair("Juegos", "juegos"), - Pair("Magia", "magia"), - Pair("Mecha", "mecha"), - Pair("Militar", "militar"), - Pair("Misterio", "misterio"), - Pair("Música", "musica"), - Pair("Parodia", "parodia"), - Pair("Policía", "policia"), - Pair("Psicológico", "psicologico"), - Pair("Recuentos de la vida", "recuentos_de_la_vida"), - Pair("Romance", "romance"), - Pair("Samurai", "samurai"), - Pair("Seinen", "seinen"), - Pair("Shoujo", "shoujo"), - Pair("Shounen", "shounen"), - Pair("Sobrenatural", "sobrenatural"), - Pair("Superpoderes", "superpoderes"), - Pair("Suspenso", "suspenso"), - Pair("Terror", "terror"), - Pair("Vampiros", "vampiros"), - Pair("Yaoi", "yaoi"), - Pair("Yuri", "yuri"), - ), - ) - - private class StateFilter : UriPartFilter( - "Estado", - arrayOf( - Pair("", ""), - Pair("En emisión", "1"), - Pair("Finalizado", "2"), - Pair("Próximamente", "3"), - ), - ) - - private class TypeFilter : UriPartFilter( - "Tipo", - arrayOf( - Pair("", ""), - Pair("TV", "tv"), - Pair("Película", "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", "rating"), - ), - ) - - 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 = AnimeFlvFilters.FILTER_LIST override fun searchAnimeFromElement(element: Element) = popularAnimeFromElement(element) diff --git a/src/es/animeflv/src/eu/kanade/tachiyomi/animeextension/es/animeflv/AnimeFlvFilters.kt b/src/es/animeflv/src/eu/kanade/tachiyomi/animeextension/es/animeflv/AnimeFlvFilters.kt new file mode 100644 index 00000000..d5da4f66 --- /dev/null +++ b/src/es/animeflv/src/eu/kanade/tachiyomi/animeextension/es/animeflv/AnimeFlvFilters.kt @@ -0,0 +1,148 @@ +package eu.kanade.tachiyomi.animeextension.es.animeflv + +import eu.kanade.tachiyomi.animesource.model.AnimeFilter +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import java.util.Calendar + +object AnimeFlvFilters { + 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(AnimeFlvFiltersData.GENRES, "genre") + + filters.parseCheckbox(AnimeFlvFiltersData.YEARS, "year") + + filters.parseCheckbox(AnimeFlvFiltersData.TYPES, "type") + + filters.parseCheckbox(AnimeFlvFiltersData.STATE, "status") + + 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", AnimeFlvFiltersData.GENRES.map { CheckBoxVal(it.first, false) }) + + class YearsFilter : CheckBoxFilterList("Año", AnimeFlvFiltersData.YEARS.map { CheckBoxVal(it.first, false) }) + + class TypesFilter : CheckBoxFilterList("Tipo", AnimeFlvFiltersData.TYPES.map { CheckBoxVal(it.first, false) }) + + class StateFilter : CheckBoxFilterList("Estado", AnimeFlvFiltersData.STATE.map { CheckBoxVal(it.first, false) }) + + class SortFilter : QueryPartFilter("Orden", AnimeFlvFiltersData.SORT) + + private object AnimeFlvFiltersData { + 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"), + ) + + val STATE = arrayOf( + Pair("En emisión", "1"), + Pair("Finalizado", "2"), + Pair("Próximamente", "3"), + ) + + val SORT = arrayOf( + Pair("Por Defecto", "default"), + Pair("Recientemente Actualizados", "updated"), + Pair("Recientemente Agregados", "added"), + Pair("Nombre A-Z", "title"), + Pair("Calificación", "rating"), + ) + + val GENRES = arrayOf( + Pair("Acción", "accion"), + Pair("Artes Marciales", "artes-marciales"), + Pair("Aventuras", "aventura"), + Pair("Carreras", "carreras"), + Pair("Ciencia Ficción", "ciencia-ficcion"), + Pair("Comedia", "comedia"), + Pair("Demencia", "demencia"), + Pair("Demonios", "demonios"), + Pair("Deportes", "deportes"), + Pair("Drama", "drama"), + Pair("Ecchi", "ecchi"), + Pair("Escolares", "escolares"), + Pair("Espacial", "espacial"), + Pair("Fantasía", "fantasia"), + Pair("Harem", "harem"), + Pair("Historico", "historico"), + Pair("Infantil", "infantil"), + Pair("Josei", "josei"), + Pair("Juegos", "juegos"), + Pair("Magia", "magia"), + Pair("Mecha", "mecha"), + Pair("Militar", "militar"), + Pair("Misterio", "misterio"), + Pair("Música", "musica"), + Pair("Parodia", "parodia"), + Pair("Policía", "policia"), + Pair("Psicológico", "psicologico"), + Pair("Recuentos de la vida", "recuentos-de-la-vida"), + Pair("Romance", "romance"), + Pair("Samurai", "samurai"), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shounen", "shounen"), + Pair("Sobrenatural", "sobrenatural"), + Pair("Superpoderes", "superpoderes"), + Pair("Suspenso", "suspenso"), + Pair("Terror", "terror"), + Pair("Vampiros", "vampiros"), + Pair("Yaoi", "yaoi"), + Pair("Yuri", "yuri"), + ) + } +}