From c2efb711950bb9bc58189791ca412d6fd4c68184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillaume=20T=C3=A2che?= Date: Tue, 6 Aug 2024 20:03:19 +0200 Subject: [PATCH] Moves some modules and files, adds save subtitles --- .idea/csv-editor.xml | 219 ++++++++++++++++++ .idea/encodings.xml | 16 +- .../subtitle/SubtitleCollection.java | 5 + .../subtitle/SubtitleConverter.java | 20 -- .../subtitle/converter/ParseException.java | 19 ++ .../subtitle/converter/SubtitleConverter.java | 62 +++++ .../{ => extractor}/ExtractEvent.java | 2 +- .../{ => extractor}/ExtractException.java | 2 +- .../{ => extractor}/ExtractionModel.java | 2 +- .../ExtractionModelProvider.java | 2 +- .../{ => extractor}/SubtitleExtractor.java | 3 +- .../SubtitleExtractorListener.java | 2 +- api/src/main/java/module-info.java | 2 + .../modules/cli/CliComponent.java | 11 +- client/pom.xml | 21 ++ client/src/main/java/module-info.java | 6 + .../modules/subtitle/impl/SubtitleModule.java | 20 ++ .../subtitles/impl/ConverterModule.java | 16 -- .../converter/impl/SRTSubtitleConverter.java | 79 +++++++ .../impl/AbstractSubtitleExtractor.java | 8 +- .../impl/ExtractEventImpl.java | 6 +- .../subtitle/impl/SRTSubtitleConverter.java | 37 --- core/src/main/java/module-info.java | 4 +- .../ffmpeg/FFmpegVideoConverter.java | 9 +- gui/api/pom.xml | 21 ++ .../autosubtitle/gui/MainController.java | 0 .../gtache/autosubtitle/gui/MainModel.java | 0 .../autosubtitle/gui/MediaController.java | 0 .../gtache/autosubtitle/gui/MediaModel.java | 0 .../gui/ParametersController.java | 0 .../autosubtitle/gui/ParametersModel.java | 2 +- .../autosubtitle/gui/SetupController.java | 0 .../gtache/autosubtitle/gui/SetupModel.java | 0 .../autosubtitle/gui/TimeFormatter.java | 0 .../autosubtitle/gui/WorkController.java | 14 ++ .../gtache/autosubtitle/gui/WorkModel.java | 2 +- .../gtache/autosubtitle/gui/WorkStatus.java | 0 gui/api/src/main/java/module-info.java | 7 + gui/core/pom.xml | 29 +++ .../gui/impl}/CombinedResourceBundle.java | 2 +- .../gui/impl}/spi/MainBundleProvider.java | 2 +- .../gui/impl}/spi/MainBundleProviderImpl.java | 2 +- .../impl}/spi/ParametersBundleProvider.java | 2 +- .../spi/ParametersBundleProviderImpl.java | 2 +- .../gui/impl}/spi/SetupBundleProvider.java | 2 +- .../impl}/spi/SetupBundleProviderImpl.java | 2 +- .../gui/impl}/spi/WorkBundleProvider.java | 2 +- .../gui/impl}/spi/WorkBundleProviderImpl.java | 2 +- .../modules/gui/impl}/FontFamily.java | 2 +- .../modules/gui/impl}/FontSize.java | 2 +- .../modules/gui/impl/GuiCoreModule.java} | 20 +- .../autosubtitle/modules/gui/impl}/Pause.java | 2 +- .../autosubtitle/modules/gui/impl}/Play.java | 2 +- gui/core/src/main/java/module-info.java | 24 ++ .../gui/impl}/MainBundle.properties | 0 .../gui/impl}/MainBundle_fr.properties | 0 .../gui/impl}/MediaBundle.properties | 0 .../gui/impl}/MediaBundle_fr.properties | 0 .../gui/impl}/ParametersBundle.properties | 0 .../gui/impl}/ParametersBundle_fr.properties | 0 .../gui/impl}/SetupBundle.properties | 0 .../gui/impl}/SetupBundle_fr.properties | 0 .../gui/impl}/WorkBundle.properties | 12 +- .../gui/impl}/WorkBundle_fr.properties | 10 +- .../autosubtitle/gui/impl}/pause_64.png | Bin .../gtache/autosubtitle/gui/impl}/play_64.png | Bin {fx => gui/fx}/pom.xml | 11 +- .../gui/fx/AbstractFXController.java | 0 .../gui/fx/ColonTimeFormatter.java | 0 .../autosubtitle/gui/fx/FXMainController.java | 0 .../autosubtitle/gui/fx/FXMainModel.java | 0 .../autosubtitle/gui/fx/FXMediaBinder.java | 0 .../gui/fx/FXMediaController.java | 17 +- .../autosubtitle/gui/fx/FXMediaModel.java | 0 .../gui/fx/FXParametersController.java | 4 +- .../gui/fx/FXParametersModel.java | 8 +- .../gui/fx/FXSetupController.java | 0 .../autosubtitle/gui/fx/FXSetupModel.java | 0 .../autosubtitle/gui/fx/FXWorkBinder.java | 0 .../autosubtitle/gui/fx/FXWorkController.java | 105 +++++++-- .../autosubtitle/gui/fx/FXWorkModel.java | 2 +- .../gui/fx/LanguageStringConverter.java | 0 .../gui/fx/TimeStringConverter.java | 0 .../autosubtitle/modules/gui/fx/FXModule.java | 4 +- .../gui}/fx/ObservableSubtitleImpl.java | 2 +- .../subtitle/gui}/fx/SubtitleLabel.java | 3 +- {fx => gui/fx}/src/main/java/module-info.java | 13 +- .../gtache/autosubtitle/gui/fx/mainView.fxml | 0 .../gtache/autosubtitle/gui/fx/mediaView.fxml | 0 .../autosubtitle/gui/fx/parametersView.fxml | 0 .../gtache/autosubtitle/gui/fx/setupView.fxml | 0 .../gtache/autosubtitle/gui/fx/workView.fxml | 26 ++- gui/pom.xml | 38 ++- {run => gui/run}/pom.xml | 4 +- .../modules/run/MissingComponentsModule.java | 0 .../modules/run/NoOpSetupManager.java | 0 .../modules/run/RunComponent.java | 8 +- .../github/gtache/autosubtitle/run/Main.java | 0 .../run}/src/main/java/module-info.java | 0 .../run}/src/main/resources/log4j2.xml | 0 gui/src/main/java/module-info.java | 26 --- pom.xml | 18 +- server/pom.xml | 32 +++ server/src/main/java/module-info.java | 9 + .../whisper/WhisperExtractorModule.java | 16 ++ .../json/whisper/WhisperJsonModule.java | 27 +++ .../modules/whisper/WhisperModule.java | 12 +- .../modules/whisper/json/JsonModule.java | 23 -- .../whisper/WhisperSubtitleExtractor.java | 36 ++- .../json/whisper/JSONSubtitleConverter.java | 75 ++++++ .../json/whisper}/JSONSubtitleSegment.java | 2 +- .../parser/json/whisper}/JSONSubtitles.java | 2 +- .../autosubtitle/whisper/SubtitleParser.java | 13 -- .../WhisperExtractionModelProvider.java | 4 +- .../autosubtitle/whisper/WhisperModels.java | 2 +- .../whisper/json/JsonSubtitleParser.java | 54 ----- whisper/src/main/java/module-info.java | 6 +- 117 files changed, 989 insertions(+), 353 deletions(-) create mode 100644 .idea/csv-editor.xml delete mode 100644 api/src/main/java/com/github/gtache/autosubtitle/subtitle/SubtitleConverter.java create mode 100644 api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/ParseException.java create mode 100644 api/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/SubtitleConverter.java rename api/src/main/java/com/github/gtache/autosubtitle/subtitle/{ => extractor}/ExtractEvent.java (80%) rename api/src/main/java/com/github/gtache/autosubtitle/subtitle/{ => extractor}/ExtractException.java (87%) rename api/src/main/java/com/github/gtache/autosubtitle/subtitle/{ => extractor}/ExtractionModel.java (70%) rename api/src/main/java/com/github/gtache/autosubtitle/subtitle/{ => extractor}/ExtractionModelProvider.java (89%) rename api/src/main/java/com/github/gtache/autosubtitle/subtitle/{ => extractor}/SubtitleExtractor.java (94%) rename api/src/main/java/com/github/gtache/autosubtitle/subtitle/{ => extractor}/SubtitleExtractorListener.java (81%) create mode 100644 client/pom.xml create mode 100644 client/src/main/java/module-info.java create mode 100644 core/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/impl/SubtitleModule.java delete mode 100644 core/src/main/java/com/github/gtache/autosubtitle/modules/subtitles/impl/ConverterModule.java create mode 100644 core/src/main/java/com/github/gtache/autosubtitle/subtitle/converter/impl/SRTSubtitleConverter.java rename core/src/main/java/com/github/gtache/autosubtitle/subtitle/{ => extractor}/impl/AbstractSubtitleExtractor.java (76%) rename core/src/main/java/com/github/gtache/autosubtitle/subtitle/{ => extractor}/impl/ExtractEventImpl.java (51%) delete mode 100644 core/src/main/java/com/github/gtache/autosubtitle/subtitle/impl/SRTSubtitleConverter.java create mode 100644 gui/api/pom.xml rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/MainController.java (100%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/MainModel.java (100%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/MediaController.java (100%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/MediaModel.java (100%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/ParametersController.java (100%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/ParametersModel.java (94%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/SetupController.java (100%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/SetupModel.java (100%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/TimeFormatter.java (100%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/WorkController.java (60%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/WorkModel.java (96%) rename gui/{ => api}/src/main/java/com/github/gtache/autosubtitle/gui/WorkStatus.java (100%) create mode 100644 gui/api/src/main/java/module-info.java create mode 100644 gui/core/pom.xml rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/CombinedResourceBundle.java (94%) rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/spi/MainBundleProvider.java (74%) rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/spi/MainBundleProviderImpl.java (80%) rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/spi/ParametersBundleProvider.java (75%) rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/spi/ParametersBundleProviderImpl.java (81%) rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/spi/SetupBundleProvider.java (74%) rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/spi/SetupBundleProviderImpl.java (80%) rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/spi/WorkBundleProvider.java (74%) rename gui/{src/main/java/com/github/gtache/autosubtitle/gui => core/src/main/java/com/github/gtache/autosubtitle/gui/impl}/spi/WorkBundleProviderImpl.java (80%) rename gui/{src/main/java/com/github/gtache/autosubtitle/modules/gui => core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl}/FontFamily.java (87%) rename gui/{src/main/java/com/github/gtache/autosubtitle/modules/gui => core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl}/FontSize.java (87%) rename gui/{src/main/java/com/github/gtache/autosubtitle/modules/gui/GuiModule.java => core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl/GuiCoreModule.java} (67%) rename gui/{src/main/java/com/github/gtache/autosubtitle/modules/gui => core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl}/Pause.java (87%) rename gui/{src/main/java/com/github/gtache/autosubtitle/modules/gui => core/src/main/java/com/github/gtache/autosubtitle/modules/gui/impl}/Play.java (87%) create mode 100644 gui/core/src/main/java/module-info.java rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/MainBundle.properties (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/MainBundle_fr.properties (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/MediaBundle.properties (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/MediaBundle_fr.properties (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/ParametersBundle.properties (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/ParametersBundle_fr.properties (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/SetupBundle.properties (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/SetupBundle_fr.properties (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/WorkBundle.properties (65%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/WorkBundle_fr.properties (70%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/pause_64.png (100%) rename gui/{src/main/resources/com/github/gtache/autosubtitle/gui => core/src/main/resources/com/github/gtache/autosubtitle/gui/impl}/play_64.png (100%) rename {fx => gui/fx}/pom.xml (83%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/AbstractFXController.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/ColonTimeFormatter.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainController.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMainModel.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaBinder.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaController.java (90%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXMediaModel.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersController.java (96%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXParametersModel.java (92%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupController.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXSetupModel.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkBinder.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkController.java (73%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/FXWorkModel.java (98%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/LanguageStringConverter.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/gui/fx/TimeStringConverter.java (100%) rename {fx => gui/fx}/src/main/java/com/github/gtache/autosubtitle/modules/gui/fx/FXModule.java (95%) rename {fx/src/main/java/com/github/gtache/autosubtitle/subtitle => gui/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/gui}/fx/ObservableSubtitleImpl.java (98%) rename {fx/src/main/java/com/github/gtache/autosubtitle/subtitle => gui/fx/src/main/java/com/github/gtache/autosubtitle/subtitle/gui}/fx/SubtitleLabel.java (89%) rename {fx => gui/fx}/src/main/java/module-info.java (62%) rename {fx => gui/fx}/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mainView.fxml (100%) rename {fx => gui/fx}/src/main/resources/com/github/gtache/autosubtitle/gui/fx/mediaView.fxml (100%) rename {fx => gui/fx}/src/main/resources/com/github/gtache/autosubtitle/gui/fx/parametersView.fxml (100%) rename {fx => gui/fx}/src/main/resources/com/github/gtache/autosubtitle/gui/fx/setupView.fxml (100%) rename {fx => gui/fx}/src/main/resources/com/github/gtache/autosubtitle/gui/fx/workView.fxml (76%) rename {run => gui/run}/pom.xml (92%) rename {run => gui/run}/src/main/java/com/github/gtache/autosubtitle/modules/run/MissingComponentsModule.java (100%) rename {run => gui/run}/src/main/java/com/github/gtache/autosubtitle/modules/run/NoOpSetupManager.java (100%) rename {run => gui/run}/src/main/java/com/github/gtache/autosubtitle/modules/run/RunComponent.java (65%) rename {run => gui/run}/src/main/java/com/github/gtache/autosubtitle/run/Main.java (100%) rename {run => gui/run}/src/main/java/module-info.java (100%) rename {run => gui/run}/src/main/resources/log4j2.xml (100%) delete mode 100644 gui/src/main/java/module-info.java create mode 100644 server/pom.xml create mode 100644 server/src/main/java/module-info.java create mode 100644 whisper/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/extractor/whisper/WhisperExtractorModule.java create mode 100644 whisper/src/main/java/com/github/gtache/autosubtitle/modules/subtitle/parser/json/whisper/WhisperJsonModule.java delete mode 100644 whisper/src/main/java/com/github/gtache/autosubtitle/modules/whisper/json/JsonModule.java rename whisper/src/main/java/com/github/gtache/autosubtitle/{ => subtitle/extractor}/whisper/WhisperSubtitleExtractor.java (81%) create mode 100644 whisper/src/main/java/com/github/gtache/autosubtitle/subtitle/parser/json/whisper/JSONSubtitleConverter.java rename whisper/src/main/java/com/github/gtache/autosubtitle/{whisper/json => subtitle/parser/json/whisper}/JSONSubtitleSegment.java (81%) rename whisper/src/main/java/com/github/gtache/autosubtitle/{whisper/json => subtitle/parser/json/whisper}/JSONSubtitles.java (64%) delete mode 100644 whisper/src/main/java/com/github/gtache/autosubtitle/whisper/SubtitleParser.java delete mode 100644 whisper/src/main/java/com/github/gtache/autosubtitle/whisper/json/JsonSubtitleParser.java 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 @@