From dd0482cb264dc34ae338f60e4a75f86be23b11e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <99822064+revonateB0T@users.noreply.github.com> Date: Sat, 9 Nov 2024 13:38:23 +0800 Subject: [PATCH] Allow ExchangeSite on Http 500 (#1905) * Allow ExchangeSite on Http 500 * Fixup --------- Co-authored-by: Dude so hot --- .../com/hippo/ehviewer/EhApplication.kt | 9 ++++++- .../ehviewer/client/EhCacheKeyFactory.kt | 17 ++++++------ .../ehviewer/client/data/GalleryPreview.kt | 4 +-- .../coil/ExchangeSiteNetworkClient.kt | 27 +++++++++++++++++++ .../coil/LimitConcurrencyNetworkClient.kt | 4 +-- 5 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 app/src/main/kotlin/com/hippo/ehviewer/coil/ExchangeSiteNetworkClient.kt diff --git a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt index 3c5e9d457..84518f740 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt @@ -30,6 +30,7 @@ import coil3.gif.AnimatedImageDecoder import coil3.gif.GifDecoder import coil3.network.ConnectivityChecker import coil3.network.NetworkFetcher +import coil3.network.ktor3.asNetworkClient import coil3.request.ErrorResult import coil3.request.ImageRequest import coil3.request.crossfade @@ -43,6 +44,7 @@ import com.hippo.ehviewer.coil.HardwareBitmapInterceptor import com.hippo.ehviewer.coil.MapExtraInfoInterceptor import com.hippo.ehviewer.coil.MergeInterceptor import com.hippo.ehviewer.coil.QrCodeInterceptor +import com.hippo.ehviewer.coil.exchangeSite import com.hippo.ehviewer.coil.limitConcurrency import com.hippo.ehviewer.dailycheck.checkDawn import com.hippo.ehviewer.dao.SearchDatabase @@ -161,7 +163,12 @@ class EhApplication : interceptorCoroutineContext(Dispatchers.Default) components { serviceLoaderEnabled(false) - add(NetworkFetcher.Factory({ ktorClient.limitConcurrency() }) { ConnectivityChecker.ONLINE }) + add( + NetworkFetcher.Factory( + networkClient = { ktorClient.asNetworkClient().limitConcurrency().exchangeSite() }, + connectivityChecker = { ConnectivityChecker.ONLINE }, + ), + ) add(MergeInterceptor) add(DownloadThumbInterceptor) if (isAtLeastO) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/client/EhCacheKeyFactory.kt b/app/src/main/kotlin/com/hippo/ehviewer/client/EhCacheKeyFactory.kt index ea0b2c980..560ed83ea 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhCacheKeyFactory.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhCacheKeyFactory.kt @@ -44,16 +44,15 @@ val String.isV2PreviewKey get() = startsWith('$') val GalleryInfo.thumbUrl - get() = thumbKey!!.let { - if (it.endsWith("webp")) { - if (useExThumb) URL_PREFIX_THUMB_EX else URL_PREFIX_THUMB_E - } else { - v1ThumbPrefix - } + it - } + get() = keyToUrl(thumbKey!!) -val v1ThumbPrefix - get() = if (useExThumb) URL_PREFIX_V1_THUMB_EX else URL_PREFIX_THUMB_E +fun keyToUrl(key: String, exSite: Boolean = useExThumb) = if (key.endsWith("webp")) { + if (exSite) URL_PREFIX_THUMB_EX else URL_PREFIX_THUMB_E +} else { + if (exSite) URL_PREFIX_V1_THUMB_EX else URL_PREFIX_THUMB_E +} + key + +fun flipThumbSite(url: String) = keyToUrl(getThumbKey(url), !useExThumb) private val useExThumb get() = EhUtils.isExHentai && !Settings.forceEhThumb.value 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 3ee78a31d..9b1a8822f 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 @@ -16,7 +16,7 @@ package com.hippo.ehviewer.client.data import android.os.Parcelable -import com.hippo.ehviewer.client.v1ThumbPrefix +import com.hippo.ehviewer.client.keyToUrl import kotlinx.parcelize.Parcelize sealed interface GalleryPreview : Parcelable { @@ -30,7 +30,7 @@ data class V1GalleryPreview( override val imageKey: String, override val position: Int, ) : GalleryPreview { - override val url get() = v1ThumbPrefix + imageKey + override val url get() = keyToUrl(imageKey) } @Parcelize diff --git a/app/src/main/kotlin/com/hippo/ehviewer/coil/ExchangeSiteNetworkClient.kt b/app/src/main/kotlin/com/hippo/ehviewer/coil/ExchangeSiteNetworkClient.kt new file mode 100644 index 000000000..3b593fcee --- /dev/null +++ b/app/src/main/kotlin/com/hippo/ehviewer/coil/ExchangeSiteNetworkClient.kt @@ -0,0 +1,27 @@ +package com.hippo.ehviewer.coil + +import coil3.network.HttpException +import coil3.network.NetworkClient +import coil3.network.NetworkRequest +import coil3.network.NetworkResponse +import com.hippo.ehviewer.client.EhUtils +import com.hippo.ehviewer.client.flipThumbSite + +class ExchangeSiteNetworkClient(val impl: NetworkClient) : NetworkClient { + override suspend fun executeRequest(req: NetworkRequest, f: suspend (NetworkResponse) -> T): T { + if (EhUtils.isExHentai) { + try { + return impl.executeRequest(req, f) + } catch (e: HttpException) { + if (e.response.code == 500) { + return impl.executeRequest(req.copy(url = flipThumbSite(req.url)), f) + } + throw e + } + } else { + return impl.executeRequest(req, f) + } + } +} + +fun NetworkClient.exchangeSite() = ExchangeSiteNetworkClient(this) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/coil/LimitConcurrencyNetworkClient.kt b/app/src/main/kotlin/com/hippo/ehviewer/coil/LimitConcurrencyNetworkClient.kt index 57780b247..92eee833e 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/coil/LimitConcurrencyNetworkClient.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/coil/LimitConcurrencyNetworkClient.kt @@ -3,10 +3,8 @@ package com.hippo.ehviewer.coil import coil3.network.NetworkClient import coil3.network.NetworkRequest import coil3.network.NetworkResponse -import coil3.network.ktor3.asNetworkClient import com.hippo.ehviewer.client.URL_PREFIX_THUMB_EX import com.hippo.ehviewer.client.URL_SIGNATURE_THUMB_NORMAL -import io.ktor.client.HttpClient import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.withContext import moe.tarsin.coroutines.NamedSemaphore @@ -27,4 +25,4 @@ class LimitConcurrencyNetworkClient(val impl: NetworkClient) : NetworkClient { } } -fun HttpClient.limitConcurrency() = LimitConcurrencyNetworkClient(asNetworkClient()) +fun NetworkClient.limitConcurrency() = LimitConcurrencyNetworkClient(this)