diff --git a/src/pt/animesaria/AndroidManifest.xml b/src/pt/animesaria/AndroidManifest.xml
new file mode 100644
index 000000000..f1050558f
--- /dev/null
+++ b/src/pt/animesaria/AndroidManifest.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pt/animesaria/build.gradle b/src/pt/animesaria/build.gradle
new file mode 100644
index 000000000..621ce756f
--- /dev/null
+++ b/src/pt/animesaria/build.gradle
@@ -0,0 +1,13 @@
+plugins {
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.kotlin.android)
+}
+
+ext {
+ extName = 'Animes Aria'
+ pkgNameSuffix = 'pt.animesaria'
+ extClass = '.AnimesAria'
+ extVersionCode = 1
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/pt/animesaria/res/mipmap-hdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..44beffdb4
Binary files /dev/null and b/src/pt/animesaria/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/pt/animesaria/res/mipmap-mdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..e81b08685
Binary files /dev/null and b/src/pt/animesaria/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/pt/animesaria/res/mipmap-xhdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..36ea0ab4a
Binary files /dev/null and b/src/pt/animesaria/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/pt/animesaria/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..13dbec3a0
Binary files /dev/null and b/src/pt/animesaria/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/pt/animesaria/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..a834a4faa
Binary files /dev/null and b/src/pt/animesaria/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/pt/animesaria/src/eu/kanade/tachiyomi/animeextension/pt/animesaria/AnimesAria.kt b/src/pt/animesaria/src/eu/kanade/tachiyomi/animeextension/pt/animesaria/AnimesAria.kt
new file mode 100644
index 000000000..e172e1d4e
--- /dev/null
+++ b/src/pt/animesaria/src/eu/kanade/tachiyomi/animeextension/pt/animesaria/AnimesAria.kt
@@ -0,0 +1,197 @@
+package eu.kanade.tachiyomi.animeextension.pt.animesaria
+
+import eu.kanade.tachiyomi.animeextension.pt.animesaria.extractors.LinkfunBypasser
+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.asObservableSuccess
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.Headers
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
+import okhttp3.Response
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import rx.Observable
+
+class AnimesAria : ParsedAnimeHttpSource() {
+
+ override val name = "Animes Aria"
+
+ override val baseUrl = "https://animesaria.com"
+
+ override val lang = "pt-BR"
+
+ override val supportsLatest = true
+
+ // ============================== Popular ===============================
+ override fun popularAnimeFromElement(element: Element): SAnime {
+ return SAnime.create().apply {
+ setUrlWithoutDomain(element.attr("href"))
+ title = element.attr("title")
+ thumbnail_url = element.selectFirst("img")!!.attr("src")
+ }
+ }
+
+ override fun popularAnimeNextPageSelector() = latestUpdatesNextPageSelector()
+
+ override fun popularAnimeRequest(page: Int) = GET("$baseUrl/novos/animes?page=$page")
+
+ override fun popularAnimeSelector() = "div.item > a"
+
+ // ============================== Episodes ==============================
+ override fun episodeListParse(response: Response) = super.episodeListParse(response).reversed()
+
+ override fun episodeFromElement(element: Element): SEpisode {
+ return SEpisode.create().apply {
+ element.parent()!!.selectFirst("a > b")!!.ownText().let {
+ name = it
+ episode_number = it.substringAfter(" ").toFloat()
+ }
+ setUrlWithoutDomain(element.attr("href"))
+ scanlator = element.text().substringAfter(" ") // sub/dub
+ }
+ }
+
+ override fun episodeListSelector() = "td div.clear > a.btn-xs"
+
+ // =========================== Anime Details ============================
+ override fun animeDetailsParse(document: Document): SAnime {
+ return SAnime.create().apply {
+ val row = document.selectFirst("div.anime_background_w div.row")!!
+ title = row.selectFirst("h1 > span")!!.text()
+ status = row.selectFirst("div.clear span.btn")?.text().toStatus()
+ thumbnail_url = document.selectFirst("link[as=image]")!!.attr("href")
+ genre = row.select("div.clear a.btn").eachText().joinToString()
+
+ description = buildString {
+ document.selectFirst("li.active > small")!!
+ .ownText()
+ .substringAfter(": ")
+ .let(::append)
+
+ append("\n\n")
+
+ row.selectFirst("h1 > small")?.text()?.let {
+ append("Títulos Alternativos: $it\n")
+ }
+
+ // Additional info
+ row.select("div.pull-right > a").forEach {
+ val title = it.selectFirst("small")!!.text()
+ val value = it.selectFirst("span")!!.text()
+ append("$title: $value\n")
+ }
+ }
+ }
+ }
+
+ // ============================ Video Links =============================
+ override fun videoListParse(response: Response): List