diff --git a/src/en/purplecress/AndroidManifest.xml b/src/en/purplecress/AndroidManifest.xml
deleted file mode 100644
index 3fa2c02d5..000000000
--- a/src/en/purplecress/AndroidManifest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/en/purplecress/build.gradle b/src/en/purplecress/build.gradle
deleted file mode 100644
index 90b23e11c..000000000
--- a/src/en/purplecress/build.gradle
+++ /dev/null
@@ -1,7 +0,0 @@
-ext {
- extName = 'Purple Cress'
- extClass = '.PurpleCress'
- extVersionCode = 3
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/en/purplecress/res/mipmap-hdpi/ic_launcher.png b/src/en/purplecress/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 7f6f6eb1c..000000000
Binary files a/src/en/purplecress/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/purplecress/res/mipmap-mdpi/ic_launcher.png b/src/en/purplecress/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index d1edc90ab..000000000
Binary files a/src/en/purplecress/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/purplecress/res/mipmap-xhdpi/ic_launcher.png b/src/en/purplecress/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 9a3537aa0..000000000
Binary files a/src/en/purplecress/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/purplecress/res/mipmap-xxhdpi/ic_launcher.png b/src/en/purplecress/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 1eabaa49b..000000000
Binary files a/src/en/purplecress/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/purplecress/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/purplecress/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 8919f8318..000000000
Binary files a/src/en/purplecress/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/en/purplecress/src/eu/kanade/tachiyomi/extension/en/purplecress/PurpleCress.kt b/src/en/purplecress/src/eu/kanade/tachiyomi/extension/en/purplecress/PurpleCress.kt
deleted file mode 100644
index d0c357e71..000000000
--- a/src/en/purplecress/src/eu/kanade/tachiyomi/extension/en/purplecress/PurpleCress.kt
+++ /dev/null
@@ -1,155 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.purplecress
-
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.asObservableSuccess
-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.HttpSource
-import eu.kanade.tachiyomi.util.asJsoup
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import okhttp3.Response
-import rx.Observable
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class PurpleCress : HttpSource() {
- override val name = "Purple Cress"
-
- override val baseUrl = "https://purplecress.com"
-
- override val lang = "en"
-
- override val supportsLatest = true
-
- override val client: OkHttpClient = network.cloudflareClient
-
- override fun popularMangaRequest(page: Int) = GET(baseUrl)
-
- override fun popularMangaParse(response: Response): MangasPage {
- val seriesContainer = response.asJsoup().selectFirst("div.container-grid--small")!!
- val mangaList: List = seriesContainer.select("a").map {
- SManga.create().apply {
- title = it.selectFirst("div.card__info")!!.selectFirst("h3")!!.html()
- url = it.attr("href")
- author = it.selectFirst("p.card__author")!!.html().substringAfter("by ")
- artist = author
- description = it.attr("description")
- thumbnail_url = it.selectFirst("img.image")!!.attr("src")
- status = when (it.selectFirst("h3.card__status")!!.html()) {
- "Ongoing" -> SManga.ONGOING
- "Dropped" -> SManga.COMPLETED // Not sure what the best status is for "Dropped"
- "Completed" -> SManga.COMPLETED // There aren't any completed series on the site, so I'm just guessing as to the string
- else -> SManga.UNKNOWN
- }
- initialized = true // We have all the fields
- }
- }
- return MangasPage(mangaList, false)
- }
-
- override fun latestUpdatesRequest(page: Int): Request = GET(baseUrl)
-
- override fun latestUpdatesParse(response: Response): MangasPage {
- val seriesContainer = response.asJsoup().selectFirst("div.container-grid--large")!!
- val mangaList: List = seriesContainer.select("a").map {
- SManga.create().apply {
- title = it.selectFirst("h3.chapter__series-name")!!.html()
- url = it.attr("href").replaceFirst("chapter", "series").substringBeforeLast("/")
- thumbnail_url = it.selectFirst("img.image")!!.attr("src")
- initialized = false
- }
- }
- return MangasPage(mangaList, false)
- }
-
- override fun fetchMangaDetails(manga: SManga): Observable {
- val oldUrl = manga.url
- return client.newCall(mangaDetailsRequest(manga))
- .asObservableSuccess()
- .map { response ->
- mangaDetailsParse(response).apply {
- initialized = true
- url = oldUrl // Sets URL in result to original URL
- }
- }
- }
-
- override fun mangaDetailsRequest(manga: SManga): Request = chapterListRequest(manga)
-
- override fun mangaDetailsParse(response: Response): SManga {
- val responseJ = response.asJsoup()
- val infoBox = responseJ.selectFirst("div.series__info")!!
- return SManga.create().apply {
- title = infoBox.selectFirst("h1.series__name")!!.html()
- // url is set by overridden fetchMangaDetails
- author = infoBox.selectFirst("p.series__author")!!.html().substringAfter("by ")
- artist = author
- description = infoBox.selectFirst("p.description-pagagraph")!!.html()
- thumbnail_url = responseJ.selectFirst("img.thumbnail")!!.attr("src")
- status = when (infoBox.selectFirst("span.series__status")!!.html()) {
- "Ongoing" -> SManga.ONGOING
- "Dropped" -> SManga.COMPLETED // See comments in popularMangaParse
- "Completed" -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
- }
- }
-
- override fun chapterListParse(response: Response): List {
- return response.asJsoup().select("a.chapter__card")
- .map {
- SChapter.create().apply {
- url = it.attr("href")
- name = it.selectFirst("span.chapter__name")!!.html()
- date_upload = it.selectFirst("h5.chapter__date")!!.html()
- .let { SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(it)?.time ?: 0L }
- }
- }
- }
-
- override fun pageListParse(response: Response): List {
- return response.asJsoup().select("img.page__img").mapIndexed { index, element ->
- Page(index, "", element.attr("src"))
- }
- }
-
- override fun fetchImageUrl(page: Page): Observable {
- return Observable.just(page.imageUrl)
- }
-
- companion object {
- const val URL_SEARCH_PREFIX = "purplecress_url:"
- }
-
- override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
- if (query.startsWith(URL_SEARCH_PREFIX)) {
- val manga = SManga.create().apply {
- url = query.removePrefix(URL_SEARCH_PREFIX)
- }
- return fetchMangaDetails(manga).map {
- MangasPage(listOf(it), false)
- }
- }
- return fetchPopularManga(page).map {
- mangasPage ->
- MangasPage(
- mangasPage.mangas.filter {
- it.title.contains(query, true)
- },
- mangasPage.hasNextPage,
- )
- }
- }
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = throw UnsupportedOperationException()
-
- override fun searchMangaParse(response: Response): MangasPage = throw UnsupportedOperationException()
-
- override fun imageUrlRequest(page: Page): Request = throw UnsupportedOperationException()
-
- override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException()
-}
diff --git a/src/en/purplecress/src/eu/kanade/tachiyomi/extension/en/purplecress/PurpleCressURLActivity.kt b/src/en/purplecress/src/eu/kanade/tachiyomi/extension/en/purplecress/PurpleCressURLActivity.kt
deleted file mode 100644
index 438b7eb58..000000000
--- a/src/en/purplecress/src/eu/kanade/tachiyomi/extension/en/purplecress/PurpleCressURLActivity.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.purplecress
-
-import android.app.Activity
-import android.content.ActivityNotFoundException
-import android.content.Intent
-import android.net.Uri
-import android.os.Bundle
-import android.util.Log
-import kotlin.system.exitProcess
-
-class PurpleCressURLActivity : Activity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- val pathSegments = intent?.data?.pathSegments
- if (pathSegments != null && pathSegments.size >= 2) {
- val url = "/series/" + Uri.encode(pathSegments[1])
- val mainIntent = Intent().apply {
- action = "eu.kanade.tachiyomi.SEARCH"
- putExtra("query", PurpleCress.URL_SEARCH_PREFIX + url)
- putExtra("filter", packageName)
- }
-
- try {
- startActivity(mainIntent)
- } catch (e: ActivityNotFoundException) {
- Log.e("PurpleCressUrlActivity", e.toString())
- }
- } else {
- Log.e("PurpleCressUrlActivity", "could not parse uri from intent $intent")
- }
-
- finish()
- exitProcess(0)
- }
-}