diff --git a/app/src/main/java/io/legado/app/help/exoplayer/InputStreamDataSource.kt b/app/src/main/java/io/legado/app/help/exoplayer/InputStreamDataSource.kt index e77fd10c8..cc44828b0 100644 --- a/app/src/main/java/io/legado/app/help/exoplayer/InputStreamDataSource.kt +++ b/app/src/main/java/io/legado/app/help/exoplayer/InputStreamDataSource.kt @@ -27,12 +27,7 @@ class InputStreamDataSource(private val supplier: () -> InputStream) : BaseDataS inputStream.skip(dataSpec.position) - if (dataSpec.length == C.LENGTH_UNSET.toLong()) { - bytesRemaining = inputStream.available().toLong() - if (bytesRemaining == 0L) bytesRemaining = C.LENGTH_UNSET.toLong() - } else { - bytesRemaining = dataSpec.length - } + bytesRemaining = dataSpec.length opened = true transferStarted(dataSpec) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index fe0800cbd..79a9aee7e 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -550,6 +550,7 @@ class HttpReadAloudService : BaseReadAloudService(), override fun onPlayerError(error: PlaybackException) { super.onPlayerError(error) AppLog.put("朗读错误\n${contentList[nowSpeak]}", error) + deleteCurrentSpeakFile() playErrorNo++ if (playErrorNo >= 5) { toastOnUi("朗读连续5次错误, 最后一次错误代码(${error.localizedMessage})") @@ -558,7 +559,6 @@ class HttpReadAloudService : BaseReadAloudService(), } else { if (exoPlayer.hasNextMediaItem()) { exoPlayer.seekToNextMediaItem() - exoPlayer.playWhenReady = true exoPlayer.prepare() } else { exoPlayer.clearMediaItems() @@ -567,6 +567,15 @@ class HttpReadAloudService : BaseReadAloudService(), } } + private fun deleteCurrentSpeakFile() { + if (AppConfig.streamReadAloudAudio) { + return + } + val mediaItem = exoPlayer.currentMediaItem ?: return + val filePath = mediaItem.localConfiguration!!.uri.path!! + File(filePath).delete() + } + override fun aloudServicePendingIntent(actionStr: String): PendingIntent? { return servicePendingIntent(actionStr) } diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt index 18b773080..11ceaa66e 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt @@ -253,7 +253,6 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_ delay(500) } } - } lifecycleScope.launch { diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt index 85eb5dd27..d3f778f6d 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt @@ -25,6 +25,7 @@ import io.legado.app.help.config.SourceConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.webBook.WebBook import io.legado.app.utils.internString +import io.legado.app.utils.mapParallel import io.legado.app.utils.mapParallelSafe import io.legado.app.utils.onEachIndexed import io.legado.app.utils.toastOnUi @@ -35,6 +36,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -231,11 +233,13 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a } }.onStart { searchStateData.postValue(true) - }.mapParallelSafe(threadCount) { - runCatching { + }.mapParallel(threadCount) { + try { withTimeout(60000L) { search(it) } + } catch (_: Throwable) { + currentCoroutineContext().ensureActive() } it }.onEachIndexed { index, value -> diff --git a/app/src/main/java/io/legado/app/utils/FlowExtensions.kt b/app/src/main/java/io/legado/app/utils/FlowExtensions.kt index d2ce0d674..2195f570f 100644 --- a/app/src/main/java/io/legado/app/utils/FlowExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FlowExtensions.kt @@ -64,7 +64,7 @@ inline fun Flow.mapParallelSafe( flow { try { emit(transform(value)) - } catch (e: Throwable) { + } catch (_: Throwable) { coroutineContext.ensureActive() } } diff --git a/app/src/main/java/io/legado/app/utils/UrlUtil.kt b/app/src/main/java/io/legado/app/utils/UrlUtil.kt index 8cad7a6e6..eb5425cb2 100644 --- a/app/src/main/java/io/legado/app/utils/UrlUtil.kt +++ b/app/src/main/java/io/legado/app/utils/UrlUtil.kt @@ -159,7 +159,9 @@ object UrlUtil { .substringAfterLast(".", "") //检查截取的后缀字符是否合法 [a-zA-Z0-9] return if (suffix.length > 5 || !suffix.matches(fileSuffixRegex)) { - AppLog.put("Cannot find legal suffix:\n target: $str\n suffix: $suffix") + if (default == null) { + AppLog.put("Cannot find legal suffix:\n target: $str\n suffix: $suffix") + } default ?: "ext" } else { suffix