diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..1056a4758 Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..642ee2cc6 Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..58f471536 Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ea2244a3f Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..2d8848d81 Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/web_hi_res_512.png b/multisrc/overrides/madara/creepyscans/res/web_hi_res_512.png new file mode 100644 index 000000000..6ac625b8b Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/web_hi_res_512.png differ diff --git a/multisrc/overrides/madara/creepyscans/src/CreepyScans.kt b/multisrc/overrides/madara/creepyscans/src/CreepyScans.kt new file mode 100644 index 000000000..b5359f463 --- /dev/null +++ b/multisrc/overrides/madara/creepyscans/src/CreepyScans.kt @@ -0,0 +1,136 @@ +package eu.kanade.tachiyomi.extension.en.creepyscans + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.SChapter +import okhttp3.CacheControl +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.nodes.Document +import java.util.concurrent.TimeUnit + +class CreepyScans : Madara( + "CreepyScans", + "https://creepyscans.com", + "en", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1, 3, TimeUnit.SECONDS) + .build() + + override val useNewChapterEndpoint = true + + // Popular + + override fun popularMangaRequest(page: Int): Request { + return GET( + url = "$baseUrl/$mangaSubString/?m_orderby=views", + headers = headers, + cache = CacheControl.FORCE_NETWORK, + ) + } + + // Latest + + override fun latestUpdatesRequest(page: Int): Request { + return GET( + url = "$baseUrl/$mangaSubString/?m_orderby=latest", + headers = headers, + cache = CacheControl.FORCE_NETWORK, + ) + } + + // Search + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + if (query.isNotBlank()) throw Exception("Search not available") + + val url = "$baseUrl/$mangaSubString/".toHttpUrl().newBuilder() + filters.forEach { filter -> + when (filter) { + is OrderByFilter -> { + if (filter.state != 0) { + url.addQueryParameter("m_orderby", filter.toUriPart()) + } + } + is GenreFilter -> { + val selected = filter.vals[filter.state].second + if (selected.isNotBlank()) { + url.removePathSegment(0) + url.addPathSegment("manga-genre") + url.addPathSegment(filter.vals[filter.state].second) + } + } + else -> {} + } + } + return GET(url.build(), headers) + } + + override fun searchMangaSelector(): String = + super.searchMangaSelector() + ",div.page-content-listing div.page-item-detail" + + override fun searchMangaNextPageSelector(): String? = null + + // Filter + + override fun genresRequest(): Request { + return GET("$baseUrl/$mangaSubString/?genres=", headers) + } + + override fun parseGenres(document: Document): List<Genre> { + genresList = document.select(".list-unstyled li").mapNotNull { genre -> + genre.selectFirst("a[href]")?.let { + val slug = it.attr("href") + .split("/") + .last(String::isNotEmpty) + + Pair(it.ownText().trim(), slug) + } + } + + return emptyList() + } + + // From manga18fx + private var genresList: List<Pair<String, String>> = emptyList() + + class GenreFilter(val vals: List<Pair<String, String>>) : + Filter.Select<String>("Genre", vals.map { it.first }.toTypedArray()) + + override fun getFilterList(): FilterList { + val filters = buildList(4) { + add( + OrderByFilter( + title = orderByFilterTitle, + options = orderByFilterOptions.zip(orderByFilterOptionsValues), + state = 0, + ), + ) + add(Filter.Separator()) + add(Filter.Header("Filters are ignored for text search!")) + + if (genresList.isNotEmpty()) { + add(GenreFilter(listOf(Pair("<select>", "")) + genresList)) + } else { + add(Filter.Header("Wait for mangas to load then tap Reset")) + } + } + + return FilterList(filters) + } + + // Page list + + override fun pageListRequest(chapter: SChapter): Request { + if (chapter.url.startsWith("http")) { + return GET(chapter.url.substringBefore("?style=list"), headers) + } + return super.pageListRequest(chapter) + } +} diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt index 849414d92..7ad1481ca 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/madara/MadaraGenerator.kt @@ -81,6 +81,7 @@ class MadaraGenerator : ThemeSourceGenerator { SingleLang("Comicz.net v2", "https://v2.comiz.net", "all", isNsfw = true, className = "ComiczNetV2"), SingleLang("Cookie Kiara", "https://18.kiara.cool", "en", isNsfw = true), SingleLang("CopyPasteScan", "https://copypastescan.xyz", "es", overrideVersionCode = 1), + SingleLang("CreepyScans", "https://creepyscans.com", "en"), SingleLang("DapRob", "https://daprob.com", "es"), SingleLang("Dark Scans", "https://darkscans.com", "en", overrideVersionCode = 1), SingleLang("Decadence Scans", "https://reader.decadencescans.com", "en", isNsfw = true, overrideVersionCode = 2),