diff --git a/src/ar/arabanime/AndroidManifest.xml b/src/ar/arabanime/AndroidManifest.xml
new file mode 100644
index 000000000..568741e54
--- /dev/null
+++ b/src/ar/arabanime/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/src/ar/arabanime/build.gradle b/src/ar/arabanime/build.gradle
new file mode 100644
index 000000000..bb0df8e9c
--- /dev/null
+++ b/src/ar/arabanime/build.gradle
@@ -0,0 +1,13 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlinx-serialization'
+
+ext {
+ extName = 'ArabAnime'
+ pkgNameSuffix = 'ar.arabanime'
+ extClass = '.ArabAnime'
+ extVersionCode = 1
+ libVersion = '13'
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/ar/arabanime/res/mipmap-hdpi/ic_launcher.png b/src/ar/arabanime/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..a53a8a6e4
Binary files /dev/null and b/src/ar/arabanime/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/ar/arabanime/res/mipmap-mdpi/ic_launcher.png b/src/ar/arabanime/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..3893b5759
Binary files /dev/null and b/src/ar/arabanime/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/ar/arabanime/res/mipmap-xhdpi/ic_launcher.png b/src/ar/arabanime/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..79b61ece0
Binary files /dev/null and b/src/ar/arabanime/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/ar/arabanime/res/mipmap-xxhdpi/ic_launcher.png b/src/ar/arabanime/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..48eba66fb
Binary files /dev/null and b/src/ar/arabanime/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/ar/arabanime/res/mipmap-xxxhdpi/ic_launcher.png b/src/ar/arabanime/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..e499cf36a
Binary files /dev/null and b/src/ar/arabanime/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/ar/arabanime/res/web_hi_res_512.png b/src/ar/arabanime/res/web_hi_res_512.png
new file mode 100644
index 000000000..684ce74ba
Binary files /dev/null and b/src/ar/arabanime/res/web_hi_res_512.png differ
diff --git a/src/ar/arabanime/src/eu/kanade/tachiyomi/animeextension/ar/arabanime/ArabAnime.kt b/src/ar/arabanime/src/eu/kanade/tachiyomi/animeextension/ar/arabanime/ArabAnime.kt
new file mode 100644
index 000000000..c3787f0e6
--- /dev/null
+++ b/src/ar/arabanime/src/eu/kanade/tachiyomi/animeextension/ar/arabanime/ArabAnime.kt
@@ -0,0 +1,258 @@
+package eu.kanade.tachiyomi.animeextension.ar.arabanime
+
+import android.app.Application
+import android.content.SharedPreferences
+import androidx.preference.ListPreference
+import androidx.preference.PreferenceScreen
+import eu.kanade.tachiyomi.animeextension.ar.arabanime.dto.AnimeItem
+import eu.kanade.tachiyomi.animeextension.ar.arabanime.dto.Episode
+import eu.kanade.tachiyomi.animeextension.ar.arabanime.dto.PopularAnimeResponse
+import eu.kanade.tachiyomi.animeextension.ar.arabanime.dto.ShowItem
+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 eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.serialization.json.Json
+import okhttp3.FormBody
+import okhttp3.MediaType.Companion.toMediaType
+import okhttp3.Request
+import okhttp3.Response
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+
+class ArabAnime: ConfigurableAnimeSource, AnimeHttpSource() {
+
+ override val name = "ArabAnime"
+
+ override val baseUrl = "https://www.arabanime.net"
+
+ 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.Shows.map {
+ val animeJson = json.decodeFromString(it.decodeBase64())
+ SAnime.create().apply {
+ setUrlWithoutDomain(animeJson.info_src)
+ title = animeJson.anime_name
+ thumbnail_url = animeJson.anime_cover_image_url
+ }
+ }
+ val hasNextPage = responseJson.current_page < responseJson.last_page
+ return AnimesPage(animeList, hasNextPage)
+ }
+
+ override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/api?page=$page")
+
+ // ============================== Episodes ==============================
+ override fun episodeListParse(response: Response): List {
+ val showData = response.asJsoup().select("div#data").text().decodeBase64()
+ val episodesJson = json.decodeFromString(showData)
+ return episodesJson.EPS.map {
+ SEpisode.create().apply {
+ name = it.episode_name
+ episode_number = it.episode_number.toFloat()
+ setUrlWithoutDomain(it.`info-src`)
+ }
+ }.reversed()
+ }
+
+ // ============================ Video Links =============================
+ override fun videoListRequest(episode: SEpisode): Request = GET("$baseUrl/${episode.url}")
+
+ override fun videoListParse(response: Response): List