added language support to audio track reorder node

This commit is contained in:
reven
2021-12-26 19:14:19 +13:00
parent 20006f4988
commit faa721afc1
3 changed files with 218 additions and 23 deletions

View File

@@ -106,6 +106,167 @@ namespace VideoNodes.Tests
Assert.IsTrue(result);
}
[TestMethod]
public void VideoInfoTest_AudioTrackReorder()
{
var node = new AudioTrackReorder();
var original = new List<AudioStream>
{
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<string> { "eng" };
node.OrderedTracks = new List<string> { "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<AudioStream>
{
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<string>();
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<AudioStream>
{
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<string> { "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<AudioStream>
{
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<string> { "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);
}
}
}

View File

@@ -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": {

View File

@@ -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<string> Languages { get; set; }
[StringArray(2)]
public List<string> OrderedTracks { get; set; }
public List<AudioStream> Reorder(List<AudioStream> input)
{
Languages ??= new List<string>();
OrderedTracks ??= new List<string>();
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<AudioStream> original, List<AudioStream> 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");