From e3ff4525c04bfd1018f42816cddd5d514081144e Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Sun, 19 May 2019 18:41:46 +0700 Subject: [PATCH] Allow `*.groovy` files as argument value for `--format`, `--filter` and `--file-filter` CLI options (e.g. `--format /path/to/MyFormat.groovy`) --- CHANGES.md | 1 + source/net/filebot/cli/ArgumentBean.java | 6 +-- .../filebot/cli/GroovyExpressionHandler.java | 48 +++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 source/net/filebot/cli/GroovyExpressionHandler.java diff --git a/CHANGES.md b/CHANGES.md index 0f7ae72b..19a8835e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ Next Release (4.8.6) * Ensure that `ActionPopup` is always displayed on top of the Windows Task Bar * Improved `-mediainfo -exec` pipeline * Added `-no-history` CLI option +* Allow `*.groovy` files as argument value for `--format`, `--filter` and `--file-filter` CLI options (e.g. `--format /path/to/MyFormat.groovy`) FileBot 4.8.5 diff --git a/source/net/filebot/cli/ArgumentBean.java b/source/net/filebot/cli/ArgumentBean.java index 9ff2e0f8..32a5cf04 100644 --- a/source/net/filebot/cli/ArgumentBean.java +++ b/source/net/filebot/cli/ArgumentBean.java @@ -71,10 +71,10 @@ public class ArgumentBean { @Option(name = "--conflict", usage = "Conflict resolution", metaVar = "[skip, override, auto, index, fail]") public String conflict = "skip"; - @Option(name = "--filter", usage = "Match filter expression", metaVar = "{expression}") + @Option(name = "--filter", usage = "Match filter expression", handler = GroovyExpressionHandler.class) public String filter = null; - @Option(name = "--format", usage = "Format expression", metaVar = "{expression}") + @Option(name = "--format", usage = "Format expression", handler = GroovyExpressionHandler.class) public String format; @Option(name = "-non-strict", usage = "Enable advanced matching and more aggressive guessing") @@ -119,7 +119,7 @@ public class ArgumentBean { @Option(name = "-r", usage = "Recursively process folders") public boolean recursive = false; - @Option(name = "--file-filter", usage = "Input file filter expression", metaVar = "{expression}") + @Option(name = "--file-filter", usage = "Input file filter expression", handler = GroovyExpressionHandler.class) public String inputFileFilter = null; @Option(name = "-exec", usage = "Execute command", metaVar = "echo {f} [+]", handler = RestOfArgumentsHandler.class) diff --git a/source/net/filebot/cli/GroovyExpressionHandler.java b/source/net/filebot/cli/GroovyExpressionHandler.java new file mode 100644 index 00000000..c0aec6ab --- /dev/null +++ b/source/net/filebot/cli/GroovyExpressionHandler.java @@ -0,0 +1,48 @@ +package net.filebot.cli; + +import static net.filebot.util.FileUtilities.*; + +import java.io.File; + +import org.kohsuke.args4j.CmdLineException; +import org.kohsuke.args4j.CmdLineParser; +import org.kohsuke.args4j.OptionDef; +import org.kohsuke.args4j.spi.Parameters; +import org.kohsuke.args4j.spi.Setter; +import org.kohsuke.args4j.spi.StringOptionHandler; + +public class GroovyExpressionHandler extends StringOptionHandler { + + public GroovyExpressionHandler(CmdLineParser parser, OptionDef option, Setter setter) { + super(parser, option, setter); + } + + @Override + public int parseArguments(Parameters params) throws CmdLineException { + setter.addValue(getStringValue(params.getParameter(0))); + return 1; + } + + private String getStringValue(String s) throws CmdLineException { + // try as file path + if (s.endsWith(".groovy")) { + File f = new File(s); + if (f.isFile()) { + try { + return readTextFile(f); + } catch (Exception e) { + throw new CmdLineException(owner, "Failed to read argument value from text file: " + f, e); + } + } + } + + // or default to literal value + return s; + } + + @Override + public String getDefaultMetaVariable() { + return "{expression}"; + } + +}