diff --git a/src/pt/animesdigital/AndroidManifest.xml b/src/pt/animesdigital/AndroidManifest.xml
new file mode 100644
index 000000000..fc8e8e1e5
--- /dev/null
+++ b/src/pt/animesdigital/AndroidManifest.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pt/animesdigital/build.gradle b/src/pt/animesdigital/build.gradle
new file mode 100644
index 000000000..a3268a271
--- /dev/null
+++ b/src/pt/animesdigital/build.gradle
@@ -0,0 +1,18 @@
+plugins {
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.kotlin.android)
+ alias(libs.plugins.kotlin.serialization)
+}
+
+ext {
+ extName = 'Animes Digital'
+ pkgNameSuffix = 'pt.animesdigital'
+ extClass = '.AnimesDigital'
+ extVersionCode = 1
+}
+
+dependencies {
+ implementation(project(":lib-unpacker"))
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/pt/animesdigital/res/mipmap-hdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..89327846c
Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/pt/animesdigital/res/mipmap-mdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..945328f65
Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/pt/animesdigital/res/mipmap-xhdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..0e16b7059
Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/pt/animesdigital/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..c6b98f1e3
Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/pt/animesdigital/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..b5330a4aa
Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/pt/animesdigital/src/eu/kanade/tachiyomi/animeextension/pt/animesdigital/AnimesDigital.kt b/src/pt/animesdigital/src/eu/kanade/tachiyomi/animeextension/pt/animesdigital/AnimesDigital.kt
new file mode 100644
index 000000000..5fa82b0c3
--- /dev/null
+++ b/src/pt/animesdigital/src/eu/kanade/tachiyomi/animeextension/pt/animesdigital/AnimesDigital.kt
@@ -0,0 +1,325 @@
+package eu.kanade.tachiyomi.animeextension.pt.animesdigital
+
+import android.app.Application
+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.unpacker.Unpacker
+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.Serializable
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
+import okhttp3.FormBody
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
+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 uy.kohesive.injekt.injectLazy
+
+class AnimesDigital : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
+
+ override val name = "Animes Digital"
+
+ override val baseUrl = "https://animesdigital.org"
+
+ override val lang = "pt-BR"
+
+ override val supportsLatest = true
+
+ override fun headersBuilder() = super.headersBuilder().add("Referer", baseUrl)
+
+ private val json: Json by injectLazy()
+
+ private val preferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ // ============================== Popular ===============================
+ override fun popularAnimeFromElement(element: Element) = latestUpdatesFromElement(element)
+ override fun popularAnimeNextPageSelector() = null
+ override fun popularAnimeRequest(page: Int) = GET(baseUrl)
+ override fun popularAnimeSelector() = latestUpdatesSelector()
+
+ // ============================== Episodes ==============================
+ override fun episodeListParse(response: Response): List {
+ val doc = getRealDoc(response.asJsoup())
+ return doc.select(episodeListSelector()).map(::episodeFromElement)
+ }
+
+ override fun episodeFromElement(element: Element) = SEpisode.create().apply {
+ setUrlWithoutDomain(element.attr("href"))
+ val epname = element.selectFirst("div.episode")!!.text()
+ episode_number = epname.substringAfterLast(" ").toFloatOrNull() ?: 1F
+ name = buildString {
+ append(epname)
+ element.selectFirst("div.sub_title")?.text()?.let {
+ if (!it.contains("Ainda não tem um titulo oficial")) {
+ append(" - $it")
+ }
+ }
+ }
+ }
+
+ override fun episodeListSelector() = "div.item_ep > a"
+
+ // =========================== Anime Details ============================
+ override fun animeDetailsParse(document: Document) = SAnime.create().apply {
+ val doc = getRealDoc(document)
+ setUrlWithoutDomain(doc.location())
+ thumbnail_url = doc.selectFirst("div.poster > img")!!.attr("data-lazy-src")
+ status = when (doc.selectFirst("div.clw > div.playon")?.text()) {
+ "Em Lançamento" -> SAnime.ONGOING
+ "Completo" -> SAnime.COMPLETED
+ else -> SAnime.UNKNOWN
+ }
+
+ val infos = doc.selectFirst("div.crw > div.dados")!!
+
+ artist = infos.getInfo("Estúdio")
+ author = infos.getInfo("Autor") ?: infos.getInfo("Diretor")
+
+ title = infos.selectFirst("h1")!!.text()
+ genre = infos.select("div.genre a").eachText().joinToString()
+
+ description = infos.selectFirst("div.sinopse")?.text()
+ }
+
+ // ============================ Video Links =============================
+ override fun videoListParse(response: Response): List