diff --git a/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioConvert.cs b/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioConvert.cs index dd1b197a..19480fde 100644 --- a/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioConvert.cs +++ b/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioConvert.cs @@ -180,8 +180,6 @@ public class FfmpegBuilderAudioConvert : TrackSelectorFlowElement "https://fileflows.com/docs/plugins/video-nodes/ffmpeg-builder/track-remover"; + /// + public override bool Obsolete => true; + /// + public override string ObsoleteMessage => "Has been replaced with `Track Remover`"; + + /// + public override string HelpUrl => "https://fileflows.com/docs/plugins/video-nodes/ffmpeg-builder/track-remover-obsolete"; + + /// public override string Icon => "fas fa-eraser"; + /// public override int Outputs => 2; diff --git a/VideoNodes/FfmpegBuilderNodes/TrackSelectorFlowElement.cs b/VideoNodes/FfmpegBuilderNodes/TrackSelectorFlowElement.cs index 3db7bcd2..7de87640 100644 --- a/VideoNodes/FfmpegBuilderNodes/TrackSelectorFlowElement.cs +++ b/VideoNodes/FfmpegBuilderNodes/TrackSelectorFlowElement.cs @@ -134,8 +134,9 @@ public abstract class TrackSelectorFlowElement : FfmpegBuilderNode where T : /// Tests if a stream matches the specified conditions /// /// the stream to check + /// the index of the stream in the model /// true if matches, otherwise false - protected bool StreamMatches(IVideoStream stream) + protected bool StreamMatches(IVideoStream stream, int? index = null) { foreach (var kv in TrackSelectionOptions) { @@ -182,8 +183,24 @@ public abstract class TrackSelectorFlowElement : FfmpegBuilderNode where T : Args?.Logger?.ILog($"Channels does not match '{stream}' = {kvValue}"); return false; } - break; + case "index": + { + if (index == null) + { + Args?.Logger?.ILog($"No index given for stream '{stream}'"); + return false; + } + + if (Args.MathHelper.IsTrue(kvValue, index.Value)) + Args?.Logger?.ILog($"Index Matches '{stream}[{index.Value}]' = {kvValue}"); + else + { + Args?.Logger?.ILog($"Index does not match '{stream}[{index.Value}]' = {kvValue}"); + return false; + } + break; + } } } diff --git a/VideoNodes/FfmpegBuilderNodes/Video/FfmpegBuilderTrackRemover.cs b/VideoNodes/FfmpegBuilderNodes/Video/FfmpegBuilderTrackRemover.cs new file mode 100644 index 00000000..9a4f3fea --- /dev/null +++ b/VideoNodes/FfmpegBuilderNodes/Video/FfmpegBuilderTrackRemover.cs @@ -0,0 +1,91 @@ +using FileFlows.VideoNodes.FfmpegBuilderNodes.Models; + +namespace FileFlows.VideoNodes.FfmpegBuilderNodes; + +/// +/// Flow element used to remove matching tracks +/// +public class FfmpegBuilderTrackRemover: TrackSelectorFlowElement +{ + /// + public override string HelpUrl => "https://fileflows.com/docs/plugins/video-nodes/ffmpeg-builder/track-remover"; + + /// + public override string Icon => "fas fa-eraser"; + + /// + public override int Outputs => 2; + + /// + /// Gets or sets the stream types to remove + /// + [Select(nameof(StreamTypeOptions), 1)] + public string StreamType { get; set; } + + /// + /// The static stream type list + /// + private static List _StreamTypeOptions; + + /// + /// Gets the available stream types + /// + public static List StreamTypeOptions + { + get + { + if (_StreamTypeOptions == null) + { + _StreamTypeOptions = new List + { + new () { Label = "Video", Value = "Video" }, + new () { Label = "Audio", Value = "Audio" }, + new () { Label = "Subtitle", Value = "Subtitle" } + }; + } + return _StreamTypeOptions; + } + } + + /// + public override int Execute(NodeParameters args) + { + if(string.IsNullOrEmpty(StreamType) || StreamType.Equals("audio", StringComparison.CurrentCultureIgnoreCase)) + return RemoveTracks(Model.AudioStreams) ? 1 : 2; + if (StreamType.Equals("subtitle", StringComparison.CurrentCultureIgnoreCase)) + return RemoveTracks(Model.SubtitleStreams) ? 1 : 2; + if (StreamType.Equals("video", StringComparison.CurrentCultureIgnoreCase)) + return RemoveTracks(Model.VideoStreams) ? 1 : 2; + + return 2; + } + + /// + /// Iteerate the tracks/streams and remove any that match the conditions + /// + /// the track to iterate + /// The type of the track + /// true if any tracks were removed/deleted + private bool RemoveTracks(List tracks) where T: FfmpegStream + { + bool removing = false; + int index = -1; + foreach (var track in tracks) + { + if (track.Deleted) + continue; + index++; + + if (CustomTrackSelection && StreamMatches(track, index) == false) + { + Args.Logger?.ILog("Stream does not match conditions: " + track); + continue; + } + Args.Logger?.ILog($"Deleting Stream: {track}"); + track.Deleted = true; + removing = true; + } + + return removing; + } +} \ No newline at end of file diff --git a/VideoNodes/i18n/en.json b/VideoNodes/i18n/en.json index 79dfca1e..0ba166a8 100644 --- a/VideoNodes/i18n/en.json +++ b/VideoNodes/i18n/en.json @@ -297,7 +297,7 @@ } }, "FfmpegBuilderAudioTrackRemover": { - "Label": "FFMPEG Builder: Track Remover", + "Label": "FFMPEG Builder: Track Remover (Obsolete)", "Outputs": { "1": "Tracks set to remove", "2": "Tracks NOT set to removed" @@ -320,6 +320,22 @@ "MatchType-Help": "The value to match against." } }, + "FfmpegBuilderTrackRemover": { + "Label": "FFMPEG Builder: Track Remover", + "Outputs": { + "1": "Tracks set to remove", + "2": "Tracks NOT set to removed" + }, + "Description": "Allows you to remove tracks based on specified conditions.", + "Fields": { + "StreamType": "Type", + "StreamType-Help": "The type of tracks to reorder in the FFMPEG Builder", + "CustomTrackSelection": "Remove", + "TrackSelectionOptions": "Matching", + "TrackSelectionOptionsKey": "Property", + "TrackSelectionOptionsValue": "Value" + } + }, "FfmpegBuilderAudioTrackReorder": { "Label": "FFMPEG Builder: Track Reorder", "Outputs": {