diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1746666..ce84512 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,27 +3,35 @@ name: Build and release on: release: - types: [created] + types: [ created ] jobs: - build: + portable-build: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 + - name: Install mkvtoolnix + run: sudo apt-get install -y mkvtoolnix - - name: Set up JDK 11 - uses: actions/setup-java@v2 + - name: Checkout + uses: actions/checkout@v4 + + - name: Set timezone + uses: szenius/set-timezone@v2.0 + with: + timezoneLinux: "Europe/Berlin" + + - name: Set up JDK 17 + uses: actions/setup-java@v4.7.0 with: distribution: temurin - java-version: 11 + java-version: 17 - name: Setup workspace run: mkdir artifacts - name: Build with Maven run: | - mvn clean package --file pom.xml + mvn clean package --file pom.xml -P portable cp target/M*.{zip,tar} artifacts/ - name: Upload artifacts @@ -32,4 +40,72 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: args: 'artifacts/M*' - + + debian-build: + runs-on: ubuntu-latest + steps: + - name: Install mkvtoolnix + run: sudo apt-get install -y mkvtoolnix + + - name: Checkout + uses: actions/checkout@v4 + + - name: Set timezone + uses: szenius/set-timezone@v2.0 + with: + timezoneLinux: "Europe/Berlin" + + - name: Set up JDK 17 + uses: actions/setup-java@v4.7.0 + with: + distribution: temurin + java-version: 17 + + - name: Setup workspace + run: mkdir artifacts + + - name: Build with Maven + run: | + mvn clean package --file pom.xml -P linux + cp target/M*.deb artifacts/ + + - name: Upload artifacts + uses: skx/github-action-publish-binaries@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: 'artifacts/M*' + + windows-installer-build: + runs-on: windows-latest + steps: + - name: Install mkvtoolnix + uses: crazy-max/ghaction-chocolatey@v3 + with: + args: install mkvtoolnix -y + + - name: Checkout + uses: actions/checkout@v4 + + - name: Set timezone + uses: szenius/set-timezone@v2.0 + with: + timezoneWindows: "Berlin Standard Time" + + - name: Set up JDK 21 + uses: actions/setup-java@v4.7.0 + with: + distribution: temurin + java-version: 21 + + - name: Setup workspace + run: mkdir artifacts + + - name: Build with Maven + run: mvn clean package --file pom.xml -P windows + + - name: Upload artifacts + uses: AButler/upload-release-assets@v3.0 + with: + files: 'target/installer/*' + repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index cc6925a..e56618f 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,62 @@ ## Introduction -This program helps to change audio and subtitle tracks of mkv files without rewriting the file. Only track properties will be updated. +A streamlined solution for managing MKV files, this program leverages MKVToolNix to modify audio and subtitle track properties without the need for time-consuming file reencoding. Users can easily set their track preferences, and the application intelligently applies the best matching configuration. The tool focuses on metadata modification rather than full file rewriting, ensuring quick operations while maintaining the original file integrity. This makes it an ideal choice for managing multilingual media collections or batch processing multiple MKV files. + ![](https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/blob/master/example.gif) ## Requirements - - Java 11 or higher + - Java 21 or newer - mkvtoolnix installation ## Execution -**Minimal usage:** -`java -jar mkvaudiosubtitlechanger.jar --library "X:/Files" --attribute-config eng:ger eng:OFF` +### Minimal usage +Portable: `java -jar mkvaudiosubtitlechanger-.jar --library "X:/Files" --attribute-config eng:ger eng:OFF` -**Safe usage (best for testing before applying to whole library):** -`java -jar mkvaudiosubtitlechanger.jar --library "X:/Files" --attribute-config eng:ger eng:OFF --safe-mode` +Windows (installed): `mkvaudiosubtitlechanger.jar --library "X:/Files" --attribute-config eng:ger eng:OFF` -Attribute-config must be entered in pairs: `audio:subtitle`; Example: `jpn:eng`. More about this topic -[here](https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/wiki/Attribute-Config). +### Safe usage (best for testing before applying to whole library) +Portable: `java -jar mkvaudiosubtitlechanger-.jar --library "X:/Files" --attribute-config eng:ger eng:OFF --safe-mode` + +Windows (installed): `mkvaudiosubtitlechanger.jar --library "X:/Files" --attribute-config eng:ger eng:OFF --safe-mode` + +**Attribute-config must be entered in pairs: `audio:subtitle`; Example: `jpn:eng`. More about this topic +[here](https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/wiki/Attribute-Config).** ## Available parameters ``` - -l,--library-path Path to library - -a,--attribute-config Attribute config to decide which tracks to choose when - -p,--config-path Path to config file - -m,--mkvtoolnix Path to mkv tool nix installation - -s,--safe-mode Test run (no files will be changes) - -c,--coherent Try to match all files in dir of depth with the same config - -cf,--force-coherent Force coherent and don't update anything if config fits not whole config (default: false) - -n,--only-new-files Sets filter-date to last successful execution (Overwrites input of filter-date) - -d,--filter-date Only consider files created newer than entered date (format: "dd.MM.yyyy-HH:mm:ss") - -t,--threads Thread count (default: 2) - -i,--include-pattern Include files matching pattern (default: ".*") - -e,--excluded-directories Directories to be excluded, combines with config file - -fk,--forced-keywords Additional keywords to identify forced tracks - -ck,--commentary-keywords Additional keywords to identify commentary tracks - -ps,--preferred-subtitles Additional keywords to prefer specific subtitle tracks - -v,--version Display version - -h,--help "For help this is" - Yoda + -a, --attribute-config=... + List of audio:subtitle pairs used to match in order and update files accordingly (e.g. jpn:eng jpn:ger) + -c, --coherent= try to match all files in dir of depth with the same attribute config + -cf, --force-coherent changes are only applied if it's a coherent match + --commentary-keywords=[, ...]... + Keywords to identify commentary tracks (Defaults will be overwritten; Default: commentary, director) + -d, --filter-date= + only consider files created newer than entered date (format: "dd.MM.yyyy-HH:mm:ss") + -e, --excluded-directory=... + Directories to be excluded, combines with config file + --forced-keywords=[, ...]... + Keywords to identify forced tracks (Defaults will be overwritten; Default: forced, signs, songs) + -h, --help Show this help message and exit. + -i, --include-pattern= + include files matching pattern (default: ".*") + -l, --library= + path to library + -m, --mkvtoolnix= + path to mkvtoolnix installation + -n, --only-new-file sets filter-date to last successful execution (overwrites input of filter-date) + --preferred-subtitles=[, ...]... + Keywords to prefer specific subtitle tracks (Defaults will be overwritten; Default: unstyled) + -s, --safemode test run (no files will be changes) + -t, --threads= thread count (default: 2) + -V, --version Print version information and exit. ``` -If you need more information about how each parameter works, check out [this wiki page](https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/wiki/Parameters). +If you need more information how each parameter works, check out [this wiki page](https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/wiki/Parameters-v4). -All parameters can also be defined in a [config file](https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/wiki/How-to-config-file). +All parameters can also be defined in a [config file](https://picocli.info/#_argument_files_for_long_command_lines). ## Build requirements -- JDK 11 or higher +- JDK 21 or newer - Maven 3 - Git @@ -51,5 +64,5 @@ All parameters can also be defined in a [config file](https://github.com/RatzzFa ```shell git clone https://github.com/RatzzFatzz/MKVAudioSubtitleChanger.git cd MKVAudioSubtitleChanger -mvn package +mvn clean package -Pportable ``` diff --git a/config-template.yaml b/config-template.yaml deleted file mode 100644 index df5b473..0000000 --- a/config-template.yaml +++ /dev/null @@ -1,34 +0,0 @@ -mkvtoolnix: C:\Program Files\MKVToolNix -library: X:/Files - -attribute-config: - 1: - audio: ger - subtitle: OFF - 2: - audio: eng - subtitle: ger - -# Recommendations for data stored on HDDs, increase when using SSDs -#threads: 2 - -#forced-keywords: ["forced", "signs"] -#commentary-keywords: ["commentary", "director"] -#preferred-subtitles: ["unstyled"] - -#exclude-directories: -# - "D:/Path/To/File.mkv" -# - "D:/Path/To/Directory" - -# If pattern is negated, can be used to exclude files -#include-pattern: "regex" - -# Only files newer than -#filter-date: 20.03.2021-10:11:12 - -safe-mode: -#coherent: -#force-coherent: -#only-new-files: - - diff --git a/example.gif b/example.gif index 56f56ff..34b9573 100644 Binary files a/example.gif and b/example.gif differ diff --git a/maven/assembly.xml b/maven/assembly.xml index 5d51bfd..4e1a1ba 100644 --- a/maven/assembly.xml +++ b/maven/assembly.xml @@ -14,10 +14,6 @@ ${project.artifactId}.jar / - - ${project.basedir}/config-template.yaml - / - diff --git a/pom.xml b/pom.xml index 575e36e..8b278af 100644 --- a/pom.xml +++ b/pom.xml @@ -6,21 +6,232 @@ at.pcgamingfreaks MKVAudioSubtitleChanger - 3.0.2 + 4.0.0 + + + at.pcgamingfreaks.mkvaudiosubtitlechanger.Main + + RatzzFatzz + github.contact@ratzloeffel.de + Command-line utility for batch-managing default audio and subtitle tracks in MKV files. + + 17 + 1.18.36 + + + + + portable + + + + src/main/resources + + log4j2.yml + log4j2-debug.yml + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + archive + package + + single + + + false + + maven/assembly.xml + + + + + + + + + + windows + + + + src/main/resources + + log4j2-installed.yaml + + + + + + maven-resources-plugin + 3.3.1 + + + copy-jpackage-input + package + + copy-resources + + + ${project.build.directory}/jpackage-input + + + ${project.build.directory} + + ${project.artifactId}-${project.version}.jar + + + + + + + filter-windows-installer-info + package + + copy-resources + + + ${project.build.directory}/wix-resources + + + ${project.basedir}/src/wix/resources + true + + + + + + + + org.panteleyev + jpackage-maven-plugin + 1.6.5 + + ${project.artifactId} + RatzzFatzz + ${project.version} + + target/installer + + target/jpackage-input + at.pcgamingfreaks.mkvaudiosubtitlechanger.Main + ${project.artifactId}-${project.version}.jar + + ${project.build.directory}/wix-resources/ + EXE + true + false + false + + -Dlog4j.configurationFile=log4j2-windows.yaml + + + + + windows + package + + jpackage + + + + + + + + + linux + + + + src/main/resources + + log4j2-debian.yaml + + + + + + maven-resources-plugin + 3.3.1 + + + filter-linux-package-info + package + + copy-resources + + + ${project.build.directory}/debian-package-info + + + ${project.basedir}/src/deb + true + + + + + + + + jdeb + org.vafer + 1.13 + + + package + + jdeb + + + + + + ${project.build.directory}/${project.build.finalName}.jar + file + + perm + /usr/lib/${project.artifactId} + + + + + ${project.build.directory}/debian-package-info/bin/mkvaudiosubtitlechanger + file + + perm + /usr/bin + 755 + + + + ${project.build.directory}/debian-package-info/control + + + + + + + + clean package src/main/java src/test/java - - src/main/resources - ./ language-codes project.properties + LICENSE true @@ -35,11 +246,11 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.2 + 3.4.2 - at/pcgamingfreaks/mkvaudiosubtitlechanger/Main + ${mainClass} @@ -47,7 +258,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.6.0 package @@ -76,35 +287,33 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 + 3.5.2 org.apache.maven.plugins maven-compiler-plugin + 3.13.0 - 11 - 11 + ${java-version} + ${java-version} + + -Aproject=${project.groupId}/${project.artifactId} + + + + org.projectlombok + lombok + ${lombok-version} + + + info.picocli + picocli-codegen + 4.7.6 + + - - org.apache.maven.plugins - maven-assembly-plugin - 3.3.0 - - - package - - single - - - false - - maven/assembly.xml - - - - - + @@ -116,86 +325,139 @@ + com.intellij forms_rt 7.0.3 + org.projectlombok lombok - 1.18.24 + ${lombok-version} provided + + + info.picocli + picocli + 4.7.6 + + + + + + org.hibernate.validator + hibernate-validator + 8.0.2.Final + + + + + + jakarta.el + jakarta.el-api + 6.0.1 + + + + org.glassfish + jakarta.el + 5.0.0-M1 + + + + + + jakarta.validation + jakarta.validation-api + 3.0.2 + + + org.apache.logging.log4j log4j-api - 2.18.0 + 2.24.3 + org.apache.logging.log4j log4j-core - 2.18.0 + 2.24.3 + org.apache.logging.log4j - log4j-slf4j18-impl - 2.18.0 + log4j-slf4j2-impl + 2.24.3 + + com.fasterxml.jackson.dataformat jackson-dataformat-yaml - 2.13.4 + 2.18.2 + + com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.18.2 + commons-cli commons-cli - 1.5.0 + 1.9.0 + org.apache.commons commons-lang3 - 3.12.0 + 3.17.0 + me.tongfei progressbar - 0.9.5 + 0.10.1 + org.junit.jupiter junit-jupiter-api - 5.9.0 + 5.11.4 test + org.junit.jupiter junit-jupiter-engine - 5.9.0 + 5.11.4 test - + org.mockito - mockito-all - 1.10.19 + mockito-core + 5.15.2 test + org.junit.jupiter junit-jupiter-params - 5.9.0 + 5.11.4 test + at.pcgamingfreaks @@ -206,7 +468,7 @@ net.harawata appdirs - 1.2.1 + 1.3.0 diff --git a/src/deb/bin/mkvaudiosubtitlechanger b/src/deb/bin/mkvaudiosubtitlechanger new file mode 100644 index 0000000..19ea12a --- /dev/null +++ b/src/deb/bin/mkvaudiosubtitlechanger @@ -0,0 +1 @@ +java -Dlog4j.configurationFile=log4j2-debian.yaml -jar /usr/lib/${project.artifactId}/${project.artifactId}-${project.version}.jar "$@" \ No newline at end of file diff --git a/src/deb/control/control b/src/deb/control/control new file mode 100644 index 0000000..2c892f9 --- /dev/null +++ b/src/deb/control/control @@ -0,0 +1,8 @@ +Package: ${project.artifactId} +Version: ${project.version} +Section: misc +Priority: optional +Architecture: all +Depends: java-runtime (>=${java-version}), mkvtoolnix +Maintainer: ${project.maintainer} <${project.maintainer.mail}> +Description: ${project.description} \ No newline at end of file diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java index a746649..48aa81a 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java @@ -1,21 +1,69 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger; import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ConfigLoader; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.CachedMkvFileProcessor; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.kernel.AttributeUpdaterKernel; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.kernel.CoherentAttributeUpdaterKernel; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.kernel.DefaultAttributeUpdaterKernel; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileCollector; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.util.ProjectUtil; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import picocli.CommandLine; + +import java.util.Set; @Slf4j -public class Main { - public static void main(String[] args) { - ConfigLoader.initConfig(args); +@CommandLine.Command( + name = "mkvaudiosubtitlechanger", + usageHelpWidth = 120, + customSynopsis = { + "mkvaudiosubtitlechanger -a ... -l [-s]", + "Example: mkvaudiosubtitlechanger -a eng:eng eng:ger -l /mnt/media/ -s", + "" + }, + mixinStandardHelpOptions = true, + versionProvider = ProjectUtil.class +) +public class Main implements Runnable { + + @Getter + @CommandLine.ArgGroup(exclusive = false) + private Config config; + + @CommandLine.Spec + CommandLine.Model.CommandSpec spec; + + @Override + public void run() { + validate(); + Config.setInstance(config); AttributeUpdaterKernel kernel = Config.getInstance().getCoherent() != null ? new CoherentAttributeUpdaterKernel(new MkvFileCollector(), new CachedMkvFileProcessor()) : new DefaultAttributeUpdaterKernel(new MkvFileCollector(), new CachedMkvFileProcessor()); kernel.execute(); } + + private void validate() { + Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + Set> violations = validator.validate(config); + + if (!violations.isEmpty()) { + StringBuilder errorMsg = new StringBuilder(); + for (ConstraintViolation violation : violations) { + errorMsg.append("ERROR: ").append(violation.getPropertyPath()).append(" ").append(violation.getMessage()).append("\n"); + } + throw new CommandLine.ParameterException(spec.commandLine(), errorMsg.toString()); + } + } + + public static void main(String[] args) { + if (args.length == 0) { + args = new String[] { "--help" }; + } + new CommandLine(Main.class).execute(args); + } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigConverter.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigConverter.java new file mode 100644 index 0000000..754323f --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigConverter.java @@ -0,0 +1,58 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; +import picocli.CommandLine; + +import java.util.regex.Pattern; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.LanguageValidatorUtil.isAudioLanguageValid; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.LanguageValidatorUtil.isLanguageValid; + +public class AttributeConfigConverter implements CommandLine.ITypeConverter { + private static final String SEPARATOR = ":"; + private static final Pattern PATTERN = Pattern.compile("^.{3}:.{3}$"); + + /** + * Converts the input string into an AttributeConfig object. + * + * @param s The input string containing audio and subtitle language configuration in format "audioLang:subtitleLang" + * @return An AttributeConfig object representing the parsed configuration + * @throws CommandLine.TypeConversionException if the input string is invalid or contains invalid language codes + */ + @Override + public AttributeConfig convert(String s) throws Exception { + validateInput(s); + + String[] split = s.split(SEPARATOR); + AttributeConfig attr = new AttributeConfig(split[0], split[1]); + + validateResult(attr); + + return attr; + } + + /** + * Validates that the input string matches the expected pattern. + * + * @param s String to validate + * @throws CommandLine.TypeConversionException if the value doesn't match the expected pattern + */ + private static void validateInput(String s) { + if (!PATTERN.matcher(s).matches()) { + throw new CommandLine.TypeConversionException("Invalid Attribute config: " + s); + } + } + + /** + * Validates that both language codes in the AttributeConfig object are valid. + * + * @param attr AttributeConfig object to validate + * @throws CommandLine.TypeConversionException if either language code is invalid + */ + private static void validateResult(AttributeConfig attr) { + if (!isAudioLanguageValid(attr.getAudioLanguage())) + throw new CommandLine.TypeConversionException("Audio language invalid: " + attr.getAudioLanguage()); + if (!isLanguageValid(attr.getSubtitleLanguage())) + throw new CommandLine.TypeConversionException("Subtitle language invalid: " + attr.getSubtitleLanguage()); + } +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java index dc8d6a5..02736c7 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java @@ -2,51 +2,97 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix; +import jakarta.validation.constraints.Min; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.lang3.SystemUtils; +import picocli.CommandLine; import java.io.File; +import java.nio.file.Path; import java.util.*; import java.util.regex.Pattern; @Slf4j @Getter @Setter -@NoArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor public class Config { @Getter(AccessLevel.NONE) @Setter(AccessLevel.NONE) private static Config config = null; - @Getter(AccessLevel.NONE) - CommandLineParser parser = new DefaultParser(); - @Getter(AccessLevel.NONE) - HelpFormatter formatter = new HelpFormatter(); - private File configPath; - private File libraryPath; - @Getter(AccessLevel.NONE) - private File mkvToolNix; - private int threads; - private Pattern includePattern; + private File configPath; + + @CommandLine.Spec + CommandLine.Model.CommandSpec spec; + + @CommandLine.Option(names = {"-a", "--attribute-config"}, required = true, arity = "1..*", converter = AttributeConfigConverter.class, + description = "List of audio:subtitle pairs used to match in order and update files accordingly (e.g. jpn:eng jpn:ger)") + private List attributeConfig; + + @Setter(AccessLevel.NONE) + private File libraryPath; + + @CommandLine.Option(names = {"-s", "--safemode"}, description = "test run (no files will be changes)") private boolean safeMode; + @Setter(AccessLevel.NONE) + private File mkvToolNix; + + @Min(value = 1) + @CommandLine.Option(names = {"-t", "--threads"}, defaultValue = "2", description = "thread count (default: ${DEFAULT-VALUE})") + private int threads; + + @CommandLine.Option(names = {"-c", "--coherent"}, description = "try to match all files in dir of depth with the same attribute config") private Integer coherent; + @CommandLine.Option(names = {"-cf", "--force-coherent"}, description = "changes are only applied if it's a coherent match") private boolean forceCoherent; + + @CommandLine.Option(names = {"-n", "--only-new-file"}, description = "sets filter-date to last successful execution (overwrites input of filter-date)") private boolean onlyNewFiles; + @CommandLine.Option(names = {"-d", "--filter-date"}, defaultValue = CommandLine.Option.NULL_VALUE, description = "only consider files created newer than entered date (format: \"dd.MM.yyyy-HH:mm:ss\")") private Date filterDate; - - private Set forcedKeywords = new HashSet<>(Arrays.asList("forced", "signs", "songs")); - private Set commentaryKeywords = new HashSet<>(Arrays.asList("commentary", "director")); + @CommandLine.Option(names = {"-i", "--include-pattern"}, defaultValue = ".*", description = "include files matching pattern (default: \".*\")") + private Pattern includePattern; + @CommandLine.Option(names = {"-e", "--excluded-directory"}, arity = "1..*", + description = "Directories to be excluded, combines with config file") private Set excludedDirectories = new HashSet<>(); - private Set preferredSubtitles = new HashSet<>(Arrays.asList("unstyled")); - private List attributeConfig; + @CommandLine.Option(names = {"--forced-keywords"}, arity = "1..*", defaultValue = "forced, signs, songs", split = ", ", + description = "Keywords to identify forced tracks (Defaults will be overwritten; Default: ${DEFAULT-VALUE})") + private Set forcedKeywords; + @CommandLine.Option(names = {"--commentary-keywords"}, arity = "1..*", defaultValue = "commentary, director", split = ", ", + description = "Keywords to identify commentary tracks (Defaults will be overwritten; Default: ${DEFAULT-VALUE})") + private Set commentaryKeywords; + @CommandLine.Option(names = {"--preferred-subtitles"}, arity = "1..*", defaultValue = "unstyled", split = ", ", + description = "Keywords to prefer specific subtitle tracks (Defaults will be overwritten; Default: ${DEFAULT-VALUE})") + private Set preferredSubtitles; + + @CommandLine.Option(names = {"-l", "--library"}, required = true, description = "path to library") + public void setLibraryPath(File libraryPath) { + if (!libraryPath.exists()) throw new CommandLine.ParameterException(spec.commandLine(), "Path does not exist: " + libraryPath.getAbsolutePath()); + this.libraryPath = libraryPath; + } + + static { + // Set default value into system properties to picocli can read the conditional value + System.setProperty("DEFAULT_MKV_TOOL_NIX", SystemUtils.IS_OS_WINDOWS ? "C:\\Program Files\\MKVToolNix" : "/usr/bin/"); + } + + @CommandLine.Option(names = {"-m", "--mkvtoolnix"}, defaultValue = "${DEFAULT_MKV_TOOL_NIX}", description = "path to mkvtoolnix installation") + public void setMkvToolNix(File mkvToolNix) { + this.mkvToolNix = mkvToolNix; + if (!mkvToolNix.exists() + || !Path.of(getPathFor(MkvToolNix.MKV_MERGE, SystemUtils.IS_OS_WINDOWS)).toFile().exists() + || !Path.of(getPathFor(MkvToolNix.MKV_PROP_EDIT, SystemUtils.IS_OS_WINDOWS)).toFile().exists()) { + throw new CommandLine.ParameterException(spec.commandLine(), + "Invalid path to mkvtoolnix installation: " + mkvToolNix.getAbsolutePath()); + } + } public static Config getInstance() { return getInstance(false); @@ -59,14 +105,23 @@ public class Config { return config; } + public static void setInstance(Config c) { + config = c; + } + /** * Get path to specific mkvtoolnix application. * * @return absolute path to desired application. */ public String getPathFor(MkvToolNix application) { - return mkvToolNix.getAbsolutePath().endsWith("/") ? mkvToolNix.getAbsolutePath() + application : - mkvToolNix.getAbsolutePath() + "/" + application; + return mkvToolNix.getAbsolutePath().endsWith("/") + ? mkvToolNix.getAbsolutePath() + application + : mkvToolNix.getAbsolutePath() + "/" + application; + } + + public String getPathFor(MkvToolNix application, boolean isWindows) { + return getPathFor(application) + (isWindows ? ".exe" : ""); } public String getNormalizedLibraryPath() { @@ -76,8 +131,6 @@ public class Config { @Override public String toString() { return new StringJoiner(", ", Config.class.getSimpleName() + "[", "]") - .add("parser=" + parser) - .add("formatter=" + formatter) .add("configPath=" + configPath) .add("libraryPath=" + libraryPath) .add("mkvToolNix=" + mkvToolNix) diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java deleted file mode 100644 index 18d4daa..0000000 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java +++ /dev/null @@ -1,110 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator.*; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.util.ProjectUtil; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.*; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; - -public class ConfigLoader { - private static final List> VALIDATORS = Stream.of( - new ConfigPathValidator(CONFIG_PATH, false), - new PathValidator(LIBRARY, true, null), - new ThreadValidator(THREADS, false, 2), - new MkvToolNixPathValidator(MKV_TOOL_NIX, true, Path.of("C:\\Program Files\\MKVToolNix").toFile()), - new BooleanValidator(SAFE_MODE, false), - new BooleanValidator(ONLY_NEW_FILES, false), - new DateValidator(FILTER_DATE, false), - new PatternValidator(INCLUDE_PATTERN, false, Pattern.compile(".*")), - new SetValidator(FORCED_KEYWORDS, false, true), - new SetValidator(COMMENTARY_KEYWORDS, false, true), - new SetValidator(EXCLUDED_DIRECTORY, false, true), - new SetValidator(PREFERRED_SUBTITLES, false, true), - new AttributeConfigValidator(), - new CoherentConfigValidator(COHERENT, false), - new BooleanValidator(FORCE_COHERENT, false) - ).sorted(Comparator.comparing((ConfigValidator validator) -> validator.getWeight()).reversed()).collect(Collectors.toList()); - - public static void initConfig(String[] args) { - HelpFormatter formatter = new HelpFormatter(); - formatter.setOptionComparator(null); - YAML yamlConfig = null; - - Options options = initOptions(); - CommandLine cmd = parseCommandLineArgs(formatter, options, args); - - exitIfHelp(cmd, options, formatter); - exitIfVersion(cmd); - - List results = new ArrayList<>(); - - for (ConfigValidator validator: VALIDATORS) { - results.add(validator.validate(yamlConfig, cmd)); - if (yamlConfig == null) { - try { - yamlConfig = Config.getInstance().getConfigPath() != null - ? new YAML(Config.getInstance().getConfigPath()) - : new YAML(""); - } catch (IOException | YamlInvalidContentException ignored) {} - } - } - - if (results.contains(ValidationResult.INVALID) || results.contains(ValidationResult.MISSING)) System.exit(1); - System.out.println(); - } - - private static Options initOptions() { - Options options = new Options(); - Arrays.stream(ConfigProperty.values()) - .filter(prop -> prop.abrv() != null) - .map(prop -> optionOf(prop, prop.abrv(), prop.args())) - .forEach(options::addOption); - return options; - } - - private static CommandLine parseCommandLineArgs(HelpFormatter formatter, Options options, String[] args) { - CommandLineParser parser = new DefaultParser(); - - try { - CommandLine cmd = parser.parse(options, args); - if (cmd == null) throw new NullPointerException(); - return cmd; - } catch (ParseException | NullPointerException e) { - formatter.printHelp(130, "java -jar MKVAudioSubtitlesChanger.jar -l ", - "\nParameters:", options, - "\nFeature requests and bug reports: https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/issues"); - System.exit(1); - } - return null; // can't be reached - } - - private static void exitIfHelp(CommandLine cmd, Options options, HelpFormatter formatter) { - if (cmd.hasOption(HELP.prop())) { - formatter.printHelp(130, "java -jar MKVAudioSubtitlesChanger.jar -l ", - "\nParameters:", options, - "\nFeature requests and bug reports: https://github.com/RatzzFatzz/MKVAudioSubtitleChanger/issues"); - System.exit(0); - } - } - - private static void exitIfVersion(CommandLine cmd) { - if (cmd.hasOption(VERSION.prop())) { - System.out.printf("MKV Audio Subtitle Changer Version %s%n", ProjectUtil.getVersion()); - System.exit(0); - } - } -} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ValidationResult.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ValidationResult.java index 5ac257e..0f17cfc 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ValidationResult.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ValidationResult.java @@ -1,5 +1,6 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; +@Deprecated 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 7342c9f..dd21ec8 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidator.java @@ -13,6 +13,7 @@ import java.util.stream.Collectors; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.LanguageValidatorUtil.isAudioLanguageValid; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.LanguageValidatorUtil.isLanguageValid; +@Deprecated public class AttributeConfigValidator extends ConfigValidator> { private static final String SEPARATOR = ":"; 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 d192e25..6446722 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidator.java @@ -12,6 +12,7 @@ import java.util.function.BiFunction; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.ARGUMENTS; +@Deprecated public class BooleanValidator extends ConfigValidator { public BooleanValidator(ConfigProperty property, boolean required) { diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/CoherentConfigValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/CoherentConfigValidator.java index 25edaf9..9f9bdee 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/CoherentConfigValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/CoherentConfigValidator.java @@ -3,6 +3,7 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; import org.apache.commons.lang3.math.NumberUtils; +@Deprecated public class CoherentConfigValidator extends ConfigValidator { private static final Integer DISABLED = -1; 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 c051ca1..d9fa7dc 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigPathValidator.java @@ -7,6 +7,7 @@ import java.io.File; import java.util.Optional; import java.util.function.BiFunction; +@Deprecated public class ConfigPathValidator extends PathValidator { public ConfigPathValidator(ConfigProperty property, boolean required) { super(property, required, null); 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 791ee77..cae426b 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ConfigValidator.java @@ -19,6 +19,7 @@ import java.util.function.Predicate; @Slf4j @RequiredArgsConstructor +@Deprecated public abstract class ConfigValidator { protected final ConfigProperty property; protected final boolean required; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/DateValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/DateValidator.java index f376af1..703f472 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/DateValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/DateValidator.java @@ -15,6 +15,7 @@ import java.nio.file.Path; import java.util.Date; @Slf4j +@Deprecated public class DateValidator extends ConfigValidator { private static final Date INVALID_DATE = new Date(0); private static final Date DEFAULT_DATE = new Date(1000); 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 4095921..c9ff163 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidator.java @@ -5,9 +5,10 @@ import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; import java.io.File; import java.nio.file.Path; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix.MKV_MERGER; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix.MKV_MERGE; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix.MKV_PROP_EDIT; +@Deprecated public class MkvToolNixPathValidator extends PathValidator { private static final String EXE = ".exe"; @@ -18,9 +19,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_MERGE + 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_MERGE).toFile().isFile() && Path.of(result.getAbsolutePath() + "/" + MKV_PROP_EDIT).toFile().isFile()); } } 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 3cc712d..688d8aa 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidator.java @@ -5,6 +5,7 @@ import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; import java.io.File; import java.nio.file.Path; +@Deprecated public class PathValidator extends ConfigValidator { public PathValidator(ConfigProperty property, boolean required, File defaultValue) { 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 d2c0f1e..9ee0468 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidator.java @@ -5,6 +5,7 @@ import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +@Deprecated public class PatternValidator extends ConfigValidator { private static final Pattern EMPTY_PATTERN = Pattern.compile(""); 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 796513f..cddbb05 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidator.java @@ -13,6 +13,7 @@ import java.util.*; import java.util.function.BiFunction; import java.util.stream.Collectors; +@Deprecated public class SetValidator extends ConfigValidator> { private final boolean append; 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 8d3e5cb..85086a4 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidator.java @@ -3,6 +3,7 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; import org.apache.commons.lang3.math.NumberUtils; +@Deprecated public class ThreadValidator extends ConfigValidator{ public ThreadValidator(ConfigProperty property, boolean required, Integer defaultValue) { super(property, required, defaultValue); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java index f57d66a..da0109a 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java @@ -39,7 +39,7 @@ public class MkvFileProcessor implements FileProcessor { Map jsonMap; List fileAttributes = new ArrayList<>(); try { - String command = format("\"%s\"", Config.getInstance().getPathFor(MkvToolNix.MKV_MERGER)); + String command = format("\"%s\"", Config.getInstance().getPathFor(MkvToolNix.MKV_MERGE)); String[] arguments = new String[]{ command, "--identify", @@ -184,7 +184,7 @@ public class MkvFileProcessor implements FileProcessor { } } - log.info(sb.toString()); + log.debug(sb.toString()); InputStream inputstream = Runtime.getRuntime().exec(sb.toString()).getInputStream(); String output = IOUtils.toString(new InputStreamReader(inputstream)); log.debug(output); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/AttributeUpdaterKernel.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/AttributeUpdaterKernel.java index bb31a33..54bc9f5 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/AttributeUpdaterKernel.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/AttributeUpdaterKernel.java @@ -99,6 +99,12 @@ public abstract class AttributeUpdaterKernel { FileInfoDto fileInfo = new FileInfoDto(file); List attributes = processor.loadAttributes(file); + if (attributes == null || attributes.isEmpty()) { + statistic.total(); + statistic.failure(); + return; + } + List nonForcedTracks = processor.retrieveNonForcedTracks(attributes); List nonCommentaryTracks = processor.retrieveNonCommentaryTracks(attributes); @@ -121,7 +127,7 @@ public abstract class AttributeUpdaterKernel { statistic.shouldChange(); commitChange(fileInfoDto); break; - case UNABLE_TO_APPLY: + case NO_SUITABLE_CONFIG: statistic.noSuitableConfigFound(); break; case ALREADY_SUITED: diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileInfoDto.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileInfoDto.java index 39264d9..439cc91 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileInfoDto.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileInfoDto.java @@ -40,8 +40,9 @@ public class FileInfoDto { } private boolean isSubtitleOFF() { - return desiredDefaultSubtitleLane == null && "OFF".equals(matchedConfig.getSubtitleLanguage()) && - (existingDefaultSubtitleLanes != null && !existingDefaultSubtitleLanes.isEmpty()); + return desiredDefaultSubtitleLane == null + && (matchedConfig != null && "OFF".equals(matchedConfig.getSubtitleLanguage())) + && (existingDefaultSubtitleLanes != null && !existingDefaultSubtitleLanes.isEmpty()); } public boolean areForcedTracksDifferent() { @@ -50,7 +51,7 @@ public class FileInfoDto { public FileStatus getStatus() { if (isChangeNecessary()) return FileStatus.CHANGE_NECESSARY; - if (isUnableToApplyConfig()) return FileStatus.UNABLE_TO_APPLY; + if (isUnableToApplyConfig()) return FileStatus.NO_SUITABLE_CONFIG; if (isAlreadySuitable()) return FileStatus.ALREADY_SUITED; return FileStatus.UNKNOWN; } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileStatus.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileStatus.java index 942faf9..891014a 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileStatus.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileStatus.java @@ -2,7 +2,7 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; public enum FileStatus { CHANGE_NECESSARY, - UNABLE_TO_APPLY, + NO_SUITABLE_CONFIG, ALREADY_SUITED, UNKNOWN; } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/MkvToolNix.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/MkvToolNix.java index 0e6e853..22d94f8 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/MkvToolNix.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/MkvToolNix.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; @AllArgsConstructor public enum MkvToolNix { - MKV_MERGER("mkvmerge"), + MKV_MERGE("mkvmerge"), MKV_PROP_EDIT("mkvpropedit"); private final String file; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/LanguageValidatorUtil.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/LanguageValidatorUtil.java index ed7bf6c..f3fb797 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/LanguageValidatorUtil.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/LanguageValidatorUtil.java @@ -24,7 +24,7 @@ public class LanguageValidatorUtil { } public static boolean isAudioLanguageValid(String language) { - return !language.equals("OFF") && ISO3_LANGUAGES.contains(language); + return !language.equals("OFF") && isLanguageValid(language); } public static boolean isLanguageValid(String language) { diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/ProjectUtil.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/ProjectUtil.java index 0e2c013..d86656c 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/ProjectUtil.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/ProjectUtil.java @@ -1,10 +1,12 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.util; +import picocli.CommandLine; + import java.io.IOException; import java.io.InputStream; import java.util.Properties; -public class ProjectUtil { +public class ProjectUtil implements CommandLine.IVersionProvider { private static final Properties PROJECT_PROPERTIES = new Properties(); static { @@ -15,8 +17,8 @@ public class ProjectUtil { } } - public static String getVersion() { - return PROJECT_PROPERTIES.getProperty("version"); + public String[] getVersion() { + return new String[] {getProjectName() + " " + PROJECT_PROPERTIES.getProperty("version")}; } public static String getProjectName() { diff --git a/src/main/resources/log4j2-debian.yaml b/src/main/resources/log4j2-debian.yaml new file mode 100644 index 0000000..a57c2be --- /dev/null +++ b/src/main/resources/log4j2-debian.yaml @@ -0,0 +1,34 @@ +Configuration: + name: DefaultLogger + Appenders: + RollingFile: + name: FileAppender + fileName: /var/log/MKVAudioSubtitleChanger/application.log + filePattern: /var/log/MKVAudioSubtitleChanger/archive/application-%d{yyyy-MM-dd}-%i.log.gz + PatternLayout: + Pattern: "%d{DEFAULT} | %-5level | %thread | %msg %n %throwable" + ThresholdFilter: + level: info + Policies: + OnStartupTriggeringPolicy: + minSize: 0 + DefaultRolloverStrategy: + max: 30 + Delete: + basePath: archive + maxDepth: 1 + IfLastModified: + age: 30d + IfAccumulatedFileSize: + exceeds: 1GB + + Loggers: + Root: + level: info + AppenderRef: + - ref: FileAppender + Logger: + name: "com.zaxxer.hikari.HikariConfig" + level: info + AppenderRef: + - ref: FileAppender \ No newline at end of file diff --git a/src/main/resources/log4j2-dev.yaml b/src/main/resources/log4j2-dev.yaml index bd94532..f3b739f 100644 --- a/src/main/resources/log4j2-dev.yaml +++ b/src/main/resources/log4j2-dev.yaml @@ -7,13 +7,27 @@ Configuration: Pattern: "%d{DEFAULT} | %-5level | %thread | %msg %n %throwable" ThresholdFilter: level: debug - File: + RollingFile: name: FileAppender - fileName: default.log + fileName: logs/application.log + filePattern: logs/archive/application-%d{yyyy-MM-dd}-%i.log.gz PatternLayout: Pattern: "%d{DEFAULT} | %-5level | %thread | %msg %n %throwable" ThresholdFilter: level: debug + Policies: + OnStartupTriggeringPolicy: + minSize: 0 + DefaultRolloverStrategy: + max: 30 + Delete: + basePath: logs/archive + maxDepth: 1 + IfLastModified: + age: 30d + IfAccumulatedFileSize: + exceeds: 1GB + Loggers: Root: level: debug diff --git a/src/main/resources/log4j2-windows.yaml b/src/main/resources/log4j2-windows.yaml new file mode 100644 index 0000000..804ec99 --- /dev/null +++ b/src/main/resources/log4j2-windows.yaml @@ -0,0 +1,34 @@ +Configuration: + name: DefaultLogger + Appenders: + RollingFile: + name: FileAppender + fileName: ${sys:user.home}/AppData/Roaming/MKVAudioSubtitleChanger/logs/application.log + filePattern: ${sys:user.home}/AppData/Roaming/MKVAudioSubtitleChanger/logs/archive/application-%d{yyyy-MM-dd}-%i.log.gz + PatternLayout: + Pattern: "%d{DEFAULT} | %-5level | %thread | %msg %n %throwable" + ThresholdFilter: + level: info + Policies: + OnStartupTriggeringPolicy: + minSize: 0 + DefaultRolloverStrategy: + max: 30 + Delete: + basePath: logs/archive + maxDepth: 1 + IfLastModified: + age: 30d + IfAccumulatedFileSize: + exceeds: 1GB + + Loggers: + Root: + level: info + AppenderRef: + - ref: FileAppender + Logger: + name: "com.zaxxer.hikari.HikariConfig" + level: info + AppenderRef: + - ref: FileAppender \ No newline at end of file diff --git a/src/main/resources/log4j2.yaml b/src/main/resources/log4j2.yaml index 371b601..bfa5dca 100644 --- a/src/main/resources/log4j2.yaml +++ b/src/main/resources/log4j2.yaml @@ -1,13 +1,27 @@ Configuration: name: DefaultLogger Appenders: - File: + RollingFile: name: FileAppender - fileName: default.log + fileName: logs/application.log + filePattern: logs/archive/application-%d{yyyy-MM-dd}-%i.log.gz PatternLayout: Pattern: "%d{DEFAULT} | %-5level | %thread | %msg %n %throwable" ThresholdFilter: level: info + Policies: + OnStartupTriggeringPolicy: + minSize: 0 + DefaultRolloverStrategy: + max: 30 + Delete: + basePath: logs/archive + maxDepth: 1 + IfLastModified: + age: 30d + IfAccumulatedFileSize: + exceeds: 1GB + Loggers: Root: level: info diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigTest.java new file mode 100644 index 0000000..5c31c2f --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/AttributeConfigTest.java @@ -0,0 +1,61 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import picocli.CommandLine; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +class AttributeConfigTest { + + private static Stream provideTestCases() { + return Stream.of( + Arguments.of(args("-a", "jpn:ger"), attrConf("jpn", "ger")), + Arguments.of(args("-a", "jpn:ger", "jpn:eng"), attrConf("jpn", "ger", "jpn", "eng")), + Arguments.of(args("-a", "jpn:ger", "jpn:OFF"), attrConf("jpn", "ger", "jpn", "OFF")) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, List expectedConfig) { + Main underTest = new Main(); + CommandLine.populateCommand(underTest, cmdArgs); + assertIterableEquals(expectedConfig, underTest.getConfig().getAttributeConfig()); + } + + @Test + void validate() { + Main sut = new Main(); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, new String[]{"-l", "/"})); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, new String[]{"-l", "/", "-a"})); + assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, new String[]{"-l", "/", "-a", "ger:"})); + assertThrows(CommandLine.ParameterException.class, + () -> CommandLine.populateCommand(sut, new String[]{"-l", "/", "-a", "ger:qwf"})); // Invalid language code + } + + private static String[] args(String... args) { + String[] staticArray = new String[]{"-l", "/"}; + String[] result = new String[staticArray.length + args.length]; + System.arraycopy(staticArray, 0, result, 0, staticArray.length); + System.arraycopy(args, 0, result, staticArray.length, args.length); + return result; + } + + private static List attrConf(String... languages) { + List conf = new ArrayList<>(); + for (int i = 0; i < languages.length; i += 2) { + conf.add(new AttributeConfig(languages[i], languages[i+1])); + } + return conf; + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/BooleanConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/BooleanConfigParameterTest.java new file mode 100644 index 0000000..8bf61c9 --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/BooleanConfigParameterTest.java @@ -0,0 +1,37 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import picocli.CommandLine; + +import java.util.function.Function; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.args; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BooleanConfigParameterTest { + + private static Stream provideTestCases() { + return Stream.of( + Arguments.of(args("-s"), true, (Function) Config::isSafeMode), + Arguments.of(args("--safemode"), true, (Function) Config::isSafeMode), + Arguments.of(args(), false, (Function) Config::isSafeMode), + Arguments.of(args("-cf"), true, (Function) Config::isForceCoherent), + Arguments.of(args("--force-coherent"), true, (Function) Config::isForceCoherent), + Arguments.of(args(), false, (Function) Config::isForceCoherent), + Arguments.of(args("-n"), true, (Function) Config::isOnlyNewFiles), + Arguments.of(args(), false, (Function) Config::isOnlyNewFiles) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, boolean expected, Function fieldUnderTest) { + Main sut = new Main(); + CommandLine.populateCommand(sut, cmdArgs); + assertEquals(expected, fieldUnderTest.apply(sut.getConfig())); + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoaderTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java similarity index 68% rename from src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoaderTest.java rename to src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java index d78fab5..a81cbc8 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoaderTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigTest.java @@ -2,34 +2,36 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; import org.junit.jupiter.api.Test; +import picocli.CommandLine; import java.util.List; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_FILE; import static org.junit.jupiter.api.Assertions.*; -class ConfigLoaderTest { +class ConfigTest { @Test void initConfig() { - String[] sut = new String[]{"-a", "ger:ger", "-l", TEST_FILE, + String[] sut = new String[]{"-a", "ger:ger", "eng:eng", "-l", TEST_FILE, "-s", "-cf", "-n", "-c", "2", "-t", "4", "-i", ".*[abc].*", - "-fk", "testForced", - "-ck", "testCommentary", - "-ps", "testPreferred" + "--forced-keywords", "testForced", + "--commentary-keywords", "testCommentary", + "--preferred-subtitles", "testPreferred" }; - ConfigLoader.initConfig(sut); + CommandLine.populateCommand(Config.getInstance(), sut); assertTrue(Config.getInstance().getLibraryPath().exists()); - assertEquals(List.of(new AttributeConfig("ger", "ger")), Config.getInstance().getAttributeConfig()); + assertEquals(List.of(new AttributeConfig("ger", "ger"), new AttributeConfig("eng", "eng")), + Config.getInstance().getAttributeConfig()); assertTrue(Config.getInstance().isSafeMode()); assertTrue(Config.getInstance().isForceCoherent()); assertTrue(Config.getInstance().isOnlyNewFiles()); - assertNotNull(Config.getInstance().getFilterDate()); + assertNull(Config.getInstance().getFilterDate()); assertEquals(2, Config.getInstance().getCoherent()); assertEquals(4, Config.getInstance().getThreads()); diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/IntegerConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/IntegerConfigParameterTest.java new file mode 100644 index 0000000..44b22eb --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/IntegerConfigParameterTest.java @@ -0,0 +1,50 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import picocli.CommandLine; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.function.Function; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.args; +import static org.junit.jupiter.api.Assertions.*; + +class IntegerConfigParameterTest { + + private static Stream provideTestCases() { + return Stream.of( + Arguments.of(args(), 2, (Function) Config::getThreads), + Arguments.of(args("-t", "5"), 5, (Function) Config::getThreads), + Arguments.of(args("--threads", "5"), 5, (Function) Config::getThreads) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, int expected, Function fieldUnderTest) { + Main sut = new Main(); + CommandLine.populateCommand(sut, cmdArgs); + assertEquals(expected, fieldUnderTest.apply(sut.getConfig())); + } + + @Test + void validate() { + Main sut = new Main(); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("-t"))); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("--threads"))); + + StringWriter writer = new StringWriter(); + PrintWriter printWriter = new PrintWriter(writer); + CommandLine underTest = new CommandLine(sut); + underTest = underTest.setErr(printWriter); + underTest.execute(args("-t", "0")); + printWriter.flush(); + assertTrue(writer.toString().contains("ERROR: threads must be greater than or equal to 1")); + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/MkvToolNixPathConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/MkvToolNixPathConfigParameterTest.java new file mode 100644 index 0000000..b4b7a92 --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/MkvToolNixPathConfigParameterTest.java @@ -0,0 +1,54 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import org.apache.commons.lang3.SystemUtils; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import picocli.CommandLine; + +import java.io.File; +import java.nio.file.Path; +import java.util.function.Function; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.args; +import static org.junit.jupiter.api.Assertions.*; + +class MkvToolNixPathConfigParameterTest { + + 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 Stream provideTestCases() { + if (SystemUtils.IS_OS_WINDOWS) { + return Stream.of( + Arguments.of(args("-m", TEST_MKVTOOLNIX_EXE_DIR), TEST_MKVTOOLNIX_EXE_DIR, (Function) Config::getMkvToolNix), + Arguments.of(args("--mkvtoolnix", TEST_MKVTOOLNIX_EXE_DIR), TEST_MKVTOOLNIX_EXE_DIR, (Function) Config::getMkvToolNix) + ); + } + + return Stream.of( + Arguments.of(args("-m", TEST_MKVTOOLNIX_DIR), TEST_MKVTOOLNIX_DIR, (Function) Config::getMkvToolNix), + Arguments.of(args("--mkvtoolnix", TEST_MKVTOOLNIX_DIR), TEST_MKVTOOLNIX_DIR, (Function) Config::getMkvToolNix) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, String expected, Function fieldUnderTest) { + Main sut = new Main(); + CommandLine.populateCommand(sut, cmdArgs); + assertEquals(Path.of(expected).toFile().getAbsolutePath(), fieldUnderTest.apply(sut.getConfig()).getAbsolutePath()); + } + + @Test + void validate() { + Main sut = new Main(); + assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args("-m", TEST_INVALID_DIR))); + assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args("-m"))); + assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args(""))); + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java new file mode 100644 index 0000000..d5aaaca --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PathConfigParameterTest.java @@ -0,0 +1,53 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import picocli.CommandLine; + +import java.io.File; +import java.nio.file.Path; +import java.util.function.Function; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_DIR; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_FILE; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PathConfigParameterTest { + + private static Stream provideTestCases() { + return Stream.of( + Arguments.of(args("-l", TEST_DIR), Path.of(TEST_DIR).toFile(), true, (Function) Config::getLibraryPath), + Arguments.of(args("-l", TEST_FILE), Path.of(TEST_FILE).toFile(), true, (Function) Config::getLibraryPath) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, File expected, boolean exists, Function fieldUnderTest) { + Main sut = new Main(); + CommandLine.populateCommand(sut, cmdArgs); + assertEquals(expected.getAbsolutePath(), fieldUnderTest.apply(sut.getConfig()).getAbsolutePath()); + assertEquals(exists, fieldUnderTest.apply(sut.getConfig()).exists()); + } + + @Test + void validate() { + Main sut = new Main(); + assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args("-l", "arst"))); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("-l"))); + assertThrows(CommandLine.UnmatchedArgumentException.class, () -> CommandLine.populateCommand(sut, args(""))); + } + + private static String[] args(String... args) { + String[] staticArray = new String[]{"-a", "ger:ger"}; + String[] result = new String[staticArray.length + args.length]; + System.arraycopy(staticArray, 0, result, 0, staticArray.length); + System.arraycopy(args, 0, result, staticArray.length, args.length); + return result; + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java new file mode 100644 index 0000000..739f4d6 --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/PatternConfigParameterTest.java @@ -0,0 +1,42 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import picocli.CommandLine; + +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.args; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PatternConfigParameterTest { + + private static Stream provideTestCases() { + return Stream.of( + Arguments.of(args("-i", "[abd]?.*"), Pattern.compile("[abd]?.*"), (Function) Config::getIncludePattern), + Arguments.of(args("-i", ".*"), Pattern.compile(".*"), (Function) Config::getIncludePattern), + Arguments.of(args(), Pattern.compile(".*"), (Function) Config::getIncludePattern) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, Pattern expected, Function fieldUnderTest) { + Main sut = new Main(); + CommandLine.populateCommand(sut, cmdArgs); + assertEquals(expected.pattern(), fieldUnderTest.apply(sut.getConfig()).pattern()); + } + + @Test + void validate() { + Main sut = new Main(); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("-i"))); + assertThrows(CommandLine.ParameterException.class, () -> CommandLine.populateCommand(sut, args("-i", "["))); + } +} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/SetConfigParameterTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/SetConfigParameterTest.java new file mode 100644 index 0000000..61b8a29 --- /dev/null +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/SetConfigParameterTest.java @@ -0,0 +1,50 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.config; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.Main; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import picocli.CommandLine; + +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Stream; + +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.args; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class SetConfigParameterTest { + + private static Stream provideTestCases() { + return Stream.of( + Arguments.of(args("--commentary-keywords", "test"), 1, (Function>) Config::getCommentaryKeywords), + Arguments.of(args("--commentary-keywords", "test", "test1", "test2", "test3", "test4"), 5, (Function>) Config::getCommentaryKeywords), + Arguments.of(args(), 2, (Function>) Config::getCommentaryKeywords), + Arguments.of(args("--forced-keywords", "test"), 1, (Function>) Config::getForcedKeywords), + Arguments.of(args("--forced-keywords", "test", "test1", "test2", "test3", "test4"), 5, (Function>) Config::getForcedKeywords), + Arguments.of(args(), 3, (Function>) Config::getForcedKeywords), + Arguments.of(args("--preferred-subtitles", "test"), 1, (Function>) Config::getPreferredSubtitles), + Arguments.of(args("--preferred-subtitles", "test", "test1", "test2", "test3", "test4"), 5, (Function>) Config::getPreferredSubtitles), + Arguments.of(args(), 1, (Function>) Config::getPreferredSubtitles) + ); + } + + @ParameterizedTest + @MethodSource("provideTestCases") + void validate(String[] cmdArgs, int expectedSize, Function> fieldUnderTest) { + Main sut = new Main(); + CommandLine.populateCommand(sut, cmdArgs); + assertEquals(expectedSize, fieldUnderTest.apply(sut.getConfig()).size()); + } + + @Test + void validate() { + Main sut = new Main(); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("--commentary-keywords"))); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("--forced-keywords"))); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("-e"))); + assertThrows(CommandLine.MissingParameterException.class, () -> CommandLine.populateCommand(sut, args("--preferred-subtitles"))); + } +} \ 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 deleted file mode 100644 index 8a1b143..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/AttributeConfigValidatorTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.AttributeConfig; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -import static org.junit.jupiter.api.Assertions.*; - -class AttributeConfigValidatorTest { - private static CommandLineParser parser; - private static Options options; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - options.addOption(optionOf(ATTRIBUTE_CONFIG, ATTRIBUTE_CONFIG.abrv(), ATTRIBUTE_CONFIG.args())); - } - - @BeforeEach - void beforeEach() { - Config.getInstance(true); - } - - private static Stream provideTestCases() { - return Stream.of( - Arguments.of(attrConfYaml("jpn", "ger"), new String[]{}, VALID, attrConf("jpn", "ger")), - Arguments.of("", new String[]{"-a", "jpn:ger"}, VALID, attrConf("jpn", "ger")), - Arguments.of(attrConfYaml("jpn", "ger", "jpn", "eng"), new String[]{}, VALID, attrConf("jpn", "ger", "jpn", "eng")), - Arguments.of("", new String[]{"-a", "jpn:ger", "jpn:eng"}, VALID, attrConf("jpn", "ger", "jpn", "eng")), - Arguments.of(attrConfYaml("jpn", "ger", "jpn", "OFF"), new String[]{}, VALID, attrConf("jpn", "ger", "jpn", "OFF")), - Arguments.of("", new String[]{"-a", "jpn:ger", "jpn:OFF"}, VALID, attrConf("jpn", "ger", "jpn", "OFF")), - Arguments.of(attrConfYaml("jpn", "invalid"), new String[]{}, INVALID, null), - Arguments.of("", new String[]{}, MISSING, null) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(String yamlArgs, String[] cmdArgs, ValidationResult expectedResult, List expectedConfig) - throws ParseException, YamlInvalidContentException { - AttributeConfigValidator underTest = new AttributeConfigValidator(); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - assertIterableEquals(expectedConfig, Config.getInstance().getAttributeConfig()); - } - - private static String attrConfYaml(String... languages) { - StringBuilder yaml = new StringBuilder("attribute-config: "); - int counter = 0; - for (int i = 0; i < languages.length; i += 2) { - counter++; - yaml.append(String.format("\n %s:\n audio: %s\n subtitle: %s", counter, languages[i], languages[i+1])); - } - return yaml.toString(); - } - - private static List attrConf(String... languages) { - List conf = new ArrayList<>(); - for (int i = 0; i < languages.length; i += 2) { - conf.add(new AttributeConfig(languages[i], languages[i+1])); - } - return conf; - } -} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidatorTest.java deleted file mode 100644 index 15411c6..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/BooleanValidatorTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.yamlList; -import static org.junit.jupiter.api.Assertions.assertEquals; - -class BooleanValidatorTest { - private static CommandLineParser parser; - private static Options options; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - options.addOption(optionOf(SAFE_MODE, SAFE_MODE.abrv(), SAFE_MODE.args())); - } - - private static Stream provideTestCases() { - return Stream.of( - Arguments.of(SAFE_MODE, false, "", new String[]{"-safe-mode"}, VALID), - Arguments.of(SAFE_MODE, true, "", new String[]{"-safe-mode"}, VALID), - Arguments.of(SAFE_MODE, false, "", new String[]{""}, NOT_PRESENT), - Arguments.of(SAFE_MODE, true, "", new String[]{""}, MISSING), - Arguments.of(SAFE_MODE, false, yamlList(ARGUMENTS, SAFE_MODE), new String[]{""}, VALID), - Arguments.of(SAFE_MODE, true, yamlList(ARGUMENTS, SAFE_MODE), new String[]{""}, VALID), - Arguments.of(SAFE_MODE, false, yamlList(ARGUMENTS, WINDOWS), new String[]{""}, NOT_PRESENT), - Arguments.of(SAFE_MODE, true, yamlList(ARGUMENTS, WINDOWS), new String[]{""}, MISSING) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(ConfigProperty property, boolean required, String yamlArgs, String[] cmdArgs, - ValidationResult expectedResult) throws ParseException, YamlInvalidContentException { - BooleanValidator underTest = new BooleanValidator(property, required); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - } -} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidatorTest.java deleted file mode 100644 index fb66685..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/MkvToolNixPathValidatorTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.io.File; -import java.nio.file.Path; -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.MISSING; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -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; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - 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", 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", TEST_INVALID_DIR}, INVALID) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(ConfigProperty property, boolean required, File defaultValue, String yamlArgs, String[] cmdArgs, - ValidationResult expectedResult) throws ParseException, YamlInvalidContentException { - MkvToolNixPathValidator underTest = new MkvToolNixPathValidator(property, required, defaultValue); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - } - -} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java deleted file mode 100644 index b3e710a..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PathValidatorTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.io.File; -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.INVALID; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.LIBRARY; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_DIR; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.TEST_FILE; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.argumentsOf; -import static org.junit.jupiter.api.Assertions.*; - -class PathValidatorTest { - private static CommandLineParser parser; - private static Options options; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - options.addOption(optionOf(LIBRARY, LIBRARY.abrv(), LIBRARY.args())); - } - - private static Stream provideTestCases() { - return Stream.of( - argumentsOf(LIBRARY, false, null, "library-path: " + TEST_DIR, new String[]{}, VALID), - argumentsOf(LIBRARY, true, null, "", new String[]{"-l", TEST_FILE}, VALID), - - argumentsOf(LIBRARY, false, TEST_DIR, "", new String[]{}, DEFAULT), - argumentsOf(LIBRARY, true, TEST_FILE, "", new String[]{}, DEFAULT), - argumentsOf(LIBRARY, true, null, "", new String[]{}, MISSING), - argumentsOf(LIBRARY, false, null, "", new String[]{}, NOT_PRESENT), - - argumentsOf(LIBRARY, true, null, "", new String[]{"-l", TEST_DIR + "/invalid"}, INVALID), - argumentsOf(LIBRARY, false, null, "library-path: " + TEST_DIR + "/invalid", new String[]{}, INVALID), - argumentsOf(LIBRARY, true, TEST_DIR, "", new String[]{"-l", TEST_DIR + "/invalid"}, INVALID) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(ConfigProperty property, boolean required, File defaultValue, String yamlArgs, String[] cmdArgs, - ValidationResult expectedResult) throws ParseException, YamlInvalidContentException { - PathValidator underTest = new PathValidator(property, required, defaultValue); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - } -} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java deleted file mode 100644 index cae1059..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/PatternValidatorTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.regex.Pattern; -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.INVALID; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.INCLUDE_PATTERN; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.argumentsOf; -import static org.junit.jupiter.api.Assertions.*; - -class PatternValidatorTest { - private static CommandLineParser parser; - private static Options options; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - options.addOption(optionOf(INCLUDE_PATTERN, INCLUDE_PATTERN.abrv(), INCLUDE_PATTERN.args())); - } - - private static Stream provideTestCases() { - return Stream.of( - argumentsOf(INCLUDE_PATTERN, false, null, "include-pattern: \"[abd]?.*\"", new String[]{}, VALID), - argumentsOf(INCLUDE_PATTERN, true, null, "", new String[]{"-i", "[abd]?.*"}, VALID), - - argumentsOf(INCLUDE_PATTERN, false, Pattern.compile(".*"), "", new String[]{}, DEFAULT), - argumentsOf(INCLUDE_PATTERN, true, Pattern.compile(".*"), "", new String[]{}, DEFAULT), - - argumentsOf(INCLUDE_PATTERN, true, null, "", new String[]{}, MISSING), - argumentsOf(INCLUDE_PATTERN, false, null, "", new String[]{}, NOT_PRESENT), - - argumentsOf(INCLUDE_PATTERN, true, null, "", new String[]{"-i", "?."}, INVALID), - argumentsOf(INCLUDE_PATTERN, false, null, "include-pattern: \"[arst*\"", new String[]{}, INVALID), - argumentsOf(INCLUDE_PATTERN, true, Pattern.compile(".?"), "", new String[]{"-i", "?."}, INVALID) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(ConfigProperty property, boolean required, Pattern defaultValue, String yamlArgs, String[] cmdArgs, - ValidationResult expectedResult) throws ParseException, YamlInvalidContentException { - PatternValidator underTest = new PatternValidator(property, required, defaultValue); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - } -} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidatorTest.java deleted file mode 100644 index 174a5b8..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/SetValidatorTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.COMMENTARY_KEYWORDS; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.argumentsOf; -import static org.junit.jupiter.api.Assertions.assertEquals; - -class SetValidatorTest { - - private static CommandLineParser parser; - private static Options options; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - options.addOption(optionOf(COMMENTARY_KEYWORDS, COMMENTARY_KEYWORDS.abrv(), COMMENTARY_KEYWORDS.args())); - } - - @BeforeEach - void beforeEach() { - Config.getInstance(true); - } - - private static Stream provideTestCases() { - return Stream.of( - argumentsOf(COMMENTARY_KEYWORDS, true, true, "", new String[]{"-ck", "test"}, VALID, 3), - argumentsOf(COMMENTARY_KEYWORDS, true, false, COMMENTARY_KEYWORDS.prop() + ": [test]", new String[]{}, VALID, 1), - argumentsOf(COMMENTARY_KEYWORDS, true, false, COMMENTARY_KEYWORDS.prop() + ":\n - test\n - test2", new String[]{}, VALID, 2), - 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), - argumentsOf(COMMENTARY_KEYWORDS, false, true, "", new String[]{}, NOT_PRESENT, 2) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(ConfigProperty property, boolean required, boolean append, String yamlArgs, String[] cmdArgs, - ValidationResult expectedResult, int expectedSize) throws ParseException, YamlInvalidContentException { - SetValidator underTest = new SetValidator(property, required, append); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - assertEquals(expectedSize, Config.getInstance().getCommentaryKeywords().size()); - } -} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidatorTest.java deleted file mode 100644 index d3d5dd3..0000000 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/ThreadValidatorTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; -import at.pcgamingfreaks.yaml.YAML; -import at.pcgamingfreaks.yaml.YamlInvalidContentException; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.stream.Stream; - -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.THREADS; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.CommandLineOptionsUtil.optionOf; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.argumentsOf; -import static org.junit.jupiter.api.Assertions.assertEquals; - -class ThreadValidatorTest { - - private static CommandLineParser parser; - private static Options options; - - @BeforeAll - static void before() { - parser = new DefaultParser(); - options = new Options(); - options.addOption(optionOf(THREADS, "t", THREADS.args())); - } - - private static Stream provideTestCases() { - return Stream.of( - argumentsOf(THREADS, false, null, "", new String[]{"-t", "10"}, VALID), - argumentsOf(THREADS, true, null, "", new String[]{"-t", "10"}, VALID), - argumentsOf(THREADS, false, null, "threads: 10", new String[]{}, VALID), - argumentsOf(THREADS, true, null, "threads: 10", new String[]{}, VALID), - argumentsOf(THREADS, false, 2, "", new String[]{}, DEFAULT), - argumentsOf(THREADS, true, null, "", new String[]{}, MISSING), - argumentsOf(THREADS, false, null, "", new String[]{}, NOT_PRESENT), - argumentsOf(THREADS, true, null, "", new String[]{"-t", "-1"}, INVALID), - argumentsOf(THREADS, true, null, "threads: 0", new String[]{}, INVALID), - argumentsOf(THREADS, true, 2, "", new String[]{"-t", "0"}, INVALID) - ); - } - - @ParameterizedTest - @MethodSource("provideTestCases") - void validate(ConfigProperty property, boolean required, Integer defaultValue, String yamlArgs, String[] cmdArgs, - ValidationResult expectedResult) throws ParseException, YamlInvalidContentException { - ThreadValidator underTest = new ThreadValidator(property, required, defaultValue); - - ValidationResult result = underTest.validate(new YAML(yamlArgs), parser.parse(options, cmdArgs)); - - assertEquals(expectedResult, result); - } -} \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/DateUtilsTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/DateUtilsTest.java index 3ff73c3..917a8ea 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/DateUtilsTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/DateUtilsTest.java @@ -1,11 +1,13 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.util; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.util.Date; import static org.junit.jupiter.api.Assertions.*; +@Disabled class DateUtilsTest { @Test diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/TestUtil.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/TestUtil.java index 0c08e15..458c4ba 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/TestUtil.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/TestUtil.java @@ -43,4 +43,12 @@ public class TestUtil { fileInfoDto.setMatchedConfig(config); return fileInfoDto; } + + public static String[] args(String... args) { + String[] staticArray = new String[]{"-l", "/", "-a", "jpn:ger"}; + String[] result = new String[staticArray.length + args.length]; + System.arraycopy(staticArray, 0, result, 0, staticArray.length); + System.arraycopy(args, 0, result, staticArray.length, args.length); + return result; + } } diff --git a/src/wix/resources/main.wxs b/src/wix/resources/main.wxs new file mode 100644 index 0000000..bcd994e --- /dev/null +++ b/src/wix/resources/main.wxs @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Not Installed + Not Installed + Not Installed + + + Not Installed + + + Not Installed + + + Not Installed + + + + JP_UPGRADABLE_FOUND + + + JP_DOWNGRADABLE_FOUND + + + + + + + + + + +