diff --git a/source/net/filebot/Main.java b/source/net/filebot/Main.java index bda774e4..3b069a70 100644 --- a/source/net/filebot/Main.java +++ b/source/net/filebot/Main.java @@ -155,7 +155,7 @@ public class Main { } } - private static void onStart(ArgumentBean args) { + private static void onStart(ArgumentBean args) throws Exception { // publish file arguments List files = args.getFiles(false); if (files.size() > 0) { diff --git a/source/net/filebot/cli/ArgumentBean.java b/source/net/filebot/cli/ArgumentBean.java index 6538bb0e..443fa500 100644 --- a/source/net/filebot/cli/ArgumentBean.java +++ b/source/net/filebot/cli/ArgumentBean.java @@ -4,6 +4,7 @@ import static java.util.Arrays.*; import static java.util.Collections.*; import static net.filebot.Logging.*; import static net.filebot.hash.VerificationUtilities.*; +import static net.filebot.media.XattrMetaInfo.*; import static net.filebot.subtitle.SubtitleUtilities.*; import static net.filebot.util.FileUtilities.*; @@ -66,7 +67,7 @@ public class ArgumentBean { @Option(name = "--conflict", usage = "Conflict resolution", metaVar = "[skip, override, auto, index, fail]") public String conflict = "skip"; - @Option(name = "--filter", usage = "Filter expression", metaVar = "expression") + @Option(name = "--filter", usage = "Match filter expression", metaVar = "expression") public String filter = null; @Option(name = "--format", usage = "Format expression", metaVar = "expression") @@ -144,6 +145,9 @@ public class ArgumentBean { @Option(name = "-exec", usage = "Execute command", metaVar = "command", handler = RestOfArgumentsHandler.class) public List exec = new ArrayList(); + @Option(name = "--file-filter", usage = "Input file filter expression", metaVar = "expression") + public String inputFileFilter = null; + @Argument public List arguments = new ArrayList(); @@ -171,7 +175,7 @@ public class ArgumentBean { return clearPrefs; } - public List getFiles(boolean resolveFolders) { + public List getFiles(boolean resolveFolders) throws Exception { if (arguments == null || arguments.isEmpty()) { return emptyList(); } @@ -206,6 +210,11 @@ public class ArgumentBean { } } + // input file filter (e.g. useful on Windows where find -exec is not an option) + if (inputFileFilter != null) { + return filter(files, new ExpressionFileFilter(inputFileFilter, f -> f)); + } + return files; } @@ -244,7 +253,7 @@ public class ArgumentBean { } public FileFilter getFileFilter() throws Exception { - return filter == null ? FILES : new ExpressionFileFilter(filter); + return filter == null ? FILES : new ExpressionFileFilter(filter, xattr::getMetaInfo); } public Datasource getDatasource() { diff --git a/source/net/filebot/format/ExpressionFileFilter.java b/source/net/filebot/format/ExpressionFileFilter.java index 1242c47e..e345cdf0 100644 --- a/source/net/filebot/format/ExpressionFileFilter.java +++ b/source/net/filebot/format/ExpressionFileFilter.java @@ -1,19 +1,26 @@ package net.filebot.format; import static net.filebot.Logging.*; -import static net.filebot.media.XattrMetaInfo.*; import java.io.File; import java.io.FileFilter; +import java.util.function.Function; import javax.script.ScriptException; public class ExpressionFileFilter implements FileFilter { private ExpressionFilter filter; + private Function match; public ExpressionFileFilter(String expression) throws ScriptException { + // use file object as match object by default + this(expression, f -> f); + } + + public ExpressionFileFilter(String expression, Function match) throws ScriptException { this.filter = new ExpressionFilter(expression); + this.match = match; } public ExpressionFilter getExpressionFilter() { @@ -23,7 +30,7 @@ public class ExpressionFileFilter implements FileFilter { @Override public boolean accept(File f) { try { - return filter.matches(new MediaBindingBean(xattr.getMetaInfo(f), f)); + return filter.matches(new MediaBindingBean(match.apply(f), f)); } catch (Exception e) { debug.warning("Filter expression failed: " + e); } diff --git a/source/net/filebot/ui/rename/Preset.java b/source/net/filebot/ui/rename/Preset.java index ec4a5b11..840a3427 100644 --- a/source/net/filebot/ui/rename/Preset.java +++ b/source/net/filebot/ui/rename/Preset.java @@ -4,6 +4,7 @@ import static java.util.Collections.*; import static net.filebot.Logging.*; import static net.filebot.Settings.*; import static net.filebot.WebServices.*; +import static net.filebot.media.XattrMetaInfo.*; import static net.filebot.util.FileUtilities.*; import java.io.File; @@ -60,7 +61,7 @@ public class Preset { } public ExpressionFileFilter getIncludeFilter() { - return getInputFolder() == null ? null : getValue(includes, expression -> new ExpressionFileFilter(expression)); + return getInputFolder() == null ? null : getValue(includes, expression -> new ExpressionFileFilter(expression, xattr::getMetaInfo)); } public ExpressionFileFormat getFormat() {