From 08e11f47327f321ff30efddc3f9d7778a3e90a0a Mon Sep 17 00:00:00 2001 From: John Andrews Date: Mon, 13 Jun 2022 15:04:56 +1200 Subject: [PATCH] added video tag node --- Apprise/Apprise.csproj | Bin 2760 -> 2760 bytes BasicNodes/BasicNodes.csproj | Bin 3566 -> 3566 bytes ChecksumNodes/ChecksumNodes.csproj | Bin 2872 -> 2872 bytes CollectionNodes/CollectionNodes.csproj | Bin 3256 -> 3256 bytes DiscordNodes/DiscordNodes.csproj | Bin 2870 -> 2870 bytes EmailNodes/EmailNodes.csproj | Bin 3386 -> 3386 bytes Emby/Emby.csproj | Bin 2844 -> 2844 bytes Gotify/Gotify.csproj | Bin 2752 -> 2752 bytes ImageNodes/ImageNodes.csproj | Bin 3232 -> 3232 bytes MetaNodes/MetaNodes.csproj | Bin 4504 -> 4504 bytes MusicNodes/MusicNodes.csproj | Bin 4228 -> 4228 bytes Plex/Plex.csproj | Bin 2844 -> 2844 bytes .../Video/FfmpegBuilderVideoTag.cs | 48 ++++++++++++++++++ .../LogicalNodes/CanUseHardwareEncoding.cs | 43 ++++++++++++---- .../FfmpegBuilder_BasicTests.cs | 32 ++++++++++++ VideoNodes/VideoNodes.csproj | Bin 4098 -> 4098 bytes VideoNodes/VideoNodes.en.json | 11 ++++ 17 files changed, 123 insertions(+), 11 deletions(-) create mode 100644 VideoNodes/FfmpegBuilderNodes/Video/FfmpegBuilderVideoTag.cs diff --git a/Apprise/Apprise.csproj b/Apprise/Apprise.csproj index 2977abce047710c0b79bbf7d195cd444b7e9a657..7341831feef1f90756ba38575c64cfc8ae97ac49 100644 GIT binary patch delta 32 ocmX>hdO~!A3lpm)gAIfJWN9YJ$$OYMCTB6}FhdO~!A3lpmagAIfJWN9YJ$$OYMCTB6}FgDJE7+1{((b$qShzC*R}ZnykjcH;Gw+(Q>mQvp5F;!QBZ) delta 35 rcmdlXwnJ>gDJE761{((b$qShzC*R}ZnykjcH;Gw+(PFbAvp5F;!Mq7X diff --git a/CollectionNodes/CollectionNodes.csproj b/CollectionNodes/CollectionNodes.csproj index 4431e0fa8353accc2c356f38616765f2ee7e2d72..f78d2b263803c94f569060fc5f2ce9fdfb208dac 100644 GIT binary patch delta 36 scmdlXxkGZpEk;&L1{((b$r~9ZC&%${P2R)IH(7v5fzfiaAyYdS0M5e-5&!@I delta 36 scmdlXxkGZpEk;%g1{((b$r~9ZC&%${P2R)IH(7v5fze{KAyYdS0M4Nb5C8xG diff --git a/DiscordNodes/DiscordNodes.csproj b/DiscordNodes/DiscordNodes.csproj index bc3298536de2e7a0d05395f50a4835ebf101618b..0d2555c1463169186157c95fa95837950640b709 100644 GIT binary patch delta 20 ccmdlcwoPoqBqm17$&;Ca87((IXY%I&08DTOzW@LL delta 20 ccmdlcwoPoqBqm0S$&;Ca87($HXY%I&08Cy6y#N3J diff --git a/EmailNodes/EmailNodes.csproj b/EmailNodes/EmailNodes.csproj index e6db628821b476acb704d5f48d3e563b61240791..e470425ee79fb17ad865499cbb5d93fb439e613f 100644 GIT binary patch delta 32 ocmdlbwM%M)3k$0ygAIfJWN8-3$$MD1Cg-r|Fj{V&$+D0G0F#&q)Bpeg delta 32 ocmdlbwM%M)3k$0SgAIfJWN8-3$$MD1Cg-r|Fj{P$$+D0G0F!zM(f|Me diff --git a/Emby/Emby.csproj b/Emby/Emby.csproj index c8a08fce116e516b51460546dd43d3a46da2d630..41a26e07cfce96153ab373bdc3e894fa8ea03c3a 100644 GIT binary patch delta 20 ccmbOuHb-p3Bqm17$&;Ca87((IXENmg07zg4aR2}S delta 20 ccmbOuHb-p3Bqm0S$&;Ca87($HXENmg07y;-ZvX%Q diff --git a/Gotify/Gotify.csproj b/Gotify/Gotify.csproj index 7f2bafeaea64b01c18dae0b6e4118d6a0ee67c88..f5779e5d254d45c62676b204b920303344623cb2 100644 GIT binary patch delta 32 ocmX>gdO&o83lpm)gAIfJWN9YJ$$OYMCTB6}FgdO&o83lpmagAIfJWN9YJ$$OYMCTB6}F%(Rvh0D6=Npa1{> diff --git a/MetaNodes/MetaNodes.csproj b/MetaNodes/MetaNodes.csproj index e96a4dd2974ae2b596e2e6ea608bfcee76557334..a61baad25d08156fb04ba316bd2048a4f9a8ba64 100644 GIT binary patch delta 20 ccmbQCJVSZI9VSN0$# delta 20 ccmbQCJVSZI9VSML$#6j1@?)k*M$65%%6i+@?)k*MvKk1% +/// Set a node that adds a video tag to a file +/// +public class FfmpegBuilderVideoTag:FfmpegBuilderNode +{ + /// + /// The number of outputs for this node + /// + public override int Outputs => 1; + + public override string Icon => "fas fa-tag"; + + /// + /// The Help URL for this node + /// + public override string HelpUrl => "https://docs.fileflows.com/plugins/video-nodes/ffmpeg-builder/video-tag"; + + + /// + /// Gets or sets the tag to set + /// + [TextVariable(1)] + [Required] + public string Tag { get; set; } + + /// + /// Executes the node + /// + /// The node arguments + /// the output return + public override int Execute(NodeParameters args) + { + string tag = args.ReplaceVariables(Tag, stripMissing: true); + + if (string.IsNullOrEmpty(Tag)) + return 1; // nothing to do + + var stream = Model.VideoStreams.Where(x => x.Deleted == false).First(); + stream.AdditionalParameters.AddRange(new[] { "-tag:v", tag }); + + stream.ForcedChange = true; + return 1; + } +} diff --git a/VideoNodes/LogicalNodes/CanUseHardwareEncoding.cs b/VideoNodes/LogicalNodes/CanUseHardwareEncoding.cs index 358aa20d..49d9c5c3 100644 --- a/VideoNodes/LogicalNodes/CanUseHardwareEncoding.cs +++ b/VideoNodes/LogicalNodes/CanUseHardwareEncoding.cs @@ -147,23 +147,44 @@ public class CanUseHardwareEncoding:Node args.Logger.ELog("FFMpeg tool not found."); return false; } + return CanProcess(args, ffmpeg, encodingParams); } + /// + /// Tests if the encoding parameters can be executed + /// + /// the node paramterse + /// the location of ffmpeg + /// the encoding parameter to test + /// true if can be processed internal static bool CanProcess(NodeParameters args, string ffmpeg, string encodingParams) { - string cmdArgs = $"-loglevel error -f lavfi -i color=black:s=1080x1080 -vframes 1 -an -c:v {encodingParams} -f null -\""; - var cmd = args.Process.ExecuteShellCommand(new ExecuteArgs + bool can = CanExecute(); + if (can == false && encodingParams?.Contains("amf") == true) { - Command = ffmpeg, - Arguments = cmdArgs, - Silent = true - }).Result; - if (cmd.ExitCode != 0 || string.IsNullOrWhiteSpace(cmd.Output) == false) - { - args.Logger?.WLog($"Cant process '{encodingParams}': {cmd.Output ?? ""}"); - return false; + // AMD/AMF has a issue where it reports false at first but then passes + // https://github.com/revenz/FileFlows/issues/106 + Thread.Sleep(2000); + can = CanExecute(); + } + return can; + + bool CanExecute() + { + string cmdArgs = $"-loglevel error -f lavfi -i color=black:s=1080x1080 -vframes 1 -an -c:v {encodingParams} -f null -\""; + var cmd = args.Process.ExecuteShellCommand(new ExecuteArgs + { + Command = ffmpeg, + Arguments = cmdArgs, + Silent = true + }).Result; + if (cmd.ExitCode != 0 || string.IsNullOrWhiteSpace(cmd.Output) == false) + { + args.Logger?.WLog($"Cant process '{encodingParams}': {cmd.Output ?? ""}"); + return false; + } + return true; } - return true; } } diff --git a/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_BasicTests.cs b/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_BasicTests.cs index b375e016..68a94657 100644 --- a/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_BasicTests.cs +++ b/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_BasicTests.cs @@ -1024,6 +1024,38 @@ public class FfmpegBuilder_BasicTests ffSubRemover.PreExecute(args); Assert.AreEqual(1, ffSubRemover.Execute(args)); } + + + + [TestMethod] + public void FfmpegBuilder_VideoTag() + { + const string file = @"D:\videos\testfiles\120-mbps-4k-uhd-hevc-10bit.mkv"; + var logger = new TestLogger(); + const string ffmpeg = @"C:\utils\ffmpeg\ffmpeg.exe"; + var vi = new VideoInfoHelper(ffmpeg, logger); + var vii = vi.Read(file); + var args = new NodeParameters(file, logger, false, string.Empty); + args.GetToolPathActual = (string tool) => ffmpeg; + args.TempPath = @"D:\videos\temp"; + args.Parameters.Add("VideoInfo", vii); + + FfmpegBuilderStart ffStart = new(); + ffStart.PreExecute(args); + Assert.AreEqual(1, ffStart.Execute(args)); + + FfmpegBuilderVideoTag ffTag= new(); + ffTag.Tag = "hvc1"; + ffTag.PreExecute(args); + ffTag.Execute(args); + + FfmpegBuilderExecutor ffExecutor = new(); + ffExecutor.PreExecute(args); + int result = ffExecutor.Execute(args); + + string log = logger.ToString(); + Assert.AreEqual(1, result); + } } #endif \ No newline at end of file diff --git a/VideoNodes/VideoNodes.csproj b/VideoNodes/VideoNodes.csproj index 8b6bb7ba22dce349838ebc7ca83a38bbad722a07..6c47822ff3628319a1469159cf9902bab8e97557 100644 GIT binary patch delta 20 bcmZotXj0hlh>6j1@?)k*M$65%%tv_uOlt<> delta 20 bcmZotXj0hlh>6i+@?)k*MvKk1%tv_uOj!ot diff --git a/VideoNodes/VideoNodes.en.json b/VideoNodes/VideoNodes.en.json index 35d1f3da..3afafd11 100644 --- a/VideoNodes/VideoNodes.en.json +++ b/VideoNodes/VideoNodes.en.json @@ -470,6 +470,17 @@ "Quality-Suffix": "(Higher Quality, larger file)" } }, + "FfmpegBuilderVideoTag": { + "Label": "FFMPEG Builder: Video Tag", + "Description": "Sets a video tag on the file", + "Outputs": { + "1": "FFMPEG Builder tag added" + }, + "Fields": { + "Tag": "Tag", + "Tag-Help": "The tag to add to the video file" + } + }, "RemuxToMKV": { "Descritption": "Remuxes a video file into a MKV container. All streams will be copied to the new container", "Outputs": {