diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..37a749336 Binary files /dev/null and b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..910e4e535 Binary files /dev/null and b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..a6e920496 Binary files /dev/null and b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..85c05d067 Binary files /dev/null and b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d9eaf0920 Binary files /dev/null and b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/constellarscans/res/web_hi_res_512.png new file mode 100644 index 000000000..a8dd214cc Binary files /dev/null and b/multisrc/overrides/mangathemesia/constellarscans/res/web_hi_res_512.png differ diff --git a/multisrc/overrides/mangathemesia/constellarscans/src/ConstellarScans.kt b/multisrc/overrides/mangathemesia/constellarscans/src/ConstellarScans.kt new file mode 100644 index 000000000..e7c5027b4 --- /dev/null +++ b/multisrc/overrides/mangathemesia/constellarscans/src/ConstellarScans.kt @@ -0,0 +1,95 @@ +package eu.kanade.tachiyomi.extension.en.constellarscans + +import android.app.Application +import android.content.SharedPreferences +import eu.kanade.tachiyomi.lib.randomua.getPrefCustomUA +import eu.kanade.tachiyomi.lib.randomua.getPrefUAType +import eu.kanade.tachiyomi.lib.randomua.setRandomUserAgent +import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import okhttp3.CacheControl +import okhttp3.Headers +import okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.nodes.Document +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.util.concurrent.TimeUnit + +class ConstellarScans : MangaThemesia("Constellar Scans", "https://constellarcomic.com", "en") { + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + override val client: OkHttpClient by lazy { + network.cloudflareClient.newBuilder() + .setRandomUserAgent( + preferences.getPrefUAType(), + preferences.getPrefCustomUA(), + ) + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .rateLimit(1, 1) + .build() + } + + override fun headersBuilder(): Headers.Builder = Headers.Builder() + .add("Referer", "$baseUrl/") + .add("Accept-Language", "en-US,en;q=0.9") + .add("DNT", "1") + .add("Upgrade-Insecure-Requests", "1") + + override val seriesStatusSelector = ".status" + + override fun pageListRequest(chapter: SChapter): Request = + super.pageListRequest(chapter).newBuilder() + .header( + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + ) + .header("Sec-Fetch-Site", "same-origin") + .header("Sec-Fetch-Mode", "navigate") + .header("Sec-Fetch-Dest", "document") + .header("Sec-Fetch-User", "?1") + .cacheControl(CacheControl.FORCE_NETWORK) + .build() + + override fun pageListParse(document: Document): List { + val html = document.toString() + if (!html.contains("ts_rea_der_._run(\"")) { + return super.pageListParse(document) + } + + val tsReaderRawData = html + .substringAfter("ts_rea_der_._run(\"") + .substringBefore("\")") + .replace(Regex("""\D"""), "") + .chunked(4) + .map { + val tenthsAndOnes = it.chunked(2).map { + val num = it.toInt() + num / 10 + num % 10 + } + (tenthsAndOnes[0] * 10 + tenthsAndOnes[1] + 32).toChar() + } + .joinToString("") + + countViews(document) + return json.parseToJsonElement(tsReaderRawData).jsonObject["sources"]!!.jsonArray[0].jsonObject["images"]!!.jsonArray.mapIndexed { idx, it -> + Page(idx, imageUrl = it.jsonPrimitive.content) + } + } + + override fun imageRequest(page: Page): Request = super.imageRequest(page).newBuilder() + .header("Accept", "image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8") + .header("Sec-Fetch-Dest", "image") + .header("Sec-Fetch-Mode", "no-cors") + .header("Sec-Fetch-Site", "same-origin") + .build() +} diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt index fda72bbc5..e1e0172c8 100644 --- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt +++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/mangathemesia/MangaThemesiaGenerator.kt @@ -31,6 +31,7 @@ class MangaThemesiaGenerator : ThemeSourceGenerator { SingleLang("BirdManga", "https://birdmanga.com", "en"), SingleLang("Boosei", "https://boosei.net", "id", overrideVersionCode = 2), SingleLang("Cartel de Manhwas", "https://carteldemanhwas.com", "es", overrideVersionCode = 5), + SingleLang("Constellar Scans", "https://constellarcomic.com", "en", isNsfw = true, overrideVersionCode = 16), SingleLang("Cosmic Scans", "https://cosmic-scans.com", "en", overrideVersionCode = 2), SingleLang("CosmicScans.id", "https://cosmicscans.id", "id", overrideVersionCode = 3, className = "CosmicScansID"), SingleLang("Cypher Scans", "https://cypherscans.xyz", "en"),