diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java index f1bb914..db85668 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java @@ -1,7 +1,9 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ConfigLoader; 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.impl.MkvFileProcessor; @@ -11,7 +13,9 @@ import lombok.extern.slf4j.Slf4j; public class Main { public static void main(String[] args) { ConfigLoader.initConfig(args); - AttributeUpdaterKernel kernel = new DefaultAttributeUpdaterKernel(new MkvFileCollector(), new MkvFileProcessor()); + AttributeUpdaterKernel kernel = Config.getInstance().getCoherent() != null + ? new CoherentAttributeUpdaterKernel(new MkvFileCollector(), new MkvFileProcessor()) + : new DefaultAttributeUpdaterKernel(new MkvFileCollector(), new MkvFileProcessor()); kernel.execute(); } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java index 5316bd7..7673311 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java @@ -28,7 +28,8 @@ public class ConfigLoader { new SetValidator(FORCED_KEYWORDS, false, true), new SetValidator(COMMENTARY_KEYWORDS, false, true), new SetValidator(EXCLUDED_DIRECTORY, false, true), - new AttributeConfigValidator() + new AttributeConfigValidator(), + new CoherentConfigValidator(COHERENT, false) ); public static void initConfig(String[] args) { 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 c6aec48..25edaf9 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/CoherentConfigValidator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/validator/CoherentConfigValidator.java @@ -17,6 +17,6 @@ public class CoherentConfigValidator extends ConfigValidator { @Override boolean isValid(Integer result) { - return result > 0; + return result >= 0; } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileCollector.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileCollector.java index d60ac8b..5ea56da 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileCollector.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileCollector.java @@ -10,4 +10,13 @@ public interface FileCollector { * @return list of all files within the directory */ List loadFiles(String path); + + /** + * Load all directories from path, but only until depth is reached. + * + * @param path leads to a directory which will be loaded recursively until depth + * @param depth limit directory crawling + * @return list of directory until depth + */ + List loadDirectories(String path, int depth); } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java index 282936b..b48a57b 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java @@ -16,6 +16,9 @@ import java.util.stream.Stream; public class MkvFileCollector implements FileCollector { private static final String[] fileExtensions = new String[]{".mkv", ".mka", ".mks", ".mk3d"}; + /** + * {@inheritDoc} + */ @Override public List loadFiles(String path) { try (Stream paths = Files.walk(Paths.get(path))) { @@ -28,4 +31,19 @@ public class MkvFileCollector implements FileCollector { return new ArrayList<>(); } } + + /** + * {@inheritDoc} + */ + @Override + public List loadDirectories(String path, int depth) { + try (Stream paths = Files.walk(Paths.get(path), depth)) { + return paths.map(Path::toFile) + .filter(File::isDirectory) + .collect(Collectors.toList()); + } catch (IOException e) { + log.error("Couldn't find file or directory!", e); + return new ArrayList<>(); + } + } } 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 699919a..7adce3f 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/AttributeUpdaterKernel.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/AttributeUpdaterKernel.java @@ -15,10 +15,12 @@ import me.tongfei.progressbar.ProgressBarStyle; import java.io.File; import java.io.IOException; +import java.util.Collection; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @@ -57,6 +59,16 @@ public abstract class AttributeUpdaterKernel { statistic.printResult(); } + protected List loadExcludedFiles() { + List excludedFiles = Config.getInstance().getExcludedDirectories().stream() + .map(collector::loadFiles) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + statistic.increaseTotalBy(excludedFiles.size()); + statistic.increaseExcludedBy(excludedFiles.size()); + return excludedFiles; + } + /** * Load files or directories to update. * Remove excluded directories. diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/CoherentAttributeUpdaterKernel.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/CoherentAttributeUpdaterKernel.java index 7f5c76b..9ad07a7 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/CoherentAttributeUpdaterKernel.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/CoherentAttributeUpdaterKernel.java @@ -1,14 +1,17 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.kernel; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileCollector; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileProcessor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.io.File; import java.util.List; +import java.util.stream.Collectors; @Slf4j -public class CoherentAttributeUpdaterKernel extends AttributeUpdaterKernel{ +public class CoherentAttributeUpdaterKernel extends AttributeUpdaterKernel { public CoherentAttributeUpdaterKernel(FileCollector collector, FileProcessor processor) { super(collector, processor); @@ -19,7 +22,19 @@ public class CoherentAttributeUpdaterKernel extends AttributeUpdaterKernel{ */ @Override List loadFiles(String path) { - return null; + List excludedFiles = loadExcludedFiles(); + List directories = collector.loadDirectories(path, Config.getInstance().getCoherent()) + .stream().filter(file -> !excludedFiles.contains(file)) + .collect(Collectors.toList()); + return directories.stream() + .filter(dir -> isParentDirectory(dir, directories)) + .collect(Collectors.toList()); + } + + private boolean isParentDirectory(File directory, List directories) { + String path = directory.getAbsolutePath(); + return directories.stream() + .noneMatch(dir -> dir.getAbsolutePath().contains(path) && !StringUtils.equals(path, dir.getAbsolutePath())); } /** diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/DefaultAttributeUpdaterKernel.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/DefaultAttributeUpdaterKernel.java index 9c50e8d..b40b8c5 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/DefaultAttributeUpdaterKernel.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/DefaultAttributeUpdaterKernel.java @@ -25,12 +25,7 @@ public class DefaultAttributeUpdaterKernel extends AttributeUpdaterKernel { */ @Override List loadFiles(String path) { - List excludedFiles = Config.getInstance().getExcludedDirectories().stream() - .map(collector::loadFiles) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - statistic.increaseTotalBy(excludedFiles.size()); - statistic.increaseExcludedBy(excludedFiles.size()); + List excludedFiles = loadExcludedFiles(); return collector.loadFiles(Config.getInstance().getLibraryPath().getAbsolutePath()).stream() .filter(file -> !excludedFiles.contains(file)) .collect(Collectors.toList()); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java index b939e51..de8275d 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java @@ -15,7 +15,7 @@ public enum ConfigProperty { CONFIG_PATH("config-path", "Path to config file", "p", 1), MKV_TOOL_NIX("mkvtoolnix", "Path to mkv tool nix installation", "m", 1), SAFE_MODE("safe-mode", "Test run (no files will be changes)", "s", 0), - COHERENT("coherent", "Try to match whole series with same config", null, 0), + COHERENT("coherent", "Try to match whole series with same config", "c", 1), WINDOWS("windows", "Is operating system windows", null, 0), THREADS("threads", "Thread count (default: 2)", "t", 1), INCLUDE_PATTERN("include-pattern", "Include files matching pattern (default: \".*\")", "i", 1),