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);
+ }
}