using AIStudio.Chat; using AIStudio.Dialogs; using AIStudio.Tools.Media; using DialogOptions = AIStudio.Dialogs.DialogOptions; namespace AIStudio.Assistants.VisualBriefing; public partial class VisualBriefingAssistant { /// /// Defines CurrentMediaOwner for the visual briefing feature. /// private MediaImportOwner CurrentMediaOwner => this.selectedBriefing is null ? new(MediaImportOwnerKind.VISUAL_BRIEFING, Guid.Empty.ToString("D")) : MediaImportOwner.ForVisualBriefing(this.selectedBriefing.BriefingId); /// /// Defines SourceMaterialChangedAsync for the visual briefing feature. /// private async Task SourceMaterialChangedAsync(HashSet _) { var visualPaths = this.visualAssets.Select(attachment => attachment.FilePath).ToHashSet(PathComparer()); this.sourceMaterial.RemoveWhere(attachment => visualPaths.Contains(attachment.FilePath)); await this.SaveCurrentAsync(reload: true); } /// /// Defines VisualAssetsChangedAsync for the visual briefing feature. /// private async Task VisualAssetsChangedAsync(HashSet _) { var visualPaths = this.visualAssets.Select(attachment => attachment.FilePath).ToHashSet(PathComparer()); this.sourceMaterial.RemoveWhere(attachment => visualPaths.Contains(attachment.FilePath)); await this.SaveCurrentAsync(reload: true); } /// /// Defines RefreshSourceStatusAsync for the visual briefing feature. /// private async Task RefreshSourceStatusAsync() { if (this.selectedBriefing is null) return; var latest = await this.Store.LoadAsync(this.selectedBriefing.BriefingId); if (latest is null) return; this.selectedBriefing.Sources = latest.Sources; this.StateHasChanged(); } /// /// Defines MonitorSourceStatusAsync for the visual briefing feature. /// private async Task MonitorSourceStatusAsync(CancellationToken token) { using var timer = new PeriodicTimer(TimeSpan.FromSeconds(5)); try { while (await timer.WaitForNextTickAsync(token)) if (this.selectedBriefing is not null && !this.IsCurrentBusy) await this.InvokeAsync(this.RefreshSourceStatusAsync); } catch (OperationCanceledException) when (token.IsCancellationRequested) { } } /// /// Defines RelinkAsync for the visual briefing feature. /// private async Task RelinkAsync(VisualBriefingSource source) { if (this.selectedBriefing is null) return; var response = await this.RustService.SelectFile(T("Relink briefing source"), initialFile: source.Path); if (response.UserCancelled) return; await this.Store.RelinkSourceAsync(this.selectedBriefing.BriefingId, source.SourceId, response.SelectedFilePath); await this.ReloadListAsync(this.selectedBriefing.BriefingId); } /// /// Defines RemoveSourceAsync for the visual briefing feature. /// private async Task RemoveSourceAsync(VisualBriefingSource source) { if (this.selectedBriefing is null) return; await this.Store.RemoveSourceAsync(this.selectedBriefing.BriefingId, source.SourceId); await this.ReloadListAsync(this.selectedBriefing.BriefingId); } /// /// Defines RetranscribeAsync for the visual briefing feature. /// private async Task RetranscribeAsync(VisualBriefingSource source) { if (this.selectedBriefing is null || !source.IsMedia || !File.Exists(source.Path)) return; var parameters = new DialogParameters { { dialog => dialog.Message, T("The media file changed. Transcribe it again with the configured transcription provider?") }, }; var reference = await this.DialogService.ShowAsync(T("Transcribe media again"), parameters, DialogOptions.FULLSCREEN); var result = await reference.Result; if (result is null || result.Canceled) return; this.MediaTranscriptionService.TryStartAttachmentBatch( [source.Path], new(this.CurrentMediaOwner, source.SourceId.ToString("D"))); } /// /// Defines MediaStateChanged for the visual briefing feature. /// private void MediaStateChanged(MediaImportOwner owner) { if (owner.Kind is not MediaImportOwnerKind.VISUAL_BRIEFING || !Guid.TryParse(owner.Id, out var briefingId)) return; _ = this.InvokeAsync(async () => { if (!this.MediaTranscriptionService.IsBusy(owner)) { var latest = await this.Store.LoadAsync(briefingId); if (latest is not null) { this.UpdateProject(latest); if (this.selectedBriefing?.BriefingId == briefingId) await this.ApplySelectedBriefingAsync(latest); } } this.StateHasChanged(); }); } /// /// Defines SourceStatusName for the visual briefing feature. /// private string SourceStatusName(VisualBriefingSourceStatus status) => status switch { VisualBriefingSourceStatus.UNCHANGED => T("unchanged"), VisualBriefingSourceStatus.CHANGED => T("changed"), VisualBriefingSourceStatus.TRANSCRIPT_OUTDATED => T("transcript outdated"), VisualBriefingSourceStatus.UNREACHABLE => T("unreachable"), _ => status.ToString(), }; /// /// Defines SourceStatusColor for the visual briefing feature. /// private static Color SourceStatusColor(VisualBriefingSourceStatus status) => status switch { VisualBriefingSourceStatus.UNCHANGED => Color.Success, VisualBriefingSourceStatus.CHANGED => Color.Warning, VisualBriefingSourceStatus.TRANSCRIPT_OUTDATED => Color.Warning, VisualBriefingSourceStatus.UNREACHABLE => Color.Error, _ => Color.Default, }; }