AnimeFlv Improvements
This commit is contained in:
parent
d866966185
commit
815a99ca83
4 changed files with 157 additions and 109 deletions
|
@ -86,8 +86,9 @@ class Animefenix : ConfigurableAnimeSource, AnimeHttpSource() {
|
||||||
val params = AnimeFenixFilters.getSearchParameters(filters)
|
val params = AnimeFenixFilters.getSearchParameters(filters)
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
|
query.isNotBlank() -> GET("$baseUrl/animes?q=$query&page=$page", headers)
|
||||||
params.filter.isNotBlank() -> GET("$baseUrl/animes${params.getQuery()}&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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
ext {
|
ext {
|
||||||
extName = 'AnimeFLV'
|
extName = 'AnimeFLV'
|
||||||
extClass = '.AnimeFlv'
|
extClass = '.AnimeFlv'
|
||||||
extVersionCode = 56
|
extVersionCode = 57
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
|
|
@ -5,7 +5,6 @@ import android.content.SharedPreferences
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
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.AnimeFilterList
|
||||||
import eu.kanade.tachiyomi.animesource.model.SAnime
|
import eu.kanade.tachiyomi.animesource.model.SAnime
|
||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
|
@ -132,116 +131,16 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
override fun videoFromElement(element: Element) = throw UnsupportedOperationException()
|
override fun videoFromElement(element: Element) = throw UnsupportedOperationException()
|
||||||
|
|
||||||
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
|
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
|
||||||
val filterList = if (filters.isEmpty()) getFilterList() else filters
|
val params = AnimeFlvFilters.getSearchParameters(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"
|
|
||||||
return when {
|
return when {
|
||||||
query.isNotBlank() || genreFilter.state != 0 || stateFilter.state != 0 || orderByFilter.state != 0 || typeFilter.state != 0 -> GET(uri)
|
query.isNotBlank() -> GET("$baseUrl/browse?q=$query&page=$page")
|
||||||
else -> GET("$baseUrl/browse?page=$page&order=rating")
|
params.filter.isNotBlank() -> GET("$baseUrl/browse${params.getQuery()}&page=$page")
|
||||||
|
else -> popularAnimeRequest(page)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
override fun getFilterList(): AnimeFilterList = AnimeFlvFilters.FILTER_LIST
|
||||||
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
|
||||||
GenreFilter(),
|
|
||||||
StateFilter(),
|
|
||||||
TypeFilter(),
|
|
||||||
OrderByFilter(),
|
|
||||||
)
|
|
||||||
|
|
||||||
private class GenreFilter : UriPartFilter(
|
|
||||||
"Géneros",
|
|
||||||
arrayOf(
|
|
||||||
Pair("<Selecionar>", "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("<Seleccionar>", ""),
|
|
||||||
Pair("En emisión", "1"),
|
|
||||||
Pair("Finalizado", "2"),
|
|
||||||
Pair("Próximamente", "3"),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
private class TypeFilter : UriPartFilter(
|
|
||||||
"Tipo",
|
|
||||||
arrayOf(
|
|
||||||
Pair("<Seleccionar>", ""),
|
|
||||||
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<Pair<String, String>>) :
|
|
||||||
AnimeFilter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
|
|
||||||
fun toUriPart() = vals[state].second
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun searchAnimeFromElement(element: Element) = popularAnimeFromElement(element)
|
override fun searchAnimeFromElement(element: Element) = popularAnimeFromElement(element)
|
||||||
|
|
||||||
|
|
|
@ -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<Pair<String, String>>) : AnimeFilter.Select<String>(
|
||||||
|
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<CheckBox>) : AnimeFilter.Group<AnimeFilter.CheckBox>(name, values)
|
||||||
|
|
||||||
|
private class CheckBoxVal(name: String, state: Boolean = false) : AnimeFilter.CheckBox(name, state)
|
||||||
|
|
||||||
|
private inline fun <reified R> AnimeFilterList.parseCheckbox(
|
||||||
|
options: Array<Pair<String, String>>,
|
||||||
|
name: String,
|
||||||
|
): String {
|
||||||
|
return (this.getFirst<R>() 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 <reified R> AnimeFilterList.asQueryPart(name: String): String {
|
||||||
|
return (this.getFirst<R>() as QueryPartFilter).toQueryPart(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline fun <reified R> AnimeFilterList.getFirst(): R {
|
||||||
|
return this.filterIsInstance<R>().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<GenresFilter>(AnimeFlvFiltersData.GENRES, "genre") +
|
||||||
|
filters.parseCheckbox<YearsFilter>(AnimeFlvFiltersData.YEARS, "year") +
|
||||||
|
filters.parseCheckbox<TypesFilter>(AnimeFlvFiltersData.TYPES, "type") +
|
||||||
|
filters.parseCheckbox<StateFilter>(AnimeFlvFiltersData.STATE, "status") +
|
||||||
|
filters.asQueryPart<SortFilter>("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"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue