diff --git a/src/pt/megaflix/AndroidManifest.xml b/src/pt/megaflix/AndroidManifest.xml
new file mode 100644
index 000000000..1c6c0139a
--- /dev/null
+++ b/src/pt/megaflix/AndroidManifest.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pt/megaflix/build.gradle b/src/pt/megaflix/build.gradle
new file mode 100644
index 000000000..912c09f84
--- /dev/null
+++ b/src/pt/megaflix/build.gradle
@@ -0,0 +1,22 @@
+plugins {
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.kotlin.android)
+}
+
+ext {
+ extName = 'Megaflix'
+ pkgNameSuffix = 'pt.megaflix'
+ extClass = '.Megaflix'
+ extVersionCode = 1
+ containsNsfw = true
+}
+
+dependencies {
+ implementation(project(":lib-fembed-extractor"))
+ implementation(project(":lib-streamsb-extractor"))
+ implementation(project(":lib-streamtape-extractor"))
+ // for mixdrop and megaflix
+ implementation("dev.datlag.jsunpacker:jsunpacker:1.0.1")
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/pt/megaflix/res/mipmap-hdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..bf99313a7
Binary files /dev/null and b/src/pt/megaflix/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/pt/megaflix/res/mipmap-mdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..0bf5f9da7
Binary files /dev/null and b/src/pt/megaflix/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/pt/megaflix/res/mipmap-xhdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..6ea93116b
Binary files /dev/null and b/src/pt/megaflix/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/pt/megaflix/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..c441ac817
Binary files /dev/null and b/src/pt/megaflix/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/pt/megaflix/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..524bfd1db
Binary files /dev/null and b/src/pt/megaflix/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt
new file mode 100644
index 000000000..cc21b4ced
--- /dev/null
+++ b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt
@@ -0,0 +1,290 @@
+package eu.kanade.tachiyomi.animeextension.pt.megaflix
+
+import android.app.Application
+import android.content.SharedPreferences
+import android.util.Base64
+import androidx.preference.ListPreference
+import androidx.preference.PreferenceScreen
+import eu.kanade.tachiyomi.animeextension.pt.megaflix.extractors.MegaflixExtractor
+import eu.kanade.tachiyomi.animeextension.pt.megaflix.extractors.MixDropExtractor
+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.fembedextractor.FembedExtractor
+import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
+import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.asObservableSuccess
+import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.async
+import kotlinx.coroutines.awaitAll
+import kotlinx.coroutines.runBlocking
+import okhttp3.Request
+import okhttp3.Response
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import rx.Observable
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+
+class Megaflix : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
+
+ override val name = "Megaflix"
+
+ override val baseUrl = "https://megaflix.co"
+
+ override val lang = "pt-BR"
+
+ override val supportsLatest = true
+
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ // ============================== Popular ===============================
+ override fun popularAnimeFromElement(element: Element): SAnime {
+ return SAnime.create().apply {
+ title = element.selectFirst("h2.entry-title")!!.text()
+ setUrlWithoutDomain(element.selectFirst("a.lnk-blk")!!.attr("href"))
+ thumbnail_url = "https:" + element.selectFirst("img")!!.attr("src")
+ }
+ }
+
+ override fun popularAnimeNextPageSelector() = null
+
+ override fun popularAnimeRequest(page: Int) = GET(baseUrl)
+
+ override fun popularAnimeSelector() = "section#widget_list_movies_series-5 li > article"
+
+ // ============================== Episodes ==============================
+ override fun episodeFromElement(element: Element): SEpisode {
+ return SEpisode.create().apply {
+ name = element.selectFirst("h2.entry-title")!!.text()
+ setUrlWithoutDomain(element.selectFirst("a.lnk-blk")!!.attr("href"))
+ episode_number = element.selectFirst("span.num-epi")
+ ?.text()
+ ?.substringAfter("x")
+ ?.toFloatOrNull()
+ ?: 0F
+ }
+ }
+
+ override fun episodeListSelector() = "li > article.episodes"
+
+ override fun episodeListParse(response: Response): List {
+ val items = response.asJsoup().select(episodeListSelector())
+ return when {
+ items.isEmpty() -> listOf(
+ SEpisode.create().apply {
+ name = "Filme"
+ setUrlWithoutDomain(response.request.url.toString())
+ episode_number = 1F
+ },
+ )
+ else -> items.map(::episodeFromElement)
+ }
+ }
+
+ // =========================== Anime Details ============================
+ override fun animeDetailsParse(document: Document): SAnime {
+ return SAnime.create().apply {
+ val infos = document.selectFirst("div.bd > article.post.single")!!
+ title = infos.selectFirst("h1.entry-title")!!.text()
+ thumbnail_url = "https:" + infos.selectFirst("img")!!.attr("src")
+ genre = infos.select("span.genres > a").eachText().joinToString()
+ description = infos.selectFirst("div.description")?.text()
+ }
+ }
+
+ // ============================ Video Links =============================
+ override fun videoListParse(response: Response): List