From 9502f170c78a804f3dd3437586c69689e4a7cfb6 Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Sat, 24 Dec 2022 20:11:45 -0300 Subject: [PATCH] feat: Add subanimes (#1109) --- src/pt/subanimes/AndroidManifest.xml | 24 ++ src/pt/subanimes/build.gradle | 14 + .../subanimes/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3537 bytes .../subanimes/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2133 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5161 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8295 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11516 bytes .../animeextension/pt/subanimes/SBFilters.kt | 177 ++++++++++++ .../pt/subanimes/SBUrlActivity.kt | 41 +++ .../animeextension/pt/subanimes/SubAnimes.kt | 252 ++++++++++++++++++ .../pt/subanimes/dto/SubAnimesDto.kt | 28 ++ .../extractors/SubAnimesExtractor.kt | 33 +++ 12 files changed, 569 insertions(+) create mode 100644 src/pt/subanimes/AndroidManifest.xml create mode 100644 src/pt/subanimes/build.gradle create mode 100644 src/pt/subanimes/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/pt/subanimes/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/pt/subanimes/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/pt/subanimes/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/pt/subanimes/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SBFilters.kt create mode 100644 src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SBUrlActivity.kt create mode 100644 src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SubAnimes.kt create mode 100644 src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/dto/SubAnimesDto.kt create mode 100644 src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/extractors/SubAnimesExtractor.kt diff --git a/src/pt/subanimes/AndroidManifest.xml b/src/pt/subanimes/AndroidManifest.xml new file mode 100644 index 000000000..a5f321261 --- /dev/null +++ b/src/pt/subanimes/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/src/pt/subanimes/build.gradle b/src/pt/subanimes/build.gradle new file mode 100644 index 000000000..e89700e43 --- /dev/null +++ b/src/pt/subanimes/build.gradle @@ -0,0 +1,14 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' + +ext { + extName = 'SubAnimes' + pkgNameSuffix = 'pt.subanimes' + extClass = '.SubAnimes' + extVersionCode = 1 + libVersion = '13' +} + + +apply from: "$rootDir/common.gradle" diff --git a/src/pt/subanimes/res/mipmap-hdpi/ic_launcher.png b/src/pt/subanimes/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff98d6290701b0ef17ce45198c81e27b9c6f2f9 GIT binary patch literal 3537 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 ae>Ga#|4efBmbEKe16Z1(5EaJPqW=c7AnptR literal 0 HcmV?d00001 diff --git a/src/pt/subanimes/res/mipmap-xhdpi/ic_launcher.png b/src/pt/subanimes/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..88745a5ce769c6530bfd9e4a62ac01016ff03050 GIT binary patch literal 5161 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 G#Qq1?XosEv literal 0 HcmV?d00001 diff --git a/src/pt/subanimes/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/subanimes/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d12d3187bfc4667d3fb581e7a0518d68ca0732e GIT binary patch literal 8295 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 literal 0 HcmV?d00001 diff --git a/src/pt/subanimes/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/subanimes/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b4341dba4863a9820d32f045682346872aaed989 GIT binary patch literal 11516 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 + ) : AnimeFilter.Select( + displayName, + vals.map { it.first }.toTypedArray() + ) { + + fun toQueryPart() = vals[state].second + } + + private class CheckBoxVal(name: String, state: Boolean = false) : AnimeFilter.CheckBox(name, state) + open class CheckBoxFilterList(name: String, values: List) : AnimeFilter.Group(name, values) + + private inline fun AnimeFilterList.getFirst(): R { + return this.filterIsInstance().first() + } + + private inline fun AnimeFilterList.asQueryPart(): String { + return this.filterIsInstance().joinToString("") { + (it as QueryPartFilter).toQueryPart() + } + } + + class AdultFilter : AnimeFilter.CheckBox("Exibir animes adultos", true) + + class FormatFilter : QueryPartFilter("Tipo de série", SBFiltersData.formats) + class StatusFilter : QueryPartFilter("Status do anime", SBFiltersData.status) + class TypeFilter : QueryPartFilter("Tipo de áudio", SBFiltersData.types) + + class GenresFilter : CheckBoxFilterList( + "Gêneros", + SBFiltersData.genres.map { CheckBoxVal(it.first, false) } + ) + + // Mimicking the order of filters on the source + val filterList = AnimeFilterList( + TypeFilter(), + StatusFilter(), + AdultFilter(), + FormatFilter(), + GenresFilter() + ) + + data class FilterSearchParams( + val adult: Boolean = true, + val format: String = "", + val genres: List = emptyList(), + val status: String = "", + val type: String = "", + ) + + internal fun getSearchParameters(filters: AnimeFilterList): FilterSearchParams { + + if (filters.isEmpty()) return FilterSearchParams() + + val genres = filters.getFirst().state + .mapNotNull { genre -> + if (genre.state) { + SBFiltersData.genres.find { it.first == genre.name }!!.second + } else { null } + }.toList() + + return FilterSearchParams( + filters.getFirst().state, + filters.asQueryPart(), + genres, + filters.asQueryPart(), + filters.asQueryPart() + ) + } + + private object SBFiltersData { + val every = Pair("Qualquer um", "") + + val types = arrayOf( + every, + Pair("Japonês/Legendado", "1"), + Pair("Português/Dublado", "2") + ) + + val status = arrayOf( + every, + Pair("Completo", "Completo"), + Pair("Em lançamento", "Lançamento") + ) + + val formats = arrayOf( + every, + Pair("Anime", "Anime"), + Pair("Filme", "Filme") + ) + + val genres = arrayOf( + Pair("Adulto", "334"), + Pair("Animação", "2374"), + Pair("Arte Marcial", "16"), + Pair("Avant Garde", "2846"), + Pair("Avant", "2845"), + Pair("Aventura", "4"), + Pair("Ação", "15"), + Pair("Boys Love", "2435"), + Pair("Card Battles", "1157"), + Pair("Carro", "605"), + Pair("China", "865"), + Pair("Comédia Romântica", "1254"), + Pair("Comédia", "5"), + Pair("Corridas", "1514"), + Pair("Crime", "1962"), + Pair("Culinária", "925"), + Pair("Cultivo", "1133"), + Pair("Demônio", "19"), + Pair("Drama", "36"), + Pair("Ecchi", "49"), + Pair("Escolar", "140"), + Pair("Espacial", "646"), + Pair("Esporte", "106"), + Pair("Família", "1431"), + Pair("Fantasia", "6"), + Pair("Ficção Científica", "99"), + Pair("Ficção Mítica", "1575"), + Pair("Gathering", "2756"), + Pair("Gourmet", "2813"), + Pair("Harém", "189"), + Pair("Histórico", "20"), + Pair("Horror", "256"), + Pair("Insanidade", "387"), + Pair("Isekai", "10"), + Pair("Jogos", "63"), + Pair("Josei", "733"), + Pair("Magia", "82"), + Pair("Maid", "2772"), + Pair("Mecha", "200"), + Pair("Militar", "58"), + Pair("Mistério", "50"), + Pair("Musical", "112"), + Pair("Novel", "951"), + Pair("Paródia", "171"), + Pair("Policial", "249"), + Pair("Psicológico", "66"), + Pair("Pós-Apocalíptico", "470"), + Pair("Reencarnação", "1134"), + Pair("Romance", "7"), + Pair("Samurai", "127"), + Pair("Sci-fi", "203"), + Pair("Seinen", "51"), + Pair("Seven", "1449"), + Pair("Shoujo Ai", "507"), + Pair("Shoujo", "78"), + Pair("Shounen Ai", "1326"), + Pair("Shounen", "17"), + Pair("Slice of Life", "79"), + Pair("Sobrenatural", "8"), + Pair("Studio Deen", "2451"), + Pair("Sunrise", "318"), + Pair("Super Poder", "18"), + Pair("Suspense", "134"), + Pair("Terror", "42"), + Pair("Thriller", "960"), + Pair("Tragédia", "264"), + Pair("Vampiros", "358"), + Pair("Vida Diaria", "1518"), + Pair("Vida Escolar", "67"), + Pair("Violência", "59"), + Pair("Yaoi", "1386"), + Pair("Yuri", "243"), + Pair("Zumbi", "574") + ) + } +} diff --git a/src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SBUrlActivity.kt b/src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SBUrlActivity.kt new file mode 100644 index 000000000..4d8287680 --- /dev/null +++ b/src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SBUrlActivity.kt @@ -0,0 +1,41 @@ +package eu.kanade.tachiyomi.animeextension.pt.subanimes + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +/** + * Springboard that accepts https://subanimes.cc/anime/ intents + * and redirects them to the main Aniyomi process. + */ +class SBUrlActivity : Activity() { + + private val TAG = "SBUrlActivity" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.size > 1) { + val item = pathSegments[1] + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.ANIMESEARCH" + putExtra("query", "${SubAnimes.PREFIX_SEARCH}$item") + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e(TAG, e.toString()) + } + } else { + Log.e(TAG, "could not parse uri from intent $intent") + } + + finish() + exitProcess(0) + } +} diff --git a/src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SubAnimes.kt b/src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SubAnimes.kt new file mode 100644 index 000000000..9811858e6 --- /dev/null +++ b/src/pt/subanimes/src/eu/kanade/tachiyomi/animeextension/pt/subanimes/SubAnimes.kt @@ -0,0 +1,252 @@ +package eu.kanade.tachiyomi.animeextension.pt.subanimes + +import eu.kanade.tachiyomi.animeextension.pt.subanimes.dto.AnimeDataDto +import eu.kanade.tachiyomi.animeextension.pt.subanimes.dto.SearchResultDto +import eu.kanade.tachiyomi.animeextension.pt.subanimes.extractors.SubAnimesExtractor +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.ParsedAnimeHttpSource +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.FormBody +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable +import uy.kohesive.injekt.api.get +import kotlin.Exception + +class SubAnimes : ParsedAnimeHttpSource() { + + override val name = "SubAnimes" + + override val baseUrl = "https://subanimes.cc" + private val API_URL = "$baseUrl/wp-admin/admin-ajax.php" + + override val lang = "pt-BR" + + override val supportsLatest = true + + override val client: OkHttpClient = network.client + + private val json = Json { + ignoreUnknownKeys = true + } + + // ============================== Popular =============================== + override fun popularAnimeSelector() = "div#hype div.aniItem > a" + override fun popularAnimeRequest(page: Int) = GET(baseUrl) + override fun popularAnimeNextPageSelector() = null // disable it + override fun popularAnimeFromElement(element: Element): SAnime = + latestUpdatesFromElement(element) + + // ============================== Episodes ============================== + override fun episodeListSelector() = "div#episodios div.animeVideosItem > a" + private fun episodeListNextPageSelector() = latestUpdatesNextPageSelector() + + override fun fetchEpisodeList(anime: SAnime): Observable> { + return client.newCall(episodeListRequest(anime)) + .asObservableSuccess() + .map { response -> + val realDoc = getRealDoc(response.asJsoup()) + episodeListParse(realDoc).reversed() + } + } + + override fun episodeListParse(response: Response): List { + return episodeListParse(response.asJsoup()) + } + + private fun episodeListParse(doc: Document): List { + val episodeList = mutableListOf() + val eps = doc.select(episodeListSelector()).map(::episodeFromElement) + episodeList.addAll(eps) + val nextPageElement = doc.selectFirst(episodeListNextPageSelector()) + if (nextPageElement != null) { + val nextUrl = nextPageElement.attr("href") + val res = client.newCall(GET(nextUrl)).execute() + episodeList.addAll(episodeListParse(res)) + } + return episodeList + } + + override fun episodeFromElement(element: Element): SEpisode { + return SEpisode.create().apply { + setUrlWithoutDomain(element.attr("href")) + val title = element.attr("title") + name = title + episode_number = runCatching { + title.trim().substringAfterLast(" ").toFloat() + }.getOrDefault(0F) + } + } + + // ============================ Video Links ============================= + override fun videoListParse(response: Response): List