diff --git a/src/en/comicastle/AndroidManifest.xml b/src/en/comicastle/AndroidManifest.xml
deleted file mode 100644
index 8072ee00d..000000000
--- a/src/en/comicastle/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/en/comicastle/build.gradle b/src/en/comicastle/build.gradle
deleted file mode 100644
index 4490d52df..000000000
--- a/src/en/comicastle/build.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-ext {
- extName = 'Comicastle'
- extClass = '.Comicastle'
- extVersionCode = 3
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/en/comicastle/res/mipmap-hdpi/ic_launcher.png b/src/en/comicastle/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index ed218573d..000000000
Binary files a/src/en/comicastle/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/comicastle/res/mipmap-mdpi/ic_launcher.png b/src/en/comicastle/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 25b0ea50c..000000000
Binary files a/src/en/comicastle/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/comicastle/res/mipmap-xhdpi/ic_launcher.png b/src/en/comicastle/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index adaeea6ad..000000000
Binary files a/src/en/comicastle/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/comicastle/res/mipmap-xxhdpi/ic_launcher.png b/src/en/comicastle/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index f96e3c35a..000000000
Binary files a/src/en/comicastle/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/comicastle/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/comicastle/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 26d0efe56..000000000
Binary files a/src/en/comicastle/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/comicastle/src/eu/kanade/tachiyomi/extension/en/comicastle/Comicastle.kt b/src/en/comicastle/src/eu/kanade/tachiyomi/extension/en/comicastle/Comicastle.kt
deleted file mode 100644
index c5fd38279..000000000
--- a/src/en/comicastle/src/eu/kanade/tachiyomi/extension/en/comicastle/Comicastle.kt
+++ /dev/null
@@ -1,168 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.comicastle
-
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.POST
-import eu.kanade.tachiyomi.source.model.Filter
-import eu.kanade.tachiyomi.source.model.FilterList
-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 okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.MediaType.Companion.toMediaTypeOrNull
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import okhttp3.RequestBody
-import okhttp3.RequestBody.Companion.toRequestBody
-import okhttp3.Response
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import java.net.URLEncoder
-import java.util.Calendar
-import java.util.Locale
-
-class Comicastle : ParsedHttpSource() {
-
- override val name = "Comicastle"
-
- override val versionId = 2
-
- override val baseUrl = "https://www.comicastle.org"
-
- override val lang = "en"
-
- override val supportsLatest = true
-
- override val client: OkHttpClient = network.cloudflareClient
-
- private fun pageSegments(page: Int): String = if (page > 1) "/index/${(page - 1) * 42}" else ""
-
- // Popular
-
- override fun popularMangaRequest(page: Int): Request {
- return GET("$baseUrl/library/popular/desc" + pageSegments(page), headers)
- }
-
- override fun popularMangaSelector() = "div.shadow-sm"
-
- override fun popularMangaFromElement(element: Element): SManga {
- return SManga.create().apply {
- title = element.select("p").text()
- setUrlWithoutDomain(element.select("a").first()!!.attr("href"))
- thumbnail_url = element.select("img").attr("data-src")
- }
- }
-
- override fun popularMangaNextPageSelector() = "li.page-item.next a"
-
- // Latest
-
- override fun latestUpdatesRequest(page: Int): Request {
- return GET("$baseUrl/library/postdate/desc" + pageSegments(page), headers)
- }
-
- override fun latestUpdatesSelector() = popularMangaSelector()
-
- override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
-
- override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
-
- // Search
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val url = "$baseUrl/library/search".toHttpUrl().newBuilder()
- var rBody: RequestBody? = null
-
- (filters.let { if (it.isEmpty()) getFilterList() else filters })
- .filterIsInstance()
- .firstOrNull { it.hasSelection() }
- ?.let { filter ->
- url.addPathSegment(filter.pathSegment)
- rBody = filter.toRequestBody()
- }
-
- if (rBody == null) {
- url.addPathSegment("result")
- rBody = createRequestBody(query)
- }
-
- return POST(url.toString(), headers, rBody!!)
- }
-
- override fun searchMangaSelector() = popularMangaSelector()
-
- override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element)
-
- override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
-
- // Details
-
- override fun mangaDetailsParse(document: Document): SManga {
- return SManga.create().apply {
- with(document.select("div.card-body > div.mb-2")) {
- thumbnail_url = select("img").attr("data-src")
- val publisher = select("p:contains(Publisher) + div button")
- .firstOrNull()?.let { "Publisher: ${it.text()}\n" }
- description = publisher + select("#comic-desc").text()
- author = select("thead:contains(Writer) + tbody button").joinToString { it.text() }
- artist = select("thead:contains(Artist) + tbody button").joinToString { it.text() }
- status = select("p span.mr-1 strong").text().toStatus()
- genre = select("p:contains(Genre) ~ div button").joinToString { it.text() }
- }
- }
- }
-
- private fun String.toStatus() = when {
- this.contains("Ongoing", ignoreCase = true) -> SManga.ONGOING
- this.contains("Completed", ignoreCase = true) -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
-
- // Chapters
-
- override fun chapterListParse(response: Response): List {
- return super.chapterListParse(response).reversed()
- }
-
- override fun chapterListSelector() = "div.card-body > .table-responsive tr a"
-
- override fun chapterFromElement(element: Element): SChapter {
- return SChapter.create().apply {
- name = element.text()
- setUrlWithoutDomain(element.attr("href").replace("pbp", "swiper"))
- }
- }
-
- // Pages
-
- override fun pageListParse(document: Document): List {
- return document.select(".swiper-wrapper .swiper-slide img").mapIndexed { i, img ->
- Page(i, "", img.attr("abs:src"))
- }
- }
-
- override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException()
-
- // Filters
-
- override fun getFilterList() = FilterList(
- Filter.Header("Cannot combine search types!"),
- Filter.Separator(),
- PostFilter("Genre", getGenreList()),
- PostFilter("Year", getYearList()),
- PostFilter("Publisher", getPublisherList()),
- )
-
- private open class PostFilter(name: String, val vals: Array) : Filter.Select(name, vals) {
- val pathSegment = name.lowercase(Locale.US)
- fun hasSelection(): Boolean = state != 0
- fun toRequestBody(): RequestBody = createRequestBody(vals[state])
- }
-
- private fun getGenreList() = arrayOf("