Fix download error retry

pull/149/head
Koitharu 4 years ago
parent 8fc9b27840
commit 5b5e6cba57
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -6,14 +6,14 @@ plugins {
} }
android { android {
compileSdkVersion 31 compileSdkVersion 32
buildToolsVersion '31.0.0' buildToolsVersion '32.0.0'
namespace 'org.koitharu.kotatsu' namespace 'org.koitharu.kotatsu'
defaultConfig { defaultConfig {
applicationId 'org.koitharu.kotatsu' applicationId 'org.koitharu.kotatsu'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 31 targetSdkVersion 32
versionCode 402 versionCode 402
versionName '3.1.1' versionName '3.1.1'
generatedDensities = [] generatedDensities = []

@ -119,7 +119,8 @@ class DownloadManager(
for ((chapterIndex, chapter) in chapters.withIndex()) { for ((chapterIndex, chapter) in chapters.withIndex()) {
val pages = repo.getPages(chapter) val pages = repo.getPages(chapter)
for ((pageIndex, page) in pages.withIndex()) { for ((pageIndex, page) in pages.withIndex()) {
failsafe@ do { var retryCounter = 0
failsafe@ while (true) {
try { try {
val url = repo.getPageUrl(page) val url = repo.getPageUrl(page)
val file = cache[url] ?: downloadFile(url, page.referer, destination, tempFileName) val file = cache[url] ?: downloadFile(url, page.referer, destination, tempFileName)
@ -129,12 +130,18 @@ class DownloadManager(
pageNumber = pageIndex, pageNumber = pageIndex,
ext = MimeTypeMap.getFileExtensionFromUrl(url), ext = MimeTypeMap.getFileExtensionFromUrl(url),
) )
break@failsafe
} catch (e: IOException) { } catch (e: IOException) {
outState.value = DownloadState.WaitingForNetwork(startId, data, cover) if (retryCounter < MAX_DOWNLOAD_ATTEMPTS) {
connectivityManager.waitForNetwork() outState.value = DownloadState.WaitingForNetwork(startId, data, cover)
continue@failsafe delay(DOWNLOAD_ERROR_DELAY)
connectivityManager.waitForNetwork()
retryCounter++
} else {
throw e
}
} }
} while (false) }
outState.value = DownloadState.Progress( outState.value = DownloadState.Progress(
startId, data, cover, startId, data, cover,
@ -180,26 +187,14 @@ class DownloadManager(
.get() .get()
.build() .build()
val call = okHttp.newCall(request) val call = okHttp.newCall(request)
var attempts = MAX_DOWNLOAD_ATTEMPTS
val file = File(destination, tempFileName) val file = File(destination, tempFileName)
while (true) { val response = call.clone().await()
try { runInterruptible(Dispatchers.IO) {
val response = call.clone().await() file.outputStream().use { out ->
runInterruptible(Dispatchers.IO) { checkNotNull(response.body).byteStream().copyTo(out)
file.outputStream().use { out ->
checkNotNull(response.body).byteStream().copyTo(out)
}
}
return file
} catch (e: IOException) {
attempts--
if (attempts <= 0) {
throw e
} else {
delay(DOWNLOAD_ERROR_DELAY)
}
} }
} }
return file
} }
private fun errorStateHandler(outState: MutableStateFlow<DownloadState>) = private fun errorStateHandler(outState: MutableStateFlow<DownloadState>) =

@ -5,6 +5,7 @@ import android.net.ConnectivityManager
import android.net.Network import android.net.Network
import android.net.NetworkRequest import android.net.NetworkRequest
import android.net.Uri import android.net.Uri
import android.os.Build
import androidx.work.CoroutineWorker import androidx.work.CoroutineWorker
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
@ -14,6 +15,10 @@ val Context.connectivityManager: ConnectivityManager
suspend fun ConnectivityManager.waitForNetwork(): Network { suspend fun ConnectivityManager.waitForNetwork(): Network {
val request = NetworkRequest.Builder().build() val request = NetworkRequest.Builder().build()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// fast path
activeNetwork?.let { return it }
}
return suspendCancellableCoroutine { cont -> return suspendCancellableCoroutine { cont ->
val callback = object : ConnectivityManager.NetworkCallback() { val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) { override fun onAvailable(network: Network) {

Loading…
Cancel
Save