mirror of
https://github.com/RatzzFatzz/MKVAudioSubtitleChanger.git
synced 2026-02-11 02:05:56 +01:00
Remove forced audio tracks & minor refactoring
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>at.pcgamingfreaks</groupId>
|
<groupId>at.pcgamingfreaks</groupId>
|
||||||
<artifactId>MKVAudioSubtitleChanger</artifactId>
|
<artifactId>MKVAudioSubtitleChanger</artifactId>
|
||||||
<version>3.0.1</version>
|
<version>3.0.2</version>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<defaultGoal>clean package</defaultGoal>
|
<defaultGoal>clean package</defaultGoal>
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
|
|
||||||
private static final String DISABLE_DEFAULT_TRACK = "--edit track:%s --set flag-default=0 ";
|
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_DEFAULT_TRACK = "--edit track:%s --set flag-default=1 ";
|
||||||
|
private static final String DISABLE_FORCED_TRACK = "--edit track:%s --set flag-forced=0 ";
|
||||||
private static final String ENABLE_FORCED_TRACK = "--edit track:%s --set flag-forced=1 ";
|
private static final String ENABLE_FORCED_TRACK = "--edit track:%s --set flag-forced=1 ";
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@@ -69,8 +70,8 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
|
|
||||||
log.debug(fileAttributes.toString());
|
log.debug(fileAttributes.toString());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
log.error("File could not be found or loaded: ", e);
|
||||||
log.error("File could not be found or loaded!");
|
System.out.println("File could not be found or loaded: " + file.getAbsolutePath());
|
||||||
}
|
}
|
||||||
return fileAttributes;
|
return fileAttributes;
|
||||||
}
|
}
|
||||||
@@ -80,21 +81,17 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void detectDefaultTracks(FileInfoDto info, List<FileAttribute> attributes, List<FileAttribute> nonForcedTracks) {
|
public void detectDefaultTracks(FileInfoDto info, List<FileAttribute> attributes, List<FileAttribute> nonForcedTracks) {
|
||||||
Set<FileAttribute> detectedForcedSubtitleLanes = new HashSet<>();
|
|
||||||
for (FileAttribute attribute : attributes) {
|
for (FileAttribute attribute : attributes) {
|
||||||
if (attribute.isDefaultTrack() && AUDIO.equals(attribute.getType()))
|
if (AUDIO.equals(attribute.getType())) {
|
||||||
info.getDefaultAudioLanes().add(attribute);
|
if (attribute.isDefaultTrack()) info.getExistingDefaultAudioLanes().add(attribute);
|
||||||
if (attribute.isDefaultTrack() && SUBTITLES.equals(attribute.getType()))
|
if (attribute.isForcedTrack()) info.getExistingForcedAudioLanes().add(attribute);
|
||||||
info.getDefaultSubtitleLanes().add(attribute);
|
} else if (SUBTITLES.equals(attribute.getType())) {
|
||||||
if (attribute.isForcedTrack() && SUBTITLES.equals(attribute.getType()))
|
if (attribute.isDefaultTrack()) info.getExistingDefaultSubtitleLanes().add(attribute);
|
||||||
detectedForcedSubtitleLanes.add(attribute);
|
|
||||||
}
|
|
||||||
|
|
||||||
info.setDesiredForcedSubtitleLanes(attributes.stream()
|
if (attribute.isForcedTrack()) info.getExistingForcedSubtitleLanes().add(attribute);
|
||||||
.filter(e -> !nonForcedTracks.contains(e))
|
else if (!nonForcedTracks.contains(attribute)) info.getDesiredForcedSubtitleLanes().add(attribute);
|
||||||
.filter(e -> !detectedForcedSubtitleLanes.contains(e))
|
}
|
||||||
.collect(Collectors.toSet())
|
}
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -113,8 +110,8 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
|
|
||||||
if (desiredAudio.isPresent() && ("OFF".equals(config.getSubtitleLanguage()) || desiredSubtitle.isPresent())) {
|
if (desiredAudio.isPresent() && ("OFF".equals(config.getSubtitleLanguage()) || desiredSubtitle.isPresent())) {
|
||||||
info.setMatchedConfig(config);
|
info.setMatchedConfig(config);
|
||||||
info.setDesiredAudioLane(desiredAudio.get());
|
info.setDesiredDefaultAudioLane(desiredAudio.get());
|
||||||
info.setDesiredSubtitleLane(desiredSubtitle.orElse(null));
|
info.setDesiredDefaultSubtitleLane(desiredSubtitle.orElse(null));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -156,22 +153,28 @@ public class MkvFileProcessor implements FileProcessor {
|
|||||||
sb.append(format("\"%s\" ", file.getAbsolutePath()));
|
sb.append(format("\"%s\" ", file.getAbsolutePath()));
|
||||||
|
|
||||||
if (fileInfo.isAudioDifferent()) {
|
if (fileInfo.isAudioDifferent()) {
|
||||||
if (fileInfo.getDefaultAudioLanes() != null && !fileInfo.getDefaultAudioLanes().isEmpty()) {
|
if (fileInfo.getExistingDefaultAudioLanes() != null && !fileInfo.getExistingDefaultAudioLanes().isEmpty()) {
|
||||||
for (FileAttribute track: fileInfo.getDefaultAudioLanes()) {
|
for (FileAttribute track: fileInfo.getExistingDefaultAudioLanes()) {
|
||||||
sb.append(format(DISABLE_DEFAULT_TRACK, track.getId()));
|
sb.append(format(DISABLE_DEFAULT_TRACK, track.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredAudioLane().getId()));
|
sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredDefaultAudioLane().getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!fileInfo.getExistingForcedAudioLanes().isEmpty()) {
|
||||||
|
for (FileAttribute track: fileInfo.getExistingForcedAudioLanes()) {
|
||||||
|
sb.append(format(DISABLE_FORCED_TRACK, track.getId()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileInfo.isSubtitleDifferent()) {
|
if (fileInfo.isSubtitleDifferent()) {
|
||||||
if (fileInfo.getDefaultSubtitleLanes() != null && !fileInfo.getDefaultSubtitleLanes().isEmpty()) {
|
if (fileInfo.getExistingDefaultSubtitleLanes() != null && !fileInfo.getExistingDefaultSubtitleLanes().isEmpty()) {
|
||||||
for (FileAttribute track: fileInfo.getDefaultSubtitleLanes()) {
|
for (FileAttribute track: fileInfo.getExistingDefaultSubtitleLanes()) {
|
||||||
sb.append(format(DISABLE_DEFAULT_TRACK, track.getId()));
|
sb.append(format(DISABLE_DEFAULT_TRACK, track.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fileInfo.getDesiredSubtitleLane() != null) {
|
if (fileInfo.getDesiredDefaultSubtitleLane() != null) {
|
||||||
sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredSubtitleLane().getId()));
|
sb.append(format(ENABLE_DEFAULT_TRACK, fileInfo.getDesiredDefaultSubtitleLane().getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,7 @@ import me.tongfei.progressbar.ProgressBarBuilder;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -85,16 +83,16 @@ public class CoherentAttributeUpdaterKernel extends AttributeUpdaterKernel {
|
|||||||
processor.detectDesiredTracks(fileInfo, nonForcedTracks, nonCommentaryTracks, config);
|
processor.detectDesiredTracks(fileInfo, nonForcedTracks, nonCommentaryTracks, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileInfos.stream().allMatch(elem -> ("OFF".equals(config.getSubtitleLanguage()) || elem.getDesiredSubtitleLane() != null)
|
if (fileInfos.stream().allMatch(elem -> ("OFF".equals(config.getSubtitleLanguage()) || elem.getDesiredDefaultSubtitleLane() != null)
|
||||||
&& elem.getDesiredAudioLane() != null)) {
|
&& elem.getDesiredDefaultAudioLane() != null)) {
|
||||||
log.info("Found {}/{} match for {}", config.getAudioLanguage(), config.getSubtitleLanguage(), file.getAbsolutePath());
|
log.info("Found {}/{} match for {}", config.getAudioLanguage(), config.getSubtitleLanguage(), file.getAbsolutePath());
|
||||||
fileInfos.forEach(this::updateFile);
|
fileInfos.forEach(this::updateFile);
|
||||||
return; // match found, end process here
|
return; // match found, end process here
|
||||||
}
|
}
|
||||||
|
|
||||||
fileInfos.forEach(f -> {
|
fileInfos.forEach(f -> {
|
||||||
f.setDesiredAudioLane(null);
|
f.setDesiredDefaultAudioLane(null);
|
||||||
f.setDesiredSubtitleLane(null);
|
f.setDesiredDefaultSubtitleLane(null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,16 +13,21 @@ import java.util.Set;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class FileInfoDto {
|
public class FileInfoDto {
|
||||||
private final File file;
|
private final File file;
|
||||||
private Set<FileAttribute> defaultAudioLanes = new HashSet<>();
|
|
||||||
private Set<FileAttribute> defaultSubtitleLanes = new HashSet<>();
|
private Set<FileAttribute> existingDefaultAudioLanes = new HashSet<>();
|
||||||
private Set<FileAttribute> desiredForcedSubtitleLanes;
|
private Set<FileAttribute> existingForcedAudioLanes = new HashSet<>();
|
||||||
private FileAttribute desiredAudioLane;
|
|
||||||
private FileAttribute desiredSubtitleLane;
|
private Set<FileAttribute> existingDefaultSubtitleLanes = new HashSet<>();
|
||||||
|
private Set<FileAttribute> existingForcedSubtitleLanes = new HashSet<>();
|
||||||
|
|
||||||
|
private Set<FileAttribute> desiredForcedSubtitleLanes = new HashSet<>();
|
||||||
|
private FileAttribute desiredDefaultAudioLane;
|
||||||
|
private FileAttribute desiredDefaultSubtitleLane;
|
||||||
private AttributeConfig matchedConfig;
|
private AttributeConfig matchedConfig;
|
||||||
|
|
||||||
public boolean isAudioDifferent() {
|
public boolean isAudioDifferent() {
|
||||||
return desiredAudioLane != null &&
|
return desiredDefaultAudioLane != null &&
|
||||||
(defaultAudioLanes == null || !defaultAudioLanes.contains(desiredAudioLane) || defaultAudioLanes.size() > 1);
|
(existingDefaultAudioLanes == null || !existingDefaultAudioLanes.contains(desiredDefaultAudioLane) || existingDefaultAudioLanes.size() > 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSubtitleDifferent() {
|
public boolean isSubtitleDifferent() {
|
||||||
@@ -30,13 +35,13 @@ public class FileInfoDto {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSubtitleMatchDifferent() {
|
private boolean isSubtitleMatchDifferent() {
|
||||||
return desiredSubtitleLane != null
|
return desiredDefaultSubtitleLane != null
|
||||||
&& (defaultSubtitleLanes == null || !defaultSubtitleLanes.contains(desiredSubtitleLane) || defaultSubtitleLanes.size() > 1);
|
&& (existingDefaultSubtitleLanes == null || !existingDefaultSubtitleLanes.contains(desiredDefaultSubtitleLane) || existingDefaultSubtitleLanes.size() > 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSubtitleOFF() {
|
private boolean isSubtitleOFF() {
|
||||||
return desiredSubtitleLane == null && "OFF".equals(matchedConfig.getSubtitleLanguage()) &&
|
return desiredDefaultSubtitleLane == null && "OFF".equals(matchedConfig.getSubtitleLanguage()) &&
|
||||||
(defaultSubtitleLanes != null && !defaultSubtitleLanes.isEmpty());
|
(existingDefaultSubtitleLanes != null && !existingDefaultSubtitleLanes.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean areForcedTracksDifferent() {
|
public boolean areForcedTracksDifferent() {
|
||||||
@@ -51,24 +56,24 @@ public class FileInfoDto {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isUnableToApplyConfig() {
|
private boolean isUnableToApplyConfig() {
|
||||||
return desiredAudioLane == null && desiredSubtitleLane == null;
|
return desiredDefaultAudioLane == null && desiredDefaultSubtitleLane == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isAlreadySuitable() {
|
private boolean isAlreadySuitable() {
|
||||||
return defaultAudioLanes.contains(desiredAudioLane) && defaultSubtitleLanes.contains(desiredSubtitleLane);
|
return existingDefaultAudioLanes.contains(desiredDefaultAudioLane) && existingDefaultSubtitleLanes.contains(desiredDefaultSubtitleLane);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isChangeNecessary() {
|
private boolean isChangeNecessary() {
|
||||||
return isAudioDifferent() || isSubtitleDifferent() || areForcedTracksDifferent();
|
return isAudioDifferent() || isSubtitleDifferent() || areForcedTracksDifferent() || !existingForcedSubtitleLanes.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "[" + "defaultAudioLanes=" + defaultAudioLanes +
|
return "[" + "defaultAudioLanes=" + existingDefaultAudioLanes +
|
||||||
", defaultSubtitleLanes=" + defaultSubtitleLanes +
|
", defaultSubtitleLanes=" + existingDefaultSubtitleLanes +
|
||||||
", desiredForcedSubtitleLanes=" + desiredForcedSubtitleLanes +
|
", desiredForcedSubtitleLanes=" + desiredForcedSubtitleLanes +
|
||||||
", desiredAudioLane=" + desiredAudioLane +
|
", desiredAudioLane=" + desiredDefaultAudioLane +
|
||||||
", desiredSubtitleLane=" + desiredSubtitleLane +
|
", desiredSubtitleLane=" + desiredDefaultSubtitleLane +
|
||||||
']';
|
']';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,15 +31,15 @@ public class TestUtil {
|
|||||||
|
|
||||||
public static FileInfoDto createFileInfo(Set<FileAttribute> defaultAudio, FileAttribute desiredAudio) {
|
public static FileInfoDto createFileInfo(Set<FileAttribute> defaultAudio, FileAttribute desiredAudio) {
|
||||||
FileInfoDto fileInfoDto = new FileInfoDto(null);
|
FileInfoDto fileInfoDto = new FileInfoDto(null);
|
||||||
fileInfoDto.setDefaultAudioLanes(defaultAudio);
|
fileInfoDto.setExistingDefaultAudioLanes(defaultAudio);
|
||||||
fileInfoDto.setDesiredAudioLane(desiredAudio);
|
fileInfoDto.setDesiredDefaultAudioLane(desiredAudio);
|
||||||
return fileInfoDto;
|
return fileInfoDto;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static FileInfoDto createFileInfo(Set<FileAttribute> defaultSubtitle, FileAttribute desiredSubtitle, AttributeConfig config) {
|
public static FileInfoDto createFileInfo(Set<FileAttribute> defaultSubtitle, FileAttribute desiredSubtitle, AttributeConfig config) {
|
||||||
FileInfoDto fileInfoDto = new FileInfoDto(null);
|
FileInfoDto fileInfoDto = new FileInfoDto(null);
|
||||||
fileInfoDto.setDefaultSubtitleLanes(defaultSubtitle);
|
fileInfoDto.setExistingDefaultSubtitleLanes(defaultSubtitle);
|
||||||
fileInfoDto.setDesiredSubtitleLane(desiredSubtitle);
|
fileInfoDto.setDesiredDefaultSubtitleLane(desiredSubtitle);
|
||||||
fileInfoDto.setMatchedConfig(config);
|
fileInfoDto.setMatchedConfig(config);
|
||||||
return fileInfoDto;
|
return fileInfoDto;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user