diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 13566b8..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index c2621b8..0000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index df5f35d..0000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/csv-editor.xml b/.idea/csv-editor.xml
new file mode 100644
index 0000000..8470082
--- /dev/null
+++ b/.idea/csv-editor.xml
@@ -0,0 +1,282 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 058a36e..84995dc 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -1,30 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
@@ -59,12 +82,17 @@
+
+
+
+
+
@@ -98,7 +126,6 @@
-
@@ -107,6 +134,7 @@
+
@@ -115,12 +143,13 @@
+
+
-
@@ -131,6 +160,7 @@
+
@@ -141,6 +171,9 @@
+
+
+
@@ -188,6 +221,7 @@
+
@@ -195,6 +229,7 @@
+
@@ -203,6 +238,9 @@
+
+
+
@@ -215,6 +253,7 @@
+
@@ -328,6 +367,10 @@
+
+
+
+
@@ -349,9 +392,11 @@
+
+
@@ -408,6 +453,7 @@
+
@@ -415,6 +461,7 @@
+
@@ -441,6 +488,7 @@
+
@@ -448,6 +496,8 @@
+
+
@@ -460,8 +510,11 @@
+
+
+
@@ -476,10 +529,14 @@
+
+
+
+
@@ -488,6 +545,20 @@
+
+
+
+
+
+
+
+
@@ -507,6 +578,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -524,15 +690,20 @@
+
+
+
+
+
@@ -544,13 +715,20 @@
+
+
+
+
+
+
+
@@ -571,9 +749,12 @@
+
+
+
@@ -586,6 +767,12 @@
+
+
+
+
+
+
@@ -593,6 +780,9 @@
+
+
+
@@ -601,6 +791,10 @@
+
+
+
+
@@ -622,6 +816,7 @@
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4ae60ba..d14eb00 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -11,7 +11,5 @@
-
-
-
+
\ No newline at end of file
diff --git a/.idea/scala_compiler.xml b/.idea/scala_compiler.xml
deleted file mode 100644
index 0717315..0000000
--- a/.idea/scala_compiler.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/sonarlint.xml b/.idea/sonarlint.xml
deleted file mode 100644
index 2645de5..0000000
--- a/.idea/sonarlint.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 9661ac7..c8397c9 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..d2f030c
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,462 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "customColor": "",
+ "associatedIndex": 4
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1726946764733
+
+
+ 1726946764733
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/File.java b/api/src/main/java/com/github/gtache/autosubtitle/File.java
index 6b74820..b37cb54 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/File.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/File.java
@@ -8,6 +8,7 @@ import java.nio.file.Path;
/**
* Represents a file
*/
+@FunctionalInterface
public interface File {
/**
* @return The file input stream
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/Language.java b/api/src/main/java/com/github/gtache/autosubtitle/Language.java
index c8600e2..8647da1 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/Language.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/Language.java
@@ -54,7 +54,7 @@ public enum Language {
static {
final Map map = new java.util.HashMap<>();
- for (final var language : Language.values()) {
+ for (final var language : values()) {
map.put(language.name().toLowerCase(), language);
map.put(language.englishName.toLowerCase(), language);
map.put(language.iso2, language);
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/VideoConverter.java b/api/src/main/java/com/github/gtache/autosubtitle/VideoConverter.java
index f19bc7c..81cd439 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/VideoConverter.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/VideoConverter.java
@@ -1,5 +1,6 @@
package com.github.gtache.autosubtitle;
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
import java.io.IOException;
@@ -16,40 +17,44 @@ public interface VideoConverter {
*
* @param video The video
* @param subtitles The subtitles collections to add
+ * @param options The export options for the subtitles
* @return The modified video
* @throws IOException If an I/O error occurs
*/
- Video addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles) throws IOException;
+ Video addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final ExportOptions options) throws IOException;
/**
* Adds soft subtitles to the given video
*
* @param video The video
* @param subtitles The subtitles collections to add
+ * @param options The export options for the subtitles
* @param path The output path
* @throws IOException If an I/O error occurs
*/
- void addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final Path path) throws IOException;
+ void addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final ExportOptions options, final Path path) throws IOException;
/**
* Adds hard subtitles to the given video
*
* @param video The video
* @param subtitles The subtitle collection to add
+ * @param options The export options for the subtitles
* @return The modified video
* @throws IOException If an I/O error occurs
*/
- Video addHardSubtitles(final Video video, final SubtitleCollection> subtitles) throws IOException;
+ Video addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final ExportOptions options) throws IOException;
/**
* Adds hard subtitles to the given video
*
* @param video The video
* @param subtitles The subtitle collection to add
+ * @param options The export options for the subtitles
* @param path The output path
* @throws IOException If an I/O error occurs
*/
- void addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final Path path) throws IOException;
+ void addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final ExportOptions options, final Path path) throws IOException;
/**
* Extracts the audio from the given video
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/archive/Archiver.java b/api/src/main/java/com/github/gtache/autosubtitle/archive/Archiver.java
index 381f350..ca78619 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/archive/Archiver.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/archive/Archiver.java
@@ -14,9 +14,8 @@ public interface Archiver {
*
* @param files The files to zip
* @param destination The zipped file
- * @throws IOException if an error occurs
*/
- void compress(final List files, final Path destination) throws IOException;
+ void compress(final List files, final Path destination);
/**
* Unzips an archive to the given destination
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/process/ProcessListener.java b/api/src/main/java/com/github/gtache/autosubtitle/process/ProcessListener.java
index a3a1cdf..bb53d5c 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/process/ProcessListener.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/process/ProcessListener.java
@@ -26,7 +26,6 @@ public interface ProcessListener {
*
* @param duration The maximum time to wait
* @return The process result
- * @throws IOException if an error occurs
*/
- ProcessResult join(final Duration duration) throws IOException;
+ ProcessResult join(final Duration duration);
}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/setup/SetupManager.java b/api/src/main/java/com/github/gtache/autosubtitle/setup/SetupManager.java
index 9d91e4b..ab7d390 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/setup/SetupManager.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/setup/SetupManager.java
@@ -17,9 +17,8 @@ public interface SetupManager {
/**
* @return whether the component is installed
- * @throws SetupException if an error occurred
*/
- boolean isInstalled() throws SetupException;
+ boolean isInstalled();
/**
* Installs the component
@@ -46,9 +45,8 @@ public interface SetupManager {
* Checks if an update is available for the component
*
* @return whether an update is available
- * @throws SetupException if an error occurred during the check
*/
- boolean isUpdateAvailable() throws SetupException;
+ boolean isUpdateAvailable();
/**
* Updates the component
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExportOptions.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExportOptions.java
new file mode 100644
index 0000000..a0cc8d0
--- /dev/null
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExportOptions.java
@@ -0,0 +1,19 @@
+package com.github.gtache.autosubtitle.subtitle;
+
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
+
+/**
+ * Represents the subtitles export options
+ */
+public interface ExportOptions {
+
+ /**
+ * @return The output format
+ */
+ OutputFormat outputFormat();
+
+ /**
+ * @return The subtitles format options
+ */
+ FormatOptions formatOptions();
+}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ImportOptions.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ImportOptions.java
new file mode 100644
index 0000000..afc9541
--- /dev/null
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ImportOptions.java
@@ -0,0 +1,14 @@
+package com.github.gtache.autosubtitle.subtitle;
+
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
+
+/**
+ * Represents the subtitles import options
+ */
+public interface ImportOptions {
+
+ /**
+ * @return The options for subtitle parsing
+ */
+ ParseOptions parseOptions();
+}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleImporterExporter.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleImporterExporter.java
index e883b04..1067357 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleImporterExporter.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleImporterExporter.java
@@ -1,7 +1,6 @@
package com.github.gtache.autosubtitle.subtitle;
import com.github.gtache.autosubtitle.Language;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
import java.io.IOException;
@@ -18,33 +17,34 @@ public interface SubtitleImporterExporter {
/**
* Imports subtitles from a file
*
- * @param file The path to the file
- * @return A mapping of langauge to collection
+ * @param file The path to the file
+ * @param options The import options
+ * @return A mapping of language to collection
* @throws IOException If an error occurred
* @throws ParseException If an error occurred while parsing a subtitle
*/
- Map> importSubtitles(final Path file) throws IOException, ParseException;
+ Map> importSubtitles(final Path file, final ImportOptions options) throws IOException, ParseException;
/**
* Exports multiple collections to a file
*
* @param collections The subtitle collections
- * @param videoInfo The video info (e.g. ASS format uses it)
+ * @param options The export options
* @param file The path to the file
* @throws IOException If an error occurred
*/
- void exportSubtitles(final Collection extends SubtitleCollection>> collections, final VideoInfo videoInfo, final Path file) throws IOException;
+ void exportSubtitles(final Collection extends SubtitleCollection>> collections, final ExportOptions options, final Path file) throws IOException;
/**
* Exports a single collection to a file
*
* @param collection The subtitle collection
- * @param videoInfo The video info (e.g. ASS format uses it)
+ * @param options The export options
* @param file The path to the file
* @throws IOException If an error occurred
*/
- default void exportSubtitles(final SubtitleCollection> collection, final VideoInfo videoInfo, final Path file) throws IOException {
- exportSubtitles(List.of(collection), videoInfo, file);
+ default void exportSubtitles(final SubtitleCollection> collection, final ExportOptions options, final Path file) throws IOException {
+ exportSubtitles(List.of(collection), options, file);
}
/**
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/FormatException.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/FormatException.java
new file mode 100644
index 0000000..43978f2
--- /dev/null
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/FormatException.java
@@ -0,0 +1,19 @@
+package com.github.gtache.autosubtitle.subtitle.converter;
+
+/**
+ * Exception thrown when an error occurs during subtitle formatting
+ */
+public class FormatException extends Exception {
+
+ public FormatException(final String message) {
+ super(message);
+ }
+
+ public FormatException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public FormatException(final Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/FormatOptions.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/FormatOptions.java
new file mode 100644
index 0000000..529168b
--- /dev/null
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/FormatOptions.java
@@ -0,0 +1,20 @@
+package com.github.gtache.autosubtitle.subtitle.converter;
+
+import com.github.gtache.autosubtitle.VideoInfo;
+import com.github.gtache.autosubtitle.subtitle.Font;
+
+/**
+ * Represents the subtitle format options
+ */
+public interface FormatOptions {
+
+ /**
+ * @return the current video info
+ */
+ VideoInfo videoInfo();
+
+ /**
+ * @return The default font to use when not specified
+ */
+ Font defaultFont();
+}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/ParseOptions.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/ParseOptions.java
new file mode 100644
index 0000000..13967bc
--- /dev/null
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/ParseOptions.java
@@ -0,0 +1,24 @@
+package com.github.gtache.autosubtitle.subtitle.converter;
+
+import com.github.gtache.autosubtitle.subtitle.Font;
+
+/**
+ * Represents the parse options
+ */
+public interface ParseOptions {
+
+ /**
+ * @return The max length in characters for a subtitle line
+ */
+ int maxLineLength();
+
+ /**
+ * @return The max number of lines for a subtitle
+ */
+ int maxLines();
+
+ /**
+ * @return The default font to use when not specified
+ */
+ Font defaultFont();
+}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverter.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverter.java
index 0864fc9..094bc0c 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverter.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverter.java
@@ -1,6 +1,5 @@
package com.github.gtache.autosubtitle.subtitle.converter;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
@@ -9,7 +8,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
/**
- * Converts subtitles to a specific format (e.g. srt, ssa, ass, ...) and vice-versa
+ * Converts subtitles to a specific format (e.g. srt, ssa, ass, ...) and vice versa
*/
public interface SubtitleConverter {
@@ -17,22 +16,24 @@ public interface SubtitleConverter {
* Converts the subtitle collection
*
* @param collection The collection
- * @param videoInfo The video info (e.g. ASS format uses it)
+ * @param options The format options
* @return The converted subtitles as the content of a file
+ * @throws FormatException If an error occurred
*/
- String format(final SubtitleCollection> collection, final VideoInfo videoInfo);
+ String format(final SubtitleCollection> collection, final FormatOptions options) throws FormatException;
/**
* Parses a subtitle collection
*
- * @param file The path to the file
+ * @param file The path to the file
+ * @param options The parse options
* @return The subtitle collection
* @throws ParseException If an error occurred
*/
- default SubtitleCollection parse(final Path file) throws ParseException {
+ default SubtitleCollection parse(final Path file, final ParseOptions options) throws ParseException {
try {
final var content = Files.readString(file);
- return parse(content);
+ return parse(content, options);
} catch (final IOException e) {
throw new ParseException(e);
}
@@ -42,10 +43,11 @@ public interface SubtitleConverter {
* Parses a subtitle collection
*
* @param content The content of the file
+ * @param options The conversion options
* @return The subtitle collection
* @throws ParseException If an error occurred
*/
- SubtitleCollection parse(String content) throws ParseException;
+ SubtitleCollection parse(String content, ParseOptions options) throws ParseException;
/**
* Check if the parser can parse the given file
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverterProvider.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverterProvider.java
index 96d40c1..9c05805 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverterProvider.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverterProvider.java
@@ -1,5 +1,7 @@
package com.github.gtache.autosubtitle.subtitle.converter;
+import com.github.gtache.autosubtitle.subtitle.OutputFormat;
+
import java.util.Collection;
/**
@@ -19,4 +21,14 @@ public interface SubtitleConverterProvider {
* @return The converter (or null if not found)
*/
SubtitleConverter> getConverter(final String format);
+
+ /**
+ * Returns the converter for the given format
+ *
+ * @param format The format
+ * @return The converter (or null if not found)
+ */
+ default SubtitleConverter> getConverter(final OutputFormat format) {
+ return getConverter(format.name());
+ }
}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractOptions.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractOptions.java
new file mode 100644
index 0000000..49ada08
--- /dev/null
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractOptions.java
@@ -0,0 +1,25 @@
+package com.github.gtache.autosubtitle.subtitle.extractor;
+
+import com.github.gtache.autosubtitle.Language;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
+
+/**
+ * Options for subtitle extraction
+ */
+public interface ExtractOptions {
+
+ /**
+ * @return The language of the subtitles
+ */
+ Language language();
+
+ /**
+ * @return The extraction model
+ */
+ ExtractionModel model();
+
+ /**
+ * @return The subtitles parsing options
+ */
+ ParseOptions parseOptions();
+}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModel.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModel.java
index a12f753..a60f91e 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModel.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModel.java
@@ -3,6 +3,7 @@ package com.github.gtache.autosubtitle.subtitle.extractor;
/**
* An extraction model
*/
+@FunctionalInterface
public interface ExtractionModel {
/**
* @return the name of the model
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractor.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractor.java
index be85b18..e55e2dd 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractor.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractor.java
@@ -1,7 +1,6 @@
package com.github.gtache.autosubtitle.subtitle.extractor;
import com.github.gtache.autosubtitle.Audio;
-import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
@@ -33,46 +32,20 @@ public interface SubtitleExtractor {
/**
* Extracts the subtitles from a video
*
- * @param video The video
- * @param model The model to use
+ * @param video The video
+ * @param options The language of the audio
* @return The extracted subtitle collection
* @throws ExtractException If an error occurs
*/
- default SubtitleCollection extract(final Video video, final ExtractionModel model) throws ExtractException {
- return extract(video, Language.AUTO, model);
- }
-
- /**
- * Extracts the subtitles from a video
- *
- * @param video The video
- * @param language The language of the audio
- * @param model The model to use
- * @return The extracted subtitle collection
- * @throws ExtractException If an error occurs
- */
- SubtitleCollection extract(final Video video, final Language language, final ExtractionModel model) throws ExtractException;
+ SubtitleCollection extract(final Video video, final ExtractOptions options) throws ExtractException;
/**
* Extracts the subtitles from an audio
*
- * @param audio The audio
- * @param model The model to use
+ * @param audio The audio
+ * @param options The extraction options
* @return The extracted subtitle collection
* @throws ExtractException If an error occurs
*/
- default SubtitleCollection extract(final Audio audio, final ExtractionModel model) throws ExtractException {
- return extract(audio, Language.AUTO, model);
- }
-
- /**
- * Extracts the subtitles from an audio
- *
- * @param audio The audio
- * @param language The language of the audio
- * @param model The model to use
- * @return The extracted subtitle collection
- * @throws ExtractException If an error occurs
- */
- SubtitleCollection extract(final Audio audio, final Language language, final ExtractionModel model) throws ExtractException;
+ SubtitleCollection extract(final Audio audio, final ExtractOptions options) throws ExtractException;
}
diff --git a/api/src/test/java/com/github/gtache/autosubtitle/subtitle/TestSubtitleImporterExporter.java b/api/src/test/java/com/github/gtache/autosubtitle/subtitle/TestSubtitleImporterExporter.java
index 5b4ce5c..d0c85cb 100644
--- a/api/src/test/java/com/github/gtache/autosubtitle/subtitle/TestSubtitleImporterExporter.java
+++ b/api/src/test/java/com/github/gtache/autosubtitle/subtitle/TestSubtitleImporterExporter.java
@@ -1,36 +1,36 @@
package com.github.gtache.autosubtitle.subtitle;
-import com.github.gtache.autosubtitle.VideoInfo;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import java.io.IOException;
-import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.List;
import static java.util.Objects.requireNonNull;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
@ExtendWith(MockitoExtension.class)
class TestSubtitleImporterExporter {
private final SubtitleImporterExporter importerExporter;
private final SubtitleCollection subtitleCollection;
+ private final ExportOptions options;
- TestSubtitleImporterExporter(@Mock final SubtitleCollection subtitleCollection) {
+ TestSubtitleImporterExporter(@Mock final SubtitleCollection subtitleCollection, @Mock final ExportOptions options) {
this.subtitleCollection = requireNonNull(subtitleCollection);
+ this.options = requireNonNull(options);
this.importerExporter = spy(SubtitleImporterExporter.class);
}
@Test
void testExportSubtitleCollection() throws IOException {
- final var videoInfo = Mockito.mock(VideoInfo.class);
- final var file = mock(Path.class);
+ final var file = Paths.get("path");
- importerExporter.exportSubtitles(subtitleCollection, videoInfo, file);
- verify(importerExporter).exportSubtitles(List.of(subtitleCollection), videoInfo, file);
+ importerExporter.exportSubtitles(subtitleCollection, options, file);
+ verify(importerExporter).exportSubtitles(List.of(subtitleCollection), options, file);
}
}
diff --git a/api/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/TestSubtitleConverter.java b/api/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/TestSubtitleConverter.java
index f5fbb7f..6a7e349 100644
--- a/api/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/TestSubtitleConverter.java
+++ b/api/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/TestSubtitleConverter.java
@@ -11,11 +11,10 @@ import org.mockito.junit.jupiter.MockitoExtension;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.util.Objects;
+import static java.util.Objects.requireNonNull;
import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
@@ -23,11 +22,14 @@ class TestSubtitleConverter {
private final SubtitleConverter subtitleConverter;
private final SubtitleCollection subtitleCollection;
+ private final ParseOptions options;
TestSubtitleConverter(@Mock final SubtitleConverter subtitleConverter,
- @Mock final SubtitleCollection subtitleCollection) {
- this.subtitleConverter = Objects.requireNonNull(subtitleConverter);
- this.subtitleCollection = Objects.requireNonNull(subtitleCollection);
+ @Mock final SubtitleCollection subtitleCollection,
+ @Mock final ParseOptions options) {
+ this.subtitleConverter = requireNonNull(subtitleConverter);
+ this.subtitleCollection = requireNonNull(subtitleCollection);
+ this.options = requireNonNull(options);
}
@Test
@@ -35,19 +37,19 @@ class TestSubtitleConverter {
final var file = tempDir.resolve("test.srt");
final var string = "test";
Files.writeString(file, string);
- when(subtitleConverter.parse(file)).thenCallRealMethod();
- when(subtitleConverter.parse(string)).thenReturn(subtitleCollection);
+ when(subtitleConverter.parse(file, options)).thenCallRealMethod();
+ when(subtitleConverter.parse(string, options)).thenReturn(subtitleCollection);
- assertEquals(subtitleCollection, subtitleConverter.parse(file));
+ assertEquals(subtitleCollection, subtitleConverter.parse(file, options));
}
@Test
void testParseException(@TempDir final Path tempDir) throws ParseException {
final var file = tempDir.resolve("test.srt");
- when(subtitleConverter.parse(file)).thenCallRealMethod();
- when(subtitleConverter.parse(anyString())).thenReturn(subtitleCollection);
+ when(subtitleConverter.parse(file, options)).thenCallRealMethod();
+ when(subtitleConverter.parse(anyString(), eq(options))).thenReturn(subtitleCollection);
- assertThrows(ParseException.class, () -> subtitleConverter.parse(file));
+ assertThrows(ParseException.class, () -> subtitleConverter.parse(file, options));
}
@Test
diff --git a/api/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/TestSubtitleConverterProvider.java b/api/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/TestSubtitleConverterProvider.java
new file mode 100644
index 0000000..bace157
--- /dev/null
+++ b/api/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/TestSubtitleConverterProvider.java
@@ -0,0 +1,32 @@
+package com.github.gtache.autosubtitle.subtitle.converter;
+
+import com.github.gtache.autosubtitle.subtitle.OutputFormat;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Objects;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+class TestSubtitleConverterProvider {
+
+ private final SubtitleConverter> converter;
+ private final SubtitleConverterProvider provider;
+
+ TestSubtitleConverterProvider(@Mock final SubtitleConverter> converter) {
+ this.converter = Objects.requireNonNull(converter);
+ this.provider = spy(SubtitleConverterProvider.class);
+ }
+
+ @Test
+ void testGetConverter() {
+ final var format = OutputFormat.SRT;
+ when(provider.getConverter("SRT")).thenReturn((SubtitleConverter) converter);
+ assertEquals(converter, provider.getConverter(format));
+ verify(provider).getConverter("SRT");
+ }
+}
diff --git a/api/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/TestSubtitleExtractor.java b/api/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/TestSubtitleExtractor.java
deleted file mode 100644
index 614cda5..0000000
--- a/api/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/TestSubtitleExtractor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.github.gtache.autosubtitle.subtitle.extractor;
-
-import com.github.gtache.autosubtitle.Audio;
-import com.github.gtache.autosubtitle.Language;
-import com.github.gtache.autosubtitle.Video;
-import com.github.gtache.autosubtitle.subtitle.Subtitle;
-import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import java.util.Objects;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-
-@ExtendWith(MockitoExtension.class)
-class TestSubtitleExtractor {
-
- private final SubtitleExtractor subtitleExtractor;
- private final SubtitleCollection subtitleCollection;
- private final Audio audio;
- private final Video video;
- private final ExtractionModel extractionModel;
-
- TestSubtitleExtractor(@Mock final SubtitleExtractor subtitleExtractor,
- @Mock final SubtitleCollection subtitleCollection,
- @Mock final Audio audio,
- @Mock final Video video,
- @Mock final ExtractionModel extractionModel) {
- this.subtitleExtractor = Objects.requireNonNull(subtitleExtractor);
- this.subtitleCollection = Objects.requireNonNull(subtitleCollection);
- this.audio = Objects.requireNonNull(audio);
- this.video = Objects.requireNonNull(video);
- this.extractionModel = Objects.requireNonNull(extractionModel);
- }
-
- @Test
- void testExtractVideo() throws ExtractException {
- when(subtitleExtractor.extract(any(Video.class), any())).thenCallRealMethod();
- when(subtitleExtractor.extract(video, Language.AUTO, extractionModel)).thenReturn(subtitleCollection);
-
- assertEquals(subtitleCollection, subtitleExtractor.extract(video, extractionModel));
- }
-
- @Test
- void testExtractAudio() throws ExtractException {
- when(subtitleExtractor.extract(any(Audio.class), any())).thenCallRealMethod();
- when(subtitleExtractor.extract(audio, Language.AUTO, extractionModel)).thenReturn(subtitleCollection);
-
- assertEquals(subtitleCollection, subtitleExtractor.extract(audio, extractionModel));
- }
-}
diff --git a/cli/src/main/java/com/github/gtache/autosubtitle/cli/Cli.java b/cli/src/main/java/com/github/gtache/autosubtitle/cli/Cli.java
index 0439e22..7ed6530 100644
--- a/cli/src/main/java/com/github/gtache/autosubtitle/cli/Cli.java
+++ b/cli/src/main/java/com/github/gtache/autosubtitle/cli/Cli.java
@@ -23,7 +23,7 @@ public final class Cli implements Runnable {
private String subtitleConverter;
@CommandLine.Option(names = {"-c", "--video-converter"}, description = "The video converter to use [ffmpeg]", defaultValue = "ffmpeg")
private String videoConverter;
- @CommandLine.Option(names = {"--translations"}, description = "The list of translations to create. Ignored if burn is specified", split = ",", arity = "0..*")
+ @CommandLine.Option(names = "--translations", description = "The list of translations to create. Ignored if burn is specified", split = ",", arity = "0..*")
private Set translations;
@CommandLine.Option(names = {"-t", "--translator"}, description = "The translator to use [deepl]. Ignored if burn is specified", defaultValue = "deepl")
private String translator;
diff --git a/client/src/main/java/com/github/gtache/autosubtitle/client/RemoteVideoConverter.java b/client/src/main/java/com/github/gtache/autosubtitle/client/RemoteVideoConverter.java
index 58bb319..1b824f7 100644
--- a/client/src/main/java/com/github/gtache/autosubtitle/client/RemoteVideoConverter.java
+++ b/client/src/main/java/com/github/gtache/autosubtitle/client/RemoteVideoConverter.java
@@ -3,9 +3,9 @@ package com.github.gtache.autosubtitle.client;
import com.github.gtache.autosubtitle.Audio;
import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.VideoConverter;
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import java.io.IOException;
import java.nio.file.Path;
import java.util.Collection;
@@ -14,27 +14,28 @@ import java.util.Collection;
*/
public class RemoteVideoConverter implements VideoConverter {
@Override
- public Video addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles) throws IOException {
+ public Video addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final ExportOptions options) {
throw new UnsupportedOperationException();
}
@Override
- public void addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final Path path) throws IOException {
+ public void addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final ExportOptions options, final Path path) {
throw new UnsupportedOperationException();
}
@Override
- public Video addHardSubtitles(final Video video, final SubtitleCollection> subtitles) throws IOException {
+ public Video addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final ExportOptions options) {
+ throw new UnsupportedOperationException();
+ }
+
+
+ @Override
+ public void addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final ExportOptions options, final Path path) {
throw new UnsupportedOperationException();
}
@Override
- public void addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final Path path) throws IOException {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Audio getAudio(final Video video) throws IOException {
+ public Audio getAudio(final Video video) {
throw new UnsupportedOperationException();
}
}
diff --git a/client/src/main/java/com/github/gtache/autosubtitle/client/RemoteVideoLoader.java b/client/src/main/java/com/github/gtache/autosubtitle/client/RemoteVideoLoader.java
index ac65ef2..8ba490f 100644
--- a/client/src/main/java/com/github/gtache/autosubtitle/client/RemoteVideoLoader.java
+++ b/client/src/main/java/com/github/gtache/autosubtitle/client/RemoteVideoLoader.java
@@ -3,7 +3,6 @@ package com.github.gtache.autosubtitle.client;
import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.VideoLoader;
-import java.io.IOException;
import java.nio.file.Path;
/**
@@ -11,7 +10,7 @@ import java.nio.file.Path;
*/
public class RemoteVideoLoader implements VideoLoader {
@Override
- public Video loadVideo(final Path path) throws IOException {
+ public Video loadVideo(final Path path) {
throw new UnsupportedOperationException();
}
}
diff --git a/client/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/client/RemoteSubtitleConverter.java b/client/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/client/RemoteSubtitleConverter.java
index 4c2be7b..74b5576 100644
--- a/client/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/client/RemoteSubtitleConverter.java
+++ b/client/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/client/RemoteSubtitleConverter.java
@@ -1,9 +1,9 @@
package com.github.gtache.autosubtitle.subtitle.converter.client;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
/**
@@ -13,12 +13,12 @@ import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
*/
public class RemoteSubtitleConverter implements SubtitleConverter {
@Override
- public String format(final SubtitleCollection> collection, final VideoInfo videoInfo) {
+ public String format(final SubtitleCollection> collection, final FormatOptions options) {
throw new UnsupportedOperationException();
}
@Override
- public SubtitleCollection parse(final String content) throws ParseException {
+ public SubtitleCollection parse(final String content, final ParseOptions options) {
throw new UnsupportedOperationException();
}
diff --git a/client/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/client/RemoteSubtitleExtractor.java b/client/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/client/RemoteSubtitleExtractor.java
index 87f0313..c7bbee9 100644
--- a/client/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/client/RemoteSubtitleExtractor.java
+++ b/client/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/client/RemoteSubtitleExtractor.java
@@ -1,11 +1,9 @@
package com.github.gtache.autosubtitle.subtitle.extractor.client;
import com.github.gtache.autosubtitle.Audio;
-import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import com.github.gtache.autosubtitle.subtitle.extractor.ExtractException;
-import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
import com.github.gtache.autosubtitle.subtitle.extractor.impl.AbstractSubtitleExtractor;
@@ -15,12 +13,12 @@ import com.github.gtache.autosubtitle.subtitle.extractor.impl.AbstractSubtitleEx
public class RemoteSubtitleExtractor extends AbstractSubtitleExtractor {
@Override
- public SubtitleCollection extract(final Video video, final Language language, final ExtractionModel model) throws ExtractException {
+ public SubtitleCollection extract(final Video video, final ExtractOptions options) {
throw new UnsupportedOperationException();
}
@Override
- public SubtitleCollection extract(final Audio audio, final Language language, final ExtractionModel model) throws ExtractException {
+ public SubtitleCollection extract(final Audio audio, final ExtractOptions options) {
throw new UnsupportedOperationException();
}
}
diff --git a/client/src/main/java/com/github/gtache/autosubtitle/translation/client/RemoteTranslator.java b/client/src/main/java/com/github/gtache/autosubtitle/translation/client/RemoteTranslator.java
index 7d820ac..af98297 100644
--- a/client/src/main/java/com/github/gtache/autosubtitle/translation/client/RemoteTranslator.java
+++ b/client/src/main/java/com/github/gtache/autosubtitle/translation/client/RemoteTranslator.java
@@ -3,7 +3,6 @@ package com.github.gtache.autosubtitle.translation.client;
import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import com.github.gtache.autosubtitle.translation.TranslationException;
import com.github.gtache.autosubtitle.translation.Translator;
/**
@@ -18,17 +17,17 @@ public class RemoteTranslator implements Translator {
}
@Override
- public String translate(final String text, final Language from, final Language to) throws TranslationException {
+ public String translate(final String text, final Language from, final Language to) {
throw new UnsupportedOperationException();
}
@Override
- public T translate(final Subtitle subtitle, final Language from, final Language to) throws TranslationException {
+ public T translate(final Subtitle subtitle, final Language from, final Language to) {
throw new UnsupportedOperationException();
}
@Override
- public SubtitleCollection translate(final SubtitleCollection> collection, final Language from, final Language to) throws TranslationException {
+ public SubtitleCollection translate(final SubtitleCollection> collection, final Language from, final Language to) {
throw new UnsupportedOperationException();
}
}
diff --git a/conda/src/main/java/com/github/gtache/autosubtitle/setup/conda/CondaSetupManager.java b/conda/src/main/java/com/github/gtache/autosubtitle/setup/conda/CondaSetupManager.java
index a515209..e6e9bd3 100644
--- a/conda/src/main/java/com/github/gtache/autosubtitle/setup/conda/CondaSetupManager.java
+++ b/conda/src/main/java/com/github/gtache/autosubtitle/setup/conda/CondaSetupManager.java
@@ -70,8 +70,8 @@ public class CondaSetupManager extends AbstractSetupManager {
logger.info("Conda downloaded");
}
switch (configuration.os()) {
- case OS.WINDOWS -> installWindows();
- case OS.MAC, OS.LINUX -> installLinux();
+ case WINDOWS -> installWindows();
+ case MAC, LINUX -> installLinux();
default -> throw new SetupException("Unsupported OS: " + configuration.os());
}
}
@@ -106,9 +106,9 @@ public class CondaSetupManager extends AbstractSetupManager {
private void downloadConda() throws SetupException {
switch (configuration.os()) {
- case OS.WINDOWS -> downloadCondaWindows();
- case OS.MAC -> downloadCondaMac();
- case OS.LINUX -> downloadCondaLinux();
+ case WINDOWS -> downloadCondaWindows();
+ case MAC -> downloadCondaMac();
+ case LINUX -> downloadCondaLinux();
default -> throw new SetupException("Unsupported OS: " + configuration.os());
}
logger.info("Downloaded conda to {}", configuration.condaInstallerPath());
diff --git a/conda/src/test/java/com/github/gtache/autosubtitle/setup/conda/TestCondaSetupManager.java b/conda/src/test/java/com/github/gtache/autosubtitle/setup/conda/TestCondaSetupManager.java
index 2854df6..1cfbe97 100644
--- a/conda/src/test/java/com/github/gtache/autosubtitle/setup/conda/TestCondaSetupManager.java
+++ b/conda/src/test/java/com/github/gtache/autosubtitle/setup/conda/TestCondaSetupManager.java
@@ -43,7 +43,7 @@ class TestCondaSetupManager {
private final Path systemPath;
TestCondaSetupManager(@Mock final CondaSetupConfiguration configuration, @Mock final ProcessRunner processRunner,
- @Mock final HttpClient httpClient, @Mock final ProcessResult systemProcessResult, @Mock final HttpResponse response) throws IOException, InterruptedException {
+ @Mock final HttpClient httpClient, @Mock final ProcessResult systemProcessResult, @Mock final HttpResponse response) {
this.configuration = requireNonNull(configuration);
this.processRunner = requireNonNull(processRunner);
this.httpClient = requireNonNull(httpClient);
@@ -167,7 +167,7 @@ class TestCondaSetupManager {
}
@Test
- void testInstallDownloadLinuxUnsupported(@TempDir final Path tempDir) throws IOException {
+ void testInstallDownloadLinuxUnsupported(@TempDir final Path tempDir) {
final var installerPath = tempDir.resolve("conda");
when(configuration.condaInstallerPath()).thenReturn(installerPath);
when(configuration.condaBundledPath()).thenReturn(tempDir);
@@ -221,7 +221,7 @@ class TestCondaSetupManager {
}
@Test
- void testInstallDownloadMacUnsupported(@TempDir final Path tempDir) throws IOException {
+ void testInstallDownloadMacUnsupported(@TempDir final Path tempDir) {
final var installerPath = tempDir.resolve("conda");
when(configuration.condaInstallerPath()).thenReturn(installerPath);
when(configuration.condaBundledPath()).thenReturn(tempDir);
@@ -235,7 +235,7 @@ class TestCondaSetupManager {
}
@Test
- void testInstallDownloadUnsupported(@TempDir final Path tempDir) throws IOException {
+ void testInstallDownloadUnsupported(@TempDir final Path tempDir) {
final var installerPath = tempDir.resolve("conda");
when(configuration.condaInstallerPath()).thenReturn(installerPath);
when(configuration.condaBundledPath()).thenReturn(tempDir);
@@ -258,7 +258,7 @@ class TestCondaSetupManager {
when(systemProcessResult.exitCode()).thenReturn(1);
when(configuration.condaRootPath()).thenReturn(tempDir);
- final var args = List.of(installerPath.toString(), "/InstallationType=JustMe", "/RegisterPython=0", "/S", "/D=" + tempDir.toString());
+ final var args = List.of(installerPath.toString(), "/InstallationType=JustMe", "/RegisterPython=0", "/S", "/D=" + tempDir);
final var result = mock(ProcessResult.class);
when(result.exitCode()).thenReturn(0);
when(processRunner.run(args, Duration.ofMinutes(15))).thenReturn(result);
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/archive/impl/ZipDecompresser.java b/core/src/main/java/com/github/gtache/autosubtitle/archive/impl/ZipArchiver.java
similarity index 95%
rename from core/src/main/java/com/github/gtache/autosubtitle/archive/impl/ZipDecompresser.java
rename to core/src/main/java/com/github/gtache/autosubtitle/archive/impl/ZipArchiver.java
index 4c0625d..af6d04c 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/archive/impl/ZipDecompresser.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/archive/impl/ZipArchiver.java
@@ -14,15 +14,15 @@ import java.util.zip.ZipInputStream;
/**
* Zip implementation of {@link Archiver}
*/
-public class ZipDecompresser implements Archiver {
+public class ZipArchiver implements Archiver {
@Inject
- ZipDecompresser() {
+ ZipArchiver() {
}
@Override
- public void compress(final List files, final Path destination) throws IOException {
+ public void compress(final List files, final Path destination) {
throw new UnsupportedOperationException("Not supported");
}
@@ -64,7 +64,7 @@ public class ZipDecompresser implements Archiver {
}
return destPath;
}
-
+
@Override
public String archiveExtension() {
return "zip";
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/modules/archive/impl/ArchiveModule.java b/core/src/main/java/com/github/gtache/autosubtitle/modules/archive/impl/ArchiveModule.java
index 1832d88..aea1cb8 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/modules/archive/impl/ArchiveModule.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/modules/archive/impl/ArchiveModule.java
@@ -3,7 +3,7 @@ package com.github.gtache.autosubtitle.modules.archive.impl;
import com.github.gtache.autosubtitle.archive.Archiver;
import com.github.gtache.autosubtitle.archive.ArchiverProvider;
import com.github.gtache.autosubtitle.archive.impl.ArchiverProviderImpl;
-import com.github.gtache.autosubtitle.archive.impl.ZipDecompresser;
+import com.github.gtache.autosubtitle.archive.impl.ZipArchiver;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@@ -25,5 +25,5 @@ public abstract class ArchiveModule {
@Binds
@StringKey("zip")
@IntoMap
- abstract Archiver bindsZipDecompresser(final ZipDecompresser decompresser);
+ abstract Archiver bindsZipDecompresser(final ZipArchiver decompresser);
}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/impl/SubtitleModule.java b/core/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/impl/SubtitleModule.java
index acef780..8591585 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/impl/SubtitleModule.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/impl/SubtitleModule.java
@@ -9,7 +9,7 @@ import dagger.Module;
/**
* Dagger module for subtitles
*/
-@Module(includes = {SubtitleConverterModule.class})
+@Module(includes = SubtitleConverterModule.class)
public abstract class SubtitleModule {
private SubtitleModule() {
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/ASSSubtitleConverter.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/ASSSubtitleConverter.java
index d1894ee..9088045 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/ASSSubtitleConverter.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/ASSSubtitleConverter.java
@@ -1,12 +1,12 @@
package com.github.gtache.autosubtitle.subtitle.converter.impl;
import com.github.gtache.autosubtitle.VideoInfo;
-import com.github.gtache.autosubtitle.modules.impl.FontName;
-import com.github.gtache.autosubtitle.modules.impl.FontSize;
import com.github.gtache.autosubtitle.subtitle.Font;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.impl.FontImpl;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleCollectionImpl;
@@ -20,7 +20,7 @@ import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
-import java.util.prefs.Preferences;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static java.util.Objects.requireNonNull;
@@ -35,47 +35,38 @@ public class ASSSubtitleConverter implements SubtitleConverter {
private static final String DIALOGUE = "Dialogue:";
private static final String EVENTS_SECTION = "[Events]";
private static final String STYLES_SECTION = "[V4+ Styles]";
+ private static final Pattern NEWLINE_PATTERN = Pattern.compile("\\n");
private final Translator> translator;
- private final Preferences preferences;
- private final String defaultFontName;
- private final int defaultFontSize;
@Inject
- ASSSubtitleConverter(final Translator translator, final Preferences preferences,
- @FontName final String defaultFontName, @FontSize final int defaultFontSize) {
+ ASSSubtitleConverter(final Translator translator) {
this.translator = requireNonNull(translator);
- this.preferences = requireNonNull(preferences);
- this.defaultFontName = Objects.requireNonNull(defaultFontName);
- if (defaultFontSize <= 0) {
- throw new IllegalArgumentException("Font size must be positive : " + defaultFontSize);
- }
- this.defaultFontSize = defaultFontSize;
}
@Override
- public String format(final SubtitleCollection> collection, final VideoInfo videoInfo) {
+ public String format(final SubtitleCollection> collection, final FormatOptions options) {
final var subtitles = collection.subtitles().stream().sorted(Comparator.comparing(Subtitle::start).thenComparing(Subtitle::end)).toList();
- final var scriptInfo = getScriptInfo(videoInfo);
- final var styles = getStyles(subtitles);
- final var events = getEvents(subtitles);
+ final var scriptInfo = getScriptInfo(options.videoInfo());
+ final var styles = getStyles(subtitles, options.defaultFont());
+ final var events = getEvents(subtitles, options.defaultFont());
return scriptInfo + "\n\n" + styles + "\n\n" + events + "\n";
}
- private String getEvents(final Collection extends Subtitle> subtitles) {
+ private static String getEvents(final Collection extends Subtitle> subtitles, final Font defaultFont) {
return EVENTS_SECTION + "\n" + "Format: Start, End, Style, Text\n" +
- subtitles.stream().map(this::getEvent).collect(Collectors.joining("\n"));
+ subtitles.stream().map(s -> getEvent(s, defaultFont)).collect(Collectors.joining("\n"));
}
- private String getEvent(final Subtitle subtitle) {
- return DIALOGUE + " " + formatTime(subtitle.start()) + "," + formatTime(subtitle.end()) + "," + getName(subtitle.font()) + "," + subtitle.content();
+ private static String getEvent(final Subtitle subtitle, final Font defaultFont) {
+ return DIALOGUE + " " + formatTime(subtitle.start()) + "," + formatTime(subtitle.end()) + "," + getName(subtitle.font(), defaultFont) + "," + subtitle.content();
}
- private String getName(final Font font) {
+ private static String getName(final Font font, final Font defaultFont) {
final String fontName;
final int fontSize;
if (font == null) {
- fontName = preferences.get("fontName", defaultFontName);
- fontSize = preferences.getInt("fontSize", defaultFontSize);
+ fontName = defaultFont.name();
+ fontSize = defaultFont.size();
} else {
fontName = font.name();
fontSize = font.size();
@@ -83,16 +74,16 @@ public class ASSSubtitleConverter implements SubtitleConverter {
return fontName + fontSize;
}
- private String getStyles(final Collection extends Subtitle> subtitles) {
- return STYLES_SECTION + "\n" + "Format: Name, Fontname, Fontsize\n" + listStyles(subtitles);
+ private static String getStyles(final Collection extends Subtitle> subtitles, final Font defaultFont) {
+ return STYLES_SECTION + "\n" + "Format: Name, Fontname, Fontsize\n" + listStyles(subtitles, defaultFont);
}
- private String listStyles(final Collection extends Subtitle> subtitles) {
+ private static String listStyles(final Collection extends Subtitle> subtitles, final Font defaultFont) {
final var uniqueStyles = subtitles.stream().map(Subtitle::font).filter(Objects::nonNull).collect(Collectors.toSet());
if (subtitles.stream().anyMatch(s -> s.font() == null)) {
- uniqueStyles.add(new FontImpl(preferences.get("fontName", defaultFontName), preferences.getInt("fontSize", defaultFontSize)));
+ uniqueStyles.add(defaultFont);
}
- return uniqueStyles.stream().map(f -> STYLE + " " + getName(f) + ", " + f.name() + ", " + f.size()).collect(Collectors.joining("\n"));
+ return uniqueStyles.stream().map(f -> STYLE + " " + getName(f, defaultFont) + ", " + f.name() + ", " + f.size()).collect(Collectors.joining("\n"));
}
private static String getScriptInfo(final VideoInfo videoInfo) {
@@ -103,32 +94,21 @@ public class ASSSubtitleConverter implements SubtitleConverter {
WrapStyle: 1""".formatted(videoInfo.width(), videoInfo.height());
}
- private static String formatTime(final long time) {
- final var millisPerHour = 3600000;
- final var millisPerMinute = 60000;
- final var hours = time / millisPerHour;
- final var minutes = (time - hours * millisPerHour) / millisPerMinute;
- final var seconds = (time - hours * millisPerHour - minutes * millisPerMinute) / 1000;
- final var millis = time - hours * millisPerHour - minutes * millisPerMinute - seconds * 1000;
- final var hundredths = millis / 10;
- return String.format("%d:%02d:%02d.%02d", hours, minutes, seconds, hundredths);
- }
-
@Override
- public SubtitleCollectionImpl parse(final String content) throws ParseException {
- final var fonts = parseFonts(content);
+ public SubtitleCollectionImpl parse(final String content, final ParseOptions options) throws ParseException {
+ final var fonts = parseFonts(content, options.defaultFont());
final var subtitles = parseSubtitles(content, fonts);
final var text = subtitles.stream().map(Subtitle::content).collect(Collectors.joining());
final var language = translator.getLanguage(text);
return new SubtitleCollectionImpl<>(text, subtitles, language);
}
- private static List parseSubtitles(final String content, final Map fonts) throws ParseException {
+ private static List parseSubtitles(final String content, final Map fonts) throws ParseException {
final var fontIndex = content.indexOf(EVENTS_SECTION);
if (fontIndex == -1) {
throw new ParseException("Events section not found in " + content);
} else {
- final var split = content.substring(fontIndex).split("\\n");
+ final var split = NEWLINE_PATTERN.split(content.substring(fontIndex));
final List fields;
if (split[0].startsWith(EVENTS_SECTION)) {
fields = getFields(split[1]);
@@ -155,12 +135,12 @@ public class ASSSubtitleConverter implements SubtitleConverter {
}
}
- private Map parseFonts(final String content) throws ParseException {
+ private static Map parseFonts(final String content, final Font defaultFont) throws ParseException {
final var fontIndex = content.indexOf(STYLES_SECTION);
if (fontIndex == -1) {
throw new ParseException("Styles section not found in " + content);
} else {
- final var split = content.substring(fontIndex).split("\\n");
+ final var split = NEWLINE_PATTERN.split(content.substring(fontIndex));
final List fields;
if (split[0].startsWith(STYLES_SECTION)) {
fields = getFields(split[1]);
@@ -178,7 +158,7 @@ public class ASSSubtitleConverter implements SubtitleConverter {
final var name = values.get(fontNameIndex);
final var size = Integer.parseInt(values.get(fontSizeIndex));
return new FontImpl(name, size);
- }).collect(Collectors.toMap(this::getName, f -> f));
+ }).collect(Collectors.toMap(f -> getName(f, defaultFont), f -> f));
}
}
@@ -196,6 +176,16 @@ public class ASSSubtitleConverter implements SubtitleConverter {
return (hours * 3600L + minutes * 60L + seconds) * 1000L + hundredths * 10L;
}
+ private static String formatTime(final long time) {
+ final var millisPerHour = 3600000;
+ final var millisPerMinute = 60000;
+ final var hours = time / millisPerHour;
+ final var minutes = (time - hours * millisPerHour) / millisPerMinute;
+ final var seconds = (time - hours * millisPerHour - minutes * millisPerMinute) / 1000;
+ final var hundredths = (time - hours * millisPerHour - minutes * millisPerMinute - seconds * 1000) / 10;
+ return String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, hundredths);
+ }
+
@Override
public String formatName() {
return "ass";
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/FormatOptionsImpl.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/FormatOptionsImpl.java
new file mode 100644
index 0000000..7670852
--- /dev/null
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/FormatOptionsImpl.java
@@ -0,0 +1,17 @@
+package com.github.gtache.autosubtitle.subtitle.converter.impl;
+
+import com.github.gtache.autosubtitle.VideoInfo;
+import com.github.gtache.autosubtitle.subtitle.Font;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
+
+import java.util.Objects;
+
+/**
+ * Implementation of {@link FormatOptions}
+ */
+public record FormatOptionsImpl(VideoInfo videoInfo, Font defaultFont) implements FormatOptions {
+ public FormatOptionsImpl {
+ Objects.requireNonNull(videoInfo);
+ Objects.requireNonNull(defaultFont);
+ }
+}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/ParseOptionsImpl.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/ParseOptionsImpl.java
new file mode 100644
index 0000000..831ada7
--- /dev/null
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/ParseOptionsImpl.java
@@ -0,0 +1,21 @@
+package com.github.gtache.autosubtitle.subtitle.converter.impl;
+
+import com.github.gtache.autosubtitle.subtitle.Font;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
+
+import java.util.Objects;
+
+/**
+ * Implementation of {@link ParseOptions}
+ */
+public record ParseOptionsImpl(int maxLineLength, int maxLines, Font defaultFont) implements ParseOptions {
+ public ParseOptionsImpl {
+ if (maxLineLength <= 0) {
+ throw new IllegalArgumentException("maxLineLength must be > 0");
+ }
+ if (maxLines <= 0) {
+ throw new IllegalArgumentException("maxLines must be > 0");
+ }
+ Objects.requireNonNull(defaultFont);
+ }
+}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/SRTSubtitleConverter.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/SRTSubtitleConverter.java
index 4b394e6..451dc2a 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/SRTSubtitleConverter.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/SRTSubtitleConverter.java
@@ -1,9 +1,10 @@
package com.github.gtache.autosubtitle.subtitle.converter.impl;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleCollectionImpl;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
@@ -12,6 +13,7 @@ import com.github.gtache.autosubtitle.translation.Translator;
import javax.inject.Inject;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -22,6 +24,9 @@ import static java.util.Objects.requireNonNull;
*/
public class SRTSubtitleConverter implements SubtitleConverter {
+ private static final Pattern ARROW_PATTERN = Pattern.compile(" --> ");
+ private static final Pattern DOUBLE_NEWLINE_PATTERN = Pattern.compile("\n\n");
+
private final Translator> translator;
@Inject
@@ -30,7 +35,7 @@ public class SRTSubtitleConverter implements SubtitleConverter {
}
@Override
- public String format(final SubtitleCollection> collection, final VideoInfo videoInfo) {
+ public String format(final SubtitleCollection> collection, final FormatOptions options) {
final var subtitles = collection.subtitles().stream().sorted(Comparator.comparing(Subtitle::start).thenComparing(Subtitle::end)).toList();
return IntStream.range(0, subtitles.size()).mapToObj(i -> {
final var subtitle = subtitles.get(i);
@@ -40,24 +45,14 @@ public class SRTSubtitleConverter implements SubtitleConverter {
}).collect(Collectors.joining("\n\n")) + "\n";
}
- private static String formatTime(final long time) {
- final var millisPerHour = 3600000;
- final var millisPerMinute = 60000;
- final var hours = time / millisPerHour;
- final var minutes = (time - hours * millisPerHour) / millisPerMinute;
- final var seconds = (time - hours * millisPerHour - minutes * millisPerMinute) / 1000;
- final var millis = time - hours * millisPerHour - minutes * millisPerMinute - seconds * 1000;
- return String.format("%02d:%02d:%02d,%03d", hours, minutes, seconds, millis);
- }
-
@Override
- public SubtitleCollectionImpl parse(final String content) throws ParseException {
+ public SubtitleCollectionImpl parse(final String content, final ParseOptions options) throws ParseException {
try {
- final var elements = content.split("\n\n");
+ final var elements = DOUBLE_NEWLINE_PATTERN.split(content);
final var subtitles = Arrays.stream(elements).filter(element -> !element.isBlank()).map(element -> {
final var lines = element.split("\n");
final var time = lines[1];
- final var timeSplit = time.split(" --> ");
+ final var timeSplit = ARROW_PATTERN.split(time);
final var startTimeStr = timeSplit[0];
final var endTimeStr = timeSplit[1];
final var start = parseTime(startTimeStr);
@@ -82,6 +77,16 @@ public class SRTSubtitleConverter implements SubtitleConverter {
return (hours * 3600L + minutes * 60L + seconds) * 1000 + millis;
}
+ private static String formatTime(final long time) {
+ final var millisPerHour = 3600000;
+ final var millisPerMinute = 60000;
+ final var hours = time / millisPerHour;
+ final var minutes = (time - hours * millisPerHour) / millisPerMinute;
+ final var seconds = (time - hours * millisPerHour - minutes * millisPerMinute) / 1000;
+ final var millis = time - hours * millisPerHour - minutes * millisPerMinute - seconds * 1000;
+ return String.format("%02d:%02d:%02d,%03d", hours, minutes, seconds, millis);
+ }
+
@Override
public String formatName() {
return "srt";
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/ExtractOptionsImpl.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/ExtractOptionsImpl.java
new file mode 100644
index 0000000..5f0f2ad
--- /dev/null
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/ExtractOptionsImpl.java
@@ -0,0 +1,21 @@
+package com.github.gtache.autosubtitle.subtitle.extractor.impl;
+
+import com.github.gtache.autosubtitle.Language;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+
+import java.util.Objects;
+
+/**
+ * Implementation of {@link ExtractOptions}
+ */
+public record ExtractOptionsImpl(Language language, ExtractionModel model,
+ ParseOptions parseOptions) implements ExtractOptions {
+
+ public ExtractOptionsImpl {
+ Objects.requireNonNull(language);
+ Objects.requireNonNull(model);
+ Objects.requireNonNull(parseOptions);
+ }
+}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ExportOptionsImpl.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ExportOptionsImpl.java
new file mode 100644
index 0000000..942c332
--- /dev/null
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ExportOptionsImpl.java
@@ -0,0 +1,18 @@
+package com.github.gtache.autosubtitle.subtitle.impl;
+
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
+import com.github.gtache.autosubtitle.subtitle.OutputFormat;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
+
+import java.util.Objects;
+
+/**
+ * Implementation of {@link ExportOptions}
+ */
+public record ExportOptionsImpl(OutputFormat outputFormat, FormatOptions formatOptions) implements ExportOptions {
+
+ public ExportOptionsImpl {
+ Objects.requireNonNull(outputFormat);
+ Objects.requireNonNull(formatOptions);
+ }
+}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ImportOptionsImpl.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ImportOptionsImpl.java
new file mode 100644
index 0000000..a2434d0
--- /dev/null
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ImportOptionsImpl.java
@@ -0,0 +1,15 @@
+package com.github.gtache.autosubtitle.subtitle.impl;
+
+import com.github.gtache.autosubtitle.subtitle.ImportOptions;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Implementation of {@link ImportOptions}
+ */
+public record ImportOptionsImpl(ParseOptions parseOptions) implements ImportOptions {
+ public ImportOptionsImpl {
+ requireNonNull(parseOptions);
+ }
+}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SubtitleCollectionImpl.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SubtitleCollectionImpl.java
index 4b6d538..2399d29 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SubtitleCollectionImpl.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SubtitleCollectionImpl.java
@@ -6,7 +6,6 @@ import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
import java.util.Collection;
import java.util.List;
-import java.util.Objects;
import static java.util.Objects.requireNonNull;
@@ -17,7 +16,7 @@ public record SubtitleCollectionImpl(String text, Collection
Language language) implements SubtitleCollection {
public SubtitleCollectionImpl {
- Objects.requireNonNull(text);
+ requireNonNull(text);
subtitles = List.copyOf(subtitles);
requireNonNull(language);
}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SubtitleImporterExporterImpl.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SubtitleImporterExporterImpl.java
index b79cba1..74a2151 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SubtitleImporterExporterImpl.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SubtitleImporterExporterImpl.java
@@ -1,11 +1,13 @@
package com.github.gtache.autosubtitle.subtitle.impl;
import com.github.gtache.autosubtitle.Language;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.archive.Archiver;
import com.github.gtache.autosubtitle.archive.ArchiverProvider;
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
+import com.github.gtache.autosubtitle.subtitle.ImportOptions;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
import com.github.gtache.autosubtitle.subtitle.SubtitleImporterExporter;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatException;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
@@ -40,19 +42,19 @@ public class SubtitleImporterExporterImpl implements SubtitleImporterExporter> importSubtitles(final Path file) throws IOException, ParseException {
+ public Map> importSubtitles(final Path file, final ImportOptions options) throws IOException, ParseException {
final var fileName = file.getFileName().toString();
final var extension = fileName.substring(fileName.lastIndexOf('.') + 1);
if (archiverProvider.getArchiver(extension) == null) {
- final var loaded = loadSingleFile(file);
+ final var loaded = loadSingleFile(file, options);
logger.info("Loaded {}", file);
return Map.of(loaded.language(), loaded);
} else {
- return loadArchive(file);
+ return loadArchive(file, options);
}
}
- private Map> loadArchive(final Path file) throws IOException, ParseException {
+ private Map> loadArchive(final Path file, final ImportOptions options) throws IOException, ParseException {
final var fileName = file.getFileName().toString();
final var extension = fileName.substring(fileName.lastIndexOf('.') + 1);
final var archiver = archiverProvider.getArchiver(extension);
@@ -64,7 +66,7 @@ public class SubtitleImporterExporterImpl implements SubtitleImporterExporter>(Language.class);
for (final var path : files) {
- final var loaded = loadSingleFile(path);
+ final var loaded = loadSingleFile(path, options);
map.put(loaded.language(), loaded);
Files.deleteIfExists(path);
}
@@ -73,39 +75,39 @@ public class SubtitleImporterExporterImpl implements SubtitleImporterExporter loadSingleFile(final Path file) throws ParseException {
+ private SubtitleCollection loadSingleFile(final Path file, final ImportOptions options) throws ParseException {
final var fileName = file.getFileName().toString();
final var extension = fileName.substring(fileName.lastIndexOf('.') + 1);
final var parser = converterProvider.getConverter(extension);
if (parser == null) {
throw new ParseException("No converter found for " + file);
} else {
- final var parsed = parser.parse(file);
+ final var parsed = parser.parse(file, options.parseOptions());
return new SubtitleCollectionImpl<>(parsed.text(), parsed.subtitles().stream().map(SubtitleImpl::new).toList(), parsed.language());
}
}
@Override
- public void exportSubtitles(final Collection extends SubtitleCollection>> collections, final VideoInfo videoInfo, final Path file) throws IOException {
+ public void exportSubtitles(final Collection extends SubtitleCollection>> collections, final ExportOptions options, final Path file) throws IOException {
final var fileName = file.getFileName().toString();
final var extension = fileName.substring(fileName.lastIndexOf('.') + 1);
if (archiverProvider.getArchiver(extension) != null) {
- saveArchive(file, collections, videoInfo);
+ saveArchive(file, collections, options);
} else if (collections.size() == 1) {
- saveSingleFile(file, collections.iterator().next(), videoInfo);
+ saveSingleFile(file, collections.iterator().next(), options);
} else {
throw new IllegalArgumentException("Cannot export multiple collections to a non-archive file : " + file);
}
}
- private void saveArchive(final Path file, final Iterable extends SubtitleCollection>> collections, final VideoInfo videoInfo) throws IOException {
+ private void saveArchive(final Path file, final Iterable extends SubtitleCollection>> collections, final ExportOptions options) throws IOException {
final var fileName = file.getFileName().toString();
final var extension = fileName.substring(fileName.lastIndexOf('.') + 1);
final var archiver = archiverProvider.getArchiver(extension);
final var tempDir = Files.createTempDirectory("autosubtitle");
for (final var collection : collections) {
final var subtitleFile = tempDir.resolve(collection.language().name().toLowerCase() + ".json");
- saveSingleFile(subtitleFile, collection, videoInfo);
+ saveSingleFile(subtitleFile, collection, options);
}
final var files = new ArrayList();
try (final var stream = Files.list(tempDir)) {
@@ -119,16 +121,20 @@ public class SubtitleImporterExporterImpl implements SubtitleImporterExporter collection, final VideoInfo videoInfo) throws IOException {
+ private void saveSingleFile(final Path file, final SubtitleCollection> collection, final ExportOptions options) throws IOException {
final var fileName = file.getFileName().toString();
final var extension = fileName.substring(fileName.lastIndexOf('.') + 1);
final var converter = converterProvider.getConverter(extension);
if (converter == null) {
throw new IOException("No converter found for " + file);
} else {
- final var string = converter.format(collection, videoInfo);
- Files.writeString(file, string);
- logger.info("Saved {}", file);
+ try {
+ final var string = converter.format(collection, options.formatOptions());
+ Files.writeString(file, string);
+ logger.info("Saved {}", file);
+ } catch (final FormatException e) {
+ throw new IOException(e);
+ }
}
}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/archive/impl/TestZipDecompresser.java b/core/src/test/java/com/github/gtache/autosubtitle/archive/impl/TestZipArchiver.java
similarity index 72%
rename from core/src/test/java/com/github/gtache/autosubtitle/archive/impl/TestZipDecompresser.java
rename to core/src/test/java/com/github/gtache/autosubtitle/archive/impl/TestZipArchiver.java
index 5503d33..155f1b0 100644
--- a/core/src/test/java/com/github/gtache/autosubtitle/archive/impl/TestZipDecompresser.java
+++ b/core/src/test/java/com/github/gtache/autosubtitle/archive/impl/TestZipArchiver.java
@@ -11,27 +11,27 @@ import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
-class TestZipDecompresser {
+class TestZipArchiver {
- private final ZipDecompresser zipDecompresser;
+ private final ZipArchiver zipArchiver;
- TestZipDecompresser() {
- this.zipDecompresser = new ZipDecompresser();
+ TestZipArchiver() {
+ this.zipArchiver = new ZipArchiver();
}
@Test
void testIsPathSupported() {
- assertTrue(zipDecompresser.isPathSupported(Path.of("test.zip")));
- assertFalse(zipDecompresser.isPathSupported(Path.of("test")));
- assertFalse(zipDecompresser.isPathSupported(Path.of("test.txt")));
- assertFalse(zipDecompresser.isPathSupported(Path.of("test.zip2")));
+ assertTrue(zipArchiver.isPathSupported(Path.of("test.zip")));
+ assertFalse(zipArchiver.isPathSupported(Path.of("test")));
+ assertFalse(zipArchiver.isPathSupported(Path.of("test.txt")));
+ assertFalse(zipArchiver.isPathSupported(Path.of("test.zip2")));
}
@Test
void testCompress() {
final var paths = List.of(Paths.get("file.txt"));
final var target = Paths.get("target");
- assertThrows(UnsupportedOperationException.class, () -> zipDecompresser.compress(paths, target));
+ assertThrows(UnsupportedOperationException.class, () -> zipArchiver.compress(paths, target));
}
@Test
@@ -43,7 +43,7 @@ class TestZipDecompresser {
}
Files.copy(in, file);
}
- zipDecompresser.decompress(file, tempDir);
+ zipArchiver.decompress(file, tempDir);
final var inTxt = tempDir.resolve("in.txt");
final var bin = tempDir.resolve("bin");
final var binTxt = bin.resolve("bin.txt");
@@ -64,6 +64,6 @@ class TestZipDecompresser {
void testIllegal() {
final var source = Paths.get("source");
final var target = Paths.get("target");
- assertThrows(IllegalArgumentException.class, () -> zipDecompresser.decompress(source, target));
+ assertThrows(IllegalArgumentException.class, () -> zipArchiver.decompress(source, target));
}
}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/impl/TestArchitecture.java b/core/src/test/java/com/github/gtache/autosubtitle/impl/TestArchitecture.java
index f48d537..0d972d6 100644
--- a/core/src/test/java/com/github/gtache/autosubtitle/impl/TestArchitecture.java
+++ b/core/src/test/java/com/github/gtache/autosubtitle/impl/TestArchitecture.java
@@ -26,25 +26,25 @@ class TestArchitecture {
@Test
void testGetArchitecture() {
- for (final var value : Architecture.values()) {
+ for (final var value : values()) {
System.setProperty("os.arch", value.name());
- assertEquals(value, Architecture.getArchitecture());
+ assertEquals(value, getArchitecture());
}
System.setProperty("os.arch", "any");
- assertEquals(UNKNOWN, Architecture.getArchitecture());
+ assertEquals(UNKNOWN, getArchitecture());
}
@Test
void testGetArchitectureName() {
- assertEquals(I386, Architecture.getArchitecture("i386"));
- assertEquals(I386, Architecture.getArchitecture("I386"));
+ assertEquals(I386, getArchitecture("i386"));
+ assertEquals(I386, getArchitecture("I386"));
}
@Test
void testIsAMD64() {
final var expectedAMD64 = Set.of(X86, X86_64, AMD64);
expectedAMD64.forEach(a -> assertTrue(a.isAMD64()));
- Arrays.stream(Architecture.values()).filter(a -> !expectedAMD64.contains(a))
+ Arrays.stream(values()).filter(a -> !expectedAMD64.contains(a))
.forEach(a -> assertFalse(a.isAMD64()));
}
@@ -52,7 +52,7 @@ class TestArchitecture {
void testIsARM64() {
final var expectedARM64 = Set.of(ARM64, ARMV8, ARMV9, AARCH64);
expectedARM64.forEach(a -> assertTrue(a.isARM64()));
- Arrays.stream(Architecture.values()).filter(a -> !expectedARM64.contains(a))
+ Arrays.stream(values()).filter(a -> !expectedARM64.contains(a))
.forEach(a -> assertFalse(a.isARM64()));
}
}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestASSSubtitleConverter.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestASSSubtitleConverter.java
index e11c49c..edda285 100644
--- a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestASSSubtitleConverter.java
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestASSSubtitleConverter.java
@@ -3,7 +3,9 @@ package com.github.gtache.autosubtitle.subtitle.converter.impl;
import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
import com.github.gtache.autosubtitle.subtitle.impl.FontImpl;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleCollectionImpl;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
@@ -15,9 +17,8 @@ import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Arrays;
-import java.util.Objects;
-import java.util.prefs.Preferences;
+import static java.util.Objects.requireNonNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyString;
@@ -27,28 +28,28 @@ import static org.mockito.Mockito.when;
class TestASSSubtitleConverter {
private final Translator translator;
- private final Preferences preferences;
+ private final FormatOptions formatOptions;
+ private final ParseOptions parseOptions;
private final Language language;
private final VideoInfo videoInfo;
- private final String defaultFontName;
- private final int defaultFontSize;
private final ASSSubtitleConverter converter;
TestASSSubtitleConverter(@Mock final Translator translator,
- @Mock final Preferences preferences,
@Mock final Language language,
+ @Mock final FormatOptions formatOptions,
+ @Mock final ParseOptions parseOptions,
@Mock final VideoInfo videoInfo) {
- this.translator = Objects.requireNonNull(translator);
- this.preferences = Objects.requireNonNull(preferences);
- this.language = Objects.requireNonNull(language);
- this.videoInfo = Objects.requireNonNull(videoInfo);
- this.defaultFontName = "Arial";
- this.defaultFontSize = 12;
- this.converter = new ASSSubtitleConverter(translator, preferences, defaultFontName, defaultFontSize);
+ this.translator = requireNonNull(translator);
+ this.language = requireNonNull(language);
+ this.formatOptions = requireNonNull(formatOptions);
+ this.parseOptions = requireNonNull(parseOptions);
+ this.videoInfo = requireNonNull(videoInfo);
+ this.converter = new ASSSubtitleConverter(translator);
}
@BeforeEach
void beforeEach() {
+ when(formatOptions.videoInfo()).thenReturn(videoInfo);
when(videoInfo.width()).thenReturn(1920);
when(videoInfo.height()).thenReturn(1080);
when(translator.getLanguage(anyString())).thenReturn(language);
@@ -69,7 +70,7 @@ class TestASSSubtitleConverter {
[Events]
Format: Start, End, Style, Text
- Dialogue: 0:00:00.00,0:00:00.41,Arial12,Test ?
+ Dialogue: 00:00:00.00,00:00:00.41,Arial12,Test ?
Dialogue: 123:45:54.32,124:00:00.00,Times New Roman13,Test2.
""";
@@ -82,8 +83,8 @@ class TestASSSubtitleConverter {
final var subtitle1 = new SubtitleImpl("Test ?", start1, end1, arial, null);
final var subtitle2 = new SubtitleImpl("Test2.", start2, end2, times, null);
final var subtitles = new SubtitleCollectionImpl<>(subtitle1.content() + subtitle2.content(), Arrays.asList(subtitle1, subtitle2), language);
- assertEquals(subtitles, converter.parse(in));
- assertEquals(in, converter.format(subtitles, videoInfo));
+ assertEquals(subtitles, converter.parse(in, parseOptions));
+ assertEquals(in, converter.format(subtitles, formatOptions));
}
@Test
@@ -114,7 +115,7 @@ class TestASSSubtitleConverter {
final var subtitle1 = new SubtitleImpl("Test ?", start1, end1, arial, null);
final var subtitle2 = new SubtitleImpl("Test2.", start2, end2, times, null);
final var subtitles = new SubtitleCollectionImpl<>(subtitle1.content() + subtitle2.content(), Arrays.asList(subtitle1, subtitle2), language);
- assertEquals(subtitles, converter.parse(in));
+ assertEquals(subtitles, converter.parse(in, parseOptions));
}
@Test
@@ -125,7 +126,7 @@ class TestASSSubtitleConverter {
test1 test2
test3 test4
""";
- assertThrows(ParseException.class, () -> converter.parse(in));
+ assertThrows(ParseException.class, () -> converter.parse(in, parseOptions));
}
@Test
@@ -135,9 +136,6 @@ class TestASSSubtitleConverter {
@Test
void testIllegal() {
- assertThrows(NullPointerException.class, () -> new ASSSubtitleConverter(null, preferences, defaultFontName, defaultFontSize));
- assertThrows(NullPointerException.class, () -> new ASSSubtitleConverter(translator, null, defaultFontName, defaultFontSize));
- assertThrows(NullPointerException.class, () -> new ASSSubtitleConverter(translator, preferences, null, defaultFontSize));
- assertThrows(IllegalArgumentException.class, () -> new ASSSubtitleConverter(translator, preferences, defaultFontName, 0));
+ assertThrows(NullPointerException.class, () -> new ASSSubtitleConverter(null));
}
}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestFormatOptionsImpl.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestFormatOptionsImpl.java
new file mode 100644
index 0000000..4a05f32
--- /dev/null
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestFormatOptionsImpl.java
@@ -0,0 +1,40 @@
+package com.github.gtache.autosubtitle.subtitle.converter.impl;
+
+import com.github.gtache.autosubtitle.VideoInfo;
+import com.github.gtache.autosubtitle.subtitle.Font;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Objects;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@ExtendWith(MockitoExtension.class)
+class TestFormatOptionsImpl {
+
+ private final VideoInfo videoInfo;
+ private final Font defaultFont;
+ private final FormatOptions formatOptions;
+
+ TestFormatOptionsImpl(@Mock final VideoInfo videoInfo, @Mock final Font defaultFont) {
+ this.videoInfo = Objects.requireNonNull(videoInfo);
+ this.defaultFont = Objects.requireNonNull(defaultFont);
+ this.formatOptions = new FormatOptionsImpl(videoInfo, defaultFont);
+ }
+
+ @Test
+ void testGetters() {
+ assertEquals(videoInfo, formatOptions.videoInfo());
+ assertEquals(defaultFont, formatOptions.defaultFont());
+ }
+
+ @Test
+ void testIllegal() {
+ assertThrows(NullPointerException.class, () -> new FormatOptionsImpl(null, defaultFont));
+ assertThrows(NullPointerException.class, () -> new FormatOptionsImpl(videoInfo, null));
+ }
+}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestParseOptionsImpl.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestParseOptionsImpl.java
new file mode 100644
index 0000000..3c46504
--- /dev/null
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestParseOptionsImpl.java
@@ -0,0 +1,43 @@
+package com.github.gtache.autosubtitle.subtitle.converter.impl;
+
+import com.github.gtache.autosubtitle.subtitle.Font;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Objects;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@ExtendWith(MockitoExtension.class)
+class TestParseOptionsImpl {
+
+ private final int maxLineLength;
+ private final int maxLines;
+ private final Font defaultFont;
+ private final ParseOptions parseOptions;
+
+ TestParseOptionsImpl(@Mock final Font defaultFont) {
+ this.defaultFont = Objects.requireNonNull(defaultFont);
+ this.maxLineLength = 1;
+ this.maxLines = 1;
+ this.parseOptions = new ParseOptionsImpl(maxLineLength, maxLines, defaultFont);
+ }
+
+ @Test
+ void testGetters() {
+ assertEquals(maxLineLength, parseOptions.maxLineLength());
+ assertEquals(maxLines, parseOptions.maxLines());
+ assertEquals(defaultFont, parseOptions.defaultFont());
+ }
+
+ @Test
+ void testIllegal() {
+ assertThrows(IllegalArgumentException.class, () -> new ParseOptionsImpl(0, 1, defaultFont));
+ assertThrows(IllegalArgumentException.class, () -> new ParseOptionsImpl(1, 0, defaultFont));
+ assertThrows(NullPointerException.class, () -> new ParseOptionsImpl(1, 1, null));
+ }
+}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestSRTSubtitleConverter.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestSRTSubtitleConverter.java
index beddaac..d7f040c 100644
--- a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestSRTSubtitleConverter.java
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/converter/impl/TestSRTSubtitleConverter.java
@@ -1,9 +1,10 @@
package com.github.gtache.autosubtitle.subtitle.converter.impl;
import com.github.gtache.autosubtitle.Language;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleCollectionImpl;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
import com.github.gtache.autosubtitle.translation.Translator;
@@ -26,13 +27,16 @@ class TestSRTSubtitleConverter {
private final Translator translator;
private final Language language;
- private final VideoInfo videoInfo;
+ private final FormatOptions formatOptions;
+ private final ParseOptions parseOptions;
private final SRTSubtitleConverter converter;
- TestSRTSubtitleConverter(@Mock final Translator translator, @Mock final Language language, @Mock final VideoInfo videoInfo) {
+ TestSRTSubtitleConverter(@Mock final Translator translator, @Mock final Language language,
+ @Mock final FormatOptions formatOptions, @Mock final ParseOptions parseOptions) {
this.translator = Objects.requireNonNull(translator);
this.language = Objects.requireNonNull(language);
- this.videoInfo = Objects.requireNonNull(videoInfo);
+ this.formatOptions = Objects.requireNonNull(formatOptions);
+ this.parseOptions = Objects.requireNonNull(parseOptions);
this.converter = new SRTSubtitleConverter(translator);
}
@@ -62,8 +66,8 @@ class TestSRTSubtitleConverter {
final var subtitle1 = new SubtitleImpl("test5 test6\ntest7 test8", start1, end1, null, null);
final var subtitle2 = new SubtitleImpl("test1 test2\ntest3 test4", start2, end2, null, null);
final var subtitles = new SubtitleCollectionImpl<>(subtitle1.content() + " " + subtitle2.content(), Arrays.asList(subtitle1, subtitle2), language);
- assertEquals(subtitles, converter.parse(in));
- assertEquals(in, converter.format(subtitles, videoInfo));
+ assertEquals(subtitles, converter.parse(in, parseOptions));
+ assertEquals(in, converter.format(subtitles, formatOptions));
}
@Test
@@ -74,7 +78,7 @@ class TestSRTSubtitleConverter {
test1 test2
test3 test4
""";
- assertThrows(ParseException.class, () -> converter.parse(in));
+ assertThrows(ParseException.class, () -> converter.parse(in, parseOptions));
}
@Test
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/TestAbstractSubtitleExtractor.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/TestAbstractSubtitleExtractor.java
index 37d9da4..71d7dac 100644
--- a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/TestAbstractSubtitleExtractor.java
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/TestAbstractSubtitleExtractor.java
@@ -1,12 +1,11 @@
package com.github.gtache.autosubtitle.subtitle.extractor.impl;
import com.github.gtache.autosubtitle.Audio;
-import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
-import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractorListener;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -56,12 +55,12 @@ class TestAbstractSubtitleExtractor {
private static final class DummySubtitleExtractor extends AbstractSubtitleExtractor {
@Override
- public SubtitleCollection extract(final Video video, final Language language, final ExtractionModel model) {
+ public SubtitleCollection extract(final Video video, final ExtractOptions options) {
throw new UnsupportedOperationException();
}
@Override
- public SubtitleCollection extract(final Audio audio, final Language language, final ExtractionModel model) {
+ public SubtitleCollection extract(final Audio audio, final ExtractOptions options) {
throw new UnsupportedOperationException();
}
}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/TestExtractOptionsImpl.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/TestExtractOptionsImpl.java
new file mode 100644
index 0000000..6adda06
--- /dev/null
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/TestExtractOptionsImpl.java
@@ -0,0 +1,44 @@
+package com.github.gtache.autosubtitle.subtitle.extractor.impl;
+
+import com.github.gtache.autosubtitle.Language;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static java.util.Objects.requireNonNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@ExtendWith(MockitoExtension.class)
+class TestExtractOptionsImpl {
+
+ private final Language language;
+ private final ExtractionModel model;
+ private final ParseOptions parseOptions;
+ private final ExtractOptions extractOptions;
+
+ TestExtractOptionsImpl(@Mock final Language language, @Mock final ExtractionModel model, @Mock final ParseOptions parseOptions) {
+ this.language = requireNonNull(language);
+ this.model = requireNonNull(model);
+ this.parseOptions = requireNonNull(parseOptions);
+ this.extractOptions = new ExtractOptionsImpl(language, model, parseOptions);
+ }
+
+ @Test
+ void testGetters() {
+ assertEquals(language, extractOptions.language());
+ assertEquals(model, extractOptions.model());
+ assertEquals(parseOptions, extractOptions.parseOptions());
+ }
+
+ @Test
+ void testIllegal() {
+ assertThrows(NullPointerException.class, () -> new ExtractOptionsImpl(null, model, parseOptions));
+ assertThrows(NullPointerException.class, () -> new ExtractOptionsImpl(language, null, parseOptions));
+ assertThrows(NullPointerException.class, () -> new ExtractOptionsImpl(language, model, null));
+ }
+}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestExportOptionsImpl.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestExportOptionsImpl.java
new file mode 100644
index 0000000..bc516bc
--- /dev/null
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestExportOptionsImpl.java
@@ -0,0 +1,39 @@
+package com.github.gtache.autosubtitle.subtitle.impl;
+
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
+import com.github.gtache.autosubtitle.subtitle.OutputFormat;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static java.util.Objects.requireNonNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@ExtendWith(MockitoExtension.class)
+class TestExportOptionsImpl {
+
+ private final OutputFormat outputFormat;
+ private final FormatOptions formatOptions;
+ private final ExportOptions exportOptions;
+
+ TestExportOptionsImpl(@Mock final OutputFormat outputFormat, @Mock final FormatOptions formatOptions) {
+ this.outputFormat = requireNonNull(outputFormat);
+ this.formatOptions = requireNonNull(formatOptions);
+ this.exportOptions = new ExportOptionsImpl(outputFormat, formatOptions);
+ }
+
+ @Test
+ void testGetters() {
+ assertEquals(outputFormat, exportOptions.outputFormat());
+ assertEquals(formatOptions, exportOptions.formatOptions());
+ }
+
+ @Test
+ void testIllegal() {
+ assertThrows(NullPointerException.class, () -> new ExportOptionsImpl(null, formatOptions));
+ assertThrows(NullPointerException.class, () -> new ExportOptionsImpl(outputFormat, null));
+ }
+}
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestImportOptionsImpl.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestImportOptionsImpl.java
new file mode 100644
index 0000000..353ea29
--- /dev/null
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestImportOptionsImpl.java
@@ -0,0 +1,36 @@
+package com.github.gtache.autosubtitle.subtitle.impl;
+
+import com.github.gtache.autosubtitle.subtitle.ImportOptions;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static java.util.Objects.requireNonNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@ExtendWith(MockitoExtension.class)
+class TestImportOptionsImpl {
+
+ private final ParseOptions parseOptions;
+ private final ImportOptions importOptions;
+
+ TestImportOptionsImpl(@Mock final ParseOptions parseOptions) {
+ this.parseOptions = requireNonNull(parseOptions);
+ this.importOptions = new ImportOptionsImpl(parseOptions);
+ }
+
+ @Test
+ void testGetters() {
+ assertEquals(parseOptions, importOptions.parseOptions());
+ }
+
+ @Test
+ void testIllegal() {
+ assertThrows(NullPointerException.class, () -> new ImportOptionsImpl(null));
+ }
+}
+
+
diff --git a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestSubtitleImporterExporterImpl.java b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestSubtitleImporterExporterImpl.java
index 0741cbd..dbfa2a6 100644
--- a/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestSubtitleImporterExporterImpl.java
+++ b/core/src/test/java/com/github/gtache/autosubtitle/subtitle/impl/TestSubtitleImporterExporterImpl.java
@@ -1,14 +1,19 @@
package com.github.gtache.autosubtitle.subtitle.impl;
import com.github.gtache.autosubtitle.Language;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.archive.Archiver;
import com.github.gtache.autosubtitle.archive.ArchiverProvider;
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
+import com.github.gtache.autosubtitle.subtitle.ImportOptions;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
import com.github.gtache.autosubtitle.subtitle.SubtitleImporterExporter;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatException;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
@@ -33,25 +38,38 @@ class TestSubtitleImporterExporterImpl {
private final ArchiverProvider archiverProvider;
private final SubtitleConverterProvider converterProvider;
private final SubtitleImporterExporter subtitleImporterExporter;
- private final VideoInfo videoInfo;
+ private final ExportOptions exportOptions;
+ private final FormatOptions formatOptions;
+ private final ImportOptions importOptions;
+ private final ParseOptions parseOptions;
private final Path path;
private final SubtitleCollection firstCollection;
private final SubtitleCollection secondCollection;
TestSubtitleImporterExporterImpl(@Mock final ArchiverProvider archiverProvider,
@Mock final SubtitleConverterProvider converterProvider,
- @Mock final VideoInfo videoInfo,
+ @Mock final ExportOptions exportOptions, @Mock final FormatOptions formatOptions,
+ @Mock final ImportOptions importOptions, @Mock final ParseOptions parseOptions,
@Mock final SubtitleCollection firstCollection,
@Mock final SubtitleCollection secondCollection) {
this.archiverProvider = requireNonNull(archiverProvider);
this.converterProvider = requireNonNull(converterProvider);
- this.videoInfo = requireNonNull(videoInfo);
+ this.exportOptions = requireNonNull(exportOptions);
+ this.formatOptions = requireNonNull(formatOptions);
+ this.importOptions = requireNonNull(importOptions);
+ this.parseOptions = requireNonNull(parseOptions);
this.subtitleImporterExporter = new SubtitleImporterExporterImpl(archiverProvider, converterProvider);
this.path = Paths.get("out.out");
this.firstCollection = requireNonNull(firstCollection);
this.secondCollection = requireNonNull(secondCollection);
}
+ @BeforeEach
+ void beforeEach() {
+ when(exportOptions.formatOptions()).thenReturn(formatOptions);
+ when(importOptions.parseOptions()).thenReturn(parseOptions);
+ }
+
@Test
void testImportSubtitlesArchive() throws IOException, ParseException {
final var archiver = mock(Archiver.class);
@@ -76,7 +94,7 @@ class TestSubtitleImporterExporterImpl {
when(firstCollection.subtitles()).thenReturn(subtitles);
when(firstCollection.text()).thenReturn("text");
when(firstCollection.language()).thenReturn(Language.EN);
- when(converter1.parse(any(Path.class))).thenReturn(firstCollection);
+ when(converter1.parse(any(Path.class), eq(parseOptions))).thenReturn(firstCollection);
final var s3 = new SubtitleImpl("test3", 0, 100, null, null);
final var s4 = new SubtitleImpl("test4", 100, 200, null, null);
@@ -84,9 +102,9 @@ class TestSubtitleImporterExporterImpl {
when(secondCollection.subtitles()).thenReturn(subtitles2);
when(secondCollection.text()).thenReturn("text2");
when(secondCollection.language()).thenReturn(Language.FR);
- when(converter2.parse(any(Path.class))).thenReturn(secondCollection);
+ when(converter2.parse(any(Path.class), eq(parseOptions))).thenReturn(secondCollection);
- final var result = subtitleImporterExporter.importSubtitles(path);
+ final var result = subtitleImporterExporter.importSubtitles(path, importOptions);
assertEquals(2, result.size());
final var collection1 = result.get(Language.EN);
@@ -103,7 +121,7 @@ class TestSubtitleImporterExporterImpl {
void testImportSubtitlesSingle() throws IOException, ParseException {
final var converter = mock(SubtitleConverter.class);
when(converterProvider.getConverter("out")).thenReturn(converter);
- when(converter.parse(path)).thenReturn(firstCollection);
+ when(converter.parse(path, parseOptions)).thenReturn(firstCollection);
final var s1 = new SubtitleImpl("test", 0, 100, null, null);
final var s2 = new SubtitleImpl("test2", 100, 200, null, null);
final var subtitles = List.of(s1, s2);
@@ -111,7 +129,7 @@ class TestSubtitleImporterExporterImpl {
when(firstCollection.text()).thenReturn("text");
when(firstCollection.language()).thenReturn(Language.EN);
- final var result = subtitleImporterExporter.importSubtitles(path);
+ final var result = subtitleImporterExporter.importSubtitles(path, importOptions);
assertEquals(1, result.size());
final var collection = result.get(Language.EN);
@@ -121,12 +139,12 @@ class TestSubtitleImporterExporterImpl {
}
@Test
- void testImportSubtitlesSingleParseException() throws IOException, ParseException {
- assertThrows(ParseException.class, () -> subtitleImporterExporter.importSubtitles(path));
+ void testImportSubtitlesSingleParseException() {
+ assertThrows(ParseException.class, () -> subtitleImporterExporter.importSubtitles(path, importOptions));
}
@Test
- void testExportSubtitlesArchive(@TempDir final Path outputDir) throws IOException, ParseException {
+ void testExportSubtitlesArchive(@TempDir final Path outputDir) throws IOException, FormatException {
final var outputPath = outputDir.resolve("out.out");
final var collection = List.of(firstCollection, secondCollection);
final var archiver = mock(Archiver.class);
@@ -135,13 +153,13 @@ class TestSubtitleImporterExporterImpl {
when(converterProvider.getConverter("json")).thenReturn(converter);
when(firstCollection.language()).thenReturn(Language.EN);
when(secondCollection.language()).thenReturn(Language.FR);
- when(converter.format(firstCollection, videoInfo)).thenReturn("en");
- when(converter.format(secondCollection, videoInfo)).thenReturn("fr");
+ when(converter.format(firstCollection, formatOptions)).thenReturn("en");
+ when(converter.format(secondCollection, formatOptions)).thenReturn("fr");
- subtitleImporterExporter.exportSubtitles(collection, videoInfo, outputPath);
+ subtitleImporterExporter.exportSubtitles(collection, exportOptions, outputPath);
- verify(converter).format(collection.get(0), videoInfo);
- verify(converter).format(collection.get(1), videoInfo);
+ verify(converter).format(collection.get(0), formatOptions);
+ verify(converter).format(collection.get(1), formatOptions);
final var captor = ArgumentCaptor.forClass(List.class);
verify(archiver).compress(captor.capture(), eq(outputPath));
final var files = (List) captor.getValue();
@@ -151,26 +169,26 @@ class TestSubtitleImporterExporterImpl {
}
@Test
- void testExportSubtitlesSingle(@TempDir final Path outputDir) throws IOException {
+ void testExportSubtitlesSingle(@TempDir final Path outputDir) throws IOException, FormatException {
final var outputPath = outputDir.resolve("out.out");
final var collection = List.of(firstCollection);
final var converter = mock(SubtitleConverter.class);
when(converterProvider.getConverter("out")).thenReturn(converter);
final var expected = "expected";
- when(converter.format(collection.getFirst(), videoInfo)).thenReturn(expected);
- subtitleImporterExporter.exportSubtitles(collection, videoInfo, outputPath);
+ when(converter.format(collection.getFirst(), formatOptions)).thenReturn(expected);
+ subtitleImporterExporter.exportSubtitles(collection, exportOptions, outputPath);
assertEquals(expected, Files.readString(outputPath));
}
@Test
void testExportSubtitlesSingleException() {
final var collection = List.of(firstCollection);
- assertThrows(IOException.class, () -> subtitleImporterExporter.exportSubtitles(collection, videoInfo, path));
+ assertThrows(IOException.class, () -> subtitleImporterExporter.exportSubtitles(collection, exportOptions, path));
}
@Test
void testExportSubtitlesMultipleException() {
- assertThrows(IllegalArgumentException.class, () -> subtitleImporterExporter.exportSubtitles(List.of(firstCollection, secondCollection), videoInfo, path));
+ assertThrows(IllegalArgumentException.class, () -> subtitleImporterExporter.exportSubtitles(List.of(firstCollection, secondCollection), exportOptions, path));
}
@Test
diff --git a/ffmpeg/src/main/java/com/github/gtache/autosubtitle/archive/ffmpeg/TarArchiver.java b/ffmpeg/src/main/java/com/github/gtache/autosubtitle/archive/ffmpeg/TarArchiver.java
index 6e9bc37..4bf6261 100644
--- a/ffmpeg/src/main/java/com/github/gtache/autosubtitle/archive/ffmpeg/TarArchiver.java
+++ b/ffmpeg/src/main/java/com/github/gtache/autosubtitle/archive/ffmpeg/TarArchiver.java
@@ -22,7 +22,7 @@ public class TarArchiver implements Archiver {
}
@Override
- public void compress(final List files, final Path destination) throws IOException {
+ public void compress(final List files, final Path destination) {
throw new UnsupportedOperationException("Not implemented yet");
}
diff --git a/ffmpeg/src/main/java/com/github/gtache/autosubtitle/archive/ffmpeg/XZArchiver.java b/ffmpeg/src/main/java/com/github/gtache/autosubtitle/archive/ffmpeg/XZArchiver.java
index 3c13593..eab2017 100644
--- a/ffmpeg/src/main/java/com/github/gtache/autosubtitle/archive/ffmpeg/XZArchiver.java
+++ b/ffmpeg/src/main/java/com/github/gtache/autosubtitle/archive/ffmpeg/XZArchiver.java
@@ -20,7 +20,7 @@ public class XZArchiver implements Archiver {
}
@Override
- public void compress(final List files, final Path destination) throws IOException {
+ public void compress(final List files, final Path destination) {
throw new UnsupportedOperationException("Not implemented");
}
diff --git a/ffmpeg/src/main/java/com/github/gtache/autosubtitle/ffmpeg/FFmpegVideoConverter.java b/ffmpeg/src/main/java/com/github/gtache/autosubtitle/ffmpeg/FFmpegVideoConverter.java
index 3550529..f27db60 100644
--- a/ffmpeg/src/main/java/com/github/gtache/autosubtitle/ffmpeg/FFmpegVideoConverter.java
+++ b/ffmpeg/src/main/java/com/github/gtache/autosubtitle/ffmpeg/FFmpegVideoConverter.java
@@ -4,14 +4,15 @@ import com.github.gtache.autosubtitle.Audio;
import com.github.gtache.autosubtitle.File;
import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.VideoConverter;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.impl.AudioInfoImpl;
import com.github.gtache.autosubtitle.impl.FileAudioImpl;
import com.github.gtache.autosubtitle.impl.FileVideoImpl;
import com.github.gtache.autosubtitle.modules.setup.ffmpeg.FFmpegBundledPath;
import com.github.gtache.autosubtitle.modules.setup.ffmpeg.FFmpegSystemPath;
import com.github.gtache.autosubtitle.process.ProcessRunner;
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatException;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
import org.apache.logging.log4j.LogManager;
@@ -28,7 +29,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.SequencedMap;
import java.util.concurrent.atomic.AtomicInteger;
-import java.util.prefs.Preferences;
import static java.util.Objects.requireNonNull;
@@ -41,31 +41,28 @@ public class FFmpegVideoConverter implements VideoConverter {
private final Path bundledPath;
private final Path systemPath;
private final SubtitleConverterProvider converterProvider;
- private final Preferences preferences;
private final ProcessRunner processRunner;
@Inject
FFmpegVideoConverter(@FFmpegBundledPath final Path bundledPath, @FFmpegSystemPath final Path systemPath,
- final SubtitleConverterProvider converterProvider, final Preferences preferences,
- final ProcessRunner processRunner) {
+ final SubtitleConverterProvider converterProvider, final ProcessRunner processRunner) {
this.bundledPath = requireNonNull(bundledPath);
this.systemPath = requireNonNull(systemPath);
this.converterProvider = requireNonNull(converterProvider);
- this.preferences = requireNonNull(preferences);
this.processRunner = requireNonNull(processRunner);
}
@Override
- public Video addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles) throws IOException {
+ public Video addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final ExportOptions options) throws IOException {
final var out = getTempFile(video.info().format());
- addSoftSubtitles(video, subtitles, out);
+ addSoftSubtitles(video, subtitles, options, out);
return new FileVideoImpl(out, video.info());
}
@Override
- public void addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final Path path) throws IOException {
+ public void addSoftSubtitles(final Video video, final Collection extends SubtitleCollection>> subtitles, final ExportOptions options, final Path path) throws IOException {
final var videoPath = getPath(video);
- final var collectionMap = dumpCollections(subtitles, video.info());
+ final var collectionMap = dumpCollections(subtitles, options);
final var args = new ArrayList();
args.add(getFFmpegPath());
args.add("-y");
@@ -108,18 +105,18 @@ public class FFmpegVideoConverter implements VideoConverter {
}
@Override
- public Video addHardSubtitles(final Video video, final SubtitleCollection> subtitles) throws IOException {
+ public Video addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final ExportOptions options) throws IOException {
final var out = getTempFile(video.info().format());
- addHardSubtitles(video, subtitles, out);
+ addHardSubtitles(video, subtitles, options, out);
return new FileVideoImpl(out, video.info());
}
@Override
- public void addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final Path path) throws IOException {
+ public void addHardSubtitles(final Video video, final SubtitleCollection> subtitles, final ExportOptions options, final Path path) throws IOException {
final var videoPath = getPath(video);
- final var subtitlesPath = dumpSubtitles(subtitles, video.info());
+ final var subtitlesPath = dumpSubtitles(subtitles, options);
final var escapedPath = escapeVF(subtitlesPath.toString());
- final var subtitleArg = getSubtitleConverter().formatName().equalsIgnoreCase("ass") ? "ass='" + escapedPath + "'" : "subtitles='" + escapedPath + "'";
+ final var subtitleArg = getSubtitleConverter(options).formatName().equalsIgnoreCase("ass") ? "ass='" + escapedPath + "'" : "subtitles='" + escapedPath + "'";
final var args = List.of(
getFFmpegPath(),
"-y",
@@ -132,8 +129,8 @@ public class FFmpegVideoConverter implements VideoConverter {
runLog(args, Duration.ofHours(1));
}
- private SubtitleConverter> getSubtitleConverter() {
- return converterProvider.getConverter(preferences.get("outputFormat", "srt"));
+ private SubtitleConverter> getSubtitleConverter(final ExportOptions options) {
+ return converterProvider.getConverter(options.outputFormat());
}
private static String escapeVF(final String path) {
@@ -179,18 +176,22 @@ public class FFmpegVideoConverter implements VideoConverter {
return path;
}
- private > SequencedMap dumpCollections(final Collection collections, final VideoInfo videoInfo) throws IOException {
+ private > SequencedMap dumpCollections(final Collection extends T> collections, final ExportOptions options) throws IOException {
final var ret = LinkedHashMap.newLinkedHashMap(collections.size());
for (final var subtitles : collections) {
- ret.put(subtitles, dumpSubtitles(subtitles, videoInfo));
+ ret.put(subtitles, dumpSubtitles(subtitles, options));
}
return ret;
}
- private Path dumpSubtitles(final SubtitleCollection> subtitles, final VideoInfo videoInfo) throws IOException {
- final var path = getTempFile(getSubtitleConverter().formatName().toLowerCase());
- Files.writeString(path, getSubtitleConverter().format(subtitles, videoInfo));
- return path;
+ private Path dumpSubtitles(final SubtitleCollection> subtitles, final ExportOptions options) throws IOException {
+ final var path = getTempFile(getSubtitleConverter(options).formatName().toLowerCase());
+ try {
+ Files.writeString(path, getSubtitleConverter(options).format(subtitles, options.formatOptions()));
+ return path;
+ } catch (final FormatException e) {
+ throw new IOException(e);
+ }
}
private static Path getTempFile(final String extension) throws IOException {
diff --git a/ffmpeg/src/main/java/module-info.java b/ffmpeg/src/main/java/module-info.java
index 8c87be0..4605994 100644
--- a/ffmpeg/src/main/java/module-info.java
+++ b/ffmpeg/src/main/java/module-info.java
@@ -9,7 +9,6 @@ module com.github.gtache.autosubtitle.ffmpeg {
requires org.apache.logging.log4j;
requires org.tukaani.xz;
requires org.apache.commons.compress;
- requires java.prefs;
exports com.github.gtache.autosubtitle.ffmpeg;
exports com.github.gtache.autosubtitle.setup.ffmpeg;
diff --git a/ffmpeg/src/test/java/com/github/gtache/autosubtitle/ffmpeg/TestFFmpegVideoConverter.java b/ffmpeg/src/test/java/com/github/gtache/autosubtitle/ffmpeg/TestFFmpegVideoConverter.java
index d84ceb3..6cb563f 100644
--- a/ffmpeg/src/test/java/com/github/gtache/autosubtitle/ffmpeg/TestFFmpegVideoConverter.java
+++ b/ffmpeg/src/test/java/com/github/gtache/autosubtitle/ffmpeg/TestFFmpegVideoConverter.java
@@ -8,7 +8,11 @@ import com.github.gtache.autosubtitle.impl.FileVideoImpl;
import com.github.gtache.autosubtitle.process.ProcessListener;
import com.github.gtache.autosubtitle.process.ProcessResult;
import com.github.gtache.autosubtitle.process.ProcessRunner;
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
+import com.github.gtache.autosubtitle.subtitle.OutputFormat;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatException;
+import com.github.gtache.autosubtitle.subtitle.converter.FormatOptions;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
import org.junit.jupiter.api.BeforeEach;
@@ -28,7 +32,6 @@ import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.prefs.Preferences;
import static java.util.Objects.requireNonNull;
import static org.junit.jupiter.api.Assertions.*;
@@ -40,29 +43,31 @@ class TestFFmpegVideoConverter {
private final ProcessRunner runner;
private final ProcessListener listener;
- private final ProcessResult result;
+ private final ProcessResult processResult;
private final SubtitleConverter> subtitleConverter;
private final SubtitleConverterProvider subtitleConverterProvider;
private final Video video;
- private final InputStream in;
private final VideoInfo videoInfo;
+ private final InputStream in;
+ private final ExportOptions options;
+ private final FormatOptions formatOptions;
private final SubtitleCollection> frCollection;
private final SubtitleCollection> deCollection;
- private final Preferences preferences;
private final Path systemPath;
TestFFmpegVideoConverter(@Mock final SubtitleConverter> subtitleConverter, @Mock final ProcessRunner runner,
- @Mock final SubtitleConverterProvider subtitleConverterProvider, @Mock final Video video,
- @Mock final VideoInfo videoInfo, @Mock final SubtitleCollection> frCollection, @Mock final SubtitleCollection> deCollection,
- @Mock final Preferences preferences, @Mock final ProcessListener listener, @Mock final InputStream in,
- @Mock final ProcessResult result) {
+ @Mock final SubtitleConverterProvider subtitleConverterProvider, @Mock final Video video, @Mock final VideoInfo videoInfo,
+ @Mock final ExportOptions options, @Mock final SubtitleCollection> frCollection,
+ @Mock final SubtitleCollection> deCollection, @Mock final ProcessListener listener, @Mock final InputStream in,
+ @Mock final ProcessResult processResult, @Mock final FormatOptions formatOptions) {
this.video = requireNonNull(video);
- this.runner = requireNonNull(runner);
- this.result = requireNonNull(result);
this.videoInfo = requireNonNull(videoInfo);
+ this.runner = requireNonNull(runner);
+ this.options = requireNonNull(options);
+ this.formatOptions = requireNonNull(formatOptions);
+ this.processResult = requireNonNull(processResult);
this.subtitleConverter = requireNonNull(subtitleConverter);
this.subtitleConverterProvider = requireNonNull(subtitleConverterProvider);
- this.preferences = requireNonNull(preferences);
this.listener = requireNonNull(listener);
this.in = requireNonNull(in);
this.systemPath = Paths.get("system");
@@ -71,25 +76,26 @@ class TestFFmpegVideoConverter {
}
@BeforeEach
- void beforeEach() throws IOException {
+ void beforeEach() throws IOException, FormatException {
when(video.info()).thenReturn(videoInfo);
- when(subtitleConverterProvider.getConverter("srt")).thenReturn((SubtitleConverter) subtitleConverter);
+ when(subtitleConverterProvider.getConverter(OutputFormat.SRT)).thenReturn((SubtitleConverter) subtitleConverter);
when(subtitleConverter.formatName()).thenReturn("srt");
when(subtitleConverter.format(any(), any())).thenReturn("");
- when(preferences.get("outputFormat", "srt")).thenReturn("srt");
+ when(options.outputFormat()).thenReturn(OutputFormat.SRT);
+ when(options.formatOptions()).thenReturn(formatOptions);
when(video.getInputStream()).thenReturn(in);
when(frCollection.language()).thenReturn(Language.FR);
when(deCollection.language()).thenReturn(Language.DE);
when(runner.startListen(anyList())).thenReturn(listener);
- when(listener.join(Duration.ofHours(1))).thenReturn(result);
- when(result.exitCode()).thenReturn(0);
+ when(listener.join(Duration.ofHours(1))).thenReturn(processResult);
+ when(processResult.exitCode()).thenReturn(0);
}
@Test
- void testAddSoftSubtitlesMp4() throws IOException {
+ void testAddSoftSubtitlesMp4() throws IOException, FormatException {
when(videoInfo.format()).thenReturn("mp4");
- final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, preferences, runner);
- final var result = converter.addSoftSubtitles(video, List.of(frCollection, deCollection));
+ final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, runner);
+ final var result = converter.addSoftSubtitles(video, List.of(frCollection, deCollection), options);
assertEquals(videoInfo, result.info());
@@ -125,8 +131,8 @@ class TestFFmpegVideoConverter {
assertTrue(args.get(5).endsWith(".srt"));
assertTrue(args.get(7).endsWith(".srt"));
assertTrue(args.get(26).endsWith(".mp4"));
- verify(subtitleConverter).format(frCollection, videoInfo);
- verify(subtitleConverter).format(deCollection, videoInfo);
+ verify(subtitleConverter).format(frCollection, formatOptions);
+ verify(subtitleConverter).format(deCollection, formatOptions);
verify(in).transferTo(any());
}
@@ -135,19 +141,18 @@ class TestFFmpegVideoConverter {
}
@Test
- void testAddSoftSubtitlesMkvPathFile() throws IOException {
+ void testAddSoftSubtitlesMkvPathFile() throws IOException, FormatException {
when(videoInfo.format()).thenReturn("mkv");
- doReturn(null).when(subtitleConverterProvider).getConverter("srt");
- when(subtitleConverterProvider.getConverter("ass")).thenReturn((SubtitleConverter) subtitleConverter);
+ doReturn(null).when(subtitleConverterProvider).getConverter(OutputFormat.SRT);
+ when(subtitleConverterProvider.getConverter(OutputFormat.ASS)).thenReturn((SubtitleConverter) subtitleConverter);
when(subtitleConverter.formatName()).thenReturn("ass");
- when(preferences.get("outputFormat", "srt")).thenReturn("ass");
+ when(options.outputFormat()).thenReturn(OutputFormat.ASS);
final var fileVideo = mock(FileVideoImpl.class);
- when(fileVideo.info()).thenReturn(videoInfo);
final var path = Paths.get("path.mkv");
when(fileVideo.path()).thenReturn(path);
final var out = Paths.get("out.mkv");
- final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, preferences, runner);
- converter.addSoftSubtitles(fileVideo, List.of(frCollection, deCollection), out);
+ final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, runner);
+ converter.addSoftSubtitles(fileVideo, List.of(frCollection, deCollection), options, out);
final var args = getArgs();
assertEquals(27, args.size());
@@ -181,16 +186,16 @@ class TestFFmpegVideoConverter {
checkEquals(argMap, args);
assertTrue(args.get(5).endsWith(".ass"));
assertTrue(args.get(7).endsWith(".ass"));
- verify(subtitleConverter).format(frCollection, videoInfo);
- verify(subtitleConverter).format(deCollection, videoInfo);
+ verify(subtitleConverter).format(frCollection, formatOptions);
+ verify(subtitleConverter).format(deCollection, formatOptions);
verifyNoInteractions(in);
}
@Test
- void testAddHardSubtitles() throws IOException {
+ void testAddHardSubtitles() throws IOException, FormatException {
when(videoInfo.format()).thenReturn("mp4");
- final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, preferences, runner);
- final var result = converter.addHardSubtitles(video, frCollection);
+ final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, runner);
+ final var result = converter.addHardSubtitles(video, frCollection, options);
assertEquals(videoInfo, result.info());
@@ -206,19 +211,19 @@ class TestFFmpegVideoConverter {
assertTrue(args.get(3).endsWith(".mp4"));
assertTrue(args.get(5).startsWith("subtitles="));
assertTrue(args.get(6).endsWith(".mp4"));
- verify(subtitleConverter).format(frCollection, videoInfo);
+ verify(subtitleConverter).format(frCollection, formatOptions);
verify(in).transferTo(any());
}
@Test
- void testAddHardAssSubtitles() throws IOException {
- doReturn(null).when(subtitleConverterProvider).getConverter("srt");
- when(subtitleConverterProvider.getConverter("ass")).thenReturn((SubtitleConverter) subtitleConverter);
+ void testAddHardAssSubtitles() throws IOException, FormatException {
+ doReturn(null).when(subtitleConverterProvider).getConverter(OutputFormat.SRT);
+ when(subtitleConverterProvider.getConverter(OutputFormat.ASS)).thenReturn((SubtitleConverter) subtitleConverter);
when(subtitleConverter.formatName()).thenReturn("ass");
- when(preferences.get("outputFormat", "srt")).thenReturn("ass");
+ when(options.outputFormat()).thenReturn(OutputFormat.ASS);
when(videoInfo.format()).thenReturn("mp4");
- final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, preferences, runner);
- final var result = converter.addHardSubtitles(video, frCollection);
+ final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, runner);
+ final var result = converter.addHardSubtitles(video, frCollection, options);
assertEquals(videoInfo, result.info());
@@ -234,7 +239,7 @@ class TestFFmpegVideoConverter {
assertTrue(args.get(3).endsWith(".mp4"));
assertTrue(args.get(5).startsWith("ass="));
assertTrue(args.get(6).endsWith(".mp4"));
- verify(subtitleConverter).format(frCollection, videoInfo);
+ verify(subtitleConverter).format(frCollection, formatOptions);
verify(in).transferTo(any());
}
@@ -242,7 +247,7 @@ class TestFFmpegVideoConverter {
void testGetAudio() throws IOException {
when(videoInfo.format()).thenReturn("mp4");
when(videoInfo.duration()).thenReturn(25000L);
- final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, preferences, runner);
+ final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, runner);
final var result = converter.getAudio(video);
assertEquals(new AudioInfoImpl("wav", 25000L), result.info());
@@ -267,10 +272,10 @@ class TestFFmpegVideoConverter {
@Test
void testGetAudioException() {
- when(result.exitCode()).thenReturn(1);
+ when(processResult.exitCode()).thenReturn(1);
when(videoInfo.format()).thenReturn("mp4");
when(videoInfo.duration()).thenReturn(25000L);
- final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, preferences, runner);
+ final var converter = new FFmpegVideoConverter(Paths.get("bundled"), systemPath, subtitleConverterProvider, runner);
assertThrows(IOException.class, () -> converter.getAudio(video));
}
@@ -280,7 +285,7 @@ class TestFFmpegVideoConverter {
Files.createFile(bundled);
when(videoInfo.format()).thenReturn("mp4");
when(videoInfo.duration()).thenReturn(25000L);
- final var converter = new FFmpegVideoConverter(bundled, systemPath, subtitleConverterProvider, preferences, runner);
+ final var converter = new FFmpegVideoConverter(bundled, systemPath, subtitleConverterProvider, runner);
final var result = converter.getAudio(video);
assertEquals(new AudioInfoImpl("wav", 25000L), result.info());
diff --git a/ffmpeg/src/test/java/com/github/gtache/autosubtitle/setup/ffmpeg/TestFFmpegSetupManager.java b/ffmpeg/src/test/java/com/github/gtache/autosubtitle/setup/ffmpeg/TestFFmpegSetupManager.java
index a730624..c49de42 100644
--- a/ffmpeg/src/test/java/com/github/gtache/autosubtitle/setup/ffmpeg/TestFFmpegSetupManager.java
+++ b/ffmpeg/src/test/java/com/github/gtache/autosubtitle/setup/ffmpeg/TestFFmpegSetupManager.java
@@ -95,7 +95,7 @@ class TestFFmpegSetupManager {
}
@Test
- void testGetStatusSystemException() throws IOException, SetupException {
+ void testGetStatusSystemException() throws IOException {
final var ffmpegPath = Paths.get("path");
when(configuration.bundledFFmpegPath()).thenReturn(ffmpegPath);
when(processRunner.run(List.of(systemPath.toString(), "-version"), Duration.ofSeconds(5))).thenThrow(IOException.class);
diff --git a/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/parameters/ParametersModel.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/parameters/ParametersModel.java
index d04aa6a..7e740c0 100644
--- a/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/parameters/ParametersModel.java
+++ b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/parameters/ParametersModel.java
@@ -1,5 +1,6 @@
package com.github.gtache.autosubtitle.gui.parameters;
+import com.github.gtache.autosubtitle.subtitle.Font;
import com.github.gtache.autosubtitle.subtitle.OutputFormat;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
@@ -65,6 +66,11 @@ public interface ParametersModel {
*/
void setFontSize(int fontSize);
+ /**
+ * @return The current font
+ */
+ Font font();
+
/**
* @return The current max line length setting
*/
diff --git a/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/SubtitlesModel.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/SubtitlesModel.java
index 99c410d..086f397 100644
--- a/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/SubtitlesModel.java
+++ b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/SubtitlesModel.java
@@ -1,7 +1,6 @@
package com.github.gtache.autosubtitle.gui.subtitles;
import com.github.gtache.autosubtitle.Language;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
@@ -33,18 +32,6 @@ public interface SubtitlesModel collection);
+
+ /**
+ * @return The current export options
+ */
+ ExportOptions exportOptions();
+
+ /**
+ * Sets the export options
+ *
+ * @param options The options
+ */
+ void setExportOptions(ExportOptions options);
+
+ /**
+ * @return The current extract options
+ */
+ ExtractOptions extractOptions();
+
+ /**
+ * Sets the extract options
+ *
+ * @param options The options
+ */
+ void setExtractOptions(ExtractOptions options);
}
diff --git a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/CombinedResourceBundle.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/CombinedResourceBundle.java
index 04b9c63..5d2a3aa 100644
--- a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/CombinedResourceBundle.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/CombinedResourceBundle.java
@@ -14,13 +14,13 @@ public class CombinedResourceBundle extends ResourceBundle {
private final Map resources;
private final Locale locale;
- public CombinedResourceBundle(final ResourceBundle... resourceBundles) {
- this(Arrays.asList(resourceBundles));
+ public CombinedResourceBundle(final ResourceBundle... bundles) {
+ this(Arrays.asList(bundles));
}
- public CombinedResourceBundle(final List resourceBundles) {
- final var filteredBundles = resourceBundles.stream().filter(Objects::nonNull).toList();
- if (filteredBundles.size() != resourceBundles.size()) {
+ public CombinedResourceBundle(final Collection bundles) {
+ final var filteredBundles = bundles.stream().filter(Objects::nonNull).toList();
+ if (filteredBundles.size() != bundles.size()) {
logger.warn("There was one or more null bundles in the inner bundles");
}
if (filteredBundles.isEmpty()) {
diff --git a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProvider.java
index def64c7..7872b96 100644
--- a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProvider.java
@@ -5,5 +5,6 @@ import java.util.spi.ResourceBundleProvider;
/**
* Provider for MainBundle
*/
+@FunctionalInterface
public interface MainBundleProvider extends ResourceBundleProvider {
}
diff --git a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProvider.java
index 1e1b6c6..b9b7a5d 100644
--- a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProvider.java
@@ -5,5 +5,6 @@ import java.util.spi.ResourceBundleProvider;
/**
* Provider for ParametersBundle
*/
+@FunctionalInterface
public interface ParametersBundleProvider extends ResourceBundleProvider {
}
diff --git a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProvider.java
index 4bcd9a2..de42d4c 100644
--- a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProvider.java
@@ -5,5 +5,6 @@ import java.util.spi.ResourceBundleProvider;
/**
* Provider for SetupBundle
*/
+@FunctionalInterface
public interface SetupBundleProvider extends ResourceBundleProvider {
}
diff --git a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SubtitlesBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SubtitlesBundleProvider.java
index 409cb4e..143820d 100644
--- a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SubtitlesBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SubtitlesBundleProvider.java
@@ -5,5 +5,6 @@ import java.util.spi.ResourceBundleProvider;
/**
* Provider for SubtitlesBundle
*/
+@FunctionalInterface
public interface SubtitlesBundleProvider extends ResourceBundleProvider {
}
diff --git a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProvider.java
index d1dc8fa..3583df5 100644
--- a/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProvider.java
@@ -5,5 +5,6 @@ import java.util.spi.ResourceBundleProvider;
/**
* Provider for WorkBundle
*/
+@FunctionalInterface
public interface WorkBundleProvider extends ResourceBundleProvider {
}
diff --git a/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/GuiCoreModule.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/GuiCoreModule.java
index 5c3c7b7..419c394 100644
--- a/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/GuiCoreModule.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/GuiCoreModule.java
@@ -31,6 +31,9 @@ public final class GuiCoreModule {
@Play
static byte[] providesPlayImage() {
try (final var in = GuiCoreModule.class.getResourceAsStream("/com/github/gtache/autosubtitle/gui/impl/play_64.png")) {
+ if (in == null) {
+ throw new UncheckedIOException(new IOException("Resource not found : /com/github/gtache/autosubtitle/gui/impl/play_64.png"));
+ }
return in.readAllBytes();
} catch (final IOException e) {
throw new UncheckedIOException(e);
@@ -41,6 +44,9 @@ public final class GuiCoreModule {
@Pause
static byte[] providesPauseImage() {
try (final var in = GuiCoreModule.class.getResourceAsStream("/com/github/gtache/autosubtitle/gui/impl/pause_64.png")) {
+ if (in == null) {
+ throw new UncheckedIOException(new IOException("Resource not found : /com/github/gtache/autosubtitle/gui/impl/pause_64.png"));
+ }
return in.readAllBytes();
} catch (final IOException e) {
throw new UncheckedIOException(e);
diff --git a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/parameters/fx/FXParametersController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/parameters/fx/FXParametersController.java
index 9f353da..db39f75 100644
--- a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/parameters/fx/FXParametersController.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/parameters/fx/FXParametersController.java
@@ -20,6 +20,7 @@ import javax.inject.Singleton;
import java.util.function.UnaryOperator;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
+import java.util.regex.Pattern;
import static java.util.Objects.requireNonNull;
@@ -30,6 +31,7 @@ import static java.util.Objects.requireNonNull;
public class FXParametersController extends AbstractFXController implements ParametersController {
private static final Logger logger = LogManager.getLogger(FXParametersController.class);
+ private static final Pattern INTEGER_PATTERN = Pattern.compile("[1-9]\\d*");
@FXML
private PrefixSelectionComboBox extractionModelCombobox;
@FXML
@@ -67,7 +69,7 @@ public class FXParametersController extends AbstractFXController implements Para
final UnaryOperator integerFilter = change -> {
final var newText = change.getControlNewText();
- if (newText.matches("[1-9]\\d*")) {
+ if (INTEGER_PATTERN.matcher(newText).matches()) {
return change;
}
return null;
diff --git a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/parameters/fx/FXParametersModel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/parameters/fx/FXParametersModel.java
index 656e04f..924c645 100644
--- a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/parameters/fx/FXParametersModel.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/parameters/fx/FXParametersModel.java
@@ -5,11 +5,16 @@ import com.github.gtache.autosubtitle.modules.impl.FontName;
import com.github.gtache.autosubtitle.modules.impl.FontSize;
import com.github.gtache.autosubtitle.modules.impl.MaxLineLength;
import com.github.gtache.autosubtitle.modules.impl.MaxLines;
+import com.github.gtache.autosubtitle.subtitle.Font;
import com.github.gtache.autosubtitle.subtitle.OutputFormat;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
+import com.github.gtache.autosubtitle.subtitle.impl.FontImpl;
+import javafx.beans.binding.Bindings;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.ReadOnlyObjectProperty;
+import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
@@ -33,6 +38,7 @@ public class FXParametersModel implements ParametersModel {
private final ObservableList availableFontFamilies;
private final StringProperty fontName;
private final IntegerProperty fontSize;
+ private final ReadOnlyObjectWrapper font;
private final IntegerProperty maxLineLength;
private final IntegerProperty maxLines;
@@ -46,8 +52,11 @@ public class FXParametersModel implements ParametersModel {
this.availableFontFamilies = FXCollections.unmodifiableObservableList(FXCollections.observableArrayList("Arial"));
this.fontName = new SimpleStringProperty(defaultFontFamily);
this.fontSize = new SimpleIntegerProperty(defaultFontSize);
+ this.font = new ReadOnlyObjectWrapper<>();
this.maxLineLength = new SimpleIntegerProperty(defaultMaxLineLength);
this.maxLines = new SimpleIntegerProperty(defaultMaxLines);
+
+ font.bind(Bindings.createObjectBinding(() -> new FontImpl(fontName(), fontSize()), fontName, fontSize));
}
@Override
@@ -84,7 +93,7 @@ public class FXParametersModel implements ParametersModel {
outputFormat.set(format);
}
- ObjectProperty outputFormatProperty() {
+ public ObjectProperty outputFormatProperty() {
return outputFormat;
}
@@ -121,6 +130,15 @@ public class FXParametersModel implements ParametersModel {
return fontSize;
}
+ @Override
+ public Font font() {
+ return font.get();
+ }
+
+ public ReadOnlyObjectProperty fontProperty() {
+ return font.getReadOnlyProperty();
+ }
+
@Override
public int maxLineLength() {
return maxLineLength.get();
@@ -131,7 +149,7 @@ public class FXParametersModel implements ParametersModel {
this.maxLineLength.set(maxLineLength);
}
- IntegerProperty maxLineLengthProperty() {
+ public IntegerProperty maxLineLengthProperty() {
return maxLineLength;
}
@@ -145,7 +163,7 @@ public class FXParametersModel implements ParametersModel {
this.maxLines.set(maxLines);
}
- IntegerProperty maxLinesProperty() {
+ public IntegerProperty maxLinesProperty() {
return maxLines;
}
}
diff --git a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesBinder.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesBinder.java
index 6188a8d..fe4e535 100644
--- a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesBinder.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesBinder.java
@@ -1,11 +1,15 @@
package com.github.gtache.autosubtitle.gui.subtitles.fx;
import com.github.gtache.autosubtitle.Language;
-import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.gui.fx.FXBinder;
-import com.github.gtache.autosubtitle.gui.work.fx.FXWorkModel;
+import com.github.gtache.autosubtitle.gui.parameters.fx.FXParametersModel;
import com.github.gtache.autosubtitle.gui.work.WorkStatus;
+import com.github.gtache.autosubtitle.gui.work.fx.FXWorkModel;
+import com.github.gtache.autosubtitle.subtitle.converter.impl.FormatOptionsImpl;
+import com.github.gtache.autosubtitle.subtitle.converter.impl.ParseOptionsImpl;
import com.github.gtache.autosubtitle.subtitle.gui.fx.ObservableSubtitleCollectionImpl;
+import com.github.gtache.autosubtitle.subtitle.impl.ExportOptionsImpl;
+import com.github.gtache.autosubtitle.subtitle.impl.ImportOptionsImpl;
import javafx.beans.binding.Bindings;
import javax.inject.Inject;
@@ -19,11 +23,13 @@ import java.util.Objects;
public class FXSubtitlesBinder implements FXBinder {
private final FXWorkModel workModel;
+ private final FXParametersModel parametersModel;
private final FXSubtitlesModel subtitlesModel;
@Inject
- FXSubtitlesBinder(final FXWorkModel workModel, final FXSubtitlesModel subtitlesModel) {
+ FXSubtitlesBinder(final FXWorkModel workModel, final FXParametersModel parametersModel, final FXSubtitlesModel subtitlesModel) {
this.workModel = Objects.requireNonNull(workModel);
+ this.parametersModel = Objects.requireNonNull(parametersModel);
this.subtitlesModel = Objects.requireNonNull(subtitlesModel);
}
@@ -36,11 +42,9 @@ public class FXSubtitlesBinder implements FXBinder {
workModel.selectedSubtitleProperty().bind(subtitlesModel.selectedSubtitleProperty());
workModel.canExportProperty().bind(Bindings.isNotEmpty(subtitlesModel.collections()).and(workModel.statusProperty().isEqualTo(WorkStatus.IDLE)));
- workModel.videoLanguageProperty().bind(subtitlesModel.videoLanguageProperty());
- subtitlesModel.videoInfoProperty().bind(workModel.videoProperty().map(Video::info));
subtitlesModel.translatingProperty().addListener((observable, oldValue, newValue) -> {
- if (newValue) {
+ if (Boolean.TRUE.equals(newValue)) {
workModel.statusProperty().set(WorkStatus.TRANSLATING);
} else {
workModel.statusProperty().set(WorkStatus.IDLE);
@@ -55,5 +59,20 @@ public class FXSubtitlesBinder implements FXBinder {
Bindings.bindContent(workModel.collections(), subtitlesModel.collections());
Bindings.bindContent(workModel.subtitles(), subtitlesModel.selectedSubtitles());
+
+ subtitlesModel.exportOptionsProperty().bind(Bindings.createObjectBinding(() -> {
+ if (workModel.video() == null) {
+ return null;
+ } else {
+ final var format = parametersModel.outputFormat();
+ final var formatOptions = new FormatOptionsImpl(workModel.video().info(), parametersModel.font());
+ return new ExportOptionsImpl(format, formatOptions);
+ }
+ }, parametersModel.outputFormatProperty(), workModel.videoProperty(), parametersModel.fontProperty()));
+
+ subtitlesModel.importOptionsProperty().bind(Bindings.createObjectBinding(() -> {
+ final var parseOptions = new ParseOptionsImpl(parametersModel.maxLineLength(), parametersModel.maxLines(), parametersModel.font());
+ return new ImportOptionsImpl(parseOptions);
+ }, parametersModel.maxLineLengthProperty(), parametersModel.maxLinesProperty(), parametersModel.fontProperty()));
}
}
diff --git a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesController.java
index b81d6b4..f8d51d3 100644
--- a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesController.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesController.java
@@ -114,9 +114,7 @@ public class FXSubtitlesController extends AbstractFXController implements Subti
bindComboboxes();
bindTable();
mainSubtitlesTab.textProperty().bind(Bindings.createStringBinding(() -> model.videoLanguage().iso2(), model.videoLanguageProperty()));
- model.collections().addListener((MapChangeListener) change -> {
- manageTabs();
- });
+ model.collections().addListener((MapChangeListener) change -> manageTabs());
tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
model.setSelectedCollection(model.collections().get(Language.getLanguage(newValue.getText())));
@@ -293,10 +291,11 @@ public class FXSubtitlesController extends AbstractFXController implements Subti
try {
final var filename = file.getFileName().toString();
final var extension = filename.substring(filename.lastIndexOf('.') + 1);
+ final var options = model.exportOptions();
if (subtitleExtensions.contains(extension)) {
- importerExporter.exportSubtitles(model.selectedCollection(), model.videoInfo(), file);
+ importerExporter.exportSubtitles(model.selectedCollection(), options, file);
} else {
- importerExporter.exportSubtitles(model.collections().values(), model.videoInfo(), file);
+ importerExporter.exportSubtitles(model.collections().values(), options, file);
}
} catch (final IOException e) {
logger.error("Error saving subtitles {}", file, e);
@@ -307,7 +306,8 @@ public class FXSubtitlesController extends AbstractFXController implements Subti
@Override
public void loadSubtitles(final Path file) {
try {
- final var map = importerExporter.importSubtitles(file);
+ final var importOptions = model.importOptions();
+ final var map = importerExporter.importSubtitles(file, importOptions);
if (model.videoLanguage() == Language.AUTO) {
model.setVideoLanguage(map.keySet().stream().findFirst().orElse(Language.AUTO));
}
diff --git a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesModel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesModel.java
index 2615724..697f6fd 100644
--- a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesModel.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/subtitles/fx/FXSubtitlesModel.java
@@ -1,8 +1,9 @@
package com.github.gtache.autosubtitle.gui.subtitles.fx;
import com.github.gtache.autosubtitle.Language;
-import com.github.gtache.autosubtitle.VideoInfo;
import com.github.gtache.autosubtitle.gui.subtitles.SubtitlesModel;
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
+import com.github.gtache.autosubtitle.subtitle.ImportOptions;
import com.github.gtache.autosubtitle.subtitle.gui.fx.ObservableSubtitleCollectionImpl;
import com.github.gtache.autosubtitle.subtitle.gui.fx.ObservableSubtitleImpl;
import javafx.beans.binding.Bindings;
@@ -30,7 +31,6 @@ public class FXSubtitlesModel implements SubtitlesModel availableVideoLanguages;
private final ObjectProperty videoLanguage;
- private final ObjectProperty videoInfo;
private final ObservableList availableTranslationLanguages;
private final ObservableList selectedTranslationsLanguages;
private final ObjectProperty selectedLanguage;
@@ -46,6 +46,8 @@ public class FXSubtitlesModel implements SubtitlesModel exportOptions;
+ private final ObjectProperty importOptions;
@Inject
FXSubtitlesModel() {
@@ -61,7 +63,6 @@ public class FXSubtitlesModel implements SubtitlesModel l != Language.AUTO).toList());
this.videoLanguage = new SimpleObjectProperty<>(Language.AUTO);
- this.videoInfo = new SimpleObjectProperty<>();
this.selectedTranslationsLanguages = FXCollections.observableArrayList();
this.selectedLanguage = new SimpleObjectProperty<>(Language.AUTO);
this.collections = FXCollections.observableHashMap();
@@ -75,6 +76,8 @@ public class FXSubtitlesModel implements SubtitlesModel();
+ this.importOptions = new SimpleObjectProperty<>();
canSaveSubtitles.bind(Bindings.isNotEmpty(collections));
collections.addListener((MapChangeListener) change ->
@@ -107,24 +110,10 @@ public class FXSubtitlesModel implements SubtitlesModel videoLanguageProperty() {
+ public ObjectProperty videoLanguageProperty() {
return videoLanguage;
}
- @Override
- public VideoInfo videoInfo() {
- return videoInfo.get();
- }
-
- @Override
- public void setVideoInfo(final VideoInfo videoInfo) {
- this.videoInfo.set(videoInfo);
- }
-
- ObjectProperty videoInfoProperty() {
- return videoInfo;
- }
-
@Override
public ObservableList availableTranslationsLanguage() {
return FXCollections.unmodifiableObservableList(availableTranslationLanguages);
@@ -270,4 +259,20 @@ public class FXSubtitlesModel implements SubtitlesModel exportOptionsProperty() {
+ return exportOptions;
+ }
+
+ ImportOptions importOptions() {
+ return importOptions.get();
+ }
+
+ public ObjectProperty importOptionsProperty() {
+ return importOptions;
+ }
}
diff --git a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkBinder.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkBinder.java
index 1935696..eb926e0 100644
--- a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkBinder.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkBinder.java
@@ -2,10 +2,17 @@ package com.github.gtache.autosubtitle.gui.work.fx;
import com.github.gtache.autosubtitle.gui.fx.FXBinder;
import com.github.gtache.autosubtitle.gui.parameters.fx.FXParametersModel;
+import com.github.gtache.autosubtitle.gui.subtitles.fx.FXSubtitlesModel;
+import com.github.gtache.autosubtitle.subtitle.converter.impl.FormatOptionsImpl;
+import com.github.gtache.autosubtitle.subtitle.converter.impl.ParseOptionsImpl;
+import com.github.gtache.autosubtitle.subtitle.extractor.impl.ExtractOptionsImpl;
+import com.github.gtache.autosubtitle.subtitle.impl.ExportOptionsImpl;
+import javafx.beans.binding.Bindings;
import javax.inject.Inject;
import javax.inject.Singleton;
-import java.util.Objects;
+
+import static java.util.Objects.requireNonNull;
/**
* {@link FXBinder} for {@link FXWorkModel}
@@ -15,15 +22,29 @@ public class FXWorkBinder implements FXBinder {
private final FXWorkModel workModel;
private final FXParametersModel parametersModel;
+ private final FXSubtitlesModel subtitlesModel;
@Inject
- FXWorkBinder(final FXWorkModel workModel, final FXParametersModel parametersModel) {
- this.workModel = Objects.requireNonNull(workModel);
- this.parametersModel = Objects.requireNonNull(parametersModel);
+ FXWorkBinder(final FXWorkModel workModel, final FXParametersModel parametersModel, final FXSubtitlesModel subtitlesModel) {
+ this.workModel = requireNonNull(workModel);
+ this.parametersModel = requireNonNull(parametersModel);
+ this.subtitlesModel = requireNonNull(subtitlesModel);
}
@Override
public void createBindings() {
- workModel.extractionModelProperty().bind(parametersModel.extractionModelProperty());
+ workModel.exportOptionsProperty().bind(Bindings.createObjectBinding(() -> {
+ if (workModel.video() == null) {
+ return null;
+ } else {
+ return new ExportOptionsImpl(parametersModel.outputFormat(), new FormatOptionsImpl(workModel.video().info(), parametersModel.font()));
+ }
+ }, workModel.videoProperty(), parametersModel.outputFormatProperty(), parametersModel.fontProperty()));
+
+ workModel.extractOptionsProperty().bind(Bindings.createObjectBinding(() ->
+ new ExtractOptionsImpl(subtitlesModel.videoLanguage(), parametersModel.extractionModel(),
+ new ParseOptionsImpl(parametersModel.maxLineLength(), parametersModel.maxLines(), parametersModel.font())),
+ subtitlesModel.videoLanguageProperty(), parametersModel.extractionModelProperty(),
+ parametersModel.maxLineLengthProperty(), parametersModel.maxLinesProperty(), parametersModel.fontProperty()));
}
}
diff --git a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkController.java
index d66b1df..f9c2a62 100644
--- a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkController.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkController.java
@@ -75,7 +75,7 @@ public class FXWorkController extends AbstractFXController implements WorkContro
private final FXWorkModel model;
private final FXWorkBinder binder;
- private final SubtitleExtractor subtitleExtractor;
+ private final SubtitleExtractor> subtitleExtractor;
private final VideoConverter videoConverter;
private final VideoLoader videoLoader;
@@ -142,7 +142,7 @@ public class FXWorkController extends AbstractFXController implements WorkContro
private SubtitleCollection> extractAsync() {
try {
- return subtitleExtractor.extract(model.video(), model.videoLanguageProperty().get(), model.extractionModel());
+ return subtitleExtractor.extract(model.video(), model.extractOptions());
} catch (final ExtractException e) {
throw new CompletionException(e);
}
@@ -182,7 +182,7 @@ public class FXWorkController extends AbstractFXController implements WorkContro
model.setStatus(WorkStatus.EXPORTING);
CompletableFuture.runAsync(() -> {
try {
- videoConverter.addSoftSubtitles(model.video(), model.collections().values(), file.toPath());
+ videoConverter.addSoftSubtitles(model.video(), model.collections().values(), model.exportOptions(), file.toPath());
} catch (final IOException e) {
throw new CompletionException(e);
}
@@ -207,7 +207,7 @@ public class FXWorkController extends AbstractFXController implements WorkContro
model.setStatus(WorkStatus.EXPORTING);
CompletableFuture.runAsync(() -> {
try {
- videoConverter.addHardSubtitles(model.video(), model.collections().get(model.videoLanguageProperty().get()), file.toPath());
+ videoConverter.addHardSubtitles(model.video(), model.collections().get(model.extractOptions().language()), model.exportOptions(), file.toPath());
} catch (final IOException e) {
throw new CompletionException(e);
}
diff --git a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkModel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkModel.java
index 938a779..b3658c8 100644
--- a/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkModel.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/work/fx/FXWorkModel.java
@@ -5,8 +5,9 @@ import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.gui.work.WorkModel;
import com.github.gtache.autosubtitle.gui.work.WorkStatus;
import com.github.gtache.autosubtitle.subtitle.EditableSubtitle;
+import com.github.gtache.autosubtitle.subtitle.ExportOptions;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.subtitle.gui.fx.ObservableSubtitleCollectionImpl;
import com.github.gtache.autosubtitle.subtitle.gui.fx.ObservableSubtitleImpl;
import javafx.beans.property.BooleanProperty;
@@ -31,7 +32,6 @@ import javax.inject.Singleton;
public class FXWorkModel implements WorkModel {
private final ObjectProperty