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
This commit is contained in:
parent
a0497d079d
commit
acc3e16230
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user