diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/data/GalleryPreview.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/data/GalleryPreview.kt index f9b181e68..50c373c39 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/data/GalleryPreview.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/data/GalleryPreview.kt @@ -15,31 +15,26 @@ */ package com.hippo.ehviewer.client.data -import com.hippo.ehviewer.client.getThumbKey -import com.hippo.ehviewer.client.getV2PreviewKey +import com.hippo.ehviewer.client.keyToUrl sealed interface GalleryPreview { val url: String val imageKey: String val position: Int - val pToken: String } data class V1GalleryPreview( - override val url: String, + override val imageKey: String, override val position: Int, - override val pToken: String, ) : GalleryPreview { - override val imageKey get() = getThumbKey(url) + override val url get() = keyToUrl(imageKey) } data class V2GalleryPreview( override val url: String, + override val imageKey: String, override val position: Int, - override val pToken: String, val offsetX: Int, val clipWidth: Int, val clipHeight: Int, -) : GalleryPreview { - override val imageKey get() = getV2PreviewKey(url) -} +) : GalleryPreview diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt index b9a5e1834..ff36b0112 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/parser/GalleryDetailParser.kt @@ -17,6 +17,7 @@ package com.hippo.ehviewer.client.parser import arrow.core.Either import arrow.core.getOrElse +import arrow.core.unzip import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhFilter @@ -39,6 +40,7 @@ import com.hippo.ehviewer.client.exception.OffensiveException import com.hippo.ehviewer.client.exception.ParseException import com.hippo.ehviewer.client.exception.PiningException import com.hippo.ehviewer.client.getThumbKey +import com.hippo.ehviewer.client.getV2PreviewKey import com.hippo.ehviewer.util.toEpochMillis import com.hippo.ehviewer.util.toFloatOrDefault import com.hippo.ehviewer.util.toIntOrDefault @@ -55,21 +57,25 @@ import org.jsoup.select.NodeTraversor object GalleryDetailParser { private val PATTERN_ERROR = Regex("
\n

([^<]+)

") - private val PATTERN_DETAIL = - Regex("var gid = (\\d+);\\s+var token = \"([a-f0-9]+)\";\\s+var apiuid = ([\\-\\d]+);\\s+var apikey = \"([a-f0-9]+)\";") + private val PATTERN_DETAIL = Regex( + "var gid = (\\d+);.+?var token = \"([a-f0-9]+)\";.+?var apiuid = ([\\-\\d]+);.+?var apikey = \"([a-f0-9]+)\";", + RegexOption.DOT_MATCHES_ALL, + ) private val PATTERN_TORRENT = Regex("]*onclick=\"return popUp\\('([^']+)'[^)]+\\)\">Torrent Download \\((\\d+)\\)") private val PATTERN_ARCHIVE = Regex("]*onclick=\"return popUp\\('([^']+)'[^)]+\\)\">Archive Download") - private val PATTERN_COVER = Regex("(\\d+)\\D+(\\d+)[^(]+\\(([^)]+)") + private val PATTERN_COVER = Regex("width:(\\d+)px; height:(\\d+)px.+?url\\((.+?)\\)") private val PATTERN_PAGES = Regex("]*>Length:]*>([\\d,]+) pages") - private val PATTERN_NEWER_DATE = Regex(", added ([^<]+)
") + private val PATTERN_PREVIEW_PAGES = + Regex("]+>]+>([\\d,]+)]+>(?:]+>)?>(?:)?") + private val PATTERN_NEWER_DATE = Regex(", added (.+?)
") private val PATTERN_FAVORITE_SLOT = - Regex("/fav\\.png\\); background-position:0px -(\\d+)px") + Regex("/fav.png\\); background-position:0px -(\\d+)px") private val EMPTY_GALLERY_COMMENT_LIST = GalleryCommentList(emptyList(), false) private val PreviewRegex = - Regex("(?:
)?
() + SpiderInfo(gid, token, pages, pTokenMap, previewPages, previewPerPage).apply { runCatching { while (true) { val line = read() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderInfo.kt b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderInfo.kt index 3eda78073..9b8e47a6e 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderInfo.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderInfo.kt @@ -27,6 +27,8 @@ class SpiderInfo( val pTokenMap: MutableMap = hashMapOf(), + var previewPages: Int = -1, + var previewPerPage: Int = -1, ) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt index dbc24185b..914ba9391 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -34,7 +34,9 @@ import com.hippo.ehviewer.client.exception.QuotaExceededException import com.hippo.ehviewer.client.fetchUsingAsText import com.hippo.ehviewer.client.parser.GalleryDetailParser.parsePages import com.hippo.ehviewer.client.parser.GalleryDetailParser.parsePreviewList +import com.hippo.ehviewer.client.parser.GalleryDetailParser.parsePreviewPages import com.hippo.ehviewer.client.parser.GalleryMultiPageViewerPTokenParser +import com.hippo.ehviewer.client.parser.GalleryPageUrlParser import com.hippo.ehviewer.util.displayString import com.hippo.files.find import eu.kanade.tachiyomi.util.system.logcat @@ -319,14 +321,20 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS ?: readFromCache(galleryInfo.gid)?.takeIf { it.gid == galleryInfo.gid && it.token == galleryInfo.token } private fun readPreviews(body: String, index: Int, spiderInfo: SpiderInfo) { - val previewList = parsePreviewList(body) - if (index == 0) { - spiderInfo.previewPerPage = previewList.size - } else { - spiderInfo.previewPerPage = previewList[0].position / index + spiderInfo.previewPages = parsePreviewPages(body) + val (previewList, pageUrlList) = parsePreviewList(body) + if (previewList.isNotEmpty()) { + if (index == 0) { + spiderInfo.previewPerPage = previewList.size + } else { + spiderInfo.previewPerPage = previewList[0].position / index + } } - previewList.forEach { - spiderInfo.pTokenMap[it.position] = it.pToken + pageUrlList.forEach { + val result = GalleryPageUrlParser.parse(it) + if (result != null) { + spiderInfo.pTokenMap[result.page] = result.pToken + } } } @@ -362,11 +370,16 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS } suspend fun getPTokenFromInternet(index: Int): String? { - val previewIndex = if (spiderInfo.previewPerPage > 0) { + // Check previewIndex + var previewIndex: Int + previewIndex = if (spiderInfo.previewPerPage >= 0) { index / spiderInfo.previewPerPage } else { 0 } + if (spiderInfo.previewPages > 0) { + previewIndex = previewIndex.coerceAtMost(spiderInfo.previewPages - 1) + } val url = getGalleryDetailUrl( galleryInfo.gid, galleryInfo.token, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryDetailContent.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryDetailContent.kt index 0a3875e10..28240ee38 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryDetailContent.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/screen/GalleryDetailContent.kt @@ -805,7 +805,7 @@ private fun GalleryDetail.collectPreviewItems() = rememberInVM(previewList) { (up..end).filterNot { it in previewPagesMap }.map { it / pageSize }.toSet() .parMap(concurrency = Settings.multiThreadDownload) { page -> val url = EhUrl.getGalleryDetailUrl(gid, token, page, false) - EhEngine.getPreviewList(url) + EhEngine.getPreviewList(url).first }.flattenForEach { previewPagesMap[it.position] = it if (Settings.preloadThumbAggressively) {