From c7670e36c15eafa628aa234a08759ac04364ccd3 Mon Sep 17 00:00:00 2001 From: RatzzFatzz Date: Sun, 21 Dec 2025 00:44:49 +0100 Subject: [PATCH] Add hearing impaired tracks as low prio default match --- .../impl/SubtitleTrackComparator.java | 36 +++++++++++----- .../processors/AttributeChangeProcessor.java | 26 +++--------- .../impl/SubtitleTrackComparatorTest.java | 42 ++++++++++++------- .../AttributeChangeProcessorTest.java | 40 +++++++++++------- .../util/FileInfoTestUtil.java | 4 +- 5 files changed, 86 insertions(+), 62 deletions(-) diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/SubtitleTrackComparator.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/SubtitleTrackComparator.java index e9c16da..46c8330 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/SubtitleTrackComparator.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/SubtitleTrackComparator.java @@ -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 { - private final String[] preferredSubtitles; + private final Set preferredSubtitles; + private final Set hearingImpairedKeywords; + + public SubtitleTrackComparator(Collection preferredSubtitles, Collection 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 { 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++; diff --git a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/AttributeChangeProcessor.java b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/AttributeChangeProcessor.java index f90b1e2..968bd21 100644 --- a/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/AttributeChangeProcessor.java +++ b/src/main/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/AttributeChangeProcessor.java @@ -15,7 +15,7 @@ public class AttributeChangeProcessor { private final Set forcedKeywords; public AttributeChangeProcessor(String[] preferredSubtitles, Set forcedKeywords, Set commentaryKeywords, Set 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 filterForPossibleDefaults(List tracks) { Stream 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; diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/SubtitleTrackComparatorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/SubtitleTrackComparatorTest.java index 2559b68..2928abb 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/SubtitleTrackComparatorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/SubtitleTrackComparatorTest.java @@ -12,32 +12,42 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; class SubtitleTrackComparatorTest { - private static final SubtitleTrackComparator comparator = new SubtitleTrackComparator(new String[]{"unstyled"}); - private static Stream compareArguments() { return Stream.of( - Arguments.of(List.of(attr("unstyled sub", false), attr("styled sub", false)), - List.of(attr("unstyled sub", false), attr("styled sub", false))), - Arguments.of(List.of(attr("styled sub", false), attr("unstyled sub", false)), - List.of(attr("unstyled sub", false), attr("styled sub", false))), + Arguments.of(attr(""), attr(""), 0), + Arguments.of(attr("pref"), attr(""), 1), + Arguments.of(attr(""), attr("pref"), -1), + Arguments.of(attr("pref"), attr("pref"), 0), - Arguments.of(List.of(attr("unstyled sub", true), attr("styled sub", false)), - List.of(attr("unstyled sub", true), attr("styled sub", false))), - Arguments.of(List.of(attr("styled sub", true), attr("unstyled sub", false)), - List.of(attr("unstyled sub", false), attr("styled sub", true))), + Arguments.of(attr("", true), attr("", true), 0), + Arguments.of(attr("", true), attr(""), -1), + Arguments.of(attr("CC", true), attr(""), -1), + Arguments.of(attr("CC"), attr(""), -1), + Arguments.of(attr(""), attr("", true), 1), + Arguments.of(attr(""), attr("CC", true), 1), + Arguments.of(attr(""), attr("CC"), 1), - Arguments.of(List.of(attr("unstyled sub", true), attr("unstyled sub", false)), - List.of(attr("unstyled sub", true), attr("unstyled sub", false))) + Arguments.of(attr("pref", true), attr("pref"), -1), + Arguments.of(attr("pref", true), attr("pref", true), 0), + Arguments.of(attr("pref"), attr("pref", true), 1), + Arguments.of(attr("", true), attr("pref"), -2), + Arguments.of(attr("pref"), attr("", true), 2) ); } @ParameterizedTest @MethodSource("compareArguments") - void compare(List input, List expected) { - assertIterableEquals(expected, input.stream().sorted(comparator.reversed()).toList()); + void compare(TrackAttributes track1, TrackAttributes track2, int expected) { + SubtitleTrackComparator comparator = new SubtitleTrackComparator(List.of("pref"), List.of("CC", "SDH")); + int actual = comparator.compare(track1, track2); + assertEquals(expected, actual); } - private static TrackAttributes attr(String trackName, boolean defaultTrack) { - return new TrackAttributes(0, "", trackName, defaultTrack, false, false, false, TrackType.SUBTITLES); + private static TrackAttributes attr(String trackname) { + return attr(trackname, false); + } + + private static TrackAttributes attr(String trackName, boolean hearingImpaired) { + return new TrackAttributes(0, "", trackName, false, false, false, hearingImpaired, TrackType.SUBTITLES); } } \ No newline at end of file diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/AttributeChangeProcessorTest.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/AttributeChangeProcessorTest.java index 5903f24..67b9f6e 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/AttributeChangeProcessorTest.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/impl/processors/AttributeChangeProcessorTest.java @@ -71,19 +71,29 @@ class AttributeChangeProcessorTest { Map.ofEntries() ), Arguments.of( - List.of(AUDIO_ENG_DEFAULT, AUDIO_GER_HEARING, SUB_GER), - arr(a("ger:ger")), null, - Map.ofEntries() - ), - Arguments.of( - List.of(AUDIO_ENG_DEFAULT, withName(AUDIO_GER, "SDH"), SUB_GER), - arr(a("ger:ger")), null, - Map.ofEntries() - ), - Arguments.of( - List.of(AUDIO_ENG_DEFAULT, AUDIO_GER_COMMENTARY, AUDIO_GER_HEARING, AUDIO_GER, SUB_GER_FORCED, SUB_GER), + List.of(AUDIO_GER, withName(SUB_GER, "SDH")), arr(a("ger:ger")), "ger:ger", - Map.ofEntries(off(AUDIO_ENG_DEFAULT), on(AUDIO_GER), on(SUB_GER)) + Map.ofEntries(on(AUDIO_GER), on(withName(SUB_GER, "SDH"))) + ), + Arguments.of( + List.of(AUDIO_GER, withName(SUB_GER, "SDH"), SUB_GER), + arr(a("ger:ger")), "ger:ger", + Map.ofEntries(on(AUDIO_GER), on(SUB_GER)) + ), + Arguments.of( + List.of(AUDIO_GER, SUB_GER_HEARING), + arr(a("ger:ger")), "ger:ger", + Map.ofEntries(on(AUDIO_GER), on(SUB_GER_HEARING)) + ), + Arguments.of( + List.of(AUDIO_GER, SUB_GER_HEARING, SUB_GER), + arr(a("ger:ger")), "ger:ger", + Map.ofEntries(on(AUDIO_GER), on(SUB_GER)) + ), + Arguments.of( + List.of(AUDIO_GER, SUB_ENG_HEARING, SUB_GER), + arr(a("ger:eng")), "ger:eng", + Map.ofEntries(on(AUDIO_GER), on(SUB_ENG_HEARING)) ) ); } @@ -128,9 +138,9 @@ class AttributeChangeProcessorTest { Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, withName(AUDIO_GER, "Forced"), SUB_GER), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER)), Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, withName(AUDIO_GER, "commentary"), SUB_GER), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER)), Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, withName(AUDIO_GER, "Commentary"), SUB_GER), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER)), - Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, withName(AUDIO_GER, "SDH"), SUB_GER), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER)), - Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, withName(AUDIO_GER, "sdh"), SUB_GER), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER)), - Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, SUB_GER, SUB_GER_FORCED, AUDIO_GER_COMMENTARY, AUDIO_GER_HEARING), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER)) + Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, withName(AUDIO_GER, "SDH"), SUB_GER), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER, withName(AUDIO_GER, "SDH"))), + Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, withName(AUDIO_GER, "sdh"), SUB_GER), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER, withName(AUDIO_GER, "sdh"))), + Arguments.of(List.of(AUDIO_GER, AUDIO_ENG, SUB_GER, SUB_GER_FORCED, AUDIO_GER_COMMENTARY, AUDIO_GER_HEARING), Set.of(AUDIO_GER, AUDIO_ENG, SUB_GER, AUDIO_GER_HEARING)) ); } diff --git a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/FileInfoTestUtil.java b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/FileInfoTestUtil.java index 36c1e3f..73d8102 100644 --- a/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/FileInfoTestUtil.java +++ b/src/test/java/at/pcgamingfreaks/mkvaudiosubtitlechanger/util/FileInfoTestUtil.java @@ -13,7 +13,7 @@ public class FileInfoTestUtil { public static final TrackAttributes AUDIO_GER_COMMENTARY = new TrackAttributes(0, "ger", "", false, false, true, false, TrackType.AUDIO); public static final TrackAttributes AUDIO_ENG_COMMENTARY = new TrackAttributes(1, "eng", "", false, false, true, false, TrackType.AUDIO); public static final TrackAttributes AUDIO_GER_HEARING = new TrackAttributes(0, "ger", "", false, false, false, true, TrackType.AUDIO); - public static final TrackAttributes AUDIO_ENG_HEARING = new TrackAttributes(1, "ger", "", false, false, false, true, TrackType.AUDIO); + public static final TrackAttributes AUDIO_ENG_HEARING = new TrackAttributes(1, "eng", "", false, false, false, true, TrackType.AUDIO); public static final TrackAttributes SUB_GER = new TrackAttributes(0, "ger", "", false, false, false, false, TrackType.SUBTITLES); public static final TrackAttributes SUB_ENG = new TrackAttributes(1, "eng", "", false, false, false, false, TrackType.SUBTITLES); @@ -21,6 +21,8 @@ public class FileInfoTestUtil { public static final TrackAttributes SUB_ENG_DEFAULT = new TrackAttributes(1, "eng", "", true, false, false, false, TrackType.SUBTITLES); public static final TrackAttributes SUB_GER_FORCED = new TrackAttributes(0, "ger", "", false, true, false, false, TrackType.SUBTITLES); public static final TrackAttributes SUB_ENG_FORCED = new TrackAttributes(1, "eng", "", false, true, false, false, TrackType.SUBTITLES); + public static final TrackAttributes SUB_GER_HEARING = new TrackAttributes(0, "ger", "", false, false, false, true, TrackType.SUBTITLES); + public static final TrackAttributes SUB_ENG_HEARING = new TrackAttributes(1, "eng", "", false, false, false, true, TrackType.SUBTITLES); public static TrackAttributes withName(TrackAttributes track, String trackName) { return new TrackAttributes(track.id(), track.language(), trackName, track.defaultt(), track.forced(), track.commentary(), track.hearingImpaired(), track.type());