using System; using System.Collections.Generic; using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; using StabilityMatrix.Avalonia.Controls; using StabilityMatrix.Avalonia.Models; using StabilityMatrix.Avalonia.Models.Inference; using StabilityMatrix.Avalonia.ViewModels.Base; using StabilityMatrix.Core.Attributes; using StabilityMatrix.Core.Models; using StabilityMatrix.Core.Models.Api.Comfy.Nodes; namespace StabilityMatrix.Avalonia.ViewModels.Inference.Video; [View(typeof(VideoOutputSettingsCard))] [ManagedService] [Transient] public partial class VideoOutputSettingsCardViewModel : LoadableViewModelBase, IParametersLoadableState, IComfyStep { [ObservableProperty] private double fps = 6; [ObservableProperty] private bool lossless = true; [ObservableProperty] private int quality = 85; [ObservableProperty] private VideoOutputMethod selectedMethod = VideoOutputMethod.Default; [ObservableProperty] private List availableMethods = Enum.GetValues().ToList(); public void LoadStateFromParameters(GenerationParameters parameters) { Fps = parameters.OutputFps; Lossless = parameters.Lossless; Quality = parameters.VideoQuality; if (string.IsNullOrWhiteSpace(parameters.VideoOutputMethod)) return; SelectedMethod = Enum.TryParse(parameters.VideoOutputMethod, true, out var method) ? method : VideoOutputMethod.Default; } public GenerationParameters SaveStateToParameters(GenerationParameters parameters) { return parameters with { OutputFps = Fps, Lossless = Lossless, VideoQuality = Quality, VideoOutputMethod = SelectedMethod.ToString(), }; } public void ApplyStep(ModuleApplyStepEventArgs e) { if (e.Builder.Connections.Primary is null) throw new ArgumentException("No Primary"); var image = e.Builder.Connections.Primary.Match( _ => e.Builder.GetPrimaryAsImage( e.Builder.Connections.PrimaryVAE ?? e.Builder.Connections.Refiner.VAE ?? e.Builder.Connections.Base.VAE ?? throw new ArgumentException("No Primary, Refiner, or Base VAE") ), image => image ); var outputStep = e.Nodes.AddTypedNode( new ComfyNodeBuilder.SaveAnimatedWEBP { Name = e.Nodes.GetUniqueName("SaveAnimatedWEBP"), Images = image, FilenamePrefix = "InferenceVideo", Fps = Fps, Lossless = Lossless, Quality = Quality, Method = SelectedMethod.ToString().ToLowerInvariant() } ); e.Builder.Connections.OutputNodes.Add(outputStep); } }