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("") + (Calendar.getInstance()[1] downTo 1963).map { it.toString() }.toTypedArray() - private fun getPublisherList() = arrayOf("