From ce9a2fc8056a8699e40c849cf17bdbe76af3e51e Mon Sep 17 00:00:00 2001 From: RatzzFatzz Date: Sun, 19 Feb 2023 15:51:50 +0100 Subject: [PATCH] Add linux compatibility & Finalize Config Loader --- .../config/Config.java | 12 +++-- .../config/ConfigLoader.java | 46 +++++++++---------- .../config/ValidationResult.java | 3 -- .../validator/AttributeConfigValidator.java | 9 ++++ .../config/validator/BooleanValidator.java | 14 ++++++ .../config/validator/ConfigPathValidator.java | 6 +++ .../config/validator/ConfigValidator.java | 31 +++++++++++++ .../validator/MkvToolNixPathValidator.java | 9 ++-- .../validator/OperatingSystemValidator.java | 3 ++ .../config/validator/PathValidator.java | 6 +++ .../config/validator/PatternValidator.java | 6 +++ .../config/validator/SetValidator.java | 2 +- .../config/validator/ThreadValidator.java | 6 +++ .../model/ConfigProperty.java | 42 +++++++++-------- .../model/ResultStatistic.java | 21 ++++++++- .../util/CommandLineOptionsUtil.java | 4 +- .../config/ConfigTest.java | 30 ++++++++++++ .../AttributeConfigValidatorTest.java | 2 +- .../validator/BooleanValidatorTest.java | 2 +- .../validator/ConfigPathValidatorTest.java | 2 +- .../MkvToolNixPathValidatorTest.java | 18 +++++--- .../config/validator/PathValidatorTest.java | 2 +- .../validator/PatternValidatorTest.java | 2 +- .../config/validator/SetValidatorTest.java | 3 +- .../config/validator/ThreadValidatorTest.java | 2 +- .../{mkvmerge.exe => mkvtoolnix/mkvmerge} | 0 .../mkvpropedit} | 0 .../resources/mkvtoolnix_exe/mkvmerge.exe | 0 .../resources/mkvtoolnix_exe/mkvpropedit.exe | 0 29 files changed, 212 insertions(+), 71 deletions(-) create mode 100644 src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java rename src/test/resources/{mkvmerge.exe => mkvtoolnix/mkvmerge} (100%) rename src/test/resources/{mkvpropedit.exe => mkvtoolnix/mkvpropedit} (100%) create mode 100644 src/test/resources/mkvtoolnix_exe/mkvmerge.exe create mode 100644 src/test/resources/mkvtoolnix_exe/mkvpropedit.exe diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java index 46e930e..fb8ff04 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java @@ -54,9 +54,15 @@ public class Config { return config; } - public String getPathFor(MkvToolNix exe) { - return mkvToolNix.getAbsolutePath().endsWith("/") ? mkvToolNix.getAbsolutePath() + exe + ".exe" : - mkvToolNix.getAbsolutePath() + "/" + exe + ".exe"; + /** + * Get path to specific mkvtoolnix application. + * + * @return absolute path to desired application. + */ + public String getPathFor(MkvToolNix application) { + String executable = isWindows() ? application + ".exe" : application.toString(); + return mkvToolNix.getAbsolutePath().endsWith("/") ? mkvToolNix.getAbsolutePath() + executable : + mkvToolNix.getAbsolutePath() + "/" + executable; } @Override diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java index cebdc23..fb05960 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java @@ -17,9 +17,8 @@ import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; public class ConfigLoader { - private static final ConfigValidator CONFIG_VALIDATOR = - new ConfigPathValidator(CONFIG_PATH, false, Path.of("./config.yaml").toFile()); private static final List> VALIDATORS = List.of( + new ConfigPathValidator(CONFIG_PATH, false, Path.of("./config.yaml").toFile()), new PathValidator(LIBRARY, true, null), new ThreadValidator(THREADS, false, 2), new MkvToolNixPathValidator(MKV_TOOL_NIX, true, Path.of("C:\\Program Files\\MKVToolNix").toFile()), @@ -34,20 +33,26 @@ public class ConfigLoader { public static void initConfig(String[] args) { HelpFormatter formatter = new HelpFormatter(); + YAML yamlConfig = null; Options options = initOptions(); CommandLine cmd = parseCommandLineArgs(formatter, options, args); exitIfHelp(cmd, options, formatter); exitIfVersion(cmd); - exitIfConfigIsMissing(cmd); List results = new ArrayList<>(); - try (YAML config = new YAML(Config.getInstance().getConfigPath())) { - for (ConfigValidator validator : VALIDATORS) { - results.add(validator.validate(config, cmd)); + + for (ConfigValidator validator: VALIDATORS) { + results.add(validator.validate(yamlConfig, cmd)); + if (yamlConfig == null && Config.getInstance().getConfigPath() != null) { + try { + yamlConfig = Config.getInstance().getConfigPath() != null + ? new YAML(Config.getInstance().getConfigPath()) + : new YAML(""); + } catch (IOException | YamlInvalidContentException ignored) {} } - } catch (IOException | YamlInvalidContentException ignored) {} + } if (results.contains(ValidationResult.INVALID)) System.exit(1); System.out.println(); @@ -55,16 +60,16 @@ public class ConfigLoader { private static Options initOptions() { Options options = new Options(); - options.addOption(optionOf(HELP, "h", false)); - options.addOption(optionOf(VERSION, "v", false)); - options.addOption(optionOf(LIBRARY, "l", true)); - options.addOption(optionOf(MKV_TOOL_NIX, "m", true)); - options.addOption(optionOf(CONFIG_PATH, "c", true)); - 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)); - options.addOption(optionOf(INCLUDE_PATTERN, "i", true)); + options.addOption(optionOf(HELP, HELP.abrv(), HELP.args())); + options.addOption(optionOf(VERSION, VERSION.abrv(), VERSION.args())); + options.addOption(optionOf(LIBRARY, LIBRARY.abrv(), LIBRARY.args() )); + options.addOption(optionOf(MKV_TOOL_NIX, MKV_TOOL_NIX.abrv(), MKV_TOOL_NIX.args() )); + options.addOption(optionOf(CONFIG_PATH, CONFIG_PATH.abrv(), CONFIG_PATH.args() )); + options.addOption(optionOf(THREADS, THREADS.abrv(), THREADS.args())); + options.addOption(optionOf(SAFE_MODE, SAFE_MODE.abrv(), SAFE_MODE.args() )); + options.addOption(optionOf(FORCED_KEYWORDS, FORCED_KEYWORDS.abrv(), FORCED_KEYWORDS.args())); + options.addOption(optionOf(EXCLUDE_DIRECTORY, FORCED_KEYWORDS.abrv(), FORCED_KEYWORDS.args())); + options.addOption(optionOf(INCLUDE_PATTERN, INCLUDE_PATTERN.abrv(), INCLUDE_PATTERN.args())); return options; } @@ -100,13 +105,6 @@ public class ConfigLoader { } } - private static void exitIfConfigIsMissing(CommandLine cmd) { - if (CONFIG_VALIDATOR.validate(null, cmd).equals(ValidationResult.INVALID)) { - System.out.println("\nPlease use a valid config path!"); - System.exit(0); - }; - } - private static File loadConfigPath(CommandLine cmd) { File configPath = new File(cmd.getOptionValue(CONFIG_PATH.prop(), "config.yaml")); if (configPath.isFile()) return configPath; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ValidationResult.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ValidationResult.java index d042c65..5ac257e 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ValidationResult.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ValidationResult.java @@ -1,8 +1,5 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; -import lombok.Getter; -import lombok.Setter; - public enum ValidationResult { VALID, DEFAULT, diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidator.java index 64b2cf3..2166a18 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidator.java @@ -18,6 +18,9 @@ public class AttributeConfigValidator extends ConfigValidator result; @@ -48,11 +51,17 @@ public class AttributeConfigValidator extends ConfigValidator parse(String value) { return null; } + /** + * {@inheritDoc} + */ @Override boolean isValid(List result) { if (result.isEmpty()) { diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidator.java index ec75328..d192e25 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidator.java @@ -18,6 +18,9 @@ public class BooleanValidator extends ConfigValidator { super(property, required, null); } + /** + * {@inheritDoc} + */ protected BiFunction> provideDataYaml() { return (yaml, property) -> { if (yaml.isSet(ARGUMENTS.prop()) @@ -28,6 +31,9 @@ public class BooleanValidator extends ConfigValidator { }; } + /** + * {@inheritDoc} + */ protected BiFunction> provideDataCmd() { return (cmd, property) -> { if (cmd.hasOption(property.prop())) { @@ -37,11 +43,19 @@ public class BooleanValidator extends ConfigValidator { }; } + /** + * {@inheritDoc} + * This should not be used. + */ @Override Boolean parse(String value) { throw new RuntimeException("This should not be called"); } + /** + * {@inheritDoc} + * Validation is skipped. + */ @Override boolean isValid(Boolean result) { return true; // skip diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidator.java index f6a73a6..54422f3 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidator.java @@ -12,11 +12,17 @@ public class ConfigPathValidator extends PathValidator { super(property, required, defaultValue); } + /** + * {@inheritDoc} + */ @Override protected BiFunction> provideDataYaml() { return (yaml, property) -> Optional.empty(); } + /** + * {@inheritDoc} + */ @Override protected boolean isValid(File result) { return super.isValid(result) && (result.getAbsolutePath().endsWith(".yml") || result.getAbsolutePath().endsWith(".yaml")); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigValidator.java index dac7207..0aa4fc3 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigValidator.java @@ -24,6 +24,13 @@ public abstract class ConfigValidator { protected final boolean required; protected final FieldType defaultValue; + /** + * Validate the user input. Parameters of cmd are prioritised. + * + * @param yaml config file + * @param cmd command line parameters + * @return {@link ValidationResult} containing validity of input. + */ public ValidationResult validate(YAML yaml, CommandLine cmd) { System.out.printf("%s: ", property.prop()); FieldType result; @@ -63,6 +70,9 @@ public abstract class ConfigValidator { return ValidationResult.VALID; } + /** + * @return parsed input of yaml config for property + */ protected BiFunction> provideDataYaml() { return (yaml, property) -> { if (yaml.isSet(property.prop())) { @@ -76,6 +86,9 @@ public abstract class ConfigValidator { }; } + /** + * @return parsed input of command line parameters config for property + */ protected BiFunction> provideDataCmd() { return (cmd, property) -> { if (cmd.hasOption(property.prop())) { @@ -85,10 +98,28 @@ public abstract class ConfigValidator { }; } + /** + * Parse input parameter to desired format. + * + * @param value input parameter + * @return parsed property + */ abstract FieldType parse(String value); + /** + * Validate if the data has the desired and allowed format. + * + * @param result parsed property + * @return true if data is in desired format. + */ abstract boolean isValid(FieldType result); + /** + * Sets valid properties to {@link Config} via reflections. + * + * @param result parsed property + * @return false if method invocation failed + */ protected boolean setValue(FieldType result) { List methods = Arrays.stream(Config.getInstance().getClass().getDeclaredMethods()) .filter(containsSetterOf(property)) diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidator.java index 9508049..4095921 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidator.java @@ -9,6 +9,8 @@ import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix.MKV_MER import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix.MKV_PROP_EDIT; public class MkvToolNixPathValidator extends PathValidator { + private static final String EXE = ".exe"; + public MkvToolNixPathValidator(ConfigProperty property, boolean required, File defaultValue) { super(property, required, defaultValue); } @@ -16,8 +18,9 @@ public class MkvToolNixPathValidator extends PathValidator { @Override protected boolean isValid(File result) { return result.isDirectory() - && Path.of(result.getAbsolutePath() + "/" + MKV_MERGER + ".exe").toFile().isFile() - && Path.of(result.getAbsolutePath() + "/" + MKV_PROP_EDIT+ ".exe").toFile().isFile(); - // TODO: make linux compatible + && (Path.of(result.getAbsolutePath() + "/" + MKV_MERGER + EXE).toFile().isFile() + && Path.of(result.getAbsolutePath() + "/" + MKV_PROP_EDIT + EXE).toFile().isFile()) + || (Path.of(result.getAbsolutePath() + "/" + MKV_MERGER).toFile().isFile() + && Path.of(result.getAbsolutePath() + "/" + MKV_PROP_EDIT).toFile().isFile()); } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/OperatingSystemValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/OperatingSystemValidator.java index c00fb72..57a518c 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/OperatingSystemValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/OperatingSystemValidator.java @@ -12,6 +12,9 @@ public class OperatingSystemValidator extends BooleanValidator { super(property, false); } + /** + * Gather operating system from system properties. + */ @Override public ValidationResult validate(YAML yaml, CommandLine cmd) { System.out.printf("%s: ", property.prop()); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidator.java index c91c60d..3cc712d 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidator.java @@ -11,11 +11,17 @@ public class PathValidator extends ConfigValidator { super(property, required, defaultValue); } + /** + * {@inheritDoc} + */ @Override protected File parse(String value) { return Path.of(value).toFile(); } + /** + * {@inheritDoc} + */ @Override protected boolean isValid(File result) { return result.isDirectory() || result.isFile(); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidator.java index a3c3f3b..d2c0f1e 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidator.java @@ -12,6 +12,9 @@ public class PatternValidator extends ConfigValidator { super(property, required, defaultValue); } + /** + * {@inheritDoc} + */ @Override Pattern parse(String value) { try { @@ -21,6 +24,9 @@ public class PatternValidator extends ConfigValidator { } } + /** + * {@inheritDoc} + */ @Override boolean isValid(Pattern result) { return !result.equals(EMPTY_PATTERN); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidator.java index f63ff3e..796513f 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidator.java @@ -35,7 +35,7 @@ public class SetValidator extends ConfigValidator> { System.out.println("missing"); return ValidationResult.MISSING; } else { - System.out.println("not present"); + System.out.println("ok"); return ValidationResult.NOT_PRESENT; } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidator.java index 32a7134..8d3e5cb 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidator.java @@ -8,11 +8,17 @@ public class ThreadValidator extends ConfigValidator{ super(property, required, defaultValue); } + /** + * {@inheritDoc} + */ @Override Integer parse(String value) { return NumberUtils.isParsable(value) ? Integer.parseInt(value) : defaultValue; } + /** + * {@inheritDoc} + */ @Override boolean isValid(Integer result) { return result > 0; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java index f4d8908..475f591 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java @@ -1,6 +1,7 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; import lombok.AllArgsConstructor; +import org.apache.commons.cli.Option; import java.util.Arrays; import java.util.HashSet; @@ -9,36 +10,41 @@ import java.util.stream.Collectors; @AllArgsConstructor public enum ConfigProperty { - CONFIG_PATH("config-path", "p", "Path to config file"), - LIBRARY("library", "l", "Path to library"), - SAFE_MODE("safe-mode", "s", "Test run (no files will be changes)"), - WINDOWS("windows", null, "Is operating system windows"), - THREADS("threads", "t", "thread count (default: 2)"), - INCLUDE_PATTERN("include-pattern", "i", "Include files matching pattern"), - MKV_TOOL_NIX("mkvtoolnix", "m", "Path to mkv tool nix installation"), - FORCED_KEYWORDS("forcedKeywords", "fk", "Additional keywords to identify forced tracks"), - COMMENTARY_KEYWORDS("commentary-keywords", "ck", "Additional keywords to identify commentary tracks"), - EXCLUDE_DIRECTORY("exclude-directories", "e", "Directories to be excluded, combines with config file"), - COHERENT("coherent", "c", "Try to match whole series with same config"), - HELP("help", "h", "\"for help this is\" - Yoda"), - VERSION("version", "v", "Display version"), - ARGUMENTS("arguments", null, "List of arguments"), - ATTRIBUTE_CONFIG("attribute-config", "a", "Attribute config to decide which tracks to choose when"); + CONFIG_PATH("config-path", "Path to config file", "p", 1), + LIBRARY("library", "Path to library", "l", 1), + SAFE_MODE("safe-mode", "Test run (no files will be changes)", "s", 0), + WINDOWS("windows", "Is operating system windows", null, 0), + THREADS("threads", "thread count (default: 2)", "t", 1), + INCLUDE_PATTERN("include-pattern", "Include files matching pattern", "i", 1), + MKV_TOOL_NIX("mkvtoolnix", "Path to mkv tool nix installation", "m", 1), + FORCED_KEYWORDS("forcedKeywords", "Additional keywords to identify forced tracks", "fk", Option.UNLIMITED_VALUES), + COMMENTARY_KEYWORDS("commentary-keywords", "Additional keywords to identify commentary tracks", "ck", Option.UNLIMITED_VALUES), + EXCLUDE_DIRECTORY("exclude-directories", "Directories to be excluded, combines with config file", "e", 1), + COHERENT("coherent", "Try to match whole series with same config", "c", 0), + HELP("help", "\"for help this is\" - Yoda", "h", 0), + VERSION("version", "Display version", "v", 0), + ARGUMENTS("arguments", "List of arguments", null, 0), + ATTRIBUTE_CONFIG("attribute-config", "Attribute config to decide which tracks to choose when", "a", 1); private final String property; - private final String shortParameter; private final String description; + private final String shortParameter; + private final int args; public String prop() { return property; } + public String desc() { + return description; + } + public String abrv() { return shortParameter; } - public String desc() { - return description; + public int args() { + return args; } /* diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java index 49a1974..99acefd 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java @@ -12,7 +12,7 @@ public class ResultStatistic { "├─ No suitable config found: %s%n" + "├─ Already fit config: %s%n" + "└─ Failed: %s%n" + - "Runtime: %ss"; + "Runtime: %s"; private int filesTotal = 0; @@ -64,9 +64,26 @@ public class ResultStatistic { runtime = System.currentTimeMillis() - startTime; } + private String formatTimer() { + int seconds = (int) (runtime / 1000); + int minutes = seconds / 60; + int hours = minutes / 60; + int days = hours / 24; + + if (days >= 1) { + return String.format("%sd %sh %sm %ss", days, hours % 24, minutes % 60, seconds % 60); + } else if (hours >= 1) { + return String.format("%sh %sm %ss", hours, minutes % 60, seconds % 60); + } else if (minutes >= 1) { + return String.format("%sm %ss", minutes , seconds % 60); + } else { + return String.format("%ss", seconds % 60); + } + } + @Override public String toString() { return String.format(result, filesTotal, shouldChange, failedChanging, successfullyChanged, - noSuitableConfigFound, alreadyFits, failed, runtime / 1000); + noSuitableConfigFound, alreadyFits, failed, formatTimer()); } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/CommandLineOptionsUtil.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/CommandLineOptionsUtil.java index 95607ac..3b887a8 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/CommandLineOptionsUtil.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/CommandLineOptionsUtil.java @@ -4,8 +4,8 @@ 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, int args) { + return optionOf(property, opt, args, false); } public static Option optionOf(ConfigProperty property, String opt, boolean hasArg, boolean required) { diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java new file mode 100644 index 0000000..06abc24 --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java @@ -0,0 +1,30 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.nio.file.Path; + +class ConfigTest { + private static final File TEST_MKVTOOLNIX_DIR = Path.of("src/test/resources/mkvtoolnix").toFile(); + private static final File TEST_MKVTOOLNIX_EXE_DIR = Path.of("src/test/resources/mkvtoolnix_exe").toFile(); + + @Test + void getPathForWindows() { + Config.getInstance().setWindows(true); + Config.getInstance().setMkvToolNix(TEST_MKVTOOLNIX_EXE_DIR); + + assert Config.getInstance().getPathFor(MkvToolNix.MKV_MERGER).endsWith(MkvToolNix.MKV_MERGER + ".exe"); + assert Config.getInstance().getPathFor(MkvToolNix.MKV_PROP_EDIT).endsWith(MkvToolNix.MKV_PROP_EDIT + ".exe"); + } + + @Test + void getPathForUnix() { + Config.getInstance().setWindows(false); + Config.getInstance().setMkvToolNix(TEST_MKVTOOLNIX_DIR); + + assert Config.getInstance().getPathFor(MkvToolNix.MKV_MERGER).endsWith(MkvToolNix.MKV_MERGER.toString()); + assert Config.getInstance().getPathFor(MkvToolNix.MKV_PROP_EDIT).endsWith(MkvToolNix.MKV_PROP_EDIT.toString()); + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidatorTest.java index 58a0e2f..9427272 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidatorTest.java @@ -32,7 +32,7 @@ class AttributeConfigValidatorTest { static void before() { parser = new DefaultParser(); options = new Options(); - options.addOption(optionOf(ATTRIBUTE_CONFIG, ATTRIBUTE_CONFIG.abrv(), true)); + options.addOption(optionOf(ATTRIBUTE_CONFIG, ATTRIBUTE_CONFIG.abrv(), ATTRIBUTE_CONFIG.args())); } @BeforeEach diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidatorTest.java index e974c50..15411c6 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidatorTest.java @@ -29,7 +29,7 @@ class BooleanValidatorTest { static void before() { parser = new DefaultParser(); options = new Options(); - options.addOption(optionOf(SAFE_MODE, SAFE_MODE.abrv(), false)); + options.addOption(optionOf(SAFE_MODE, SAFE_MODE.abrv(), SAFE_MODE.args())); } private static Stream provideTestCases() { diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidatorTest.java index 22c3af7..5cbaa41 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidatorTest.java @@ -35,7 +35,7 @@ class ConfigPathValidatorTest { static void before() { parser = new DefaultParser(); options = new Options(); - options.addOption(optionOf(CONFIG_PATH, CONFIG_PATH.abrv(), true)); + options.addOption(optionOf(CONFIG_PATH, CONFIG_PATH.abrv(), CONFIG_PATH.args())); } private static Stream provideTestCases() { diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidatorTest.java index 6e5d262..fb66685 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidatorTest.java @@ -24,6 +24,10 @@ import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsU import static org.junit.jupiter.api.Assertions.*; class MkvToolNixPathValidatorTest { + private static final String TEST_INVALID_DIR = "src/test/resources/test-dir"; + private static final String TEST_MKVTOOLNIX_DIR = "src/test/resources/mkvtoolnix"; + private static final String TEST_MKVTOOLNIX_EXE_DIR = "src/test/resources/mkvtoolnix_exe"; + private static CommandLineParser parser; private static Options options; @@ -31,19 +35,19 @@ class MkvToolNixPathValidatorTest { static void before() { parser = new DefaultParser(); options = new Options(); - options.addOption(optionOf(MKV_TOOL_NIX, MKV_TOOL_NIX.abrv(), true)); + options.addOption(optionOf(MKV_TOOL_NIX, MKV_TOOL_NIX.abrv(), MKV_TOOL_NIX.args())); } private static Stream provideTestCases() { return Stream.of( - Arguments.of(MKV_TOOL_NIX, false, null, "", new String[]{"-m", "\"C:\\Program Files\\MKVToolNix\""}, VALID), - Arguments.of(MKV_TOOL_NIX, true, null, "", new String[]{"-m", "\"C:\\Program Files\\MKVToolNix\""}, VALID), - Arguments.of(MKV_TOOL_NIX, false, null, "mkvtoolnix: C:\\Program Files\\MKVToolNix", new String[]{}, VALID), - Arguments.of(MKV_TOOL_NIX, true, null, "mkvtoolnix: C:\\Program Files\\MKVToolNix", new String[]{}, VALID), - Arguments.of(MKV_TOOL_NIX, false, Path.of("C:\\Program Files\\MKVToolNix").toFile(), "", new String[]{}, DEFAULT), + Arguments.of(MKV_TOOL_NIX, false, null, "", new String[]{"-m", TEST_MKVTOOLNIX_DIR}, VALID), + Arguments.of(MKV_TOOL_NIX, true, null, "", new String[]{"-m", TEST_MKVTOOLNIX_EXE_DIR}, VALID), + Arguments.of(MKV_TOOL_NIX, false, null, "mkvtoolnix: " + TEST_MKVTOOLNIX_EXE_DIR, new String[]{}, VALID), + Arguments.of(MKV_TOOL_NIX, true, null, "mkvtoolnix: " + TEST_MKVTOOLNIX_DIR, new String[]{}, VALID), + Arguments.of(MKV_TOOL_NIX, false, Path.of(TEST_MKVTOOLNIX_EXE_DIR).toFile(), "", new String[]{}, DEFAULT), Arguments.of(MKV_TOOL_NIX, false, null, "", new String[]{}, NOT_PRESENT), Arguments.of(MKV_TOOL_NIX, true, null, "", new String[]{}, MISSING), - Arguments.of(MKV_TOOL_NIX, true, null, "", new String[]{"-m", "\"C:\\Program Files\\MKVTool\""}, INVALID) + Arguments.of(MKV_TOOL_NIX, true, null, "", new String[]{"-m", TEST_INVALID_DIR}, INVALID) ); } diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java index 6a03791..4e91a56 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java @@ -34,7 +34,7 @@ class PathValidatorTest { static void before() { parser = new DefaultParser(); options = new Options(); - options.addOption(optionOf(LIBRARY, LIBRARY.abrv(), true)); + options.addOption(optionOf(LIBRARY, LIBRARY.abrv(), LIBRARY.args())); } private static Stream provideTestCases() { diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java index 30c1ed3..cae1059 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java @@ -31,7 +31,7 @@ class PatternValidatorTest { static void before() { parser = new DefaultParser(); options = new Options(); - options.addOption(optionOf(INCLUDE_PATTERN, INCLUDE_PATTERN.abrv(), true)); + options.addOption(optionOf(INCLUDE_PATTERN, INCLUDE_PATTERN.abrv(), INCLUDE_PATTERN.args())); } private static Stream provideTestCases() { diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidatorTest.java index ea1eb62..0a82951 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidatorTest.java @@ -32,7 +32,7 @@ class SetValidatorTest { static void before() { parser = new DefaultParser(); options = new Options(); - options.addOption(optionOf(COMMENTARY_KEYWORDS, COMMENTARY_KEYWORDS.abrv(), true)); + options.addOption(optionOf(COMMENTARY_KEYWORDS, COMMENTARY_KEYWORDS.abrv(), COMMENTARY_KEYWORDS.args())); } @BeforeEach @@ -46,7 +46,6 @@ class SetValidatorTest { argumentsOf(COMMENTARY_KEYWORDS, true, false, COMMENTARY_KEYWORDS.prop() + ": [test]", new String[]{}, VALID, 1), argumentsOf(COMMENTARY_KEYWORDS, false, true, COMMENTARY_KEYWORDS.prop() + ": [test]", new String[]{}, VALID, 3), argumentsOf(COMMENTARY_KEYWORDS, false, false, "", new String[]{"-ck", "test"}, VALID, 1), - argumentsOf(COMMENTARY_KEYWORDS, true, true, COMMENTARY_KEYWORDS.prop() + ": [commentary]", new String[]{}, VALID, 2), argumentsOf(COMMENTARY_KEYWORDS, true, true, "", new String[]{}, MISSING, 2), diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidatorTest.java index 2f90538..d3d5dd3 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidatorTest.java @@ -30,7 +30,7 @@ class ThreadValidatorTest { static void before() { parser = new DefaultParser(); options = new Options(); - options.addOption(optionOf(THREADS, "t", true)); + options.addOption(optionOf(THREADS, "t", THREADS.args())); } private static Stream provideTestCases() { diff --git a/src/test/resources/mkvmerge.exe b/src/test/resources/mkvtoolnix/mkvmerge similarity index 100% rename from src/test/resources/mkvmerge.exe rename to src/test/resources/mkvtoolnix/mkvmerge diff --git a/src/test/resources/mkvpropedit.exe b/src/test/resources/mkvtoolnix/mkvpropedit similarity index 100% rename from src/test/resources/mkvpropedit.exe rename to src/test/resources/mkvtoolnix/mkvpropedit diff --git a/src/test/resources/mkvtoolnix_exe/mkvmerge.exe b/src/test/resources/mkvtoolnix_exe/mkvmerge.exe new file mode 100644 index 0000000..e69de29 diff --git a/src/test/resources/mkvtoolnix_exe/mkvpropedit.exe b/src/test/resources/mkvtoolnix_exe/mkvpropedit.exe new file mode 100644 index 0000000..e69de29