diff --git a/pom.xml b/pom.xml index e7ae762..ae165d1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ MKVAudioSubtilesChanger MKVAudioSubtitlesChanger - 1.2 + 2.0 clean package diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java index f82553c..ade9974 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/AttributeUpdaterKernel.java @@ -1,26 +1,28 @@ 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.config.Config; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto; +import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ResultStatistic; import lombok.SneakyThrows; import lombok.extern.log4j.Log4j2; import java.io.File; +import java.io.IOException; import java.util.List; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @Log4j2 public class AttributeUpdaterKernel { - ExecutorService executor = Executors.newFixedThreadPool(Config.getInstance().getThreadCount()); - FileCollector collector; - FileProcessor processor; - int filesChangedAmount = 0; - int filesNotChangedAmount = 0; - long runtime = 0; + private final ExecutorService executor = Executors.newFixedThreadPool(Config.getInstance().getThreadCount()); + private final FileCollector collector; + private final FileProcessor processor; + private final ResultStatistic statistic = new ResultStatistic(); public AttributeUpdaterKernel(FileCollector collector, FileProcessor processor) { this.collector = collector; @@ -29,33 +31,33 @@ public class AttributeUpdaterKernel { @SneakyThrows public void execute() { - long beforeTimer = System.currentTimeMillis(); - - + statistic.startTimer(); List files = collector.loadFiles(Config.getInstance().getLibraryPath()); files.forEach(file -> executor.submit(() -> process(file))); executor.shutdown(); executor.awaitTermination(1, TimeUnit.DAYS); - - - runtime = System.currentTimeMillis() - beforeTimer; - - System.out.printf("%nFiles %schanged: %s%n", - Config.getInstance().isSafeMode() ? "would " : "", - filesChangedAmount); - System.out.printf("Files %s not changed: %s%n", - Config.getInstance().isSafeMode() ? "would " : "", - filesNotChangedAmount); - System.out.printf("Runtime: %ss%n", runtime / 1000); + statistic.stopTimer(); + System.out.println(statistic); } private void process(File file) { List attributes = processor.loadAttributes(file); FileInfoDto fileInfo = processor.filterAttributes(attributes); - if (fileInfo.isChangeNecessary() && !Config.getInstance().isSafeMode()) { - processor.update(file, fileInfo); + if (fileInfo.isChangeNecessary()) { + statistic.shouldChange(file, fileInfo); + if (!Config.getInstance().isSafeMode()) { + try { + processor.update(file, fileInfo); + statistic.success(file, fileInfo); + } catch (IOException e) { + statistic.failure(file, fileInfo); + log.warn("File couldn't be updated: {}", file.getAbsoluteFile()); + } + } + } else { + statistic.fits(file, fileInfo); } } } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/MKVToolProperties.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/MKVToolProperties.java index 14618ee..53b9ddb 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/MKVToolProperties.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/MKVToolProperties.java @@ -17,7 +17,7 @@ public class MKVToolProperties { } public static MKVToolProperties getInstance() { - if(instance == null){ + if (instance == null) { instance = new MKVToolProperties(); } return instance; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java index 56ec26f..ca008ee 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/Main.java @@ -3,7 +3,6 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger; import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileCollector; import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileProcessor; -import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty; import lombok.extern.log4j.Log4j2; import org.apache.commons.cli.*; @@ -27,7 +26,7 @@ public class Main { options.addOption("c", CONFIG.toString(), false, "path to config"); options.addOption("t", THREADS.toString(), true, "thread count"); options.addOption("s", SAFE_MODE.toString(), false, "Test run (no files will be changes)"); - options.addOption(create("k", FORCED_KEYWORDS.toString(),Option.UNLIMITED_VALUES,"Additional keywords to identify forced tracks")); + options.addOption(create("k", FORCED_KEYWORDS.toString(), Option.UNLIMITED_VALUES, "Additional keywords to identify forced tracks")); CommandLineParser parser = new DefaultParser(); HelpFormatter formatter = new HelpFormatter(); @@ -44,7 +43,8 @@ public class Main { config.setLibraryPath(cmd.getOptionValue("library")); config.setSafeMode(cmd.hasOption("safe-mode")); if (cmd.hasOption("threads")) config.setThreadCount(parseInt(cmd.getOptionValue("threads"))); - if (cmd.hasOption(FORCED_KEYWORDS.toString())) config.getForcedKeywords().addAll(List.of(cmd.getOptionValues(FORCED_KEYWORDS.toString()))); + if (cmd.hasOption(FORCED_KEYWORDS.toString())) + config.getForcedKeywords().addAll(List.of(cmd.getOptionValues(FORCED_KEYWORDS.toString()))); config.isValid(); } catch (ParseException e) { log.error(e); diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java index 5eeda69..6a7c871 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/config/Config.java @@ -17,7 +17,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; -import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*; +import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.MKV_TOOL_NIX; @Log4j2 @Getter diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileProcessor.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileProcessor.java index 5175e3e..5a5b105 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/FileProcessor.java @@ -4,6 +4,7 @@ import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileAttribute; import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto; import java.io.File; +import java.io.IOException; import java.util.List; public interface FileProcessor { @@ -16,5 +17,5 @@ public interface FileProcessor { FileInfoDto filterAttributes(List attributes); - void update(File file, FileInfoDto fileInfo); + void update(File file, FileInfoDto fileInfo) throws IOException; } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java index 2da348a..78d2657 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/MkvFileProcessor.java @@ -7,7 +7,10 @@ import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.core.util.IOUtils; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.util.*; import java.util.stream.Collectors; @@ -79,10 +82,12 @@ public class MkvFileProcessor implements FileProcessor { private void detectCurrentConfiguration(List attributes, FileInfoDto info, List nonForcedTracks) { Set detectedForcedSubtitleLanes = new HashSet<>(); - for (FileAttribute attribute: attributes) { + for (FileAttribute attribute : attributes) { if (attribute.isDefaultTrack() && AUDIO.equals(attribute.getType())) info.setDefaultAudioLane(attribute); - if (attribute.isDefaultTrack() && SUBTITLES.equals(attribute.getType())) info.setDefaultSubtitleLane(attribute); - if (attribute.isForcedTrack() && SUBTITLES.equals(attribute.getType())) detectedForcedSubtitleLanes.add(attribute); + if (attribute.isDefaultTrack() && SUBTITLES.equals(attribute.getType())) + info.setDefaultSubtitleLane(attribute); + if (attribute.isForcedTrack() && SUBTITLES.equals(attribute.getType())) + detectedForcedSubtitleLanes.add(attribute); } info.setDesiredForcedSubtitleLanes(attributes.stream() @@ -93,13 +98,13 @@ public class MkvFileProcessor implements FileProcessor { } private void detectDesiredConfiguration(FileInfoDto info, List nonForcedTracks) { - for (AttributeConfig config: Config.getInstance().getAttributeConfig()) { + for (AttributeConfig config : Config.getInstance().getAttributeConfig()) { FileAttribute desiredAudio = null; FileAttribute desiredSubtitle = null; - for (FileAttribute attribute: nonForcedTracks) { - if ( attribute.getLanguage().equals(config.getAudioLanguage()) + for (FileAttribute attribute : nonForcedTracks) { + if (attribute.getLanguage().equals(config.getAudioLanguage()) && AUDIO.equals(attribute.getType())) desiredAudio = attribute; - if ( attribute.getLanguage().equals(config.getSubtitleLanguage()) + if (attribute.getLanguage().equals(config.getSubtitleLanguage()) && SUBTITLES.equals(attribute.getType())) desiredSubtitle = attribute; } if (desiredAudio != null && desiredSubtitle != null) { @@ -111,7 +116,7 @@ public class MkvFileProcessor implements FileProcessor { } @Override - public void update(File file, FileInfoDto fileInfo) { + public void update(File file, FileInfoDto fileInfo) throws IOException { StringBuffer sb = new StringBuffer(); sb.append(format("\"%s\" ", Config.getInstance().getPathFor(MkvToolNix.MKV_PROP_EDIT))); sb.append(format("\"%s\" ", file.getAbsolutePath())); @@ -128,17 +133,12 @@ public class MkvFileProcessor implements FileProcessor { sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredSubtitleLane().getId())); } if (fileInfo.areForcedTracksDifferent()) { - for (FileAttribute attribute: fileInfo.getDesiredForcedSubtitleLanes()) { + for (FileAttribute attribute : fileInfo.getDesiredForcedSubtitleLanes()) { sb.append(format(ENABLE_FORCED_TRACK, attribute.getId())); } } - try { - InputStream inputstream = Runtime.getRuntime().exec(sb.toString()).getInputStream(); - log.debug(IOUtils.toString(new InputStreamReader(inputstream))); - } catch (IOException e) { - log.warn("File couldn't be updated: {}", file.getAbsoluteFile()); - } + InputStream inputstream = Runtime.getRuntime().exec(sb.toString()).getInputStream(); + log.debug(IOUtils.toString(new InputStreamReader(inputstream))); } - } diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java index 2849946..afd685f 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/AttributeConfig.java @@ -6,8 +6,8 @@ import lombok.extern.log4j.Log4j2; @Log4j2 @Getter public class AttributeConfig { - private String audioLanguage; - private String subtitleLanguage; + private final String audioLanguage; + private final String subtitleLanguage; public AttributeConfig(String audioLanguage, String subtitleLanguage) { this.audioLanguage = audioLanguage; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java index 8d439ca..432ee1b 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ConfigProperty.java @@ -9,7 +9,7 @@ public enum ConfigProperty { SAFE_MODE("safe-mode"), HELP("help"); - private String property; + private final String property; ConfigProperty(String property) { this.property = property; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java index 8c354f0..fb21473 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/model/ResultStatistic.java @@ -1,4 +1,53 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger.model; +import lombok.AccessLevel; +import lombok.Getter; + +import java.io.File; + +@Getter public class ResultStatistic { + private static final String result = "Files should change: %s%n" + + "Files successfully changed: %s%n" + + "Files failed changing: %s%n" + + "Files already fitting config: %s%n" + + "Runtime: %ss"; + + private int filesShouldChange = 0; + private int filesSuccessfullyChanged = 0; + private int filesFailed = 0; + private int filesAlreadyFit = 0; + @Getter(AccessLevel.NONE) + private long startTime = 0; + private long runtime = 0; + + public void shouldChange(File file, FileInfoDto fileInfo) { + filesShouldChange++; + } + + public void success(File file, FileInfoDto fileInfo) { + filesSuccessfullyChanged++; + } + + public void failure(File file, FileInfoDto fileInfo) { + filesFailed++; + } + + public void fits(File file, FileInfoDto fileInfo) { + filesAlreadyFit++; + } + + public void startTimer() { + startTime = System.currentTimeMillis(); + } + + public void stopTimer() { + runtime = System.currentTimeMillis() - startTime; + } + + @Override + public String toString() { + return String.format(result, filesShouldChange, filesSuccessfullyChanged, filesFailed, filesAlreadyFit, + runtime / 1000); + } }