Allow ExchangeSite on Http 500 (#1905)

* Allow ExchangeSite on Http 500

* Fixup

---------

Co-authored-by: Dude so hot <djohn@fbi.gov>
This commit is contained in:
renovate[bot]andDude so hot authored and GitHub committed 2024-11-09 13:38:23 +08:00
1 parent 4052007de8
commit dd0482cb26
5 files changed
+46 -15

No files matched your search

@@ -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) {
@@ -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
@@ -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
@@ -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 <T> 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)
@@ -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)