diff --git a/src/en/hentainexus/build.gradle b/src/en/hentainexus/build.gradle index 79252afaa..70f6d5cd6 100644 --- a/src/en/hentainexus/build.gradle +++ b/src/en/hentainexus/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'HentaiNexus' pkgNameSuffix = 'en.hentainexus' extClass = '.HentaiNexus' - extVersionCode = 5 + extVersionCode = 6 libVersion = '1.2' containsNsfw = true } diff --git a/src/en/hentainexus/src/eu/kanade/tachiyomi/extension/en/hentainexus/HentaiNexus.kt b/src/en/hentainexus/src/eu/kanade/tachiyomi/extension/en/hentainexus/HentaiNexus.kt index b84f2b67d..600db3321 100644 --- a/src/en/hentainexus/src/eu/kanade/tachiyomi/extension/en/hentainexus/HentaiNexus.kt +++ b/src/en/hentainexus/src/eu/kanade/tachiyomi/extension/en/hentainexus/HentaiNexus.kt @@ -1,7 +1,5 @@ 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.network.GET 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.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup import okhttp3.OkHttpClient import okhttp3.Request +import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable import java.net.URLEncoder -import kotlin.experimental.xor @Nsfw class HentaiNexus : ParsedHttpSource() { @@ -181,10 +180,27 @@ class HentaiNexus : ParsedHttpSource() { override fun chapterListSelector() = "div.container nav.depict-button-set" - override fun chapterFromElement(element: Element): SChapter { - return SChapter.create().apply { - url = element.select("div.level-item a").attr("href") - name = "Read Online: Chapter 0" + // Chapters + override fun chapterListParse(response: Response): List { + return listOf( + 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> { + // 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) } - override fun pageListParse(document: Document): List { - return document.select("script:containsData(initreader)").first().data() - .substringAfter("initReader(\"") - .substringBefore("\", 1") - .let(::decodePages) - .mapIndexed { i, image -> Page(i, "", image) } + override fun pageListParse(document: Document): List = throw UnsupportedOperationException("Not used") + + override fun imageUrlParse(document: Document): String { + return document.select("img#currImage").attr("abs:src") } - private fun decodePages(code: String): List { - 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( Filter.Header("Only one filter may be used at a time."), Filter.Separator(),