From 3c298f623e44b6a2c079d9706e1c23a617b13118 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Tue, 11 Oct 2022 23:13:45 +0200 Subject: [PATCH] Adds ability to filter subtitle streams based on the title --- .../net/knarcraft/ffmpegconverter/Main.java | 13 ++++++++---- .../converter/AbstractConverter.java | 7 ++++++- .../converter/AnimeConverter.java | 21 ++++++++++++------- .../ffmpegconverter/streams/VideoStream.java | 2 +- .../ffmpegconverter/utility/FFMpegHelper.java | 2 +- .../converter/AnimeConverterTest.java | 2 +- 6 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/knarcraft/ffmpegconverter/Main.java b/src/main/java/net/knarcraft/ffmpegconverter/Main.java index caed55b..1fc1896 100644 --- a/src/main/java/net/knarcraft/ffmpegconverter/Main.java +++ b/src/main/java/net/knarcraft/ffmpegconverter/Main.java @@ -109,14 +109,16 @@ class Main { private static void animeConverter() throws IOException { OutputUtil.println("[Audio languages jpn,eng,ger,fre] [Subtitle languages eng,ger,fre] [Convert to stereo if " + "necessary true/false] [Prevent signs&songs subtitles true/false] [Forced audio index 0-n] " + - "[Forced subtitle index 0-n]\nYour input: "); - List input = readInput(6); + "[Forced subtitle index 0-n] [Subtitle name filter]\nYour input: "); + List input = readInput(7); String[] audioLanguage = new String[]{"jpn", "0"}; String[] subtitleLanguage = new String[]{"eng", "0"}; boolean toStereo = true; boolean preventSigns = true; int forcedAudioIndex = -1; int forcedSubtitleIndex = -1; + String subtitleNameFilter = ""; + if (input.size() > 0) { audioLanguage = ListUtil.getListFromCommaSeparatedString(input.get(0)); } @@ -140,8 +142,11 @@ class Main { OutputUtil.println("Forced audio or subtitle index is not a number"); return; } + if (input.size() > 6) { + subtitleNameFilter = input.get(6); + } converter = new AnimeConverter(FFPROBE_PATH, FFMPEG_PATH, audioLanguage, subtitleLanguage, toStereo, - preventSigns, forcedAudioIndex, forcedSubtitleIndex); + preventSigns, forcedAudioIndex, forcedSubtitleIndex, subtitleNameFilter); } @@ -200,5 +205,5 @@ class Main { } while (choice < min || choice > max); return choice; } - + } diff --git a/src/main/java/net/knarcraft/ffmpegconverter/converter/AbstractConverter.java b/src/main/java/net/knarcraft/ffmpegconverter/converter/AbstractConverter.java index 549ab79..bb97e40 100644 --- a/src/main/java/net/knarcraft/ffmpegconverter/converter/AbstractConverter.java +++ b/src/main/java/net/knarcraft/ffmpegconverter/converter/AbstractConverter.java @@ -76,12 +76,17 @@ public abstract class AbstractConverter implements Converter { * @param subtitleStreams

A list of subtitle streams.

* @param subtitleLanguages

A list of languages.

* @param preventSignsAndSongs

Whether partial subtitles should be avoided.

+ * @param subtitleNameFilter

The filter to use for forcing streams of a given subtitle group

* @return

A list containing just subtitles of chosen languages, sorted in order of languages.

*/ static List filterSubtitleStreams(List subtitleStreams, String[] subtitleLanguages, - boolean preventSignsAndSongs) { + boolean preventSignsAndSongs, String subtitleNameFilter) { List sorted = sortStreamsByLanguage(subtitleStreams, subtitleLanguages); sorted.removeIf((stream) -> preventSignsAndSongs && !stream.getIsFullSubtitle()); + //Filter by name of subtitle group, PGS or similar + if (!subtitleNameFilter.trim().isEmpty()) { + sorted.removeIf((stream) -> !stream.getTitle().contains(subtitleNameFilter)); + } return sorted; } diff --git a/src/main/java/net/knarcraft/ffmpegconverter/converter/AnimeConverter.java b/src/main/java/net/knarcraft/ffmpegconverter/converter/AnimeConverter.java index bd02e13..7298da1 100644 --- a/src/main/java/net/knarcraft/ffmpegconverter/converter/AnimeConverter.java +++ b/src/main/java/net/knarcraft/ffmpegconverter/converter/AnimeConverter.java @@ -21,6 +21,7 @@ public class AnimeConverter extends AbstractConverter { private final boolean preventSignsAndSongs; private final int forcedAudioIndex; private final int forcedSubtitleIndex; + private final String subtitleNameFilter; /** * Instantiates a new anime converter @@ -35,7 +36,8 @@ public class AnimeConverter extends AbstractConverter { * @param forcedSubtitleIndex

A specific subtitle stream to force. 0-indexed for the first subtitle stream found

*/ public AnimeConverter(String ffprobePath, String ffmpegPath, String[] audioLanguages, String[] subtitleLanguages, - boolean toStereo, boolean preventSignsAndSongs, int forcedAudioIndex, int forcedSubtitleIndex) { + boolean toStereo, boolean preventSignsAndSongs, int forcedAudioIndex, int forcedSubtitleIndex, + String subtitleNameFilter) { super("mp4"); this.ffprobePath = ffprobePath; this.ffmpegPath = ffmpegPath; @@ -45,6 +47,7 @@ public class AnimeConverter extends AbstractConverter { this.preventSignsAndSongs = preventSignsAndSongs; this.forcedAudioIndex = forcedAudioIndex; this.forcedSubtitleIndex = forcedSubtitleIndex; + this.subtitleNameFilter = subtitleNameFilter; } @Override @@ -55,20 +58,22 @@ public class AnimeConverter extends AbstractConverter { } //Get the first audio stream in accordance with chosen languages - List audioStreams = filterAudioStreams(filterStreamsByType(streams, AudioStream.class), audioLanguages); - AudioStream audioStream = getNthAudioSteam(new ArrayList<>(audioStreams), Math.max(forcedAudioIndex, 0)); + List audioStreams = filterAudioStreams(filterStreamsByType(streams, AudioStream.class), + this.audioLanguages); + AudioStream audioStream = getNthAudioSteam(new ArrayList<>(audioStreams), Math.max(this.forcedAudioIndex, 0)); //Get the first subtitle stream in accordance with chosen languages and signs and songs prevention - List subtitleStreams = filterSubtitleStreams(filterStreamsByType(streams, - SubtitleStream.class), subtitleLanguages, preventSignsAndSongs); + List allSubtitleStreams = filterStreamsByType(streams, SubtitleStream.class); + List subtitleStreams = filterSubtitleStreams(allSubtitleStreams, this.subtitleLanguages, + this.preventSignsAndSongs, this.subtitleNameFilter); SubtitleStream subtitleStream = getNthSubtitleStream(new ArrayList<>(subtitleStreams), - Math.max(forcedSubtitleIndex, 0)); + Math.max(this.forcedSubtitleIndex, 0)); //Get the first video stream VideoStream videoStream = getFirstVideoStream(streams); //Add streams to output file - FFMpegHelper.addAudioStream(command, audioStream, toStereo); + FFMpegHelper.addAudioStream(command, audioStream, this.toStereo); FFMpegHelper.addSubtitleAndVideoStream(command, subtitleStream, videoStream, file); command.add(outFile); @@ -77,7 +82,7 @@ public class AnimeConverter extends AbstractConverter { @Override public String[] getValidFormats() { - return videoFormats; + return this.videoFormats; } } diff --git a/src/main/java/net/knarcraft/ffmpegconverter/streams/VideoStream.java b/src/main/java/net/knarcraft/ffmpegconverter/streams/VideoStream.java index 001c397..5d8dc66 100644 --- a/src/main/java/net/knarcraft/ffmpegconverter/streams/VideoStream.java +++ b/src/main/java/net/knarcraft/ffmpegconverter/streams/VideoStream.java @@ -42,5 +42,5 @@ public class VideoStream extends AbstractStream implements StreamObject { public int getHeight() { return this.height; } - + } \ No newline at end of file diff --git a/src/main/java/net/knarcraft/ffmpegconverter/utility/FFMpegHelper.java b/src/main/java/net/knarcraft/ffmpegconverter/utility/FFMpegHelper.java index 3a9763c..367da89 100644 --- a/src/main/java/net/knarcraft/ffmpegconverter/utility/FFMpegHelper.java +++ b/src/main/java/net/knarcraft/ffmpegconverter/utility/FFMpegHelper.java @@ -430,5 +430,5 @@ public final class FFMpegHelper { } return new SubtitleStream(codecName, absoluteIndex, relativeIndex, language, title, file); } - + } diff --git a/src/test/java/net/knarcraft/ffmpegconverter/converter/AnimeConverterTest.java b/src/test/java/net/knarcraft/ffmpegconverter/converter/AnimeConverterTest.java index 0e2c5b8..673f4f9 100644 --- a/src/test/java/net/knarcraft/ffmpegconverter/converter/AnimeConverterTest.java +++ b/src/test/java/net/knarcraft/ffmpegconverter/converter/AnimeConverterTest.java @@ -11,7 +11,7 @@ public class AnimeConverterTest { public void setUp() { new AnimeConverter("ffprobe", "ffmpeg", new String[]{"jpn", "eng", "nor", "swe"}, new String[]{"nor", "eng", "swe", "fin"}, false, - false, -1, -1); + false, -1, -1, ""); } @Test