From 1b36fbaebac9ffb6c713a1ae062f1c505ad5ad72 Mon Sep 17 00:00:00 2001 From: nobswebdev Date: Tue, 3 Nov 2026 19:10:44 +0100 Subject: [PATCH] Show ExifTool errors in metadata UI with short queue labels. Store detailMessage from worker failures; inspector shows full text, queue keeps fixed summary messages. --- .../components/upload/MetadataInspector.vue | 6 ++-- frontend/src/stores/metadata.ts | 28 +++++++++++++------ .../src/types/metadata/MetadataPreview.ts | 2 +- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/upload/MetadataInspector.vue b/frontend/src/components/upload/MetadataInspector.vue index 7cf160e..d2ce3b9 100644 --- a/frontend/src/components/upload/MetadataInspector.vue +++ b/frontend/src/components/upload/MetadataInspector.vue @@ -10,7 +10,7 @@

Select an image to view its metadata.

{{ entry.message }}

@@ -83,7 +83,7 @@ const tabBody = computed((): MetadataTabBody | null => { } if (entry.status === 'error') { - return { kind: 'error', text: entry.message }; + return { kind: 'error', text: entry.detailMessage ?? entry.message }; } return null; diff --git a/frontend/src/stores/metadata.ts b/frontend/src/stores/metadata.ts index a7bba8b..3f156e8 100644 --- a/frontend/src/stores/metadata.ts +++ b/frontend/src/stores/metadata.ts @@ -3,6 +3,7 @@ import { ref } from 'vue'; import { useExiftoolStore } from '@/stores/exiftool'; import type { MetadataPreviewEntry } from '@/types/metadata/MetadataPreview'; import { makeKeyFromFile } from '@/utils/file/makeKeyFromFile'; +import { resolveErrorMessage } from '@/utils/resolveErrorMessage'; const METADATA_IDLE_MESSAGE = 'Waiting to load metadata...'; const EXIFTOOL_INITIALIZING_MESSAGE = 'Downloading ExifTool…'; @@ -17,11 +18,6 @@ const METADATA_IDLE_PREVIEW: MetadataPreviewEntry = { message: METADATA_IDLE_MESSAGE }; -const METADATA_LOAD_ERROR_PREVIEW: MetadataPreviewEntry = { - status: 'error', - message: METADATA_LOAD_ERROR_MESSAGE -}; - const EXIFTOOL_PREPARE_ERROR_PREVIEW: MetadataPreviewEntry = { status: 'error', message: EXIFTOOL_PREPARE_ERROR_MESSAGE @@ -96,9 +92,15 @@ export const useMetadataStore = defineStore('metadata', () => { } catch (error) { console.error('[metadata] read failed', { file: file.name, error }); - setPreviewEntry(key, METADATA_LOAD_ERROR_PREVIEW); + const entry: MetadataPreviewEntry = { + status: 'error', + message: METADATA_LOAD_ERROR_MESSAGE, + detailMessage: resolveErrorMessage(error, METADATA_LOAD_ERROR_MESSAGE) + }; - return METADATA_LOAD_ERROR_PREVIEW; + setPreviewEntry(key, entry); + + return entry; } let strippedBlob: Blob; @@ -116,6 +118,7 @@ export const useMetadataStore = defineStore('metadata', () => { const entry: MetadataPreviewEntry = { status: 'error', message: METADATA_STRIP_ERROR_MESSAGE, + detailMessage: resolveErrorMessage(error, METADATA_STRIP_ERROR_MESSAGE), output }; @@ -136,9 +139,16 @@ export const useMetadataStore = defineStore('metadata', () => { } catch (error) { console.error('[metadata] read after strip failed', { file: file.name, error }); - setPreviewEntry(key, METADATA_LOAD_ERROR_PREVIEW); + const entry: MetadataPreviewEntry = { + status: 'error', + message: METADATA_LOAD_ERROR_MESSAGE, + detailMessage: resolveErrorMessage(error, METADATA_LOAD_ERROR_MESSAGE), + output + }; - return METADATA_LOAD_ERROR_PREVIEW; + setPreviewEntry(key, entry); + + return entry; } setStrippedBlob(key, strippedBlob); diff --git a/frontend/src/types/metadata/MetadataPreview.ts b/frontend/src/types/metadata/MetadataPreview.ts index c29be71..1e1bba8 100644 --- a/frontend/src/types/metadata/MetadataPreview.ts +++ b/frontend/src/types/metadata/MetadataPreview.ts @@ -3,4 +3,4 @@ export type MetadataPreviewEntry = | { status: 'initializing'; message: string } | { status: 'processing'; message: string } | { status: 'ready'; message: string; output: string; afterStripOutput: string } - | { status: 'error'; message: string; output?: string }; + | { status: 'error'; message: string; output?: string; detailMessage?: string };