From 0f5d0a42a3d12c53e81b2c99630acb4524626b6b Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 7 Oct 2024 17:09:12 +0200 Subject: [PATCH] #1203 keep full file to fetch metadata from large PNG --- .../thibault/aves/metadata/Metadata.kt | 51 ++++++++++++------- .../deckers/thibault/aves/utils/MimeTypes.kt | 4 +- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt index d97314915..f2070c4f3 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/Metadata.kt @@ -2,8 +2,9 @@ package deckers.thibault.aves.metadata import android.content.Context import android.net.Uri -import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface +import android.util.Log import deckers.thibault.aves.utils.FileUtils.transferFrom +import deckers.thibault.aves.utils.LogUtils import deckers.thibault.aves.utils.MimeTypes import deckers.thibault.aves.utils.StorageUtils import java.io.File @@ -14,8 +15,11 @@ import java.util.Date import java.util.Locale import java.util.TimeZone import java.util.regex.Pattern +import androidx.exifinterface.media.ExifInterfaceFork as ExifInterface object Metadata { + private val LOG_TAG = LogUtils.createTag() + const val IPTC_MARKER_BYTE: Byte = 0x1c // Pattern to extract latitude & longitude from a video location tag (cf ISO 6709) @@ -135,29 +139,42 @@ object Metadata { private fun getSafeUri(context: Context, uri: Uri, mimeType: String, sizeBytes: Long?): Uri { // formats known to yield OOM for large files - return if ((MimeTypes.isImage(mimeType) || mimeType == MimeTypes.MP4)) { - if (isDangerouslyLarge(sizeBytes)) { - // make a preview from the beginning of the file, - // hoping the metadata is accessible in the copied chunk - var previewFile = previewFiles[uri] - if (previewFile == null) { - previewFile = createPreviewFile(context, uri) - previewFiles[uri] = previewFile + return when (mimeType) { + // formats known to yield OOM for large files + MimeTypes.DNG, + MimeTypes.DNG_ADOBE, + MimeTypes.HEIC, + MimeTypes.HEIF, + MimeTypes.MP4, + MimeTypes.PSD_VND, + MimeTypes.PSD_X, + MimeTypes.TIFF -> + if (isDangerouslyLarge(sizeBytes)) { + Log.d(LOG_TAG, "Dangerously large file with uri=$uri, mimeType=$mimeType, size=$sizeBytes") + // make a preview from the beginning of the file, + // hoping the metadata is accessible in the copied chunk + var previewFile = previewFiles[uri] + if (previewFile == null) { + previewFile = createPreviewFile(context, uri) + previewFiles[uri] = previewFile + } + Uri.fromFile(previewFile) + } else { + // small enough to be safe as it is + uri } - Uri.fromFile(previewFile) - } else { - // small enough to be safe as it is + + else -> + // *probably* safe uri - } - } else { - // *probably* safe - uri } } fun createPreviewFile(context: Context, uri: Uri): File { + val size = PREVIEW_SIZE + Log.d(LOG_TAG, "create preview of size=$size for uri=$uri") return StorageUtils.createTempFile(context).apply { - transferFrom(StorageUtils.openInputStream(context, uri), PREVIEW_SIZE) + transferFrom(StorageUtils.openInputStream(context, uri), size) } } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt index c240a5df2..e024acd72 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt @@ -17,8 +17,8 @@ object MimeTypes { private const val ICO = "image/x-icon" const val JPEG = "image/jpeg" const val PNG = "image/png" - private const val PSD_VND = "image/vnd.adobe.photoshop" - private const val PSD_X = "image/x-photoshop" + const val PSD_VND = "image/vnd.adobe.photoshop" + const val PSD_X = "image/x-photoshop" const val TIFF = "image/tiff" private const val WBMP = "image/vnd.wap.wbmp" const val WEBP = "image/webp"