From acc3e16230f3b2159cd3ee6b27c3ce3542d3126e Mon Sep 17 00:00:00 2001 From: Two-Ai <81279822+Two-Ai@users.noreply.github.com> Date: Wed, 25 Jan 2023 18:18:12 -0500 Subject: [PATCH] Fixup HttpPageLoader _loadPage (#8984) Fixup for e4bc8990 (#8955) HttpSource.fetchImage() uses Call.asObservableSuccess(), which cancels the call on unsubscribe. This causes the call to be cancelled before it is used, leading to a "java.net.SocketException: Socket is closed" when trying to use the response in putImageToCache(). To fix this, use Call.awaitSuccess() via a new HttpSource.getImage() suspending function. This addition to source-api is only intended for app use, so it will not be added to the extensions-api stubs. (cherry picked from commit b4b3a4d2869fae7839b4b3111e289056e33cfea8) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt --- .../tachiyomi/ui/reader/loader/HttpPageLoader.kt | 4 ++-- app/src/main/java/exh/util/DataSaver.kt | 10 ++++++++++ .../eu/kanade/tachiyomi/source/online/HttpSource.kt | 12 ++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt index 1746f67c6..aea2a3bb7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt @@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.withIOContext import exh.source.isEhBasedSource import exh.util.DataSaver -import exh.util.DataSaver.Companion.fetchImage +import exh.util.DataSaver.Companion.getImage import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -241,7 +241,7 @@ class HttpPageLoader( if (!chapterCache.isImageInCache(imageUrl)) { page.status = Page.State.DOWNLOAD_IMAGE - val imageResponse = source.fetchImage(page, dataSaver).awaitSingle() + val imageResponse = source.getImage(page, dataSaver) chapterCache.putImageToCache(imageUrl, imageResponse) } diff --git a/app/src/main/java/exh/util/DataSaver.kt b/app/src/main/java/exh/util/DataSaver.kt index 7f5ea6295..54ad83dc9 100644 --- a/app/src/main/java/exh/util/DataSaver.kt +++ b/app/src/main/java/exh/util/DataSaver.kt @@ -27,6 +27,16 @@ interface DataSaver { page.imageUrl = imageUrl } } + + suspend fun HttpSource.getImage(page: Page, dataSaver: DataSaver): Response { + val imageUrl = page.imageUrl ?: return getImage(page) + page.imageUrl = dataSaver.compress(imageUrl) + return try { + getImage(page) + } finally { + page.imageUrl = imageUrl + } + } } } diff --git a/source-api/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt b/source-api/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt index 1520951f0..b26d19211 100755 --- a/source-api/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt +++ b/source-api/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt @@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.network.AndroidCookieJar import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.network.newCachelessCallWithProgress import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.model.FilterList @@ -337,6 +338,17 @@ abstract class HttpSource : CatalogueSource { .asObservableSuccess() } + /** + * Returns the response of the source image. + * + * @param page the page whose source image has to be downloaded. + */ + suspend fun getImage(page: Page): Response { + // images will be cached or saved manually, so don't take up network cache + return client.newCachelessCallWithProgress(imageRequest(page), page) + .awaitSuccess() + } + /** * Returns the request for getting the source image. Override only if it's needed to override * the url, send different headers or request method like POST.