From e93c99701bb699059b17ece8e840af697a1ad475 Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Thu, 2 Nov 2023 08:33:39 -0300 Subject: [PATCH] refactor(src/pt): General refactorations + Purge AnimeTV (#2458) --- .../animeextension/pt/anidong/AniDong.kt | 255 ++++++++-------- .../pt/anidong/AniDongFilters.kt | 1 + .../animeextension/pt/animefire/AFFilters.kt | 5 +- .../animeextension/pt/animefire/AnimeFire.kt | 115 ++++--- .../extractors/AnimeFireExtractor.kt | 10 +- .../animefire/extractors/IframeExtractor.kt | 4 +- .../pt/animesaria/AnimesAria.kt | 142 ++++----- .../pt/animesaria/AnimesAriaFilters.kt | 20 +- .../pt/animesdigital/AnimesDigital.kt | 281 +++++++++--------- .../pt/animesdigital/AnimesDigitalFilters.kt | 16 +- .../pt/animesgames/AnimesGames.kt | 10 +- .../pt/animesgames/AnimesGamesFilters.kt | 14 +- .../pt/animesorion/AnimesOrion.kt | 13 +- .../pt/animesroll/AnimesROLL.kt | 148 +++++---- .../animeextension/pt/animestc/ATCFilters.kt | 66 ++-- .../animeextension/pt/animestc/AnimesTC.kt | 12 +- .../pt/animestc/extractors/LinkBypasser.kt | 1 - .../pt/animesvision/AVFilters.kt | 1 + .../pt/animesvision/AnimesVision.kt | 205 +++++++------ .../extractors/GlobalVisionExtractor.kt | 1 + .../pt/animeszone/AnimesZone.kt | 59 ++-- .../pt/animeszone/AnimesZoneFilters.kt | 36 +-- src/pt/animetv/AndroidManifest.xml | 2 - src/pt/animetv/build.gradle | 13 - .../res/mipmap-hdpi-v4/ic_launcher.png | Bin 9480 -> 0 bytes .../res/mipmap-ldpi-v4/ic_launcher.png | Bin 2896 -> 0 bytes .../res/mipmap-mdpi-v4/ic_launcher.png | Bin 4735 -> 0 bytes .../res/mipmap-xhdpi-v4/ic_launcher.png | Bin 16010 -> 0 bytes .../res/mipmap-xxhdpi-v4/ic_launcher.png | Bin 32254 -> 0 bytes .../res/mipmap-xxxhdpi-v4/ic_launcher.png | Bin 52517 -> 0 bytes .../animeextension/pt/animetv/AnimeTV.kt | 139 --------- .../animeextension/pt/anitube/Anitube.kt | 18 +- .../pt/betteranime/BAFilters.kt | 22 +- .../pt/betteranime/BetterAnime.kt | 2 +- .../extractors/BetterAnimeExtractor.kt | 17 +- .../pt/donghuanosekai/DonghuaNoSekai.kt | 20 +- .../donghuanosekai/DonghuaNoSekaiFilters.kt | 16 +- .../extractors/DonghuaNoSekaiExtractor.kt | 16 +- .../animeextension/pt/flixei/Flixei.kt | 172 +++++------ .../pt/hentaistube/HentaisTube.kt | 23 +- .../pt/hentaistube/HentaisTubeFilters.kt | 6 +- .../pt/hinatasoul/HinataSoul.kt | 7 +- .../pt/listadeanimes/ListaDeAnimes.kt | 112 +++---- .../animeextension/pt/megaflix/Megaflix.kt | 35 +-- .../pt/megaflix/MegaflixFilters.kt | 4 +- .../megaflix/extractors/MegaflixExtractor.kt | 2 +- .../animeextension/pt/meusanimes/MAFilters.kt | 6 +- .../pt/meusanimes/MeusAnimes.kt | 157 +++++----- src/pt/muitohentai/build.gradle | 13 +- .../pt/muitohentai/MuitoHentai.kt | 161 +++++----- .../animeextension/pt/vizer/Vizer.kt | 199 ++++++------- .../animeextension/pt/vizer/VizerFilters.kt | 34 +-- 52 files changed, 1185 insertions(+), 1426 deletions(-) delete mode 100644 src/pt/animetv/AndroidManifest.xml delete mode 100644 src/pt/animetv/build.gradle delete mode 100644 src/pt/animetv/res/mipmap-hdpi-v4/ic_launcher.png delete mode 100644 src/pt/animetv/res/mipmap-ldpi-v4/ic_launcher.png delete mode 100644 src/pt/animetv/res/mipmap-mdpi-v4/ic_launcher.png delete mode 100644 src/pt/animetv/res/mipmap-xhdpi-v4/ic_launcher.png delete mode 100644 src/pt/animetv/res/mipmap-xxhdpi-v4/ic_launcher.png delete mode 100644 src/pt/animetv/res/mipmap-xxxhdpi-v4/ic_launcher.png delete mode 100644 src/pt/animetv/src/eu/kanade/tachiyomi/animeextension/pt/animetv/AnimeTV.kt diff --git a/src/pt/anidong/src/eu/kanade/tachiyomi/animeextension/pt/anidong/AniDong.kt b/src/pt/anidong/src/eu/kanade/tachiyomi/animeextension/pt/anidong/AniDong.kt index da8f6d7ac..943d357d2 100644 --- a/src/pt/anidong/src/eu/kanade/tachiyomi/animeextension/pt/anidong/AniDong.kt +++ b/src/pt/anidong/src/eu/kanade/tachiyomi/animeextension/pt/anidong/AniDong.kt @@ -13,7 +13,6 @@ 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.Request @@ -43,6 +42,10 @@ class AniDong : ParsedAnimeHttpSource() { } // ============================== Popular =============================== + override fun popularAnimeRequest(page: Int) = GET(baseUrl) + + override fun popularAnimeSelector() = "article.top10_animes_item > a" + override fun popularAnimeFromElement(element: Element) = SAnime.create().apply { setUrlWithoutDomain(element.attr("href")) title = element.attr("title") @@ -50,20 +53,134 @@ class AniDong : ParsedAnimeHttpSource() { } override fun popularAnimeNextPageSelector() = null - override fun popularAnimeRequest(page: Int) = GET(baseUrl) - override fun popularAnimeSelector() = "article.top10_animes_item > a" - // ============================== Episodes ============================== - override fun episodeFromElement(element: Element): SEpisode { + // =============================== Latest =============================== + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/lancamentos/page/$page/") + + override fun latestUpdatesSelector() = "article.main_content_article > a" + + override fun latestUpdatesFromElement(element: Element) = popularAnimeFromElement(element) + + override fun latestUpdatesNextPageSelector() = "div.paginacao > a.next" + + // =============================== Search =============================== + override fun fetchSearchAnime(page: Int, query: String, filters: AnimeFilterList): Observable { + return if (query.startsWith(PREFIX_SEARCH)) { // URL intent handler + val id = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/anime/$id")) + .asObservableSuccess() + .map(::searchAnimeByIdParse) + } else { + super.fetchSearchAnime(page, query, filters) + } + } + + private fun searchAnimeByIdParse(response: Response): AnimesPage { + val details = animeDetailsParse(response.use { it.asJsoup() }) + return AnimesPage(listOf(details), false) + } + + override fun getFilterList() = AniDongFilters.FILTER_LIST + + private val nonce by lazy { + client.newCall(GET("$baseUrl/?js_global=1&ver=6.2.2")).execute() + .use { it.body.string() } + .substringAfter("search_nonce") + .substringAfter("'") + .substringBefore("'") + } + + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + val params = AniDongFilters.getSearchParameters(filters) + + val body = FormBody.Builder() + .add("letra", "") + .add("action", "show_animes_ajax") + .add("nome", query) + .add("status", params.status) + .add("formato", params.format) + .add("search_nonce", nonce) + .add("paged", page.toString()) + .apply { + params.genres.forEach { add("generos[]", it) } + }.build() + + return POST("$baseUrl/wp-admin/admin-ajax.php", headers = apiHeaders, body = body) + } + + override fun searchAnimeParse(response: Response): AnimesPage { + val searchData: SearchResultDto = response.use { it.body.string() } + .takeIf { it.trim() != "402" } + ?.let(json::decodeFromString) + ?: return AnimesPage(emptyList(), false) + + val animes = searchData.animes.map { + SAnime.create().apply { + setUrlWithoutDomain(it.url) + title = it.title + thumbnail_url = it.thumbnail_url + } + } + + val hasNextPage = searchData.pages > 1 && searchData.animes.size == 10 + + return AnimesPage(animes, hasNextPage) + } + + override fun searchAnimeSelector(): String { throw UnsupportedOperationException("Not used.") } + override fun searchAnimeFromElement(element: Element): SAnime { + throw UnsupportedOperationException("Not used.") + } + + override fun searchAnimeNextPageSelector(): String? { + throw UnsupportedOperationException("Not used.") + } + + // =========================== Anime Details ============================ + override fun animeDetailsParse(document: Document) = SAnime.create().apply { + val doc = getRealDoc(document) + val infos = doc.selectFirst("div.anime_infos")!! + + setUrlWithoutDomain(doc.location()) + title = infos.selectFirst("div > h3")!!.ownText() + thumbnail_url = infos.selectFirst("img")?.attr("src") + genre = infos.select("div[itemprop=genre] a").eachText().joinToString() + artist = infos.selectFirst("div[itemprop=productionCompany]")?.text() + + status = doc.selectFirst("div:contains(Status) span")?.text().let { + when { + it == null -> SAnime.UNKNOWN + it == "Completo" -> SAnime.COMPLETED + it.contains("Lançamento") -> SAnime.ONGOING + else -> SAnime.UNKNOWN + } + } + + description = buildString { + infos.selectFirst("div.anime_name + div.anime_info")?.text()?.also { + append("Nomes alternativos: $it\n") + } + + doc.selectFirst("div[itemprop=description]")?.text()?.also { + append("\n$it") + } + } + } + + // ============================== Episodes ============================== override fun episodeListSelector(): String { throw UnsupportedOperationException("Not used.") } + override fun episodeFromElement(element: Element): SEpisode { + throw UnsupportedOperationException("Not used.") + } + override fun episodeListParse(response: Response): List { - val doc = getRealDoc(response.asJsoup()) + val doc = getRealDoc(response.use { it.asJsoup() }) val id = doc.selectFirst("link[rel=shortlink]")!!.attr("href").substringAfter("=") val body = FormBody.Builder() @@ -71,8 +188,9 @@ class AniDong : ParsedAnimeHttpSource() { .add("anime_id", id) .build() - val res = client.newCall(POST("$baseUrl/api", headers = apiHeaders, body = body)).execute() - val data = json.decodeFromString(res.body.string()) + val res = client.newCall(POST("$baseUrl/api", apiHeaders, body)).execute() + .use { it.body.string() } + val data = json.decodeFromString(res) return buildList { data.episodes.forEach { add(episodeFromObject(it, "Episódio")) } @@ -88,40 +206,9 @@ class AniDong : ParsedAnimeHttpSource() { name = "$prefix ${episode.epi_num}" } - // =========================== Anime Details ============================ - override fun animeDetailsParse(document: Document) = SAnime.create().apply { - val doc = getRealDoc(document) - val infos = doc.selectFirst("div.anime_infos")!! - - setUrlWithoutDomain(doc.location()) - title = infos.selectFirst("div > h3")!!.ownText() - thumbnail_url = infos.selectFirst("img")!!.attr("src") - genre = infos.select("div[itemprop=genre] a").eachText().joinToString() - artist = infos.selectFirst("div[itemprop=productionCompany]")!!.text() - - status = doc.selectFirst("div:contains(Status) span")?.text().let { - when { - it == null -> SAnime.UNKNOWN - it == "Completo" -> SAnime.COMPLETED - it.contains("Lançamento") -> SAnime.ONGOING - else -> SAnime.UNKNOWN - } - } - - description = buildString { - infos.selectFirst("div.anime_name + div.anime_info")?.text()?.let { - append("Nomes alternativos: $it\n") - } - - doc.selectFirst("div[itemprop=description]")?.text()?.let { - append("\n$it") - } - } - } - // ============================ Video Links ============================= override fun videoListParse(response: Response): List