Add hearing impaired tracks as low prio default match

This commit is contained in:
RatzzFatzz
2025-12-21 00:44:49 +01:00
parent 1e31326ea2
commit c7670e36c1
5 changed files with 86 additions and 62 deletions

View File

@@ -1,14 +1,20 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.impl;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.TrackAttributes;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
@RequiredArgsConstructor
public class SubtitleTrackComparator implements Comparator<TrackAttributes> {
private final String[] preferredSubtitles;
private final Set<String> preferredSubtitles;
private final Set<String> hearingImpairedKeywords;
public SubtitleTrackComparator(Collection<String> preferredSubtitles, Collection<String> hearingImpairedKeywords) {
this.preferredSubtitles = new HashSet<>(preferredSubtitles.stream().map(String::toLowerCase).toList());
this.hearingImpairedKeywords = new HashSet<>(hearingImpairedKeywords.stream().map(String::toLowerCase).toList());
}
/**
* {@inheritDoc}
@@ -17,12 +23,22 @@ public class SubtitleTrackComparator implements Comparator<TrackAttributes> {
public int compare(TrackAttributes track1, TrackAttributes track2) {
int result = 0;
if (StringUtils.containsAnyIgnoreCase(track1.trackName(), preferredSubtitles)) {
result++;
}
if (StringUtils.containsAnyIgnoreCase(track2.trackName(), preferredSubtitles)) {
result--;
}
String track1Name = track1.trackName().toLowerCase();
String track2Name = track2.trackName().toLowerCase();
if (preferredSubtitles.contains(track1Name)) result++;
else for (String keyword: preferredSubtitles) if (track1Name.contains(keyword)) result++;
if (preferredSubtitles.contains(track2Name)) result--;
else for (String keyword: preferredSubtitles) if (track2Name.contains(keyword)) result--;
if (track1.hearingImpaired()) result--;
else if (hearingImpairedKeywords.contains(track1Name)) result--;
else for (String keyword: hearingImpairedKeywords) if (track1Name.contains(keyword)) result--;
if (track2.hearingImpaired()) result++;
else if (hearingImpairedKeywords.contains(track2Name)) result++;
else for (String keyword: hearingImpairedKeywords) if (track2Name.contains(keyword)) result++;
if (result == 0) {
if (track1.defaultt()) result++;

View File

@@ -15,7 +15,7 @@ public class AttributeChangeProcessor {
private final Set<String> forcedKeywords;
public AttributeChangeProcessor(String[] preferredSubtitles, Set<String> forcedKeywords, Set<String> commentaryKeywords, Set<String> hearingImpairedKeywords) {
this.subtitleTrackComparator = new SubtitleTrackComparator(preferredSubtitles);
this.subtitleTrackComparator = new SubtitleTrackComparator(Arrays.stream(preferredSubtitles).toList(), hearingImpairedKeywords);
this.commentaryKeywords = commentaryKeywords;
this.hearingImpairedKeywords = hearingImpairedKeywords;
this.forcedKeywords = forcedKeywords;
@@ -24,26 +24,12 @@ public class AttributeChangeProcessor {
private List<TrackAttributes> filterForPossibleDefaults(List<TrackAttributes> tracks) {
Stream<TrackAttributes> attributes = tracks.stream();
if (true) { // TODO: config for including commentary
attributes = attributes
.filter(attr -> !attr.commentary())
.filter(attr -> {
if (attr.trackName() == null) return true;
return commentaryKeywords.stream().noneMatch(keyword -> keyword.compareToIgnoreCase(attr.trackName()) == 0);
});
}
if (true) { // TODO: config for including hearing impaired
attributes = attributes
.filter(attr -> !attr.hearingImpaired())
.filter(attr -> {
if (attr.trackName() == null) return true;
return hearingImpairedKeywords.stream().noneMatch(keyword -> keyword.compareToIgnoreCase(attr.trackName()) == 0);
});;
}
return attributes
.filter(attr -> !attr.commentary())
.filter(attr -> {
if (attr.trackName() == null) return true;
return commentaryKeywords.stream().noneMatch(keyword -> keyword.compareToIgnoreCase(attr.trackName()) == 0);
})
.filter(attr -> !attr.forced())
.filter(attr -> {
if (attr.trackName() == null) return true;