Limit thumb fetcher concurrency

This commit is contained in:
Dude so hot authored and renovate[bot] committed 2024-10-21 20:54:37 +08:00
1 parent 145948f506
commit cf6f793478
3 files changed
+31 -4

No files matched your search

@@ -28,7 +28,7 @@ import coil3.SingletonImageLoader
import coil3.asImage
import coil3.gif.AnimatedImageDecoder
import coil3.gif.GifDecoder
import coil3.network.ktor3.KtorNetworkFetcherFactory
import coil3.network.NetworkFetcher
import coil3.request.ErrorResult
import coil3.request.ImageRequest
import coil3.request.crossfade
@@ -43,6 +43,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.limitConcurrency
import com.hippo.ehviewer.dailycheck.checkDawn
import com.hippo.ehviewer.dao.SearchDatabase
import com.hippo.ehviewer.download.DownloadManager
@@ -161,7 +162,7 @@ class EhApplication :
interceptorCoroutineContext(Dispatchers.Default)
components {
serviceLoaderEnabled(false)
add(KtorNetworkFetcherFactory(httpClient = { ktorClient }))
add(NetworkFetcher.Factory({ ktorClient.limitConcurrency() }))
add(MergeInterceptor)
add(DownloadThumbInterceptor)
if (isAtLeastO) {
@@ -23,8 +23,8 @@ import com.hippo.ehviewer.client.data.NormalGalleryPreview
// ExHentai Large Preview: https://s.exhentai.org/t/***
// E-Hentai Large Preview: https://ehgt.org/***
private const val URL_PREFIX_THUMB_E = "https://ehgt.org/"
private const val URL_PREFIX_THUMB_EX = "https://s.exhentai.org/t/"
const val URL_PREFIX_THUMB_E = "https://ehgt.org/"
const val URL_PREFIX_THUMB_EX = "https://s.exhentai.org/t/"
private const val NORMAL_PREVIEW_PREFIX = "$"
private val NormalPreviewKeyRegex = Regex("/(\\d+-\\d+)\\.jpg$")
@@ -0,0 +1,26 @@
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_E
import com.hippo.ehviewer.client.URL_PREFIX_THUMB_EX
import io.ktor.client.HttpClient
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
class LimitConcurrencyNetworkClient(val impl: NetworkClient) : NetworkClient {
val eSemaphore = Semaphore(4)
val exSemaphore = Semaphore(4)
override suspend fun <T> executeRequest(req: NetworkRequest, f: suspend (NetworkResponse) -> T): T {
val url = req.url
return when {
URL_PREFIX_THUMB_E in url -> eSemaphore.withPermit { impl.executeRequest(req, f) }
URL_PREFIX_THUMB_EX in url -> exSemaphore.withPermit { impl.executeRequest(req, f) }
else -> impl.executeRequest(req, f)
}
}
}
fun HttpClient.limitConcurrency() = LimitConcurrencyNetworkClient(asNetworkClient())