diff --git a/config-template.yaml b/config-template.yaml index c7174b9..c2338ea 100644 --- a/config-template.yaml +++ b/config-template.yaml @@ -1,4 +1,4 @@ -mkvtoolnixPath: C:\Program Files\MKVToolNix +mkvtoolnix: C:\Program Files\MKVToolNix # Recommendations for data stored on HDDs, increase when using SSDs threads: 2 #forcedKeywords: ["forced", "signs"] diff --git a/language-codes b/language-codes new file mode 100644 index 0000000..232f224 --- /dev/null +++ b/language-codes @@ -0,0 +1,487 @@ +aar +abk +ace +ach +ada +ady +afa +afh +afr +ain +aka +akk +alb +ale +alg +alt +ang +amh +anp +apa +ara +arc +arg +arm +arn +arp +art +arw +asm +ast +ath +aus +ava +ave +awa +aym +aze +bad +bai +bak +bal +bam +ban +baq +bas +bat +bej +bel +bem +ben +ber +bho +bih +bik +bin +bis +bla +bnt +bos +bra +bre +btk +bua +bug +bul +bur +byn +cad +cai +car +cat +cau +ceb +cel +cha +chb +che +chg +chi +chk +chm +chn +cho +chp +chr +chu +chv +chy +cmc +cnr +cop +cor +cos +cpe +cpf +cpp +cre +crh +crp +csb +cus +cze +dak +dan +dar +day +del +den +dgr +din +div +doi +dra +dsb +dua +dum +dut +dyu +dzo +efi +egy +eka +elx +eng +enm +epo +est +ewe +ewo +fan +fao +fat +fij +fil +fin +fiu +fon +fre +frm +fro +frr +frs +fry +ful +fur +gaa +gay +gba +gem +geo +ger +gez +gil +gla +gle +glg +glv +gmh +goh +gon +gor +got +grb +grc +gre +grn +gsw +guj +gwi +hai +hat +hau +haw +heb +her +hil +him +hin +hit +hmn +hmo +hrv +hsb +hun +hup +iba +ibo +ice +ido +iii +ijo +iku +ile +ilo +ina +inc +ind +ine +inh +ipk +ira +iro +ita +jav +jbo +jpn +jpr +jrb +kaa +kab +kac +kal +kam +kan +kar +kas +kau +kaw +kaz +kbd +kha +khi +khm +kho +kik +kin +kir +kmb +kok +kom +kon +kor +kos +kpe +krc +krl +kro +kru +kua +kum +kur +kut +lad +lah +lam +lao +lat +lav +lez +lim +lin +lit +lol +loz +ltz +lua +lub +lug +lui +lun +luo +lus +mac +mad +mag +mah +mai +mak +mal +man +mao +map +mar +mas +may +mdf +mdr +men +mga +mic +min +mis +mkh +mlg +mlt +mnc +mni +mno +moh +mon +mos +mul +mun +mus +mwl +mwr +myn +myv +nah +nai +nap +nau +nav +nbl +nde +ndo +nds +nep +new +nia +nic +niu +nno +nob +nog +non +nor +nqo +nso +nub +nwc +nya +nym +nyn +nyo +nzi +oci +oji +ori +orm +osa +oss +ota +oto +paa +pag +pal +pam +pan +pap +pau +peo +per +phi +phn +pli +pol +pon +por +pra +pro +pus +que +raj +rap +rar +roa +roh +rom +rum +run +rup +rus +sad +sag +sah +sai +sal +sam +san +sas +sat +scn +sco +sel +sem +sga +sgn +shn +sid +sin +sio +sit +sla +slo +slv +sma +sme +smi +smj +smn +smo +sms +sna +snd +snk +sog +som +son +sot +spa +srd +srn +srp +srr +ssa +ssw +suk +sun +sus +sux +swa +swe +syc +syr +tah +tai +tam +tat +tel +tem +ter +tet +tgk +tgl +tha +tib +tig +tir +tiv +tkl +tlh +tli +tmh +tog +ton +tpi +tsi +tsn +tso +tuk +tum +tup +tur +tut +tvl +twi +tyv +udm +uga +uig +ukr +umb +und +urd +uzb +vai +ven +vie +vol +vot +wak +wal +war +was +wel +wen +wln +wol +xal +xho +yao +yap +yid +yor +ypk +zap +zbl +zen +zgh +zha +znd +zul +zun +zxx +zza +OFF \ No newline at end of file diff --git a/pom.xml b/pom.xml index 69584ec..65e1b37 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,12 @@ src/main/resources + + ./ + + language-codes + + @@ -76,8 +82,8 @@ org.apache.maven.plugins maven-compiler-plugin - 9 - 9 + 11 + 11 diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java index 0c30167..6e26216 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java @@ -4,64 +4,12 @@ import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileCollector; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileProcessor; import lombok.extern.log4j.Log4j2; -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 public class Main { public static void main(String[] args) { - initConfig(args); + Config.getInstance().initConfig(args); AttributeUpdaterKernel kernel = new AttributeUpdaterKernel(new MkvFileCollector(), new MkvFileProcessor()); kernel.execute(); } - - private static void initConfig(String[] args) { - Options options = initOptions(); - CommandLineParser parser = new DefaultParser(); - HelpFormatter formatter = new HelpFormatter(); - try { - CommandLine cmd = parser.parse(options, args); - - if (cmd.hasOption("help")) { - formatter.printHelp("java -jar MKVAudioSubtitlesChanger.jar -p ", options); - System.exit(0); - } - - Config config = Config.getInstance(); - 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.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()))); - if (cmd.hasOption(INCLUDE_PATTERN.prop())) { - config.setIncludePattern(Config.compilePattern(cmd.getOptionValue(INCLUDE_PATTERN.prop()), INCLUDE_PATTERN)); - } - config.isValid(); - } catch (ParseException e) { - log.error(e); - formatter.printHelp("java -jar MKVAudioSubtitlesChanger.jar -p ", options); - System.exit(1); - } - } - - 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)); - options.addOption(optionOf(INCLUDE_PATTERN, "i", true)); - 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 7a056a5..7209343 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java @@ -1,45 +1,57 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix; import at.pcgamingfreaks.yaml.YAML; import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import at.pcgamingfreaks.yaml.YamlKeyNotFoundException; import lombok.AccessLevel; import lombok.Getter; -import lombok.Setter; +import lombok.SneakyThrows; import lombok.extern.log4j.Log4j2; +import org.apache.commons.cli.*; import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.function.Function; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import java.util.stream.Collectors; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.LanguageValidatorUtil.isLanguageValid; @Log4j2 @Getter -@Setter public class Config { @Getter(AccessLevel.NONE) - @Setter(AccessLevel.NONE) + CommandLineParser parser = new DefaultParser(); + @Getter(AccessLevel.NONE) + HelpFormatter formatter = new HelpFormatter(); + + @Getter(AccessLevel.NONE) private static Config config = null; - private List attributeConfig; - private int threadCount; - private Set forcedKeywords = new HashSet<>(Arrays.asList("forced", "signs")); - private Set excludedDirectories = new HashSet<>(); - private Pattern includePattern; - @Getter(AccessLevel.NONE) - private String mkvtoolnixPath; + private File configPath; private String libraryPath; private boolean isSafeMode; + + private int threadCount; + private Pattern includePattern; + @Getter(AccessLevel.NONE) + private String mkvToolNixPath; + private boolean isWindows; + private final Set forcedKeywords = new HashSet<>(Arrays.asList("forced", "signs")); + private final Set excludedDirectories = new HashSet<>(); + + private List attributeConfig; + public static Config getInstance() { if (config == null) { config = new Config(); @@ -47,99 +59,155 @@ public class Config { return config; } - public void isValid() throws RuntimeException { - boolean isValid = true; - if (attributeConfig == null || attributeConfig.isEmpty() - || !attributeConfig.stream().allMatch(AttributeConfig::isValid)) { - isValid = false; - System.out.println("Audio & subtitle configuration invalid!"); - } - if (threadCount <= 0) { - isValid = false; - System.out.println("Thread count needs to be at least 1!"); - } - if (mkvtoolnixPath.isEmpty() - || !new File(getPathFor(MkvToolNix.MKV_MERGER)).isFile() - || !new File(getPathFor(MkvToolNix.MKV_PROP_EDIT)).isFile()) { - isValid = false; - System.out.println("MkvToolNix installation path invalid!"); + public void initConfig(String[] args) throws InvalidConfigException { + ConfigErrors errors = new ConfigErrors(); + CommandLine cmd = null; + Options options = initOptions(); + + try { + cmd = parser.parse(options, args); + if (cmd == null) throw new NullPointerException(); + } catch (ParseException | NullPointerException e) { + formatter.printHelp(106, "java -jar MKVAudioSubtitlesChanger.jar -l ", + "\nParameters:", options, + "\nFeature requests and bug reports: https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/issues"); + System.exit(1); } - if (!isValid) { - throw new RuntimeException("Invalid configuration"); + exitIfHelp(cmd, options); + + configPath = loadConfigPath(cmd, errors); + libraryPath = loadLibraryPath(cmd, errors); + isSafeMode = cmd.hasOption(SAFE_MODE.prop()); + + try (YAML config = new YAML(configPath)) { + threadCount = loadThreadCount(cmd, config); + includePattern = loadIncludePattern(cmd, config, errors); + mkvToolNixPath = loadMkvToolNixPath(cmd, config, errors); + + isWindows = loadOperatingSystem(); + + loadForcedKeywords(cmd, config); + loadExcludedDirectories(cmd, config); + + attributeConfig = loadAttributeConfig(config, errors); + } catch (IOException | YamlInvalidContentException ignored) {} + + if (errors.hasErrors()) { + throw new InvalidConfigException(errors); } } - public void loadConfig(String configPath) { - try (YAML config = new YAML(new File(configPath))) { - setAttributeConfig(loadAttributeConfig(config)); - setThreadCount(loadThreadCount(config)); - setMkvtoolnixPath(loadMkvToolNixPath(config)); - setWindows(System.getProperty("os.name").toLowerCase().contains("windows")); - getForcedKeywords().addAll(loadForcedKeywords(config)); - getExcludedDirectories().addAll(loadExcludeDirectories(config)); - loadIncludePattern(config); - } catch (YamlInvalidContentException | YamlKeyNotFoundException | IOException e) { - log.fatal("Config could not be loaded: {}", e.getMessage()); + private static Options initOptions() { + Options options = new Options(); + options.addOption(optionOf(HELP, "h", 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)); + return options; + } + + private void exitIfHelp(CommandLine cmd, Options options) { + if (cmd.hasOption("help")) { + formatter.printHelp(106, "java -jar MKVAudioSubtitlesChanger.jar -l ", + "\nParameters:", options, + "\nFeature requests and bug reports: https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/issues"); + System.exit(0); } } - private List loadAttributeConfig(YAML config) { + private File loadConfigPath(CommandLine cmd, ConfigErrors errors) { + File configPath = new File(cmd.getOptionValue(CONFIG_PATH.prop(), "config.yaml")); + if (configPath.isFile()) return configPath; + + errors.add("invalid config path"); + return null; + } + + private String loadLibraryPath(CommandLine cmd, ConfigErrors errors) { + if (cmd.hasOption(LIBRARY.prop())) { + File libraryPath = new File(cmd.getOptionValue(LIBRARY.prop())); + if (libraryPath.isFile() || libraryPath.isDirectory()) { + return libraryPath.getAbsolutePath(); + } else { + errors.add("invalid library path"); + } + } else { + errors.add("missing library path"); + } + return null; + } + + private int loadThreadCount(CommandLine cmd, YAML config) { + return cmd.hasOption(THREADS.prop()) + ? Integer.parseInt(cmd.getOptionValue(THREADS.prop())) + : config.getInt(THREADS.prop(), 2); + } + + private Pattern loadIncludePattern(CommandLine cmd, YAML config, ConfigErrors errors) { + try { + return Pattern.compile(cmd.hasOption(INCLUDE_PATTERN.prop()) + ? cmd.getOptionValue(INCLUDE_PATTERN.prop()) + : config.getString(INCLUDE_PATTERN.prop(), ".*")); + } catch (PatternSyntaxException e) { + errors.add("invalid regex pattern"); + } + return null; + } + + @SneakyThrows + private String loadMkvToolNixPath(CommandLine cmd, YAML config, ConfigErrors errors){ + if (cmd.hasOption(MKV_TOOL_NIX.prop())) return cmd.getOptionValue(MKV_TOOL_NIX.prop()); + if (config.isSet(MKV_TOOL_NIX.prop())) return config.getString(MKV_TOOL_NIX.prop()); + errors.add("path to mkv tool nix installation missing"); + return null; + } + + private boolean loadOperatingSystem() { + return System.getProperty("os.name").toLowerCase().contains("windows"); + } + + @SneakyThrows + private void loadForcedKeywords(CommandLine cmd, YAML config) { + if (cmd.hasOption(FORCED_KEYWORDS.prop())) forcedKeywords.addAll(List.of(cmd.getOptionValues(FORCED_KEYWORDS.prop()))); + if (config.isSet(FORCED_KEYWORDS.prop())) forcedKeywords.addAll(config.getStringList(FORCED_KEYWORDS.prop())); + } + + @SneakyThrows + private void loadExcludedDirectories(CommandLine cmd, YAML config) { + if (cmd.hasOption(EXCLUDE_DIRECTORY.prop())) excludedDirectories.addAll(List.of(cmd.getOptionValues(EXCLUDE_DIRECTORY.prop()))); + if (config.isSet(EXCLUDE_DIRECTORY.prop())) excludedDirectories.addAll(config.getStringList(EXCLUDE_DIRECTORY.prop())); + } + + private List loadAttributeConfig(YAML config, ConfigErrors errors) { Function audio = key -> config.getString(key + ".audio", null); Function subtitle = key -> config.getString(key + ".subtitle", null); - return config.getKeysFiltered(".*audio.*").stream() + List attributeConfigs = config.getKeysFiltered(".*audio.*").stream() .sorted() .map(key -> key.replace(".audio", "")) .map(key -> new AttributeConfig(audio.apply(key), subtitle.apply(key))) .collect(Collectors.toList()); - } - private int loadThreadCount(YAML config) throws YamlKeyNotFoundException { - 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.prop(), new ArrayList<>()); - } - - private List loadExcludeDirectories(YAML config) { - return config.getStringList(ConfigProperty.EXCLUDE_DIRECTORY.prop(), new ArrayList<>()); - } - - private void loadIncludePattern(YAML config) throws YamlKeyNotFoundException { - if (config.isSet(INCLUDE_PATTERN.prop())) { - includePattern = compilePattern(config.getString(INCLUDE_PATTERN.prop()), INCLUDE_PATTERN); + if (attributeConfigs.isEmpty()) { + errors.add("no language configuration"); } else { - includePattern = Pattern.compile(".*"); + for (AttributeConfig attributeConfig : attributeConfigs) { + isLanguageValid(attributeConfig.getAudioLanguage(), errors); + isLanguageValid(attributeConfig.getSubtitleLanguage(), errors); + } } - } - public static Pattern compilePattern(String pattern, ConfigProperty origin) { - try { - return Pattern.compile(pattern); - } catch (PatternSyntaxException e) { - log.error("{} is not a valid regex pattern!", origin.prop()); - throw new RuntimeException(String.format("%s is not a valid regex pattern!%n", origin.prop())); - } - } - - private String loadMkvToolNixPath(YAML config) throws YamlKeyNotFoundException { - return config.isSet(MKV_TOOL_NIX.prop()) - ? config.getString(MKV_TOOL_NIX.prop()) - : defaultMkvToolNixPath(); - } - - private String defaultMkvToolNixPath() { - return System.getProperty("os.name").toLowerCase().contains("windows") - ? "C:/Program Files/MKVToolNix/" - : "/usr/bin/"; + return attributeConfigs; } public String getPathFor(MkvToolNix exe) { - return mkvtoolnixPath.endsWith("/") ? mkvtoolnixPath + exe : mkvtoolnixPath + "/" + exe; + return mkvToolNixPath.endsWith("/") ? mkvToolNixPath + exe : mkvToolNixPath + "/" + exe; } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigErrors.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigErrors.java new file mode 100644 index 0000000..50cecae --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigErrors.java @@ -0,0 +1,22 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +public class ConfigErrors { + private final List errors = new ArrayList<>(); + + public void add(String errorMessage) { + errors.add(errorMessage); + } + + public boolean hasErrors() { + return !errors.isEmpty(); + } + + public String toString() { + return StringUtils.capitalize(String.join(", ", errors)); + } +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InvalidConfigException.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InvalidConfigException.java new file mode 100644 index 0000000..9a42eb9 --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/InvalidConfigException.java @@ -0,0 +1,7 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +public class InvalidConfigException extends RuntimeException{ + public InvalidConfigException(ConfigErrors errors) { + super("Errors in config: " + errors); + } +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java index afd685f..fc68e25 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java @@ -14,10 +14,6 @@ public class AttributeConfig { this.subtitleLanguage = subtitleLanguage; } - public boolean isValid() { - return audioLanguage != null && subtitleLanguage != null; - } - @Override public String toString() { final StringBuffer sb = new StringBuffer("AttributeConfig{"); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java index 92433e8..358719d 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java @@ -1,15 +1,15 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; public enum ConfigProperty { - 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"), + CONFIG_PATH("config", "Path to config file"), + 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"), - INCLUDE_PATTERN("include-pattern", "Include files matching pattern"); + THREADS("threads", "thread count (default: 2)"), + INCLUDE_PATTERN("include-pattern", "Include files matching pattern"), + MKV_TOOL_NIX("mkvtoolnix", "Path to mkv tool nix installation"), + FORCED_KEYWORDS("forcedKeywords", "Additional keywords to identify forced tracks, combines with config file"), + EXCLUDE_DIRECTORY("exclude-directories", "Directories to be excluded, combines with config file"), + HELP("help", "\"for help this is\" - Yoda"); private final String property; private final String description; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/LanguageValidatorUtil.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/LanguageValidatorUtil.java new file mode 100644 index 0000000..815e90c --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/LanguageValidatorUtil.java @@ -0,0 +1,44 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.util; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ConfigErrors; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +public class LanguageValidatorUtil { + private static Set ISO3_LANGUAGES; + + static { + try { + ISO3_LANGUAGES = load("language-codes"); + } catch (IOException ignored) {} + } + + private static Set load(String path) throws IOException{ + if (new File(path).isFile()) { + return Files.lines(Path.of(path)).collect(Collectors.toSet()); + } else { + try(BufferedReader bf = new BufferedReader(new InputStreamReader( + Objects.requireNonNull(LanguageValidatorUtil.class.getClassLoader().getResourceAsStream(path))))) { + return bf.lines().collect(Collectors.toSet()); + } + } + } + + public static boolean isLanguageValid(String language) { + return ISO3_LANGUAGES.contains(language); + } + + public static void isLanguageValid(String language, ConfigErrors errors) { + if (!isLanguageValid(language)) { + errors.add(String.format("%s is not a valid language", language)); + } + } +}