Fix bad URLs and missing pages in SS. (#15149)

This commit is contained in:
Alessandro Jean 2023-01-27 17:07:36 -03:00 committed by GitHub
parent 9675111870
commit 900a44839d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 4 deletions

View File

@ -0,0 +1,3 @@
dependencies {
implementation(project(':lib-cryptoaes'))
}

View File

@ -1,10 +1,18 @@
package eu.kanade.tachiyomi.extension.pt.sinensis
import android.util.Base64
import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonPrimitive
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
@ -26,19 +34,68 @@ class SinensisScan : Madara(
override fun popularMangaFromElement(element: Element): SManga {
return super.popularMangaFromElement(element).apply {
url = url.removePrefix("/home")
setUrlWithoutDomain(url.removeBadPath("manga"))
}
}
override fun searchMangaFromElement(element: Element): SManga {
return super.searchMangaFromElement(element).apply {
url = url.removePrefix("/home")
setUrlWithoutDomain(url.removeBadPath("manga"))
}
}
override fun chapterFromElement(element: Element): SChapter {
return super.chapterFromElement(element).apply {
url = url.removePrefix("/home")
setUrlWithoutDomain(url.removeBadPath("manga"))
}
}
override fun pageListParse(document: Document): List<Page> {
val chapterProtector = document.selectFirst("script#chapter-protector-data")?.data()
?: return super.pageListParse(document)
val password = chapterProtector
.substringAfter("wpmangaprotectornonce='")
.substringBefore("';")
val chapterData = chapterProtector
.substringAfter("chapter_data='")
.substringBefore("';")
.replace("\\/", "/")
.let { json.decodeFromString<Map<String, String>>(it) }
val unsaltedCipherText = Base64.decode(chapterData["ct"]!!, Base64.DEFAULT)
val salt = chapterData["s"]!!.decodeHex()
val cipherText = SALTED + salt + unsaltedCipherText
val rawImageArray = CryptoAES.decrypt(Base64.encodeToString(cipherText, Base64.DEFAULT), password)
val imageArrayString = json.parseToJsonElement(rawImageArray).jsonPrimitive.content
val imageArray = json.parseToJsonElement(imageArrayString).jsonArray
return imageArray.mapIndexed { i, jsonElement ->
Page(i, document.location(), jsonElement.jsonPrimitive.content)
}
}
private fun String.decodeHex(): ByteArray {
check(length % 2 == 0) { "Must have an even length" }
return chunked(2)
.map { it.toInt(16).toByte() }
.toByteArray()
}
private fun String.removeBadPath(expectedFirstPath: String): String {
val fullUrl = if (contains(baseUrl)) this else (baseUrl + this)
val url = fullUrl.toHttpUrl()
if (url.pathSegments.firstOrNull() != expectedFirstPath) {
return url.newBuilder().removePathSegment(0).toString()
}
return url.toString()
}
companion object {
val SALTED = "Salted__".toByteArray(Charsets.UTF_8)
}
}

View File

@ -375,7 +375,7 @@ class MadaraGenerator : ThemeSourceGenerator {
SingleLang("Shirai Scans", "https://shiraiscans.com.br", "pt-BR"),
SingleLang("Shooting Star Scans", "https://shootingstarscans.com", "en"),
SingleLang("ShoujoHearts", "https://shoujohearts.com", "en", overrideVersionCode = 2),
SingleLang("Sinensis Scan", "https://sinensisscans.com", "pt-BR", pkgName = "sinensis", overrideVersionCode = 4),
SingleLang("Sinensis Scan", "https://sinensisscans.com", "pt-BR", pkgName = "sinensis", overrideVersionCode = 5),
SingleLang("SISI GELAP", "https://sigel.asia", "id", overrideVersionCode = 4),
SingleLang("Siyahmelek", "https://siyahmelek.net", "tr", isNsfw = true, overrideVersionCode = 3),
SingleLang("SkyManga.xyz", "https://skymanga.xyz", "en", isNsfw = true, className = "SkyMangaXyz"),