mirror of
https://github.com/revenz/FileFlowsPlugins.git
synced 2026-01-06 00:59:36 -06:00
added language support to audio track reorder node
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user