From 0beabc5c0901d3549fcebfa2444fa176894ef886 Mon Sep 17 00:00:00 2001 From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com> Date: Sun, 2 Jun 2024 05:03:22 +0000 Subject: [PATCH] feat(src/pt): New source: Animes CX (#3285) Co-authored-by: Secozzi <49240133+Secozzi@users.noreply.github.com> --- src/pt/animescx/AndroidManifest.xml | 22 ++ src/pt/animescx/build.gradle | 12 + .../animescx/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3776 bytes .../animescx/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2233 bytes .../animescx/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4948 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 8652 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 12684 bytes .../animeextension/pt/animescx/AnimesCX.kt | 270 ++++++++++++++++++ .../pt/animescx/AnimesCXUrlActivity.kt | 41 +++ 9 files changed, 345 insertions(+) create mode 100644 src/pt/animescx/AndroidManifest.xml create mode 100644 src/pt/animescx/build.gradle create mode 100644 src/pt/animescx/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/pt/animescx/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/pt/animescx/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/pt/animescx/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/pt/animescx/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/pt/animescx/src/eu/kanade/tachiyomi/animeextension/pt/animescx/AnimesCX.kt create mode 100644 src/pt/animescx/src/eu/kanade/tachiyomi/animeextension/pt/animescx/AnimesCXUrlActivity.kt diff --git a/src/pt/animescx/AndroidManifest.xml b/src/pt/animescx/AndroidManifest.xml new file mode 100644 index 0000000000..d00179199e --- /dev/null +++ b/src/pt/animescx/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/src/pt/animescx/build.gradle b/src/pt/animescx/build.gradle new file mode 100644 index 0000000000..d84191d091 --- /dev/null +++ b/src/pt/animescx/build.gradle @@ -0,0 +1,12 @@ +ext { + extName = 'Animes CX' + extClass = '.AnimesCX' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" + +dependencies { + implementation(project(":lib:googledrive-extractor")) +} diff --git a/src/pt/animescx/res/mipmap-hdpi/ic_launcher.png b/src/pt/animescx/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b69b280ac93c1ee0afd3d5e04e8c8228342a47a9 GIT binary patch literal 3776 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 Hu0mjfF=Y_M literal 0 HcmV?d00001 diff --git a/src/pt/animescx/res/mipmap-xhdpi/ic_launcher.png b/src/pt/animescx/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb33207f804f1d79c5fcad16b265e66d12a104d GIT binary patch literal 4948 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 literal 0 HcmV?d00001 diff --git a/src/pt/animescx/src/eu/kanade/tachiyomi/animeextension/pt/animescx/AnimesCX.kt b/src/pt/animescx/src/eu/kanade/tachiyomi/animeextension/pt/animescx/AnimesCX.kt new file mode 100644 index 0000000000..65795ccfec --- /dev/null +++ b/src/pt/animescx/src/eu/kanade/tachiyomi/animeextension/pt/animescx/AnimesCX.kt @@ -0,0 +1,270 @@ +package eu.kanade.tachiyomi.animeextension.pt.animescx + +import android.app.Application +import android.util.Base64 +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.ParsedAnimeHttpSource +import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.await +import eu.kanade.tachiyomi.network.awaitSuccess +import eu.kanade.tachiyomi.util.asJsoup +import eu.kanade.tachiyomi.util.parseAs +import kotlinx.serialization.Serializable +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArrayBuilder +import kotlinx.serialization.json.add +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.putJsonArray +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy + +class AnimesCX : ParsedAnimeHttpSource(), ConfigurableAnimeSource { + + override val name = "Animes CX" + + override val baseUrl = "https://animescx.com.br" + + override val lang = "pt-BR" + + override val supportsLatest = true + + private val json: Json by injectLazy() + + private val preferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + // ============================== Popular =============================== + override fun popularAnimeRequest(page: Int) = GET("$baseUrl/doramas-legendados/page/$page", headers) + + override fun popularAnimeParse(response: Response): AnimesPage { + val doc = response.asJsoup() + val animes = doc.select(popularAnimeSelector()).map(::popularAnimeFromElement) + + return AnimesPage(animes, doc.hasNextPage()) + } + + override fun popularAnimeSelector() = "div.listaAnimes_Riverlab_Container > a" + + override fun popularAnimeFromElement(element: Element) = SAnime.create().apply { + setUrlWithoutDomain(element.attr("href")) + title = element.selectFirst("div.infolistaAnimes_RiverLab")!!.text() + thumbnail_url = element.selectFirst("img")?.absUrl("src") + } + + override fun popularAnimeNextPageSelector(): String? { + throw UnsupportedOperationException() + } + + // =============================== Latest =============================== + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/doramas-em-lancamento/page/$page", headers) + + override fun latestUpdatesParse(response: Response) = popularAnimeParse(response) + + override fun latestUpdatesSelector(): String { + throw UnsupportedOperationException() + } + + override fun latestUpdatesFromElement(element: Element): SAnime { + throw UnsupportedOperationException() + } + + override fun latestUpdatesNextPageSelector(): String? { + throw UnsupportedOperationException() + } + + // =============================== Search =============================== + override suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { + return if (query.startsWith(PREFIX_SEARCH)) { // URL intent handler + val path = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/$path", headers)) + .awaitSuccess() + .use(::searchAnimeByIdParse) + } else { + super.getSearchAnime(page, query, filters) + } + } + + private fun searchAnimeByIdParse(response: Response): AnimesPage { + val details = animeDetailsParse(response.asJsoup()) + .apply { setUrlWithoutDomain(response.request.url.toString()) } + return AnimesPage(listOf(details), false) + } + + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList) = + GET("$baseUrl/page/$page/?s=$query", headers) + + override fun searchAnimeSelector() = "article.rl_episodios:has(.rl_AnimeIndexImg)" + + override fun searchAnimeFromElement(element: Element) = SAnime.create().apply { + with(element.selectFirst("a")!!) { + setUrlWithoutDomain(attr("href")) + title = text() + } + + thumbnail_url = element.selectFirst("img")?.absUrl("src") + } + + override fun searchAnimeNextPageSelector() = "a.next.page-numbers" + + // =========================== Anime Details ============================ + override fun animeDetailsParse(document: Document) = SAnime.create().apply { + val infos = document.selectFirst("div.rl_anime_metadados")!! + thumbnail_url = infos.selectFirst("img")?.absUrl("src") + title = infos.selectFirst(".rl_nome_anime")!!.text() + + genre = infos.getInfo("Gêneros").replace(";", ",") + status = when (infos.getInfo("Status")) { + "Completo" -> SAnime.COMPLETED + "Lançando", "Sendo Legendado!" -> SAnime.ONGOING + else -> SAnime.UNKNOWN + } + + description = infos.getInfo("Sinopse") + } + + private fun Element.getInfo(text: String) = + selectFirst(".rl_anime_meta:contains($text)")?.ownText().orEmpty() + + // ============================== Episodes ============================== + override fun episodeListSelector() = ".rl_anime_episodios > article.rl_episodios" + + override fun episodeListParse(response: Response) = buildList { + var doc = response.asJsoup() + + do { + if (isNotEmpty()) { + val url = doc.selectFirst("a.rl_anime_pagination:contains(›)")!!.absUrl("href") + doc = client.newCall(GET(url, headers)).execute().asJsoup() + } + + doc.select(episodeListSelector()) + .map(::episodeFromElement) + .also(::addAll) + } while (doc.hasNextPage()) + + reverse() + } + + override fun episodeFromElement(element: Element) = SEpisode.create().apply { + val num = element.selectFirst("header")!!.text().substringAfterLast(' ') + episode_number = num.toFloatOrNull() ?: 0F + name = "Episódio $num" + scanlator = element.selectFirst("div.rl_episodios_info:contains(Fansub)")?.ownText() + + url = json.encodeToString( + buildJsonObject { + element.select("div.rl_episodios_opcnome[onclick]").forEach { + putJsonArray(it.text(), { getVideoHosts(it.attr("onclick"), element) }) + } + }, + ) + } + + private fun JsonArrayBuilder.getVideoHosts(onclick: String, element: Element) { + val itemId = onclick.substringAfterLast("rlToggle('").substringBefore("'") + element.select("#$itemId a.rl_episodios_link").toList() + .filter { it.text() != "Mega" } + .forEach { el -> + val urlId = el.attr("href").substringAfter("id=") + val url = String(Base64.decode(urlId, Base64.DEFAULT)).reversed() + add(json.encodeToJsonElement(VideoHost.serializer(), VideoHost(el.text(), url))) + } + } + + @Serializable + class VideoHost(val name: String, val url: String) + + // ============================ Video Links ============================= + private val gdriveExtractor by lazy { GoogleDriveExtractor(client, headers) } + + override suspend fun getVideoList(episode: SEpisode): List