mirror of
https://github.com/RatzzFatzz/MKVAudioSubtitleChanger.git
synced 2026-02-11 02:05:56 +01:00
Reimplement basic statistics
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>MKVAudioSubtilesChanger</groupId>
|
<groupId>MKVAudioSubtilesChanger</groupId>
|
||||||
<artifactId>MKVAudioSubtitlesChanger</artifactId>
|
<artifactId>MKVAudioSubtitlesChanger</artifactId>
|
||||||
<version>1.2</version>
|
<version>2.0</version>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<defaultGoal>clean package</defaultGoal>
|
<defaultGoal>clean package</defaultGoal>
|
||||||
|
|||||||
@@ -1,26 +1,28 @@
|
|||||||
package at.pcgamingfreaks.mkvaudiosubtitlechanger;
|
package at.pcgamingfreaks.mkvaudiosubtitlechanger;
|
||||||
|
|
||||||
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config;
|
||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileCollector;
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileCollector;
|
||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileProcessor;
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.FileProcessor;
|
||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileAttribute;
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileAttribute;
|
||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config;
|
|
||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto;
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto;
|
||||||
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ResultStatistic;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
public class AttributeUpdaterKernel {
|
public class AttributeUpdaterKernel {
|
||||||
|
|
||||||
ExecutorService executor = Executors.newFixedThreadPool(Config.getInstance().getThreadCount());
|
private final ExecutorService executor = Executors.newFixedThreadPool(Config.getInstance().getThreadCount());
|
||||||
FileCollector collector;
|
private final FileCollector collector;
|
||||||
FileProcessor processor;
|
private final FileProcessor processor;
|
||||||
int filesChangedAmount = 0;
|
private final ResultStatistic statistic = new ResultStatistic();
|
||||||
int filesNotChangedAmount = 0;
|
|
||||||
long runtime = 0;
|
|
||||||
|
|
||||||
public AttributeUpdaterKernel(FileCollector collector, FileProcessor processor) {
|
public AttributeUpdaterKernel(FileCollector collector, FileProcessor processor) {
|
||||||
this.collector = collector;
|
this.collector = collector;
|
||||||
@@ -29,33 +31,33 @@ public class AttributeUpdaterKernel {
|
|||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public void execute() {
|
public void execute() {
|
||||||
long beforeTimer = System.currentTimeMillis();
|
statistic.startTimer();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<File> files = collector.loadFiles(Config.getInstance().getLibraryPath());
|
List<File> files = collector.loadFiles(Config.getInstance().getLibraryPath());
|
||||||
files.forEach(file -> executor.submit(() -> process(file)));
|
files.forEach(file -> executor.submit(() -> process(file)));
|
||||||
executor.shutdown();
|
executor.shutdown();
|
||||||
executor.awaitTermination(1, TimeUnit.DAYS);
|
executor.awaitTermination(1, TimeUnit.DAYS);
|
||||||
|
|
||||||
|
statistic.stopTimer();
|
||||||
|
System.out.println(statistic);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void process(File file) {
|
private void process(File file) {
|
||||||
List<FileAttribute> attributes = processor.loadAttributes(file);
|
List<FileAttribute> attributes = processor.loadAttributes(file);
|
||||||
FileInfoDto fileInfo = processor.filterAttributes(attributes);
|
FileInfoDto fileInfo = processor.filterAttributes(attributes);
|
||||||
if (fileInfo.isChangeNecessary() && !Config.getInstance().isSafeMode()) {
|
if (fileInfo.isChangeNecessary()) {
|
||||||
processor.update(file, fileInfo);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class MKVToolProperties {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static MKVToolProperties getInstance() {
|
public static MKVToolProperties getInstance() {
|
||||||
if(instance == null){
|
if (instance == null) {
|
||||||
instance = new MKVToolProperties();
|
instance = new MKVToolProperties();
|
||||||
}
|
}
|
||||||
return instance;
|
return instance;
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package at.pcgamingfreaks.mkvaudiosubtitlechanger;
|
|||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config;
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config;
|
||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileCollector;
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileCollector;
|
||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileProcessor;
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.impl.MkvFileProcessor;
|
||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
|
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.apache.commons.cli.*;
|
import org.apache.commons.cli.*;
|
||||||
|
|
||||||
@@ -27,7 +26,7 @@ public class Main {
|
|||||||
options.addOption("c", CONFIG.toString(), false, "path to config");
|
options.addOption("c", CONFIG.toString(), false, "path to config");
|
||||||
options.addOption("t", THREADS.toString(), true, "thread count");
|
options.addOption("t", THREADS.toString(), true, "thread count");
|
||||||
options.addOption("s", SAFE_MODE.toString(), false, "Test run (no files will be changes)");
|
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();
|
CommandLineParser parser = new DefaultParser();
|
||||||
HelpFormatter formatter = new HelpFormatter();
|
HelpFormatter formatter = new HelpFormatter();
|
||||||
@@ -44,7 +43,8 @@ public class Main {
|
|||||||
config.setLibraryPath(cmd.getOptionValue("library"));
|
config.setLibraryPath(cmd.getOptionValue("library"));
|
||||||
config.setSafeMode(cmd.hasOption("safe-mode"));
|
config.setSafeMode(cmd.hasOption("safe-mode"));
|
||||||
if (cmd.hasOption("threads")) config.setThreadCount(parseInt(cmd.getOptionValue("threads")));
|
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();
|
config.isValid();
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
log.error(e);
|
log.error(e);
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import java.util.*;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.*;
|
import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.MKV_TOOL_NIX;
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileAttribute;
|
|||||||
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto;
|
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.FileInfoDto;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface FileProcessor {
|
public interface FileProcessor {
|
||||||
@@ -16,5 +17,5 @@ public interface FileProcessor {
|
|||||||
|
|
||||||
FileInfoDto filterAttributes(List<FileAttribute> attributes);
|
FileInfoDto filterAttributes(List<FileAttribute> attributes);
|
||||||
|
|
||||||
void update(File file, FileInfoDto fileInfo);
|
void update(File file, FileInfoDto fileInfo) throws IOException;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,10 @@ import lombok.extern.log4j.Log4j2;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.logging.log4j.core.util.IOUtils;
|
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.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -79,10 +82,12 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
|
|
||||||
private void detectCurrentConfiguration(List<FileAttribute> attributes, FileInfoDto info, List<FileAttribute> nonForcedTracks) {
|
private void detectCurrentConfiguration(List<FileAttribute> attributes, FileInfoDto info, List<FileAttribute> nonForcedTracks) {
|
||||||
Set<FileAttribute> detectedForcedSubtitleLanes = new HashSet<>();
|
Set<FileAttribute> detectedForcedSubtitleLanes = new HashSet<>();
|
||||||
for (FileAttribute attribute: attributes) {
|
for (FileAttribute attribute : attributes) {
|
||||||
if (attribute.isDefaultTrack() && AUDIO.equals(attribute.getType())) info.setDefaultAudioLane(attribute);
|
if (attribute.isDefaultTrack() && AUDIO.equals(attribute.getType())) info.setDefaultAudioLane(attribute);
|
||||||
if (attribute.isDefaultTrack() && SUBTITLES.equals(attribute.getType())) info.setDefaultSubtitleLane(attribute);
|
if (attribute.isDefaultTrack() && SUBTITLES.equals(attribute.getType()))
|
||||||
if (attribute.isForcedTrack() && SUBTITLES.equals(attribute.getType())) detectedForcedSubtitleLanes.add(attribute);
|
info.setDefaultSubtitleLane(attribute);
|
||||||
|
if (attribute.isForcedTrack() && SUBTITLES.equals(attribute.getType()))
|
||||||
|
detectedForcedSubtitleLanes.add(attribute);
|
||||||
}
|
}
|
||||||
|
|
||||||
info.setDesiredForcedSubtitleLanes(attributes.stream()
|
info.setDesiredForcedSubtitleLanes(attributes.stream()
|
||||||
@@ -93,13 +98,13 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void detectDesiredConfiguration(FileInfoDto info, List<FileAttribute> nonForcedTracks) {
|
private void detectDesiredConfiguration(FileInfoDto info, List<FileAttribute> nonForcedTracks) {
|
||||||
for (AttributeConfig config: Config.getInstance().getAttributeConfig()) {
|
for (AttributeConfig config : Config.getInstance().getAttributeConfig()) {
|
||||||
FileAttribute desiredAudio = null;
|
FileAttribute desiredAudio = null;
|
||||||
FileAttribute desiredSubtitle = null;
|
FileAttribute desiredSubtitle = null;
|
||||||
for (FileAttribute attribute: nonForcedTracks) {
|
for (FileAttribute attribute : nonForcedTracks) {
|
||||||
if ( attribute.getLanguage().equals(config.getAudioLanguage())
|
if (attribute.getLanguage().equals(config.getAudioLanguage())
|
||||||
&& AUDIO.equals(attribute.getType())) desiredAudio = attribute;
|
&& AUDIO.equals(attribute.getType())) desiredAudio = attribute;
|
||||||
if ( attribute.getLanguage().equals(config.getSubtitleLanguage())
|
if (attribute.getLanguage().equals(config.getSubtitleLanguage())
|
||||||
&& SUBTITLES.equals(attribute.getType())) desiredSubtitle = attribute;
|
&& SUBTITLES.equals(attribute.getType())) desiredSubtitle = attribute;
|
||||||
}
|
}
|
||||||
if (desiredAudio != null && desiredSubtitle != null) {
|
if (desiredAudio != null && desiredSubtitle != null) {
|
||||||
@@ -111,7 +116,7 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(File file, FileInfoDto fileInfo) {
|
public void update(File file, FileInfoDto fileInfo) throws IOException {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
sb.append(format("\"%s\" ", Config.getInstance().getPathFor(MkvToolNix.MKV_PROP_EDIT)));
|
sb.append(format("\"%s\" ", Config.getInstance().getPathFor(MkvToolNix.MKV_PROP_EDIT)));
|
||||||
sb.append(format("\"%s\" ", file.getAbsolutePath()));
|
sb.append(format("\"%s\" ", file.getAbsolutePath()));
|
||||||
@@ -128,17 +133,12 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredSubtitleLane().getId()));
|
sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredSubtitleLane().getId()));
|
||||||
}
|
}
|
||||||
if (fileInfo.areForcedTracksDifferent()) {
|
if (fileInfo.areForcedTracksDifferent()) {
|
||||||
for (FileAttribute attribute: fileInfo.getDesiredForcedSubtitleLanes()) {
|
for (FileAttribute attribute : fileInfo.getDesiredForcedSubtitleLanes()) {
|
||||||
sb.append(format(ENABLE_FORCED_TRACK, attribute.getId()));
|
sb.append(format(ENABLE_FORCED_TRACK, attribute.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
InputStream inputstream = Runtime.getRuntime().exec(sb.toString()).getInputStream();
|
||||||
InputStream inputstream = Runtime.getRuntime().exec(sb.toString()).getInputStream();
|
log.debug(IOUtils.toString(new InputStreamReader(inputstream)));
|
||||||
log.debug(IOUtils.toString(new InputStreamReader(inputstream)));
|
|
||||||
} catch (IOException e) {
|
|
||||||
log.warn("File couldn't be updated: {}", file.getAbsoluteFile());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import lombok.extern.log4j.Log4j2;
|
|||||||
@Log4j2
|
@Log4j2
|
||||||
@Getter
|
@Getter
|
||||||
public class AttributeConfig {
|
public class AttributeConfig {
|
||||||
private String audioLanguage;
|
private final String audioLanguage;
|
||||||
private String subtitleLanguage;
|
private final String subtitleLanguage;
|
||||||
|
|
||||||
public AttributeConfig(String audioLanguage, String subtitleLanguage) {
|
public AttributeConfig(String audioLanguage, String subtitleLanguage) {
|
||||||
this.audioLanguage = audioLanguage;
|
this.audioLanguage = audioLanguage;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ public enum ConfigProperty {
|
|||||||
SAFE_MODE("safe-mode"),
|
SAFE_MODE("safe-mode"),
|
||||||
HELP("help");
|
HELP("help");
|
||||||
|
|
||||||
private String property;
|
private final String property;
|
||||||
|
|
||||||
ConfigProperty(String property) {
|
ConfigProperty(String property) {
|
||||||
this.property = property;
|
this.property = property;
|
||||||
|
|||||||
@@ -1,4 +1,53 @@
|
|||||||
package at.pcgamingfreaks.mkvaudiosubtitlechanger.model;
|
package at.pcgamingfreaks.mkvaudiosubtitlechanger.model;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
@Getter
|
||||||
public class ResultStatistic {
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user