Fix delay between URL fetch and image download (#9452)
Fetch each source image URL immediately before downloading each image instead of fetching all URLs and then downloading all images. Source image URLs may change, so the downloader may fail if there is too long a delay between fetching the image URL and downloading the image.
This commit is contained in:
parent
cb2d43c0d1
commit
bbe0ab1dd0
1 changed files with 10 additions and 10 deletions
|
@ -338,8 +338,13 @@ class Downloader(
|
||||||
|
|
||||||
download.status = Download.State.DOWNLOADING
|
download.status = Download.State.DOWNLOADING
|
||||||
|
|
||||||
// Get all the URLs to the source images, fetch pages if necessary
|
// Start downloading images, consider we can have downloaded images already
|
||||||
pageList.filter { it.imageUrl.isNullOrEmpty() }.forEach { page ->
|
// Concurrently do 2 pages at a time
|
||||||
|
pageList.asFlow()
|
||||||
|
.flatMapMerge(concurrency = 2) { page ->
|
||||||
|
flow {
|
||||||
|
// Fetch image URL if necessary
|
||||||
|
if (page.imageUrl.isNullOrEmpty()) {
|
||||||
page.status = Page.State.LOAD_PAGE
|
page.status = Page.State.LOAD_PAGE
|
||||||
try {
|
try {
|
||||||
page.imageUrl = download.source.fetchImageUrl(page).awaitSingle()
|
page.imageUrl = download.source.fetchImageUrl(page).awaitSingle()
|
||||||
|
@ -348,11 +353,6 @@ class Downloader(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start downloading images, consider we can have downloaded images already
|
|
||||||
// Concurrently do 2 pages at a time
|
|
||||||
pageList.asFlow()
|
|
||||||
.flatMapMerge(concurrency = 2) { page ->
|
|
||||||
flow {
|
|
||||||
withIOContext { getOrDownloadImage(page, download, tmpDir) }
|
withIOContext { getOrDownloadImage(page, download, tmpDir) }
|
||||||
emit(page)
|
emit(page)
|
||||||
}.flowOn(Dispatchers.IO)
|
}.flowOn(Dispatchers.IO)
|
||||||
|
|
Reference in a new issue