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 50c373c39..f9b181e68 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,26 +15,31 @@ */ package com.hippo.ehviewer.client.data -import com.hippo.ehviewer.client.keyToUrl +import com.hippo.ehviewer.client.getThumbKey +import com.hippo.ehviewer.client.getV2PreviewKey sealed interface GalleryPreview { val url: String val imageKey: String val position: Int + val pToken: String } data class V1GalleryPreview( - override val imageKey: String, + override val url: String, override val position: Int, + override val pToken: String, ) : GalleryPreview { - override val url get() = keyToUrl(imageKey) + override val imageKey get() = getThumbKey(url) } 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 +) : GalleryPreview { + override val imageKey get() = getV2PreviewKey(url) +} 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 ff36b0112..1d1553c69 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,7 +17,6 @@ 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 @@ -40,7 +39,6 @@ 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 @@ -57,25 +55,21 @@ import org.jsoup.select.NodeTraversor object GalleryDetailParser { private val PATTERN_ERROR = Regex("
\n

([^<]+)

") - 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_DETAIL = + Regex("var gid = (\\d+);\\s+var token = \"([a-f0-9]+)\";\\s+var apiuid = ([\\-\\d]+);\\s+var apikey = \"([a-f0-9]+)\";") 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("width:(\\d+)px; height:(\\d+)px.+?url\\((.+?)\\)") + private val PATTERN_COVER = Regex("(\\d+)\\D+(\\d+)[^(]+\\(([^)]+)") private val PATTERN_PAGES = Regex("]*>Length:]*>([\\d,]+) pages") - private val PATTERN_PREVIEW_PAGES = - Regex("]+>]+>([\\d,]+)]+>(?:]+>)?>(?:)?") - private val PATTERN_NEWER_DATE = Regex(", added (.+?)
") + 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 { + val pages = readInt() + SpiderInfo(gid, token, pages, previewPerPage = 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 9b8e47a6e..3eda78073 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderInfo.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderInfo.kt @@ -27,8 +27,6 @@ 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 914ba9391..101b59fdb 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -34,9 +34,7 @@ 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 @@ -321,19 +319,15 @@ 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) { - 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 - } + val previewList = parsePreviewList(body) + if (index == 0) { + spiderInfo.previewPerPage = previewList.size + } else { + spiderInfo.previewPerPage = previewList[0].position / index } - pageUrlList.forEach { - val result = GalleryPageUrlParser.parse(it) - if (result != null) { - spiderInfo.pTokenMap[result.page] = result.pToken + previewList.forEach { + if (it.pToken.isNotEmpty()) { + spiderInfo.pTokenMap[it.position] = it.pToken } } } @@ -370,16 +364,11 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS } suspend fun getPTokenFromInternet(index: Int): String? { - // Check previewIndex - var previewIndex: Int - previewIndex = if (spiderInfo.previewPerPage >= 0) { + val 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, @@ -670,6 +659,11 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS // TODO: Check IP ban } error = it.displayString() + if (error == "Invalid page.") { + pTokenLock.withLock { + spiderInfo.pTokenMap.remove(index) + } + } } updatePageState(index, STATE_FAILED, error) } 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 28240ee38..0a3875e10 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).first + EhEngine.getPreviewList(url) }.flattenForEach { previewPagesMap[it.position] = it if (Settings.preloadThumbAggressively) {