From 0ac11dbe0b2231d7966d1c4d2c973bbab8a0ca5b Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Fri, 29 Mar 2024 17:14:54 +0800 Subject: [PATCH] Fix `SpiderQueen` not respecting FIFO order And optimize preloading strategy. --- .../com/hippo/ehviewer/spider/SpiderQueen.kt | 29 +++++++++---------- .../tachiyomi/ui/reader/loader/PageLoader.kt | 5 +++- 2 files changed, 17 insertions(+), 17 deletions(-) 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 955062665..82b6d5410 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -547,13 +547,20 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS private fun doLaunchDownloadJob(index: Int, force: Boolean, orgImg: Boolean = false) { val state = mPageStateArray[index] - if (!force && state == STATE_FINISHED) return + if (!force) { + if (state == STATE_FINISHED) return + if (index in mSpiderDen) return updatePageState(index, STATE_FINISHED) + } val currentJob = mFetcherJobMap[index] val skipHath = force && !orgImg && currentJob?.isActive == true if (force) currentJob?.cancel(CancellationException(FORCE_RETRY)) if (currentJob?.isActive != true) { mFetcherJobMap[index] = launch { runCatching { + delayLock.withLock { + delay(mDownloadDelay - lastRequestTime.elapsedNow()) + lastRequestTime = TimeSource.Monotonic.markNow() + } mSemaphore.withPermit { doInJob(index, force, orgImg, skipHath) } @@ -591,19 +598,14 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS ?: getPTokenFromMultiPageViewer(index) } updatePageState(index, STATE_DOWNLOADING) - if (!force && index in mSpiderDen) { - return updatePageState(index, STATE_FINISHED) - } - if (force) { - pTokenLock.withLock { - val pToken = mSpiderInfo.pTokenMap[index] - if (pToken == TOKEN_FAILED) mSpiderInfo.pTokenMap.remove(index) - } - } val previousPToken: String? val pToken: String - pTokenLock.withLock { + if (force) { + if (mSpiderInfo.pTokenMap[index] == TOKEN_FAILED) { + mSpiderInfo.pTokenMap.remove(index) + } + } pToken = getPToken(index) ?: return updatePageState(index, STATE_FAILED, PTOKEN_FAILED_MESSAGE).also { mSpiderInfo.pTokenMap[index] = TOKEN_FAILED @@ -611,11 +613,6 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS previousPToken = getPToken(index - 1) } - delayLock.withLock { - delay(mDownloadDelay - lastRequestTime.elapsedNow()) - lastRequestTime = TimeSource.Monotonic.markNow() - } - var skipHathKey: String? = null var originImageUrl: String? = null var error: String? = null diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt index bafed7f5b..099cb7a7d 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt @@ -62,7 +62,10 @@ abstract class PageLoader { onRequest(index) } - val pagesAbsent = ((index - 5).coerceAtLeast(0) until (preloads + index).coerceAtMost(size)).mapNotNull { it.takeIf { cache[it] == null } } + val pagesAbsent = ((index - 5).coerceAtLeast(0) until (preloads + index).coerceAtMost(size)) + .mapNotNullTo(mutableListOf()) { it.takeIf { it != index && cache[it] == null } } + // Load forward first, then load backward from the nearest index + pagesAbsent.sortBy { (index - it).coerceAtLeast(0) } preloadPages(pagesAbsent, (index - 10).coerceAtLeast(0) to (preloads + index + 10).coerceAtMost(size)) }