diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/EhCookieStore.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/EhCookieStore.kt index 7d719e526..dc37e37e4 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhCookieStore.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhCookieStore.kt @@ -18,6 +18,7 @@ object EhCookieStore : CookiesStorage { const val KEY_IPB_MEMBER_ID = "ipb_member_id" const val KEY_IPB_PASS_HASH = "ipb_pass_hash" const val KEY_IGNEOUS = "igneous" + private const val KEY_HATH_PERKS = "hath_perks" private const val KEY_CONTENT_WARNING = "nw" private const val CONTENT_WARNING_NOT_SHOW = "1" private const val KEY_UTMP_NAME = "__utmp" @@ -35,6 +36,8 @@ object EhCookieStore : CookiesStorage { fun getUserId() = getCookies(EhUrl.HOST_E)?.get(KEY_IPB_MEMBER_ID) + fun getHathPerks() = getCookies(EhUrl.HOST_E)?.get(KEY_HATH_PERKS)?.substringBefore('-') + fun getIdentityCookies(): List> { val eCookies = getCookies(EhUrl.HOST_E) val exCookies = getCookies(EhUrl.HOST_EX) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/EhUtils.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/EhUtils.kt index 2339ba210..157714907 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhUtils.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhUtils.kt @@ -87,6 +87,9 @@ object EhUtils { val isExHentai: Boolean get() = Settings.gallerySite.value == EhUrl.SITE_EX + val isMpvAvailable + get() = EhCookieStore.getHathPerks()?.contains('q') == true + fun getCategory(type: String?): Int { for (entry in CATEGORY_STRINGS) { for (str in entry.first) { 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 db4f5337f..120f8fd3c 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -25,6 +25,7 @@ import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUrl.getGalleryDetailUrl import com.hippo.ehviewer.client.EhUrl.getGalleryMultiPageViewerUrl import com.hippo.ehviewer.client.EhUrl.referer +import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.client.ehRequest import com.hippo.ehviewer.client.exception.QuotaExceededException @@ -327,8 +328,10 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS spiderInfo } + private val isMpvAvailable = EhUtils.isMpvAvailable + suspend fun getPTokenFromMultiPageViewer(index: Int): String? { - val spiderInfo = spiderInfo + if (!isMpvAvailable) return null val url = getGalleryMultiPageViewerUrl( galleryInfo.gid, galleryInfo.token, @@ -347,8 +350,6 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS } suspend fun getPTokenFromInternet(index: Int): String? { - val spiderInfo = spiderInfo - // Check previewIndex var previewIndex: Int previewIndex = if (spiderInfo.previewPerPage >= 0) { @@ -538,25 +539,19 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS private suspend fun doInJob(index: Int, force: Boolean, orgImg: Boolean, skipHath: Boolean) { suspend fun getPToken(index: Int): String? { if (index !in 0 until size) return null - return spiderInfo.pTokenMap[index].takeIf { it != TOKEN_FAILED } - ?: getPTokenFromInternet(index) - ?: getPTokenFromInternet(index) + return spiderInfo.pTokenMap[index] ?: getPTokenFromMultiPageViewer(index) + ?: getPTokenFromInternet(index) + // Preview size may changed, so try to get pToken twice + ?: getPTokenFromInternet(index) } val previousPToken: String? val pToken: String pTokenLock.withLock { - if (force) { - if (spiderInfo.pTokenMap[index] == TOKEN_FAILED) { - spiderInfo.pTokenMap.remove(index) - } - } else if (index in spiderDen) { + if (!force && index in spiderDen) { return updatePageState(index, STATE_FINISHED) } - pToken = getPToken(index) - ?: return updatePageState(index, STATE_FAILED, PTOKEN_FAILED_MESSAGE).also { - spiderInfo.pTokenMap[index] = TOKEN_FAILED - } + pToken = getPToken(index) ?: return updatePageState(index, STATE_FAILED, PTOKEN_FAILED_MESSAGE) previousPToken = getPToken(index - 1) // The lock for delay should be acquired before anything else to maintain FIFO order