Fixed imageloading again (#5023)

Fixed imageloading again
This commit is contained in:
Blatzar 2020-12-05 13:34:39 +00:00 committed by GitHub
parent fb1092dd29
commit 6e97dfab20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 53 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'HentaiNexus' extName = 'HentaiNexus'
pkgNameSuffix = 'en.hentainexus' pkgNameSuffix = 'en.hentainexus'
extClass = '.HentaiNexus' extClass = '.HentaiNexus'
extVersionCode = 5 extVersionCode = 6
libVersion = '1.2' libVersion = '1.2'
containsNsfw = true containsNsfw = true
} }

View File

@ -1,7 +1,5 @@
package eu.kanade.tachiyomi.extension.en.hentainexus package eu.kanade.tachiyomi.extension.en.hentainexus
import android.util.Base64
import com.google.gson.JsonParser
import eu.kanade.tachiyomi.annotations.Nsfw import eu.kanade.tachiyomi.annotations.Nsfw
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.network.asObservableSuccess
@ -12,13 +10,14 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable import rx.Observable
import java.net.URLEncoder import java.net.URLEncoder
import kotlin.experimental.xor
@Nsfw @Nsfw
class HentaiNexus : ParsedHttpSource() { class HentaiNexus : ParsedHttpSource() {
@ -181,10 +180,27 @@ class HentaiNexus : ParsedHttpSource() {
override fun chapterListSelector() = "div.container nav.depict-button-set" override fun chapterListSelector() = "div.container nav.depict-button-set"
override fun chapterFromElement(element: Element): SChapter { // Chapters
return SChapter.create().apply { override fun chapterListParse(response: Response): List<SChapter> {
url = element.select("div.level-item a").attr("href") return listOf(
name = "Read Online: Chapter 0" SChapter.create().apply {
name = "Read Online: Chapter 0"
// page path with a marker at the end
url = "${response.request().url().toString().replace("/view/", "/read/")}#"
// number of pages
url += response.asJsoup().select("td.viewcolumn:containsOwn(Pages) + td").text()
}
)
}
override fun chapterFromElement(element: Element): SChapter = throw UnsupportedOperationException("Not used")
// Pages
override fun fetchPageList(chapter: SChapter): Observable<List<Page>> {
// split the "url" to get the page path and number of pages
return chapter.url.split("#").let { list ->
// repeat() turns 1 -> 001 and 10 -> 010
Observable.just(listOf(1..list[1].toInt()).flatten().map { Page(it, list[0] + "/${"0".repeat(maxOf(3 - it.toString().length, 0))}$it") })
} }
} }
@ -195,53 +211,12 @@ class HentaiNexus : ParsedHttpSource() {
return super.pageListRequest(chapter) return super.pageListRequest(chapter)
} }
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> = throw UnsupportedOperationException("Not used")
return document.select("script:containsData(initreader)").first().data()
.substringAfter("initReader(\"") override fun imageUrlParse(document: Document): String {
.substringBefore("\", 1") return document.select("img#currImage").attr("abs:src")
.let(::decodePages)
.mapIndexed { i, image -> Page(i, "", image) }
} }
private fun decodePages(code: String): List<String> {
val bin: ByteArray = Base64.decode(code, Base64.DEFAULT)
val head: ByteArray = bin.sliceArray(0..63)
val arr = ByteArray(256) { it.toByte() }
var num: Int = 0
var tmp: Byte
for (i in 0..255) {
num = (num + arr[i] + head[i % head.size] + 256) % 256
tmp = arr[i]
arr[i] = arr[num]
arr[num] = tmp
}
var i = 0
num = 0
val buf = StringBuilder()
for (j in 0..bin.size - 65) {
i = (i + 1) % 256
num = (num + arr[i] + 256) % 256
tmp = arr[i]
arr[i] = arr[num]
arr[num] = tmp
buf.append((bin[j + 64] xor arr[(arr[i] + arr[num] + 256) % 256]).toChar())
}
val json = JsonParser().parse(buf.toString()).asJsonObject
val base = json.get("b").asString
val folder = json.get("r").asString
val id = json.get("i").asString
return json.get("f").asJsonArray.map { it ->
val page = it.asJsonObject
"${base}${folder}${page.get("h").asString}/$id/${page.get("p").asString}"
}
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")
override fun getFilterList() = FilterList( override fun getFilterList() = FilterList(
Filter.Header("Only one filter may be used at a time."), Filter.Header("Only one filter may be used at a time."),
Filter.Separator(), Filter.Separator(),