|
|
|
|
@ -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
|
|
|
|
|
}
|
|
|
|
|
}
|