diff --git a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt index 2c85fd518..b15e7d89a 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/EhApplication.kt @@ -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) { 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 b83d71171..8e8919c3f 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/client/EhCacheKeyFactory.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/client/EhCacheKeyFactory.kt @@ -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$") diff --git a/app/src/main/kotlin/com/hippo/ehviewer/coil/LimitConcurrencyNetworkClient.kt b/app/src/main/kotlin/com/hippo/ehviewer/coil/LimitConcurrencyNetworkClient.kt new file mode 100644 index 000000000..c024df6ec --- /dev/null +++ b/app/src/main/kotlin/com/hippo/ehviewer/coil/LimitConcurrencyNetworkClient.kt @@ -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 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())