diff --git a/build.gradle b/build.gradle index 9cae532e..965d76fb 100644 --- a/build.gradle +++ b/build.gradle @@ -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' diff --git a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ExHentaiParser.kt b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ExHentaiParser.kt index f53a20f7..62190c0f 100644 --- a/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ExHentaiParser.kt +++ b/src/main/kotlin/org/koitharu/kotatsu/parsers/site/ExHentaiParser.kt @@ -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() 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 + } } \ No newline at end of file