diff --git a/src/es/animefenix/build.gradle b/src/es/animefenix/build.gradle deleted file mode 100644 index 8253504c..00000000 --- a/src/es/animefenix/build.gradle +++ /dev/null @@ -1,24 +0,0 @@ -ext { - extName = 'Animefenix' - extClass = '.Animefenix' - extVersionCode = 43 -} - -apply from: "$rootDir/common.gradle" - -dependencies { - implementation(project(':lib:mp4upload-extractor')) - implementation(project(':lib:streamtape-extractor')) - implementation(project(':lib:yourupload-extractor')) - implementation(project(':lib:uqload-extractor')) - implementation(project(':lib:okru-extractor')) - implementation(project(':lib:burstcloud-extractor')) - implementation(project(':lib:streamwish-extractor')) - implementation(project(':lib:filemoon-extractor')) - implementation(project(':lib:voe-extractor')) - implementation(project(':lib:streamlare-extractor')) - implementation(project(':lib:fastream-extractor')) - implementation(project(':lib:dood-extractor')) - implementation(project(':lib:upstream-extractor')) - implementation(project(':lib:streamhidevid-extractor')) -} diff --git a/src/es/animefenix/res/mipmap-hdpi/ic_launcher.png b/src/es/animefenix/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 46c6d293..00000000 Binary files a/src/es/animefenix/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/animefenix/res/mipmap-mdpi/ic_launcher.png b/src/es/animefenix/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 46c6d293..00000000 Binary files a/src/es/animefenix/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/animefenix/res/mipmap-xhdpi/ic_launcher.png b/src/es/animefenix/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 46c6d293..00000000 Binary files a/src/es/animefenix/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/animefenix/res/mipmap-xxhdpi/ic_launcher.png b/src/es/animefenix/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 46c6d293..00000000 Binary files a/src/es/animefenix/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/es/animefenix/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/animefenix/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 46c6d293..00000000 Binary files a/src/es/animefenix/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ 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 deleted file mode 100644 index 65c9aa4e..00000000 --- a/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/AnimeFenixFilters.kt +++ /dev/null @@ -1,161 +0,0 @@ -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) - - 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 deleted file mode 100644 index 8bf7dfeb..00000000 --- a/src/es/animefenix/src/eu/kanade/tachiyomi/animeextension/es/animefenix/Animefenix.kt +++ /dev/null @@ -1,307 +0,0 @@ -package eu.kanade.tachiyomi.animeextension.es.animefenix - -import android.app.Application -import android.content.SharedPreferences -import androidx.preference.ListPreference -import androidx.preference.PreferenceScreen -import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource -import eu.kanade.tachiyomi.animesource.model.AnimeFilterList -import eu.kanade.tachiyomi.animesource.model.AnimesPage -import eu.kanade.tachiyomi.animesource.model.SAnime -import eu.kanade.tachiyomi.animesource.model.SEpisode -import eu.kanade.tachiyomi.animesource.model.Video -import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource -import eu.kanade.tachiyomi.lib.burstcloudextractor.BurstCloudExtractor -import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor -import eu.kanade.tachiyomi.lib.fastreamextractor.FastreamExtractor -import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor -import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor -import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor -import eu.kanade.tachiyomi.lib.streamhidevidextractor.StreamHideVidExtractor -import eu.kanade.tachiyomi.lib.streamlareextractor.StreamlareExtractor -import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor -import eu.kanade.tachiyomi.lib.streamwishextractor.StreamWishExtractor -import eu.kanade.tachiyomi.lib.upstreamextractor.UpstreamExtractor -import eu.kanade.tachiyomi.lib.uqloadextractor.UqloadExtractor -import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor -import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.util.asJsoup -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.Request -import okhttp3.Response -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get -import java.net.URLDecoder - -class Animefenix : ConfigurableAnimeSource, AnimeHttpSource() { - - override val name = "AnimeFenix" - - override val baseUrl = "https://www.animefenix.tv" - - override val lang = "es" - - override val supportsLatest = true - - private val preferences: SharedPreferences by lazy { Injekt.get().getSharedPreferences("source_$id", 0x0000) } - - private object CSSQuery { - object AnimeList { - const val GRID = "main div.container div.grid" - const val ELEMENT = "a" - const val ELEMENT_URL = "a" - const val ELEMENT_TITLE = "div div h3" - const val ELEMENT_THUMBNAIL_URL = "img" - const val ELEMENT_STATUS = "div div span.bg-zinc-700" - const val NEXT = "a:has(span.sr-only:contains(Next))" - } - - object EpisodeList { - const val EPISODE = "div.container div.bg-zinc-800 ul li" - const val NUMBER = "a span span" - const val URL = "a" - } - } - companion object { - private const val PREF_QUALITY_KEY = "preferred_quality" - private const val PREF_QUALITY_DEFAULT = "1080" - private val QUALITY_LIST = arrayOf("1080", "720", "480", "360") - - private const val PREF_SERVER_KEY = "preferred_server" - private const val PREF_SERVER_DEFAULT = "Amazon" - private val SERVER_LIST = arrayOf( - "YourUpload", "Voe", "Mp4Upload", "Doodstream", - "Upload", "BurstCloud", "Upstream", "StreamTape", - "Fastream", "Filemoon", "StreamWish", "Okru", - "Amazon", "AmazonES", "Fireload", "FileLions", - ) - } - - override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/animes?order=likes&page=$page") - - override fun popularAnimeParse(response: Response): AnimesPage { - val document = response.asJsoup() - - val grid = document.select(CSSQuery.AnimeList.GRID)[1] - - val elements = grid.select(CSSQuery.AnimeList.ELEMENT) - val nextPage = document.select(CSSQuery.AnimeList.NEXT).any() - val animeList = elements.map { element -> - SAnime.create().apply { - setUrlWithoutDomain(element.select(CSSQuery.AnimeList.ELEMENT_URL).attr("abs:href")) - title = element.select(CSSQuery.AnimeList.ELEMENT_TITLE).text() - thumbnail_url = element.select(CSSQuery.AnimeList.ELEMENT_THUMBNAIL_URL).attr("abs:src") - status = parseStatus(element.select(CSSQuery.AnimeList.ELEMENT_STATUS).text()) - } - } - return AnimesPage(animeList, nextPage) - } - - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/animes?order=added&page=$page") - - override fun latestUpdatesParse(response: Response) = popularAnimeParse(response) - - override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { - 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") - } - } - - override fun searchAnimeParse(response: Response) = popularAnimeParse(response) - - override fun episodeListParse(response: Response): List { - val document = response.asJsoup() - return document.select(CSSQuery.EpisodeList.EPISODE).map { it -> - val epNum = it.select(CSSQuery.EpisodeList.NUMBER).text().replace("Episodio", "") - SEpisode.create().apply { - episode_number = epNum.toFloat() - name = "Episodio $epNum" - setUrlWithoutDomain(it.select(CSSQuery.EpisodeList.URL).attr("abs:href")) - } - } - } - - override fun videoListParse(response: Response): List