Reimplement basic statistics

This commit is contained in:
2022-03-30 20:32:26 +02:00
parent f7a2e4234a
commit a5b0224d6c
10 changed files with 103 additions and 51 deletions

View File

@@ -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>

View File

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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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

View File

@@ -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;
} }

View File

@@ -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());
}
} }
} }

View File

@@ -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;

View File

@@ -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;

View File

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