diff --git a/pom.xml b/pom.xml index 4038330..8e8ab40 100644 --- a/pom.xml +++ b/pom.xml @@ -136,22 +136,6 @@ log4j-slf4j-impl 2.17.1 - - org.slf4j - slf4j-log4j12 - 1.7.28 - test - - - org.slf4j - jcl-over-slf4j - 1.7.28 - - - org.slf4j - jul-to-slf4j - 1.7.28 - com.fasterxml.jackson.dataformat jackson-dataformat-yaml diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java deleted file mode 100644 index c009087..0000000 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java +++ /dev/null @@ -1,92 +0,0 @@ -package at.pcgamingfreaks.mkvaudiosubtitlechanger; - -import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileCollector; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileProcessor; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileAttribute; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ResultStatistic; -import lombok.SneakyThrows; -import lombok.extern.log4j.Log4j2; -import me.tongfei.progressbar.ProgressBar; -import me.tongfei.progressbar.ProgressBarBuilder; -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; - -@Log4j2 -public class AttributeUpdaterKernel { - - private final ExecutorService executor = Executors.newFixedThreadPool(Config.getInstance().getThreads()); - private final FileCollector collector; - private final FileProcessor processor; - private final ResultStatistic statistic = new ResultStatistic(); - - public AttributeUpdaterKernel(FileCollector collector, FileProcessor processor) { - this.collector = collector; - this.processor = processor; - } - - @SneakyThrows - public void execute() { - statistic.startTimer(); - - try (ProgressBar progressBar = pbBuilder().build()) { - List excludedFiles = Config.getInstance().getExcludedDirectories().stream() - .map(collector::loadFiles) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - List files = collector.loadFiles(Config.getInstance().getLibraryPath().getAbsolutePath()).stream() - .filter(file -> !excludedFiles.contains(file)) - .collect(Collectors.toList()); - progressBar.maxHint(files.size()); - files.forEach(file -> executor.submit(() -> process(file, progressBar))); - executor.shutdown(); - executor.awaitTermination(1, TimeUnit.DAYS); - } - - statistic.stopTimer(); - System.out.println(statistic); - log.info(statistic); - } - - private void process(File file, ProgressBar progressBar) { - List attributes = processor.loadAttributes(file); - FileInfoDto fileInfo = processor.filterAttributes(attributes); - statistic.total(); - if (fileInfo.isChangeNecessary()) { - statistic.shouldChange(); - if (!Config.getInstance().isSafeMode()) { - try { - processor.update(file, fileInfo); - statistic.success(); - log.info("Updated {}", file.getAbsolutePath()); - } catch (IOException | RuntimeException e) { - statistic.failedChanging(); - log.warn("File couldn't be updated: '{}', Error: {}", file.getAbsoluteFile(), e.getMessage().replaceAll("\\r|\\n", " ")); - } - } - } else if (fileInfo.isUnableToApplyConfig()) { - statistic.noSuitableConfigFound(); - } else if (fileInfo.isAlreadySuitable()){ - statistic.alreadyFits(); - } else { - statistic.failure(); - } - progressBar.step(); - } - - private static ProgressBarBuilder pbBuilder() { - return new ProgressBarBuilder() - .setStyle(ProgressBarStyle.ASCII) - .setUpdateIntervalMillis(250) - .setMaxRenderedLength(75); - } -} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java index efd6077..f1bb914 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java @@ -1,16 +1,17 @@ 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.DefaultAttributeUpdaterKernel; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileCollector; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileProcessor; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; -@Log4j2 +@Slf4j public class Main { public static void main(String[] args) { ConfigLoader.initConfig(args); - AttributeUpdaterKernel kernel = new AttributeUpdaterKernel(new MkvFileCollector(), new MkvFileProcessor()); + AttributeUpdaterKernel kernel = new DefaultAttributeUpdaterKernel(new MkvFileCollector(), new MkvFileProcessor()); kernel.execute(); } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java index 98e21b0..682ecb3 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java @@ -6,7 +6,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.HelpFormatter; @@ -15,7 +15,7 @@ import java.io.File; import java.util.*; import java.util.regex.Pattern; -@Log4j2 +@Slf4j @Getter @Setter @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java index 19fa69d..5316bd7 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/ConfigLoader.java @@ -27,7 +27,7 @@ public class ConfigLoader { new PatternValidator(INCLUDE_PATTERN, false, Pattern.compile(".*")), new SetValidator(FORCED_KEYWORDS, false, true), new SetValidator(COMMENTARY_KEYWORDS, false, true), - new SetValidator(EXCLUDE_DIRECTORY, false, true), + new SetValidator(EXCLUDED_DIRECTORY, false, true), new AttributeConfigValidator() ); @@ -55,7 +55,7 @@ public class ConfigLoader { } } - if (results.contains(ValidationResult.INVALID)) System.exit(1); + if (results.contains(ValidationResult.INVALID) || results.contains(ValidationResult.MISSING)) System.exit(1); System.out.println(); } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/exceptions/MkvToolNixException.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/exceptions/MkvToolNixException.java new file mode 100644 index 0000000..c2fc0b3 --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/exceptions/MkvToolNixException.java @@ -0,0 +1,13 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.exceptions; + +public class MkvToolNixException extends RuntimeException{ + + public MkvToolNixException(String message) { + super(message); + } + + @Override + public String getMessage() { + return super.getMessage().replaceAll("\\r|\\n", " "); + } +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileProcessor.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileProcessor.java index 5a5b105..dff66fb 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileProcessor.java @@ -1,5 +1,6 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.exceptions.MkvToolNixException; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileAttribute; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto; @@ -10,12 +11,35 @@ import java.util.List; public interface FileProcessor { /** + * Load track information from file. + * * @param file Takes the file from which the attributes will be returned * @return list of all important attributes */ List loadAttributes(File file); - FileInfoDto filterAttributes(List attributes); + /** + * Populate FileInfoDto with the currently set default tracks. + * @param info to be populated + * @param attributes Track information of FileInfoDto + * @param nonForcedTracks List of all not forced tracks + */ + void detectDefaultTracks(FileInfoDto info, List attributes, List nonForcedTracks); - void update(File file, FileInfoDto fileInfo) throws IOException; + /** + * Populate FileInfoDto with the desired tracks, based on AttributeConfig. + * @param info to be populated + * @param nonForcedTracks List of all not forced tracks + * @param nonCommentaryTracks List of all not commentary tracks + */ + void detectDesiredTracks(FileInfoDto info, List nonForcedTracks, List nonCommentaryTracks); + + /** + * Update the file. + * @param file to be updated + * @param fileInfo information to update file + * @throws IOException + * @throws MkvToolNixException when error occurs while sending query to mkvpropedit + */ + void update(File file, FileInfoDto fileInfo) throws IOException, MkvToolNixException; } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java index cdd739e..282936b 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileCollector.java @@ -1,6 +1,6 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.IOException; @@ -12,7 +12,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -@Log4j2 +@Slf4j public class MkvFileCollector implements FileCollector { private static final String[] fileExtensions = new String[]{".mkv", ".mka", ".mks", ".mk3d"}; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java index 0457d38..8bbd657 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java @@ -1,11 +1,11 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl; import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.exceptions.MkvToolNixException; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.*; import at.pcgamingfreaks.mkvaudiosubtitlechanger.util.SetUtils; import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.StringUtils; +import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.core.util.IOUtils; import java.io.File; @@ -19,14 +19,13 @@ import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.LaneType.AUDIO; import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.LaneType.SUBTITLES; import static java.lang.String.format; -@Log4j2 +@Slf4j public class MkvFileProcessor implements FileProcessor { private final ObjectMapper mapper = new ObjectMapper(); private static final String DISABLE_DEFAULT_TRACK = "--edit track:%s --set flag-default=0 "; private static final String ENABLE_DEFAULT_TRACK = "--edit track:%s --set flag-default=1 "; private static final String ENABLE_FORCED_TRACK = "--edit track:%s --set flag-forced=1 "; - @SuppressWarnings("unchecked") @Override public List loadAttributes(File file) { @@ -62,7 +61,7 @@ public class MkvFileProcessor implements FileProcessor { } } - log.debug(fileAttributes); + log.debug(fileAttributes.toString()); } catch (IOException e) { e.printStackTrace(); log.error("File could not be found or loaded!"); @@ -70,27 +69,11 @@ public class MkvFileProcessor implements FileProcessor { return fileAttributes; } + /** + * {@inheritDoc} + */ @Override - public FileInfoDto filterAttributes(List attributes) { - FileInfoDto info = new FileInfoDto(); - List nonForcedTracks = attributes.stream() - .filter(elem -> !StringUtils.containsAnyIgnoreCase(elem.getTrackName(), - Config.getInstance().getForcedKeywords().toArray(new CharSequence[0]))) - .filter(elem -> !elem.isForcedTrack()) - .collect(Collectors.toList()); - List nonCommentaryTracks = attributes.stream() - .filter(elem -> !StringUtils.containsAnyIgnoreCase(elem.getTrackName(), - Config.getInstance().getCommentaryKeywords().toArray(new CharSequence[0]))) - .collect(Collectors.toList()); - - detectDefaultTracks(info, attributes, nonForcedTracks); - detectDesiredTracks(info, nonForcedTracks, nonCommentaryTracks); - log.debug(info); - - return info; - } - - protected void detectDefaultTracks(FileInfoDto info, List attributes, List nonForcedTracks) { + public void detectDefaultTracks(FileInfoDto info, List attributes, List nonForcedTracks) { Set detectedForcedSubtitleLanes = new HashSet<>(); for (FileAttribute attribute : attributes) { if (attribute.isDefaultTrack() && AUDIO.equals(attribute.getType())) @@ -108,7 +91,11 @@ public class MkvFileProcessor implements FileProcessor { ); } - protected void detectDesiredTracks(FileInfoDto info, List nonForcedTracks, List nonCommentaryTracks) { + /** + * {@inheritDoc} + */ + @Override + public void detectDesiredTracks(FileInfoDto info, List nonForcedTracks, List nonCommentaryTracks) { for (AttributeConfig config : Config.getInstance().getAttributeConfig()) { FileAttribute desiredAudio = null; FileAttribute desiredSubtitle = null; @@ -126,11 +113,15 @@ public class MkvFileProcessor implements FileProcessor { } } + /** + * {@inheritDoc} + */ @Override - public void update(File file, FileInfoDto fileInfo) throws IOException, RuntimeException { + public void update(File file, FileInfoDto fileInfo) throws IOException, MkvToolNixException { StringBuilder sb = new StringBuilder(); sb.append(format("\"%s\" ", Config.getInstance().getPathFor(MkvToolNix.MKV_PROP_EDIT))); sb.append(format("\"%s\" ", file.getAbsolutePath())); + if (fileInfo.isAudioDifferent()) { if (fileInfo.getDefaultAudioLanes() != null && !fileInfo.getDefaultSubtitleLanes().isEmpty()) { for (FileAttribute track: fileInfo.getDefaultAudioLanes()) { @@ -139,6 +130,7 @@ public class MkvFileProcessor implements FileProcessor { } sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredAudioLane().getId())); } + if (fileInfo.isSubtitleDifferent()) { if (fileInfo.getDefaultSubtitleLanes() != null && !fileInfo.getDefaultSubtitleLanes().isEmpty()) { for (FileAttribute track: fileInfo.getDefaultSubtitleLanes()) { @@ -147,6 +139,7 @@ public class MkvFileProcessor implements FileProcessor { } sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredSubtitleLane().getId())); } + if (fileInfo.areForcedTracksDifferent()) { for (FileAttribute attribute : fileInfo.getDesiredForcedSubtitleLanes()) { sb.append(format(ENABLE_FORCED_TRACK, attribute.getId())); @@ -156,6 +149,6 @@ public class MkvFileProcessor implements FileProcessor { InputStream inputstream = Runtime.getRuntime().exec(sb.toString()).getInputStream(); String output = IOUtils.toString(new InputStreamReader(inputstream)); log.debug(output); - if (output.contains("Error")) throw new RuntimeException(output); + if (output.contains("Error")) throw new MkvToolNixException(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 new file mode 100644 index 0000000..699919a --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/AttributeUpdaterKernel.java @@ -0,0 +1,116 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.kernel; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.exceptions.MkvToolNixException; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileCollector; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileProcessor; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ResultStatistic; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.tongfei.progressbar.ProgressBar; +import me.tongfei.progressbar.ProgressBarBuilder; +import me.tongfei.progressbar.ProgressBarStyle; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +@Slf4j +@RequiredArgsConstructor +public abstract class AttributeUpdaterKernel { + + protected final FileCollector collector; + protected final FileProcessor processor; + protected final ResultStatistic statistic = new ResultStatistic(); + private final ExecutorService executor = Executors.newFixedThreadPool(Config.getInstance().getThreads()); + + private static ProgressBarBuilder pbBuilder() { + return new ProgressBarBuilder() + .setStyle(ProgressBarStyle.ASCII) + .setUpdateIntervalMillis(250) + .setMaxRenderedLength(75); + } + + @SneakyThrows + public void execute() { + statistic.startTimer(); + + try (ProgressBar progressBar = pbBuilder().build()) { + List files = loadFiles(Config.getInstance().getLibraryPath().getAbsolutePath()); + progressBar.maxHint(files.size()); + + files.forEach(file -> executor.submit(() -> { + process(file); + progressBar.step(); + })); + + executor.shutdown(); + executor.awaitTermination(1, TimeUnit.DAYS); + } + + statistic.stopTimer(); + statistic.printResult(); + } + + /** + * Load files or directories to update. + * Remove excluded directories. + * + * @param path Path to library + * @return List of files to update. + */ + abstract List loadFiles(String path); + + /** + * Start of the file updating process. + * This method is called by the executor and its contents are executed in parallel. + * + * @param file file or directory to update + */ + abstract void process(File file); + + /** + * Persist file changes. + * + * @param fileInfoDto contains information about file and desired configuration. + */ + protected void updateFile(FileInfoDto fileInfoDto) { + statistic.total(); + switch (fileInfoDto.getStatus()) { + case CHANGE_NECESSARY: + statistic.shouldChange(); + commitChange(fileInfoDto); + break; + case UNABLE_TO_APPLY: + statistic.noSuitableConfigFound(); + break; + case ALREADY_SUITED: + statistic.alreadyFits(); + break; + case UNKNOWN: + default: + statistic.failure(); + break; + } + } + + private void commitChange(FileInfoDto fileInfo) { + if (Config.getInstance().isSafeMode()) { + return; + } + + try { + processor.update(fileInfo.getFile(), fileInfo); + statistic.success(); + log.info("Updated {}", fileInfo.getFile().getAbsolutePath()); + } catch (IOException | MkvToolNixException e) { + statistic.failedChanging(); + log.warn("File couldn't be updated: '{}', Error: {}", fileInfo.getFile().getAbsoluteFile(), e.getMessage()); + } + } +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/CoherentAttributeUpdaterKernel.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/CoherentAttributeUpdaterKernel.java new file mode 100644 index 0000000..7f5c76b --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/CoherentAttributeUpdaterKernel.java @@ -0,0 +1,32 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.kernel; + +import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileCollector; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileProcessor; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.util.List; + +@Slf4j +public class CoherentAttributeUpdaterKernel extends AttributeUpdaterKernel{ + + public CoherentAttributeUpdaterKernel(FileCollector collector, FileProcessor processor) { + super(collector, processor); + } + + /** + * {@inheritDoc} + */ + @Override + List loadFiles(String path) { + return null; + } + + /** + * {@inheritDoc} + */ + @Override + void process(File file) { + + } +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/DefaultAttributeUpdaterKernel.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/DefaultAttributeUpdaterKernel.java new file mode 100644 index 0000000..9c50e8d --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/kernel/DefaultAttributeUpdaterKernel.java @@ -0,0 +1,63 @@ +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 at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileAttribute; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +public class DefaultAttributeUpdaterKernel extends AttributeUpdaterKernel { + + public DefaultAttributeUpdaterKernel(FileCollector collector, FileProcessor processor) { + super(collector, processor); + } + + /** + * {@inheritDoc} + */ + @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()); + return collector.loadFiles(Config.getInstance().getLibraryPath().getAbsolutePath()).stream() + .filter(file -> !excludedFiles.contains(file)) + .collect(Collectors.toList()); + } + + /** + * {@inheritDoc} + */ + @Override + void process(File file) { + FileInfoDto fileInfo = new FileInfoDto(file); + List attributes = processor.loadAttributes(file); + + // TODO: extract this to a attributeProcessor? + List nonForcedTracks = attributes.stream() + .filter(elem -> !StringUtils.containsAnyIgnoreCase(elem.getTrackName(), + Config.getInstance().getForcedKeywords().toArray(new CharSequence[0]))) + .filter(elem -> !elem.isForcedTrack()) + .collect(Collectors.toList()); + List nonCommentaryTracks = attributes.stream() + .filter(elem -> !StringUtils.containsAnyIgnoreCase(elem.getTrackName(), + Config.getInstance().getCommentaryKeywords().toArray(new CharSequence[0]))) + .collect(Collectors.toList()); + + processor.detectDefaultTracks(fileInfo, attributes, nonForcedTracks); + processor.detectDesiredTracks(fileInfo, nonForcedTracks, nonCommentaryTracks); + + updateFile(fileInfo); + } +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java index 53dd213..e905213 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java @@ -2,11 +2,11 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import java.util.Objects; -@Log4j2 +@Slf4j @Getter @AllArgsConstructor public class AttributeConfig { diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java index f525c0d..b939e51 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java @@ -19,7 +19,7 @@ public enum ConfigProperty { 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), - EXCLUDE_DIRECTORY("exclude-directories", "Directories to be excluded, combines with config file", "e", 1), + EXCLUDED_DIRECTORY("excluded-directories", "Directories to be excluded, combines with config file", "e", Option.UNLIMITED_VALUES), FORCED_KEYWORDS("forced-keywords", "Additional keywords to identify forced tracks", "fk", Option.UNLIMITED_VALUES), COMMENTARY_KEYWORDS("commentary-keywords", "Additional keywords to identify commentary tracks", "ck", Option.UNLIMITED_VALUES), ARGUMENTS("arguments", "List of arguments", null, 0), diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileAttribute.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileAttribute.java index cf115f5..3cb1771 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileAttribute.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileAttribute.java @@ -2,9 +2,9 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; -@Log4j2 +@Slf4j @Getter @AllArgsConstructor public class FileAttribute { diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileInfoDto.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileInfoDto.java index e498689..e0e2239 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileInfoDto.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileInfoDto.java @@ -1,32 +1,24 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.Setter; +import java.io.File; import java.util.HashSet; import java.util.Set; @Getter @Setter +@RequiredArgsConstructor public class FileInfoDto { + private final File file; private Set defaultAudioLanes = new HashSet<>(); private Set defaultSubtitleLanes = new HashSet<>(); private Set desiredForcedSubtitleLanes; private FileAttribute desiredAudioLane; private FileAttribute desiredSubtitleLane; - public boolean isUnableToApplyConfig() { - return desiredAudioLane == null && desiredSubtitleLane == null; - } - - public boolean isAlreadySuitable() { - return defaultAudioLanes.contains(desiredAudioLane) && defaultSubtitleLanes.contains(desiredSubtitleLane); - } - - public boolean isChangeNecessary() { - return isAudioDifferent() || isSubtitleDifferent() || areForcedTracksDifferent(); - } - public boolean isAudioDifferent() { return desiredAudioLane != null && (defaultAudioLanes == null || !defaultAudioLanes.contains(desiredAudioLane)); @@ -41,6 +33,25 @@ public class FileInfoDto { return desiredForcedSubtitleLanes.size() > 0; } + public FileStatus getStatus() { + if (isChangeNecessary()) return FileStatus.CHANGE_NECESSARY; + if (isUnableToApplyConfig()) return FileStatus.UNABLE_TO_APPLY; + if (isAlreadySuitable()) return FileStatus.ALREADY_SUITED; + return FileStatus.UNKNOWN; + } + + private boolean isUnableToApplyConfig() { + return desiredAudioLane == null && desiredSubtitleLane == null; + } + + private boolean isAlreadySuitable() { + return defaultAudioLanes.contains(desiredAudioLane) && defaultSubtitleLanes.contains(desiredSubtitleLane); + } + + private boolean isChangeNecessary() { + return isAudioDifferent() || isSubtitleDifferent() || areForcedTracksDifferent(); + } + @Override public String toString() { return "[" + "defaultAudioLanes=" + defaultAudioLanes + diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileStatus.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileStatus.java new file mode 100644 index 0000000..942faf9 --- /dev/null +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/FileStatus.java @@ -0,0 +1,8 @@ +package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; + +public enum FileStatus { + CHANGE_NECESSARY, + UNABLE_TO_APPLY, + ALREADY_SUITED, + UNKNOWN; +} diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java index 99acefd..e57c8c2 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java @@ -2,10 +2,13 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; import lombok.AccessLevel; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; @Getter +@Slf4j public class ResultStatistic { private static final String result = "Total files: %s%n" + + "├─ Excluded: %s%n" + "├─ Should change: %s%n" + "│ ├─ Failed changing: %s%n" + "│ └─ Successfully changed: %s%n" + @@ -15,6 +18,7 @@ public class ResultStatistic { "Runtime: %s"; private int filesTotal = 0; + private int excluded = 0; private int shouldChange = 0; private int failedChanging = 0; @@ -28,10 +32,22 @@ public class ResultStatistic { private long startTime = 0; private long runtime = 0; + public void increaseTotalBy(int amount) { + filesTotal += amount; + } + public synchronized void total() { filesTotal++; } + public void increaseExcludedBy(int amount) { + excluded += amount; + } + + public synchronized void excluded() { + excluded++; + } + public synchronized void shouldChange() { shouldChange++; } @@ -64,6 +80,11 @@ public class ResultStatistic { runtime = System.currentTimeMillis() - startTime; } + public void printResult() { + System.out.println(this); + log.info(this.toString()); + } + private String formatTimer() { int seconds = (int) (runtime / 1000); int minutes = seconds / 60; @@ -83,7 +104,7 @@ public class ResultStatistic { @Override public String toString() { - return String.format(result, filesTotal, shouldChange, failedChanging, successfullyChanged, + return String.format(result, filesTotal, excluded, shouldChange, failedChanging, successfullyChanged, noSuitableConfigFound, alreadyFits, failed, formatTimer()); } }