[ExHentai] Fix pagination

pull/142/head
Koitharu 3 years ago
parent d18f665556
commit add70b4790
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -57,7 +57,7 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'com.squareup.okio:okio:3.2.0'
api 'org.jsoup:jsoup:1.15.2'
api 'org.jsoup:jsoup:1.15.3'
implementation 'org.json:json:20220320'
implementation 'androidx.collection:collection-ktx:1.2.0'

@ -1,5 +1,8 @@
package org.koitharu.kotatsu.parsers.site
import androidx.collection.SparseArrayCompat
import androidx.collection.set
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import org.jsoup.nodes.Element
import org.koitharu.kotatsu.parsers.MangaLoaderContext
import org.koitharu.kotatsu.parsers.MangaParserAuthProvider
@ -33,6 +36,7 @@ internal class ExHentaiParser(
private val ratingPattern = Regex("-?[0-9]+px")
private val authCookies = arrayOf("ipb_member_id", "ipb_pass_hash")
private var updateDm = false
private val nextPages = SparseArrayCompat<Long>()
override val isAuthorized: Boolean
get() {
@ -56,6 +60,7 @@ internal class ExHentaiParser(
context.cookieJar.insertCookies(DOMAIN_UNAUTHORIZED, "nw=1", "sl=dm_2")
}
override suspend fun getListPage(
page: Int,
query: String?,
@ -66,8 +71,8 @@ internal class ExHentaiParser(
val url = buildString {
append("https://")
append(getDomain())
append("/?page=")
append(page)
append("/?next=")
append(nextPages.get(page, 0L))
if (!tags.isNullOrEmpty()) {
var fCats = 0
for (tag in tags) {
@ -88,6 +93,7 @@ internal class ExHentaiParser(
if (updateDm) {
append("&inline_set=dm_e")
}
append("&advsearch=1&f_sh=on")
}
val body = context.httpGet(url).parseHtml().body()
val root = body.selectFirst("table.itg")
@ -99,6 +105,7 @@ internal class ExHentaiParser(
return getListPage(page, query, tags, sortOrder)
}
updateDm = false
nextPages[page + 1] = getNextTimestamp(root)
return root.children().mapNotNull { tr ->
if (tr.childrenSize() != 2) return@mapNotNull null
val (td1, td2) = tr.children()
@ -276,4 +283,12 @@ internal class ExHentaiParser(
val num = className.drop(2).toIntOrNull(16) ?: return null
return 2.0.pow(num).toInt().toString()
}
private fun getNextTimestamp(root: Element): Long {
return root.getElementById("unext")
?.attrAsAbsoluteUrlOrNull("href")
?.toHttpUrlOrNull()
?.queryParameter("next")
?.toLongOrNull() ?: 1
}
}
Loading…
Cancel
Save