Use URL fragment in MangaPlus. (#13722)
This commit is contained in:
parent
f8c104f2ae
commit
a0d1c5c565
|
@ -6,7 +6,7 @@ ext {
|
||||||
extName = 'MANGA Plus by SHUEISHA'
|
extName = 'MANGA Plus by SHUEISHA'
|
||||||
pkgNameSuffix = 'all.mangaplus'
|
pkgNameSuffix = 'all.mangaplus'
|
||||||
extClass = '.MangaPlusFactory'
|
extClass = '.MangaPlusFactory'
|
||||||
extVersionCode = 37
|
extVersionCode = 38
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
|
|
@ -315,8 +315,7 @@ class MangaPlus(
|
||||||
return result.success.mangaViewer!!.pages
|
return result.success.mangaViewer!!.pages
|
||||||
.mapNotNull(MangaPlusPage::mangaPage)
|
.mapNotNull(MangaPlusPage::mangaPage)
|
||||||
.mapIndexed { i, page ->
|
.mapIndexed { i, page ->
|
||||||
val encryptionKey = if (page.encryptionKey == null) "" else
|
val encryptionKey = if (page.encryptionKey == null) "" else "#${page.encryptionKey}"
|
||||||
"&encryptionKey=${page.encryptionKey}"
|
|
||||||
Page(i, referer, page.imageUrl + encryptionKey)
|
Page(i, referer, page.imageUrl + encryptionKey)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -342,16 +341,6 @@ class MangaPlus(
|
||||||
entryValues = QUALITY_PREF_ENTRY_VALUES
|
entryValues = QUALITY_PREF_ENTRY_VALUES
|
||||||
setDefaultValue(QUALITY_PREF_DEFAULT_VALUE)
|
setDefaultValue(QUALITY_PREF_DEFAULT_VALUE)
|
||||||
summary = "%s"
|
summary = "%s"
|
||||||
|
|
||||||
setOnPreferenceChangeListener { _, newValue ->
|
|
||||||
val selected = newValue as String
|
|
||||||
val index = findIndexOfValue(selected)
|
|
||||||
val entry = entryValues[index] as String
|
|
||||||
|
|
||||||
preferences.edit()
|
|
||||||
.putString("${QUALITY_PREF_KEY}_$lang", entry)
|
|
||||||
.commit()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val splitPref = SwitchPreferenceCompat(screen.context).apply {
|
val splitPref = SwitchPreferenceCompat(screen.context).apply {
|
||||||
|
@ -359,14 +348,6 @@ class MangaPlus(
|
||||||
title = intl.splitDoublePages
|
title = intl.splitDoublePages
|
||||||
summary = intl.splitDoublePagesSummary
|
summary = intl.splitDoublePagesSummary
|
||||||
setDefaultValue(SPLIT_PREF_DEFAULT_VALUE)
|
setDefaultValue(SPLIT_PREF_DEFAULT_VALUE)
|
||||||
|
|
||||||
setOnPreferenceChangeListener { _, newValue ->
|
|
||||||
val checkValue = newValue as Boolean
|
|
||||||
|
|
||||||
preferences.edit()
|
|
||||||
.putBoolean("${SPLIT_PREF_KEY}_$lang", checkValue)
|
|
||||||
.commit()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
screen.addPreference(qualityPref)
|
screen.addPreference(qualityPref)
|
||||||
|
@ -374,25 +355,16 @@ class MangaPlus(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun imageIntercept(chain: Interceptor.Chain): Response {
|
private fun imageIntercept(chain: Interceptor.Chain): Response {
|
||||||
var request = chain.request()
|
val request = chain.request()
|
||||||
|
|
||||||
if (request.url.queryParameter("encryptionKey") == null)
|
|
||||||
return chain.proceed(request)
|
|
||||||
|
|
||||||
val encryptionKey = request.url.queryParameter("encryptionKey")!!
|
|
||||||
|
|
||||||
// Change the url and remove the encryptionKey to avoid detection.
|
|
||||||
val newUrl = request.url.newBuilder()
|
|
||||||
.removeAllQueryParameters("encryptionKey")
|
|
||||||
.build()
|
|
||||||
request = request.newBuilder()
|
|
||||||
.url(newUrl)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val response = chain.proceed(request)
|
val response = chain.proceed(request)
|
||||||
|
val encryptionKey = request.url.fragment
|
||||||
|
|
||||||
|
if (encryptionKey.isNullOrEmpty()) {
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
val contentType = response.header("Content-Type", "image/jpeg")!!
|
val contentType = response.header("Content-Type", "image/jpeg")!!
|
||||||
val image = decodeImage(encryptionKey, response.body!!.bytes())
|
val image = response.body!!.bytes().decodeXorCipher(encryptionKey)
|
||||||
val body = image.toResponseBody(contentType.toMediaTypeOrNull())
|
val body = image.toResponseBody(contentType.toMediaTypeOrNull())
|
||||||
|
|
||||||
return response.newBuilder()
|
return response.newBuilder()
|
||||||
|
@ -400,17 +372,6 @@ class MangaPlus(
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun decodeImage(encryptionKey: String, imageBytes: ByteArray): ByteArray {
|
|
||||||
val keyStream = encryptionKey
|
|
||||||
.chunked(2)
|
|
||||||
.map { it.toInt(16) }
|
|
||||||
|
|
||||||
return imageBytes
|
|
||||||
.mapIndexed { i, byte -> byte.toInt() xor keyStream[i % keyStream.size] }
|
|
||||||
.map(Int::toByte)
|
|
||||||
.toByteArray()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun thumbnailIntercept(chain: Interceptor.Chain): Response {
|
private fun thumbnailIntercept(chain: Interceptor.Chain): Response {
|
||||||
val request = chain.request()
|
val request = chain.request()
|
||||||
val response = chain.proceed(request)
|
val response = chain.proceed(request)
|
||||||
|
@ -433,6 +394,15 @@ class MangaPlus(
|
||||||
return response
|
return response
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ByteArray.decodeXorCipher(key: String): ByteArray {
|
||||||
|
val keyStream = key.chunked(2)
|
||||||
|
.map { it.toInt(16) }
|
||||||
|
|
||||||
|
return mapIndexed { i, byte -> byte.toInt() xor keyStream[i % keyStream.size] }
|
||||||
|
.map(Int::toByte)
|
||||||
|
.toByteArray()
|
||||||
|
}
|
||||||
|
|
||||||
private fun Response.asMangaPlusResponse(): MangaPlusResponse = use {
|
private fun Response.asMangaPlusResponse(): MangaPlusResponse = use {
|
||||||
json.decodeFromString(body!!.string())
|
json.decodeFromString(body!!.string())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue