From 7f0aabf368784a48a4358cc98fd5746a863122e3 Mon Sep 17 00:00:00 2001 From: Sonal Yadav Date: Fri, 22 Aug 2025 07:47:47 +0530 Subject: [PATCH] Guard getMedia finalize path from ids=M0 and make uploaded status save resilient on retry --- .../fr/free/nrw/commons/media/MediaClient.kt | 16 ++++++++++++++-- .../nrw/commons/upload/worker/UploadWorker.kt | 13 ++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaClient.kt b/app/src/main/java/fr/free/nrw/commons/media/MediaClient.kt index 3728a7202..f3789ded9 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaClient.kt @@ -207,13 +207,25 @@ class MediaClient if (pages.isEmpty()) { Single.just(emptyList()) } else { + // If any pageId is invalid (0 or negative), avoid fetching entities like M0 + // and convert using a blank entity to prevent wbgetentities no-such-entity errors. + if (pages.any { it.pageId() <= 0 }) { + Single.just( + pages.mapNotNull { page -> + page.imageInfo()?.let { imageInfo -> + mediaConverter.convert(page, Entities.Entity(), imageInfo) + } + }, + ) + } else { getEntities(pages.map { "$PAGE_ID_PREFIX${it.pageId()}" }) .map { pages .zip(it.entities().values) .mapNotNull { (page, entity) -> - page.imageInfo()?.let { - mediaConverter.convert(page, entity, it) + page.imageInfo()?.let { imageInfo -> + mediaConverter.convert(page, entity, imageInfo) + } } } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt b/app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt index 0bf54de2d..ad9fb0bd4 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/worker/UploadWorker.kt @@ -618,8 +618,16 @@ class UploadWorker( private fun saveIntoUploadedStatus(contribution: Contribution) { contribution.contentUri?.let { val imageSha1 = contribution.imageSHA1.toString() - val modifiedSha1 = fileUtilsWrapper.getSHA1(fileUtilsWrapper.getFileInputStream(contribution.localUri?.path)) + val modifiedSha1 = try { + fileUtilsWrapper.getSHA1( + fileUtilsWrapper.getFileInputStream(contribution.localUri?.path), + ) + } catch (e: Exception) { + Timber.w(e, "UploadedStatus: modified file missing/unreadable; falling back to original SHA1") + imageSha1 + } CoroutineScope(Dispatchers.IO).launch { + try { uploadedStatusDao.insertUploaded( UploadedStatus( imageSha1, @@ -628,6 +636,9 @@ class UploadWorker( true, ), ) + } catch (e: Exception) { + Timber.w(e, "UploadedStatus: insert failed; continuing") + } } } }