diff --git a/src/pt/anidong/AndroidManifest.xml b/src/pt/anidong/AndroidManifest.xml
deleted file mode 100644
index 2970f0d2..00000000
--- a/src/pt/anidong/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pt/anidong/build.gradle b/src/pt/anidong/build.gradle
deleted file mode 100644
index 57fb4d05..00000000
--- a/src/pt/anidong/build.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-ext {
- extName = 'AniDong'
- extClass = '.AniDong'
- extVersionCode = 2
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/pt/anidong/res/mipmap-hdpi/ic_launcher.png b/src/pt/anidong/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 50be877d..00000000
Binary files a/src/pt/anidong/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/anidong/res/mipmap-mdpi/ic_launcher.png b/src/pt/anidong/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index b23fff3a..00000000
Binary files a/src/pt/anidong/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/anidong/res/mipmap-xhdpi/ic_launcher.png b/src/pt/anidong/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 71ddb7b8..00000000
Binary files a/src/pt/anidong/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/anidong/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/anidong/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 720b33eb..00000000
Binary files a/src/pt/anidong/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/anidong/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/anidong/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index a0cb538f..00000000
Binary files a/src/pt/anidong/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
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
deleted file mode 100644
index ea22f1d3..00000000
--- a/src/pt/anidong/src/eu/kanade/tachiyomi/animeextension/pt/anidong/AniDong.kt
+++ /dev/null
@@ -1,264 +0,0 @@
-package eu.kanade.tachiyomi.animeextension.pt.anidong
-
-import eu.kanade.tachiyomi.animeextension.pt.anidong.dto.EpisodeDto
-import eu.kanade.tachiyomi.animeextension.pt.anidong.dto.EpisodeListDto
-import eu.kanade.tachiyomi.animeextension.pt.anidong.dto.SearchResultDto
-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.awaitSuccess
-import eu.kanade.tachiyomi.util.asJsoup
-import kotlinx.serialization.json.Json
-import okhttp3.FormBody
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import uy.kohesive.injekt.injectLazy
-
-class AniDong : ParsedAnimeHttpSource() {
-
- override val name = "AniDong"
-
- override val baseUrl = "https://anidong.net"
-
- override val lang = "pt-BR"
-
- override val supportsLatest = true
-
- private val json: Json by injectLazy()
-
- private val apiHeaders by lazy {
- headersBuilder() // sets user-agent
- .add("Referer", baseUrl)
- .add("x-requested-with", "XMLHttpRequest")
- .build()
- }
-
- // ============================== 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")
- thumbnail_url = element.selectFirst("img")?.attr("src")
- }
-
- override fun popularAnimeNextPageSelector() = null
-
- // =============================== 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 suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage {
- return if (query.startsWith(PREFIX_SEARCH)) { // URL intent handler
- val id = query.removePrefix(PREFIX_SEARCH)
- client.newCall(GET("$baseUrl/anime/$id"))
- .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())
- initialized = true
- }
-
- 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()
- .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.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()
- }
-
- override fun searchAnimeFromElement(element: Element): SAnime {
- throw UnsupportedOperationException()
- }
-
- override fun searchAnimeNextPageSelector(): String? {
- throw UnsupportedOperationException()
- }
-
- // =========================== 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()
- }
-
- override fun episodeFromElement(element: Element): SEpisode {
- throw UnsupportedOperationException()
- }
-
- override fun episodeListParse(response: Response): List {
- val doc = getRealDoc(response.asJsoup())
-
- val id = doc.selectFirst("link[rel=shortlink]")!!.attr("href").substringAfter("=")
- val body = FormBody.Builder()
- .add("action", "show_videos")
- .add("anime_id", id)
- .build()
-
- val res = client.newCall(POST("$baseUrl/api", apiHeaders, body)).execute()
- .body.string()
- val data = json.decodeFromString(res)
-
- return buildList {
- data.episodes.forEach { add(episodeFromObject(it, "Episódio")) }
- data.movies.forEach { add(episodeFromObject(it, "Filme")) }
- data.ovas.forEach { add(episodeFromObject(it, "OVA")) }
- sortByDescending { it.episode_number }
- }
- }
-
- private fun episodeFromObject(episode: EpisodeDto, prefix: String) = SEpisode.create().apply {
- setUrlWithoutDomain(episode.epi_url)
- episode_number = episode.epi_num.toFloatOrNull() ?: 0F
- name = "$prefix ${episode.epi_num}"
- }
-
- // ============================ Video Links =============================
- override fun videoListParse(response: Response): List