diff --git a/.idea/csv-editor.xml b/.idea/csv-editor.xml
new file mode 100644
index 0000000..54fbf77
--- /dev/null
+++ b/.idea/csv-editor.xml
@@ -0,0 +1,219 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 0e3521c..4697f0e 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -5,18 +5,26 @@
+
+
-
-
+
+
+
+
+
+
+
+
-
-
+
+
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleCollection.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleCollection.java
index c385b36..929042c 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleCollection.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleCollection.java
@@ -9,6 +9,11 @@ import java.util.Collection;
*/
public interface SubtitleCollection {
+ /**
+ * @return The whole text of the subtitles
+ */
+ String text();
+
/**
* @return The subtitles
*/
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleConverter.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleConverter.java
deleted file mode 100644
index f705fd2..0000000
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleConverter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.github.gtache.autosubtitle.subtitle;
-
-/**
- * Converts subtitles to a specific format (e.g. srt, ssa, ass, ...)
- */
-public interface SubtitleConverter {
-
- /**
- * Converts the subtitle collection
- *
- * @param collection The collection
- * @return The converted subtitles as the content of a file
- */
- String convert(final SubtitleCollection collection);
-
- /**
- * @return The name of the format
- */
- String formatName();
-}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/ParseException.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/ParseException.java
new file mode 100644
index 0000000..85c105e
--- /dev/null
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/ParseException.java
@@ -0,0 +1,19 @@
+package com.github.gtache.autosubtitle.subtitle.converter;
+
+/**
+ * Exception thrown when an error occurs during subtitle parsing
+ */
+public class ParseException extends Exception {
+
+ public ParseException(final String message) {
+ super(message);
+ }
+
+ public ParseException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public ParseException(final Throwable cause) {
+ super(cause);
+ }
+}
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
new file mode 100644
index 0000000..c926884
--- /dev/null
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverter.java
@@ -0,0 +1,62 @@
+package com.github.gtache.autosubtitle.subtitle.converter;
+
+import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+/**
+ * Converts subtitles to a specific format (e.g. srt, ssa, ass, ...) and vice-versa
+ */
+public interface SubtitleConverter {
+
+ /**
+ * Converts the subtitle collection
+ *
+ * @param collection The collection
+ * @return The converted subtitles as the content of a file
+ */
+ String format(final SubtitleCollection collection);
+
+ /**
+ * Parses a subtitle collection
+ *
+ * @param file The path to the file
+ * @return The subtitle collection
+ * @throws ParseException If an error occurred
+ */
+ default SubtitleCollection parse(final Path file) throws ParseException {
+ try {
+ final var content = Files.readString(file);
+ return parse(content);
+ } catch (final IOException e) {
+ throw new ParseException(e);
+ }
+ }
+
+ /**
+ * Parses a subtitle collection
+ *
+ * @param content The content of the file
+ * @return The subtitle collection
+ * @throws ParseException If an error occurred
+ */
+ SubtitleCollection parse(String content) throws ParseException;
+
+ /**
+ * Check if the parser can parse the given file
+ *
+ * @param file The path to the file
+ * @return True if the parser can parse the file
+ */
+ default boolean canParse(final Path file) {
+ final var fileName = file.getFileName().toString();
+ return fileName.substring(fileName.lastIndexOf('.') + 1).equals(formatName());
+ }
+
+ /**
+ * @return The name of the format
+ */
+ String formatName();
+}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractEvent.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractEvent.java
similarity index 80%
rename from api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractEvent.java
rename to api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractEvent.java
index 1662a8b..18f8398 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractEvent.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractEvent.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.subtitle;
+package com.github.gtache.autosubtitle.subtitle.extractor;
/**
* Events that can be triggered by {@link SubtitleExtractor}
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractException.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractException.java
similarity index 87%
rename from api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractException.java
rename to api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractException.java
index b641e1b..6b505a9 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractException.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractException.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.subtitle;
+package com.github.gtache.autosubtitle.subtitle.extractor;
/**
* Exception thrown when an error occurs during subtitle extraction
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractionModel.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModel.java
similarity index 70%
rename from api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractionModel.java
rename to api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModel.java
index dace168..a12f753 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractionModel.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModel.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.subtitle;
+package com.github.gtache.autosubtitle.subtitle.extractor;
/**
* An extraction model
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractionModelProvider.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModelProvider.java
similarity index 89%
rename from api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractionModelProvider.java
rename to api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModelProvider.java
index a84df69..ffcb25f 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/ExtractionModelProvider.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/ExtractionModelProvider.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.subtitle;
+package com.github.gtache.autosubtitle.subtitle.extractor;
import java.util.List;
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleExtractor.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractor.java
similarity index 94%
rename from api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleExtractor.java
rename to api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractor.java
index f79bcd0..fd91d11 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleExtractor.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractor.java
@@ -1,8 +1,9 @@
-package com.github.gtache.autosubtitle.subtitle;
+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.SubtitleCollection;
/**
* Extracts subtitles from a video or audio
diff --git a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleExtractorListener.java b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractorListener.java
similarity index 81%
rename from api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleExtractorListener.java
rename to api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractorListener.java
index e77d5cf..608a61e 100644
--- a/api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleExtractorListener.java
+++ b/api/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/SubtitleExtractorListener.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.subtitle;
+package com.github.gtache.autosubtitle.subtitle.extractor;
/**
* Listener for {@link SubtitleExtractor}
diff --git a/api/src/main/java/module-info.java b/api/src/main/java/module-info.java
index 6a7fe34..c19dfaa 100644
--- a/api/src/main/java/module-info.java
+++ b/api/src/main/java/module-info.java
@@ -6,4 +6,6 @@ module com.github.gtache.autosubtitle.api {
exports com.github.gtache.autosubtitle.process;
exports com.github.gtache.autosubtitle.setup;
exports com.github.gtache.autosubtitle.subtitle;
+ exports com.github.gtache.autosubtitle.subtitle.extractor;
+ exports com.github.gtache.autosubtitle.subtitle.converter;
}
\ No newline at end of file
diff --git a/cli/src/main/java/com/github/gtache/autosubtitle/modules/cli/CliComponent.java b/cli/src/main/java/com/github/gtache/autosubtitle/modules/cli/CliComponent.java
index 2fa888d..ffccb48 100644
--- a/cli/src/main/java/com/github/gtache/autosubtitle/modules/cli/CliComponent.java
+++ b/cli/src/main/java/com/github/gtache/autosubtitle/modules/cli/CliComponent.java
@@ -3,16 +3,17 @@ package com.github.gtache.autosubtitle.modules.cli;
import com.github.gtache.autosubtitle.modules.deepl.DeepLModule;
import com.github.gtache.autosubtitle.modules.ffmpeg.FFmpegModule;
import com.github.gtache.autosubtitle.modules.impl.CoreModule;
-import com.github.gtache.autosubtitle.modules.subtitles.impl.ConverterModule;
-import com.github.gtache.autosubtitle.modules.whisper.WhisperModule;
-import com.github.gtache.autosubtitle.subtitle.SubtitleConverter;
+import com.github.gtache.autosubtitle.modules.subtitle.extractor.whisper.WhisperExtractorModule;
+import com.github.gtache.autosubtitle.modules.subtitle.impl.SubtitleModule;
+import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import dagger.Component;
import javax.inject.Singleton;
+import java.util.Map;
-@Component(modules = {ConverterModule.class, CoreModule.class, DeepLModule.class, FFmpegModule.class, WhisperModule.class})
+@Component(modules = {SubtitleModule.class, CoreModule.class, DeepLModule.class, FFmpegModule.class, WhisperExtractorModule.class})
@Singleton
public interface CliComponent {
- SubtitleConverter getSubtitleConverter();
+ Map getSubtitleConverters();
}
diff --git a/client/pom.xml b/client/pom.xml
new file mode 100644
index 0000000..872c32e
--- /dev/null
+++ b/client/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+
+ com.github.gtache.autosubtitle
+ autosubtitle
+ 1.0-SNAPSHOT
+
+
+ autosubtitle-client
+
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-core
+
+
+
+
\ No newline at end of file
diff --git a/client/src/main/java/module-info.java b/client/src/main/java/module-info.java
new file mode 100644
index 0000000..ef97617
--- /dev/null
+++ b/client/src/main/java/module-info.java
@@ -0,0 +1,6 @@
+/**
+ * Module for autosubtitle client
+ */
+module com.github.gtache.autosubtitle.client {
+ requires transitive com.github.gtache.autosubtitle.core;
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..7631560
--- /dev/null
+++ b/core/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/impl/SubtitleModule.java
@@ -0,0 +1,20 @@
+package com.github.gtache.autosubtitle.modules.subtitle.impl;
+
+import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
+import com.github.gtache.autosubtitle.subtitle.converter.impl.SRTSubtitleConverter;
+import dagger.Binds;
+import dagger.Module;
+import dagger.multibindings.IntoMap;
+import dagger.multibindings.StringKey;
+
+/**
+ * Dagger module for subtitles
+ */
+@Module
+public interface SubtitleModule {
+
+ @Binds
+ @IntoMap
+ @StringKey("srt")
+ SubtitleConverter bindsSubtitleConverter(final SRTSubtitleConverter converter);
+}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/modules/subtitles/impl/ConverterModule.java b/core/src/main/java/com/github/gtache/autosubtitle/modules/subtitles/impl/ConverterModule.java
deleted file mode 100644
index 0811b25..0000000
--- a/core/src/main/java/com/github/gtache/autosubtitle/modules/subtitles/impl/ConverterModule.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.github.gtache.autosubtitle.modules.subtitles.impl;
-
-import com.github.gtache.autosubtitle.subtitle.SubtitleConverter;
-import com.github.gtache.autosubtitle.subtitle.impl.SRTSubtitleConverter;
-import dagger.Binds;
-import dagger.Module;
-
-/**
- * Dagger module for subtitle converter
- */
-@Module
-public interface ConverterModule {
-
- @Binds
- SubtitleConverter bindsSubtitleConverter(final SRTSubtitleConverter converter);
-}
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
new file mode 100644
index 0000000..e9bebd5
--- /dev/null
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/SRTSubtitleConverter.java
@@ -0,0 +1,79 @@
+package com.github.gtache.autosubtitle.subtitle.converter.impl;
+
+import com.github.gtache.autosubtitle.Translator;
+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.SubtitleConverter;
+import com.github.gtache.autosubtitle.subtitle.impl.SubtitleCollectionImpl;
+import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Converts subtitles to SRT format
+ */
+@Singleton
+public class SRTSubtitleConverter implements SubtitleConverter {
+
+ private final Translator translator;
+
+ @Inject
+ SRTSubtitleConverter(final Translator translator) {
+ this.translator = requireNonNull(translator);
+ }
+
+ public String format(final SubtitleCollection collection) {
+ 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);
+ return (i + 1) + "\n" +
+ subtitle.start() + " --> " + subtitle.end() + "\n" +
+ subtitle.content();
+ }).collect(Collectors.joining("\n\n"));
+ }
+
+ @Override
+ public SubtitleCollection parse(final String content) throws ParseException {
+ try {
+ final var elements = content.split("\n\n");
+ 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 startTimeStr = timeSplit[0];
+ final var endTimeStr = timeSplit[1];
+ final var start = parseTime(startTimeStr);
+ final var end = parseTime(endTimeStr);
+ final var text = String.join(" ", Arrays.stream(lines).skip(2).toList());
+ return new SubtitleImpl(text, start, end, null, null);
+ }).toList();
+ final var text = subtitles.stream().map(Subtitle::content).collect(Collectors.joining(" "));
+ return new SubtitleCollectionImpl(content, subtitles, translator.getLanguage(text));
+ } catch (final Exception e) {
+ throw new ParseException(e);
+ }
+ }
+
+ private static long parseTime(final String timeStr) {
+ final var split = timeStr.split(":");
+ final var hours = Integer.parseInt(split[0]);
+ final var minutes = Integer.parseInt(split[1]);
+ final var secondsSplit = split[2].split(",");
+ final var seconds = Integer.parseInt(secondsSplit[0]);
+ final var millis = Integer.parseInt(secondsSplit[1]);
+ return (hours * 3600L + minutes * 60L + seconds) * 1000 + millis;
+ }
+
+ @Override
+ public String formatName() {
+ return "srt";
+ }
+}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/AbstractSubtitleExtractor.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/AbstractSubtitleExtractor.java
similarity index 76%
rename from core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/AbstractSubtitleExtractor.java
rename to core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/AbstractSubtitleExtractor.java
index 303091a..a5ec465 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/AbstractSubtitleExtractor.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/AbstractSubtitleExtractor.java
@@ -1,8 +1,8 @@
-package com.github.gtache.autosubtitle.subtitle.impl;
+package com.github.gtache.autosubtitle.subtitle.extractor.impl;
-import com.github.gtache.autosubtitle.subtitle.ExtractEvent;
-import com.github.gtache.autosubtitle.subtitle.SubtitleExtractor;
-import com.github.gtache.autosubtitle.subtitle.SubtitleExtractorListener;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
+import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
+import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractorListener;
import java.util.HashSet;
import java.util.Set;
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ExtractEventImpl.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/ExtractEventImpl.java
similarity index 51%
rename from core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ExtractEventImpl.java
rename to core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/ExtractEventImpl.java
index acc7b4c..2d7f0eb 100644
--- a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/ExtractEventImpl.java
+++ b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/impl/ExtractEventImpl.java
@@ -1,10 +1,10 @@
-package com.github.gtache.autosubtitle.subtitle.impl;
+package com.github.gtache.autosubtitle.subtitle.extractor.impl;
-import com.github.gtache.autosubtitle.subtitle.ExtractEvent;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
/**
* Implementation of {@link ExtractEvent}
*/
public record ExtractEventImpl(String message, double progress) implements ExtractEvent {
-
+
}
diff --git a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SRTSubtitleConverter.java b/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SRTSubtitleConverter.java
deleted file mode 100644
index 7c52e2a..0000000
--- a/core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SRTSubtitleConverter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.github.gtache.autosubtitle.subtitle.impl;
-
-import com.github.gtache.autosubtitle.subtitle.Subtitle;
-import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import com.github.gtache.autosubtitle.subtitle.SubtitleConverter;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.util.Comparator;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-/**
- * Converts subtitles to SRT format
- */
-@Singleton
-public class SRTSubtitleConverter implements SubtitleConverter {
-
- @Inject
- SRTSubtitleConverter() {
- }
-
- public String convert(final SubtitleCollection collection) {
- 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);
- return (i + 1) + "\n" +
- subtitle.start() + " --> " + subtitle.end() + "\n" +
- subtitle.content();
- }).collect(Collectors.joining("\n\n"));
- }
-
- @Override
- public String formatName() {
- return "srt";
- }
-}
diff --git a/core/src/main/java/module-info.java b/core/src/main/java/module-info.java
index 39e335b..c05f919 100644
--- a/core/src/main/java/module-info.java
+++ b/core/src/main/java/module-info.java
@@ -14,5 +14,7 @@ module com.github.gtache.autosubtitle.core {
exports com.github.gtache.autosubtitle.modules.impl;
exports com.github.gtache.autosubtitle.modules.setup.impl;
- exports com.github.gtache.autosubtitle.modules.subtitles.impl;
+ exports com.github.gtache.autosubtitle.subtitle.extractor.impl;
+ exports com.github.gtache.autosubtitle.subtitle.converter.impl;
+ exports com.github.gtache.autosubtitle.modules.subtitle.impl;
}
\ No newline at end of file
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 0966e6a..26a18b5 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
@@ -12,7 +12,7 @@ import com.github.gtache.autosubtitle.modules.ffmpeg.FFmpegBundledPath;
import com.github.gtache.autosubtitle.modules.ffmpeg.FFmpegSystemPath;
import com.github.gtache.autosubtitle.process.impl.AbstractProcessRunner;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import com.github.gtache.autosubtitle.subtitle.SubtitleConverter;
+import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import java.util.SequencedMap;
import java.util.concurrent.atomic.AtomicInteger;
@@ -40,10 +41,10 @@ public class FFmpegVideoConverter extends AbstractProcessRunner implements Video
private final SubtitleConverter subtitleConverter;
@Inject
- FFmpegVideoConverter(@FFmpegBundledPath final Path bundledPath, @FFmpegSystemPath final Path systemPath, final SubtitleConverter subtitleConverter) {
+ FFmpegVideoConverter(@FFmpegBundledPath final Path bundledPath, @FFmpegSystemPath final Path systemPath, final Map subtitleConverters) {
this.bundledPath = requireNonNull(bundledPath);
this.systemPath = requireNonNull(systemPath);
- this.subtitleConverter = requireNonNull(subtitleConverter);
+ this.subtitleConverter = requireNonNull(subtitleConverters.get("srt"));
}
@Override
@@ -143,7 +144,7 @@ public class FFmpegVideoConverter extends AbstractProcessRunner implements Video
private Path dumpSubtitles(final SubtitleCollection subtitles) throws IOException {
final var path = getTempFile("ass");
- Files.writeString(path, subtitleConverter.convert(subtitles));
+ Files.writeString(path, subtitleConverter.format(subtitles));
return path;
}
diff --git a/gui/api/pom.xml b/gui/api/pom.xml
new file mode 100644
index 0000000..7ff1cfb
--- /dev/null
+++ b/gui/api/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+
+ com.github.gtache.autosubtitle
+ autosubtitle-gui
+ 1.0-SNAPSHOT
+
+
+ autosubtitle-gui-api
+
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-api
+
+
+
+
\ No newline at end of file
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/MainController.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/MainController.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/MainController.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/MainController.java
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/MainModel.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/MainModel.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/MainModel.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/MainModel.java
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/MediaController.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/MediaController.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/MediaController.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/MediaController.java
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/MediaModel.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/MediaModel.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/MediaModel.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/MediaModel.java
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/ParametersController.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/ParametersController.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/ParametersController.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/ParametersController.java
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/ParametersModel.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/ParametersModel.java
similarity index 94%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/ParametersModel.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/ParametersModel.java
index f25385a..6b73997 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/ParametersModel.java
+++ b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/ParametersModel.java
@@ -1,7 +1,7 @@
package com.github.gtache.autosubtitle.gui;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModel;
import com.github.gtache.autosubtitle.subtitle.OutputFormat;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
import java.util.List;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/SetupController.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/SetupController.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/SetupController.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/SetupController.java
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/SetupModel.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/SetupModel.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/SetupModel.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/SetupModel.java
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/TimeFormatter.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/TimeFormatter.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/TimeFormatter.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/TimeFormatter.java
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/WorkController.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/WorkController.java
similarity index 60%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/WorkController.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/WorkController.java
index a761cd1..a066374 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/WorkController.java
+++ b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/WorkController.java
@@ -19,6 +19,20 @@ public interface WorkController {
*/
void loadVideo(final Path file);
+ /**
+ * Saves the subtitles to the given path
+ *
+ * @param file The output path
+ */
+ void saveSubtitles(final Path file);
+
+ /**
+ * Loads a subtitles file
+ *
+ * @param file The path to the file
+ */
+ void loadSubtitles(final Path file);
+
/**
* @return The model
*/
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/WorkModel.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/WorkModel.java
similarity index 96%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/WorkModel.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/WorkModel.java
index 2059f75..e5fb221 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/WorkModel.java
+++ b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/WorkModel.java
@@ -3,8 +3,8 @@ package com.github.gtache.autosubtitle.gui;
import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.subtitle.EditableSubtitle;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModel;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
import java.util.List;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/WorkStatus.java b/gui/api/src/main/java/com/github/gtache/autosubtitle/gui/WorkStatus.java
similarity index 100%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/WorkStatus.java
rename to gui/api/src/main/java/com/github/gtache/autosubtitle/gui/WorkStatus.java
diff --git a/gui/api/src/main/java/module-info.java b/gui/api/src/main/java/module-info.java
new file mode 100644
index 0000000..b6373f0
--- /dev/null
+++ b/gui/api/src/main/java/module-info.java
@@ -0,0 +1,7 @@
+/**
+ * GUI module for auto-subtitle
+ */
+module com.github.gtache.autosubtitle.gui.api {
+ requires transitive com.github.gtache.autosubtitle.api;
+ exports com.github.gtache.autosubtitle.gui;
+}
\ No newline at end of file
diff --git a/gui/core/pom.xml b/gui/core/pom.xml
new file mode 100644
index 0000000..ecb323f
--- /dev/null
+++ b/gui/core/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+
+ com.github.gtache.autosubtitle
+ autosubtitle-gui
+ 1.0-SNAPSHOT
+
+
+ autosubtitle-gui-core
+
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-gui-api
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-core
+
+
+ com.google.dagger
+ dagger
+
+
+
+
\ No newline at end of file
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/CombinedResourceBundle.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/CombinedResourceBundle.java
similarity index 94%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/CombinedResourceBundle.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/CombinedResourceBundle.java
index 99cc8c7..f55c86a 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/CombinedResourceBundle.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/CombinedResourceBundle.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui;
+package com.github.gtache.autosubtitle.gui.impl;
import java.util.Arrays;
import java.util.Collections;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/MainBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProvider.java
similarity index 74%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/MainBundleProvider.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProvider.java
index ea4a517..def64c7 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/MainBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProvider.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui.spi;
+package com.github.gtache.autosubtitle.gui.impl.spi;
import java.util.spi.ResourceBundleProvider;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/MainBundleProviderImpl.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProviderImpl.java
similarity index 80%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/MainBundleProviderImpl.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProviderImpl.java
index 9073a8c..c9c170d 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/MainBundleProviderImpl.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/MainBundleProviderImpl.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui.spi;
+package com.github.gtache.autosubtitle.gui.impl.spi;
import java.util.spi.AbstractResourceBundleProvider;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/ParametersBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProvider.java
similarity index 75%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/ParametersBundleProvider.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProvider.java
index cb822b9..1e1b6c6 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/ParametersBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProvider.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui.spi;
+package com.github.gtache.autosubtitle.gui.impl.spi;
import java.util.spi.ResourceBundleProvider;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/ParametersBundleProviderImpl.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProviderImpl.java
similarity index 81%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/ParametersBundleProviderImpl.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProviderImpl.java
index fe27bfd..72c1110 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/ParametersBundleProviderImpl.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/ParametersBundleProviderImpl.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui.spi;
+package com.github.gtache.autosubtitle.gui.impl.spi;
import java.util.spi.AbstractResourceBundleProvider;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/SetupBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProvider.java
similarity index 74%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/SetupBundleProvider.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProvider.java
index bc3f3cf..4bcd9a2 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/SetupBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProvider.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui.spi;
+package com.github.gtache.autosubtitle.gui.impl.spi;
import java.util.spi.ResourceBundleProvider;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/SetupBundleProviderImpl.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProviderImpl.java
similarity index 80%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/SetupBundleProviderImpl.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProviderImpl.java
index 85adb51..a35fbc0 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/SetupBundleProviderImpl.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/SetupBundleProviderImpl.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui.spi;
+package com.github.gtache.autosubtitle.gui.impl.spi;
import java.util.spi.AbstractResourceBundleProvider;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/WorkBundleProvider.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProvider.java
similarity index 74%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/WorkBundleProvider.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProvider.java
index 14dad2d..d1dc8fa 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/WorkBundleProvider.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProvider.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui.spi;
+package com.github.gtache.autosubtitle.gui.impl.spi;
import java.util.spi.ResourceBundleProvider;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/WorkBundleProviderImpl.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProviderImpl.java
similarity index 80%
rename from gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/WorkBundleProviderImpl.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProviderImpl.java
index c8ce9f8..aa5dbcb 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/gui/spi/WorkBundleProviderImpl.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/gui/impl/spi/WorkBundleProviderImpl.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.gui.spi;
+package com.github.gtache.autosubtitle.gui.impl.spi;
import java.util.spi.AbstractResourceBundleProvider;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/FontFamily.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/FontFamily.java
similarity index 87%
rename from gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/FontFamily.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/FontFamily.java
index dccef8a..04a55a5 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/FontFamily.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/FontFamily.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.modules.gui;
+package com.github.gtache.autosubtitle.modules.gui.impl;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/FontSize.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/FontSize.java
similarity index 87%
rename from gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/FontSize.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/FontSize.java
index 9fe1ecf..3caf742 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/FontSize.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/FontSize.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.modules.gui;
+package com.github.gtache.autosubtitle.modules.gui.impl;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/GuiModule.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/GuiCoreModule.java
similarity index 67%
rename from gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/GuiModule.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/GuiCoreModule.java
index dfcf46e..8845a2d 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/GuiModule.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/GuiCoreModule.java
@@ -1,6 +1,6 @@
-package com.github.gtache.autosubtitle.modules.gui;
+package com.github.gtache.autosubtitle.modules.gui.impl;
-import com.github.gtache.autosubtitle.gui.CombinedResourceBundle;
+import com.github.gtache.autosubtitle.gui.impl.CombinedResourceBundle;
import dagger.Module;
import dagger.Provides;
@@ -13,22 +13,22 @@ import java.util.ResourceBundle;
* Dagger module for GUI
*/
@Module
-public class GuiModule {
+public class GuiCoreModule {
@Provides
@Singleton
static ResourceBundle providesBundle() {
- return new CombinedResourceBundle(ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.MainBundle"),
- ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.SetupBundle"),
- ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.WorkBundle"),
- ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.ParametersBundle"),
- ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.MediaBundle"));
+ return new CombinedResourceBundle(ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.impl.MainBundle"),
+ ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.impl.SetupBundle"),
+ ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.impl.WorkBundle"),
+ ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.impl.ParametersBundle"),
+ ResourceBundle.getBundle("com.github.gtache.autosubtitle.gui.impl.MediaBundle"));
}
@Provides
@Singleton
@Play
static byte[] providesPlayImage() {
- try (final var in = GuiModule.class.getResourceAsStream("/com/github/gtache/autosubtitle/gui/play_64.png")) {
+ try (final var in = GuiCoreModule.class.getResourceAsStream("/com/github/gtache/autosubtitle/gui/impl/play_64.png")) {
return in.readAllBytes();
} catch (final IOException e) {
throw new UncheckedIOException(e);
@@ -39,7 +39,7 @@ public class GuiModule {
@Singleton
@Pause
static byte[] providesPauseImage() {
- try (final var in = GuiModule.class.getResourceAsStream("/com/github/gtache/autosubtitle/gui/pause_64.png")) {
+ try (final var in = GuiCoreModule.class.getResourceAsStream("/com/github/gtache/autosubtitle/gui/impl/pause_64.png")) {
return in.readAllBytes();
} catch (final IOException e) {
throw new UncheckedIOException(e);
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/Pause.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/Pause.java
similarity index 87%
rename from gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/Pause.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/Pause.java
index 7ae2a53..313eafc 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/Pause.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/Pause.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.modules.gui;
+package com.github.gtache.autosubtitle.modules.gui.impl;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
diff --git a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/Play.java b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/Play.java
similarity index 87%
rename from gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/Play.java
rename to gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/Play.java
index ee82819..b035666 100644
--- a/gui/src/main/java/com/github/gtache/autosubtitle/modules/gui/Play.java
+++ b/gui/core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/Play.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.modules.gui;
+package com.github.gtache.autosubtitle.modules.gui.impl;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
diff --git a/gui/core/src/main/java/module-info.java b/gui/core/src/main/java/module-info.java
new file mode 100644
index 0000000..9b163ce
--- /dev/null
+++ b/gui/core/src/main/java/module-info.java
@@ -0,0 +1,24 @@
+import com.github.gtache.autosubtitle.gui.impl.spi.MainBundleProvider;
+import com.github.gtache.autosubtitle.gui.impl.spi.MainBundleProviderImpl;
+import com.github.gtache.autosubtitle.gui.impl.spi.ParametersBundleProvider;
+import com.github.gtache.autosubtitle.gui.impl.spi.ParametersBundleProviderImpl;
+import com.github.gtache.autosubtitle.gui.impl.spi.SetupBundleProvider;
+import com.github.gtache.autosubtitle.gui.impl.spi.SetupBundleProviderImpl;
+import com.github.gtache.autosubtitle.gui.impl.spi.WorkBundleProvider;
+import com.github.gtache.autosubtitle.gui.impl.spi.WorkBundleProviderImpl;
+
+/**
+ * Core gui module for autosubtitle
+ */
+module com.github.gtache.autosubtitle.gui.core {
+ requires transitive com.github.gtache.autosubtitle.gui.api;
+ requires transitive com.github.gtache.autosubtitle.core;
+ exports com.github.gtache.autosubtitle.gui.impl;
+ exports com.github.gtache.autosubtitle.gui.impl.spi;
+ exports com.github.gtache.autosubtitle.modules.gui.impl;
+
+ provides MainBundleProvider with MainBundleProviderImpl;
+ provides ParametersBundleProvider with ParametersBundleProviderImpl;
+ provides SetupBundleProvider with SetupBundleProviderImpl;
+ provides WorkBundleProvider with WorkBundleProviderImpl;
+}
\ No newline at end of file
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/MainBundle.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/MainBundle.properties
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/MainBundle.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/MainBundle.properties
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/MainBundle_fr.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/MainBundle_fr.properties
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/MainBundle_fr.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/MainBundle_fr.properties
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/MediaBundle.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/MediaBundle.properties
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/MediaBundle.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/MediaBundle.properties
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/MediaBundle_fr.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/MediaBundle_fr.properties
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/MediaBundle_fr.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/MediaBundle_fr.properties
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/ParametersBundle.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/ParametersBundle.properties
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/ParametersBundle.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/ParametersBundle.properties
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/ParametersBundle_fr.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/ParametersBundle_fr.properties
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/ParametersBundle_fr.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/ParametersBundle_fr.properties
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/SetupBundle.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/SetupBundle.properties
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/SetupBundle.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/SetupBundle.properties
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/SetupBundle_fr.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/SetupBundle_fr.properties
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/SetupBundle_fr.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/SetupBundle_fr.properties
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/WorkBundle.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/WorkBundle.properties
similarity index 65%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/WorkBundle.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/WorkBundle.properties
index fe73be3..51db763 100644
--- a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/WorkBundle.properties
+++ b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/WorkBundle.properties
@@ -4,14 +4,22 @@ work.button.export.soft.label=Export video...
work.button.export.soft.tooltip=Adds the subtitles to the video. This allows a video to have multiple subtitles and to enable them at will.
work.button.extract.label=Extract subtitles
work.button.file.label=Open video...
+work.button.load.label=Load subtitles...
work.button.reset.label=Reset subtitles
+work.button.subtitles.save.label=Save subtitles...
work.export.error.label=Error during the export : {0}
work.export.error.title=Error exporting
work.extract.error.label=Error extracting subtitles : {0}
work.extract.error.title=Error extracting
work.language.label=Video language
-work.load.error.label=Error loading video : {0}
-work.load.error.title=Error loading
+work.load.subtitles.error.label=Error loading subtitles : {0}
+work.load.subtitles.error.title=Error loading
+work.load.video.error.label=Error loading video : {0}
+work.load.video.error.title=Error loading
+work.save.subtitles.error.label=Error saving subtitles : {0}
+work.save.subtitles.error.title=Error saving
+work.save.subtitles.missing.converter.label=No converter found for {0}
+work.save.subtitles.missing.converter.title=No converter found
work.status.exporting.label=Exporting...
work.status.extracting.label=Extracting...
work.status.idle.label=Idle
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/WorkBundle_fr.properties b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/WorkBundle_fr.properties
similarity index 70%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/WorkBundle_fr.properties
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/WorkBundle_fr.properties
index d07230c..00fb672 100644
--- a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/WorkBundle_fr.properties
+++ b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/WorkBundle_fr.properties
@@ -4,14 +4,20 @@ work.button.export.soft.label=Exporter la vid\u00E9o...
work.button.export.soft.tooltip=Ajoute les sous-titres \u00E0 la vid\u00E9o. Cela permet d'avoir plusieurs pistes de sous-titres dans une m\u00EAme vid\u00E9o et de les activer comme d\u00E9sir\u00E9.
work.button.extract.label=Extraire les sous-titres
work.button.file.label=Ouvrir une vid\u00E9o...
+work.button.load.label=Charger des sous-titres...
work.button.reset.label=R\u00E9initialiser les sous-titres
+work.button.subtitles.save.label=Sauvegarder les sous-titres...
work.export.error.label=Erreur durant l''export : {0}
work.export.error.title=Erreur d'export
work.extract.error.label=Erreur durant l''extraction des sous-titres : {0}
work.extract.error.title=Erreur d'extraction
work.language.label=Language de la vid\u00E9o
-work.load.error.label=Erreur lors du chargement de la vid\u00E9o : {0}
-work.load.error.title=Erreur de chargement
+work.load.subtitles.error.label=Erreur de chargement des sous-titres : {0}
+work.load.subtitles.error.title=Erreur de chargement
+work.load.video.error.label=Erreur lors du chargement de la vid\u00E9o : {0}
+work.load.video.error.title=Erreur de chargement
+work.save.subtitles.missing.converter.label=Aucun convertisseur trouv\u00E9 pour {0}
+work.save.subtitles.missing.converter.title=Aucun convertisseur trouv\u00E9
work.status.exporting.label=Exportation en cours...
work.status.extracting.label=Extraction en cours...
work.status.idle.label=Idle
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/pause_64.png b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/pause_64.png
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/pause_64.png
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/pause_64.png
diff --git a/gui/src/main/resources/com/github/gtache/autosubtitle/gui/play_64.png b/gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/play_64.png
similarity index 100%
rename from gui/src/main/resources/com/github/gtache/autosubtitle/gui/play_64.png
rename to gui/core/src/main/resources/com/github/gtache/autosubtitle/gui/impl/play_64.png
diff --git a/fx/pom.xml b/gui/fx/pom.xml
similarity index 83%
rename from fx/pom.xml
rename to gui/fx/pom.xml
index f916ab0..05a4ad7 100644
--- a/fx/pom.xml
+++ b/gui/fx/pom.xml
@@ -5,24 +5,21 @@
4.0.0
com.github.gtache.autosubtitle
- autosubtitle
+ autosubtitle-gui
1.0-SNAPSHOT
autosubtitle-fx
+ 11.2.1
22.0.1
com.github.gtache.autosubtitle
- autosubtitle-gui
-
-
- com.github.gtache.autosubtitle
- autosubtitle-core
+ autosubtitle-gui-core
com.google.dagger
@@ -45,7 +42,7 @@
org.controlsfx
controlsfx
- 11.2.1
+ ${controlsfx.version}
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/AbstractFXController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/AbstractFXController.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/AbstractFXController.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/AbstractFXController.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/ColonTimeFormatter.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/ColonTimeFormatter.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/ColonTimeFormatter.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/ColonTimeFormatter.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainController.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainController.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainController.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainModel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainModel.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainModel.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainModel.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaBinder.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaBinder.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaBinder.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaBinder.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaController.java
similarity index 90%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaController.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaController.java
index 9ca0639..135a8b2 100644
--- a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaController.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaController.java
@@ -3,23 +3,28 @@ package com.github.gtache.autosubtitle.gui.fx;
import com.github.gtache.autosubtitle.gui.MediaController;
import com.github.gtache.autosubtitle.gui.TimeFormatter;
import com.github.gtache.autosubtitle.impl.FileVideoImpl;
-import com.github.gtache.autosubtitle.modules.gui.Pause;
-import com.github.gtache.autosubtitle.modules.gui.Play;
+import com.github.gtache.autosubtitle.modules.gui.impl.Pause;
+import com.github.gtache.autosubtitle.modules.gui.impl.Play;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
-import com.github.gtache.autosubtitle.subtitle.fx.SubtitleLabel;
+import com.github.gtache.autosubtitle.subtitle.gui.fx.SubtitleLabel;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.fxml.FXML;
+import javafx.geometry.Insets;
import javafx.scene.Cursor;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
+import javafx.scene.layout.Background;
+import javafx.scene.layout.BackgroundFill;
+import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
+import javafx.scene.paint.Color;
import javafx.util.Duration;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -102,9 +107,11 @@ public class FXMediaController implements MediaController {
player.currentTimeProperty().addListener((ignored, oldTime, newTime) -> {
final var millis = newTime.toMillis();
playSlider.setValue(millis);
+ stackPane.getChildren().removeIf(Label.class::isInstance);
model.subtitles().forEach(s -> {
- //TODO optimize
+ //TODO optimize using e.g. direction of playback
if (s.start() <= millis && s.end() >= millis) {
+ logger.info("Adding label {} at {}", s, millis);
final var label = createDraggableLabel(s);
stackPane.getChildren().add(label);
}
@@ -184,6 +191,8 @@ public class FXMediaController implements MediaController {
private static SubtitleLabel createDraggableLabel(final Subtitle subtitle) {
final var label = new SubtitleLabel(subtitle);
label.setOpacity(0.8);
+ label.setBackground(new Background(new BackgroundFill(Color.BLACK, CornerRadii.EMPTY, Insets.EMPTY)));
+ label.setTextFill(Color.WHITE);
label.setOnMousePressed(mouseEvent -> {
final var x = label.getLayoutX() - mouseEvent.getSceneX();
final var y = label.getLayoutY() - mouseEvent.getSceneY();
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaModel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaModel.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaModel.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaModel.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersController.java
similarity index 96%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersController.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersController.java
index f61e77b..e77035e 100644
--- a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersController.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersController.java
@@ -1,9 +1,9 @@
package com.github.gtache.autosubtitle.gui.fx;
import com.github.gtache.autosubtitle.gui.ParametersController;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModel;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModelProvider;
import com.github.gtache.autosubtitle.subtitle.OutputFormat;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersModel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersModel.java
similarity index 92%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersModel.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersModel.java
index dbaa438..ebd5a5b 100644
--- a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersModel.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersModel.java
@@ -1,11 +1,11 @@
package com.github.gtache.autosubtitle.gui.fx;
import com.github.gtache.autosubtitle.gui.ParametersModel;
-import com.github.gtache.autosubtitle.modules.gui.FontFamily;
-import com.github.gtache.autosubtitle.modules.gui.FontSize;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModel;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModelProvider;
+import com.github.gtache.autosubtitle.modules.gui.impl.FontFamily;
+import com.github.gtache.autosubtitle.modules.gui.impl.FontSize;
import com.github.gtache.autosubtitle.subtitle.OutputFormat;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupController.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupController.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupController.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupModel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupModel.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupModel.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupModel.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkBinder.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkBinder.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkBinder.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkBinder.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkController.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkController.java
similarity index 73%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkController.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkController.java
index 1e0621d..eb796cb 100644
--- a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkController.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkController.java
@@ -8,12 +8,14 @@ import com.github.gtache.autosubtitle.gui.TimeFormatter;
import com.github.gtache.autosubtitle.gui.WorkController;
import com.github.gtache.autosubtitle.gui.WorkStatus;
import com.github.gtache.autosubtitle.subtitle.EditableSubtitle;
-import com.github.gtache.autosubtitle.subtitle.ExtractEvent;
-import com.github.gtache.autosubtitle.subtitle.ExtractException;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import com.github.gtache.autosubtitle.subtitle.SubtitleExtractor;
-import com.github.gtache.autosubtitle.subtitle.SubtitleExtractorListener;
-import com.github.gtache.autosubtitle.subtitle.fx.ObservableSubtitleImpl;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractException;
+import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
+import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractorListener;
+import com.github.gtache.autosubtitle.subtitle.gui.fx.ObservableSubtitleImpl;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleObjectProperty;
@@ -37,9 +39,11 @@ import org.controlsfx.control.PrefixSelectionComboBox;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.IOException;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.text.MessageFormat;
import java.util.List;
+import java.util.Map;
import java.util.ResourceBundle;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
@@ -63,6 +67,8 @@ public class FXWorkController extends AbstractFXController implements WorkContro
@FXML
private TextField fileField;
@FXML
+ private Button loadSubtitlesButton;
+ @FXML
private Button extractButton;
@FXML
private Button resetButton;
@@ -81,6 +87,8 @@ public class FXWorkController extends AbstractFXController implements WorkContro
@FXML
private FXMediaController mediaController;
@FXML
+ private Button saveSubtitlesButton;
+ @FXML
private Button addSubtitleButton;
@FXML
private PrefixSelectionComboBox languageCombobox;
@@ -98,22 +106,27 @@ public class FXWorkController extends AbstractFXController implements WorkContro
private final FXWorkModel model;
private final FXWorkBinder binder;
private final SubtitleExtractor subtitleExtractor;
+ private final Map subtitleConvertersMap;
private final VideoConverter videoConverter;
private final VideoLoader videoLoader;
private final Translator translator;
private final TimeFormatter timeFormatter;
+ private final List subtitleExtensions;
@Inject
- FXWorkController(final FXWorkModel model, final FXWorkBinder binder, final SubtitleExtractor subtitleExtractor, final VideoLoader videoLoader,
+ FXWorkController(final FXWorkModel model, final FXWorkBinder binder, final SubtitleExtractor subtitleExtractor,
+ final Map subtitleConvertersMap, final VideoLoader videoLoader,
final VideoConverter videoConverter, final Translator translator, final TimeFormatter timeFormatter) {
this.model = requireNonNull(model);
this.binder = requireNonNull(binder);
this.subtitleExtractor = requireNonNull(subtitleExtractor);
+ this.subtitleConvertersMap = requireNonNull(subtitleConvertersMap);
this.videoConverter = requireNonNull(videoConverter);
this.videoLoader = requireNonNull(videoLoader);
this.translator = requireNonNull(translator);
this.timeFormatter = requireNonNull(timeFormatter);
+ this.subtitleExtensions = subtitleConvertersMap.values().stream().map(c -> "*." + c.formatName()).sorted().toList();
}
@FXML
@@ -126,10 +139,12 @@ public class FXWorkController extends AbstractFXController implements WorkContro
Bindings.bindContent(model.translations(), translationsCombobox.getCheckModel().getCheckedItems());
extractButton.disableProperty().bind(model.videoProperty().isNull().or(model.statusProperty().isNotEqualTo(WorkStatus.IDLE)));
- resetButton.disableProperty().bind(Bindings.isEmpty(model.subtitles()));
+ loadSubtitlesButton.disableProperty().bind(model.videoProperty().isNull().or(model.statusProperty().isNotEqualTo(WorkStatus.IDLE)));
+ resetButton.disableProperty().bind(Bindings.isEmpty(model.subtitles()).or(model.statusProperty().isNotEqualTo(WorkStatus.IDLE)));
exportSoftButton.disableProperty().bind(Bindings.isEmpty(model.subtitles()).or(model.statusProperty().isNotEqualTo(WorkStatus.IDLE)));
exportHardButton.disableProperty().bind(Bindings.isEmpty(model.subtitles()).or(model.statusProperty().isNotEqualTo(WorkStatus.IDLE)));
- addSubtitleButton.disableProperty().bind(model.videoProperty().isNull());
+ addSubtitleButton.disableProperty().bind(Bindings.isEmpty(model.subtitles()).or(model.statusProperty().isNotEqualTo(WorkStatus.IDLE)));
+ loadSubtitlesButton.disableProperty().bind(Bindings.isEmpty(model.subtitles()).or(model.statusProperty().isNotEqualTo(WorkStatus.IDLE)));
subtitlesTable.setItems(model.subtitles());
subtitlesTable.setOnKeyPressed(e -> {
@@ -150,6 +165,7 @@ public class FXWorkController extends AbstractFXController implements WorkContro
final var subtitle = e.getRowValue();
subtitle.setStart(e.getNewValue());
subtitlesTable.refresh();
+ subtitlesTable.requestFocus();
});
endColumn.setCellFactory(TextFieldTableCell.forTableColumn(new TimeStringConverter(timeFormatter)));
endColumn.setCellValueFactory(param -> new SimpleObjectProperty<>(param.getValue() == null ? null : param.getValue().end()));
@@ -157,6 +173,7 @@ public class FXWorkController extends AbstractFXController implements WorkContro
final var subtitle = e.getRowValue();
subtitle.setEnd(e.getNewValue());
subtitlesTable.refresh();
+ subtitlesTable.requestFocus();
});
textColumn.setCellFactory(TextFieldTableCell.forTableColumn());
textColumn.setCellValueFactory(param -> new SimpleStringProperty(param.getValue() == null ? null : param.getValue().content()));
@@ -164,6 +181,7 @@ public class FXWorkController extends AbstractFXController implements WorkContro
final var subtitle = e.getRowValue();
subtitle.setContent(e.getNewValue());
subtitlesTable.refresh();
+ subtitlesTable.requestFocus();
});
subtitlesTable.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> model.selectedSubtitleProperty().set(newValue));
@@ -222,12 +240,7 @@ public class FXWorkController extends AbstractFXController implements WorkContro
private void manageExtractResult(final SubtitleCollection newCollection, final Throwable t) {
if (t == null) {
- final var newSubtitles = newCollection.subtitles().stream().map(ObservableSubtitleImpl::new).toList();
- final var subtitlesCopy = newSubtitles.stream().map(ObservableSubtitleImpl::new).toList();
- model.subtitles().setAll(newSubtitles);
- model.originalSubtitles().clear();
- model.originalSubtitles().addAll(subtitlesCopy);
- model.videoLanguageProperty().set(newCollection.language());
+ loadCollection(newCollection);
} else {
logger.error("Error extracting subtitles", t);
showErrorDialog(resources.getString("work.extract.error.title"), MessageFormat.format(resources.getString("work.extract.error.label"), t.getMessage()));
@@ -243,10 +256,50 @@ public class FXWorkController extends AbstractFXController implements WorkContro
model.videoProperty().set(loadedVideo);
} catch (final IOException e) {
logger.error("Error loading video {}", file, e);
- showErrorDialog(resources.getString("work.load.error.title"), MessageFormat.format(resources.getString("work.load.error.label"), e.getMessage()));
+ showErrorDialog(resources.getString("work.load.video.error.title"), MessageFormat.format(resources.getString("work.load.video.error.label"), e.getMessage()));
}
}
+ @Override
+ public void saveSubtitles(final Path file) {
+ final var fileName = file.getFileName().toString();
+ final var converter = subtitleConvertersMap.get(fileName.substring(fileName.lastIndexOf('.') + 1));
+ if (converter == null) {
+ logger.warn("No converter for {}", file);
+ showErrorDialog(resources.getString("work.save.subtitles.missing.converter.title"), MessageFormat.format(resources.getString("work.save.subtitles.missing.converter.label"), file.getFileName()));
+ } else {
+ final var string = converter.format(model.subtitleCollection());
+ try {
+ Files.writeString(file, string);
+ } catch (final IOException e) {
+ logger.error("Error saving subtitles {}", file, e);
+ showErrorDialog(resources.getString("work.save.subtitles.error.title"), MessageFormat.format(resources.getString("work.save.subtitles.error.label"), e.getMessage()));
+ }
+ }
+ }
+
+ @Override
+ public void loadSubtitles(final Path file) {
+ final var fileName = file.getFileName().toString();
+ final var parser = subtitleConvertersMap.get(fileName.substring(fileName.lastIndexOf('.') + 1));
+ if (parser != null) {
+ try {
+ final var collection = parser.parse(file);
+ loadCollection(collection);
+ } catch (final ParseException e) {
+ logger.error("Error loading subtitles {}", file, e);
+ showErrorDialog(resources.getString("work.load.subtitles.error.title"), MessageFormat.format(resources.getString("work.load.subtitles.error.label"), e.getMessage()));
+ }
+ }
+ }
+
+ private void loadCollection(final SubtitleCollection collection) {
+ model.subtitles().setAll(collection.subtitles().stream().map(ObservableSubtitleImpl::new).toList());
+ model.originalSubtitles().clear();
+ model.originalSubtitles().addAll(collection.subtitles().stream().map(ObservableSubtitleImpl::new).toList());
+ model.videoLanguageProperty().set(collection.language());
+ }
+
@FXML
private void exportSoftPressed() {
final var filePicker = new FileChooser();
@@ -329,4 +382,26 @@ public class FXWorkController extends AbstractFXController implements WorkContro
progressDetailLabel.setText(event.message());
});
}
+
+ @FXML
+ private void loadSubtitlesPressed() {
+ final var filePicker = new FileChooser();
+ final var extensionFilter = new FileChooser.ExtensionFilter("All supported", subtitleExtensions);
+ filePicker.getExtensionFilters().add(extensionFilter);
+ filePicker.setSelectedExtensionFilter(extensionFilter);
+ final var file = filePicker.showOpenDialog(window());
+ loadSubtitles(file.toPath());
+ }
+
+ @FXML
+ private void saveSubtitlesPressed() {
+ final var filePicker = new FileChooser();
+ final var extensionFilter = new FileChooser.ExtensionFilter("All supported", subtitleExtensions);
+ filePicker.getExtensionFilters().add(extensionFilter);
+ filePicker.setSelectedExtensionFilter(extensionFilter);
+ final var file = filePicker.showSaveDialog(window());
+ if (file != null) {
+ saveSubtitles(file.toPath());
+ }
+ }
}
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkModel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkModel.java
similarity index 98%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkModel.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkModel.java
index 239afc6..840355c 100644
--- a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkModel.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkModel.java
@@ -5,8 +5,8 @@ import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.gui.WorkModel;
import com.github.gtache.autosubtitle.gui.WorkStatus;
import com.github.gtache.autosubtitle.subtitle.EditableSubtitle;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModel;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleCollectionImpl;
import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/LanguageStringConverter.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/LanguageStringConverter.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/LanguageStringConverter.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/LanguageStringConverter.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/TimeStringConverter.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/TimeStringConverter.java
similarity index 100%
rename from fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/TimeStringConverter.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/gui/fx/TimeStringConverter.java
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/modules/gui/fx/FXModule.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/modules/gui/fx/FXModule.java
similarity index 95%
rename from fx/src/main/java/com/github/gtache/autosubtitle/modules/gui/fx/FXModule.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/modules/gui/fx/FXModule.java
index 46b0fa4..5027b9c 100644
--- a/fx/src/main/java/com/github/gtache/autosubtitle/modules/gui/fx/FXModule.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/modules/gui/fx/FXModule.java
@@ -7,8 +7,8 @@ import com.github.gtache.autosubtitle.gui.fx.FXMediaController;
import com.github.gtache.autosubtitle.gui.fx.FXParametersController;
import com.github.gtache.autosubtitle.gui.fx.FXSetupController;
import com.github.gtache.autosubtitle.gui.fx.FXWorkController;
-import com.github.gtache.autosubtitle.modules.gui.Pause;
-import com.github.gtache.autosubtitle.modules.gui.Play;
+import com.github.gtache.autosubtitle.modules.gui.impl.Pause;
+import com.github.gtache.autosubtitle.modules.gui.impl.Play;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/fx/ObservableSubtitleImpl.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/gui/fx/ObservableSubtitleImpl.java
similarity index 98%
rename from fx/src/main/java/com/github/gtache/autosubtitle/subtitle/fx/ObservableSubtitleImpl.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/gui/fx/ObservableSubtitleImpl.java
index 2772f26..6fa6b74 100644
--- a/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/fx/ObservableSubtitleImpl.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/gui/fx/ObservableSubtitleImpl.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.subtitle.fx;
+package com.github.gtache.autosubtitle.subtitle.gui.fx;
import com.github.gtache.autosubtitle.subtitle.Bounds;
import com.github.gtache.autosubtitle.subtitle.EditableSubtitle;
diff --git a/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/fx/SubtitleLabel.java b/gui/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/gui/fx/SubtitleLabel.java
similarity index 89%
rename from fx/src/main/java/com/github/gtache/autosubtitle/subtitle/fx/SubtitleLabel.java
rename to gui/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/gui/fx/SubtitleLabel.java
index 48f3fab..8fe43cd 100644
--- a/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/fx/SubtitleLabel.java
+++ b/gui/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/gui/fx/SubtitleLabel.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.subtitle.fx;
+package com.github.gtache.autosubtitle.subtitle.gui.fx;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import javafx.scene.control.Label;
@@ -16,6 +16,7 @@ public class SubtitleLabel extends Label {
public SubtitleLabel(final Subtitle subtitle) {
this.subtitle = Objects.requireNonNull(subtitle);
this.delta = new Delta();
+ setText(subtitle.content());
}
public Subtitle subtitle() {
diff --git a/fx/src/main/java/module-info.java b/gui/fx/src/main/java/module-info.java
similarity index 62%
rename from fx/src/main/java/module-info.java
rename to gui/fx/src/main/java/module-info.java
index 52934e4..8d5bf11 100644
--- a/fx/src/main/java/module-info.java
+++ b/gui/fx/src/main/java/module-info.java
@@ -1,13 +1,9 @@
-import com.github.gtache.autosubtitle.gui.spi.MainBundleProvider;
-import com.github.gtache.autosubtitle.gui.spi.SetupBundleProvider;
-import com.github.gtache.autosubtitle.gui.spi.WorkBundleProvider;
-
/**
* FX module for auto-subtitle
*/
module com.github.gtache.autosubtitle.fx {
requires transitive com.github.gtache.autosubtitle.core;
- requires transitive com.github.gtache.autosubtitle.gui;
+ requires transitive com.github.gtache.autosubtitle.gui.core;
requires transitive javafx.controls;
requires transitive javafx.media;
requires transitive javafx.fxml;
@@ -17,11 +13,6 @@ module com.github.gtache.autosubtitle.fx {
requires transitive java.prefs;
exports com.github.gtache.autosubtitle.gui.fx;
- opens com.github.gtache.autosubtitle.gui.fx to javafx.fxml;
-
exports com.github.gtache.autosubtitle.modules.gui.fx;
-
- uses MainBundleProvider;
- uses SetupBundleProvider;
- uses WorkBundleProvider;
+ opens com.github.gtache.autosubtitle.gui.fx to javafx.fxml;
}
\ No newline at end of file
diff --git a/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mainView.fxml b/gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mainView.fxml
similarity index 100%
rename from fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mainView.fxml
rename to gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mainView.fxml
diff --git a/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mediaView.fxml b/gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mediaView.fxml
similarity index 100%
rename from fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mediaView.fxml
rename to gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mediaView.fxml
diff --git a/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/parametersView.fxml b/gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/parametersView.fxml
similarity index 100%
rename from fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/parametersView.fxml
rename to gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/parametersView.fxml
diff --git a/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/setupView.fxml b/gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/setupView.fxml
similarity index 100%
rename from fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/setupView.fxml
rename to gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/setupView.fxml
diff --git a/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/workView.fxml b/gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/workView.fxml
similarity index 76%
rename from fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/workView.fxml
rename to gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/workView.fxml
index 07954b7..e6497a8 100644
--- a/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/workView.fxml
+++ b/gui/fx/src/main/resources/com/github/gtache/autosubtitle/gui/fx/workView.fxml
@@ -22,8 +22,14 @@
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
-
diff --git a/gui/pom.xml b/gui/pom.xml
index 3b9dcfb..96910ff 100644
--- a/gui/pom.xml
+++ b/gui/pom.xml
@@ -8,19 +8,33 @@
autosubtitle
1.0-SNAPSHOT
+ pom
+
+ api
+ core
+ fx
+ run
+
autosubtitle-gui
-
-
- com.github.gtache.autosubtitle
- autosubtitle-api
-
-
-
- com.google.dagger
- dagger
-
-
-
+
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-gui-api
+ ${project.version}
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-gui-core
+ ${project.version}
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-fx
+ ${project.version}
+
+
+
\ No newline at end of file
diff --git a/run/pom.xml b/gui/run/pom.xml
similarity index 92%
rename from run/pom.xml
rename to gui/run/pom.xml
index 4df3237..a84ce2e 100644
--- a/run/pom.xml
+++ b/gui/run/pom.xml
@@ -5,11 +5,11 @@
4.0.0
com.github.gtache.autosubtitle
- autosubtitle
+ autosubtitle-gui
1.0-SNAPSHOT
- autosubtitle-run
+ autosubtitle-gui-run
diff --git a/run/src/main/java/com/github/gtache/autosubtitle/modules/run/MissingComponentsModule.java b/gui/run/src/main/java/com/github/gtache/autosubtitle/modules/run/MissingComponentsModule.java
similarity index 100%
rename from run/src/main/java/com/github/gtache/autosubtitle/modules/run/MissingComponentsModule.java
rename to gui/run/src/main/java/com/github/gtache/autosubtitle/modules/run/MissingComponentsModule.java
diff --git a/run/src/main/java/com/github/gtache/autosubtitle/modules/run/NoOpSetupManager.java b/gui/run/src/main/java/com/github/gtache/autosubtitle/modules/run/NoOpSetupManager.java
similarity index 100%
rename from run/src/main/java/com/github/gtache/autosubtitle/modules/run/NoOpSetupManager.java
rename to gui/run/src/main/java/com/github/gtache/autosubtitle/modules/run/NoOpSetupManager.java
diff --git a/run/src/main/java/com/github/gtache/autosubtitle/modules/run/RunComponent.java b/gui/run/src/main/java/com/github/gtache/autosubtitle/modules/run/RunComponent.java
similarity index 65%
rename from run/src/main/java/com/github/gtache/autosubtitle/modules/run/RunComponent.java
rename to gui/run/src/main/java/com/github/gtache/autosubtitle/modules/run/RunComponent.java
index dab7768..945e185 100644
--- a/run/src/main/java/com/github/gtache/autosubtitle/modules/run/RunComponent.java
+++ b/gui/run/src/main/java/com/github/gtache/autosubtitle/modules/run/RunComponent.java
@@ -1,12 +1,12 @@
package com.github.gtache.autosubtitle.modules.run;
import com.github.gtache.autosubtitle.modules.ffmpeg.FFmpegModule;
-import com.github.gtache.autosubtitle.modules.gui.GuiModule;
import com.github.gtache.autosubtitle.modules.gui.fx.FXModule;
+import com.github.gtache.autosubtitle.modules.gui.impl.GuiCoreModule;
import com.github.gtache.autosubtitle.modules.impl.CoreModule;
import com.github.gtache.autosubtitle.modules.setup.ffmpeg.FFmpegSetupModule;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperSetupModule;
-import com.github.gtache.autosubtitle.modules.subtitles.impl.ConverterModule;
+import com.github.gtache.autosubtitle.modules.subtitle.impl.SubtitleModule;
import com.github.gtache.autosubtitle.modules.whisper.WhisperModule;
import dagger.Component;
import javafx.fxml.FXMLLoader;
@@ -17,8 +17,8 @@ import javax.inject.Singleton;
* Main component
*/
@Singleton
-@Component(modules = {CoreModule.class, GuiModule.class, FXModule.class, FFmpegModule.class, FFmpegSetupModule.class,
- ConverterModule.class, WhisperModule.class, WhisperSetupModule.class, MissingComponentsModule.class})
+@Component(modules = {CoreModule.class, GuiCoreModule.class, FXModule.class, FFmpegModule.class, FFmpegSetupModule.class,
+ SubtitleModule.class, WhisperModule.class, WhisperSetupModule.class, MissingComponentsModule.class})
public interface RunComponent {
/**
diff --git a/run/src/main/java/com/github/gtache/autosubtitle/run/Main.java b/gui/run/src/main/java/com/github/gtache/autosubtitle/run/Main.java
similarity index 100%
rename from run/src/main/java/com/github/gtache/autosubtitle/run/Main.java
rename to gui/run/src/main/java/com/github/gtache/autosubtitle/run/Main.java
diff --git a/run/src/main/java/module-info.java b/gui/run/src/main/java/module-info.java
similarity index 100%
rename from run/src/main/java/module-info.java
rename to gui/run/src/main/java/module-info.java
diff --git a/run/src/main/resources/log4j2.xml b/gui/run/src/main/resources/log4j2.xml
similarity index 100%
rename from run/src/main/resources/log4j2.xml
rename to gui/run/src/main/resources/log4j2.xml
diff --git a/gui/src/main/java/module-info.java b/gui/src/main/java/module-info.java
deleted file mode 100644
index e9f165b..0000000
--- a/gui/src/main/java/module-info.java
+++ /dev/null
@@ -1,26 +0,0 @@
-import com.github.gtache.autosubtitle.gui.spi.MainBundleProvider;
-import com.github.gtache.autosubtitle.gui.spi.MainBundleProviderImpl;
-import com.github.gtache.autosubtitle.gui.spi.ParametersBundleProvider;
-import com.github.gtache.autosubtitle.gui.spi.ParametersBundleProviderImpl;
-import com.github.gtache.autosubtitle.gui.spi.SetupBundleProvider;
-import com.github.gtache.autosubtitle.gui.spi.SetupBundleProviderImpl;
-import com.github.gtache.autosubtitle.gui.spi.WorkBundleProvider;
-import com.github.gtache.autosubtitle.gui.spi.WorkBundleProviderImpl;
-
-/**
- * GUI module for auto-subtitle
- */
-module com.github.gtache.autosubtitle.gui {
- requires transitive com.github.gtache.autosubtitle.api;
- requires transitive dagger;
- requires transitive javax.inject;
-
- exports com.github.gtache.autosubtitle.gui;
- exports com.github.gtache.autosubtitle.gui.spi;
- exports com.github.gtache.autosubtitle.modules.gui;
-
- provides MainBundleProvider with MainBundleProviderImpl;
- provides ParametersBundleProvider with ParametersBundleProviderImpl;
- provides SetupBundleProvider with SetupBundleProviderImpl;
- provides WorkBundleProvider with WorkBundleProviderImpl;
-}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index e31fbb8..8873f13 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,14 +10,14 @@
pom
api
+ cli
+ client
core
deepl
ffmpeg
- fx
gui
- run
+ server
whisper
- cli
@@ -42,6 +42,11 @@
autosubtitle-cli
${project.version}
+
+ com.github.gtache.autosubtitle
+ autosubtitle-client
+ ${project.version}
+
com.github.gtache.autosubtitle
autosubtitle-core
@@ -57,11 +62,6 @@
autosubtitle-ffmpeg
${project.version}
-
- com.github.gtache.autosubtitle
- autosubtitle-fx
- ${project.version}
-
com.github.gtache.autosubtitle
autosubtitle-gui
@@ -69,7 +69,7 @@
com.github.gtache.autosubtitle
- autosubtitle-run
+ autosubtitle-server
${project.version}
diff --git a/server/pom.xml b/server/pom.xml
new file mode 100644
index 0000000..4c9db90
--- /dev/null
+++ b/server/pom.xml
@@ -0,0 +1,32 @@
+
+
+ 4.0.0
+
+ com.github.gtache.autosubtitle
+ autosubtitle
+ 1.0-SNAPSHOT
+
+
+ autosubtitle-server
+
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-core
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-deepl
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-ffmpeg
+
+
+ com.github.gtache.autosubtitle
+ autosubtitle-whisper
+
+
+
\ No newline at end of file
diff --git a/server/src/main/java/module-info.java b/server/src/main/java/module-info.java
new file mode 100644
index 0000000..e4811bb
--- /dev/null
+++ b/server/src/main/java/module-info.java
@@ -0,0 +1,9 @@
+/**
+ * Module for autosubtitle server
+ */
+module com.github.gtache.autosubtitle.server {
+ requires com.github.gtache.autosubtitle.core;
+ requires com.github.gtache.autosubtitle.deepl;
+ requires com.github.gtache.autosubtitle.ffmpeg;
+ requires com.github.gtache.autosubtitle.whisper;
+}
\ No newline at end of file
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/extractor/whisper/WhisperExtractorModule.java b/whisper/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/extractor/whisper/WhisperExtractorModule.java
new file mode 100644
index 0000000..3964457
--- /dev/null
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/extractor/whisper/WhisperExtractorModule.java
@@ -0,0 +1,16 @@
+package com.github.gtache.autosubtitle.modules.subtitle.extractor.whisper;
+
+import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
+import com.github.gtache.autosubtitle.subtitle.extractor.whisper.WhisperSubtitleExtractor;
+import dagger.Binds;
+import dagger.Module;
+
+/**
+ * Dagger module for Whisper
+ */
+@Module
+public abstract class WhisperExtractorModule {
+
+ @Binds
+ abstract SubtitleExtractor bindsSubtitleExtractor(final WhisperSubtitleExtractor extractor);
+}
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/parser/json/whisper/WhisperJsonModule.java b/whisper/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/parser/json/whisper/WhisperJsonModule.java
new file mode 100644
index 0000000..500f337
--- /dev/null
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/parser/json/whisper/WhisperJsonModule.java
@@ -0,0 +1,27 @@
+package com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisper;
+
+import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
+import com.github.gtache.autosubtitle.subtitle.parser.json.whisper.JSONSubtitleConverter;
+import com.google.gson.Gson;
+import dagger.Binds;
+import dagger.Module;
+import dagger.Provides;
+import dagger.multibindings.IntoMap;
+import dagger.multibindings.StringKey;
+
+import javax.inject.Singleton;
+
+@Module
+public abstract class WhisperJsonModule {
+
+ @Binds
+ @IntoMap
+ @StringKey("json")
+ abstract SubtitleConverter bindsJSONSubtitleConverter(final JSONSubtitleConverter subtitleConverter);
+
+ @Provides
+ @Singleton
+ static Gson providesGson() {
+ return new Gson();
+ }
+}
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/modules/whisper/WhisperModule.java b/whisper/src/main/java/com/github/gtache/autosubtitle/modules/whisper/WhisperModule.java
index aa3f22e..5fda442 100644
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/modules/whisper/WhisperModule.java
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/modules/whisper/WhisperModule.java
@@ -1,22 +1,18 @@
package com.github.gtache.autosubtitle.modules.whisper;
-import com.github.gtache.autosubtitle.modules.whisper.json.JsonModule;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModelProvider;
-import com.github.gtache.autosubtitle.subtitle.SubtitleExtractor;
+import com.github.gtache.autosubtitle.modules.subtitle.extractor.whisper.WhisperExtractorModule;
+import com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisper.WhisperJsonModule;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
import com.github.gtache.autosubtitle.whisper.WhisperExtractionModelProvider;
-import com.github.gtache.autosubtitle.whisper.WhisperSubtitleExtractor;
import dagger.Binds;
import dagger.Module;
/**
* Dagger module for Whisper
*/
-@Module(includes = JsonModule.class)
+@Module(includes = {WhisperJsonModule.class, WhisperExtractorModule.class})
public abstract class WhisperModule {
- @Binds
- abstract SubtitleExtractor bindsSubtitleExtractor(final WhisperSubtitleExtractor extractor);
-
@Binds
abstract ExtractionModelProvider bindsExtractionModelProvider(final WhisperExtractionModelProvider provider);
}
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/modules/whisper/json/JsonModule.java b/whisper/src/main/java/com/github/gtache/autosubtitle/modules/whisper/json/JsonModule.java
deleted file mode 100644
index 7fbd0ba..0000000
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/modules/whisper/json/JsonModule.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.github.gtache.autosubtitle.modules.whisper.json;
-
-import com.github.gtache.autosubtitle.whisper.SubtitleParser;
-import com.github.gtache.autosubtitle.whisper.json.JsonSubtitleParser;
-import com.google.gson.Gson;
-import dagger.Binds;
-import dagger.Module;
-import dagger.Provides;
-
-import javax.inject.Singleton;
-
-@Module
-public abstract class JsonModule {
-
- @Binds
- abstract SubtitleParser bindsSubtitleParser(final JsonSubtitleParser subtitleParser);
-
- @Provides
- @Singleton
- static Gson providesGson() {
- return new Gson();
- }
-}
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperSubtitleExtractor.java b/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/whisper/WhisperSubtitleExtractor.java
similarity index 81%
rename from whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperSubtitleExtractor.java
rename to whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/whisper/WhisperSubtitleExtractor.java
index 76a2692..22eb3bb 100644
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperSubtitleExtractor.java
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/extractor/whisper/WhisperSubtitleExtractor.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.whisper;
+package com.github.gtache.autosubtitle.subtitle.extractor.whisper;
import com.github.gtache.autosubtitle.Audio;
import com.github.gtache.autosubtitle.File;
@@ -7,13 +7,18 @@ import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperVenvPath;
import com.github.gtache.autosubtitle.process.impl.AbstractProcessRunner;
-import com.github.gtache.autosubtitle.subtitle.ExtractEvent;
-import com.github.gtache.autosubtitle.subtitle.ExtractException;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModel;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-import com.github.gtache.autosubtitle.subtitle.SubtitleExtractor;
-import com.github.gtache.autosubtitle.subtitle.SubtitleExtractorListener;
-import com.github.gtache.autosubtitle.subtitle.impl.ExtractEventImpl;
+import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractException;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
+import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractorListener;
+import com.github.gtache.autosubtitle.subtitle.extractor.impl.ExtractEventImpl;
+import com.github.gtache.autosubtitle.whisper.WhisperModels;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -23,6 +28,7 @@ import java.nio.file.Path;
import java.time.Duration;
import java.util.ArrayList;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
@@ -34,16 +40,17 @@ import static java.util.Objects.requireNonNull;
@Singleton
public class WhisperSubtitleExtractor extends AbstractProcessRunner implements SubtitleExtractor {
+ private static final Logger logger = LogManager.getLogger(WhisperSubtitleExtractor.class);
private static final Pattern LINE_PROGRESS_PATTERN = Pattern.compile("^\\[\\d{2}:\\d{2}\\.\\d{3} --> (?\\d{2}):(?\\d{2})\\.(?\\d{3})]");
private final Path venvPath;
- private final SubtitleParser parser;
+ private final SubtitleConverter converter;
private final OS os;
private final Set listeners;
@Inject
- WhisperSubtitleExtractor(@WhisperVenvPath final Path venvPath, final SubtitleParser parser, final OS os) {
+ WhisperSubtitleExtractor(@WhisperVenvPath final Path venvPath, final Map converters, final OS os) {
this.venvPath = requireNonNull(venvPath);
- this.parser = requireNonNull(parser);
+ this.converter = requireNonNull(converters.get("json"));
this.os = requireNonNull(os);
this.listeners = new HashSet<>();
}
@@ -113,6 +120,7 @@ public class WhisperSubtitleExtractor extends AbstractProcessRunner implements S
var line = processListener.readLine();
var oldProgress = -1.0;
while (line != null) {
+ logger.info("Whisper output : {}", line);
final var newProgress = computeProgress(line, duration, oldProgress);
notifyListeners(new ExtractEventImpl(line, newProgress));
oldProgress = newProgress;
@@ -123,7 +131,11 @@ public class WhisperSubtitleExtractor extends AbstractProcessRunner implements S
final var filename = path.getFileName().toString();
final var subtitleFilename = filename.substring(0, filename.lastIndexOf('.')) + ".json";
final var subtitleFile = outputDir.resolve(subtitleFilename);
- return parser.parse(subtitleFile);
+ try {
+ return converter.parse(subtitleFile);
+ } catch (final ParseException e) {
+ throw new ExtractException(e);
+ }
} else {
throw new ExtractException("Error extracting subtitles: " + result.output());
}
@@ -132,7 +144,7 @@ public class WhisperSubtitleExtractor extends AbstractProcessRunner implements S
}
}
- private double computeProgress(final CharSequence line, final long duration, final double oldProgress) {
+ private static double computeProgress(final CharSequence line, final long duration, final double oldProgress) {
final var matcher = LINE_PROGRESS_PATTERN.matcher(line);
if (matcher.find()) {
final var minutes = Integer.parseInt(matcher.group("minutes"));
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitleConverter.java b/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitleConverter.java
new file mode 100644
index 0000000..bd67454
--- /dev/null
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitleConverter.java
@@ -0,0 +1,75 @@
+package com.github.gtache.autosubtitle.subtitle.parser.json.whisper;
+
+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.subtitle.converter.ParseException;
+import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
+import com.github.gtache.autosubtitle.subtitle.impl.SubtitleCollectionImpl;
+import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
+import com.google.gson.Gson;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import java.nio.file.Path;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * {@link SubtitleConverter} implementation for JSON files
+ */
+@Singleton
+public class JSONSubtitleConverter implements SubtitleConverter {
+
+ private static final Logger logger = LogManager.getLogger(JSONSubtitleConverter.class);
+ private final Gson gson;
+
+ @Inject
+ JSONSubtitleConverter(final Gson gson) {
+ this.gson = Objects.requireNonNull(gson);
+ }
+
+ @Override
+ public String format(final SubtitleCollection collection) {
+ final var id = new AtomicInteger(0);
+ final var segments = collection.subtitles().stream().map(s -> new JSONSubtitleSegment(id.incrementAndGet(), 0, s.start() / (double) 1000,
+ s.end() / (double) 1000, s.content(), List.of(), 0, 0, 0, 0)).toList();
+ final var subtitles = new JSONSubtitles(collection.text(), segments, collection.language().iso2());
+ return gson.toJson(subtitles);
+ }
+
+ @Override
+ public SubtitleCollection parse(final String content) throws ParseException {
+ try {
+ final var json = gson.fromJson(content, JSONSubtitles.class);
+ final var subtitles = json.segments().stream().map(s -> {
+ final var start = (long) s.start() * 1000L;
+ final var end = (long) s.end() * 1000L;
+ return new SubtitleImpl(s.text(), start, end, null, null);
+ }).sorted(Comparator.comparing(Subtitle::start).thenComparing(Subtitle::end)).toList();
+ final var language = Language.getLanguage(json.language());
+ final var subtitlesText = subtitles.stream().map(Subtitle::content).collect(Collectors.joining(" "));
+ if (!Objects.equals(json.text(), subtitlesText)) {
+ logger.warn("Not same text: {}\n\n{}", json.text(), subtitlesText);
+ }
+ return new SubtitleCollectionImpl(json.text(), subtitles, language);
+ } catch (final Exception e) {
+ throw new ParseException(e);
+ }
+ }
+
+ @Override
+ public boolean canParse(final Path file) {
+ return file.getFileName().toString().endsWith(".json");
+ }
+
+ @Override
+ public String formatName() {
+ return "json";
+ }
+}
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JSONSubtitleSegment.java b/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitleSegment.java
similarity index 81%
rename from whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JSONSubtitleSegment.java
rename to whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitleSegment.java
index 2d44375..878e02c 100644
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JSONSubtitleSegment.java
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitleSegment.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.whisper.json;
+package com.github.gtache.autosubtitle.subtitle.parser.json.whisper;
import java.util.List;
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JSONSubtitles.java b/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitles.java
similarity index 64%
rename from whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JSONSubtitles.java
rename to whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitles.java
index 731bd72..e6a4e21 100644
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JSONSubtitles.java
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitles.java
@@ -1,4 +1,4 @@
-package com.github.gtache.autosubtitle.whisper.json;
+package com.github.gtache.autosubtitle.subtitle.parser.json.whisper;
import java.util.List;
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/SubtitleParser.java b/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/SubtitleParser.java
deleted file mode 100644
index dd1a6a6..0000000
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/SubtitleParser.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.github.gtache.autosubtitle.whisper;
-
-import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
-
-import java.io.IOException;
-import java.nio.file.Path;
-
-public interface SubtitleParser {
-
- SubtitleCollection parse(String text);
-
- SubtitleCollection parse(Path file) throws IOException;
-}
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperExtractionModelProvider.java b/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperExtractionModelProvider.java
index 34b001b..5957f53 100644
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperExtractionModelProvider.java
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperExtractionModelProvider.java
@@ -1,7 +1,7 @@
package com.github.gtache.autosubtitle.whisper;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModel;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModelProvider;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
import javax.inject.Inject;
import javax.inject.Singleton;
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperModels.java b/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperModels.java
index 40a46a3..cad7854 100644
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperModels.java
+++ b/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/WhisperModels.java
@@ -1,6 +1,6 @@
package com.github.gtache.autosubtitle.whisper;
-import com.github.gtache.autosubtitle.subtitle.ExtractionModel;
+import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModel;
/**
* Whisper models
diff --git a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JsonSubtitleParser.java b/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JsonSubtitleParser.java
deleted file mode 100644
index a98470d..0000000
--- a/whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JsonSubtitleParser.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.github.gtache.autosubtitle.whisper.json;
-
-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.subtitle.impl.SubtitleCollectionImpl;
-import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
-import com.github.gtache.autosubtitle.whisper.SubtitleParser;
-import com.google.gson.Gson;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Comparator;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-@Singleton
-public class JsonSubtitleParser implements SubtitleParser {
-
- private static final Logger logger = LogManager.getLogger(JsonSubtitleParser.class);
- private final Gson gson;
-
- @Inject
- JsonSubtitleParser(final Gson gson) {
- this.gson = Objects.requireNonNull(gson);
- }
-
- @Override
- public SubtitleCollection parse(final Path file) throws IOException {
- final var content = Files.readString(file);
- return parse(content);
- }
-
- @Override
- public SubtitleCollection parse(final String text) {
- final var json = gson.fromJson(text, JSONSubtitles.class);
- final var subtitles = json.segments().stream().map(s -> {
- final var start = (long) s.start() * 1000L;
- final var end = (long) s.end() * 1000L;
- return new SubtitleImpl(s.text(), start, end, null, null);
- }).sorted(Comparator.comparing(Subtitle::start).thenComparing(Subtitle::end)).toList();
- final var language = Language.getLanguage(json.language());
- final var subtitlesText = subtitles.stream().map(Subtitle::content).collect(Collectors.joining(" "));
- if (!Objects.equals(json.text(), subtitlesText)) {
- logger.warn("Not same text: {} vs {}", json.text(), subtitlesText);
- }
- return new SubtitleCollectionImpl(json.text(), subtitles, language);
- }
-}
diff --git a/whisper/src/main/java/module-info.java b/whisper/src/main/java/module-info.java
index eee4610..7498da7 100644
--- a/whisper/src/main/java/module-info.java
+++ b/whisper/src/main/java/module-info.java
@@ -9,9 +9,11 @@ module com.github.gtache.autosubtitle.whisper {
requires transitive java.compiler; //Don't know why dagger generates @Generated here, need to debug
exports com.github.gtache.autosubtitle.whisper;
- exports com.github.gtache.autosubtitle.whisper.json;
exports com.github.gtache.autosubtitle.setup.whisper;
exports com.github.gtache.autosubtitle.modules.whisper;
- exports com.github.gtache.autosubtitle.modules.whisper.json;
exports com.github.gtache.autosubtitle.modules.setup.whisper;
+ exports com.github.gtache.autosubtitle.subtitle.extractor.whisper;
+ exports com.github.gtache.autosubtitle.modules.subtitle.extractor.whisper;
+ exports com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisper;
+ exports com.github.gtache.autosubtitle.subtitle.parser.json.whisper;
}
\ No newline at end of file