diff --git a/src/ar/animeiat/AndroidManifest.xml b/src/ar/animeiat/AndroidManifest.xml
new file mode 100644
index 000000000..568741e54
--- /dev/null
+++ b/src/ar/animeiat/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/src/ar/animeiat/build.gradle b/src/ar/animeiat/build.gradle
new file mode 100644
index 000000000..30249807e
--- /dev/null
+++ b/src/ar/animeiat/build.gradle
@@ -0,0 +1,13 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlinx-serialization'
+
+ext {
+ extName = 'Animeiat'
+ pkgNameSuffix = 'ar.animeiat'
+ extClass = '.Animeiat'
+ extVersionCode = 1
+ libVersion = '13'
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/ar/animeiat/res/mipmap-hdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..ae82a79a9
Binary files /dev/null and b/src/ar/animeiat/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/ar/animeiat/res/mipmap-mdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..948ba867e
Binary files /dev/null and b/src/ar/animeiat/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/ar/animeiat/res/mipmap-xhdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..3e0238e0a
Binary files /dev/null and b/src/ar/animeiat/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/ar/animeiat/res/mipmap-xxhdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..3dca58bff
Binary files /dev/null and b/src/ar/animeiat/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/ar/animeiat/res/mipmap-xxxhdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..cedf6b447
Binary files /dev/null and b/src/ar/animeiat/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/ar/animeiat/res/web_hi_res_512.png b/src/ar/animeiat/res/web_hi_res_512.png
new file mode 100644
index 000000000..06a6eece9
Binary files /dev/null and b/src/ar/animeiat/res/web_hi_res_512.png differ
diff --git a/src/ar/animeiat/src/eu/kanade/tachiyomi/animeextension/ar/animeiat/Animeiat.kt b/src/ar/animeiat/src/eu/kanade/tachiyomi/animeextension/ar/animeiat/Animeiat.kt
new file mode 100644
index 000000000..8540c66a8
--- /dev/null
+++ b/src/ar/animeiat/src/eu/kanade/tachiyomi/animeextension/ar/animeiat/Animeiat.kt
@@ -0,0 +1,232 @@
+package eu.kanade.tachiyomi.animeextension.ar.animeiat
+
+import android.app.Application
+import android.content.SharedPreferences
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.preference.ListPreference
+import androidx.preference.PreferenceScreen
+import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.AnimeEpisodesList
+import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.AnimePageResponse
+import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.LatestAnimeResponse
+import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.PopularAnimeResponse
+import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.StreamLinks
+import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
+import eu.kanade.tachiyomi.animesource.model.AnimeFilter
+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.AnimeHttpSource
+import eu.kanade.tachiyomi.network.GET
+import kotlinx.serialization.json.Json
+import okhttp3.Request
+import okhttp3.Response
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+import java.util.Base64
+
+class Animeiat : ConfigurableAnimeSource, AnimeHttpSource() {
+
+ override val name = "Animeiat"
+
+ override val baseUrl = "https://api.animeiat.co/v1"
+
+ override val lang = "ar"
+
+ override val supportsLatest = true
+
+ private val json = Json {
+ ignoreUnknownKeys = true
+ }
+
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ // ============================== Popular ===============================
+ override fun popularAnimeParse(response: Response): AnimesPage {
+ val responseJson = json.decodeFromString(response.body.string())
+ val animeList = responseJson.data.map {
+ SAnime.create().apply {
+ url = "/anime/${it.slug}"
+ title = it.anime_name
+ thumbnail_url = "https://api.animeiat.co/storage/${it.poster_path}"
+ }
+ }
+ val hasNextPage = responseJson.meta.current_page < responseJson.meta.last_page
+ return AnimesPage(animeList, hasNextPage)
+ }
+
+ override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/anime?page=$page")
+
+ // ============================== Episodes ==============================
+ override fun episodeListParse(response: Response): List {
+ val episodeList = mutableListOf()
+ val pagesUrl = response.request.url.toString() + "/episodes"
+ val firstPage = client.newCall(GET(pagesUrl)).execute()
+ fun addEpisodes(res: Response) {
+ val jr = json.decodeFromString(res.body.string())
+ episodeList.addAll(
+ jr.data.map {
+ SEpisode.create().apply {
+ name = it.title
+ episode_number = it.number
+ url = "episode/${it.slug}"
+ }
+ },
+ )
+ jr.links.next?.let {
+ addEpisodes(client.newCall(GET(it)).execute())
+ }
+ }
+ addEpisodes(firstPage)
+ return episodeList.reversed()
+ }
+
+ // ============================ Video Links =============================
+ override fun videoListRequest(episode: SEpisode): Request = GET("$baseUrl/${episode.url}")
+
+ @RequiresApi(Build.VERSION_CODES.O)
+ override fun videoListParse(response: Response): List