From be004e6146d4a51936a241821e0e40f380aa62ca Mon Sep 17 00:00:00 2001 From: RatzzFatzz Date: Sun, 28 Dec 2025 23:59:33 +0100 Subject: [PATCH] Add support for multiple library paths --- .../impl/processors/CoherentAttributeUpdater.java | 5 ++++- .../impl/processors/SingleFileAttributeUpdater.java | 5 ++++- .../impl/validation/ValidFileValidator.java | 7 ++++--- .../mkvaudiosubtitlechanger/model/InputConfig.java | 6 +++--- .../validation/ValidationExecutionStrategyTest.java | 10 +++++----- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdater.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdater.java index 61459ad..5618ae1 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdater.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/CoherentAttributeUpdater.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import me.tongfei.progressbar.ProgressBarBuilder; import java.io.File; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -25,7 +26,9 @@ public class CoherentAttributeUpdater extends SingleFileAttributeUpdater { } protected List getFiles() { - return fileProcessor.loadDirectory(config.getLibraryPath().getPath(), config.getCoherent()); + return Arrays.stream(config.getLibraryPaths()) + .flatMap(path -> fileProcessor.loadDirectory(path.getPath(), config.getCoherent()).stream()) + .toList(); } @Override diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/SingleFileAttributeUpdater.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/SingleFileAttributeUpdater.java index a8c64ee..a75ee22 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/SingleFileAttributeUpdater.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/SingleFileAttributeUpdater.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import me.tongfei.progressbar.ProgressBarBuilder; import java.io.File; +import java.util.Arrays; import java.util.List; @Slf4j @@ -23,7 +24,9 @@ public class SingleFileAttributeUpdater extends AttributeUpdater { @Override protected List getFiles() { - return fileProcessor.loadFiles(config.getLibraryPath().getPath()); + return Arrays.stream(config.getLibraryPaths()) + .flatMap(path -> fileProcessor.loadFiles(path.getPath()).stream()) + .toList(); } @Override diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/validation/ValidFileValidator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/validation/ValidFileValidator.java index b111865..0a7a278 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/validation/ValidFileValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/validation/ValidFileValidator.java @@ -4,14 +4,15 @@ import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; import java.io.File; +import java.util.Arrays; -public class ValidFileValidator implements ConstraintValidator { +public class ValidFileValidator implements ConstraintValidator { @Override public void initialize(ValidFile constraintAnnotation) { } @Override - public boolean isValid(File file, ConstraintValidatorContext context) { - return file != null && file.exists(); + public boolean isValid(File[] files, ConstraintValidatorContext context) { + return files != null && files.length > 0 && Arrays.stream(files).allMatch(File::exists); } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/InputConfig.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/InputConfig.java index bc9e69a..00a9418 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/InputConfig.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/InputConfig.java @@ -29,8 +29,8 @@ public class InputConfig implements CommandLine.IVersionProvider { CommandLine.Model.CommandSpec spec; @ValidFile(message = "does not exist") - @CommandLine.Parameters(description = "path to library") - private File libraryPath; + @CommandLine.Parameters(description = "paths to library", arity = "1..*") + private File[] libraryPaths; @Option(names = {"-a", "--attribute-config"}, arity = "1..*", converter = AttributeConfigConverter.class, description = "List of audio:subtitle pairs for matching defaults in order (e.g. jpn:eng jpn:ger)") @@ -91,7 +91,7 @@ public class InputConfig implements CommandLine.IVersionProvider { return new StringJoiner(", ", InputConfig.class.getSimpleName() + "[", "]") .add("configPath=" + configPath) .add("spec=" + spec) - .add("libraryPath=" + libraryPath) + .add("libraryPath=" + libraryPaths) .add("attributeConfig=" + Arrays.toString(attributeConfig)) .add("mkvToolNix=" + mkvToolNix) .add("safeMode=" + safeMode) diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/validation/ValidationExecutionStrategyTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/validation/ValidationExecutionStrategyTest.java index 41a5d04..9ae7b45 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/validation/ValidationExecutionStrategyTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/validation/ValidationExecutionStrategyTest.java @@ -12,7 +12,6 @@ import java.io.StringWriter; import java.util.stream.Stream; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.PathUtils.*; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.util.TestUtil.args; import static org.junit.jupiter.api.Assertions.*; class ValidationExecutionStrategyTest { @@ -24,16 +23,17 @@ class ValidationExecutionStrategyTest { .setExecutionStrategy(new ValidationExecutionStrategy()) .parseArgs("-a", "ger:ger", "-m", TEST_MKVTOOLNIX_DIR, TEST_FILE); - assertEquals(TEST_FILE, underTest.getConfig().getLibraryPath().getPath().replace("\\", "/")); + assertEquals(TEST_FILE, underTest.getConfig().getLibraryPaths()[0].getPath().replace("\\", "/")); assertEquals(TEST_MKVTOOLNIX_DIR, underTest.getConfig().getMkvToolNix().getPath().replace("\\", "/")); } private static Stream validateFailure() { return Stream.of( - Arguments.of(new String[]{"-a", "jpn:ger"}, "Error: Missing required argument(s): "), - Arguments.of(new String[]{"/arstarstarst"}, "libraryPath does not exist"), + Arguments.of(new String[]{"-a", "jpn:ger"}, "Error: Missing required argument(s): "), + Arguments.of(new String[]{"/arstarstarst"}, "libraryPaths does not exist"), + Arguments.of(new String[]{TEST_DIR + " /arstarstarst"}, "libraryPaths does not exist"), Arguments.of(new String[]{"/arstarstarst", "-a",}, "Missing required parameter for option '--attribute-config' at index 0 ()"), - Arguments.of(new String[]{"/arstarstarst", "-a", "jpn:ger"}, "libraryPath does not exist"), + Arguments.of(new String[]{"/arstarstarst", "-a", "jpn:ger"}, "libraryPaths does not exist"), Arguments.of(new String[]{"/arstarstarst", "-m"}, "Missing required parameter for option '--mkvtoolnix' ()"), Arguments.of(new String[]{"./", "-m", TEST_INVALID_DIR}, "mkvToolNix does not exist"), Arguments.of(new String[]{"./", "-t"}, "Missing required parameter for option '--threads' ()"),