From 5cbf3fede23977b8c27b816d932913ff863e172b Mon Sep 17 00:00:00 2001 From: RatzzFatzz Date: Mon, 4 Apr 2022 23:40:42 +0200 Subject: [PATCH] Add property for file exclusion --- README.md | 13 ++++---- config-template.yaml | 3 ++ .../AttributeUpdaterKernel.java | 10 +++++- .../MKVToolProperties.java | 25 -------------- .../mkvaudiosubtitlechanger/Main.java | 33 ++++++++++--------- .../config/Config.java | 16 ++++++--- .../impl/MkvFileCollector.java | 2 +- .../model/ConfigProperty.java | 26 +++++++++------ .../util/CommandLineOptionsUtil.java | 23 +++++++++++++ 9 files changed, 87 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/MKVToolProperties.java create mode 100644 src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/CommandLineOptionsUtil.java diff --git a/README.md b/README.md index bec976a..5b5de01 100644 --- a/README.md +++ b/README.md @@ -21,12 +21,13 @@ Opening terminal / cmd in the directory of the jar and the config file and execu ### Additional arameters ```properties - -c,--config path to config - -h,--help "for help this is" - Yoda - -k,--forcedKeywords Additional keywords to identify forced tracks - -l,--library path to library (Required) - -s,--safe-mode Test run (no files will be changes) - -t,--threads thread count + -c,--config path to config + -e,--exclude-directories Directories to exclude + -h,--help "for help this is" - Yoda + -k,--forcedKeywords Additional keywords to identify forcedtracks" + -l,--library path to library + -s,--safe-mode Test run (no files will be changes) + -t,--threads thread count ``` ### config.yml example diff --git a/config-template.yaml b/config-template.yaml index 808c51d..c7174b9 100644 --- a/config-template.yaml +++ b/config-template.yaml @@ -2,6 +2,9 @@ mkvtoolnixPath: C:\Program Files\MKVToolNix # Recommendations for data stored on HDDs, increase when using SSDs threads: 2 #forcedKeywords: ["forced", "signs"] +#exclude-directories: +# - "D:/Path/To/File.mkv" +# - "D:/Path/To/Directory" config: 1: audio: ger diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java index 940ea1f..2e484c7 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java @@ -14,10 +14,12 @@ import me.tongfei.progressbar.ProgressBarStyle; import java.io.File; import java.io.IOException; +import java.util.Collection; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Log4j2 public class AttributeUpdaterKernel { @@ -37,7 +39,13 @@ public class AttributeUpdaterKernel { statistic.startTimer(); try (ProgressBar progressBar = pbBuilder().build()) { - List files = collector.loadFiles(Config.getInstance().getLibraryPath()); + List excludedFiles = Config.getInstance().getExcludedDirectories().stream() + .map(collector::loadFiles) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + List files = collector.loadFiles(Config.getInstance().getLibraryPath()).stream() + .filter(file -> !excludedFiles.contains(file)) + .collect(Collectors.toList()); progressBar.maxHint(files.size()); files.forEach(file -> executor.submit(() -> process(file, progressBar))); executor.shutdown(); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/MKVToolProperties.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/MKVToolProperties.java deleted file mode 100644 index 53b9ddb..0000000 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/MKVToolProperties.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Getter -@Setter -public class MKVToolProperties { - private String mkvmergePath; - private String mkvpropeditPath; - - private static MKVToolProperties instance = null; - - private MKVToolProperties() { - } - - public static MKVToolProperties getInstance() { - if (instance == null) { - instance = new MKVToolProperties(); - } - return instance; - } -} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java index ca008ee..f018e41 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java @@ -9,6 +9,7 @@ import org.apache.commons.cli.*; import java.util.List; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; import static java.lang.Integer.parseInt; @Log4j2 @@ -20,14 +21,7 @@ public class Main { } private static void initConfig(String[] args) { - Options options = new Options(); - options.addOption("h", HELP.toString(), false, "\"for help this is\" - Yoda"); - options.addRequiredOption("l", LIBRARY.toString(), true, "path to library"); - options.addOption("c", CONFIG.toString(), false, "path to config"); - options.addOption("t", THREADS.toString(), true, "thread count"); - options.addOption("s", SAFE_MODE.toString(), false, "Test run (no files will be changes)"); - options.addOption(create("k", FORCED_KEYWORDS.toString(), Option.UNLIMITED_VALUES, "Additional keywords to identify forced tracks")); - + Options options = initOptions(); CommandLineParser parser = new DefaultParser(); HelpFormatter formatter = new HelpFormatter(); try { @@ -39,12 +33,14 @@ public class Main { } Config config = Config.getInstance(); - config.loadConfig(cmd.getOptionValue(CONFIG.toString(), "config.yaml")); // use cmd input + config.loadConfig(cmd.getOptionValue(CONFIG_PATH.prop(), "config.yaml")); // use cmd input config.setLibraryPath(cmd.getOptionValue("library")); config.setSafeMode(cmd.hasOption("safe-mode")); if (cmd.hasOption("threads")) config.setThreadCount(parseInt(cmd.getOptionValue("threads"))); - if (cmd.hasOption(FORCED_KEYWORDS.toString())) - config.getForcedKeywords().addAll(List.of(cmd.getOptionValues(FORCED_KEYWORDS.toString()))); + if (cmd.hasOption(FORCED_KEYWORDS.prop())) + config.getForcedKeywords().addAll(List.of(cmd.getOptionValues(FORCED_KEYWORDS.prop()))); + if (cmd.hasOption(EXCLUDE_DIRECTORY.prop())) + config.getExcludedDirectories().addAll(List.of(cmd.getOptionValues(EXCLUDE_DIRECTORY.prop()))); config.isValid(); } catch (ParseException e) { log.error(e); @@ -53,10 +49,15 @@ public class Main { } } - private static Option create(String opt, String longOpt, int args, String desc) { - Option option = new Option(opt, desc); - option.setLongOpt(longOpt); - option.setArgs(args); - return option; + private static Options initOptions() { + Options options = new Options(); + options.addOption(optionOf(HELP, "h", false)); + options.addOption(optionOf(LIBRARY, "l", true, true)); + options.addOption(optionOf(CONFIG_PATH, "c", false)); + options.addOption(optionOf(THREADS, "t", true)); + options.addOption(optionOf(SAFE_MODE, "s", false)); + options.addOption(optionOf(FORCED_KEYWORDS, "k", Option.UNLIMITED_VALUES, false)); + options.addOption(optionOf(EXCLUDE_DIRECTORY, "e", Option.UNLIMITED_VALUES, false)); + return options; } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java index 6a7c871..9f22a83 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java @@ -30,6 +30,7 @@ public class Config { private List attributeConfig; private int threadCount; private Set forcedKeywords = new HashSet<>(Arrays.asList("forced", "signs")); + private Set excludedDirectories = new HashSet<>(); @Getter(AccessLevel.NONE) private String mkvtoolnixPath; private String libraryPath; @@ -73,6 +74,7 @@ public class Config { setMkvtoolnixPath(loadMkvToolNixPath(config)); setWindows(System.getProperty("os.name").toLowerCase().contains("windows")); getForcedKeywords().addAll(loadForcedKeywords(config)); + getExcludedDirectories().addAll(loadExcludeDirectories(config)); } catch (YamlInvalidContentException | YamlKeyNotFoundException | IOException e) { log.fatal("Config could not be loaded: {}", e.getMessage()); } @@ -90,18 +92,22 @@ public class Config { } private int loadThreadCount(YAML config) throws YamlKeyNotFoundException { - return config.isSet(ConfigProperty.THREADS.toString()) - ? Integer.parseInt(config.getString(ConfigProperty.THREADS.toString())) + return config.isSet(ConfigProperty.THREADS.prop()) + ? Integer.parseInt(config.getString(ConfigProperty.THREADS.prop())) : 1; } private List loadForcedKeywords(YAML config) { - return config.getStringList(ConfigProperty.FORCED_KEYWORDS.toString(), new ArrayList<>()); + return config.getStringList(ConfigProperty.FORCED_KEYWORDS.prop(), new ArrayList<>()); + } + + private List loadExcludeDirectories(YAML config) { + return config.getStringList(ConfigProperty.EXCLUDE_DIRECTORY.prop(), new ArrayList<>()); } private String loadMkvToolNixPath(YAML config) throws YamlKeyNotFoundException { - return config.isSet(MKV_TOOL_NIX.toString()) - ? config.getString(MKV_TOOL_NIX.toString()) + return config.isSet(MKV_TOOL_NIX.prop()) + ? config.getString(MKV_TOOL_NIX.prop()) : defaultMkvToolNixPath(); } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java index 6de706b..6540958 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java @@ -19,7 +19,7 @@ public class MkvFileCollector implements FileCollector { public List loadFiles(String path) { File file = new File(path); if (file.isFile() && file.getAbsolutePath().endsWith(".mkv")) { - return new ArrayList() {{ + return new ArrayList<>() {{ add(file); }}; } else if (file.isDirectory()) { diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java index 432ee1b..cb478ed 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java @@ -1,22 +1,28 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; public enum ConfigProperty { - MKV_TOOL_NIX("mkvtoolnixPath"), - THREADS("threads"), - FORCED_KEYWORDS("forcedKeywords"), - CONFIG("config"), - LIBRARY("library"), - SAFE_MODE("safe-mode"), - HELP("help"); + MKV_TOOL_NIX("mkvtoolnixPath", "Path to mkv tool nix installation"), + THREADS("threads", "thread count"), + FORCED_KEYWORDS("forcedKeywords", "Additional keywords to identify forced tracks\""), + CONFIG_PATH("config", "path to config"), + LIBRARY("library", "path to library"), + SAFE_MODE("safe-mode", "Test run (no files will be changes)"), + HELP("help", "\"for help this is\" - Yoda"), + EXCLUDE_DIRECTORY("exclude-directories", "Directories to exclude"); private final String property; + private final String description; - ConfigProperty(String property) { + ConfigProperty(String property, String description) { this.property = property; + this.description = description; } - @Override - public String toString() { + public String desc() { + return description; + } + + public String prop() { return property; } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/CommandLineOptionsUtil.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/CommandLineOptionsUtil.java new file mode 100644 index 0000000..95607ac --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/CommandLineOptionsUtil.java @@ -0,0 +1,23 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.util; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; +import org.apache.commons.cli.Option; + +public class CommandLineOptionsUtil { + public static Option optionOf(ConfigProperty property, String opt, boolean hasArg) { + return optionOf(property, opt, hasArg ? 1 : 0, false); + } + + public static Option optionOf(ConfigProperty property, String opt, boolean hasArg, boolean required) { + return optionOf(property, opt, hasArg ? 1 : 0, required); + } + + public static Option optionOf(ConfigProperty property, String opt, int args, boolean required) { + Option option = new Option(opt, property.desc()); + option.setArgs(args); + option.setLongOpt(property.prop()); + option.setRequired(required); + return option; + } + +}