diff --git a/src/en/aniplay/build.gradle b/src/en/aniplay/build.gradle
deleted file mode 100644
index f8264495..00000000
--- a/src/en/aniplay/build.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-ext {
- extName = 'AniPlay'
- extClass = '.AniPlay'
- extVersionCode = 1
-}
-
-apply from: "$rootDir/common.gradle"
-
-dependencies {
- implementation(project(":lib-multisrc:anilist"))
- implementation(project(":lib:playlist-utils"))
-}
diff --git a/src/en/aniplay/ic_launcher-playstore.png b/src/en/aniplay/ic_launcher-playstore.png
deleted file mode 100644
index 7e70c67f..00000000
Binary files a/src/en/aniplay/ic_launcher-playstore.png and /dev/null differ
diff --git a/src/en/aniplay/res/drawable/ic_launcher_foreground.xml b/src/en/aniplay/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index d150c0b4..00000000
--- a/src/en/aniplay/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/en/aniplay/res/mipmap-anydpi-v26/ic_launcher.xml b/src/en/aniplay/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index 7353dbd1..00000000
--- a/src/en/aniplay/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/src/en/aniplay/res/mipmap-anydpi-v26/ic_launcher_round.xml b/src/en/aniplay/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index 7353dbd1..00000000
--- a/src/en/aniplay/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/src/en/aniplay/res/mipmap-hdpi/ic_launcher.webp b/src/en/aniplay/res/mipmap-hdpi/ic_launcher.webp
deleted file mode 100644
index 940e0da3..00000000
Binary files a/src/en/aniplay/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-hdpi/ic_launcher_round.webp b/src/en/aniplay/res/mipmap-hdpi/ic_launcher_round.webp
deleted file mode 100644
index 2387abfc..00000000
Binary files a/src/en/aniplay/res/mipmap-hdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-mdpi/ic_launcher.webp b/src/en/aniplay/res/mipmap-mdpi/ic_launcher.webp
deleted file mode 100644
index 87d7ecc9..00000000
Binary files a/src/en/aniplay/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-mdpi/ic_launcher_round.webp b/src/en/aniplay/res/mipmap-mdpi/ic_launcher_round.webp
deleted file mode 100644
index 4f02183c..00000000
Binary files a/src/en/aniplay/res/mipmap-mdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-xhdpi/ic_launcher.webp b/src/en/aniplay/res/mipmap-xhdpi/ic_launcher.webp
deleted file mode 100644
index 16243651..00000000
Binary files a/src/en/aniplay/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-xhdpi/ic_launcher_round.webp b/src/en/aniplay/res/mipmap-xhdpi/ic_launcher_round.webp
deleted file mode 100644
index d883f306..00000000
Binary files a/src/en/aniplay/res/mipmap-xhdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-xxhdpi/ic_launcher.webp b/src/en/aniplay/res/mipmap-xxhdpi/ic_launcher.webp
deleted file mode 100644
index faf5bdf2..00000000
Binary files a/src/en/aniplay/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-xxhdpi/ic_launcher_round.webp b/src/en/aniplay/res/mipmap-xxhdpi/ic_launcher_round.webp
deleted file mode 100644
index 712e3abf..00000000
Binary files a/src/en/aniplay/res/mipmap-xxhdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-xxxhdpi/ic_launcher.webp b/src/en/aniplay/res/mipmap-xxxhdpi/ic_launcher.webp
deleted file mode 100644
index 04d7c07b..00000000
Binary files a/src/en/aniplay/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ
diff --git a/src/en/aniplay/res/mipmap-xxxhdpi/ic_launcher_round.webp b/src/en/aniplay/res/mipmap-xxxhdpi/ic_launcher_round.webp
deleted file mode 100644
index ad17c1ba..00000000
Binary files a/src/en/aniplay/res/mipmap-xxxhdpi/ic_launcher_round.webp and /dev/null differ
diff --git a/src/en/aniplay/res/values/ic_launcher_background.xml b/src/en/aniplay/res/values/ic_launcher_background.xml
deleted file mode 100644
index de1841dc..00000000
--- a/src/en/aniplay/res/values/ic_launcher_background.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- #05010D
-
\ No newline at end of file
diff --git a/src/en/aniplay/res/web_hi_res_512.png b/src/en/aniplay/res/web_hi_res_512.png
deleted file mode 100644
index 11b79914..00000000
Binary files a/src/en/aniplay/res/web_hi_res_512.png and /dev/null differ
diff --git a/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt b/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt
deleted file mode 100644
index d86dfaed..00000000
--- a/src/en/aniplay/src/eu/kanade/tachiyomi/animeextension/en/aniplay/AniPlay.kt
+++ /dev/null
@@ -1,375 +0,0 @@
-package eu.kanade.tachiyomi.animeextension.en.aniplay
-
-import android.app.Application
-import android.util.Base64
-import android.widget.Toast
-import androidx.preference.ListPreference
-import androidx.preference.PreferenceScreen
-import androidx.preference.SwitchPreferenceCompat
-import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
-import eu.kanade.tachiyomi.animesource.model.SAnime
-import eu.kanade.tachiyomi.animesource.model.SEpisode
-import eu.kanade.tachiyomi.animesource.model.Track
-import eu.kanade.tachiyomi.animesource.model.Video
-import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils
-import eu.kanade.tachiyomi.multisrc.anilist.AniListAnimeHttpSource
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.POST
-import eu.kanade.tachiyomi.util.parallelFlatMapBlocking
-import eu.kanade.tachiyomi.util.parseAs
-import kotlinx.serialization.encodeToString
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.MediaType.Companion.toMediaType
-import okhttp3.Request
-import okhttp3.RequestBody.Companion.toRequestBody
-import okhttp3.Response
-import uy.kohesive.injekt.Injekt
-import uy.kohesive.injekt.api.get
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class AniPlay : AniListAnimeHttpSource(), ConfigurableAnimeSource {
- override val name = "AniPlay"
- override val lang = "en"
-
- override val baseUrl: String
- get() = "https://${preferences.getString(PREF_DOMAIN_KEY, PREF_DOMAIN_DEFAULT)}"
-
- private val playlistUtils by lazy { PlaylistUtils(client, headers) }
-
- private val preferences by lazy {
- Injekt.get().getSharedPreferences("source_$id", 0x0000)
- }
-
- /* ================================= AniList configurations ================================= */
-
- override fun mapAnimeDetailUrl(animeId: Int): String {
- return "$baseUrl/anime/info/$animeId"
- }
-
- override fun mapAnimeId(animeDetailUrl: String): Int {
- val httpUrl = animeDetailUrl.toHttpUrl()
-
- return httpUrl.pathSegments[2].toInt()
- }
-
- override fun getPreferredTitleLanguage(): TitleLanguage {
- val preferredLanguage = preferences.getString(PREF_TITLE_LANGUAGE_KEY, PREF_TITLE_LANGUAGE_DEFAULT)
-
- return when (preferredLanguage) {
- "romaji" -> TitleLanguage.ROMAJI
- "english" -> TitleLanguage.ENGLISH
- "native" -> TitleLanguage.NATIVE
- else -> TitleLanguage.ROMAJI
- }
- }
-
- /* ====================================== Episode List ====================================== */
-
- override fun episodeListRequest(anime: SAnime): Request {
- val httpUrl = anime.url.toHttpUrl()
- val animeId = httpUrl.pathSegments[2]
-
- return GET("$baseUrl/api/anime/episode/$animeId")
- }
-
- override fun episodeListParse(response: Response): List {
- val isMarkFiller = preferences.getBoolean(PREF_MARK_FILLER_EPISODE_KEY, PREF_MARK_FILLER_EPISODE_DEFAULT)
- val episodeListUrl = response.request.url
- val animeId = episodeListUrl.pathSegments[3]
- val providers = response.parseAs>()
- val episodes = mutableMapOf()
- val episodeExtras = mutableMapOf>()
-
- providers.forEach { provider ->
- provider.episodes.forEach { episode ->
- if (!episodes.containsKey(episode.number)) {
- episodes[episode.number] = episode
- }
- val existingEpisodeExtras = episodeExtras.getOrElse(episode.number) { emptyList() }
- val episodeExtra = EpisodeExtra(
- source = provider.providerId,
- episodeId = episode.id,
- hasDub = episode.hasDub,
- )
- episodeExtras[episode.number] = existingEpisodeExtras + listOf(episodeExtra)
- }
- }
-
- return episodes.map { episodeMap ->
- val episode = episodeMap.value
- val episodeNumber = episode.number
- val episodeExtra = episodeExtras.getValue(episodeNumber)
- val episodeExtraString = json.encodeToString(episodeExtra)
- .let { Base64.encode(it.toByteArray(), Base64.DEFAULT) }
- .toString(Charsets.UTF_8)
-
- val url = baseUrl.toHttpUrl().newBuilder()
- .addPathSegment("anime")
- .addPathSegment("watch")
- .addQueryParameter("id", animeId)
- .addQueryParameter("ep", episodeNumber.toString())
- .addQueryParameter("extras", episodeExtraString)
- .build()
-
- val name = parseEpisodeName(episodeNumber, episode.title)
- val uploadDate = parseDate(episode.createdAt)
- val dub = when {
- episodeExtra.any { it.hasDub } -> ", Dub"
- else -> ""
- }
- val filler = when {
- episode.isFiller && isMarkFiller -> " • Filler Episode"
- else -> ""
- }
- val scanlator = "Sub$dub$filler"
-
- SEpisode.create().apply {
- this.url = url.toString()
- this.name = name
- this.date_upload = uploadDate
- this.episode_number = episodeNumber.toFloat()
- this.scanlator = scanlator
- }
- }.reversed()
- }
-
- /* ======================================= Video List ======================================= */
-
- override suspend fun getVideoList(episode: SEpisode): List