From 0c3807f4850d6a194be5f8bf5b93cbd9ee1e7e2c Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sun, 2 Aug 2026 21:00:04 +0200 Subject: [PATCH] Added reporting of failed and canceled media transcriptions to the visual briefing --- .../Assistants/I18N/allTexts.lua | 6 +++ .../VisualBriefingAssistant.razor.Sources.cs | 50 +++++++++++++++++-- .../VisualBriefingAssistant.razor.cs | 1 + .../plugin.lua | 6 +++ .../plugin.lua | 6 +++ 5 files changed, 66 insertions(+), 3 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index ba4ce53d..ac79154d 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -2317,6 +2317,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT:: -- Delete UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1469573738"] = "Delete" +-- The media file could not be transcribed. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1543974632"] = "The media file could not be transcribed." + -- Version UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1573770551"] = "Version" @@ -2362,6 +2365,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT:: -- Target language UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T237828418"] = "Target language" +-- The media transcription was canceled. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T241403726"] = "The media transcription was canceled." + -- Could not open the visual briefing project folder: {0} UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2493826535"] = "Could not open the visual briefing project folder: {0}" diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Sources.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Sources.cs index 0c9f7ae9..5db37296 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Sources.cs +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.Sources.cs @@ -124,9 +124,7 @@ public partial class VisualBriefingAssistant if (result is null || result.Canceled) return; - this.MediaTranscriptionService.TryStartAttachmentBatch( - [source.Path], - new(this.CurrentMediaOwner, source.SourceId.ToString("D"))); + this.MediaTranscriptionService.TryStartAttachmentBatch([source.Path], new(this.CurrentMediaOwner, source.SourceId.ToString("D"))); } /// @@ -140,6 +138,7 @@ public partial class VisualBriefingAssistant _ = this.InvokeAsync(async () => { + await this.ConsumeMediaOutcomeAsync(owner); if (!this.MediaTranscriptionService.IsBusy(owner)) { var latest = await this.Store.LoadAsync(briefingId); @@ -156,6 +155,51 @@ public partial class VisualBriefingAssistant }); } + /// + /// Reports media imports that finished while this page was not open. + /// + /// + /// The transcription service outlives this page, so an import that ends after the user navigated + /// away raises its state change with nobody listening. Its outcome then waits in the import lane + /// until somebody consumes it, which without this would only happen once that same briefing starts + /// another import. + /// + private async Task ConsumePendingMediaOutcomesAsync() + { + foreach (var project in this.projects) + await this.ConsumeMediaOutcomeAsync(MediaImportOwner.ForVisualBriefing(project.BriefingId)); + } + + /// + /// Reports how a media import of one briefing ended, and clears it from the shared import lane. + /// + /// + /// Without this, a failed or canceled transcription stays silent: the source is simply marked as + /// outdated and the user is left to guess why. The outcome would also never leave the import lane, + /// because consuming it is what removes it. Every assistant built on the assistant base does the + /// same for its own single owner; here it happens per briefing, so an import that finishes while a + /// different briefing is open still gets reported. + /// + /// The briefing whose media import finished. + private async Task ConsumeMediaOutcomeAsync(MediaImportOwner owner) + { + var outcome = this.MediaTranscriptionService.TryConsumeOutcome(owner); + if (outcome is null) + return; + + if (outcome.Failures.Count > 0) + await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, string.Join(Environment.NewLine, outcome.Failures.Select(failure => $"{failure.FileName}: {failure.UserMessage}")))); + + else if (outcome.Status is MediaImportStatus.FAILED) + await this.MessageBus.SendError(new(Icons.Material.Filled.VoiceChat, T("The media file could not be transcribed."))); + + if (outcome.Warnings.Count > 0) + await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, string.Join(Environment.NewLine, outcome.Warnings.Select(warning => $"{warning.FileName}: {warning.UserMessage}")))); + + if (outcome.Status is MediaImportStatus.CANCELLED) + await this.MessageBus.SendWarning(new(Icons.Material.Filled.VoiceChat, T("The media transcription was canceled."))); + } + /// /// Defines SourceStatusName for the visual briefing feature. /// diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.cs b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.cs index 3bb4759b..5b478fcc 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.cs +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.cs @@ -153,6 +153,7 @@ public partial class VisualBriefingAssistant : MSGComponentBase this.MediaTranscriptionService.StateChanged += this.MediaStateChanged; this.BuildProgressService.Changed += this.BuildProgressChanged; await this.ReloadListAsync(); + await this.ConsumePendingMediaOutcomesAsync(); _ = this.MonitorSourceStatusAsync(this.sourceMonitorCancellation.Token); var deferredInstruction = this.MessageBus.CheckDeferredMessages(Event.SEND_TO_VISUAL_BRIEFING_ASSISTANT).FirstOrDefault(); diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua index 53b1f26e..6b7ac41e 100644 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -2319,6 +2319,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT:: -- Delete UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1469573738"] = "Löschen" +-- The media file could not be transcribed. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1543974632"] = "Die Mediendatei konnte nicht transkribiert werden." + -- Version UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1573770551"] = "Version" @@ -2364,6 +2367,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT:: -- Target language UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T237828418"] = "Zielsprache" +-- The media transcription was canceled. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T241403726"] = "Die Medientranskription wurde abgebrochen." + -- Could not open the visual briefing project folder: {0} UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2493826535"] = "Der Projektordner für das visuelle Briefing konnte nicht geöffnet werden: {0}" diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua index b269603a..3f5ea600 100644 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -2319,6 +2319,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT:: -- Delete UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1469573738"] = "Delete" +-- The media file could not be transcribed. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1543974632"] = "The media file could not be transcribed." + -- Version UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1573770551"] = "Version" @@ -2364,6 +2367,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT:: -- Target language UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T237828418"] = "Target language" +-- The media transcription was canceled. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T241403726"] = "The media transcription was canceled." + -- Could not open the visual briefing project folder: {0} UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2493826535"] = "Could not open the visual briefing project folder: {0}"