From 30c4fa7e16f1c61c9f1490042f60be4af7e46314 Mon Sep 17 00:00:00 2001 From: advplyr Date: Sun, 6 Sep 2026 18:11:49 -0500 Subject: [PATCH] Add try catch around scan download item --- .../app/managers/DownloadItemManager.kt | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/android/app/src/main/java/com/audiobookshelf/app/managers/DownloadItemManager.kt b/android/app/src/main/java/com/audiobookshelf/app/managers/DownloadItemManager.kt index 329c46e2..7a25ddde 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/managers/DownloadItemManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/managers/DownloadItemManager.kt @@ -563,28 +563,36 @@ class DownloadItemManager( if (!item.isDownloadFinished || !finalizingItems.add(item.id)) return IncompleteDownloadCleanup.cancel(context, item.id) scope.launch { - val scanLock = scanLocks.computeIfAbsent(scanDestinationKey(item)) { Any() } - synchronized(scanLock) { - folderScanner.scanDownloadItem(item) { scanResult -> - val event = - JSObject().apply { - put("libraryItemId", item.id) - put("localFolderId", item.localFolder.id) - scanResult?.localLibraryItem?.let { - put("localLibraryItem", JSObject(jacksonMapper.writeValueAsString(it))) + try { + val scanLock = scanLocks.computeIfAbsent(scanDestinationKey(item)) { Any() } + synchronized(scanLock) { + folderScanner.scanDownloadItem(item) { scanResult -> + val event = + JSObject().apply { + put("libraryItemId", item.id) + put("localFolderId", item.localFolder.id) + scanResult?.localLibraryItem?.let { + put("localLibraryItem", JSObject(jacksonMapper.writeValueAsString(it))) + } + scanResult?.localMediaProgress?.let { + put("localMediaProgress", JSObject(jacksonMapper.writeValueAsString(it))) + } } - scanResult?.localMediaProgress?.let { - put("localMediaProgress", JSObject(jacksonMapper.writeValueAsString(it))) - } - } - clientEventEmitter.onDownloadItemComplete(event) - synchronized(this@DownloadItemManager) { - finalizingItems.remove(item.id) - downloadItemQueue.remove(item) - DeviceManager.dbManager.removeDownloadItem(item.id) - notifyQueueChanged() + clientEventEmitter.onDownloadItemComplete(event) + synchronized(this@DownloadItemManager) { + downloadItemQueue.remove(item) + DeviceManager.dbManager.removeDownloadItem(item.id) + } } } + } catch (e: Exception) { + // The files are already in place, so leave the item queued for restoreQueue to rescan. + AbsLogger.error(tag, "Could not finalize download item ${item.id}: ${e.message}") + } finally { + synchronized(this@DownloadItemManager) { + finalizingItems.remove(item.id) + notifyQueueChanged() + } } } }