diff --git a/VideoNodes/Tests/VideoInfoHelperTests.cs b/VideoNodes/Tests/VideoInfoHelperTests.cs index 7907167e..7b9e2a57 100644 --- a/VideoNodes/Tests/VideoInfoHelperTests.cs +++ b/VideoNodes/Tests/VideoInfoHelperTests.cs @@ -106,6 +106,167 @@ namespace VideoNodes.Tests Assert.IsTrue(result); } + + + [TestMethod] + public void VideoInfoTest_AudioTrackReorder() + { + var node = new AudioTrackReorder(); + var original = new List + { + new AudioStream{ Codec = "aac", Language = "fre"}, + new AudioStream{ Codec = "dts", Language = "fre"}, + new AudioStream{ Codec = "aac", Language = "eng"}, + new AudioStream{ Codec = "aac", Language = "mao"}, + new AudioStream{ Codec = "dts", Language = "mao"}, + new AudioStream{ Codec = "ac3", Language = "mao"}, + new AudioStream{ Codec = "ac3", Language = "eng"}, + new AudioStream{ Codec = "ac3", Language = "fre"}, + }; + node.Languages = new List { "eng" }; + node.OrderedTracks = new List { "ac3", "aac" }; + var reordered = node.Reorder(original); + + Assert.AreEqual("ac3", reordered[0].Codec); + Assert.AreEqual("eng", reordered[0].Language); + + Assert.AreEqual("aac", reordered[1].Codec); + Assert.AreEqual("eng", reordered[1].Language); + + Assert.AreEqual("ac3", reordered[2].Codec); + Assert.AreEqual("mao", reordered[2].Language); + + Assert.AreEqual("ac3", reordered[3].Codec); + Assert.AreEqual("fre", reordered[3].Language); + + Assert.AreEqual("aac", reordered[4].Codec); + Assert.AreEqual("fre", reordered[4].Language); + + Assert.AreEqual("aac", reordered[5].Codec); + Assert.AreEqual("mao", reordered[5].Language); + + Assert.AreEqual("dts", reordered[6].Codec); + Assert.AreEqual("fre", reordered[6].Language); + + Assert.AreEqual("dts", reordered[7].Codec); + Assert.AreEqual("mao", reordered[7].Language); + } + + + + [TestMethod] + public void VideoInfoTest_AudioTrackReorder_NothingConfigured() + { + var node = new AudioTrackReorder(); + var original = new List + { + new AudioStream{ Codec = "aac", Language = "fre"}, + new AudioStream{ Codec = "dts", Language = "fre"}, + new AudioStream{ Codec = "aac", Language = "eng"}, + new AudioStream{ Codec = "aac", Language = "mao"}, + new AudioStream{ Codec = "dts", Language = "mao"}, + new AudioStream{ Codec = "ac3", Language = "mao"}, + new AudioStream{ Codec = "ac3", Language = "eng"}, + new AudioStream{ Codec = "ac3", Language = "fre"}, + }; + node.Languages = null; + node.OrderedTracks = new List(); + var reordered = node.Reorder(original); + + for(int i = 0; i < original.Count; i++) + { + Assert.AreEqual(original[i].Codec, reordered[i].Codec); + Assert.AreEqual(original[i].Language, reordered[i].Language); + } + } + + [TestMethod] + public void VideoInfoTest_AudioTrackReorder_NoLanguage() + { + var node = new AudioTrackReorder(); + var original = new List + { + new AudioStream{ Codec = "aac", Language = "fre"}, + new AudioStream{ Codec = "dts", Language = "fre"}, + new AudioStream{ Codec = "aac", Language = "eng"}, + new AudioStream{ Codec = "aac", Language = "mao"}, + new AudioStream{ Codec = "dts", Language = "mao"}, + new AudioStream{ Codec = "ac3", Language = "mao"}, + new AudioStream{ Codec = "ac3", Language = "eng"}, + new AudioStream{ Codec = "ac3", Language = "fre"}, + }; + node.OrderedTracks = new List { "ac3", "aac" }; + var reordered = node.Reorder(original); + + Assert.AreEqual("ac3", reordered[0].Codec); + Assert.AreEqual("mao", reordered[0].Language); + + Assert.AreEqual("ac3", reordered[1].Codec); + Assert.AreEqual("eng", reordered[1].Language); + + Assert.AreEqual("ac3", reordered[2].Codec); + Assert.AreEqual("fre", reordered[2].Language); + + Assert.AreEqual("aac", reordered[3].Codec); + Assert.AreEqual("fre", reordered[3].Language); + + Assert.AreEqual("aac", reordered[4].Codec); + Assert.AreEqual("eng", reordered[4].Language); + + Assert.AreEqual("aac", reordered[5].Codec); + Assert.AreEqual("mao", reordered[5].Language); + + Assert.AreEqual("dts", reordered[6].Codec); + Assert.AreEqual("fre", reordered[6].Language); + + Assert.AreEqual("dts", reordered[7].Codec); + Assert.AreEqual("mao", reordered[7].Language); + } + + + + [TestMethod] + public void VideoInfoTest_AudioTrackReorder_NoCodec() + { + var node = new AudioTrackReorder(); + var original = new List + { + new AudioStream{ Codec = "aac", Language = "fre"}, + new AudioStream{ Codec = "dts", Language = "fre"}, + new AudioStream{ Codec = "aac", Language = "eng"}, + new AudioStream{ Codec = "aac", Language = "mao"}, + new AudioStream{ Codec = "dts", Language = "mao"}, + new AudioStream{ Codec = "ac3", Language = "mao"}, + new AudioStream{ Codec = "ac3", Language = "eng"}, + new AudioStream{ Codec = "ac3", Language = "fre"}, + }; + node.Languages = new List { "eng" }; + var reordered = node.Reorder(original); + + Assert.AreEqual("aac", reordered[0].Codec); + Assert.AreEqual("eng", reordered[0].Language); + + Assert.AreEqual("ac3", reordered[1].Codec); + Assert.AreEqual("eng", reordered[1].Language); + + Assert.AreEqual("aac", reordered[2].Codec); + Assert.AreEqual("fre", reordered[2].Language); + + Assert.AreEqual("dts", reordered[3].Codec); + Assert.AreEqual("fre", reordered[3].Language); + + Assert.AreEqual("aac", reordered[4].Codec); + Assert.AreEqual("mao", reordered[4].Language); + + Assert.AreEqual("dts", reordered[5].Codec); + Assert.AreEqual("mao", reordered[5].Language); + + Assert.AreEqual("ac3", reordered[6].Codec); + Assert.AreEqual("mao", reordered[6].Language); + + Assert.AreEqual("ac3", reordered[7].Codec); + Assert.AreEqual("fre", reordered[7].Language); + } } } diff --git a/VideoNodes/VideoNodes.en.json b/VideoNodes/VideoNodes.en.json index 77114167..473f4f00 100644 --- a/VideoNodes/VideoNodes.en.json +++ b/VideoNodes/VideoNodes.en.json @@ -4,7 +4,10 @@ "AudioTrackReorder": { "Description": "Allows you to reorder audio tracks in the preferred order.\n\nEnter the audio codecs in the order you want. Any not listed will be ordered after the ones entered in their original order.\nIf there are multiple tracks with same codec, they will be ordered first by the order you entered, then in their original order.\n\nOutput 1: Audio tracks were reordered\nOutput 2: Audio tracks did not need reordering", "Fields": { - "OrderedTracks": "Ordered Audio Codecs" + "OrderedTracks": "Ordered Audio Codecs", + "OrderedTracks-Help": "The order of audio codecs to the audio streams by. This is done after the langauges (if any)", + "Languages": "Languages", + "Languages-Help": "The order of languages to sort the audio streams by. This sorting is done before the codec." } }, "VideoFile": { diff --git a/VideoNodes/VideoNodes/AudioTrackReorder.cs b/VideoNodes/VideoNodes/AudioTrackReorder.cs index 6b7357c3..17aafc9f 100644 --- a/VideoNodes/VideoNodes/AudioTrackReorder.cs +++ b/VideoNodes/VideoNodes/AudioTrackReorder.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; + using System.Text; public class AudioTrackReorder: EncodingNode { @@ -14,9 +15,57 @@ public override string Icon => "fas fa-volume-off"; [StringArray(1)] - [Required] + public List Languages { get; set; } + + [StringArray(2)] public List OrderedTracks { get; set; } + public List Reorder(List input) + { + Languages ??= new List(); + OrderedTracks ??= new List(); + if (Languages.Count == 0 && OrderedTracks.Count == 0) + return input; // nothing to do + + int count = 1_000_000_000; + var debug = new StringBuilder(); + var data = input.OrderBy(x => + { + int langIndex = Languages.IndexOf(x.Language?.ToLower() ?? String.Empty); + int codecIndex = OrderedTracks.IndexOf(x.Codec?.ToLower() ?? String.Empty); + int result = 0; + if (langIndex >= 0) + { + if (codecIndex >= 0) + result = (langIndex * 10_000) + (codecIndex * 100) + x.Index; + else + result = ((langIndex + 1) * 10_000) - 100 + x.Index; + } + else if (codecIndex >= 0) + result = ((codecIndex + 1) * 10_000_000) + x.Index; + else + result = ++count; + debug.AppendLine(x.Codec + " , " + x.Language + " = " + result); + return result; + }).ToList(); + + + return data; + + } + + public bool AreSame(List original, List reordered) + { + for (int i = 0; i < reordered.Count; i++) + { + if (reordered[i] != original[i]) + { + return false; + } + } + return true; + } + public override int Execute(NodeParameters args) { try @@ -34,28 +83,10 @@ OrderedTracks = OrderedTracks?.Select(x => x.ToLower())?.ToList() ?? new (); - int count = 100_000; - var reordered = videoInfo.AudioStreams.OrderBy(x => - { - int index = OrderedTracks.IndexOf(x.Codec?.ToLower() ?? String.Empty); - if (index >= 0) - { - // incase there are multiple tracks with the same codedc - // eg ac3, ac3, dts, truehd - return (index * 100) + x.Index; - } - return ++count; - }).ToList(); + var reordered = Reorder(videoInfo.AudioStreams); + + bool same = AreSame(videoInfo.AudioStreams, reordered); - bool same = true; - for(int i = 0; i < reordered.Count; i++) - { - if (reordered[i] != videoInfo.AudioStreams[i]) - { - same = false; - break; - } - } if(same) { args.Logger?.ILog("No audio tracks need reordering");