diff --git a/src/en/mangafast/AndroidManifest.xml b/src/en/mangafast/AndroidManifest.xml
deleted file mode 100644
index 30deb7f79..000000000
--- a/src/en/mangafast/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/en/mangafast/build.gradle b/src/en/mangafast/build.gradle
deleted file mode 100644
index db30a3697..000000000
--- a/src/en/mangafast/build.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlinx-serialization'
-
-ext {
- extName = 'MangaFast'
- pkgNameSuffix = 'en.mangafast'
- extClass = '.MangaFast'
- extVersionCode = 14
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/en/mangafast/res/mipmap-hdpi/ic_launcher.png b/src/en/mangafast/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100755
index c6171bf6c..000000000
Binary files a/src/en/mangafast/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangafast/res/mipmap-mdpi/ic_launcher.png b/src/en/mangafast/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100755
index e9e1ca91e..000000000
Binary files a/src/en/mangafast/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangafast/res/mipmap-xhdpi/ic_launcher.png b/src/en/mangafast/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100755
index 6077690fc..000000000
Binary files a/src/en/mangafast/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangafast/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangafast/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100755
index 188decf85..000000000
Binary files a/src/en/mangafast/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangafast/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/mangafast/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100755
index b368d915c..000000000
Binary files a/src/en/mangafast/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/mangafast/res/web_hi_res_512.png b/src/en/mangafast/res/web_hi_res_512.png
deleted file mode 100644
index d27c2c668..000000000
Binary files a/src/en/mangafast/res/web_hi_res_512.png and /dev/null differ
diff --git a/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFast.kt b/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFast.kt
deleted file mode 100644
index 90af8b67c..000000000
--- a/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFast.kt
+++ /dev/null
@@ -1,199 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mangafast
-
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.POST
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.MangasPage
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.ParsedHttpSource
-import kotlinx.serialization.decodeFromString
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.buildJsonObject
-import kotlinx.serialization.json.put
-import okhttp3.MediaType.Companion.toMediaType
-import okhttp3.Request
-import okhttp3.RequestBody.Companion.toRequestBody
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import org.jsoup.select.Elements
-import uy.kohesive.injekt.injectLazy
-import java.text.ParseException
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaFast : ParsedHttpSource() {
- override val name = "MangaFast"
-
- override val baseUrl = "https://mangafast.org"
-
- override val lang = "en"
-
- override val supportsLatest = true
-
- private val json: Json by injectLazy()
-
- // Popular
- override fun popularMangaRequest(page: Int): Request {
- // Every thing is in a single page.
- return GET("$baseUrl/list-manga", headers)
- }
-
- override fun popularMangaSelector(): String = "div#animelist li a"
-
- override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply {
- element.select("a").let { a ->
- setUrlWithoutDomain(a.attr("href"))
- title = a.select("h4").text().trim()
- thumbnail_url = a.select("img").imageFromElement()
- }
- }
-
- override fun popularMangaNextPageSelector(): String? = null
-
- // Latest
- override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/read", headers)
-
- override fun latestUpdatesSelector() = "div.ls5"
-
- override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply {
- element.select("a").let { a ->
- setUrlWithoutDomain(a.attr("href"))
- title = a.attr("title")
- thumbnail_url = a.select("img").imageFromElement()
- }
- }
-
- override fun latestUpdatesNextPageSelector(): String? = null
-
- // Search
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val jsonPayload = buildJsonObject {
- put("limit", 30)
- put("q", query)
- }
- val requestBody = jsonPayload.toString().toRequestBody(JSON_MEDIA_TYPE)
-
- val newHeaders = headersBuilder()
- .add("Content-Length", requestBody.contentLength().toString())
- .add("Content-Type", requestBody.contentType().toString())
- .add("Accept", ACCEPT_JSON)
- .add("Origin", baseUrl)
- .add("Referer", "$baseUrl/")
- .build()
-
- return POST(
- "https://search.${baseUrl.substringAfterLast("/")}/comics/ms",
- headers = newHeaders,
- body = requestBody
- )
- }
-
- override fun searchMangaParse(response: Response): MangasPage {
- val result = json.decodeFromString(response.body!!.string())
-
- val comicList = result.mangaList
- .map(::searchMangaFromObject)
-
- return MangasPage(comicList, hasNextPage = false)
- }
-
- private fun searchMangaFromObject(manga: MangaDto): SManga = SManga.create().apply {
- title = manga.title
- thumbnail_url = manga.thumbnail
- url = "/read/${manga.slug}"
- }
-
- // Manga Details
- override fun mangaDetailsParse(document: Document): SManga {
- val sManga = SManga.create()
- val infoTable = document.select("table.inftable tbody tr")
-
- sManga.apply {
- title = document.select("h1[itemprop=name]").text().trim()
- description = document.select("h2[id^=Synopsis] + p").text().trim()
- thumbnail_url = document.select("img#Thumbnail").imageFromElement()
- }
- infoTable.forEach { column ->
- val rows = column.select("td")
- when (rows[0].text().trim()) {
- "Title" -> sManga.title = rows[1].text().trim()
- "Genres" -> sManga.genre = rows[1].text().trim().removeSuffix(",")
- "Author" -> sManga.author = rows[1].text().trim()
- "Status" -> sManga.status = rows[1].text().parseStatus()
- }
- }
-
- return sManga
- }
-
- private fun String?.parseStatus() = if (this == null) SManga.UNKNOWN else when {
- this.toLowerCase(Locale.ENGLISH).contains("ongoing") -> SManga.ONGOING
- this.toLowerCase(Locale.ENGLISH).contains("completed") -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
-
- // Chapter List
- override fun chapterListSelector() =
- "tbody:has(th:contains(Chapter List)) tr[itemprop]:not(:contains(Spoiler & Release Date))"
-
- override fun chapterFromElement(element: Element) = SChapter.create().apply {
- val link = element.select("a.chapter-link")
- setUrlWithoutDomain(link.attr("href"))
- name = link.text().trim()
- date_upload = element.select("td:last-of-type").text().parseDate()
- }
-
- private fun String?.parseDate(): Long {
- if (this == null) return 0L
- return try {
- dateFormat.parse(this.trim())?.time ?: 0L
- } catch (pe: ParseException) { // this can happen for spoiler & release date entries
- 0L
- }
- }
-
- // Pages
- override fun pageListParse(document: Document): List {
- return document.select("div#Read img").mapIndexed { i, element ->
- var url = element.attr("abs:data-src")
-
- if (url.isEmpty()) {
- url = element.attr("abs:src")
- }
-
- Page(i, "", url)
- }
- }
-
- private fun Elements.imageFromElement(): String? {
- return when {
- this.hasAttr("data-src") -> this.attr("abs:data-src")
- this.hasAttr("abs:src") -> this.attr("abs:src")
- else -> null
- }
- }
-
- // Unused Function
- override fun searchMangaSelector() = throw UnsupportedOperationException("Not Used")
-
- override fun searchMangaFromElement(element: Element) =
- throw UnsupportedOperationException("Not Used")
-
- override fun searchMangaNextPageSelector() = throw UnsupportedOperationException("Not Used")
-
- override fun imageUrlParse(document: Document): String =
- throw UnsupportedOperationException("Not Used")
-
- override fun getFilterList() = FilterList()
-
- companion object {
- val dateFormat by lazy {
- SimpleDateFormat("MM/dd/yyyy", Locale.US)
- }
- private val JSON_MEDIA_TYPE = "application/json;charset=UTF-8".toMediaType()
- private const val ACCEPT_JSON = "application/json, text/plain, */*"
- }
-}
diff --git a/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFastDto.kt b/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFastDto.kt
deleted file mode 100644
index 64b36cdf8..000000000
--- a/src/en/mangafast/src/eu/kanade/tachiyomi/extension/en/mangafast/MangaFastDto.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mangafast
-
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-
-@Serializable
-data class SearchResultDto(
- @SerialName("hits") val mangaList: List = emptyList()
-)
-
-@Serializable
-data class MangaDto(
- val title: String = "",
- val slug: String = "",
- val thumbnail: String = "",
-)