diff --git a/src/pt/betteranime/AndroidManifest.xml b/src/pt/betteranime/AndroidManifest.xml
deleted file mode 100644
index c71bf9103..000000000
--- a/src/pt/betteranime/AndroidManifest.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pt/betteranime/build.gradle b/src/pt/betteranime/build.gradle
deleted file mode 100644
index 8be367dd8..000000000
--- a/src/pt/betteranime/build.gradle
+++ /dev/null
@@ -1,17 +0,0 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlinx-serialization'
-
-ext {
- extName = 'Better Anime'
- pkgNameSuffix = 'pt.betteranime'
- extClass = '.BetterAnime'
- extVersionCode = 5
- libVersion = '13'
-}
-
-dependencies {
- compileOnly libs.bundles.coroutines
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/pt/betteranime/res/mipmap-hdpi/ic_launcher.png b/src/pt/betteranime/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 4f2f2aecc..000000000
Binary files a/src/pt/betteranime/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/betteranime/res/mipmap-mdpi/ic_launcher.png b/src/pt/betteranime/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 9160b10a4..000000000
Binary files a/src/pt/betteranime/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/betteranime/res/mipmap-xhdpi/ic_launcher.png b/src/pt/betteranime/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 78c2ef2a8..000000000
Binary files a/src/pt/betteranime/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/betteranime/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/betteranime/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index dfec36fad..000000000
Binary files a/src/pt/betteranime/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/betteranime/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/betteranime/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 474fdb69a..000000000
Binary files a/src/pt/betteranime/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAFilters.kt b/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAFilters.kt
deleted file mode 100644
index e7937655d..000000000
--- a/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAFilters.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-package eu.kanade.tachiyomi.animeextension.pt.betteranime
-
-import eu.kanade.tachiyomi.animesource.model.AnimeFilter
-import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
-
-object BAFilters {
-
- open class QueryPartFilter(
- displayName: String,
- val vals: Array>
- ) : AnimeFilter.Select(
- displayName,
- vals.map { it.first }.toTypedArray()
- ) {
-
- fun toQueryPart() = vals[state].second
- }
-
- 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.getFirst(): R {
- return this.filterIsInstance().first()
- }
-
- private inline fun AnimeFilterList.asQueryPart(): String {
- return this.filterIsInstance().joinToString("") {
- (it as QueryPartFilter).toQueryPart()
- }
- }
-
- class LanguageFilter : QueryPartFilter("Idioma", BAFiltersData.languages)
- class YearFilter : QueryPartFilter("Ano", BAFiltersData.years)
-
- class GenresFilter : CheckBoxFilterList(
- "Gêneros",
- BAFiltersData.genres.map { CheckBoxVal(it.first, false) }
- )
-
- val filterList = AnimeFilterList(
- LanguageFilter(),
- YearFilter(),
- GenresFilter()
- )
-
- data class FilterSearchParams(
- val language: String = "",
- val year: String = "",
- val genres: List = emptyList()
- )
-
- internal fun getSearchParameters(filters: AnimeFilterList): FilterSearchParams {
- if (filters.isEmpty()) return FilterSearchParams()
-
- val genres = listOf("") + filters.getFirst().state
- .mapNotNull { genre ->
- if (genre.state) {
- BAFiltersData.genres.find { it.first == genre.name }!!.second
- } else { null }
- }.toList()
-
- return FilterSearchParams(
- filters.asQueryPart(),
- filters.asQueryPart(),
- genres
- )
- }
-
- private object BAFiltersData {
- val every = Pair("Qualquer um", "")
-
- val languages = arrayOf(
- every,
- Pair("Legendado", "legendado"),
- Pair("Dublado", "dublado")
- )
-
- val years = arrayOf(every) + (2022 downTo 1976).map {
- Pair(it.toString(), it.toString())
- }.toTypedArray()
-
- val genres = arrayOf(
- Pair("Ação", "acao"),
- Pair("Artes Marciais", "artes-marciais"),
- Pair("Aventura", "aventura"),
- Pair("Comédia", "comedia"),
- Pair("Cotidiano", "cotidiano"),
- Pair("Demência", "demencia"),
- Pair("Demônios", "demonios"),
- Pair("Drama", "drama"),
- Pair("Ecchi", "ecchi"),
- Pair("Escolar", "escolar"),
- Pair("Espacial", "espacial"),
- Pair("Esportes", "esportes"),
- Pair("Fantasia", "fantasia"),
- Pair("Ficção Científica", "ficcao-cientifica"),
- Pair("Game", "game"),
- Pair("Harém", "harem"),
- Pair("Histórico", "historico"),
- Pair("Horror", "horror"),
- Pair("Infantil", "infantil"),
- Pair("Josei", "josei"),
- Pair("Magia", "magia"),
- Pair("Mecha", "mecha"),
- Pair("Militar", "militar"),
- Pair("Mistério", "misterio"),
- Pair("Musical", "musical"),
- Pair("Paródia", "parodia"),
- Pair("Policial", "policial"),
- Pair("Psicológico", "psicologico"),
- Pair("Romance", "romance"),
- Pair("Samurai", "samurai"),
- Pair("Sci-Fi", "sci-fi"),
- Pair("Seinen", "seinen"),
- Pair("Shoujo-Ai", "shoujo-ai"),
- Pair("Shoujo", "shoujo"),
- Pair("Shounen-Ai", "shounen-ai"),
- Pair("Shounen", "shounen"),
- Pair("Slice of Life", "slice-of-life"),
- Pair("Sobrenatural", "sobrenatural"),
- Pair("Super Poderes", "super-poderes"),
- Pair("Suspense", "suspense"),
- Pair("Terror", "terror"),
- Pair("Thriller", "thriller"),
- Pair("Tragédia", "tragedia"),
- Pair("Vampiros", "vampiros"),
- Pair("Vida Escolar", "vida-escolar"),
- Pair("Yaoi", "yaoi"),
- Pair("Yuri", "yuri"),
- )
- }
-}
diff --git a/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAUrlActivity.kt b/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAUrlActivity.kt
deleted file mode 100644
index 0f09cb976..000000000
--- a/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAUrlActivity.kt
+++ /dev/null
@@ -1,44 +0,0 @@
-package eu.kanade.tachiyomi.animeextension.pt.betteranime
-
-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://betteranime.net///- intents
- * and redirects them to the main Aniyomi process.
- */
-class BAUrlActivity : Activity() {
-
- private val TAG = "BAUrlActivity"
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- val pathSegments = intent?.data?.pathSegments
- if (pathSegments != null && pathSegments.size > 1) {
- val type = pathSegments[0]
- val lang = pathSegments[1]
- val item = pathSegments[2]
- val searchQuery = "$type/$lang/$item"
- val mainIntent = Intent().apply {
- action = "eu.kanade.tachiyomi.ANIMESEARCH"
- putExtra("query", "${BetterAnime.PREFIX_SEARCH_PATH}$searchQuery")
- 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/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAUtils.kt b/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAUtils.kt
deleted file mode 100644
index bb0d3b200..000000000
--- a/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BAUtils.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package eu.kanade.tachiyomi.animeextension.pt.betteranime
-
-// Terrible way to reinvent the wheel, i just didnt wanted to use apache commons.
-fun String.unescape(): String {
- return UNICODE_REGEX.replace(this) {
- it.groupValues[1]
- .toInt(16)
- .toChar()
- .toString()
- }.replace("\\", "")
-}
-private val UNICODE_REGEX = "\\\\u(\\d+)".toRegex()
diff --git a/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BetterAnime.kt b/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BetterAnime.kt
deleted file mode 100644
index 59ee603a7..000000000
--- a/src/pt/betteranime/src/eu/kanade/tachiyomi/animeextension/pt/betteranime/BetterAnime.kt
+++ /dev/null
@@ -1,332 +0,0 @@
-package eu.kanade.tachiyomi.animeextension.pt.betteranime
-
-import android.app.Application
-import android.content.SharedPreferences
-import androidx.preference.ListPreference
-import androidx.preference.PreferenceScreen
-import eu.kanade.tachiyomi.animeextension.pt.betteranime.dto.LivewireResponseDto
-import eu.kanade.tachiyomi.animeextension.pt.betteranime.dto.PayloadData
-import eu.kanade.tachiyomi.animeextension.pt.betteranime.dto.PayloadItem
-import eu.kanade.tachiyomi.animeextension.pt.betteranime.extractors.BetterAnimeExtractor
-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.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.encodeToString
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.JsonPrimitive
-import okhttp3.Headers
-import okhttp3.MediaType.Companion.toMediaType
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import okhttp3.RequestBody.Companion.toRequestBody
-import okhttp3.Response
-import org.jsoup.Jsoup
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import rx.Observable
-import uy.kohesive.injekt.Injekt
-import uy.kohesive.injekt.api.get
-import java.lang.Exception
-
-class BetterAnime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
-
- override val name = "Better Anime"
-
- override val baseUrl = "https://betteranime.net"
-
- override val lang = "pt-BR"
-
- override val supportsLatest = true
-
- override val client: OkHttpClient = network.cloudflareClient
-
- private val json = Json {
- ignoreUnknownKeys = true
- }
-
- private val preferences: SharedPreferences by lazy {
- Injekt.get().getSharedPreferences("source_$id", 0x0000)
- }
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
- .add("Referer", baseUrl)
- .add("Accept-Language", ACCEPT_LANGUAGE)
-
- // ============================== Popular ===============================
- private fun nextPageSelector(): String = "ul.pagination li.page-item:contains(›)"
- override fun popularAnimeNextPageSelector() = throw Exception("not used")
- override fun popularAnimeSelector(): String = "div.list-animes article"
-
- override fun popularAnimeFromElement(element: Element): SAnime {
- val anime = SAnime.create()
- val img = element.selectFirst("img")!!
- val url = element.selectFirst("a")?.attr("href")!!
- anime.setUrlWithoutDomain(url)
- anime.title = element.selectFirst("h3")?.text()!!
- anime.thumbnail_url = "https:" + img.attr("src")
- return anime
- }
-
- // The site doesn't have a popular anime tab, so we use the latest anime page instead.
- override fun popularAnimeRequest(page: Int): Request =
- GET("$baseUrl/ultimosAdicionados?page=$page")
-
- override fun popularAnimeParse(response: Response): AnimesPage {
- val document = response.asJsoup()
- val animes = document.select(popularAnimeSelector()).map { element ->
- popularAnimeFromElement(element)
- }
- val hasNextPage = hasNextPage(document)
- return AnimesPage(animes, hasNextPage)
- }
-
- // ============================== Episodes ==============================
- override fun episodeListSelector(): String = "ul#episodesList > li.list-group-item-action > a"
-
- override fun episodeListParse(response: Response): List {
- val document = response.asJsoup()
- val episodes = document.select(episodeListSelector()).map { element ->
- episodeFromElement(element)
- }
- return episodes.reversed()
- }
-
- override fun episodeFromElement(element: Element): SEpisode {
- val episode = SEpisode.create()
- val episodeName = element.text()
- episode.setUrlWithoutDomain(element.attr("href"))
- episode.name = episodeName
- episode.episode_number = try {
- episodeName.substringAfterLast(" ").toFloat()
- } catch (e: NumberFormatException) { 0F }
- return episode
- }
-
- // ============================ Video Links =============================
- override fun videoListParse(response: Response): List