Added reporting of failed and canceled media transcriptions to the visual briefing

This commit is contained in:
Thorsten Sommer 2026-08-02 21:00:04 +02:00
parent 148f3a60fa
commit 0c3807f485
Signed by untrusted user who does not match committer: tsommer
GPG Key ID: 371BBA77A02C0108
5 changed files with 66 additions and 3 deletions

View File

@ -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}"

View File

@ -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")));
}
/// <summary>
@ -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
});
}
/// <summary>
/// Reports media imports that finished while this page was not open.
/// </summary>
/// <remarks>
/// 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.
/// </remarks>
private async Task ConsumePendingMediaOutcomesAsync()
{
foreach (var project in this.projects)
await this.ConsumeMediaOutcomeAsync(MediaImportOwner.ForVisualBriefing(project.BriefingId));
}
/// <summary>
/// Reports how a media import of one briefing ended, and clears it from the shared import lane.
/// </summary>
/// <remarks>
/// 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.
/// </remarks>
/// <param name="owner">The briefing whose media import finished.</param>
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.")));
}
/// <summary>
/// Defines <c>SourceStatusName</c> for the visual briefing feature.
/// </summary>

View File

@ -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<string>(Event.SEND_TO_VISUAL_BRIEFING_ASSISTANT).FirstOrDefault();

View File

@ -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}"

View File

@ -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}"