From 170b9bd5a7d87660ebaffc1d360c7421dcf0cba2 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 22 Oct 2023 23:08:47 +0200 Subject: [PATCH 01/54] update to java 21 --- MultiSubDownloader/pom.xml | 29 ++++++++++++++++- .../resources/opensubtitles/open-api.json | 0 SubLibrary/pom.xml | 32 ------------------- pom.xml | 6 ++-- 4 files changed, 31 insertions(+), 36 deletions(-) rename {SubLibrary => MultiSubDownloader}/src/main/resources/opensubtitles/open-api.json (100%) diff --git a/MultiSubDownloader/pom.xml b/MultiSubDownloader/pom.xml index a8026fcd..a1f5687a 100644 --- a/MultiSubDownloader/pom.xml +++ b/MultiSubDownloader/pom.xml @@ -168,6 +168,7 @@ openapi-generator-maven-plugin + gestdown generate @@ -203,7 +204,33 @@ java.time.OffsetDateTime=java.time.Instant java.time.LocalDateTime=java.time.Instant - + + + + opensubtitles + + generate + + + java + ${project.basedir}/src/main/resources/opensubtitles/open-api.json + ${project.build.directory}/generated-source/openapi + org.opensubtitles.model + org.opensubtitles.api + org.opensubtitles.invoker + org.opensubtitles + + + Authentication,Download,Subtitles + false + + integer=int,int=int + false + true + is + false + + diff --git a/SubLibrary/src/main/resources/opensubtitles/open-api.json b/MultiSubDownloader/src/main/resources/opensubtitles/open-api.json similarity index 100% rename from SubLibrary/src/main/resources/opensubtitles/open-api.json rename to MultiSubDownloader/src/main/resources/opensubtitles/open-api.json diff --git a/SubLibrary/pom.xml b/SubLibrary/pom.xml index cadd27b4..5294cb51 100644 --- a/SubLibrary/pom.xml +++ b/SubLibrary/pom.xml @@ -125,38 +125,6 @@ org.apache.maven.plugins maven-compiler-plugin - - org.openapitools - openapi-generator-maven-plugin - - - - generate - - - java - ${project.basedir}/src/main/resources/opensubtitles/open-api.json - ${project.build.directory}/generated-source/openapi - org.opensubtitles.model - org.opensubtitles.api - org.opensubtitles.invoker - org.opensubtitles - - - Authentication,Download,Subtitles - false - - integer=int,int=int - false - true - is - false - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0189cdb4..74b68458 100644 --- a/pom.xml +++ b/pom.xml @@ -35,8 +35,8 @@ maven-compiler-plugin 3.1 - 16 - 16 + 21 + 21 @@ -124,7 +124,7 @@ org.projectlombok lombok - 1.18.28 + 1.18.30 provided From 50c698a061bccf0ae3894e83998d9e7998ff44e1 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 1 Jun 2024 22:08:19 +0200 Subject: [PATCH 02/54] changes --- MultiSubDownloader/pom.xml | 32 +- .../javax/swing/JCheckBox/JCheckBoxExt.java} | 10 +- .../cli/CommandLine/CommandLineExt.java} | 12 +- .../lib/control/MovieReleaseControl.java | 2 - .../lib/control/TvReleaseControl.java | 4 - .../lib/library/LibraryBuilder.java | 2 - .../subtitleproviders/adapters/Adapter.java | 10 +- .../adapters/JAddic7edAdapter.java | 2 - .../adapters/JAddic7edViaProxyAdapter.java | 2 - .../adapters/JOpenSubAdapter.java | 2 - .../adapters/JPodnapisiAdapter.java | 2 - .../adapters/JSubsceneAdapter.java | 2 - .../adapters/JTVsubtitlesAdapter.java | 2 - .../addic7ed/JAddic7edApi.java | 2 - .../gestdown/JAddic7edProxyGestdownApi.java | 2 - .../opensubtitles/OpenSubtitlesApi.java | 3 +- .../podnapisi/JPodnapisiApi.java | 3 +- .../subscene/SubsceneApi.java | 2 - .../tvsubtitles/JTVSubtitlesApi.java | 3 +- SubLibrary/pom.xml | 28 + .../java/util/Optional/OptionalExtension.java | 221 +++++++ .../OptionalInt/OptionalIntExtension.java | 78 +++ .../OptionalLong/OptionalLongExtension.java | 77 +++ .../org/json/JSONArray/JSONArrayExt.java} | 15 +- .../lodder/subtools/sublibrary/Manager.java | 4 +- .../sublibrary/data/imdb/ImdbAdapter.java | 7 +- .../sublibrary/data/tvdb/TheTvdbAdapter.java | 16 +- .../sublibrary/data/tvdb/TheTvdbApi.java | 15 +- .../sublibrary/util/OptionalExtension.java | 165 ----- pom.xml | 592 +++++++++--------- 30 files changed, 775 insertions(+), 542 deletions(-) rename MultiSubDownloader/src/main/java/{org/lodder/subtools/multisubdownloader/gui/jcomponent/jcheckbox/JCheckBoxExtension.java => extensions/javax/swing/JCheckBox/JCheckBoxExt.java} (55%) rename MultiSubDownloader/src/main/java/{org/lodder/subtools/multisubdownloader/util/CLIExtension.java => extensions/org/apache/commons/cli/CommandLine/CommandLineExt.java} (50%) create mode 100644 SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java create mode 100644 SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExtension.java create mode 100644 SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java rename SubLibrary/src/main/java/{org/lodder/subtools/sublibrary/util/JSONUtils.java => extensions/org/json/JSONArray/JSONArrayExt.java} (67%) delete mode 100644 SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/OptionalExtension.java diff --git a/MultiSubDownloader/pom.xml b/MultiSubDownloader/pom.xml index a1f5687a..b8cf15bf 100644 --- a/MultiSubDownloader/pom.xml +++ b/MultiSubDownloader/pom.xml @@ -11,10 +11,14 @@ MultiSubDownloader - - d-maven - http://d-maven.googlecode.com/svn/trunk/repo - + + + + + + + + @@ -62,6 +66,10 @@ com.fasterxml.jackson.core jackson-databind + + systems.manifold + manifold-ext-rt + org.projectlombok lombok @@ -114,6 +122,18 @@ org.apache.maven.plugins maven-compiler-plugin + + + -Xplugin:Manifold + + + + systems.manifold + manifold-ext + ${manifold.version} + + + org.codehaus.mojo @@ -159,10 +179,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - org.openapitools openapi-generator-maven-plugin diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcheckbox/JCheckBoxExtension.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java similarity index 55% rename from MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcheckbox/JCheckBoxExtension.java rename to MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java index cb49d75f..0ff595f8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcheckbox/JCheckBoxExtension.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java @@ -1,20 +1,24 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox; +package extensions.javax.swing.JCheckBox; import javax.swing.*; import java.util.Arrays; import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; import org.lodder.subtools.sublibrary.util.BooleanConsumer; +@Extension @UtilityClass public class JCheckBoxExtension { - public T addCheckedChangeListener(T checkBox, BooleanConsumer... listeners) { + public static @Self JCheckBox addCheckedChangeListener(@This JCheckBox checkBox, BooleanConsumer... listeners) { checkBox.addItemListener(e -> Arrays.stream(listeners).forEach(listener -> listener.accept(((JCheckBox) e.getSource()).isSelected()))); return checkBox; } - public T visible(T checkBox, boolean visible) { + public static @Self JCheckBox visible(@This JCheckBox checkBox, boolean visible) { checkBox.setVisible(visible); return checkBox; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/CLIExtension.java b/MultiSubDownloader/src/main/java/extensions/org/apache/commons/cli/CommandLine/CommandLineExt.java similarity index 50% rename from MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/CLIExtension.java rename to MultiSubDownloader/src/main/java/extensions/org/apache/commons/cli/CommandLine/CommandLineExt.java index bacc0eab..59a9cc5a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/CLIExtension.java +++ b/MultiSubDownloader/src/main/java/extensions/org/apache/commons/cli/CommandLine/CommandLineExt.java @@ -1,17 +1,19 @@ -package org.lodder.subtools.multisubdownloader.util; +package extensions.org.apache.commons.cli.CommandLine; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; import org.apache.commons.cli.CommandLine; import org.lodder.subtools.multisubdownloader.cli.CliOption; -import lombok.experimental.UtilityClass; - +@Extension @UtilityClass public class CLIExtension { - public static boolean hasCliOption(CommandLine line, CliOption cliOption) { + public static boolean hasCliOption(@This CommandLine line, CliOption cliOption) { return line.hasOption(cliOption.getValue()); } - public static String getCliOptionValue(CommandLine line, CliOption cliOption) { + public static String getCliOptionValue(@This CommandLine line, CliOption cliOption) { return line.getOptionValue(cliOption.getValue()); } } \ No newline at end of file diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java index b6b6f2c5..c04174b2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java @@ -12,13 +12,11 @@ import org.lodder.subtools.sublibrary.model.MovieRelease; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import lombok.experimental.ExtensionMethod; -@ExtensionMethod({ OptionalExtension.class }) public class MovieReleaseControl extends ReleaseControl { private final ImdbAdapter imdbAdapter; private final OmdbAdapter omdbAdapter; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index 620dee1a..c5c3fa7b 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -9,13 +9,9 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ OptionalExtension.class }) public class TvReleaseControl extends ReleaseControl { private final TheTvdbAdapter jtvdba; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java index f0ccd5f9..7092ff4e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java @@ -9,13 +9,11 @@ import org.lodder.subtools.sublibrary.data.tvdb.TheTvdbAdapter; import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbSerie; import org.lodder.subtools.sublibrary.model.Release; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import lombok.RequiredArgsConstructor; import lombok.experimental.ExtensionMethod; @RequiredArgsConstructor -@ExtensionMethod({ OptionalExtension.class, StringUtils.class }) public abstract class LibraryBuilder { private final boolean useTvdb; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 9fb96b45..0e500a32 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -1,7 +1,5 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.adapters; -import static org.lodder.subtools.sublibrary.util.OptionalExtension.*; - import java.io.IOException; import java.io.Serializable; import java.nio.file.Files; @@ -30,14 +28,12 @@ import org.lodder.subtools.sublibrary.model.Subtitle; import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import lombok.experimental.ExtensionMethod; /** - * * @param type of the subtitle objects returned by the api * @param type of the ProviderSerieId * @param type of the exception thrown by the api @@ -182,8 +178,7 @@ default Optional getProviderSerieId(String serieName, String serie serieNameValueBuilder .value(new SerieMapping(serieName, null, null, seasonToUse)) .storeTempNullValue() - .timeToLive(OptionalExtension - .map(serieNameValueBuilder.getTemporaryTimeToLive(), v -> v * 2) + .timeToLive(serieNameValueBuilder.getTemporaryTimeToLive().map(v -> v * 2) .orElseGet(() -> TimeUnit.SECONDS.convert(1, TimeUnit.DAYS))) .storeAsTempValue(); return Optional.empty(); @@ -219,8 +214,7 @@ default Optional getProviderSerieId(String serieName, String serie serieNameValueBuilder .value(new SerieMapping(serieNameToSearchFor, null, null, seasonToUse)) .storeTempNullValue() - .timeToLive(OptionalExtension - .map(serieNameValueBuilder.getTemporaryTimeToLive(), v -> v * 2) + .timeToLive(serieNameValueBuilder.getTemporaryTimeToLive().map(v -> v * 2) .orElseGet(() -> TimeUnit.SECONDS.convert(1, TimeUnit.DAYS))) .storeAsTempValue(); previousResultsValueBuilder.collectionValue(providerSerieIds).store(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java index 550347b7..f0395a6e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java @@ -22,7 +22,6 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.StringUtil; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.slf4j.Logger; @@ -32,7 +31,6 @@ import lombok.experimental.ExtensionMethod; @Getter -@ExtensionMethod({ OptionalExtension.class }) public class JAddic7edAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JAddic7edAdapter.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index ca51c350..2728850b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -21,7 +21,6 @@ import org.lodder.subtools.sublibrary.model.Subtitle; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +31,6 @@ import lombok.experimental.ExtensionMethod; @Getter -@ExtensionMethod({ OptionalExtension.class }) public class JAddic7edViaProxyAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JAddic7edViaProxyAdapter.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index 99cbf7b8..1fc55be0 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -23,7 +23,6 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.opensubtitles.model.Latest200ResponseDataInnerAttributesFilesInner; import org.opensubtitles.model.SubtitleAttributes; @@ -34,7 +33,6 @@ import lombok.experimental.ExtensionMethod; @Getter -@ExtensionMethod({ OptionalExtension.class }) public class JOpenSubAdapter extends AbstractAdapter { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index 4869aaff..a2dfebec 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -22,7 +22,6 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,7 +30,6 @@ import lombok.experimental.ExtensionMethod; @Getter -@ExtensionMethod({ OptionalExtension.class }) public class JPodnapisiAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JPodnapisiAdapter.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index d7286a62..aa7b66f5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -28,7 +28,6 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.StringUtil; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.slf4j.Logger; @@ -38,7 +37,6 @@ import lombok.experimental.ExtensionMethod; @Getter -@ExtensionMethod({ OptionalExtension.class }) public class JSubsceneAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JSubsceneAdapter.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java index 97baa08f..3aa4ad0f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java @@ -25,7 +25,6 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +33,6 @@ import lombok.experimental.ExtensionMethod; @Getter -@ExtensionMethod({ OptionalExtension.class }) public class JTVsubtitlesAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JTVsubtitlesAdapter.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java index a70cb8c9..58e12ad6 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java @@ -28,11 +28,9 @@ import org.lodder.subtools.sublibrary.data.ProviderSerieId; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import lombok.experimental.ExtensionMethod; -@ExtensionMethod({ OptionalExtension.class }) public class JAddic7edApi extends Html implements SubtitleApi { private static final long RATEDURATION = 1; // seconds diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java index 163ca312..725a6834 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java @@ -21,13 +21,11 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.StringUtil; import lombok.experimental.ExtensionMethod; // see https://www.gestdown.info/Api -@ExtensionMethod({ OptionalExtension.class }) public class JAddic7edProxyGestdownApi extends Html implements SubtitleApi { private static final String DOMAIN = "https://api.gestdown.info"; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java index 61f1c084..d9b43ec1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java @@ -12,7 +12,6 @@ import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.util.JSONUtils; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.http.HttpClientException; import org.opensubtitles.api.AuthenticationApi; import org.opensubtitles.invoker.ApiClient; @@ -23,7 +22,7 @@ import lombok.Getter; import lombok.experimental.ExtensionMethod; -@ExtensionMethod({ OptionalExtension.class, JSONUtils.class }) +@ExtensionMethod({ JSONUtils.class }) public class OpenSubtitlesApi implements SubtitleApi { private static final String APIKEY = "lNNp0yv0ah8gytkmYPbHwuaATJqr4rS9"; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java index 1b36f7eb..d260be03 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java @@ -23,7 +23,6 @@ import org.lodder.subtools.sublibrary.data.ProviderSerieId; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.StringUtil; import org.lodder.subtools.sublibrary.util.http.HttpClientException; @@ -34,7 +33,7 @@ @Getter(value = AccessLevel.PRIVATE) @RequiredArgsConstructor -@ExtensionMethod({ OptionalExtension.class, StringUtil.class }) +@ExtensionMethod({ StringUtil.class }) public class JPodnapisiApi implements SubtitleApi { public static final int maxAge = 90; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java index 400b85c3..8e17ce66 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java @@ -32,14 +32,12 @@ import org.lodder.subtools.sublibrary.data.ProviderSerieId; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.http.HttpClientException; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.experimental.ExtensionMethod; -@ExtensionMethod({ OptionalExtension.class }) public class SubsceneApi extends Html implements SubtitleApi { private static final int RATEDURATION_SHORT = 1; // seconds diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index 5e4ff030..e39f0e49 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -23,12 +23,11 @@ import org.lodder.subtools.sublibrary.data.ProviderSerieId; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.StreamExtension; import lombok.experimental.ExtensionMethod; -@ExtensionMethod({ OptionalExtension.class, StreamExtension.class }) +@ExtensionMethod({ StreamExtension.class }) public class JTVSubtitlesApi extends Html implements SubtitleApi { private static final String DOMAIN = "https://www.tvsubtitles.net"; diff --git a/SubLibrary/pom.xml b/SubLibrary/pom.xml index 5294cb51..5e61274c 100644 --- a/SubLibrary/pom.xml +++ b/SubLibrary/pom.xml @@ -79,6 +79,10 @@ com.uwetrottmann.thetvdb-java thetvdb-java + + systems.manifold + manifold-ext-rt + org.projectlombok lombok @@ -124,6 +128,30 @@ org.apache.maven.plugins maven-compiler-plugin + + + -Xplugin:Manifold + + + + systems.manifold + manifold-ext + ${manifold.version} + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + + java,class + + + diff --git a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java new file mode 100644 index 00000000..9ad97c77 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java @@ -0,0 +1,221 @@ +package extensions.java.util.Optional; + +import java.util.Objects; +import java.util.Optional; +import java.util.OptionalInt; +import java.util.function.Function; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import name.falgout.jeffrey.throwing.ThrowingConsumer; +import name.falgout.jeffrey.throwing.ThrowingFunction; +import name.falgout.jeffrey.throwing.ThrowingRunnable; +import name.falgout.jeffrey.throwing.ThrowingSupplier; +import name.falgout.jeffrey.throwing.ThrowingToIntFunction; + +@Extension +@UtilityClass +public class OptionalExtension { + /** + * If the value is present, apply the {@link ThrowingFunction} and return the value. Otherwise return {@code null} + * + * @param optional input object of the extension method + * @param function the {@link ThrowingFunction} to apply to the value if present + * @param The type of value of the input {@code Optional} + * @param type of the return value + * @param type of the exception that can be thrown + * @return the result of the {@link ThrowingFunction} if the value is present, otherwise {@code null} + * @throws X exception type of the throwing Function + */ + public static , T, S, X extends Throwable> Optional map(@This O optional, ThrowingFunction function) throws X { + return optional.isPresent() ? Optional.ofNullable(function.apply(optional.get())) : Optional.empty(); + } + + /** + * If a value is present, returns the result of applying the given {@code Optional}-bearing mapping function to the value, otherwise returns an + * empty {@code Optional}. + * + *

+ * This method is similar to {@link #map(Function)}, but the mapping function is one whose result is already an {@code Optional}, and if invoked, + * {@code flatMap} does not wrap it within an additional {@code Optional}. + * + * @param optional input object of the extension method + * @param The type of value of the input {@code Optional} + * @param The type of value of the {@code Optional} returned by the mapping function + * @param The type of exception that can be thrown by the {@code ThrowingFunction} + * @param mapper the mapping function to apply to a value, if present + * @return the result of applying an {@code Optional}-bearing mapping function to the value of this {@code Optional}, if a value is present, + * otherwise an empty {@code Optional} + * @throws X exception type of the throwing Function + * @throws NullPointerException if the mapping function is {@code null} or returns a {@code null} result + */ + public static , T, O2 extends Optional, S, X extends Throwable> O2 flatMap( + @This O1 optional, ThrowingFunction mapper) throws X { + if (optional.isEmpty()) { + return (O2) Optional.empty(); + } else { + return Objects.requireNonNull(mapper.apply(optional.get())); + } + } + + // /** + // * If a value is present, returns an {@code Optional} describing the value, + // * otherwise returns an {@code Optional} produced by the supplying function. + // * + // * @param + // * The type of value of the input {@code Optional} + // * @param + // * The type of exception that can be thrown by the {@code ThrowingSupplier} + // * @param optional + // * input object of the extension method + // * @param supplier + // * the supplying function that produces an {@code Optional} + // * to be returned + // * @return returns an {@code Optional} describing the value of this + // * {@code Optional}, if a value is present, otherwise an + // * {@code Optional} produced by the supplying function. + // * @throws X + // * exception type of the throwing Supplier + // * @throws NullPointerException + // * if the supplying function is {@code null} or + // * produces a {@code null} result + // */ + // public static Optional orElseGet(@This Optional optional, ThrowingSupplier, X> + // supplier) throws X { + // if (optional.isPresent()) { + // return optional; + // } else { + // return Objects.requireNonNull(supplier.get()); + // } + // } + + /** + * If a value is present, returns the value, otherwise returns the result produced by the supplying function. + * + * @param The type of value of the input {@code Optional} + * @param The type of exception that can be thrown by the {@code ThrowingSupplier} + * @param optional input object of the extension method + * @param supplier the supplying function that produces a value to be returned + * @return the value, if present, otherwise the result produced by the supplying function + * @throws X exception type of the throwing Supplier + * @throws NullPointerException if no value is present and the supplying function is {@code null} + */ + + public static , T, X extends Throwable> T orElseGet(@This O optional, + ThrowingSupplier supplier) throws X { + return optional.isPresent() ? optional.get() : supplier.get(); + } + + /** + * If a value is present, performs the given action with the value, otherwise does nothing. + * + * @param The type of value of the input {@code Optional} + * @param The type of exception that can be thrown by the {@code ThrowingConsumer} + * @param optional input object of the extension method + * @param consumer the action to be performed, if a value is present + * @throws X exception type of the throwing Consumer + * @throws NullPointerException if value is present and the given action is {@code null} + */ + public static , T, X extends Throwable> void ifPresent(@This O optional, ThrowingConsumer consumer) throws X { + if (optional.isPresent()) { + consumer.accept(optional.get()); + } + } + + + /** + * If a value is present, performs the given action with the value, otherwise performs the given empty-based action. + * + * @param The type of value of the input {@code Optional} + * @param The type of exception that can be thrown by the {@code ThrowingConsumer} + * @param optional input object of the extension method + * @param ifPresentConsumer the action to be performed, if a value is present + * @param ifAbsentRunnable the empty-based action to be performed, if no value is present + * @throws X exception type of the throwing Consumer + * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is present and the given + * empty-based action is {@code null}. + */ + public static , T, X extends Throwable> void ifPresentOrElse(@This O optional, + ThrowingConsumer ifPresentConsumer, ThrowingRunnable ifAbsentRunnable) throws X { + if (optional.isPresent()) { + ifPresentConsumer.accept(optional.get()); + } else { + ifAbsentRunnable.run(); + } + } + + // public static Optional ifPresentDo(@This Optional optional, ThrowingConsumer consumer) throws X { + // if (optional.isPresent()) { + // consumer.accept(optional.get()); + // } + // return optional; + // } + // + // //// + // + // public static void orElseDo(@This Optional optional, ThrowingRunnable consumer) throws X { + // if (optional.isEmpty()) { + // consumer.run(); + // } + // } + // + // // + // + // public static Optional ifEmptyDo(@This Optional optional, ThrowingRunnable runnable) throws X { + // if (optional.isEmpty()) { + // runnable.run(); + // } + // return optional; + // } + // + // // + // + public static Optional orElseMap(@This Optional optional, ThrowingSupplier, X> supplier) + throws X { + return optional.isPresent() ? optional : supplier.get(); + } + + // + // // + // + // public static T mapOrElseGet(@This Optional optional, ThrowingFunction ifPresentFunction, + // ThrowingSupplier absentSupplier) throws X { + // return optional.isPresent() ? ifPresentFunction.apply(optional.get()) : absentSupplier.get(); + // } + // + // // + // + public static OptionalInt mapToInt(@This Optional optional, ThrowingToIntFunction mapper) throws X { + return optional.isPresent() ? OptionalInt.of(mapper.applyAsInt(optional.get())) : OptionalInt.empty(); + } + // + public static OptionalInt mapToOptionalInt(@This Optional optional) { + return optional.map(OptionalInt::of).orElseGet(OptionalInt::empty); + } + // + // // + // + // public static Optional mapToObj(@This Optional optional, ThrowingFunction mapper) throws X { + // return optional.isPresent() ? Optional.ofNullable(mapper.apply(optional.get())) : Optional.empty(); + // } + // + // // + // + // public static Optional mapToOptionalObj(@This Optional optional, ThrowingFunction, X> + // mapper) + // throws X { + // return optional.isPresent() ? mapper.apply(optional.get()) : Optional.empty(); + // } + // + // // + // + // public static void ifPresentOrThrow(@This Optional optional, ThrowingConsumer consumer, + // Supplier exceptionSupplier) throws X { + // if (optional.isPresent()) { + // consumer.accept(optional.get()); + // } else { + // throw exceptionSupplier.get(); + // } + // } +} diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExtension.java b/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExtension.java new file mode 100644 index 00000000..27216da5 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExtension.java @@ -0,0 +1,78 @@ +package extensions.java.util.OptionalInt; + + +import java.util.Optional; +import java.util.OptionalInt; +import java.util.function.Supplier; + +import com.pivovarit.function.ThrowingIntFunction; +import com.pivovarit.function.ThrowingRunnable; +import com.pivovarit.function.ThrowingSupplier; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import name.falgout.jeffrey.throwing.ThrowingIntPredicate; +import org.lodder.subtools.sublibrary.util.throwingfunction.ThrowingIntConsumer; + + +@Extension +@UtilityClass +public class OptionalIntExtension { + + public static OptionalInt ifPresentDo(@This OptionalInt optional, ThrowingIntConsumer consumer) throws X { + if (optional.isPresent()) { + consumer.accept(optional.getAsInt()); + } + return optional; + } + + //// + + public static void orElseDo(@This OptionalInt optional, ThrowingRunnable consumer) throws X { + if (optional.isEmpty()) { + consumer.run(); + } + } + + // + + public static OptionalInt orElseMap(@This OptionalInt optionalInt, ThrowingSupplier intSupplier) throws X { + return optionalInt.isPresent() ? optionalInt : intSupplier.get(); + } + + // + + public static T mapOrElseGet(@This OptionalInt optionalInt, ThrowingIntFunction ifPresentFunction, + ThrowingSupplier absentSupplier) throws X { + return optionalInt.isPresent() ? ifPresentFunction.apply(optionalInt.getAsInt()) : absentSupplier.get(); + } + + // + + public static Optional mapToObj(@This OptionalInt optionalInt, ThrowingIntFunction mapper) throws X { + return optionalInt.isPresent() ? Optional.ofNullable(mapper.apply(optionalInt.getAsInt())) : Optional.empty(); + } + + public static Optional mapToOptionalObj(@This OptionalInt optionalInt, ThrowingIntFunction, X> mapper) + throws X { + return optionalInt.isPresent() ? mapper.apply(optionalInt.getAsInt()) : Optional.empty(); + } + + // + + public static OptionalInt filter(@This OptionalInt optionalInt, ThrowingIntPredicate predicate) + throws X { + return optionalInt.isPresent() && predicate.test(optionalInt.getAsInt()) ? optionalInt : OptionalInt.empty(); + } + + // + + public static void ifPresentOrThrow(@This OptionalInt optionalInt, ThrowingIntConsumer consumer, + Supplier exceptionSupplier) throws X { + if (optionalInt.isPresent()) { + consumer.accept(optionalInt.getAsInt()); + } else { + throw exceptionSupplier.get(); + } + } +} diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java new file mode 100644 index 00000000..48585652 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java @@ -0,0 +1,77 @@ +package extensions.java.util.OptionalLong; + +import java.util.Optional; +import java.util.OptionalLong; + +import com.pivovarit.function.ThrowingFunction; +import com.pivovarit.function.ThrowingUnaryOperator; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; + +@Extension +@UtilityClass +public class OptionalLongExtension { + + /** + * If the value is present, apply the {@link ThrowingUnaryOperator} and return the value wrapped in an @{link OptionalLong}. + * Otherwise, return an empty {@code OptionalLong} + * + * @param optional input object of the extension method + * @param function the function to apply to the value if present + * @param type of the exception that can be thrown + * @return the result of the function wrapped in an @{link OptionalLong} if the value is present, otherwise an empty {@code OptionalLong} + * @throws X exception type of the throwing Function + */ + public static OptionalLong map(@This OptionalLong optional, ThrowingUnaryOperator function) throws X { + if(optional.isPresent()){ + Long value = function.apply(optional.getAsLong()); + if(value != null){ + return OptionalLong.of(value); + } + } + return OptionalLong.empty(); + } + + /** + * If the value is present, apply the {@link ThrowingUnaryOperator} and return the value wrapped in an @{link Optional}. + * Otherwise, return an empty {@code Optional} + * + * @param optional input object of the extension method + * @param function the function to apply to the value if present + * @param type of the result value wrapped in the @{link Optional} + * @param type of the exception that can be thrown + * @return the result of the function wrapped in an @{link Optional} if the value is present, otherwise an empty {@code Optional} + * @throws X exception type of the throwing Function + */ + public static Optional mapToObj(@This OptionalLong optional, ThrowingFunction function) throws X { + return optional.isPresent() ? Optional.ofNullable(function.apply(optional.getAsLong())) : Optional.empty(); + } + +// public static OptionalLong ifPresentDo(@This OptionalLong optional, ThrowingLongConsumer consumer) throws X { +// if (optional.isPresent()) { +// consumer.accept(optional.getAsLong()); +// } +// return optional; +// } +// +// //// +// +// public static void orElseDo(@This OptionalLong optional, ThrowingRunnable consumer) throws X { +// if (optional.isEmpty()) { +// consumer.run(); +// } +// } +// +// // +// +// public static Optional mapToObj(@This OptionalLong optionalLong, ThrowingLongFunction mapper) throws X { +// return optionalLong.isPresent() ? Optional.ofNullable(mapper.apply(optionalLong.getAsLong())) : Optional.empty(); +// } +// +// // +// +// public static OptionalLong map(@This OptionalLong optionalLong, ThrowingLongFunction mapper) throws X { +// return optionalLong.isPresent() ? OptionalLong.of(mapper.apply(optionalLong.getAsLong())) : optionalLong; +// } +} diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/JSONUtils.java b/SubLibrary/src/main/java/extensions/org/json/JSONArray/JSONArrayExt.java similarity index 67% rename from SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/JSONUtils.java rename to SubLibrary/src/main/java/extensions/org/json/JSONArray/JSONArrayExt.java index 46966e91..dbbbd4f9 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/JSONUtils.java +++ b/SubLibrary/src/main/java/extensions/org/json/JSONArray/JSONArrayExt.java @@ -1,4 +1,4 @@ -package org.lodder.subtools.sublibrary.util; +package extensions.org.json.JSONArray; import java.util.Iterator; import java.util.Spliterator; @@ -6,17 +6,18 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; import org.json.JSONArray; import org.json.JSONObject; -import lombok.experimental.UtilityClass; - +@Extension @UtilityClass -public class JSONUtils { +public class JSONArrayExt { - @SuppressWarnings({ "unchecked", "rawtypes" }) - public Stream stream(JSONArray jsonArray) { + public static Stream stream(@This JSONArray jsonArray) { return StreamSupport .stream(Spliterators.spliteratorUnknownSize((Iterator) (Iterator) jsonArray.iterator(), Spliterator.ORDERED), false); } -} +} \ No newline at end of file diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java index 65681530..f74926e1 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java @@ -38,7 +38,6 @@ import org.lodder.subtools.sublibrary.cache.DiskCache; import org.lodder.subtools.sublibrary.cache.InMemoryCache; import org.lodder.subtools.sublibrary.util.IOUtils; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.http.HttpClient; import org.lodder.subtools.sublibrary.util.http.HttpClientException; import org.lodder.subtools.sublibrary.xml.XMLHelper; @@ -46,7 +45,6 @@ @Setter @RequiredArgsConstructor -@ExtensionMethod({ OptionalExtension.class }) public class Manager { private final HttpClient httpClient; @@ -839,7 +837,7 @@ private void store(boolean storeAsTempValue) throws X { } else if (optionalSupplier != null) { value = executeSupplier(optionalSupplier).orElse(null); } else if (optionalIntSupplier != null) { - value = OptionalExtension.mapToObj(executeSupplier(optionalIntSupplier), i -> i).orElse(null); + value = executeSupplier(optionalIntSupplier).mapToObj(i -> i).orElse(null); } else if (collectionSupplier != null) { value = executeSupplier(collectionSupplier); } else if (optionalValue != null) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java index f00eac78..b611cb32 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java @@ -5,6 +5,7 @@ import java.util.Optional; import java.util.OptionalInt; +import com.pivovarit.function.ThrowingBiFunction; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.sublibrary.Manager; @@ -15,16 +16,10 @@ import org.lodder.subtools.sublibrary.data.imdb.model.ImdbDetails; import org.lodder.subtools.sublibrary.exception.SubtitlesProviderInitException; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.pivovarit.function.ThrowingBiFunction; - -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ OptionalExtension.class }) public class ImdbAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(ImdbAdapter.class); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index dd717180..8c4e1db0 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -1,5 +1,6 @@ package org.lodder.subtools.sublibrary.data.tvdb; +import javax.swing.*; import java.io.Serializable; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -9,8 +10,9 @@ import java.util.OptionalInt; import java.util.concurrent.TimeUnit; -import javax.swing.JOptionPane; - +import lombok.AccessLevel; +import lombok.Getter; +import name.falgout.jeffrey.throwing.ThrowingLongFunction; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.Manager; @@ -23,17 +25,11 @@ import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.OptionalExtension; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - @Getter(value = AccessLevel.PROTECTED) -@ExtensionMethod({ OptionalExtension.class }) public class TheTvdbAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(TheTvdbAdapter.class); @@ -101,7 +97,7 @@ public Optional getSerie(String serieName) { if (tvdbSerie.isEmpty()) { valueBuilder.optionalValue(tvdbSerie) .storeTempNullValue() - .timeToLive(OptionalExtension.map(valueBuilder.getTemporaryTimeToLive(), v -> v * 2) + .timeToLive(valueBuilder.getTemporaryTimeToLive().map(v -> v * 2) .orElseGet(() -> TimeUnit.SECONDS.convert(1, TimeUnit.DAYS))) .storeAsTempValue(); } else { @@ -109,7 +105,7 @@ public Optional getSerie(String serieName) { manager.valueBuilder() .cacheType(CacheType.DISK) .key("%s-serieId-%s".formatted(getProviderName(), encodedSerieName)) - .optionalValue(tvdbSerie.mapToObj(tvdbS -> new SerieMapping(serieName, tvdbS.getId(), tvdbS.getSerieName()))) + .optionalValue(tvdbSerie.map(tvdbS -> new SerieMapping(serieName, tvdbS.getId(), tvdbS.getSerieName()))) .storeTempNullValue() .store(); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java index 5b5898ff..24566af9 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java @@ -6,26 +6,21 @@ import java.util.List; import java.util.Optional; -import org.lodder.subtools.sublibrary.Language; -import org.lodder.subtools.sublibrary.Manager; -import org.lodder.subtools.sublibrary.data.tvdb.exception.TheTvdbException; -import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbEpisode; -import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbSerie; -import org.lodder.subtools.sublibrary.util.OptionalExtension; - import com.uwetrottmann.thetvdb.TheTvdb; import com.uwetrottmann.thetvdb.entities.Episode; import com.uwetrottmann.thetvdb.entities.EpisodesResponse; import com.uwetrottmann.thetvdb.entities.Series; import com.uwetrottmann.thetvdb.entities.SeriesResponse; import com.uwetrottmann.thetvdb.entities.SeriesResultsResponse; - import lombok.AccessLevel; import lombok.Getter; -import lombok.experimental.ExtensionMethod; +import org.lodder.subtools.sublibrary.Language; +import org.lodder.subtools.sublibrary.Manager; +import org.lodder.subtools.sublibrary.data.tvdb.exception.TheTvdbException; +import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbEpisode; +import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbSerie; import retrofit2.Response; -@ExtensionMethod({ OptionalExtension.class }) public class TheTvdbApi { @Getter(value = AccessLevel.PRIVATE) diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/OptionalExtension.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/OptionalExtension.java deleted file mode 100644 index 073d4299..00000000 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/OptionalExtension.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.lodder.subtools.sublibrary.util; - -import java.util.Optional; -import java.util.OptionalInt; -import java.util.OptionalLong; -import java.util.function.Supplier; - -import org.lodder.subtools.sublibrary.util.throwingfunction.ThrowingIntConsumer; - -import com.pivovarit.function.ThrowingConsumer; -import com.pivovarit.function.ThrowingFunction; -import com.pivovarit.function.ThrowingIntFunction; -import com.pivovarit.function.ThrowingRunnable; -import com.pivovarit.function.ThrowingSupplier; - -import lombok.experimental.UtilityClass; -import name.falgout.jeffrey.throwing.ThrowingIntPredicate; -import name.falgout.jeffrey.throwing.ThrowingLongConsumer; -import name.falgout.jeffrey.throwing.ThrowingLongFunction; -import name.falgout.jeffrey.throwing.ThrowingToIntFunction; - -@UtilityClass -public class OptionalExtension { - - public static Optional ifPresentDo(Optional optional, ThrowingConsumer consumer) throws X { - if (optional.isPresent()) { - consumer.accept(optional.get()); - } - return optional; - } - - public static OptionalInt ifPresentDo(OptionalInt optional, ThrowingIntConsumer consumer) throws X { - if (optional.isPresent()) { - consumer.accept(optional.getAsInt()); - } - return optional; - } - - public static OptionalLong ifPresentDo(OptionalLong optional, ThrowingLongConsumer consumer) throws X { - if (optional.isPresent()) { - consumer.accept(optional.getAsLong()); - } - return optional; - } - - //// - - public static void orElseDo(Optional optional, ThrowingRunnable consumer) throws X { - if (optional.isEmpty()) { - consumer.run(); - } - } - - public static void orElseDo(OptionalInt optional, ThrowingRunnable consumer) throws X { - if (optional.isEmpty()) { - consumer.run(); - } - } - - public static void orElseDo(OptionalLong optional, ThrowingRunnable consumer) throws X { - if (optional.isEmpty()) { - consumer.run(); - } - } - - // - - public static Optional ifEmptyDo(Optional optional, ThrowingRunnable runnable) throws X { - if (optional.isEmpty()) { - runnable.run(); - } - return optional; - } - - // - - public static Optional orElseMap(Optional optional, ThrowingSupplier, X> supplier) throws X { - return optional.isPresent() ? optional : supplier.get(); - } - - public static OptionalInt orElseMap(OptionalInt optionalInt, ThrowingSupplier intSupplier) throws X { - return optionalInt.isPresent() ? optionalInt : intSupplier.get(); - } - - // - - public static T mapOrElseGet(Optional optional, ThrowingFunction ifPresentFunction, - ThrowingSupplier absentSupplier) throws X { - return optional.isPresent() ? ifPresentFunction.apply(optional.get()) : absentSupplier.get(); - } - - public static T mapOrElseGet(OptionalInt optionalInt, ThrowingIntFunction ifPresentFunction, - ThrowingSupplier absentSupplier) throws X { - return optionalInt.isPresent() ? ifPresentFunction.apply(optionalInt.getAsInt()) : absentSupplier.get(); - } - - // - - public static OptionalInt mapToInt(Optional optional, ThrowingToIntFunction mapper) throws X { - return optional.isPresent() ? OptionalInt.of(mapper.applyAsInt(optional.get())) : OptionalInt.empty(); - } - - public static OptionalInt mapToOptionalInt(Optional optional) { - return optional.map(OptionalInt::of).orElseGet(OptionalInt::empty); - } - - // - - public static Optional mapToObj(Optional optional, ThrowingFunction mapper) throws X { - return optional.isPresent() ? Optional.ofNullable(mapper.apply(optional.get())) : Optional.empty(); - } - - public static Optional mapToObj(OptionalInt optionalInt, ThrowingIntFunction mapper) throws X { - return optionalInt.isPresent() ? Optional.ofNullable(mapper.apply(optionalInt.getAsInt())) : Optional.empty(); - } - - public static Optional mapToObj(OptionalLong optionalLong, ThrowingLongFunction mapper) throws X { - return optionalLong.isPresent() ? Optional.ofNullable(mapper.apply(optionalLong.getAsLong())) : Optional.empty(); - } - - // - - public static OptionalLong map(OptionalLong optionalLong, ThrowingLongFunction mapper) throws X { - return optionalLong.isPresent() ? OptionalLong.of(mapper.apply(optionalLong.getAsLong())) : optionalLong; - } - - // - - public static Optional mapToOptionalObj(Optional optional, ThrowingFunction, X> mapper) - throws X { - return optional.isPresent() ? mapper.apply(optional.get()) : Optional.empty(); - } - - public static Optional mapToOptionalObj(OptionalInt optionalInt, ThrowingIntFunction, X> mapper) - throws X { - return optionalInt.isPresent() ? mapper.apply(optionalInt.getAsInt()) : Optional.empty(); - } - - // - - public static OptionalInt filter(OptionalInt optionalInt, ThrowingIntPredicate predicate) - throws X { - return optionalInt.isPresent() && predicate.test(optionalInt.getAsInt()) ? optionalInt : OptionalInt.empty(); - } - - // - - public static void ifPresentOrThrow(Optional optional, ThrowingConsumer consumer, - Supplier exceptionSupplier) throws X { - if (optional.isPresent()) { - consumer.accept(optional.get()); - } else { - throw exceptionSupplier.get(); - } - } - - public static void ifPresentOrThrow(OptionalInt optionalInt, ThrowingIntConsumer consumer, - Supplier exceptionSupplier) throws X { - if (optionalInt.isPresent()) { - consumer.accept(optionalInt.getAsInt()); - } else { - throw exceptionSupplier.get(); - } - } -} diff --git a/pom.xml b/pom.xml index 74b68458..f6e51081 100644 --- a/pom.xml +++ b/pom.xml @@ -1,295 +1,317 @@ - 4.0.0 - org.lodder.subtools - subtools - 1.5.1-SNAPSHOT - SubTools - pom + 4.0.0 + org.lodder.subtools + subtools + 1.5.1-SNAPSHOT + SubTools + pom - - UTF-8 - + + UTF-8 + 2024.1.15 + 1.18.32 + 21 + 21 + - - scm:git:git@github.com:phdelodder/SubTools.git - scm:git:git@github.com:phdelodder/SubTools.git - scm:git:git@github.com:phdelodder/SubTools.git - HEAD - + + scm:git:git@github.com:phdelodder/SubTools.git + scm:git:git@github.com:phdelodder/SubTools.git + scm:git:git@github.com:phdelodder/SubTools.git + HEAD + - - SubLibrary - MultiSubDownloader - + + SubLibrary + MultiSubDownloader + - - github - https://github.com/phdelodder/SubTools/issues - + + github + https://github.com/phdelodder/SubTools/issues + - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 21 - 21 - - - - org.apache.maven.plugins - maven-release-plugin - 2.5.1 - - - org.codehaus.mojo - findbugs-maven-plugin - 3.0.1 - - Max - Medium - true - findbugs-exclude.xml - - - - - check - - - - - - org.jacoco - jacoco-maven-plugin - 0.5.8.201207111220 - - - - prepare-agent - - - - report - test - - report - - - - - - org.codehaus.mojo - exec-maven-plugin - 3.1.0 - - - maven-assembly-plugin - 3.6.0 - - - org.apache.maven.plugins - maven-jar-plugin - 3.3.0 - - - org.codehaus.mojo - properties-maven-plugin - 1.1.0 - - - - + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + UTF-8 + true + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.5.1 + + + org.codehaus.mojo + findbugs-maven-plugin + 3.0.1 + + Max + Medium + true + findbugs-exclude.xml + + + + + check + + + + + + org.jacoco + jacoco-maven-plugin + 0.5.8.201207111220 + + + + prepare-agent + + + + report + test + + report + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + + maven-assembly-plugin + 3.6.0 + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + org.codehaus.mojo + properties-maven-plugin + 1.1.0 + + + + + + + + + + - - - - org.lodder.subtools - multisubdownloader - ${project.version} - - - org.lodder.subtools - sublibrary - ${project.version} - - - commons-cli - commons-cli - 1.5.0 - - - org.projectlombok - lombok - 1.18.30 - provided - - - ch.qos.logback - logback-classic - 1.1.2 - - - org.openapitools - openapi-generator-core - 6.6.0 - - - javax.annotation - javax.annotation-api - 1.3.2 - - - io.swagger - swagger-annotations - 1.6.10 - - - com.squareup.okhttp3 - logging-interceptor - 4.11.0 - - - com.google.code.gson - gson - 2.10.1 - - - io.gsonfire - gson-fire - 1.8.5 - - - com.fasterxml.jackson.core - jackson-databind - 2.15.2 - - - com.pivovarit - throwing-function - 1.5.1 - - - name.falgout.jeffrey - throwing-streams - 3.2.0 - - - name.falgout.jeffrey - throwing-interfaces - 1.2.0 - - - com.optimaize.languagedetector - language-detector - 0.6 - - - org.apache.commons - commons-lang3 - 3.12.0 - - - org.jsoup - jsoup - 1.16.1 - - - org.apache.commons - commons-collections4 - 4.4 - - - org.hsqldb - hsqldb - 2.7.2 - - - javax.ws.rs - javax.ws.rs-api - 2.1.1 - - - com.uwetrottmann.thetvdb-java - thetvdb-java - 2.4.0 - - - com.miglayout - miglayout-swing - 11.1 - - - org.reflections - reflections - 0.10.2 - - - com.massisframework - j-text-utils - 0.3.4 - - - - commons-lang - commons-lang - - - - - org.openapitools - jackson-databind-nullable - 0.2.6 - - - org.codehaus.plexus - plexus-interactivity-api - 1.1 - - - junit - junit - - - - - org.json - json - 20230618 - - - net.jodah - typetools - 0.6.3 - - - org.jooq - joor - 0.9.14 - + + + + org.lodder.subtools + multisubdownloader + ${project.version} + + + org.lodder.subtools + sublibrary + ${project.version} + + + commons-cli + commons-cli + 1.5.0 + + + systems.manifold + manifold-ext-rt + ${manifold.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + ch.qos.logback + logback-classic + 1.1.2 + + + org.openapitools + openapi-generator-core + 6.6.0 + + + javax.annotation + javax.annotation-api + 1.3.2 + + + io.swagger + swagger-annotations + 1.6.10 + + + com.squareup.okhttp3 + logging-interceptor + 4.11.0 + + + com.google.code.gson + gson + 2.10.1 + + + io.gsonfire + gson-fire + 1.8.5 + + + com.fasterxml.jackson.core + jackson-databind + 2.15.2 + + + com.pivovarit + throwing-function + 1.5.1 + + + name.falgout.jeffrey + throwing-streams + 3.2.0 + + + name.falgout.jeffrey + throwing-interfaces + 1.2.0 + + + com.optimaize.languagedetector + language-detector + 0.6 + + + org.apache.commons + commons-lang3 + 3.12.0 + + + org.jsoup + jsoup + 1.16.1 + + + org.apache.commons + commons-collections4 + 4.4 + + + org.hsqldb + hsqldb + 2.7.2 + + + javax.ws.rs + javax.ws.rs-api + 2.1.1 + + + com.uwetrottmann.thetvdb-java + thetvdb-java + 2.4.0 + + + com.miglayout + miglayout-swing + 11.1 + + + org.reflections + reflections + 0.10.2 + + + com.massisframework + j-text-utils + 0.3.4 + + + + commons-lang + commons-lang + + + + + org.openapitools + jackson-databind-nullable + 0.2.6 + + + org.codehaus.plexus + plexus-interactivity-api + 1.1 + + + junit + junit + + + + + org.json + json + 20230618 + + + net.jodah + typetools + 0.6.3 + + + org.jooq + joor + 0.9.14 + - - org.mockito - mockito-core - 5.4.0 - test - - - org.assertj - assertj-core - 3.24.2 - test - - - org.junit.jupiter - junit-jupiter-api - 5.9.3 - test - - - + + org.mockito + mockito-core + 5.4.0 + test + + + org.assertj + assertj-core + 3.24.2 + test + + + org.junit.jupiter + junit-jupiter-api + 5.9.3 + test + + + \ No newline at end of file From 3a7aa89d5181950a45b7d1143a9ad2ef067c2258 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 1 Jun 2024 22:08:26 +0200 Subject: [PATCH 03/54] changes --- .../javax/swing/JCheckBox/JCheckBoxExt.java | 2 +- .../cli/CommandLine/CommandLineExt.java | 2 +- .../subtools/multisubdownloader/App.java | 3 +- .../subtools/multisubdownloader/CLI.java | 1 - .../gui/panels/preference/StructurePanel.java | 16 ++--- .../lib/control/MovieReleaseControl.java | 6 +- .../lib/library/LibraryBuilder.java | 8 +-- .../settings/model/Settings.java | 1 - .../subtitleproviders/adapters/Adapter.java | 24 +++----- .../opensubtitles/OpenSubtitlesApi.java | 13 ++-- .../tvsubtitles/JTVSubtitlesApi.java | 7 +-- .../java/util/Optional/OptionalExtension.java | 30 ++++----- .../sublibrary/control/VideoPatterns.java | 48 +++++++++------ pom.xml | 61 +++++++++---------- 14 files changed, 102 insertions(+), 120 deletions(-) diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java index 0ff595f8..e6b8d2d7 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java @@ -11,7 +11,7 @@ @Extension @UtilityClass -public class JCheckBoxExtension { +public class JCheckBoxExt { public static @Self JCheckBox addCheckedChangeListener(@This JCheckBox checkBox, BooleanConsumer... listeners) { checkBox.addItemListener(e -> Arrays.stream(listeners).forEach(listener -> listener.accept(((JCheckBox) e.getSource()).isSelected()))); diff --git a/MultiSubDownloader/src/main/java/extensions/org/apache/commons/cli/CommandLine/CommandLineExt.java b/MultiSubDownloader/src/main/java/extensions/org/apache/commons/cli/CommandLine/CommandLineExt.java index 59a9cc5a..0beb2719 100644 --- a/MultiSubDownloader/src/main/java/extensions/org/apache/commons/cli/CommandLine/CommandLineExt.java +++ b/MultiSubDownloader/src/main/java/extensions/org/apache/commons/cli/CommandLine/CommandLineExt.java @@ -8,7 +8,7 @@ @Extension @UtilityClass -public class CLIExtension { +public class CommandLineExt { public static boolean hasCliOption(@This CommandLine line, CliOption cliOption) { return line.hasOption(cliOption.getValue()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java index c5773d48..003218cb 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java @@ -26,7 +26,6 @@ import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; -import org.lodder.subtools.multisubdownloader.util.CLIExtension; import org.lodder.subtools.sublibrary.ConfigProperties; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.cache.CacheType; @@ -37,7 +36,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@ExtensionMethod({ CLIExtension.class, Files.class }) +@ExtensionMethod({ Files.class }) public class App { private static SettingsControl prefCtrl; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 0ba21335..307cb807 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -35,7 +35,6 @@ import lombok.experimental.ExtensionMethod; -@ExtensionMethod({ CLIExtension.class }) public class CLI { private static final Logger LOGGER = LoggerFactory.getLogger(CLI.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java index a96f3d32..f74976ae 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java @@ -1,22 +1,14 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; -import java.io.Serial; - -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JPanel; - -import org.lodder.subtools.multisubdownloader.Messages; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; - +import javax.swing.*; import java.awt.event.ActionListener; +import java.io.Serial; import lombok.AccessLevel; import lombok.Getter; -import lombok.experimental.ExtensionMethod; +import org.lodder.subtools.multisubdownloader.Messages; +import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -@ExtensionMethod({ JCheckBoxExtension.class }) public abstract class StructurePanel> extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java index c04174b2..86db91ed 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java @@ -15,8 +15,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.experimental.ExtensionMethod; - public class MovieReleaseControl extends ReleaseControl { private final ImdbAdapter imdbAdapter; private final OmdbAdapter omdbAdapter; @@ -45,10 +43,10 @@ public void process() throws ReleaseControlException { if (movieDetails.isEmpty()) { movieDetails = movieRelease.getImdbId().mapToObj(omdbAdapter::getMovieDetails).orElseGet(Optional::empty); } - movieDetails.ifPresentDo(info -> { + movieDetails.ifPresentOrElse(info -> { movieRelease.setYear(info.year()); movieRelease.setName(info.getName()); - }).ifEmptyDo(() -> LOGGER.error("Unable to get details from OMDB API, continue with filename info {}", movieRelease)); + }, () -> LOGGER.error("Unable to get details from OMDB API, continue with filename info {}", movieRelease)); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java index 7092ff4e..c4ac0dd2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java @@ -4,15 +4,13 @@ import java.util.List; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.settings.model.structure.StructureTag; import org.lodder.subtools.sublibrary.data.tvdb.TheTvdbAdapter; import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbSerie; import org.lodder.subtools.sublibrary.model.Release; -import lombok.RequiredArgsConstructor; -import lombok.experimental.ExtensionMethod; - @RequiredArgsConstructor public abstract class LibraryBuilder { @@ -31,8 +29,8 @@ protected String replace(String structure, StructureTag tag, String value) { protected String replaceFormattedEpisodeNumber(String structure, StructureTag tag, List episodeNumbers, boolean leadingZero) { if (structure.contains(tag.getLabel())) { - String afterLabel = structure.substringAfter(tag.getLabel()); - String separator = afterLabel.isNotEmpty() ? afterLabel.substring(0, 1) : ""; + String afterLabel =StringUtils.substringAfter(structure, tag.getLabel()); + String separator = StringUtils.isNotEmpty(afterLabel) ? afterLabel.substring(0, 1) : ""; if ("%".equals(separator)) { separator = ""; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java index ccce4693..c2f1e2fe 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java @@ -24,7 +24,6 @@ @Getter @Setter @Accessors(chain = true) -@ExtensionMethod({ Arrays.class }) public class Settings implements UserInteractionSettingsIntf { private Path lastOutputDir; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 0e500a32..7a65627b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -14,6 +14,7 @@ import java.util.function.Function; import java.util.function.Supplier; +import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; @@ -31,8 +32,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.experimental.ExtensionMethod; - /** * @param type of the subtitle objects returned by the api * @param type of the ProviderSerieId @@ -137,7 +136,7 @@ default Optional getProviderSerieId(String serieName, String displ default Optional getProviderSerieId(String serieName, String serieNameToSearchFor, String displayName, int season, OptionalInt tvdbIdOptional) throws X { Supplier> tvdbIdValueBuilder = - () -> mapToObj(tvdbIdOptional, tvdbId -> getManager().valueBuilder().cacheType(CacheType.DISK) + () -> tvdbIdOptional.mapToObj(tvdbId -> getManager().valueBuilder().cacheType(CacheType.DISK) .key("%s-serieName-tvdbId:%s-%s".formatted(getProviderName(), tvdbId, useSeasonForSerieId() ? season : -1))).orElseThrow(); if (tvdbIdOptional.isPresent() && tvdbIdValueBuilder.get().isPresent()) { @@ -153,20 +152,15 @@ default Optional getProviderSerieId(String serieName, String serie .key("%s-serieName-name:%s-%s".formatted(getProviderName(), serieName.toLowerCase(), seasonToUse)); if (StringUtils.equals(serieNameToSearchFor, serieName) && serieNameValueBuilder.isPresent()) { - boolean returnValue; - Optional value; if (serieNameValueBuilder.isTemporaryObject()) { - returnValue = !serieNameValueBuilder.isExpiredTemporary(); - value = Optional.empty(); + if (!serieNameValueBuilder.isExpiredTemporary()) { + return Optional.empty(); + } } else { - value = serieNameValueBuilder.returnType(SerieMapping.class).getOptional(); - returnValue = true; - } - if (returnValue) { - // if value using the name is present, return it - // if tvdbId is known, also persist the value using the tvdbId - return ifPresentDo(value, + Optional serieMapping = serieNameValueBuilder.returnType(SerieMapping.class).getOptional(); + serieMapping.ifPresent( providerSerieName -> tvdbIdOptional.ifPresent(tvdbId -> tvdbIdValueBuilder.get().value(providerSerieName).store())); + return serieMapping; } } @@ -196,7 +190,7 @@ default Optional getProviderSerieId(String serieName, String serie Optional uriForSerie; // Check if the previous results were the same for the service. If so, don't ask the user to select again if (previousResultsPresent - && previousResultsValueBuilder.returnType((Class>) null, null).getCollection().equals(providerSerieIds)) { + && previousResultsValueBuilder.returnType((Class>) null, null).getCollection().equals(providerSerieIds)) { uriForSerie = Optional.empty(); } else { // let the user select the correct provider serie id diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java index d9b43ec1..84d581f4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java @@ -4,14 +4,13 @@ import java.nio.charset.StandardCharsets; import java.util.List; -import org.json.JSONArray; +import lombok.Getter; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleApi; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.exception.OpenSubtitlesException; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.model.OpensubtitleSerieId; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.model.SubtitleSource; -import org.lodder.subtools.sublibrary.util.JSONUtils; import org.lodder.subtools.sublibrary.util.http.HttpClientException; import org.opensubtitles.api.AuthenticationApi; import org.opensubtitles.invoker.ApiClient; @@ -19,10 +18,6 @@ import org.opensubtitles.model.Login200Response; import org.opensubtitles.model.LoginRequest; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ JSONUtils.class }) public class OpenSubtitlesApi implements SubtitleApi { private static final String APIKEY = "lNNp0yv0ah8gytkmYPbHwuaATJqr4rS9"; @@ -73,7 +68,7 @@ public DownloadSubtitle downloadSubtitle() { public List getProviderSerieIds(String serieName) throws OpenSubtitlesException { try { - JSONArray shows = manager.getPageContentBuilder() + return manager.getPageContentBuilder() .url("https://www.opensubtitles.org/libs/suggest.php?format=json3&MovieName=" + URLEncoder.encode(serieName.toLowerCase(), StandardCharsets.UTF_8)) .userAgent("") @@ -81,8 +76,8 @@ public List getProviderSerieIds(String serieName) throws Op .retries(1) .retryPredicate(exception -> exception instanceof HttpClientException e && e.getResponseCode() == 429) .retryWait(5) - .getAsJsonArray(); - return shows.stream() + .getAsJsonArray() + .stream() .filter(show -> "tv".equals(show.getString("kind"))) .map(show -> new OpensubtitleSerieId(show.getString("name"), show.getInt("id"), show.getString("year"))) .toList(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index e39f0e49..7303f799 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -9,6 +9,7 @@ import java.util.function.BiPredicate; import java.util.function.Function; +import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -25,8 +26,6 @@ import org.lodder.subtools.sublibrary.settings.model.SerieMapping; import org.lodder.subtools.sublibrary.util.StreamExtension; -import lombok.experimental.ExtensionMethod; - @ExtensionMethod({ StreamExtension.class }) public class JTVSubtitlesApi extends Html implements SubtitleApi { @@ -54,11 +53,11 @@ public List getUrisForSerieName(String serieName) throws TvSubt public Set getSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) throws TvSubtitlesException { return getEpisodeUrl(SERIE_URL_PREFIX + providerSerieId.getProviderId(), season, episode) - .mapToObj(episodeUrl -> getSubtitles(episodeUrl, language)) + .mapToObj((String episodeUrl) -> getSubtitles(episodeUrl, language)) .orElseGet(Set::of); } - private Set getSubtitles(String episodeUrl, Language language) throws TvSubtitlesException { + private Set getSubtitles(String episodeUrl, Language language) throws TvSubtitlesException { return getManager().valueBuilder() .memoryCache() .key("%s-subtitles-%s-%s".formatted(getSubtitleSource().name(), episodeUrl, language)) diff --git a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java index 9ad97c77..531936f7 100644 --- a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java +++ b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.function.Function; +import java.util.function.Supplier; import lombok.experimental.UtilityClass; import manifold.ext.rt.api.Extension; @@ -190,15 +191,16 @@ public static OptionalInt mapToInt(@This Optional op return optional.isPresent() ? OptionalInt.of(mapper.applyAsInt(optional.get())) : OptionalInt.empty(); } // - public static OptionalInt mapToOptionalInt(@This Optional optional) { - return optional.map(OptionalInt::of).orElseGet(OptionalInt::empty); - } + public static OptionalInt mapToOptionalInt(@This Optional optional) { + return optional.map(OptionalInt::of).orElseGet(OptionalInt::empty); + } // // // // - // public static Optional mapToObj(@This Optional optional, ThrowingFunction mapper) throws X { - // return optional.isPresent() ? Optional.ofNullable(mapper.apply(optional.get())) : Optional.empty(); - // } + public static Optional mapToObj(@This Optional optional, ThrowingFunction mapper) throws X { + return optional.isPresent() ? Optional.ofNullable(mapper.apply(optional.get())) : Optional.empty(); + } + // // // // @@ -210,12 +212,12 @@ public static OptionalInt mapToOptionalInt(@This Optional optional) { // // // // - // public static void ifPresentOrThrow(@This Optional optional, ThrowingConsumer consumer, - // Supplier exceptionSupplier) throws X { - // if (optional.isPresent()) { - // consumer.accept(optional.get()); - // } else { - // throw exceptionSupplier.get(); - // } - // } + public static void ifPresentOrThrow(@This Optional optional, ThrowingConsumer consumer, + Supplier exceptionSupplier) throws X { + if (optional.isPresent()) { + consumer.accept(optional.get()); + } else { + throw exceptionSupplier.get(); + } + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java index 937c5480..74ab1ffb 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java @@ -9,15 +9,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.lodder.subtools.sublibrary.util.NamedPattern; - import lombok.Getter; import lombok.RequiredArgsConstructor; -import lombok.experimental.ExtensionMethod; import lombok.experimental.UtilityClass; +import org.lodder.subtools.sublibrary.util.NamedPattern; @UtilityClass -@ExtensionMethod({ Arrays.class }) public class VideoPatterns { public interface VideoPatternEnumIntf { @@ -31,7 +28,7 @@ public enum Quality implements VideoPatternEnumIntf { Q720P("720p"), Q480P("480p"); - final String value; + private final String value; public static Stream getValuesStream() { return Quality.values().stream().map(Quality::getValue); @@ -43,7 +40,7 @@ public enum VideoEncoding implements VideoPatternEnumIntf { X264("x264", "h264"), X265("x265", "h265"); - final String[] values; + private final String[] values; VideoEncoding(String... values) { this.values = values; @@ -58,7 +55,7 @@ public static Stream getValuesStream() { public enum AudioEncoding implements VideoPatternEnumIntf { DD5_1("dd5.1", "dd5-1"); - final String[] values; + private final String[] values; AudioEncoding(String... values) { this.values = values; @@ -90,7 +87,7 @@ public enum Source implements VideoPatternEnumIntf { static final Map VALUE_MAP = new HashMap<>(); static { - Arrays.stream(Source.values()).forEach(source -> Arrays.stream(source.getValues()).forEach(value -> VALUE_MAP.put(value, source))); + Source.values().stream().forEach(source -> Arrays.stream(source.getValues()).forEach(value -> VALUE_MAP.put(value, source))); } final boolean manyDifferentSources; @@ -129,7 +126,7 @@ public enum VideoExtensions { TS("ts"), M4V("m4v"); - final String value; + private final String value; } private static final Set QUALITY_KEYWORDS_SET = Set.of("hdtv", "dvdrip", "bluray", @@ -144,17 +141,25 @@ public enum VideoExtensions { private static final String[] PATTERNS = { // example: // Back.to.the.Future.Part.II.1989.720p.BluRay.X264-AMIABLE.mkv - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[I|V|X]+)[. ](?19\\d{2}|20\\d{2})(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[I|V|X]+)[. ](?19\\d{2}|20\\d{2})(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[I|V|X]+)[. ](?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[I|V|X]+)[. ](?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)", // The.Hunger.Games.Mockingjay.Part.1..2014.720p.BluRay.x264-SPARKS.mkv - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1})[. ](?19\\d{2}|20\\d{2})(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1})[. ](?19\\d{2}|20\\d{2})(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1})[. ](?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1})[. ](?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)", // serie - "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})(?[XxEe][\\d]{1,2})*[XxEe](?[\\d]{1,2})(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,3})(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})" + + "(?[XxEe][\\d]{1,2})*[XxEe](?[\\d]{1,2})(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,3})(?['\\w\\s:&()" + + "!.,_-]+)", // sXeX - Serienaam - Titel ex: S04E02 - White Collar - Most Wanted.mkv - "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})(?[XxEe][\\d]{1,2})*[XxEe](?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)", - "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)", + "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})(?[XxEe][\\d]{1,2})*[XxEe]" + + "(?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)", + "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+" + + "(?['\\w\\s:&()!.,_]+)", // example: hawaii.five-0.2010.410.hdtv-lol.mp4 // example: // Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv @@ -163,7 +168,8 @@ public enum VideoExtensions { "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1,2})(?['\\w\\s:&()!.,_-]+)", "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1,2})(?['\\w\\s:&()!.,_-]+)", // example hawaii.five-0.2010.410.hdtv-lol.mp4 - "(?['\\w\\s:&()!.,_-]+)[. ](?19\\d{2}|20\\d{2})[. ](?[\\d]{3,4})[. ](?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)[. ](?19\\d{2}|20\\d{2})[. ](?[\\d]{3,4})[. ](?['\\w\\s:&()!.," + + "_-]+)", // format movietitle.year "(?['\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}(?19\\d{2}|20\\d{2})(?['\\w\\s:&()!.,_-]+)", // format episode.0101.title @@ -171,8 +177,10 @@ public enum VideoExtensions { // exclude format movietitle.720p "(?['\\w\\s:&()!.,_-]+)[. ](?[\\d]{3,4})[. ](?['\\w\\s:&()!.,_-]+)", // format (2-11) Joey and the High School Friend - "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ ]and(?['\\w\\s:&()!.,_-]+)", - "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ ]And(?['\\w\\s:&()!.,_-]+)", + "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ ]and(?['\\w\\s:&()!" + + ".,_-]+)", + "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ ]And(?['\\w\\s:&()!" + + ".,_-]+)", // take the rest and treat as movie "(?['\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}[720P|1080P](?['\\w\\s:&()!.,_-]+)" diff --git a/pom.xml b/pom.xml index f6e51081..6247f874 100644 --- a/pom.xml +++ b/pom.xml @@ -8,10 +8,11 @@ UTF-8 - 2024.1.15 + 2024.1.16 1.18.32 21 21 + 21 @@ -41,6 +42,10 @@ UTF-8 true + + -Xplugin:Manifold + -verbose + org.projectlombok @@ -53,12 +58,12 @@ org.apache.maven.plugins maven-release-plugin - 2.5.1 + 3.0.1 org.codehaus.mojo findbugs-maven-plugin - 3.0.1 + 3.0.5 Max Medium @@ -76,7 +81,7 @@ org.jacoco jacoco-maven-plugin - 0.5.8.201207111220 + 0.8.12 @@ -95,30 +100,24 @@ org.codehaus.mojo exec-maven-plugin - 3.1.0 + 3.3.0 maven-assembly-plugin - 3.6.0 + 3.7.1 org.apache.maven.plugins maven-jar-plugin - 3.3.0 + 3.4.1 org.codehaus.mojo properties-maven-plugin - 1.1.0 + 1.2.1 - - - - - - @@ -136,7 +135,7 @@ commons-cli commons-cli - 1.5.0 + 1.8.0 systems.manifold @@ -152,12 +151,12 @@ ch.qos.logback logback-classic - 1.1.2 + 1.5.6 org.openapitools openapi-generator-core - 6.6.0 + 7.6.0 javax.annotation @@ -167,27 +166,27 @@ io.swagger swagger-annotations - 1.6.10 + 1.6.14 com.squareup.okhttp3 logging-interceptor - 4.11.0 + 4.12.0 com.google.code.gson gson - 2.10.1 + 2.11.0 io.gsonfire gson-fire - 1.8.5 + 1.9.0 com.fasterxml.jackson.core jackson-databind - 2.15.2 + 2.17.1 com.pivovarit @@ -212,12 +211,12 @@ org.apache.commons commons-lang3 - 3.12.0 + 3.14.0 org.jsoup jsoup - 1.16.1 + 1.17.2 org.apache.commons @@ -227,7 +226,7 @@ org.hsqldb hsqldb - 2.7.2 + 2.7.3 javax.ws.rs @@ -242,7 +241,7 @@ com.miglayout miglayout-swing - 11.1 + 11.3 org.reflections @@ -280,7 +279,7 @@ org.json json - 20230618 + 20240303 net.jodah @@ -290,25 +289,25 @@ org.jooq joor - 0.9.14 + 0.9.15 org.mockito mockito-core - 5.4.0 + 5.12.0 test org.assertj assertj-core - 3.24.2 + 3.26.0 test org.junit.jupiter junit-jupiter-api - 5.9.3 + 5.10.2 test From c443123aef8ed24fe6f938c4e45be64523f53992 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 1 Jun 2024 22:33:19 +0200 Subject: [PATCH 04/54] changes --- .../subtools/multisubdownloader/GUI.java | 2 - .../actions/CleanAction.java | 15 +++--- .../actions/DownloadAction.java | 10 ++-- .../actions/FileListAction.java | 9 ++-- .../actions/RenameAction.java | 8 ++- .../cli/actions/CliSearchAction.java | 3 +- .../gui/dialog/RenameDialog.java | 26 +++------- ...oupFilter.java => ReleaseGroupFilter.java} | 0 .../settings/SettingValue.java | 4 +- .../subtitleproviders/Local.java | 8 ++- .../java/nio/file/Path/PathExt.java} | 49 +++++++++++-------- .../subtools/sublibrary/cache/DiskCache.java | 12 ++--- .../sublibrary/control/ReleaseParser.java | 4 +- .../util/filefilter/ExtensionFileFilter.java | 4 +- .../sublibrary/util/http/HttpClient.java | 13 +++-- 15 files changed, 73 insertions(+), 94 deletions(-) rename MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/{ReleasegroupFilter.java => ReleaseGroupFilter.java} (100%) rename SubLibrary/src/main/java/{org/lodder/subtools/sublibrary/util/FileUtils.java => extensions/java/nio/file/Path/PathExt.java} (85%) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index 8d377771..f1b5907c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -61,13 +61,11 @@ import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; import org.lodder.subtools.sublibrary.model.Subtitle; import org.lodder.subtools.sublibrary.model.VideoType; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.lodder.subtools.sublibrary.util.StringUtil; import org.lodder.subtools.sublibrary.util.TriConsumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@ExtensionMethod({ FileUtils.class }) public class GUI extends JFrame implements PropertyChangeListener { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java index a778af81..fefbdf61 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java @@ -9,21 +9,20 @@ import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; import org.lodder.subtools.sublibrary.model.Release; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.lodder.subtools.sublibrary.util.StreamExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import lombok.experimental.ExtensionMethod; -@ExtensionMethod({ StringUtils.class, FileUtils.class, Files.class, StreamExtension.class }) +@ExtensionMethod({ StringUtils.class, Files.class, StreamExtension.class }) public class CleanAction { private static final Logger LOGGER = LoggerFactory.getLogger(CleanAction.class); + private static final String SAMPLE_DIR_NAME = "sample"; private final LibrarySettings librarySettings; private final Set fileFilters = Set.of("nfo", "jpg", "sfv", "srr", "srs", "nzb", "torrent", "txt"); - private final static String sampleDirName = "sample"; public CleanAction(LibrarySettings librarySettings) { this.librarySettings = librarySettings; @@ -36,7 +35,7 @@ public void cleanUpFiles(Release release, Path destination, String videoFileName } release.getPath().list().asThrowingStream(IOException.class) - .filter(p -> (p.isDirectory() && p.fileNameContainsIgnoreCase(sampleDirName)) + .filter(p -> (p.isDirectory() && p.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME)) || (p.isRegularFile() && fileFilters.contains(p.getExtension()))) .forEach(p -> { switch (librarySettings.getLibraryOtherFileAction()) { @@ -52,7 +51,7 @@ public void cleanUpFiles(Release release, Path destination, String videoFileName private void rename(Path path, Path destinationFolder, String videoFileName) throws IOException { if (path.isRegularFile()) { - String fileName = path.fileNameContainsIgnoreCase(sampleDirName) ? sampleDirName : StringUtils.substringBeforeLast(videoFileName, "."); + String fileName = path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : StringUtils.substringBeforeLast(videoFileName, "."); String extension = path.getExtension(); if (!extension.isBlank()) { extension = "." + extension; @@ -64,12 +63,12 @@ private void rename(Path path, Path destinationFolder, String videoFileName) thr } private void delete(Path path) throws IOException { - FileUtils.delete(path); + path.deletePath(); } private void moveAndRename(Path path, Path destinationFolder, String videoFileName) throws IOException { if (path.isRegularFile()) { - String fileName = path.fileNameContainsIgnoreCase(sampleDirName) ? sampleDirName : StringUtils.substringBeforeLast(videoFileName, "."); + String fileName = path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : StringUtils.substringBeforeLast(videoFileName, "."); String extension = path.getExtension(); if (!extension.isBlank()) { extension = "." + extension; @@ -81,7 +80,7 @@ private void moveAndRename(Path path, Path destinationFolder, String videoFileNa } private void move(Path origin, Path destinationFolder) throws IOException { - FileUtils.moveToDir(origin, destinationFolder, StandardCopyOption.REPLACE_EXISTING); + origin.moveToDir(destinationFolder, StandardCopyOption.REPLACE_EXISTING); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java index 51e9d507..8c4b6bbd 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java @@ -4,6 +4,8 @@ import java.nio.file.Files; import java.nio.file.Path; +import lombok.RequiredArgsConstructor; +import lombok.experimental.ExtensionMethod; import org.lodder.subtools.multisubdownloader.lib.library.FilenameLibraryBuilder; import org.lodder.subtools.multisubdownloader.lib.library.LibraryActionType; import org.lodder.subtools.multisubdownloader.lib.library.LibraryOtherFileActionType; @@ -17,14 +19,10 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.RequiredArgsConstructor; -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ FileUtils.class, Files.class }) +@ExtensionMethod({ Files.class }) @RequiredArgsConstructor public class DownloadAction { @@ -93,7 +91,7 @@ private void download(Release release, Subtitle subtitle, LibrarySettings librar cleanAction.cleanUpFiles(release, path, videoFileName); } if (librarySettings.isLibraryRemoveEmptyFolders() && release.getPath().isEmptyDir()) { - FileUtils.delete(release.getPath()); + release.getPath().deletePath(); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java index a01cdd09..f4daae0f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java @@ -9,18 +9,17 @@ import java.util.Optional; import java.util.Set; +import extensions.java.nio.file.Path.PathExt; +import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.listeners.IndexingProgressListener; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.control.VideoPatterns; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ Files.class, FileUtils.class }) +@ExtensionMethod({ Files.class }) public class FileListAction { private IndexingProgressListener indexingProgressListener; @@ -138,7 +137,7 @@ public boolean fileHasSubtitles(Path file, Language language) throws IOException } List filters = langCodes.stream().map(word -> word + "." + subtitleExtension).toList(); String subtitleNameWithoutExtension = subtitleName.replace(subtitleExtensionWithDot, ""); - return file.getParent().list().map(FileUtils::getFileNameAsString).filter(fileName -> filters.stream().anyMatch(fileName::endsWith)) + return file.getParent().list().map(PathExt::getFileNameAsString).filter(fileName -> filters.stream().anyMatch(fileName::endsWith)) .anyMatch(fileName -> fileName.contains(subtitleNameWithoutExtension)); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java index dfd8d580..6f50e08d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java @@ -4,6 +4,8 @@ import java.nio.file.Files; import java.nio.file.Path; +import lombok.RequiredArgsConstructor; +import lombok.experimental.ExtensionMethod; import org.lodder.subtools.multisubdownloader.lib.library.FilenameLibraryBuilder; import org.lodder.subtools.multisubdownloader.lib.library.LibraryActionType; import org.lodder.subtools.multisubdownloader.lib.library.LibraryOtherFileActionType; @@ -14,14 +16,10 @@ import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.RequiredArgsConstructor; -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ FileUtils.class, Files.class }) +@ExtensionMethod({ Files.class }) @RequiredArgsConstructor public class RenameAction { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java index d11ade2e..5d342da9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java @@ -29,11 +29,10 @@ import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@ExtensionMethod({FileUtils.class, Files.class}) +@ExtensionMethod({ Files.class}) @Setter public class CliSearchAction extends SearchAction { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index 0fcefca6..313f0c49 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.dialog; +import javax.swing.*; +import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; @@ -11,14 +13,10 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingWorker; - +import com.google.common.collect.Streams; +import lombok.Setter; +import lombok.experimental.ExtensionMethod; +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.actions.RenameAction; import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; @@ -41,18 +39,8 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.lodder.subtools.sublibrary.util.StreamExtension; -import com.google.common.collect.Streams; - -import java.awt.BorderLayout; -import java.awt.FlowLayout; - -import lombok.Setter; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - @ExtensionMethod({ JTextFieldExtension.class, ContainerExtension.class, JButtonExtension.class, AbstractButtonExtension.class, JComponentExtension.class }) public class RenameDialog extends MultiSubDialog implements PropertyChangeListener { @@ -136,7 +124,7 @@ public void propertyChange(PropertyChangeEvent event) { } } - @ExtensionMethod({ FileUtils.class, Files.class, StreamExtension.class }) + @ExtensionMethod({ Files.class, StreamExtension.class }) private static class TypedRenameWorker extends SwingWorker implements Cancelable { private final UserInteractionHandler userInteractionHandler; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleasegroupFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java similarity index 100% rename from MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleasegroupFilter.java rename to MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java index 80ca9b49..a3347440 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java @@ -13,6 +13,7 @@ import com.google.common.base.CaseFormat; import com.google.common.base.Objects; +import extensions.java.nio.file.Path.PathExt; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -29,7 +30,6 @@ import org.lodder.subtools.multisubdownloader.settings.model.UpdateType; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.control.VideoPatterns; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.lodder.subtools.sublibrary.util.TriConsumer; public enum SettingValue { @@ -484,7 +484,7 @@ private static SettingTypedRootElementFunctionIntf createSettingBoolean private static SettingTypedRootElementFunctionIntf createSettingPath() { return createSetting(Path.class) - .toStringMapper(FileUtils::toAbsolutePathAsString) + .toStringMapper(PathExt::toAbsolutePathAsString) .toObjectMapper(Path::of); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index 09bd5449..c1bb1891 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -8,6 +8,8 @@ import java.util.Optional; import java.util.Set; +import lombok.Getter; +import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.NotImplementedException; import org.lodder.subtools.multisubdownloader.lib.control.MovieReleaseControl; import org.lodder.subtools.multisubdownloader.lib.control.TvReleaseControl; @@ -27,15 +29,11 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.lodder.subtools.sublibrary.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ FileUtils.class, Files.class }) +@ExtensionMethod({ Files.class }) public class Local implements SubtitleProvider { private static final Logger LOGGER = LoggerFactory.getLogger(Local.class); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/FileUtils.java b/SubLibrary/src/main/java/extensions/java/nio/file/Path/PathExt.java similarity index 85% rename from SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/FileUtils.java rename to SubLibrary/src/main/java/extensions/java/nio/file/Path/PathExt.java index ddbed2ed..3cd2e051 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/FileUtils.java +++ b/SubLibrary/src/main/java/extensions/java/nio/file/Path/PathExt.java @@ -1,4 +1,4 @@ -package org.lodder.subtools.sublibrary.util; +package extensions.java.nio.file.Path; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; @@ -15,28 +15,35 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import org.apache.commons.lang3.StringUtils; - import lombok.experimental.ExtensionMethod; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; import name.falgout.jeffrey.throwing.ThrowingConsumer; import name.falgout.jeffrey.throwing.ThrowingFunction; +import org.apache.commons.lang3.StringUtils; +import org.lodder.subtools.sublibrary.util.CopyDirVisitor; +import org.lodder.subtools.sublibrary.util.DeleteDirVisitor; +import org.lodder.subtools.sublibrary.util.StreamExtension; @ExtensionMethod({ StreamExtension.class }) -public class FileUtils { +@UtilityClass +@Extension +public class PathExt { - public static String getExtension(Path path) { + public static String getExtension(@This Path path) { return StringUtils.substringAfterLast(path.getFileName().toString(), "."); } - public static boolean hasExtension(Path path, String extension) { + public static boolean hasExtension(@This Path path, String extension) { return extension.equalsIgnoreCase(getExtension(path)); } - public static String changeExtension(Path path, String newExtension) { + public static String changeExtension(@This Path path, String newExtension) { return StringUtils.substringBeforeLast(path.getFileName().toString(), ".") + "." + newExtension; } - public static String withoutExtension(Path path) { + public static String withoutExtension(@This Path path) { return changeExtension(path, ""); } @@ -44,7 +51,7 @@ public static String withoutExtension(String path) { return StringUtils.substringBeforeLast(path, "."); } - public static String toAbsolutePathAsString(Path path) { + public static String toAbsolutePathAsString(@This Path path) { return path.toAbsolutePath().toString(); } @@ -74,7 +81,7 @@ public static String toAbsolutePathAsString(Path path) { * @throws IOException * if an I/O error occurs while moving the path */ - public static Path moveToDir(Path source, Path destinationDir, StandardCopyOption... copyOptions) throws IOException { + public static Path moveToDir(@This Path source, Path destinationDir, StandardCopyOption... copyOptions) throws IOException { return moveToDirAndRename(source, destinationDir, source.getFileName().toString(), copyOptions); } @@ -107,7 +114,7 @@ public static Path moveToDir(Path source, Path destinationDir, StandardCopyOptio * @throws IOException * if an I/O error occurs while moving the path */ - public static Path moveToDirAndRename(Path source, Path destinationDir, String newFileName, StandardCopyOption... copyOptions) + public static Path moveToDirAndRename(@This Path source, Path destinationDir, String newFileName, StandardCopyOption... copyOptions) throws IOException { Files.createDirectories(destinationDir); if (Files.isRegularFile(source)) { @@ -155,7 +162,7 @@ private static Path moveNonEmptyDirectoryRecursively(Path source, Path target, S * if an I/O error occurs while deleting the path */ // TODO change name? (nameclash) - public static void delete(Path path) throws IOException { + public static void deletePath(@This Path path) throws IOException { Files.walkFileTree(path, new DeleteDirVisitor()); } @@ -185,7 +192,7 @@ public static void delete(Path path) throws IOException { * @throws IOException * if an I/O error occurs while deleting the path */ - public static Path copyToDir(Path source, Path destinationDir, StandardCopyOption... copyOptions) throws IOException { + public static Path copyToDir(@This Path source, Path destinationDir, StandardCopyOption... copyOptions) throws IOException { return copyToDirAndRename(source, destinationDir, source.getFileName().toString(), copyOptions); } @@ -218,7 +225,7 @@ public static Path copyToDir(Path source, Path destinationDir, StandardCopyOptio * @throws IOException * if an I/O error occurs while deleting the path */ - public static Path copyToDirAndRename(Path source, Path destinationDir, String newFileName, StandardCopyOption... copyOptions) + public static Path copyToDirAndRename(@This Path source, Path destinationDir, String newFileName, StandardCopyOption... copyOptions) throws IOException { if (Files.isRegularFile(source)) { Files.createDirectories(destinationDir); @@ -233,36 +240,36 @@ public static Path copyToDirAndRename(Path source, Path destinationDir, String n } } - public static String getFileNameAsString(Path path) { + public static String getFileNameAsString(@This Path path) { return path.getFileName().toString(); } - public static boolean fileNameContains(Path path, String text) { + public static boolean fileNameContains(@This Path path, String text) { return path.getFileName().toString().contains(text); } - public static boolean fileNameContainsIgnoreCase(Path path, String text) { + public static boolean fileNameContainsIgnoreCase(@This Path path, String text) { return StringUtils.containsIgnoreCase(path.getFileName().toString(), text); } - public static boolean isEmptyDir(Path path) throws IOException { + public static boolean isEmptyDir(@This Path path) throws IOException { requireDir(path); return applySubfiles(path, children -> children.findAny().isEmpty()); } - public static T applySubfiles(Path path, ThrowingFunction, T, X> function) throws IOException, X { + public static T applySubfiles(@This Path path, ThrowingFunction, T, X> function) throws IOException, X { try (Stream pathStream = Files.list(path)) { return function.apply(pathStream); } } - public static void foreachSubfile(Path path, ThrowingConsumer, X> consumer) throws IOException, X { + public static void foreachSubfile(@This Path path, ThrowingConsumer, X> consumer) throws IOException, X { try (Stream pathStream = Files.list(path)) { consumer.accept(pathStream); } } - public static void requireDir(Path path) { + public static void requireDir(@This Path path) { if (!Files.isDirectory(path)) { throw new IllegalArgumentException("[%s] is not a directory".formatted(path)); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java index 6a90635f..b5905f3c 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java @@ -19,17 +19,15 @@ import java.util.Set; import java.util.function.Predicate; +import com.google.common.collect.Multimap; +import com.google.common.collect.MultimapBuilder; +import extensions.java.nio.file.Path.PathExt; +import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.lodder.subtools.sublibrary.util.lazy.LazyBiFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Multimap; -import com.google.common.collect.MultimapBuilder; - -import lombok.experimental.ExtensionMethod; - @ExtensionMethod({ Files.class }) public abstract class DiskCache extends Cache { @@ -91,7 +89,7 @@ public abstract class DiskCache extends Cache { LOGGER.error("Deleting cache file to fix errors"); connection.close(); try { - FileUtils.delete(path); + PathExt.delete(path); } catch (IOException e) { LOGGER.error("Error while deleting the cache file, please delete it yourself: %s (%s)".formatted(path, e.getMessage()), e); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java index aab6b332..0ef935bd 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java @@ -8,11 +8,11 @@ import java.util.regex.Pattern; import java.util.stream.IntStream; +import extensions.java.nio.file.Path.PathExt; import org.lodder.subtools.sublibrary.exception.ReleaseParseException; import org.lodder.subtools.sublibrary.model.MovieRelease; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.lodder.subtools.sublibrary.util.NamedMatcher; import org.lodder.subtools.sublibrary.util.NamedPattern; import org.slf4j.Logger; @@ -134,7 +134,7 @@ private Release parsePatternResult(Path file, String fileParseName) throws Relea .season(seasonNumber) .episodes(episodeNumbers) .file(file) - .description(FileUtils.withoutExtension(description)) + .description(PathExt.withoutExtension(description)) .releaseGroup(extractReleasegroup(file.getFileName().toString(), true)) .special(isSpecialEpisode(seasonNumber, episodeNumbers)) .quality(getQualityKeyword(fileParseName)) diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/ExtensionFileFilter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/ExtensionFileFilter.java index ee245716..118f9652 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/ExtensionFileFilter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/ExtensionFileFilter.java @@ -3,13 +3,11 @@ import javax.swing.filechooser.*; import java.io.File; -import org.lodder.subtools.sublibrary.util.FileUtils; - public abstract class ExtensionFileFilter extends FileFilter { @Override public boolean accept(File f) { - return f.isDirectory() || getExtension().equals(FileUtils.getExtension(f.toPath())); + return f.isDirectory() || getExtension().equals(f.toPath().getExtension()); } public abstract String getExtension(); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java index e3d940a9..c07f40ff 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java @@ -22,14 +22,13 @@ import java.util.stream.Collectors; import java.util.zip.GZIPInputStream; +import extensions.java.nio.file.Path.PathExt; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; -import org.lodder.subtools.sublibrary.util.FileUtils; import org.lodder.subtools.sublibrary.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.RequiredArgsConstructor; - @RequiredArgsConstructor public class HttpClient { @@ -112,11 +111,11 @@ public boolean doDownloadFile(URL url, final Path file) { byte[] data = in.readAllBytes(); in.close(); - if (url.getFile().endsWith(".zip") || FileUtils.isZipFile(new ByteArrayInputStream(data))) { - FileUtils.unzip(new ByteArrayInputStream(data), file, ".srt"); + if (url.getFile().endsWith(".zip") || PathExt.isZipFile(new ByteArrayInputStream(data))) { + PathExt.unzip(new ByteArrayInputStream(data), file, ".srt"); } else { - if (FileUtils.isGZipCompressed(data)) { - data = FileUtils.decompressGZip(data); + if (PathExt.isGZipCompressed(data)) { + data = PathExt.decompressGZip(data); } String content = new String(data, StandardCharsets.UTF_8); if (content.contains("Daily Download count exceeded")) { From 0e3ba93a3eb13e646edcdb9e9decb708fd42a00f Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 00:19:04 +0200 Subject: [PATCH 05/54] changes --- .../java/awt/Container/ContainerExt.java | 33 +++++++ .../AbstractButton/AbstractButtonExt.java | 46 ++++++++++ .../javax/swing/Component/ComponentExt.java | 36 ++++++++ .../javax/swing/JButton/JButtonExt.java | 18 ++++ .../javax/swing/JComponent/JComponentExt.java | 54 ++++++++++++ .../swing/JScrollPane/JScrollPaneExt.java | 20 +++++ .../swing/JTextField/JTextFieldExtension.java | 18 ++++ .../actions/CleanAction.java | 3 +- .../gui/dialog/MappingEpisodeNameDialog.java | 40 +++------ .../gui/dialog/PreferenceDialog.java | 20 +---- .../gui/dialog/RenameDialog.java | 11 +-- .../gui/dialog/SelectDialog.java | 4 - .../gui/dialog/StructureBuilderDialog.java | 5 +- .../gui/extra/JListWithImages.java | 3 - .../gui/extra/PanelCheckBox.java | 9 +- .../gui/extra/TitlePanel.java | 14 +-- .../gui/extra/table/SubtitleTableModel.java | 6 +- .../button/AbstractButtonExtension.java | 39 --------- .../jcomponent/button/JButtonExtension.java | 15 ---- .../container/ContainerExtension.java | 15 ---- .../jcomponent/JComponentExtension.java | 87 ------------------- .../jtextfield/JTextFieldExtension.java | 14 --- .../preference/DefaultSelectionPanel.java | 21 ++--- .../gui/panels/preference/GeneralPanel.java | 17 +--- .../gui/panels/preference/OptionsPanel.java | 14 +-- .../preference/SerieProvidersPanel.java | 10 +-- .../panels/preference/StructureFilePanel.java | 23 ++--- .../preference/StructureFolderPanel.java | 4 +- .../preference/SubtitleBackupPanel.java | 15 +--- .../panels/preference/VideoLibraryPanel.java | 16 ++-- .../control/subtitles/SubtitleFiltering.java | 4 +- .../subtitles/filters/ReleaseGroupFilter.java | 6 +- .../podnapisi/JPodnapisiApi.java | 10 +-- .../tvsubtitles/JTVSubtitlesApi.java | 3 - .../multisubdownloader/util/ExportImport.java | 27 +++--- .../java/lang/String/StringExt.java | 26 ++++++ .../java/nio/file/Path/PathExt.java | 3 - .../java/util/stream/Stream/StreamExt.java | 17 ++++ .../org/w3c/dom/NodeList}/XmlExtension.java | 10 ++- .../subtools/sublibrary/cache/DiskCache.java | 7 +- .../sublibrary/data/tvdb/TheTvdbMirrors.java | 18 ++-- .../sublibrary/util/StreamExtension.java | 22 ----- .../subtools/sublibrary/util/StringUtil.java | 26 ------ 43 files changed, 356 insertions(+), 453 deletions(-) create mode 100644 MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/Component/ComponentExt.java create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/JButton/JButtonExt.java create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/button/AbstractButtonExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/button/JButtonExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/container/ContainerExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcomponent/JComponentExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/JTextFieldExtension.java create mode 100644 SubLibrary/src/main/java/extensions/java/lang/String/StringExt.java create mode 100644 SubLibrary/src/main/java/extensions/java/util/stream/Stream/StreamExt.java rename SubLibrary/src/main/java/{org/lodder/subtools/sublibrary/xml => extensions/org/w3c/dom/NodeList}/XmlExtension.java (61%) delete mode 100644 SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/StreamExtension.java delete mode 100755 SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/StringUtil.java diff --git a/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java b/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java new file mode 100644 index 00000000..944e0f49 --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java @@ -0,0 +1,33 @@ +package extensions.java.awt.Container; + +import java.awt.*; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class ContainerExt { + + public static @Self Container addComponent(@This Container component, S child) { + component.add(child); + return component; + } + + public static @Self Container addComponent(@This Container component, S child, Object constraints) { + component.add(child, constraints); + return component; + } + + public static @Self Container addComponent(@This Container component, Object constraints, S child) { + component.add(child, constraints); + return component; + } + + public static @Self Container layout(@This Container container, LayoutManager mgr) { + container.setLayout(mgr); + return container; + } +} diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java new file mode 100644 index 00000000..28a2a02a --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java @@ -0,0 +1,46 @@ +package extensions.javax.swing.AbstractButton; + +import javax.swing.*; +import java.awt.event.ActionListener; +import java.util.function.Consumer; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; +import org.lodder.subtools.sublibrary.util.BooleanConsumer; + +@UtilityClass +@Extension +public class AbstractButtonExt { + + public static @Self AbstractButton withActionListener(@This AbstractButton abstractButton, ActionListener listener) { + abstractButton.addActionListener(listener); + return abstractButton; + } + + public static @Self AbstractButton withActionListener(@This AbstractButton abstractButton, Runnable listener) { + withActionListener(abstractButton, arg -> listener.run()); + return abstractButton; + } + + public static @Self AbstractButton withActionListenerSelf(@This AbstractButton abstractButton, Consumer<@Self AbstractButton> selfConsumerListener) { + withActionListener(abstractButton, arg -> selfConsumerListener.accept(abstractButton)); + return abstractButton; + } + + public static @Self AbstractButton withSelectedListener(@This AbstractButton abstractButton, BooleanConsumer selectedConsumer) { + withActionListener(abstractButton, arg -> selectedConsumer.accept(abstractButton.isSelected())); + return abstractButton; + } + + public static @Self AbstractButton actionCommand(@This AbstractButton abstractButton, String actionCommand) { + abstractButton.setActionCommand(actionCommand); + return abstractButton; + } + + public static @Self AbstractButton withActionCommand(@This AbstractButton abstractButton, String actionCommand) { + abstractButton.getModel().setActionCommand(actionCommand); + return abstractButton; + } +} diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/Component/ComponentExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/Component/ComponentExt.java new file mode 100644 index 00000000..6802a329 --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/Component/ComponentExt.java @@ -0,0 +1,36 @@ +package extensions.javax.swing.Component; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseListener; +import java.util.Arrays; +import java.util.function.Consumer; +import java.util.function.Predicate; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class ComponentExt { + + public static void setRecursive(@This Component component, Consumer consumer) { + setRecursive(component, consumer, c -> true); + } + + public static void setRecursive(@This Component component, Consumer consumer, Predicate condition) { + if (component != null) { + consumer.accept(component); + if (component instanceof Container container && condition.test(container)) { + container.getComponents().stream().forEach(child -> setRecursive(child, consumer, condition)); + } + } + } + + public static @Self Component withMouseListener(@This T component, MouseListener listener) { + component.addMouseListener(listener); + return component; + } +} diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JButton/JButtonExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JButton/JButtonExt.java new file mode 100644 index 00000000..ad34b8be --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JButton/JButtonExt.java @@ -0,0 +1,18 @@ +package extensions.javax.swing.JButton; + +import javax.swing.*; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class JButtonExt { + + public static @Self JButton defaultButtonFor(@This JButton abstractButton, JRootPane rootPane) { + rootPane.setDefaultButton(abstractButton); + return abstractButton; + } +} diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java new file mode 100644 index 00000000..4ba0248e --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java @@ -0,0 +1,54 @@ +package extensions.javax.swing.JComponent; + +import javax.swing.*; +import java.awt.*; + +import extensions.javax.swing.Component.ComponentExt; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class JComponentExt { + + public static @Self JComponent withEnabled(@This JComponent component, boolean enabled) { + component.setEnabled(enabled); + return component; + } + + public static @Self JComponent withEnabled(@This JComponent component) { + withEnabled(component, true); + return component; + } + + public static @Self JComponent withDisabled(@This JComponent component) { + withEnabled(component, false); + return component; + } + + public static @Self JComponent addTo(@This JComponent child, S parent) { + parent.add(child); + return child; + } + + public static @Self JComponent addTo(@This JComponent child, S parent, Object constraints) { + parent.add(child, constraints); + return child; + } + + public static void setEnabledRecursive(@This JComponent component, boolean enabled) { + ComponentExt.setRecursive(component, c -> c.setEnabled(enabled)); + } + + public static @Self JComponent enabledRecursive(@This JComponent component, boolean enabled) { + setEnabledRecursive(component, enabled); + return component; + } + + public static @Self JComponent withToolTipText(@This JComponent component, String text) { + component.setToolTipText(text); + return component; + } +} diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java new file mode 100644 index 00000000..693e6463 --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java @@ -0,0 +1,20 @@ +package extensions.javax.swing.JScrollPane; + +import javax.swing.*; +import java.awt.*; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class JScrollPaneExt { + + public static @Self JScrollPane withView(@This JScrollPane scrollPane,S view) { + scrollPane.setViewportView(view); + return scrollPane; + } + +} diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExtension.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExtension.java new file mode 100644 index 00000000..4a89ede2 --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExtension.java @@ -0,0 +1,18 @@ +package extensions.javax.swing.JTextField; + +import javax.swing.*; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class JTextFieldExtension { + + public static @Self JTextField withColumns(@This JTextField textField, int columns) { + textField.setColumns(columns); + return textField; + } +} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java index fefbdf61..fc03331c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java @@ -9,13 +9,12 @@ import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; import org.lodder.subtools.sublibrary.model.Release; -import org.lodder.subtools.sublibrary.util.StreamExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import lombok.experimental.ExtensionMethod; -@ExtensionMethod({ StringUtils.class, Files.class, StreamExtension.class }) +@ExtensionMethod({ StringUtils.class, Files.class }) public class CleanAction { private static final Logger LOGGER = LoggerFactory.getLogger(CleanAction.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index df12e22a..22a726c7 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -1,5 +1,10 @@ package org.lodder.subtools.multisubdownloader.gui.dialog; +import javax.swing.*; +import javax.swing.RowSorter.*; +import javax.swing.border.*; +import javax.swing.table.*; +import java.awt.*; import java.io.Serial; import java.util.Arrays; import java.util.Comparator; @@ -9,27 +14,14 @@ import java.util.function.BiFunction; import java.util.function.Function; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.RowSorter; -import javax.swing.RowSorter.SortKey; -import javax.swing.border.EmptyBorder; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableModel; -import javax.swing.table.TableRowSorter; - +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.experimental.ExtensionMethod; +import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.tuple.Pair; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandlerGUI; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; @@ -39,18 +31,6 @@ import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import java.awt.BorderLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ JButtonExtension.class, AbstractButtonExtension.class, JComponentExtension.class }) public class MappingEpisodeNameDialog extends MultiSubDialog { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java index 01a1be45..2866c632 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java @@ -1,23 +1,15 @@ package org.lodder.subtools.multisubdownloader.gui.dialog; +import javax.swing.*; +import javax.swing.border.*; +import java.awt.*; import java.io.Serial; import java.util.concurrent.atomic.AtomicInteger; -import javax.swing.JButton; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.SwingConstants; -import javax.swing.border.EmptyBorder; - import org.lodder.subtools.multisubdownloader.GUI; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.framework.event.Emitter; import org.lodder.subtools.multisubdownloader.framework.event.Event; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.container.ContainerExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.panels.preference.EpisodeLibraryPanel; import org.lodder.subtools.multisubdownloader.gui.panels.preference.GeneralPanel; import org.lodder.subtools.multisubdownloader.gui.panels.preference.MovieLibraryPanel; @@ -28,12 +20,6 @@ import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import java.awt.BorderLayout; -import java.awt.FlowLayout; - -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ JComponentExtension.class, ContainerExtension.class, AbstractButtonExtension.class, JButtonExtension.class }) public class PreferenceDialog extends MultiSubDialog { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index 313f0c49..019d4387 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -22,11 +22,6 @@ import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.extra.progress.StatusMessenger; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.container.ContainerExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldPath; import org.lodder.subtools.multisubdownloader.gui.panels.preference.EpisodeLibraryPanel; import org.lodder.subtools.multisubdownloader.gui.panels.preference.MovieLibraryPanel; @@ -39,10 +34,7 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.StreamExtension; -@ExtensionMethod({ JTextFieldExtension.class, ContainerExtension.class, JButtonExtension.class, AbstractButtonExtension.class, - JComponentExtension.class }) public class RenameDialog extends MultiSubDialog implements PropertyChangeListener { @Serial @@ -58,6 +50,7 @@ public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String setResizable(false); setBounds(100, 100, 650, 680); getContentPane().setLayout(new MigLayout("fill, nogrid", "[]", "[][]20:push[]")); + TitlePanel.title(Messages.getString("PreferenceDialog.Settings")) .padding(0).paddingLeft(20).fillContents(true).addTo(getContentPane(), "span, grow, wrap") .addComponent("shrink", new JLabel(Messages.getString("PreferenceDialog.Location"))) @@ -124,7 +117,7 @@ public void propertyChange(PropertyChangeEvent event) { } } - @ExtensionMethod({ Files.class, StreamExtension.class }) + @ExtensionMethod({ Files.class }) private static class TypedRenameWorker extends SwingWorker implements Cancelable { private final UserInteractionHandler userInteractionHandler; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java index 3442170c..21ce734c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java @@ -14,13 +14,9 @@ import org.lodder.subtools.multisubdownloader.gui.extra.table.CustomTable; import org.lodder.subtools.multisubdownloader.gui.extra.table.SubtitleTableColumnName; import org.lodder.subtools.multisubdownloader.gui.extra.table.SubtitleTableModel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; -@ExtensionMethod({ JButtonExtension.class, AbstractButtonExtension.class, JComponentExtension.class }) public class SelectDialog extends MultiSubDialog { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index 7906d5f7..aa1292cc 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -15,10 +15,7 @@ import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.component.ComponentExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.container.ContainerExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.lib.ReleaseFactory; import org.lodder.subtools.multisubdownloader.lib.library.LibraryBuilder; @@ -34,7 +31,7 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -@ExtensionMethod({ JButtonExtension.class, AbstractButtonExtension.class, JComponentExtension.class, ContainerExtension.class, +@ExtensionMethod({ AbstractButtonExtension.class, ContainerExtension.class, ComponentExtension.class, JTextFieldExtension.class }) public class StructureBuilderDialog extends MultiSubDialog implements DocumentListener { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java index db84b9f7..2f5309b2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java @@ -13,10 +13,7 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.experimental.ExtensionMethod; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; -@ExtensionMethod({ JComponentExtension.class }) public class JListWithImages extends JList> { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java index dc7db710..e2247842 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.extra; +import static extensions.javax.swing.Component.ComponentExt.*; + import java.io.Serial; import javax.swing.JCheckBox; @@ -8,9 +10,6 @@ import javax.swing.JSeparator; import javax.swing.SwingConstants; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; - import java.awt.Component; import java.awt.Container; import java.awt.LayoutManager; @@ -21,10 +20,8 @@ import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; -@ExtensionMethod({ JComponentExtension.class, JCheckBoxExtension.class }) public class PanelCheckBox extends JPanel { @Serial private static final long serialVersionUID = 1L; @@ -52,7 +49,7 @@ protected void addImpl(Component comp, Object constraints, int index) { super.addImpl(checkbox, panelOnNewLine ? "span" : "", -1); super.addImpl(panel, "span, growx, " + (addVerticalSeparator ? "" : "gapx " + leftGap), -1); checkbox.addCheckedChangeListener(selected -> setEnabledChildren(panel, selected)); - JComponentExtension.setRecursive(this, this::addContainerListener); + setRecursive(this, this::addContainerListener); setEnabledChildren(panel, isSelected()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java index 6c981d25..651823ef 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java @@ -1,25 +1,15 @@ package org.lodder.subtools.multisubdownloader.gui.extra; +import javax.swing.*; +import java.awt.*; import java.io.Serial; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSeparator; - -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; - -import java.awt.Container; -import java.awt.LayoutManager; - import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; -@ExtensionMethod({ JComponentExtension.class, JCheckBoxExtension.class }) public class TitlePanel extends JPanel { @Serial private static final long serialVersionUID = 1L; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java index 8a591737..31064069 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java @@ -2,18 +2,14 @@ import static org.lodder.subtools.multisubdownloader.gui.extra.table.SubtitleTableColumnName.*; +import javax.swing.table.*; import java.io.Serial; import java.util.Arrays; import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.swing.table.DefaultTableModel; - import org.lodder.subtools.sublibrary.model.Subtitle; -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ Arrays.class }) public class SubtitleTableModel extends DefaultTableModel { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/button/AbstractButtonExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/button/AbstractButtonExtension.java deleted file mode 100644 index b27f527f..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/button/AbstractButtonExtension.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.button; - -import javax.swing.*; -import java.awt.event.ActionListener; -import java.util.function.Consumer; - -import lombok.experimental.UtilityClass; -import org.lodder.subtools.sublibrary.util.BooleanConsumer; - -@UtilityClass -public class AbstractButtonExtension { - - public T withActionListener(T abstractButton, ActionListener listener) { - abstractButton.addActionListener(listener); - return abstractButton; - } - - public T withActionListener(T abstractButton, Runnable listener) { - return withActionListener(abstractButton, arg -> listener.run()); - } - - public T withActionListenerSelf(T abstractButton, Consumer selfConsumerListener) { - return withActionListener(abstractButton, arg -> selfConsumerListener.accept(abstractButton)); - } - - public T withSelectedListener(T abstractButton, BooleanConsumer selectedConsumer) { - return withActionListener(abstractButton, arg -> selectedConsumer.accept(abstractButton.isSelected())); - } - - public T actionCommand(T abstractButton, String actionCommand) { - abstractButton.setActionCommand(actionCommand); - return abstractButton; - } - - public T withActionCommand(T abstractButton, String actionCommand) { - abstractButton.getModel().setActionCommand(actionCommand); - return abstractButton; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/button/JButtonExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/button/JButtonExtension.java deleted file mode 100644 index 92828e54..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/button/JButtonExtension.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.button; - -import javax.swing.JButton; -import javax.swing.JRootPane; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class JButtonExtension { - - public T defaultButtonFor(T abstractButton, JRootPane rootPane) { - rootPane.setDefaultButton(abstractButton); - return abstractButton; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/container/ContainerExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/container/ContainerExtension.java deleted file mode 100644 index 04e60aac..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/container/ContainerExtension.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.container; - -import java.awt.Container; -import java.awt.LayoutManager; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class ContainerExtension { - - public T layout(T container, LayoutManager mgr) { - container.setLayout(mgr); - return container; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcomponent/JComponentExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcomponent/JComponentExtension.java deleted file mode 100644 index b227d8e5..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcomponent/JComponentExtension.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent; - -import java.util.Arrays; -import java.util.function.Consumer; -import java.util.function.Predicate; - -import javax.swing.JComponent; -import javax.swing.JScrollPane; - -import java.awt.Component; -import java.awt.Container; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class JComponentExtension { - - public T withEnabled(T component, boolean enabled) { - component.setEnabled(enabled); - return component; - } - - public T withEnabled(T component) { - return withEnabled(component, true); - } - - public T withDisabled(T component) { - return withEnabled(component, false); - } - - public T addComponent(T component, S child) { - component.add(child); - return component; - } - - public T addComponent(T component, S child, Object constraints) { - component.add(child, constraints); - return component; - } - - public S addTo(S child, T parent) { - parent.add(child); - return child; - } - - public S addTo(S child, T parent, Object constraints) { - parent.add(child, constraints); - return child; - } - - public T addComponent(T component, Object constraints, S child) { - component.add(child, constraints); - return component; - } - - public void setEnabledRecursive(Component component, boolean enabled) { - setRecursive(component, c -> c.setEnabled(enabled)); - } - - public void setRecursive(Component component, Consumer consumer) { - setRecursive(component, consumer, c -> true); - } - - public void setRecursive(Component component, Consumer consumer, Predicate condition) { - if (component != null) { - consumer.accept(component); - if (component instanceof Container container && condition.test(container)) { - Arrays.stream(container.getComponents()).forEach(child -> setRecursive(child, consumer, condition)); - } - } - } - - public T enabledRecursive(T component, boolean enabled) { - setEnabledRecursive(component, enabled); - return component; - } - - public JScrollPane scrollPane(JScrollPane scrollPane, Component view) { - scrollPane.setViewportView(view); - return scrollPane; - } - - public T withToolTipText(T component, String text) { - component.setToolTipText(text); - return component; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/JTextFieldExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/JTextFieldExtension.java deleted file mode 100644 index 7d981a75..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/JTextFieldExtension.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield; - -import javax.swing.JTextField; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class JTextFieldExtension { - - public T withColumns(T textField, int columns) { - textField.setColumns(columns); - return textField; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java index f98a8e29..3cd86a5f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java @@ -2,34 +2,25 @@ import static java.util.function.Predicate.*; +import javax.swing.*; +import javax.swing.table.*; +import java.awt.*; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.stream.IntStream; import java.util.stream.Stream; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.ListSelectionModel; -import javax.swing.SwingConstants; -import javax.swing.table.DefaultTableModel; - +import lombok.experimental.ExtensionMethod; +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.ArrowButton; import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jscrollpane.JScrollPaneExtension; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.sublibrary.control.VideoPatterns.Source; -import java.awt.Component; -import java.awt.Container; - -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ Arrays.class, JComponentExtension.class, AbstractButtonExtension.class, JScrollPaneExtension.class }) +@ExtensionMethod({ Arrays.class, AbstractButtonExtension.class, JScrollPaneExtension.class }) public class DefaultSelectionPanel extends JPanel implements PreferencePanelIntf { private static final long serialVersionUID = 1L; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index ec589949..c12e2731 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -1,17 +1,13 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import javax.swing.*; import java.io.Serial; import java.nio.file.Path; import java.util.List; import java.util.function.Consumer; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; - +import lombok.experimental.ExtensionMethod; +import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.GUI; import org.lodder.subtools.multisubdownloader.Messages; @@ -21,9 +17,7 @@ import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldInteger; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; @@ -34,10 +28,7 @@ import org.lodder.subtools.multisubdownloader.settings.model.UpdateType; import org.lodder.subtools.sublibrary.Language; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ JTextFieldExtension.class, JCheckBoxExtension.class, JComponentExtension.class, AbstractButtonExtension.class }) +@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class GeneralPanel extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index afdf65e9..67cfdf24 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -1,26 +1,20 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import javax.swing.*; import java.io.Serial; -import javax.swing.JCheckBox; -import javax.swing.JPanel; -import javax.swing.JSlider; - +import lombok.experimental.ExtensionMethod; +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jslider.JSliderExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.multisubdownloader.settings.model.SettingsProcessEpisodeSource; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ JTextFieldExtension.class, JCheckBoxExtension.class, JComponentExtension.class, JSliderExtension.class }) +@ExtensionMethod({ JTextFieldExtension.class, JSliderExtension.class }) public class OptionsPanel extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index 6161d161..196e8d44 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -18,8 +18,6 @@ import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyPasswordField; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; @@ -30,7 +28,7 @@ import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; -@ExtensionMethod({ JTextFieldExtension.class, JCheckBoxExtension.class, JComponentExtension.class, AbstractButtonExtension.class }) +@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class SerieProvidersPanel extends JPanel implements PreferencePanelIntf { @Serial @@ -94,8 +92,8 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { // LOCAL this.chkSourceLocal = new JCheckBox(Messages.getString("PreferenceDialog.Local")); - JScrollPane scrlPlocalSources = - new JScrollPane().scrollPane(this.localSourcesFoldersList = JListWithImages.createForType(Path.class).distinctValues().build()); + JScrollPane scrLocalSources = + new JScrollPane().withView(this.localSourcesFoldersList = JListWithImages.createForType(Path.class).distinctValues().build()); JButton btnBrowseLocalSources = new JButton(Messages.getString("PreferenceDialog.AddFolder")) .withActionListener(() -> MemoryFolderChooser.getInstance() .selectDirectory(this, Messages.getString("PreferenceDialog.SelectFolder")) @@ -107,7 +105,7 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { PanelCheckBox.checkbox(chkSourceLocal).panelOnNewLine().addTo(titelPanel) .addComponent("aligny top, gapy 5px", new JLabel(Messages.getString("PreferenceDialog.LocalFolderWithSubtitles"))) .addComponent("wrap", new JPanel(new MigLayout("insets 0", "[grow, nogrid]")).addComponent("split", btnBrowseLocalSources) - .addComponent("wrap", btnRemoveLocalSources).addComponent("wrap", scrlPlocalSources)); + .addComponent("wrap", btnRemoveLocalSources).addComponent("wrap", scrLocalSources)); } loadPreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index 3316f73c..414fbe2c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -1,5 +1,8 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import javax.swing.*; +import javax.swing.border.*; +import java.awt.*; import java.io.Serial; import java.util.LinkedHashMap; import java.util.List; @@ -11,23 +14,14 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; - +import lombok.experimental.ExtensionMethod; +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.dialog.StructureBuilderDialog; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; import org.lodder.subtools.multisubdownloader.lib.library.FilenameLibraryBuilder; @@ -37,12 +31,7 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import java.awt.Color; - -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ JTextFieldExtension.class, JComponentExtension.class, JCheckBoxExtension.class, AbstractButtonExtension.class }) +@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class StructureFilePanel extends JPanel { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index 7848cb42..7aa72693 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -14,9 +14,7 @@ import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldPath; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; @@ -29,7 +27,7 @@ import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; -@ExtensionMethod({ JTextFieldExtension.class, JComponentExtension.class, JCheckBoxExtension.class, AbstractButtonExtension.class }) +@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class StructureFolderPanel extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java index cf4982b6..5c447ea8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java @@ -1,27 +1,20 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import javax.swing.*; import java.io.Serial; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; - +import lombok.experimental.ExtensionMethod; +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldPath; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ JCheckBoxExtension.class, JTextFieldExtension.class, JComponentExtension.class, AbstractButtonExtension.class }) +@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class SubtitleBackupPanel extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java index 6ca98434..7b3e5bf5 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java @@ -1,18 +1,16 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import javax.swing.*; import java.io.Serial; import java.nio.file.Files; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; - +import lombok.Getter; +import lombok.experimental.ExtensionMethod; +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.PartialDisableComboBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; import org.lodder.subtools.multisubdownloader.lib.library.LibraryActionType; import org.lodder.subtools.multisubdownloader.lib.library.LibraryOtherFileActionType; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; @@ -20,11 +18,7 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ Files.class, JComponentExtension.class, JCheckBoxExtension.class }) +@ExtensionMethod({ Files.class }) public abstract class VideoLibraryPanel extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java index e851496d..abc9efd0 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.filters.ExactNameFilter; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.filters.KeywordFilter; -import org.lodder.subtools.multisubdownloader.lib.control.subtitles.filters.ReleasegroupFilter; +import org.lodder.subtools.multisubdownloader.lib.control.subtitles.filters.ReleaseGroupFilter; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.filters.SubtitleFilter; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.sublibrary.model.Release; @@ -15,7 +15,7 @@ public class SubtitleFiltering { private final Settings settings; private final SubtitleFilter exactName = new ExactNameFilter(); private final SubtitleFilter keyword = new KeywordFilter(); - private final SubtitleFilter releaseGroup = new ReleasegroupFilter(); + private final SubtitleFilter releaseGroup = new ReleaseGroupFilter(); public boolean useSubtitle(Subtitle subtitle, Release release) { return !excludeSubtitle(subtitle, release); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java index efc3f00e..49918d0a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java @@ -1,6 +1,5 @@ package org.lodder.subtools.multisubdownloader.lib.control.subtitles.filters; -import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.control.ReleaseParser; import org.lodder.subtools.sublibrary.model.Release; @@ -9,10 +8,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@ExtensionMethod({StringUtils.class}) -public class ReleasegroupFilter extends SubtitleFilter { +public class ReleaseGroupFilter extends SubtitleFilter { - private static final Logger LOGGER = LoggerFactory.getLogger(ReleasegroupFilter.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ReleaseGroupFilter.class); @Override public boolean useSubtitle(Release release, Subtitle subtitle) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java index d260be03..894b6f41 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java @@ -12,6 +12,9 @@ import java.util.Optional; import java.util.function.Function; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleApi; @@ -23,17 +26,10 @@ import org.lodder.subtools.sublibrary.data.ProviderSerieId; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.StringUtil; import org.lodder.subtools.sublibrary.util.http.HttpClientException; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.experimental.ExtensionMethod; - @Getter(value = AccessLevel.PRIVATE) @RequiredArgsConstructor -@ExtensionMethod({ StringUtil.class }) public class JPodnapisiApi implements SubtitleApi { public static final int maxAge = 90; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index 7303f799..a9aa92f5 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -9,7 +9,6 @@ import java.util.function.BiPredicate; import java.util.function.Function; -import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -24,9 +23,7 @@ import org.lodder.subtools.sublibrary.data.ProviderSerieId; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.StreamExtension; -@ExtensionMethod({ StreamExtension.class }) public class JTVSubtitlesApi extends Html implements SubtitleApi { private static final String DOMAIN = "https://www.tvsubtitles.net"; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java index a3cbcaeb..e35c37c0 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.util; +import javax.swing.*; +import java.awt.*; import java.io.IOException; import java.io.Serializable; import java.nio.file.Files; @@ -10,8 +12,14 @@ import java.util.prefs.BackingStoreException; import java.util.prefs.InvalidPreferencesFormatException; -import javax.swing.JFileChooser; - +import com.google.gson.GsonBuilder; +import io.gsonfire.GsonFireBuilder; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.experimental.StandardException; +import lombok.experimental.UtilityClass; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.gui.dialog.MappingEpisodeNameDialog.MappingType; @@ -20,24 +28,10 @@ import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler.MessageSeverity; -import org.lodder.subtools.sublibrary.util.StreamExtension; import org.lodder.subtools.sublibrary.util.filefilter.ExtensionFileFilter; import org.lodder.subtools.sublibrary.util.filefilter.JsonFileFilter; import org.lodder.subtools.sublibrary.util.filefilter.XmlFileFilter; -import com.google.gson.GsonBuilder; - -import java.awt.Component; - -import io.gsonfire.GsonFireBuilder; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.experimental.ExtensionMethod; -import lombok.experimental.StandardException; -import lombok.experimental.UtilityClass; - @RequiredArgsConstructor public class ExportImport { @@ -108,7 +102,6 @@ public void exportSettings(SettingsType listType) { }); } - @ExtensionMethod({ StreamExtension.class }) @UtilityClass public static class ExportImportPreferences { diff --git a/SubLibrary/src/main/java/extensions/java/lang/String/StringExt.java b/SubLibrary/src/main/java/extensions/java/lang/String/StringExt.java new file mode 100644 index 00000000..5e479f8c --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/lang/String/StringExt.java @@ -0,0 +1,26 @@ +package extensions.java.lang.String; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import org.apache.commons.lang3.StringUtils; + +@UtilityClass +@Extension +public class StringExt { + + public static String removeIllegalFilenameChars(@This String s) { + return s.replace("/", "").replace("\0", ""); + } + + public static String removeIllegalWindowsChars(@This String text) { + return StringUtils.removeEnd(text.replaceAll("[\\\\/:*?\"<>|]", ""), ".").trim(); + } + + public static String urlEncode(@This String text) { + return URLEncoder.encode(text, StandardCharsets.UTF_8); + } +} diff --git a/SubLibrary/src/main/java/extensions/java/nio/file/Path/PathExt.java b/SubLibrary/src/main/java/extensions/java/nio/file/Path/PathExt.java index 3cd2e051..425a0435 100644 --- a/SubLibrary/src/main/java/extensions/java/nio/file/Path/PathExt.java +++ b/SubLibrary/src/main/java/extensions/java/nio/file/Path/PathExt.java @@ -15,7 +15,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import lombok.experimental.ExtensionMethod; import lombok.experimental.UtilityClass; import manifold.ext.rt.api.Extension; import manifold.ext.rt.api.This; @@ -24,9 +23,7 @@ import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.util.CopyDirVisitor; import org.lodder.subtools.sublibrary.util.DeleteDirVisitor; -import org.lodder.subtools.sublibrary.util.StreamExtension; -@ExtensionMethod({ StreamExtension.class }) @UtilityClass @Extension public class PathExt { diff --git a/SubLibrary/src/main/java/extensions/java/util/stream/Stream/StreamExt.java b/SubLibrary/src/main/java/extensions/java/util/stream/Stream/StreamExt.java new file mode 100644 index 00000000..34ca28c6 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/util/stream/Stream/StreamExt.java @@ -0,0 +1,17 @@ +package extensions.java.util.stream.Stream; + +import java.util.stream.Stream; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import name.falgout.jeffrey.throwing.stream.ThrowingStream; + +@UtilityClass +@Extension +public class StreamExt { + + public static ThrowingStream asThrowingStream(@This Stream stream, Class exceptionType) { + return ThrowingStream.of(stream, exceptionType); + } +} diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XmlExtension.java b/SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/XmlExtension.java similarity index 61% rename from SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XmlExtension.java rename to SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/XmlExtension.java index c6d937e2..831e093f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XmlExtension.java +++ b/SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/XmlExtension.java @@ -1,17 +1,19 @@ -package org.lodder.subtools.sublibrary.xml; +package extensions.org.w3c.dom.NodeList; import java.util.stream.IntStream; import java.util.stream.Stream; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import lombok.experimental.UtilityClass; - @UtilityClass +@Extension public class XmlExtension { - public static Stream stream(NodeList nodeList) { + public static Stream stream(@This NodeList nodeList) { return IntStream.range(0, nodeList.getLength()).mapToObj(nodeList::item); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java index b5905f3c..adc84d00 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java @@ -21,14 +21,11 @@ import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; -import extensions.java.nio.file.Path.PathExt; -import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.util.lazy.LazyBiFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@ExtensionMethod({ Files.class }) public abstract class DiskCache extends Cache { private static final Logger LOGGER = LoggerFactory.getLogger(DiskCache.class); @@ -41,7 +38,7 @@ public abstract class DiskCache extends Cache { try { synchronized (cache.getCacheMap()) { Path path = Path.of(System.getProperty("user.home")).resolve(".MultiSubDownloader"); - if (!path.exists()) { + if (!Files.exists(path)) { try { Files.createDirectory(path); } catch (IOException e) { @@ -89,7 +86,7 @@ public abstract class DiskCache extends Cache { LOGGER.error("Deleting cache file to fix errors"); connection.close(); try { - PathExt.delete(path); + path.deletePath(); } catch (IOException e) { LOGGER.error("Error while deleting the cache file, please delete it yourself: %s (%s)".formatted(path, e.getMessage()), e); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java index c71c7358..a92dac69 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java @@ -5,11 +5,9 @@ import java.util.List; import java.util.Random; -import lombok.experimental.ExtensionMethod; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.ManagerException; import org.lodder.subtools.sublibrary.xml.XMLHelper; -import org.lodder.subtools.sublibrary.xml.XmlExtension; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -17,7 +15,6 @@ * @author lodder * Source */ -@ExtensionMethod({ XmlExtension.class }) public class TheTvdbMirrors { public static final String TYPE_XML = "XML"; @@ -53,15 +50,12 @@ public TheTvdbMirrors(String apikey, Manager manager) throws ManagerException, P } public String getMirror(String type) { - if (TYPE_XML.equals(type) && !xmlList.isEmpty()) { - return xmlList.get(RNDM.nextInt(xmlList.size())); - } else if (TYPE_BANNER.equals(type) && !bannerList.isEmpty()) { - return bannerList.get(RNDM.nextInt(bannerList.size())); - } else if (TYPE_ZIP.equals(type) && !zipList.isEmpty()) { - return zipList.get(RNDM.nextInt(zipList.size())); - } else { - return null; - } + return switch(type){ + case TYPE_XML -> xmlList.isEmpty() ? null : xmlList.get(RNDM.nextInt(xmlList.size())); + case TYPE_BANNER -> bannerList.isEmpty() ? null : bannerList.get(RNDM.nextInt(bannerList.size())); + case TYPE_ZIP -> zipList.isEmpty() ? null : zipList.get(RNDM.nextInt(zipList.size())); + default -> null; + }; } private void addMirror(int typeMask, String url) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/StreamExtension.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/StreamExtension.java deleted file mode 100644 index 407e3973..00000000 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/StreamExtension.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.lodder.subtools.sublibrary.util; - -import java.util.Collection; -import java.util.stream.Stream; - -import lombok.experimental.UtilityClass; -import name.falgout.jeffrey.throwing.stream.ThrowingStream; -import net.jodah.typetools.TypeResolver; - -@UtilityClass -public class StreamExtension { - - public static ThrowingStream asThrowingStream(Stream stream, Class exceptionType) { - return ThrowingStream.of(stream, exceptionType); - } - - public static , T, X extends Exception> ThrowingStream normalFlatMap(ThrowingStream stream) { - @SuppressWarnings("unchecked") - Class exceptionType = (Class) TypeResolver.resolveRawArguments(ThrowingStream.class, stream.getClass())[1]; - return stream.normalFlatMap(collection -> ThrowingStream.of(collection.stream(), exceptionType)); - } -} diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/StringUtil.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/StringUtil.java deleted file mode 100755 index 1cfda7f7..00000000 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/StringUtil.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.lodder.subtools.sublibrary.util; - -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; - -import org.apache.commons.lang3.StringUtils; - -import lombok.experimental.ExtensionMethod; -import lombok.experimental.UtilityClass; - -@ExtensionMethod({ StringUtils.class }) -@UtilityClass -public class StringUtil { - - public static String removeIllegalFilenameChars(String s) { - return s.replace("/", "").replace("\0", ""); - } - - public static String removeIllegalWindowsChars(String text) { - return text.replaceAll("[\\\\/:*?\"<>|]", "").removeEnd(".").trim(); - } - - public static String urlEncode(String text) { - return URLEncoder.encode(text, StandardCharsets.UTF_8); - } -} From 5205f6b566b726b16d5b3af830672d4ce23e8d0e Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 10:57:42 +0200 Subject: [PATCH 06/54] changes --- .../awt}/Component/ComponentExt.java | 7 +++--- .../javax/swing/JComponent/JComponentExt.java | 2 +- .../swing/JScrollPane/JScrollPaneExt.java | 2 +- .../javax/swing/JSlider/JSliderExt.java | 23 +++++++++++++++++++ .../javax/swing/JTextArea/JTextAreaExt.java | 18 +++++++++++++++ ...FieldExtension.java => JTextFieldExt.java} | 2 +- .../JTextComponent/JTextComponentExt.java | 18 +++++++++++++++ .../subtools/multisubdownloader/CLI.java | 1 - .../subtools/multisubdownloader/GUI.java | 3 +-- .../gui/dialog/StructureBuilderDialog.java | 5 ---- .../gui/extra/PanelCheckBox.java | 4 +--- .../component/ComponentExtension.java | 15 ------------ .../jscrollpane/JScrollPaneExtension.java | 16 ------------- .../jcomponent/jslider/JSliderExtension.java | 19 --------------- .../jtextarea/JTextAreaExtension.java | 14 ----------- .../JTextComponentExtension.java | 14 ----------- .../gui/panels/LoggingPanel.java | 16 +++---------- .../gui/panels/SearchFileInputPanel.java | 15 +++--------- .../gui/panels/SearchTextInputPanel.java | 12 ++-------- .../preference/DefaultSelectionPanel.java | 7 +----- .../gui/panels/preference/GeneralPanel.java | 6 +---- .../gui/panels/preference/OptionsPanel.java | 4 ---- .../preference/SerieProvidersPanel.java | 6 +---- .../panels/preference/StructureFilePanel.java | 4 ---- .../preference/StructureFolderPanel.java | 13 ++--------- .../preference/SubtitleBackupPanel.java | 3 --- .../lib/library/FilenameLibraryBuilder.java | 5 ++-- .../lib/library/PathLibraryBuilder.java | 5 ++-- .../adapters/JAddic7edAdapter.java | 8 +++---- .../adapters/JSubsceneAdapter.java | 7 ++---- .../gestdown/JAddic7edProxyGestdownApi.java | 6 ++--- .../sublibrary/control/VideoPatterns.java | 10 ++++---- pom.xml | 2 +- 33 files changed, 97 insertions(+), 195 deletions(-) rename MultiSubDownloader/src/main/java/extensions/{javax/swing => java/awt}/Component/ComponentExt.java (75%) create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/JSlider/JSliderExt.java create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/JTextArea/JTextAreaExt.java rename MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/{JTextFieldExtension.java => JTextFieldExt.java} (91%) create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/text/JTextComponent/JTextComponentExt.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/component/ComponentExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jscrollpane/JScrollPaneExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jslider/JSliderExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextarea/JTextAreaExtension.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextcomponent/JTextComponentExtension.java diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/Component/ComponentExt.java b/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java similarity index 75% rename from MultiSubDownloader/src/main/java/extensions/javax/swing/Component/ComponentExt.java rename to MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java index 6802a329..013e25eb 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/Component/ComponentExt.java +++ b/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java @@ -1,6 +1,5 @@ -package extensions.javax.swing.Component; +package extensions.java.awt.Component; -import javax.swing.*; import java.awt.*; import java.awt.event.MouseListener; import java.util.Arrays; @@ -24,12 +23,12 @@ public static void setRecursive(@This Component component, Consumer c if (component != null) { consumer.accept(component); if (component instanceof Container container && condition.test(container)) { - container.getComponents().stream().forEach(child -> setRecursive(child, consumer, condition)); + Arrays.stream(container.getComponents()).forEach(child -> setRecursive(child, consumer, condition)); } } } - public static @Self Component withMouseListener(@This T component, MouseListener listener) { + public static @Self Component withMouseListener(@This Component component, MouseListener listener) { component.addMouseListener(listener); return component; } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java index 4ba0248e..e93b03a6 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java @@ -3,7 +3,7 @@ import javax.swing.*; import java.awt.*; -import extensions.javax.swing.Component.ComponentExt; +import extensions.java.awt.Component.ComponentExt; import lombok.experimental.UtilityClass; import manifold.ext.rt.api.Extension; import manifold.ext.rt.api.Self; diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java index 693e6463..aa5033f8 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java @@ -12,7 +12,7 @@ @Extension public class JScrollPaneExt { - public static @Self JScrollPane withView(@This JScrollPane scrollPane,S view) { + public static @Self JScrollPane withViewPort(@This JScrollPane scrollPane, S view) { scrollPane.setViewportView(view); return scrollPane; } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JSlider/JSliderExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JSlider/JSliderExt.java new file mode 100644 index 00000000..d114ed4c --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JSlider/JSliderExt.java @@ -0,0 +1,23 @@ +package extensions.javax.swing.JSlider; + +import javax.swing.*; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class JSliderExt { + + public static @Self JSlider withMinimum(@This JSlider slider, int minimum) { + slider.setMinimum(minimum); + return slider; + } + + public static @Self JSlider withMaximum(@This JSlider slider, int maximum) { + slider.setMaximum(maximum); + return slider; + } +} diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextArea/JTextAreaExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextArea/JTextAreaExt.java new file mode 100644 index 00000000..81c6c5f6 --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextArea/JTextAreaExt.java @@ -0,0 +1,18 @@ +package extensions.javax.swing.JTextArea; + +import javax.swing.*; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class JTextAreaExt { + + public static @Self JTextArea autoscrolls(@This JTextArea textArea, boolean autoscrolls) { + textArea.setAutoscrolls(autoscrolls); + return textArea; + } +} diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExtension.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExt.java similarity index 91% rename from MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExtension.java rename to MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExt.java index 4a89ede2..6f0744be 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExtension.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExt.java @@ -9,7 +9,7 @@ @UtilityClass @Extension -public class JTextFieldExtension { +public class JTextFieldExt { public static @Self JTextField withColumns(@This JTextField textField, int columns) { textField.setColumns(columns); diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/text/JTextComponent/JTextComponentExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/text/JTextComponent/JTextComponentExt.java new file mode 100644 index 00000000..6053a6d1 --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/text/JTextComponent/JTextComponentExt.java @@ -0,0 +1,18 @@ +package extensions.javax.swing.text.JTextComponent; + +import javax.swing.text.*; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class JTextComponentExt { + + public static @Self JTextComponent editable(@This JTextComponent textComponent, boolean editable) { + textComponent.setEditable(editable); + return textComponent; + } +} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 307cb807..28fb35f7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -24,7 +24,6 @@ import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; -import org.lodder.subtools.multisubdownloader.util.CLIExtension; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.ManagerException; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index f1b5907c..ab6da857 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -61,7 +61,6 @@ import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; import org.lodder.subtools.sublibrary.model.Subtitle; import org.lodder.subtools.sublibrary.model.VideoType; -import org.lodder.subtools.sublibrary.util.StringUtil; import org.lodder.subtools.sublibrary.util.TriConsumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -422,7 +421,7 @@ private void downloadText() { filename = subtitle.getFileName() + ".srt"; } if (OsCheck.getOperatingSystemType() == OSType.Windows) { - filename = StringUtil.removeIllegalWindowsChars(filename); + filename = filename.removeIllegalWindowsChars(); } try { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index aa1292cc..d1d6cddb 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -14,9 +14,6 @@ import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.component.ComponentExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.lib.ReleaseFactory; import org.lodder.subtools.multisubdownloader.lib.library.LibraryBuilder; import org.lodder.subtools.multisubdownloader.settings.model.Settings; @@ -31,8 +28,6 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -@ExtensionMethod({ AbstractButtonExtension.class, ContainerExtension.class, - ComponentExtension.class, JTextFieldExtension.class }) public class StructureBuilderDialog extends MultiSubDialog implements DocumentListener { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java index e2247842..0cdc54f9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java @@ -1,7 +1,5 @@ package org.lodder.subtools.multisubdownloader.gui.extra; -import static extensions.javax.swing.Component.ComponentExt.*; - import java.io.Serial; import javax.swing.JCheckBox; @@ -49,7 +47,7 @@ protected void addImpl(Component comp, Object constraints, int index) { super.addImpl(checkbox, panelOnNewLine ? "span" : "", -1); super.addImpl(panel, "span, growx, " + (addVerticalSeparator ? "" : "gapx " + leftGap), -1); checkbox.addCheckedChangeListener(selected -> setEnabledChildren(panel, selected)); - setRecursive(this, this::addContainerListener); + this.setRecursive(this::addContainerListener); setEnabledChildren(panel, isSelected()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/component/ComponentExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/component/ComponentExtension.java deleted file mode 100644 index 4c15e8a6..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/component/ComponentExtension.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.component; - -import java.awt.Component; -import java.awt.event.MouseListener; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class ComponentExtension { - - public T withMouseListener(T component, MouseListener listener) { - component.addMouseListener(listener); - return component; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jscrollpane/JScrollPaneExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jscrollpane/JScrollPaneExtension.java deleted file mode 100644 index aa8b90d5..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jscrollpane/JScrollPaneExtension.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jscrollpane; - -import javax.swing.JScrollPane; - -import java.awt.Component; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class JScrollPaneExtension { - - public JScrollPane withViewportView(JScrollPane scrollPane, Component view) { - scrollPane.setViewportView(view); - return scrollPane; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jslider/JSliderExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jslider/JSliderExtension.java deleted file mode 100644 index 9f6d05fe..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jslider/JSliderExtension.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jslider; - -import javax.swing.JSlider; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class JSliderExtension { - - public T withMinimum(T slider, int minimum) { - slider.setMinimum(minimum); - return slider; - } - - public T withMaximum(T slider, int maximum) { - slider.setMaximum(maximum); - return slider; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextarea/JTextAreaExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextarea/JTextAreaExtension.java deleted file mode 100644 index 43270147..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextarea/JTextAreaExtension.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextarea; - -import javax.swing.JTextArea; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class JTextAreaExtension { - - public T autoscrolls(T textArea, boolean autoscrolls) { - textArea.setAutoscrolls(autoscrolls); - return textArea; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextcomponent/JTextComponentExtension.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextcomponent/JTextComponentExtension.java deleted file mode 100644 index 4105f1f4..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextcomponent/JTextComponentExtension.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextcomponent; - -import javax.swing.text.JTextComponent; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class JTextComponentExtension { - - public T editable(T textComponent, boolean editable) { - textComponent.setEditable(editable); - return textComponent; - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java index 35b6909a..67edaca5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java @@ -1,24 +1,14 @@ package org.lodder.subtools.multisubdownloader.gui.panels; +import javax.swing.*; import java.io.Serial; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSeparator; -import javax.swing.JTextArea; - +import ch.qos.logback.classic.Level; +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.LogTextAppender; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextarea.JTextAreaExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextcomponent.JTextComponentExtension; - -import ch.qos.logback.classic.Level; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; -@ExtensionMethod({ JTextComponentExtension.class, JTextAreaExtension.class }) public class LoggingPanel extends JPanel { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java index b5a8f0ce..63bda2d6 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java @@ -1,21 +1,12 @@ package org.lodder.subtools.multisubdownloader.gui.panels; -import java.io.Serial; - -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JTextField; - -import org.lodder.subtools.multisubdownloader.Messages; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; - +import javax.swing.*; import java.awt.event.ActionListener; +import java.io.Serial; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; +import org.lodder.subtools.multisubdownloader.Messages; -@ExtensionMethod({ JTextFieldExtension.class }) public class SearchFileInputPanel extends InputPanel { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java index 950f7130..40733ad2 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java @@ -1,21 +1,13 @@ package org.lodder.subtools.multisubdownloader.gui.panels; +import javax.swing.*; import java.io.Serial; -import javax.swing.JLabel; -import javax.swing.JTextField; - +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextcomponent.JTextComponentExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.sublibrary.model.VideoSearchType; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ JTextFieldExtension.class, JComponentExtension.class, JTextComponentExtension.class }) public class SearchTextInputPanel extends InputPanel { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java index 3cd86a5f..494c9bcc 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java @@ -5,22 +5,17 @@ import javax.swing.*; import javax.swing.table.*; import java.awt.*; -import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.stream.IntStream; import java.util.stream.Stream; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.ArrowButton; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jscrollpane.JScrollPaneExtension; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.sublibrary.control.VideoPatterns.Source; -@ExtensionMethod({ Arrays.class, AbstractButtonExtension.class, JScrollPaneExtension.class }) public class DefaultSelectionPanel extends JPanel implements PreferencePanelIntf { private static final long serialVersionUID = 1L; @@ -65,7 +60,7 @@ public ScrollTable(String header, Collection items) { private ScrollTable(String header, Stream items) { this.table = new JTable(new DefaultTableModel(new String[] { header }, 1)); - this.scrollPane = new JScrollPane().withViewportView(table); + this.scrollPane = new JScrollPane().withViewPort(table); this.model = (DefaultTableModel) table.getModel(); model.removeRow(0); if (items != null) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index c12e2731..4cd3525c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.function.Consumer; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.GUI; @@ -16,9 +15,7 @@ import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldInteger; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; @@ -28,7 +25,6 @@ import org.lodder.subtools.multisubdownloader.settings.model.UpdateType; import org.lodder.subtools.sublibrary.Language; -@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class GeneralPanel extends JPanel implements PreferencePanelIntf { @Serial @@ -86,7 +82,7 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { new JLabel(Messages.getString("PreferenceDialog.ExcludeList")).addTo(settingsPanel, "aligny center, span 1 2"); new JScrollPane().addTo(settingsPanel, "growx, span, wrap") - .setViewportView(this.excludeList = JListWithImages.createForType(PathOrRegex.class).distinctValues().build()); + .withViewPort(this.excludeList = JListWithImages.createForType(PathOrRegex.class).distinctValues().build()); Consumer addExcludeItemConsumer = type -> { if (type == PathMatchType.FOLDER) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index 67cfdf24..ea2e3fc4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -3,18 +3,14 @@ import javax.swing.*; import java.io.Serial; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jslider.JSliderExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.multisubdownloader.settings.model.SettingsProcessEpisodeSource; -@ExtensionMethod({ JTextFieldExtension.class, JSliderExtension.class }) public class OptionsPanel extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index 196e8d44..bc48a460 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -17,18 +17,14 @@ import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyPasswordField; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.multisubdownloader.settings.model.PathMatchType; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.OpenSubtitlesApi; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; -@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class SerieProvidersPanel extends JPanel implements PreferencePanelIntf { @Serial @@ -93,7 +89,7 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { // LOCAL this.chkSourceLocal = new JCheckBox(Messages.getString("PreferenceDialog.Local")); JScrollPane scrLocalSources = - new JScrollPane().withView(this.localSourcesFoldersList = JListWithImages.createForType(Path.class).distinctValues().build()); + new JScrollPane().withViewPort(this.localSourcesFoldersList = JListWithImages.createForType(Path.class).distinctValues().build()); JButton btnBrowseLocalSources = new JButton(Messages.getString("PreferenceDialog.AddFolder")) .withActionListener(() -> MemoryFolderChooser.getInstance() .selectDirectory(this, Messages.getString("PreferenceDialog.SelectFolder")) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index 414fbe2c..6f1b03c1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -14,15 +14,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.dialog.StructureBuilderDialog; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; import org.lodder.subtools.multisubdownloader.lib.library.FilenameLibraryBuilder; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; @@ -31,7 +28,6 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class StructureFilePanel extends JPanel { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index 7aa72693..c9df15a1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -1,21 +1,16 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import javax.swing.*; import java.io.Serial; import java.util.function.Function; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; - +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.dialog.StructureBuilderDialog; import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldPath; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; import org.lodder.subtools.multisubdownloader.lib.library.PathLibraryBuilder; @@ -24,10 +19,6 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import lombok.experimental.ExtensionMethod; -import net.miginfocom.swing.MigLayout; - -@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class StructureFolderPanel extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java index 5c447ea8..c50f48bb 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java @@ -9,12 +9,9 @@ import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldPath; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; -@ExtensionMethod({ JTextFieldExtension.class, AbstractButtonExtension.class }) public class SubtitleBackupPanel extends JPanel implements PreferencePanelIntf { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index 9414e3e4..b8e9b650 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -13,7 +13,6 @@ import org.lodder.subtools.sublibrary.model.Subtitle; import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.StringUtil; import lombok.Setter; import lombok.experimental.Accessors; @@ -146,7 +145,7 @@ public Path build(Release release) { } else { filename = release.getFileName(); } - filename = StringUtil.removeIllegalWindowsChars(filename); + filename = filename.removeIllegalWindowsChars(); if (replaceSpace) { filename = filename.replace(' ', replacingSpaceChar); } @@ -172,7 +171,7 @@ public String buildSubtitle(Release release, String filename, Language language, filename = changeExtension(filename, ".srt"); } - filename = StringUtil.removeIllegalWindowsChars(filename); + filename = filename.removeIllegalWindowsChars(); if (replaceSpace) { filename = filename.replace(' ', replacingSpaceChar); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java index 5aa2b9fc..0b800b3c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java @@ -13,7 +13,6 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.StringUtil; import lombok.Setter; import lombok.experimental.Accessors; @@ -133,7 +132,7 @@ public Path build(Release release) { private Path buildEpisode(TvRelease tvRelease) { String folder = structure; - folder = folder.replace(SerieStructureTag.SHOW_NAME.getLabel(), StringUtil.removeIllegalWindowsChars(getShowName(tvRelease.getName()))); + folder = folder.replace(SerieStructureTag.SHOW_NAME.getLabel(), getShowName(tvRelease.getName())).removeIllegalWindowsChars(); // order is important! folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_LONG, tvRelease.getEpisodeNumbers(), true); folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_SHORT, tvRelease.getEpisodeNumbers(), false); @@ -154,7 +153,7 @@ private Path buildEpisode(TvRelease tvRelease) { private Path buildMovie(MovieRelease movieRelease) { String folder = structure; - folder = replace(folder, MovieStructureTag.MOVIE_TITLE, StringUtil.removeIllegalWindowsChars(movieRelease.getName())); + folder = replace(folder, MovieStructureTag.MOVIE_TITLE, movieRelease.getName().removeIllegalWindowsChars()); folder = replace(folder, MovieStructureTag.YEAR, Integer.toString(movieRelease.getYear())); folder = replace(folder, MovieStructureTag.QUALITY, movieRelease.getQuality()); if (replaceSpace) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java index f0395a6e..9cd048f4 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java @@ -8,6 +8,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import extensions.java.lang.String.StringExt; +import lombok.Getter; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.addic7ed.JAddic7edApi; import org.lodder.subtools.multisubdownloader.subtitleproviders.addic7ed.exception.Addic7edException; @@ -22,14 +24,10 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.StringUtil; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - @Getter public class JAddic7edAdapter extends AbstractAdapter { @@ -112,7 +110,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection language == sub.getLanguage()) .map(sub -> Subtitle.downloadSource(sub.getUrl()) .subtitleSource(getSubtitleSource()) - .fileName(StringUtil.removeIllegalFilenameChars(sub.getTitle() + " " + sub.getVersion())) + .fileName(StringExt.removeIllegalFilenameChars(sub.getTitle() + " " + sub.getVersion())) .language(sub.getLanguage()) .quality(ReleaseParser.getQualityKeyword(sub.getTitle() + " " + sub.getVersion())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index aa7b66f5..5bfef117 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -13,6 +13,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; +import lombok.Getter; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.subscene.SubsceneApi; @@ -28,14 +29,10 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; -import org.lodder.subtools.sublibrary.util.StringUtil; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - @Getter public class JSubsceneAdapter extends AbstractAdapter { @@ -141,7 +138,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection sub.getName().contains(getSeasonEpisodeString(tvRelease.getSeason(), tvRelease.getEpisodeNumbers().get(0)))) .map(sub -> Subtitle.downloadSource(sub.getUrlSupplier()) .subtitleSource(getSubtitleSource()) - .fileName(StringUtil.removeIllegalFilenameChars(sub.getName())) + .fileName(sub.getName().removeIllegalFilenameChars()) .language(sub.getLanguage()) .quality(ReleaseParser.getQualityKeyword(sub.getName())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java index 725a6834..747f6b40 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java @@ -5,6 +5,7 @@ import java.util.Set; import java.util.UUID; +import extensions.java.lang.String.StringExt; import org.gestdown.api.SubtitlesApi; import org.gestdown.api.TvShowsApi; import org.gestdown.invoker.ApiException; @@ -21,9 +22,6 @@ import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import org.lodder.subtools.sublibrary.util.StringUtil; - -import lombok.experimental.ExtensionMethod; // see https://www.gestdown.info/Api public class JAddic7edProxyGestdownApi extends Html implements SubtitleApi { @@ -66,7 +64,7 @@ public Set getSubtitles(SerieMapping providerSerieId, int season, int private Subtitle mapToSubtitle(SubtitleDto sub, EpisodeDto episodedto, Language language) { return Subtitle.downloadSource(getDownloadUrl(sub.getDownloadUri())) .subtitleSource(getSubtitleSource()) - .fileName(StringUtil + .fileName(StringExt .removeIllegalFilenameChars("%s - %s - %s".formatted(episodedto.getShow(), episodedto.getTitle(), sub.getVersion()))) .language(language) .quality(ReleaseParser.getQualityKeyword(episodedto.getTitle() + " " + sub.getVersion())) diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java index 74ab1ffb..bf337d46 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java @@ -31,7 +31,7 @@ public enum Quality implements VideoPatternEnumIntf { private final String value; public static Stream getValuesStream() { - return Quality.values().stream().map(Quality::getValue); + return Arrays.stream(Quality.values()).map(Quality::getValue); } } @@ -47,7 +47,7 @@ public enum VideoEncoding implements VideoPatternEnumIntf { } public static Stream getValuesStream() { - return VideoEncoding.values().stream().map(VideoEncoding::getValues).flatMap(Arrays::stream); + return Arrays.stream(VideoEncoding.values()).map(VideoEncoding::getValues).flatMap(Arrays::stream); } } @@ -62,7 +62,7 @@ public enum AudioEncoding implements VideoPatternEnumIntf { } public static Stream getValuesStream() { - return AudioEncoding.values().stream().map(AudioEncoding::getValues).flatMap(Arrays::stream); + return Arrays.stream(AudioEncoding.values()).map(AudioEncoding::getValues).flatMap(Arrays::stream); } } @@ -87,7 +87,7 @@ public enum Source implements VideoPatternEnumIntf { static final Map VALUE_MAP = new HashMap<>(); static { - Source.values().stream().forEach(source -> Arrays.stream(source.getValues()).forEach(value -> VALUE_MAP.put(value, source))); + Arrays.stream(Source.values()).forEach(source -> Arrays.stream(source.getValues()).forEach(value -> VALUE_MAP.put(value, source))); } final boolean manyDifferentSources; @@ -99,7 +99,7 @@ public enum Source implements VideoPatternEnumIntf { } public static Stream getValuesStream() { - return Source.values().stream().map(Source::getValues).flatMap(Arrays::stream); + return Arrays.stream(Source.values()).map(Source::getValues).flatMap(Arrays::stream); } public static Source fromValue(String value) { diff --git a/pom.xml b/pom.xml index 6247f874..df9e1f50 100644 --- a/pom.xml +++ b/pom.xml @@ -151,7 +151,7 @@ ch.qos.logback logback-classic - 1.5.6 + 1.1.2 org.openapitools From 897046ce118f52829ee34af3dd781e66136257e1 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 11:32:41 +0200 Subject: [PATCH 07/54] changes --- .../subtools/multisubdownloader/App.java | 3 ++- .../subtools/multisubdownloader/CLI.java | 6 ++--- .../subtools/multisubdownloader/GUI.java | 5 ++-- .../actions/CleanAction.java | 27 +++++++++---------- .../actions/FileListAction.java | 19 +++++++------ .../actions/RenameAction.java | 4 +-- .../actions/SearchAction.java | 4 +-- .../cli/actions/CliSearchAction.java | 1 + ...gress.java => CLIFileIndexerProgress.java} | 4 +-- .../subtools/multisubdownloader/gui/Menu.java | 10 +++---- .../gui/ToStringListCellRenderer.java | 11 +++----- .../gui/actions/search/GuiSearchAction.java | 2 +- .../gui/dialog/MappingEpisodeNameDialog.java | 6 ++--- .../gui/dialog/PreferenceDialog.java | 1 - .../gui/dialog/ProgressDialog.java | 4 ++- .../gui/dialog/RenameDialog.java | 2 ++ .../gui/dialog/SelectDialog.java | 5 ++-- .../gui/dialog/StructureBuilderDialog.java | 3 ++- .../gui/extra/ArrowButton.java | 2 -- .../gui/extra/MemoryFolderChooser.java | 2 +- .../gui/extra/table/CustomTable.java | 8 +++--- .../gui/extra/table/SubtitleTableModel.java | 4 +-- .../gui/extra/table/VideoTableModel.java | 1 + .../gui/extra/table/ZebraJTable.java | 1 + .../jtextfield/MyPasswordField.java | 2 +- ...tf.java => MyPasswordFieldOthersIntf.java} | 12 ++++----- .../gui/panels/InputPanel.java | 8 +++--- .../gui/panels/LoggingPanel.java | 13 ++++----- .../gui/panels/ResultPanel.java | 16 ++++------- .../gui/panels/SearchPanel.java | 1 + .../gui/panels/SearchTextInputPanel.java | 3 ++- .../preference/DefaultSelectionPanel.java | 1 + .../gui/panels/preference/GeneralPanel.java | 1 - .../gui/panels/preference/OptionsPanel.java | 1 - .../preference/SerieProvidersPanel.java | 11 +++----- .../panels/preference/StructureFilePanel.java | 2 +- .../preference/StructureFolderPanel.java | 2 +- .../gui/panels/preference/StructurePanel.java | 1 + .../preference/SubtitleBackupPanel.java | 1 - .../panels/preference/VideoLibraryPanel.java | 5 ++-- .../gui/workers/DownloadWorker.java | 4 +-- .../gui/workers/RenameWorker.java | 10 +++---- .../lib/ReleaseFactory.java | 4 +-- .../lib/control/TvReleaseControl.java | 4 +-- .../subtitles/filters/KeywordFilter.java | 1 - .../LocalServiceProvider.java | 2 +- .../settings/SettingsControl.java | 5 ++-- .../settings/model/PathOrRegex.java | 7 +++-- .../adapters/AbstractAdapter.java | 12 +++------ .../adapters/JAddic7edAdapter.java | 1 + .../adapters/JAddic7edViaProxyAdapter.java | 10 +++---- .../adapters/JOpenSubAdapter.java | 5 ++-- .../adapters/JPodnapisiAdapter.java | 1 + .../adapters/JSubsceneAdapter.java | 1 + .../adapters/JTVsubtitlesAdapter.java | 5 ++-- .../addic7ed/JAddic7edApi.java | 15 +++++------ .../gestdown/JAddic7edProxyGestdownApi.java | 1 + .../podnapisi/JPodnapisiApi.java | 3 +-- .../subscene/SubsceneApi.java | 15 +++++------ .../subscene/model/SubSceneSerieId.java | 1 + .../util/PropertiesReader.java | 2 +- .../workers/SearchWorker.java | 5 ++-- 62 files changed, 151 insertions(+), 178 deletions(-) rename MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/{CLIFileindexerProgress.java => CLIFileIndexerProgress.java} (93%) rename MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/{MypasswordFieldOthersIntf.java => MyPasswordFieldOthersIntf.java} (52%) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java index 003218cb..f236e9ab 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java @@ -39,9 +39,10 @@ @ExtensionMethod({ Files.class }) public class App { + private static final Logger LOGGER = LoggerFactory.getLogger(App.class); + private static SettingsControl prefCtrl; private static Splash splash; - private static final Logger LOGGER = LoggerFactory.getLogger(App.class); public static void main(String[] args) throws ReflectiveOperationException, UnsupportedLookAndFeelException { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 28fb35f7..0b417aec 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -13,7 +13,7 @@ import org.lodder.subtools.multisubdownloader.actions.UserInteractionHandlerAction; import org.lodder.subtools.multisubdownloader.cli.CliOption; import org.lodder.subtools.multisubdownloader.cli.actions.CliSearchAction; -import org.lodder.subtools.multisubdownloader.cli.progress.CLIFileindexerProgress; +import org.lodder.subtools.multisubdownloader.cli.progress.CLIFileIndexerProgress; import org.lodder.subtools.multisubdownloader.cli.progress.CLISearchProgress; import org.lodder.subtools.multisubdownloader.exceptions.CliException; import org.lodder.subtools.multisubdownloader.exceptions.SearchSetupException; @@ -32,8 +32,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.experimental.ExtensionMethod; - public class CLI { private static final Logger LOGGER = LoggerFactory.getLogger(CLI.class); @@ -104,7 +102,7 @@ public void search() { .createWithSettings(settings) .manager(manager) .subtitleProviderStore((SubtitleProviderStore) app.make("SubtitleProviderStore")) - .indexingProgressListener(new CLIFileindexerProgress().verbose(verboseProgress)) + .indexingProgressListener(new CLIFileIndexerProgress().verbose(verboseProgress)) .searchProgressListener(new CLISearchProgress().verbose(verboseProgress)) .cli(this) .fileListAction(new FileListAction(this.settings)) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index ab6da857..eea8f111 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -17,7 +17,6 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; -import lombok.experimental.ExtensionMethod; import org.lodder.subtools.multisubdownloader.framework.Container; import org.lodder.subtools.multisubdownloader.framework.event.Emitter; import org.lodder.subtools.multisubdownloader.gui.Menu; @@ -240,7 +239,7 @@ private void createTextSearchPanel() { ResultPanel resultPanel = new ResultPanel(); SearchTextInputPanel pnlSearchTextInput = new SearchTextInputPanel(); pnlSearchText = new SearchPanel<>(pnlSearchTextInput, resultPanel); - pnlSearchTextInput.setSelectedlanguage(settings.getSubtitleLanguage() == null ? Language.DUTCH : settings.getSubtitleLanguage()); + pnlSearchTextInput.setSelectedLanguage(settings.getSubtitleLanguage() == null ? Language.DUTCH : settings.getSubtitleLanguage()); resultPanel.showSelectFoundSubtitlesButton(); resultPanel.setTable(createSubtitleTable()); resultPanel.setDownloadAction(arg -> downloadText()); @@ -270,7 +269,7 @@ private void createFileSearchPanel() { ResultPanel resultPanel = new ResultPanel(); pnlSearchFileInput = new SearchFileInputPanel(); pnlSearchFileInput.setRecursiveSelected(settings.isOptionRecursive()); - pnlSearchFileInput.setSelectedlanguage(settings.getSubtitleLanguage() == null ? Language.DUTCH : settings.getSubtitleLanguage()); + pnlSearchFileInput.setSelectedLanguage(settings.getSubtitleLanguage() == null ? Language.DUTCH : settings.getSubtitleLanguage()); pnlSearchFile = new SearchPanel<>(pnlSearchFileInput, resultPanel); resultPanel.setTable(createVideoTable()); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java index fc03331c..4cfcbe32 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java @@ -6,26 +6,23 @@ import java.nio.file.StandardCopyOption; import java.util.Set; +import lombok.RequiredArgsConstructor; +import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; import org.lodder.subtools.sublibrary.model.Release; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.experimental.ExtensionMethod; - -@ExtensionMethod({ StringUtils.class, Files.class }) +@RequiredArgsConstructor +@ExtensionMethod({ Files.class }) public class CleanAction { private static final Logger LOGGER = LoggerFactory.getLogger(CleanAction.class); - private static final String SAMPLE_DIR_NAME = "sample"; + private static final String SAMPLE_DIR_NAME = "sample"; + private static final Set FILE_FILTERS = Set.of("nfo", "jpg", "sfv", "srr", "srs", "nzb", "torrent", "txt"); private final LibrarySettings librarySettings; - private final Set fileFilters = Set.of("nfo", "jpg", "sfv", "srr", "srs", "nzb", "torrent", "txt"); - - public CleanAction(LibrarySettings librarySettings) { - this.librarySettings = librarySettings; - } public void cleanUpFiles(Release release, Path destination, String videoFileName) throws IOException { LOGGER.trace("cleanUpFiles: LibraryOtherFileAction {}", librarySettings.getLibraryOtherFileAction()); @@ -35,22 +32,23 @@ public void cleanUpFiles(Release release, Path destination, String videoFileName release.getPath().list().asThrowingStream(IOException.class) .filter(p -> (p.isDirectory() && p.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME)) - || (p.isRegularFile() && fileFilters.contains(p.getExtension()))) + || (p.isRegularFile() && FILE_FILTERS.contains(p.getExtension()))) .forEach(p -> { switch (librarySettings.getLibraryOtherFileAction()) { case MOVE -> move(p, destination); case MOVEANDRENAME -> moveAndRename(p, destination, videoFileName); case REMOVE -> delete(p); case RENAME -> rename(p, destination, videoFileName); - case NOTHING -> {} - default -> {} + case NOTHING -> { } + default -> { } } }); } private void rename(Path path, Path destinationFolder, String videoFileName) throws IOException { if (path.isRegularFile()) { - String fileName = path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : StringUtils.substringBeforeLast(videoFileName, "."); + String fileName = + path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : StringUtils.substringBeforeLast(videoFileName, "."); String extension = path.getExtension(); if (!extension.isBlank()) { extension = "." + extension; @@ -67,7 +65,8 @@ private void delete(Path path) throws IOException { private void moveAndRename(Path path, Path destinationFolder, String videoFileName) throws IOException { if (path.isRegularFile()) { - String fileName = path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : StringUtils.substringBeforeLast(videoFileName, "."); + String fileName = + path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : StringUtils.substringBeforeLast(videoFileName, "."); String extension = path.getExtension(); if (!extension.isBlank()) { extension = "." + extension; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java index f4daae0f..88f1ab13 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java @@ -10,6 +10,7 @@ import java.util.Set; import extensions.java.nio.file.Path.PathExt; +import lombok.RequiredArgsConstructor; import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.listeners.IndexingProgressListener; @@ -19,20 +20,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@RequiredArgsConstructor @ExtensionMethod({ Files.class }) public class FileListAction { + private static final Logger LOGGER = LoggerFactory.getLogger(FileListAction.class); + private static final String SUBTITLE_EXTENSION = "srt"; + + private final Settings settings; private IndexingProgressListener indexingProgressListener; private int progressFileIndex; private int progressFilesTotal; - private final Settings settings; - private final static String subtitleExtension = "srt"; - private static final Logger LOGGER = LoggerFactory.getLogger(FileListAction.class); - - public FileListAction(Settings settings) { - this.settings = settings; - } public List getFileListing(Path dir, boolean recursive, Language language, boolean forceSubtitleOverwrite) { LOGGER.trace("getFileListing: dir [{}] Recursive [{}] languageCode [{}] forceSubtitleOverwrite [{}]", dir, recursive, language, @@ -115,7 +114,7 @@ public boolean fileHasSubtitles(Path file, Language language) throws IOException String extension = file.getExtension(); Optional subtitleNameOptional = VideoPatterns.EXTENSIONS.stream() .filter(extension::equals) - .map(x -> file.changeExtension(subtitleExtension)) + .map(x -> file.changeExtension(SUBTITLE_EXTENSION)) .findAny(); if (subtitleNameOptional.isEmpty()) { @@ -126,7 +125,7 @@ public boolean fileHasSubtitles(Path file, Language language) throws IOException if (f.exists()) { return true; } else { - String subtitleExtensionWithDot = "." + subtitleExtension; + String subtitleExtensionWithDot = "." + SUBTITLE_EXTENSION; Set langCodes = new HashSet<>(); langCodes.add(language.getLangCode()); @@ -135,7 +134,7 @@ public boolean fileHasSubtitles(Path file, Language language) throws IOException if (!StringUtils.isBlank(customLangCode)) { langCodes.add(customLangCode); } - List filters = langCodes.stream().map(word -> word + "." + subtitleExtension).toList(); + List filters = langCodes.stream().map(word -> word + "." + SUBTITLE_EXTENSION).toList(); String subtitleNameWithoutExtension = subtitleName.replace(subtitleExtensionWithDot, ""); return file.getParent().list().map(PathExt::getFileNameAsString).filter(fileName -> filters.stream().anyMatch(fileName::endsWith)) .anyMatch(fileName -> fileName.contains(subtitleNameWithoutExtension)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java index 6f50e08d..a287bf09 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java @@ -23,12 +23,12 @@ @RequiredArgsConstructor public class RenameAction { + private static final Logger LOGGER = LoggerFactory.getLogger(RenameAction.class); + private final LibrarySettings librarySettings; private final Manager manager; private final UserInteractionHandler userInteractionHandler; - private static final Logger LOGGER = LoggerFactory.getLogger(RenameAction.class); - public void rename(Path f, Release release) { String filename = switch (librarySettings.getLibraryAction()) { case MOVE, NOTHING -> f.getFileNameAsString(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java index 5db2937f..bef4d731 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java @@ -28,6 +28,8 @@ @Getter(value = AccessLevel.PROTECTED) public abstract class SearchAction implements Runnable, Cancelable, SearchHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(SearchAction.class); + private final Manager manager; private final @NonNull Settings settings; private final @NonNull SubtitleProviderStore subtitleProviderStore; @@ -35,8 +37,6 @@ public abstract class SearchAction implements Runnable, Cancelable, SearchHandle private SearchManager searchManager; private List releases; - private static final Logger LOGGER = LoggerFactory.getLogger(SearchAction.class); - @Override public void run() { LOGGER.trace("SearchAction is being executed"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java index 5d342da9..31fe7005 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java @@ -37,6 +37,7 @@ public class CliSearchAction extends SearchAction { private static final Logger LOGGER = LoggerFactory.getLogger(CliSearchAction.class); + private final @NonNull CLI cli; private final @NonNull FileListAction fileListAction; @Getter diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileindexerProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java similarity index 93% rename from MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileindexerProgress.java rename to MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java index b5670916..e6b0e978 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileindexerProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java @@ -3,11 +3,11 @@ import org.lodder.subtools.multisubdownloader.actions.ActionException; import org.lodder.subtools.multisubdownloader.listeners.IndexingProgressListener; -public class CLIFileindexerProgress extends CLIProgress implements IndexingProgressListener { +public class CLIFileIndexerProgress extends CLIProgress implements IndexingProgressListener { private String currentFile; - public CLIFileindexerProgress() { + public CLIFileIndexerProgress() { super(); currentFile = ""; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java index 5336d78b..94b44736 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java @@ -1,20 +1,16 @@ package org.lodder.subtools.multisubdownloader.gui; +import javax.swing.*; +import java.awt.event.ActionListener; import java.io.Serial; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; - import org.lodder.subtools.multisubdownloader.Messages; -import java.awt.event.ActionListener; - public class Menu extends JMenuBar { @Serial private static final long serialVersionUID = -7384297314593169280L; + private JMenu mnFile; private JMenuItem mntmQuit; private JMenu mnView; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/ToStringListCellRenderer.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/ToStringListCellRenderer.java index ec474374..48ac1575 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/ToStringListCellRenderer.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/ToStringListCellRenderer.java @@ -1,19 +1,16 @@ package org.lodder.subtools.multisubdownloader.gui; +import javax.swing.*; +import java.awt.*; import java.util.function.Function; -import javax.swing.JList; -import javax.swing.ListCellRenderer; - -import org.lodder.subtools.multisubdownloader.Messages; - -import java.awt.Component; - import lombok.AccessLevel; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.multisubdownloader.Messages; @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public final class ToStringListCellRenderer implements ListCellRenderer { + private final ListCellRenderer originalRenderer; private final Function toStringMapper; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java index 8990188b..3c40969b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java @@ -34,7 +34,7 @@ public abstract class GuiSearchAction

extends SearchAction private final SearchProgressListener searchProgressListener; private final UserInteractionHandlerGUI userInteractionHandler; - public GuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, + GuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow, SearchPanel

searchPanel, ReleaseFactory releaseFactory) { super(manager, settings, subtitleProviderStore); this.mainWindow = mainWindow; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index 22a726c7..fee21844 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -17,7 +17,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.tuple.Pair; import org.lodder.subtools.multisubdownloader.Messages; @@ -35,14 +34,15 @@ public class MappingEpisodeNameDialog extends MultiSubDialog { @Serial private static final long serialVersionUID = 1L; + private final JPanel contentPanel = new JPanel(); - private JTable table; private final Manager manager; private final MappingTableModel mappingTableModel; private final SubtitleProviderStore subtitleProviderStore; private final UserInteractionHandlerGUI userInteractionHandler; - private Optional selectedSubtitleProvider; private final JButton btnAddCustomMapping; + private JTable table; + private Optional selectedSubtitleProvider; private MappingType selectedMappingType; /** diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java index 2866c632..7d12010b 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java @@ -27,7 +27,6 @@ public class PreferenceDialog extends MultiSubDialog { private final SettingsControl settingsCtrl; private final Emitter eventEmitter; - private final GeneralPanel pnlGeneral; private final EpisodeLibraryPanel pnlEpisodeLibrary; private final MovieLibraryPanel pnlMovieLibrary; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java index 129000c0..bce60dd8 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java @@ -15,10 +15,12 @@ public class ProgressDialog extends MultiSubDialog implements Messenger { @Serial private static final long serialVersionUID = -2320149791421648965L; + + private final Cancelable worker; + @Getter private JProgressBar progressBar; private JLabel label; - private final Cancelable worker; public ProgressDialog(JFrame frame, Cancelable sft) { super(frame, Messages.getString("ProgressDialog.Title"), false); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index 019d4387..3cd10459 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -39,9 +39,11 @@ public class RenameDialog extends MultiSubDialog implements PropertyChangeListen @Serial private static final long serialVersionUID = 1L; + private final VideoLibraryPanel pnlLibrary; private final MyTextFieldPath txtFolder; private final JCheckBox chkRecursive; + private ProgressDialog progressDialog; public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String title, Manager manager, diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java index 21ce734c..49621e54 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.stream.IntStream; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.table.CustomTable; @@ -21,9 +20,11 @@ public class SelectDialog extends MultiSubDialog { @Serial private static final long serialVersionUID = -4092909537478305235L; - private List selectedSubtitleIdxs; + private final List subtitles; private final Release release; + + private List selectedSubtitleIdxs; private CustomTable customTable; /** diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index d1d6cddb..c68ee53d 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -11,7 +11,6 @@ import java.util.Arrays; import java.util.function.Function; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.lib.ReleaseFactory; @@ -32,11 +31,13 @@ public class StructureBuilderDialog extends MultiSubDialog implements DocumentLi @Serial private static final long serialVersionUID = -5174968778375028124L; + private final VideoType videoType; private final StructureType structureType; private final Manager manager; private final UserInteractionHandler userInteractionHandler; private final Function libraryBuilder; + private JTextField txtStructure; private JLabel lblPreview; private TvRelease tvRelease; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java index fad3084e..71b5c150 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java @@ -19,9 +19,7 @@ public class ArrowButton extends JButton { * any of {@link SwingConstants#NORTH}, {@link SwingConstants#SOUTH}, {@link SwingConstants#WEST} or {@link SwingConstants#EAST} */ private int direction; - private int arrowCount; - private int arrowSize; public ArrowButton(int direction, int arrowCount, int arrowSize) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/MemoryFolderChooser.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/MemoryFolderChooser.java index bda17fb2..43639260 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/MemoryFolderChooser.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/MemoryFolderChooser.java @@ -11,8 +11,8 @@ public class MemoryFolderChooser { - private final JFileChooser chooser; private static MemoryFolderChooser instance; + private final JFileChooser chooser; private File memory; private MemoryFolderChooser() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java index 63ab5120..f2c6df3c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java @@ -1,21 +1,21 @@ package org.lodder.subtools.multisubdownloader.gui.extra.table; +import java.awt.event.MouseEvent; import java.io.Serial; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import java.util.stream.IntStream; -import java.awt.event.MouseEvent; - public class CustomTable extends ZebraJTable { @Serial private static final long serialVersionUID = -3889524906608098585L; - private final Map columnSettings = new HashMap<>(); private static final int MAX_WIDTH = 2147483647; private static final int MIN_WIDTH = 15; private static final int PREFERRED_WIDTH = 75; + private final Map columnSettings = new EnumMap<>(SearchColumnName.class); + public int getColumnIdByName(CustomColumnName customColumnName) { return IntStream.range(0, this.getColumnCount()) .filter(i -> this.getColumnName(i).equals(customColumnName.getColumnName())).findFirst() diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java index 31064069..1bb3b30e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java @@ -15,7 +15,7 @@ public class SubtitleTableModel extends DefaultTableModel { @Serial private static final long serialVersionUID = 4205143311042280620L; - private final static SubtitleTableColumnName[] COLUMNS = + private static final SubtitleTableColumnName[] COLUMNS = Stream.of(SELECT, SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARINGIMPAIRED).toArray(SubtitleTableColumnName[]::new); public SubtitleTableModel(Object[][] data, String[] columnNames) { @@ -24,7 +24,7 @@ public SubtitleTableModel(Object[][] data, String[] columnNames) { public static SubtitleTableModel getDefaultSubtitleTableModel() { String[] columnNames = Arrays.stream(COLUMNS).map(SubtitleTableColumnName::getColumnName).toArray(String[]::new); - return new SubtitleTableModel(new Object[][] {}, columnNames); + return new SubtitleTableModel(new Object[][]{}, columnNames); } public void addRow(Subtitle subtitle) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java index bed205f3..3393ade4 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java @@ -41,6 +41,7 @@ public class VideoTableModel extends DefaultTableModel { private final Class[] columnTypes; private final Boolean[] columnEditables; private final Map rowMap = new LinkedHashMap<>(); + private boolean showOnlyFound = false; @Setter private UserInteractionHandler userInteractionHandler; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/ZebraJTable.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/ZebraJTable.java index 20f41050..89010570 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/ZebraJTable.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/ZebraJTable.java @@ -10,6 +10,7 @@ public class ZebraJTable extends javax.swing.JTable { @Serial private static final long serialVersionUID = -6943213333291518652L; + private final java.awt.Color[] rowColors = new java.awt.Color[2]; private boolean drawStripes = false; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java index ff73cc8d..4f9e6df7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java @@ -14,7 +14,7 @@ import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.util.BooleanConsumer; -public class MyPasswordField extends JPasswordField implements MypasswordFieldOthersIntf { +public class MyPasswordField extends JPasswordField implements MyPasswordFieldOthersIntf { @Serial private static final long serialVersionUID = -3002009544577141751L; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MypasswordFieldOthersIntf.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordFieldOthersIntf.java similarity index 52% rename from MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MypasswordFieldOthersIntf.java rename to MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordFieldOthersIntf.java index 33b2bc1b..24fcfe22 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MypasswordFieldOthersIntf.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordFieldOthersIntf.java @@ -5,18 +5,18 @@ import org.lodder.subtools.sublibrary.util.BooleanConsumer; -public interface MypasswordFieldOthersIntf { - MypasswordFieldOthersIntf withValueVerifier(Predicate verifier); +public interface MyPasswordFieldOthersIntf { + MyPasswordFieldOthersIntf withValueVerifier(Predicate verifier); - default MypasswordFieldOthersIntf requireValue() { + default MyPasswordFieldOthersIntf requireValue() { return requireValue(true); } - MypasswordFieldOthersIntf requireValue(boolean requireValue); + MyPasswordFieldOthersIntf requireValue(boolean requireValue); - MypasswordFieldOthersIntf withValueChangedCallback(Consumer valueChangedCalbackListener); + MyPasswordFieldOthersIntf withValueChangedCallback(Consumer valueChangedCalbackListener); - MypasswordFieldOthersIntf withValidityChangedCallback(BooleanConsumer... validityChangedCalbackListeners); + MyPasswordFieldOthersIntf withValidityChangedCallback(BooleanConsumer... validityChangedCalbackListeners); MyPasswordField build(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java index 2d5efec8..8326d20f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java @@ -1,10 +1,8 @@ package org.lodder.subtools.multisubdownloader.gui.panels; +import javax.swing.*; import java.io.Serial; -import javax.swing.JButton; -import javax.swing.JPanel; - import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.actions.SearchAction; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; @@ -17,7 +15,7 @@ public abstract class InputPanel extends JPanel { private JButton btnSearch; private MyComboBox cbxLanguage; - public InputPanel() { + InputPanel() { createComponents(); } @@ -25,7 +23,7 @@ public Language getSelectedLanguage() { return cbxLanguage.getSelectedItem(); } - public void setSelectedlanguage(Language language) { + public void setSelectedLanguage(Language language) { cbxLanguage.setSelectedItem(language); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java index 67edaca5..cd3b1f28 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java @@ -13,26 +13,27 @@ public class LoggingPanel extends JPanel { @Serial private static final long serialVersionUID = 1578326761175927376L; + private final JTextArea txtLogging; - private final ch.qos.logback.classic.Logger root = + private final ch.qos.logback.classic.Logger ROOT = (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); public LoggingPanel() { this.setLayout(new MigLayout("", "[698px,grow][]", "[][70px,grow]")); - JScrollPane scrollPane_1 = new JScrollPane(); + JScrollPane scrollPane = new JScrollPane(); this.add(new JLabel(Messages.getString("App.Logging")), "cell 0 0,alignx right,gaptop 5"); this.add(new JSeparator(), "cell 0 0,growx,gaptop 5"); Level[] logLevels = { Level.ALL, Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR }; MyComboBox cbxLogLevel = new MyComboBox<>(logLevels) - .withSelectedItem(root.getLevel()) - .withSelectedItemConsumer(root::setLevel); + .withSelectedItem(ROOT.getLevel()) + .withSelectedItemConsumer(ROOT::setLevel); this.add(cbxLogLevel, "cell 1 0,alignx right"); - this.add(scrollPane_1, "cell 0 1 2 1,grow"); + this.add(scrollPane, "cell 0 1 2 1,grow"); txtLogging = new JTextArea().autoscrolls(true).editable(false); - scrollPane_1.setViewportView(txtLogging); + scrollPane.setViewportView(txtLogging); new LogTextAppender(txtLogging); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java index 762b232b..68df243e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java @@ -1,27 +1,21 @@ package org.lodder.subtools.multisubdownloader.gui.panels; +import javax.swing.*; +import javax.swing.table.*; +import java.awt.event.ActionListener; import java.io.Serial; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSeparator; -import javax.swing.table.DefaultTableModel; - +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.table.CustomTable; import org.lodder.subtools.multisubdownloader.gui.extra.table.SearchColumnName; import org.lodder.subtools.multisubdownloader.gui.extra.table.VideoTableModel; -import java.awt.event.ActionListener; - -import net.miginfocom.swing.MigLayout; - public class ResultPanel extends JPanel { @Serial private static final long serialVersionUID = 2368028332402129899L; + private JButton btnMove; private JButton btnSelectAll; private JScrollPane scrollPane; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java index 4c244197..ee532eb7 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java @@ -12,6 +12,7 @@ public class SearchPanel extends JPanel { @Serial private static final long serialVersionUID = -7602822323779710089L; + private final ResultPanel resultPanel; private final I inputPanel; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java index 40733ad2..29f9dad0 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java @@ -12,11 +12,12 @@ public class SearchTextInputPanel extends InputPanel { @Serial private static final long serialVersionUID = 7030171360517948253L; + private MyComboBox cbxVideoType; + private JTextField txtInputVideoName; protected JTextField txtInputSeason; protected JTextField txtInputEpisode; protected JTextField txtQualityVersion; - private JTextField txtInputVideoName; public SearchTextInputPanel() { super(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java index 494c9bcc..dc2ff08f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java @@ -19,6 +19,7 @@ public class DefaultSelectionPanel extends JPanel implements PreferencePanelIntf { private static final long serialVersionUID = 1L; + private final SettingsControl settingsCtrl; private final ScrollTable unusedPatternsTable; private final ScrollTable usedPatternsTable; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index 4cd3525c..50177aab 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -32,7 +32,6 @@ public class GeneralPanel extends JPanel implements PreferencePanelIntf { private final GUI gui; private final SettingsControl settingsCtrl; - private final MyComboBox cbxLanguage; private final JListWithImages defaultIncomingFoldersList; private final JListWithImages excludeList; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index ea2e3fc4..7774a1ed 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -17,7 +17,6 @@ public class OptionsPanel extends JPanel implements PreferencePanelIntf { private static final long serialVersionUID = -5458593307643063563L; private final SettingsControl settingsCtrl; - private final JCheckBox chkAlwaysConfirm; private final JCheckBox chkMinScoreSelection; private final JSlider sldMinScoreSelection; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index bc48a460..b05a2959 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -2,15 +2,11 @@ import static java.util.function.Predicate.*; +import javax.swing.*; import java.io.Serial; import java.nio.file.Path; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; - +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.JListWithImages; import org.lodder.subtools.multisubdownloader.gui.extra.JListWithImages.LabelPanel; @@ -23,12 +19,11 @@ import org.lodder.subtools.multisubdownloader.settings.model.PathMatchType; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.OpenSubtitlesApi; -import net.miginfocom.swing.MigLayout; - public class SerieProvidersPanel extends JPanel implements PreferencePanelIntf { @Serial private static final long serialVersionUID = -5458593307643063563L; + private final SettingsControl settingsCtrl; private final JCheckBox chkSourceAddic7ed; private final JCheckBox chkUserAddic7edLogin; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index 6f1b03c1..e80a9f47 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -32,8 +32,8 @@ public class StructureFilePanel extends JPanel { @Serial private static final long serialVersionUID = -5458593307643063563L; - private final LibrarySettings librarySettings; + private final LibrarySettings librarySettings; private final MyTextFieldString txtFileStructure; private final JCheckBox chkReplaceSpace; private final MyComboBox cbxReplaceSpaceChar; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index c9df15a1..22a13c13 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -23,8 +23,8 @@ public class StructureFolderPanel extends JPanel implements PreferencePanelIntf @Serial private static final long serialVersionUID = 3476596236588408382L; - private final LibrarySettings librarySettings; + private final LibrarySettings librarySettings; private final MyTextFieldPath txtLibraryFolder; private final MyTextFieldString txtFolderStructure; private final JCheckBox chkRemoveEmptyFolder; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java index f74976ae..2f734740 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java @@ -13,6 +13,7 @@ public abstract class StructurePanel> extends JPanel @Serial private static final long serialVersionUID = 7507970016496546514L; + @Getter(value = AccessLevel.PROTECTED) private final JButton btnBuildStructure; @Getter(value = AccessLevel.PROTECTED) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java index c50f48bb..b1b18e1d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java @@ -18,7 +18,6 @@ public class SubtitleBackupPanel extends JPanel implements PreferencePanelIntf { private static final long serialVersionUID = -1498846730946617177L; private final LibrarySettings librarySettings; - private final JCheckBox chkBackupSubtitle; private final MyTextFieldPath txtBackupSubtitlePath; private final JCheckBox chkBackupUseSourceFileName; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java index 7b3e5bf5..923c53aa 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java @@ -26,13 +26,12 @@ public abstract class VideoLibraryPanel extends JPanel implements PreferencePane @Getter private final LibrarySettings librarySettings; - - protected final StructureFolderPanel pnlStructureFolder; - protected final StructureFilePanel pnlStructureFile; private final MyComboBox cbxLibraryAction; private final JCheckBox chkUseTVDBNaming; private final PartialDisableComboBox cbxLibraryOtherFileAction; private final SubtitleBackupPanel pnlBackup; + protected final StructureFolderPanel pnlStructureFolder; + protected final StructureFilePanel pnlStructureFile; public VideoLibraryPanel(LibrarySettings librarySettings, VideoType videoType, Manager manager, boolean renameMode, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java index 76a2dbe5..17c11f5e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java @@ -28,13 +28,13 @@ */ public class DownloadWorker extends SwingWorker implements Cancelable { + private static final Logger LOGGER = LoggerFactory.getLogger(DownloadWorker.class); + private final CustomTable table; private final Settings settings; private final DownloadAction downloadAction; private final UserInteractionHandlerAction userInteractionHandlerAction; - private static final Logger LOGGER = LoggerFactory.getLogger(DownloadWorker.class); - public DownloadWorker(CustomTable table, Settings settings, Manager manager, GUI gui) { this.table = table; this.settings = settings; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java index 536989e5..39d2e0b6 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java @@ -1,9 +1,9 @@ package org.lodder.subtools.multisubdownloader.gui.workers; +import javax.swing.*; import java.util.List; -import javax.swing.SwingWorker; - +import lombok.RequiredArgsConstructor; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.actions.RenameAction; import org.lodder.subtools.multisubdownloader.gui.dialog.Cancelable; @@ -18,8 +18,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.RequiredArgsConstructor; - /** * Created by IntelliJ IDEA. User: lodder Date: 4/12/11 Time: 8:52 AM To change this template use * Path | Settings | Path Templates. @@ -27,13 +25,13 @@ @RequiredArgsConstructor public class RenameWorker extends SwingWorker implements Cancelable { + private static final Logger LOGGER = LoggerFactory.getLogger(RenameWorker.class); + private final CustomTable table; private final Settings settings; private final Manager manager; private final UserInteractionHandler userInteractionHandler; - private static final Logger LOGGER = LoggerFactory.getLogger(RenameWorker.class); - @Override protected Void doInBackground() { final VideoTableModel model = (VideoTableModel) table.getModel(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java index e9c91679..3e656600 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java @@ -19,12 +19,12 @@ public class ReleaseFactory { + private static final Logger LOGGER = LoggerFactory.getLogger(ReleaseFactory.class); + private final ReleaseParser releaseParser; private final Settings settings; private final Manager manager; - private static final Logger LOGGER = LoggerFactory.getLogger(ReleaseFactory.class); - public ReleaseFactory(Settings settings, Manager manager) { this.releaseParser = new ReleaseParser(); this.settings = settings; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index c5c3fa7b..e637b816 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -14,11 +14,11 @@ public class TvReleaseControl extends ReleaseControl { + private static final Logger LOGGER = LoggerFactory.getLogger(TvReleaseControl.class); + private final TheTvdbAdapter jtvdba; private final TvRelease tvRelease; - private static final Logger LOGGER = LoggerFactory.getLogger(TvReleaseControl.class); - public TvReleaseControl(TvRelease tvRelease, Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { super(settings, manager); this.tvRelease = tvRelease; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java index e0136721..bce62a65 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java @@ -11,7 +11,6 @@ public class KeywordFilter extends SubtitleFilter { private static final Logger LOGGER = LoggerFactory.getLogger(KeywordFilter.class); - @Override public boolean useSubtitle(Release release, Subtitle subtitle) { String keywordsFile = ReleaseParser.getQualityKeyword(getReleaseName(release)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java index d72dd431..10fc212f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java @@ -12,9 +12,9 @@ public class LocalServiceProvider implements ServiceProvider { + private UserInteractionHandler userInteractionHandler; protected Container app; protected SubtitleProvider subtitleProvider; - private UserInteractionHandler userInteractionHandler; @Override public int getPriority() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java index 96507d9b..2bc324b0 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java @@ -40,14 +40,15 @@ @ExtensionMethod({ Files.class }) public class SettingsControl { + private static final Logger LOGGER = LoggerFactory.getLogger(SettingsControl.class); + private static final String BACKING_STORE_AVAIL = "BackingStoreAvail"; + private final Manager manager; private final Preferences preferences; @Getter private Settings settings; @Getter private State state; - private static final String BACKING_STORE_AVAIL = "BackingStoreAvail"; - private static final Logger LOGGER = LoggerFactory.getLogger(SettingsControl.class); public SettingsControl(Manager manager) { if (!backingStoreAvailable()) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathOrRegex.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathOrRegex.java index de770f93..a471209f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathOrRegex.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathOrRegex.java @@ -1,5 +1,6 @@ package org.lodder.subtools.multisubdownloader.settings.model; +import java.awt.*; import java.io.Serializable; import java.nio.file.Files; import java.nio.file.InvalidPathException; @@ -8,15 +9,13 @@ import java.util.function.Predicate; import java.util.regex.Pattern; -import org.lodder.subtools.sublibrary.util.NamedPattern; - -import java.awt.Image; - import lombok.Getter; +import org.lodder.subtools.sublibrary.util.NamedPattern; public class PathOrRegex implements Serializable { private static final long serialVersionUID = 1L; + @Getter private final String value; @Getter diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java index 58365df7..7994953d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java @@ -6,17 +6,13 @@ import java.util.function.Predicate; import java.util.function.Supplier; +import com.pivovarit.function.ThrowingSupplier; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.ProviderSerieId; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.pivovarit.function.ThrowingSupplier; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; /** * @param @@ -27,7 +23,7 @@ @Getter @RequiredArgsConstructor abstract class AbstractAdapter implements Adapter, SubtitleProvider { - Logger LOGGER = LoggerFactory.getLogger(AbstractAdapter.class); + private final Manager manager; private final UserInteractionHandler userInteractionHandler; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java index 9cd048f4..b4b32e44 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java @@ -32,6 +32,7 @@ public class JAddic7edAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JAddic7edAdapter.class); + private static LazySupplier jaapi; public JAddic7edAdapter(boolean isLoginEnabled, String username, String password, boolean speedy, Manager manager, diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index 2728850b..dc9935ac 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -11,6 +11,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import com.pivovarit.function.ThrowingSupplier; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.gestdown.invoker.ApiException; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.addic7ed.proxy.gestdown.JAddic7edProxyGestdownApi; @@ -24,16 +27,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.pivovarit.function.ThrowingSupplier; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.experimental.ExtensionMethod; - @Getter public class JAddic7edViaProxyAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JAddic7edViaProxyAdapter.class); + private final JAddic7edProxyGestdownApi jaapi; public JAddic7edViaProxyAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index 1fc55be0..b19afebb 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import lombok.Getter; import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; @@ -29,14 +30,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - @Getter public class JOpenSubAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JOpenSubAdapter.class); + private static LazySupplier osApi; public JOpenSubAdapter(boolean isLoginEnabled, String username, String password, Manager manager, diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index a2dfebec..ff220c2d 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -33,6 +33,7 @@ public class JPodnapisiAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JPodnapisiAdapter.class); + private static LazySupplier jpapi; public JPodnapisiAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index 5bfef117..24ebe40a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -37,6 +37,7 @@ public class JSubsceneAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JSubsceneAdapter.class); + private static LazySupplier api; public JSubsceneAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java index 3aa4ad0f..6baf0d37 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java @@ -10,6 +10,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.tvsubtitles.JTVSubtitlesApi; @@ -29,13 +30,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - @Getter public class JTVsubtitlesAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JTVsubtitlesAdapter.class); + private static LazySupplier jtvapi; public JTVsubtitlesAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java index 58e12ad6..4565b0f1 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java @@ -29,14 +29,13 @@ import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; -import lombok.experimental.ExtensionMethod; - public class JAddic7edApi extends Html implements SubtitleApi { private static final long RATEDURATION = 1; // seconds + private static final String DOMAIN = "https://www.addic7ed.com"; - private final static Pattern TITLE_PATTERN = Pattern.compile(".*? - [0-9]+x[0-9]+ - (.*)"); - private final static Pattern VERSION_PATTERN = Pattern.compile("Version (.+), Duration: ([0-9]+).([0-9])+"); + private static final Pattern TITLE_PATTERN = Pattern.compile(".*? - [0-9]+x[0-9]+ - (.*)"); + private static final Pattern VERSION_PATTERN = Pattern.compile("Version (.+), Duration: ([0-9]+).([0-9])+"); private final boolean speedy; private LocalDateTime lastRequest = LocalDateTime.now(); @@ -78,7 +77,7 @@ public List getProviderId(String serieName) throws Addic7edExce List providerSerieIdsFormatted = providerSerieIds.stream().filter(providerId -> { String formattedSerieName = providerId.getName().replaceAll("[^A-Za-z]", ""); return StringUtils.containsIgnoreCase(serieNameFormatted, formattedSerieName) || - StringUtils.containsIgnoreCase(formattedSerieName, serieNameFormatted); + StringUtils.containsIgnoreCase(formattedSerieName, serieNameFormatted); }).toList(); return !providerSerieIdsFormatted.isEmpty() ? providerSerieIdsFormatted : providerSerieIds; } catch (Exception e) { @@ -162,7 +161,7 @@ public List getSubtitles(SerieMapping addic7edSerieM // incomplete not wanted if ((lang != null && td.toString().toLowerCase().contains("completed")) - && td.html().toLowerCase().contains("% completed")) { + && td.html().toLowerCase().contains("% completed")) { lang = null; } @@ -200,8 +199,8 @@ public List getSubtitles(SerieMapping addic7edSerieM public boolean isDuplicate(List lSubtitles, Addic7edSubtitleDescriptor sub) { return lSubtitles.stream() .anyMatch(s -> s.getLanguage() == sub.getLanguage() - && StringUtils.equals(s.getUrl(), sub.getUrl()) - && StringUtils.equals(s.getVersion(), sub.getVersion())); + && StringUtils.equals(s.getUrl(), sub.getUrl()) + && StringUtils.equals(s.getVersion(), sub.getVersion())); } private Optional getContent(String url) throws Addic7edException { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java index 747f6b40..1fad0e0b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java @@ -27,6 +27,7 @@ public class JAddic7edProxyGestdownApi extends Html implements SubtitleApi { private static final String DOMAIN = "https://api.gestdown.info"; + private final TvShowsApi tvShowsApi; private final SubtitlesApi subtitlesApi; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java index 894b6f41..e3129493 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java @@ -32,7 +32,6 @@ @RequiredArgsConstructor public class JPodnapisiApi implements SubtitleApi { - public static final int maxAge = 90; private static final String DOMAIN = "https://www.podnapisi.net"; private final Manager manager; private final String userAgent; @@ -95,7 +94,7 @@ protected Document getXml(String url) throws PodnapisiException { try { return manager.getPageContentBuilder().url(url).userAgent(getUserAgent()).cacheType(CacheType.MEMORY).retries(1) .retryPredicate(e -> e instanceof HttpClientException httpClientException && httpClientException.getResponseCode() >= 500 - && httpClientException.getResponseCode() < 600) + && httpClientException.getResponseCode() < 600) .retryWait(5).getAsJsoupDocument(); } catch (Exception e) { throw new PodnapisiException(e); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java index 8e17ce66..7752fbfa 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java @@ -16,6 +16,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.jsoup.nodes.Document; @@ -34,16 +36,11 @@ import org.lodder.subtools.sublibrary.settings.model.SerieMapping; import org.lodder.subtools.sublibrary.util.http.HttpClientException; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.experimental.ExtensionMethod; - public class SubsceneApi extends Html implements SubtitleApi { - private static final int RATEDURATION_SHORT = 1; // seconds - private static final int RATEDURATION_LONG = 5; // seconds + private static final int RATE_DURATION_SHORT = 1; // seconds + private static final int RATE_DURATION_LONG = 5; // seconds private static final String DOMAIN = "https://subscene.com"; - // private static final String SERIE_URL_PREFIX = DOMAIN + "/subtitles/"; private static final Pattern SERIE_NAME_PATTERN = Pattern.compile(".*? - ([A-Z][a-z]*) Season.*"); private static final Predicate RETRY_PREDICATE = @@ -124,10 +121,10 @@ private String getDownloadUrl(String seriePageUrl) throws SubsceneException { } private Document getJsoupDocument(String url) throws ManagerException { - while (ChronoUnit.SECONDS.between(lastRequest, LocalDateTime.now()) < RATEDURATION_SHORT) { + while (ChronoUnit.SECONDS.between(lastRequest, LocalDateTime.now()) < RATE_DURATION_SHORT) { sleepSeconds(1); } - Document document = super.getHtml(url).retries(1).retryPredicate(RETRY_PREDICATE).retryWait(RATEDURATION_LONG).getAsJsoupDocument(); + Document document = super.getHtml(url).retries(1).retryPredicate(RETRY_PREDICATE).retryWait(RATE_DURATION_LONG).getAsJsoupDocument(); lastRequest = LocalDateTime.now(); return document; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java index 3ee49710..7e0fc31c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java @@ -11,6 +11,7 @@ public class SubSceneSerieId extends ProviderSerieId { @Serial private static final long serialVersionUID = 5858875211782260667L; + private final int season; public SubSceneSerieId(String name, String id, int season) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/PropertiesReader.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/PropertiesReader.java index 95fa9971..f3fb5dbe 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/PropertiesReader.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/PropertiesReader.java @@ -6,8 +6,8 @@ public class PropertiesReader { - private final Properties properties; private static PropertiesReader propertiesReaderInstance; + private final Properties properties; public PropertiesReader() throws IOException { try (InputStream is = getClass().getClassLoader().getResourceAsStream("properties-from-pom.properties")) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java index eb1ceb64..3833c03e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java @@ -12,13 +12,14 @@ public class SearchWorker extends Thread { - protected final SubtitleProvider provider; + private static final Logger LOGGER = LoggerFactory.getLogger(SearchWorker.class); + private final SearchManager scheduler; + protected final SubtitleProvider provider; private boolean busy = false; private boolean isInterrupted = false; private Release release; private Set subtitles; - private static final Logger LOGGER = LoggerFactory.getLogger(SearchWorker.class); public SearchWorker(SubtitleProvider provider, SearchManager scheduler) { this.provider = provider; From 7dcd91e77ca57c46787f11560a5bc74ec596297a Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 11:41:52 +0200 Subject: [PATCH 08/54] formatting --- .../java/awt/Container/ContainerExt.java | 6 +-- .../AbstractButton/AbstractButtonExt.java | 4 +- .../javax/swing/JComponent/JComponentExt.java | 10 ++-- .../subtools/multisubdownloader/GUI.java | 14 +++--- .../UpdateAvailableGithub.java | 3 +- .../UserInteractionHandlerGUI.java | 9 ++-- .../actions/FileListAction.java | 2 +- .../actions/RenameAction.java | 2 +- .../actions/SearchAction.java | 9 ++-- .../actions/UserInteractionHandlerAction.java | 5 +- .../multisubdownloader/cli/CliOption.java | 3 +- .../cli/actions/CliSearchAction.java | 4 +- .../cli/progress/CLISearchProgress.java | 3 +- .../exceptions/SearchSetupException.java | 3 +- .../framework/Bootstrapper.java | 2 +- .../gui/actions/search/GuiSearchAction.java | 7 ++- .../gui/dialog/MappingEpisodeNameDialog.java | 10 ++-- .../gui/dialog/MultiSubDialog.java | 7 +-- .../gui/dialog/PreferenceDialog.java | 8 ++-- .../gui/dialog/SelectDialog.java | 2 +- .../progress/search/SearchProgressDialog.java | 15 ++---- .../search/SearchProgressTableModel.java | 4 +- .../gui/extra/JListWithImages.java | 2 +- .../gui/extra/LogTextAppender.java | 7 +-- .../gui/extra/PanelCheckBox.java | 14 ++---- .../gui/extra/PartialDisableComboBox.java | 1 - .../gui/extra/PopupListener.java | 4 +- .../gui/extra/progress/StatusLabel.java | 2 +- .../gui/extra/progress/StatusMessenger.java | 2 +- .../gui/extra/table/CustomTable.java | 4 +- .../gui/extra/table/SearchColumnName.java | 3 +- .../extra/table/SubtitleTableColumnName.java | 5 +- .../gui/extra/table/VideoTableModel.java | 4 +- .../gui/extra/table/ZebraJTable.java | 2 +- .../jcomponent/jpopupmenu/MyPopupMenu.java | 6 +-- .../gui/panels/SearchPanel.java | 3 +- .../preference/DefaultSelectionPanel.java | 6 +-- .../panels/preference/StructureFilePanel.java | 8 ++-- .../gui/panels/preference/StructurePanel.java | 2 +- .../preference/SubtitleBackupPanel.java | 1 - .../lib/control/ReleaseControl.java | 7 ++- .../control/subtitles/SubtitleFiltering.java | 6 +-- .../subtitles/filters/KeywordFilter.java | 8 ++-- .../subtitles/filters/ReleaseGroupFilter.java | 2 +- .../subtitles/filters/SubtitleFilter.java | 48 +++++++++---------- .../lib/library/FilenameLibraryBuilder.java | 5 +- .../lib/library/LibraryBuilder.java | 2 +- .../library/LibraryOtherFileActionType.java | 3 +- .../lib/library/PathLibraryBuilder.java | 5 +- .../PodnapisiServiceProvider.java | 1 + .../settings/SettingsControl.java | 9 ++-- .../settings/model/LibrarySettings.java | 7 ++- .../settings/model/PathMatchType.java | 3 +- .../settings/model/Settings.java | 9 ++-- .../settings/model/SettingsExcludeItem.java | 3 +- .../model/structure/FolderStructureTag.java | 3 +- .../model/structure/MovieStructureTag.java | 3 +- .../model/structure/SerieStructureTag.java | 3 +- .../subtitleproviders/Local.java | 4 +- .../adapters/JPodnapisiAdapter.java | 4 +- .../adapters/JSubsceneAdapter.java | 2 +- .../addic7ed/LanguageId.java | 3 +- .../addic7ed/exception/Addic7edException.java | 3 +- .../model/Addic7edSubtitleDescriptor.java | 3 +- .../opensubtitles/DownloadSubtitle.java | 7 ++- .../opensubtitles/OpenSubtitlesApi.java | 2 +- .../opensubtitles/OpenSubtitlesExecuter.java | 3 +- .../opensubtitles/SearchSubtitles.java | 9 ++-- .../exception/OpenSubtitlesException.java | 3 +- .../model/OpenSubtitlesMovieDescriptor.java | 2 +- .../model/OpensubtitleSerieId.java | 3 +- .../exception/PodnapisiException.java | 3 +- .../model/PodnapisiSubtitleDescriptor.java | 3 +- .../subscene/SubsceneApi.java | 6 +-- .../subscene/exception/SubsceneException.java | 3 +- .../subscene/model/SubSceneSerieId.java | 3 +- .../model/SubsceneSubtitleDescriptor.java | 8 ++-- .../tvsubtitles/JTVSubtitlesApi.java | 2 +- .../exception/TvSubtitlesException.java | 3 +- .../workers/SearchManager.java | 11 ++--- .../subtitles/SubtitleFilteringTest.java | 5 +- 81 files changed, 182 insertions(+), 248 deletions(-) diff --git a/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java b/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java index 944e0f49..4d1e6e92 100644 --- a/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java +++ b/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java @@ -11,17 +11,17 @@ @Extension public class ContainerExt { - public static @Self Container addComponent(@This Container component, S child) { + public static @Self Container addComponent(@This Container component, S child) { component.add(child); return component; } - public static @Self Container addComponent(@This Container component, S child, Object constraints) { + public static @Self Container addComponent(@This Container component, S child, Object constraints) { component.add(child, constraints); return component; } - public static @Self Container addComponent(@This Container component, Object constraints, S child) { + public static @Self Container addComponent(@This Container component, Object constraints, S child) { component.add(child, constraints); return component; } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java index 28a2a02a..fc66ded3 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java @@ -19,7 +19,7 @@ public class AbstractButtonExt { return abstractButton; } - public static @Self AbstractButton withActionListener(@This AbstractButton abstractButton, Runnable listener) { + public static @Self AbstractButton withActionListener(@This AbstractButton abstractButton, Runnable listener) { withActionListener(abstractButton, arg -> listener.run()); return abstractButton; } @@ -39,7 +39,7 @@ public class AbstractButtonExt { return abstractButton; } - public static @Self AbstractButton withActionCommand(@This AbstractButton abstractButton, String actionCommand) { + public static @Self AbstractButton withActionCommand(@This AbstractButton abstractButton, String actionCommand) { abstractButton.getModel().setActionCommand(actionCommand); return abstractButton; } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java index e93b03a6..0c9ee756 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java @@ -13,22 +13,22 @@ @Extension public class JComponentExt { - public static @Self JComponent withEnabled(@This JComponent component, boolean enabled) { + public static @Self JComponent withEnabled(@This JComponent component, boolean enabled) { component.setEnabled(enabled); return component; } - public static @Self JComponent withEnabled(@This JComponent component) { + public static @Self JComponent withEnabled(@This JComponent component) { withEnabled(component, true); return component; } - public static @Self JComponent withDisabled(@This JComponent component) { + public static @Self JComponent withDisabled(@This JComponent component) { withEnabled(component, false); return component; } - public static @Self JComponent addTo(@This JComponent child, S parent) { + public static @Self JComponent addTo(@This JComponent child, S parent) { parent.add(child); return child; } @@ -39,7 +39,7 @@ public class JComponentExt { } public static void setEnabledRecursive(@This JComponent component, boolean enabled) { - ComponentExt.setRecursive(component, c -> c.setEnabled(enabled)); + ComponentExt.setRecursive(component, c -> c.setEnabled(enabled)); } public static @Self JComponent enabledRecursive(@This JComponent component, boolean enabled) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index eea8f111..900b5303 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -116,8 +116,8 @@ public void redraw() { private void checkUpdate(final boolean forceUpdateCheck) { UpdateAvailableGithub u = new UpdateAvailableGithub(manager, settings); Optional updateUrl = (forceUpdateCheck && u.isNewVersionAvailable()) - || (!forceUpdateCheck && u.shouldCheckForNewUpdate(settingsControl.getSettings().getUpdateCheckPeriod()) - && u.isNewVersionAvailable()) ? u.getLatestDownloadUrl() : Optional.empty(); + || (!forceUpdateCheck && u.shouldCheckForNewUpdate(settingsControl.getSettings().getUpdateCheckPeriod()) + && u.isNewVersionAvailable()) ? u.getLatestDownloadUrl() : Optional.empty(); if (updateUrl.isPresent()) { final JEditorPane editorPane = new JEditorPane(); editorPane.setPreferredSize(new Dimension(800, 50)); @@ -125,7 +125,7 @@ private void checkUpdate(final boolean forceUpdateCheck) { editorPane.setContentType("text/html"); editorPane.setText("" + Messages.getString("UpdateAppAvailable") + "!:
" + updateUrl.get() + ""); + + updateUrl.get() + ">" + updateUrl.get() + ""); editorPane.addHyperlinkListener(hyperlinkEvent -> { if (hyperlinkEvent.getEventType() == HyperlinkEvent.EventType.ACTIVATED && Desktop.isDesktopSupported()) { @@ -158,10 +158,10 @@ public void windowClosing(WindowEvent e) { setBounds(100, 100, 925, 680); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); final GridBagLayout gridBagLayout = new GridBagLayout(); - gridBagLayout.columnWidths = new int[] { 448, 0 }; - gridBagLayout.rowHeights = new int[] { 0, 125, 15, 0 }; - gridBagLayout.columnWeights = new double[] { 1.0, Double.MIN_VALUE }; - gridBagLayout.rowWeights = new double[] { 1.0, 1.0, 0.0, Double.MIN_VALUE }; + gridBagLayout.columnWidths = new int[]{ 448, 0 }; + gridBagLayout.rowHeights = new int[]{ 0, 125, 15, 0 }; + gridBagLayout.columnWeights = new double[]{ 1.0, Double.MIN_VALUE }; + gridBagLayout.rowWeights = new double[]{ 1.0, 1.0, 0.0, Double.MIN_VALUE }; getContentPane().setLayout(gridBagLayout); JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.TOP); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java index 4cb427ca..a6130fa3 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java @@ -11,6 +11,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import lombok.RequiredArgsConstructor; import org.jsoup.nodes.Element; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.multisubdownloader.settings.model.UpdateCheckPeriod; @@ -22,8 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.RequiredArgsConstructor; - @RequiredArgsConstructor public class UpdateAvailableGithub { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerGUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerGUI.java index e590e366..7f2a8633 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerGUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerGUI.java @@ -1,18 +1,17 @@ package org.lodder.subtools.multisubdownloader; +import javax.swing.*; import java.util.List; -import javax.swing.JFrame; - +import lombok.Getter; import org.lodder.subtools.multisubdownloader.gui.dialog.SelectDialog; import org.lodder.subtools.sublibrary.data.UserInteractionSettingsIntf; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; -import lombok.Getter; - @Getter -public class UserInteractionHandlerGUI extends org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandlerGUI implements UserInteractionHandler { +public class UserInteractionHandlerGUI extends org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandlerGUI + implements UserInteractionHandler { public UserInteractionHandlerGUI(UserInteractionSettingsIntf settings, JFrame frame) { super(settings, frame); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java index 88f1ab13..d82677cb 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java @@ -25,7 +25,7 @@ public class FileListAction { private static final Logger LOGGER = LoggerFactory.getLogger(FileListAction.class); - private static final String SUBTITLE_EXTENSION = "srt"; + private static final String SUBTITLE_EXTENSION = "srt"; private final Settings settings; private IndexingProgressListener indexingProgressListener; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java index a287bf09..67c84a40 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java @@ -36,7 +36,7 @@ public void rename(Path f, Release release) { }; LOGGER.trace("rename: filename [{}]", filename); - + Path newDir = switch (librarySettings.getLibraryAction()) { case MOVE, MOVEANDRENAME -> PathLibraryBuilder.fromSettings(librarySettings, manager, userInteractionHandler).build(release); case RENAME, NOTHING -> release.getPath(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java index bef4d731..a317384e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java @@ -2,6 +2,10 @@ import java.util.List; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.exceptions.SearchSetupException; @@ -19,11 +23,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - @RequiredArgsConstructor @Getter(value = AccessLevel.PROTECTED) public abstract class SearchAction implements Runnable, Cancelable, SearchHandler { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java index 46d89289..f40f397c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java @@ -2,6 +2,7 @@ import java.util.List; +import lombok.RequiredArgsConstructor; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.sorting.SubtitleComparator; import org.lodder.subtools.multisubdownloader.settings.model.Settings; @@ -11,8 +12,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.RequiredArgsConstructor; - @RequiredArgsConstructor public class UserInteractionHandlerAction { @@ -51,7 +50,7 @@ public List subtitleSelection(Release release, final boolean subtitleS if (settings.isOptionsAlwaysConfirm()) { return userInteractionHandler.selectSubtitles(release); } else if (release.getMatchingSubs().size() == 1 - && release.getMatchingSubs().get(0).getSubtitleMatchType() == SubtitleMatchType.EXACT) { + && release.getMatchingSubs().get(0).getSubtitleMatchType() == SubtitleMatchType.EXACT) { LOGGER.debug("determineWhatSubtitleDownload: Exact Match"); return List.of(release.getMatchingSubs().get(0)); } else if (release.getMatchingSubs().size() > 1) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java index 6af9c91b..8e8f5b6d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java @@ -1,9 +1,8 @@ package org.lodder.subtools.multisubdownloader.cli; -import org.lodder.subtools.multisubdownloader.Messages; - import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.multisubdownloader.Messages; @Getter @RequiredArgsConstructor diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java index 31fe7005..43332ce4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java @@ -32,12 +32,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@ExtensionMethod({ Files.class}) +@ExtensionMethod({ Files.class }) @Setter public class CliSearchAction extends SearchAction { private static final Logger LOGGER = LoggerFactory.getLogger(CliSearchAction.class); - + private final @NonNull CLI cli; private final @NonNull FileListAction fileListAction; @Getter diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java index 13a2c0f7..4d406e3c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java @@ -1,13 +1,12 @@ package org.lodder.subtools.multisubdownloader.cli.progress; +import dnl.utils.text.table.TextTable; import org.lodder.subtools.multisubdownloader.actions.ActionException; import org.lodder.subtools.multisubdownloader.gui.dialog.progress.search.SearchProgressTableModel; import org.lodder.subtools.multisubdownloader.listeners.SearchProgressListener; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.sublibrary.model.Release; -import dnl.utils.text.table.TextTable; - public class CLISearchProgress extends CLIProgress implements SearchProgressListener { private final TextTable table; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/exceptions/SearchSetupException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/exceptions/SearchSetupException.java index c96f28eb..6d9c2344 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/exceptions/SearchSetupException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/exceptions/SearchSetupException.java @@ -2,9 +2,8 @@ import java.io.Serial; -import org.lodder.subtools.multisubdownloader.actions.ActionException; - import lombok.experimental.StandardException; +import org.lodder.subtools.multisubdownloader.actions.ActionException; @StandardException public class SearchSetupException extends ActionException { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/Bootstrapper.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/Bootstrapper.java index a5656e57..b649d364 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/Bootstrapper.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/Bootstrapper.java @@ -47,7 +47,7 @@ public void initialize(UserInteractionHandler userInteractionHandler) { this.registerProviders(providers, userInteractionHandler); } - @SuppressWarnings({"rawtypes", "unchecked"}) + @SuppressWarnings({ "rawtypes", "unchecked" }) public List getProviders() { Reflections reflections = new Reflections("org.lodder.subtools.multisubdownloader"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java index 3c40969b..9abc7830 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java @@ -2,6 +2,9 @@ import java.util.List; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NonNull; import org.lodder.subtools.multisubdownloader.GUI; import org.lodder.subtools.multisubdownloader.UserInteractionHandlerGUI; import org.lodder.subtools.multisubdownloader.actions.SearchAction; @@ -19,10 +22,6 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NonNull; - @Getter(value = AccessLevel.PROTECTED) public abstract class GuiSearchAction

extends SearchAction { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index fee21844..4cde04e2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -161,7 +161,7 @@ private static class MappingTableModel extends DefaultTableModel { private final Manager manager; void setMappingType(MappingType mappingType) { - setDataVector(null, new String[] { mappingType.getNameColumn(), mappingType.getMappingColumn(), mappingType.getProviderNameColumn() }); + setDataVector(null, new String[]{ mappingType.getNameColumn(), mappingType.getMappingColumn(), mappingType.getProviderNameColumn() }); Arrays.stream(mappingType.getSelectionForKeyPrefixList()) .flatMap(selectionForKeyPrefix -> MappingType.MAPPING_SUPPLIER.apply(manager, selectionForKeyPrefix).stream() .map(serieMappingPair -> { @@ -193,10 +193,10 @@ private void initialize() { contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); GridBagLayout gbl_contentPanel = new GridBagLayout(); - gbl_contentPanel.columnWidths = new int[] { 0, 0 }; - gbl_contentPanel.rowHeights = new int[] { 0, 40, 0 }; - gbl_contentPanel.columnWeights = new double[] { 1.0, Double.MIN_VALUE }; - gbl_contentPanel.rowWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE }; + gbl_contentPanel.columnWidths = new int[]{ 0, 0 }; + gbl_contentPanel.rowHeights = new int[]{ 0, 40, 0 }; + gbl_contentPanel.columnWeights = new double[]{ 1.0, Double.MIN_VALUE }; + gbl_contentPanel.rowWeights = new double[]{ 0.0, 1.0, Double.MIN_VALUE }; contentPanel.setLayout(gbl_contentPanel); { JPanel selectionPane = new JPanel(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MultiSubDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MultiSubDialog.java index 93057c77..5c963352 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MultiSubDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MultiSubDialog.java @@ -1,10 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.dialog; -import javax.swing.JDialog; -import javax.swing.JFrame; - -import java.awt.Frame; -import java.awt.Rectangle; +import javax.swing.*; +import java.awt.*; import java.io.Serial; public class MultiSubDialog extends JDialog { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java index 7d12010b..004fdf39 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java @@ -98,10 +98,10 @@ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eve private void testAndSaveValues() { if (pnlGeneral.hasValidSettings() && - pnlEpisodeLibrary.hasValidSettings() && - pnlMovieLibrary.hasValidSettings() && - pnlOptions.hasValidSettings() && - pnlSerieSources.hasValidSettings()) { + pnlEpisodeLibrary.hasValidSettings() && + pnlMovieLibrary.hasValidSettings() && + pnlOptions.hasValidSettings() && + pnlSerieSources.hasValidSettings()) { pnlGeneral.savePreferenceSettings(); pnlEpisodeLibrary.savePreferenceSettings(); pnlMovieLibrary.savePreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java index 49621e54..9b0d1d2a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java @@ -44,7 +44,7 @@ private void initialize() { getContentPane().setLayout(new MigLayout("", "[1000px:n,grow,fill]", "[][::100px,fill][grow]")); JLabel lblNewLabel = new JLabel(Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease") - + release.getFileName()); + + release.getFileName()); getContentPane().add(lblNewLabel, "cell 0 0"); { JScrollPane scrollPane = new JScrollPane(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java index 6df020aa..cf6901a4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java @@ -1,10 +1,11 @@ package org.lodder.subtools.multisubdownloader.gui.dialog.progress.search; -import javax.swing.JButton; -import javax.swing.JProgressBar; -import javax.swing.JScrollPane; -import javax.swing.JTable; +import javax.swing.*; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.Serial; +import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.GUI; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.actions.ActionException; @@ -14,12 +15,6 @@ import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.sublibrary.model.Release; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.Serial; - -import net.miginfocom.swing.MigLayout; - public class SearchProgressDialog extends MultiSubDialog implements SearchProgressListener { @Serial diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java index 63a5ab1a..ed69d113 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java @@ -19,7 +19,7 @@ public SearchProgressTableModel() { this.setColumnIdentifiers(new String[]{ Messages.getString("SearchProgressTableModel.Source"), Messages.getString("SearchProgressTableModel.Queue"), - Messages.getString("SearchProgressTableModel.Release")}); + Messages.getString("SearchProgressTableModel.Release") }); } public void update(String source, int queue, String release) { @@ -42,7 +42,7 @@ private void updateRow(int rowNr, int queue, String release) { private void createRow(String source, int queue, String release) { this.rowMap.put(source, this.getRowCount()); - Object[] row = {source, queue, release}; + Object[] row = { source, queue, release }; this.addRow(row); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java index 2f5309b2..c575038d 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java @@ -128,7 +128,7 @@ private static ImageIcon getImageIcon(Image image) { } private static ImageIcon resizeIcon(ImageIcon icon, int width, int height) { - return new ImageIcon( icon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH)); + return new ImageIcon(icon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH)); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/LogTextAppender.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/LogTextAppender.java index fcb428d8..71e6bf63 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/LogTextAppender.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/LogTextAppender.java @@ -1,20 +1,17 @@ package org.lodder.subtools.multisubdownloader.gui.extra; +import javax.swing.*; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; - -import org.slf4j.LoggerFactory; - import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; import ch.qos.logback.core.encoder.EchoEncoder; import ch.qos.logback.core.encoder.Encoder; +import org.slf4j.LoggerFactory; public class LogTextAppender extends AppenderBase { private final Encoder encoder = new EchoEncoder<>(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java index 0cdc54f9..5194e27e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java @@ -1,18 +1,10 @@ package org.lodder.subtools.multisubdownloader.gui.extra; -import java.io.Serial; - -import javax.swing.JCheckBox; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JSeparator; -import javax.swing.SwingConstants; - -import java.awt.Component; -import java.awt.Container; -import java.awt.LayoutManager; +import javax.swing.*; +import java.awt.*; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; +import java.io.Serial; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java index 10bcfa4d..8257d92e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java @@ -10,7 +10,6 @@ import java.util.stream.IntStream; /** - * * @author author */ public class PartialDisableComboBox extends JComboBox { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PopupListener.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PopupListener.java index 2e3174e6..4f96a4e1 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PopupListener.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PopupListener.java @@ -24,8 +24,8 @@ public void mouseReleased(MouseEvent e) { private synchronized void showPopup(MouseEvent e) { if (e.isPopupTrigger() - && e.getComponent() instanceof CustomTable customTable - && customTable.getModel().getRowCount() > 0) { + && e.getComponent() instanceof CustomTable customTable + && customTable.getModel().getRowCount() > 0) { popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusLabel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusLabel.java index 03ab0cca..cee0d2b1 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusLabel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusLabel.java @@ -1,6 +1,6 @@ package org.lodder.subtools.multisubdownloader.gui.extra.progress; -import javax.swing.JLabel; +import javax.swing.*; import java.io.Serial; public class StatusLabel extends JLabel implements Messenger { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusMessenger.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusMessenger.java index 769aa2f6..d4aeffa0 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusMessenger.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusMessenger.java @@ -23,7 +23,7 @@ public void removeListener(Messenger sm) { @Override public void message(String message) { synchronized (statusMessengers) { - statusMessengers.forEach(sm -> sm.message(message)); + statusMessengers.forEach(sm -> sm.message(message)); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java index f2c6df3c..22fa8850 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java @@ -33,7 +33,7 @@ public void setColumnVisibility(SearchColumnName searchColumnName, boolean visib public void hideColumn(SearchColumnName searchColumnName) { int columnId = getColumnIdByName(searchColumnName); if (columnId > -1) { - columnSettings.put(searchColumnName, new int[] { + columnSettings.put(searchColumnName, new int[]{ getColumnModel().getColumn(columnId).getMaxWidth(), getColumnModel().getColumn(columnId).getMinWidth(), getColumnModel().getColumn(columnId).getPreferredWidth() }); @@ -63,7 +63,7 @@ public boolean isHideColumn(SearchColumnName searchColumnName) { int columnId = getColumnIdByName(searchColumnName); if (columnId > -1) { return getColumnModel().getColumn(columnId).getMinWidth() == 0 - && getColumnModel().getColumn(columnId).getPreferredWidth() == 0; + && getColumnModel().getColumn(columnId).getPreferredWidth() == 0; } return true; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java index 576603ba..2ea6019a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java @@ -6,10 +6,9 @@ import java.util.function.Function; import java.util.stream.Collectors; -import org.lodder.subtools.multisubdownloader.Messages; - import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.multisubdownloader.Messages; @RequiredArgsConstructor public enum SearchColumnName implements CustomColumnName { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java index d50b005f..c76a40d5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java @@ -3,11 +3,10 @@ import java.util.Arrays; import java.util.function.Function; -import org.lodder.subtools.multisubdownloader.Messages; -import org.lodder.subtools.sublibrary.model.Subtitle; - import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.multisubdownloader.Messages; +import org.lodder.subtools.sublibrary.model.Subtitle; @RequiredArgsConstructor public enum SubtitleTableColumnName implements CustomColumnName { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java index 3393ade4..4d4e74e4 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java @@ -47,7 +47,7 @@ public class VideoTableModel extends DefaultTableModel { private UserInteractionHandler userInteractionHandler; private VideoTableModel(List searchColumnNames) { - super(new Object[][] {}, searchColumnNames.stream().map(SearchColumnName::getColumnName).toArray(String[]::new)); + super(new Object[][]{}, searchColumnNames.stream().map(SearchColumnName::getColumnName).toArray(String[]::new)); this.columnTypes = searchColumnNames.stream().map(SearchColumnName::getC).toArray(Class[]::new); this.columnEditables = searchColumnNames.stream().map(SearchColumnName::isEditable).toArray(Boolean[]::new); } @@ -121,7 +121,7 @@ public Row(Release release, UserInteractionHandler userInteractionHandler) { private int calculateSubsFound() { return userInteractionHandler != null ? userInteractionHandler.getAutomaticSelection(release.getMatchingSubs()).size() - : release.getMatchingSubCount(); + : release.getMatchingSubCount(); } public int updateSubsFound() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/ZebraJTable.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/ZebraJTable.java index 89010570..d648c4ca 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/ZebraJTable.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/ZebraJTable.java @@ -1,6 +1,6 @@ package org.lodder.subtools.multisubdownloader.gui.extra.table; -import java.awt.Dimension; +import java.awt.*; import java.io.Serial; /** diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jpopupmenu/MyPopupMenu.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jpopupmenu/MyPopupMenu.java index f1e66ded..ed5a3f98 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jpopupmenu/MyPopupMenu.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jpopupmenu/MyPopupMenu.java @@ -1,9 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.jcomponent.jpopupmenu; -import javax.swing.JPopupMenu; - -import java.awt.Component; -import java.awt.Point; +import javax.swing.*; +import java.awt.*; import java.io.Serial; public class MyPopupMenu extends JPopupMenu { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java index ee532eb7..3cbdcc66 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java @@ -1,7 +1,6 @@ package org.lodder.subtools.multisubdownloader.gui.panels; -import javax.swing.JPanel; - +import javax.swing.*; import java.io.Serial; import lombok.Getter; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java index dc2ff08f..de1c02d8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java @@ -60,7 +60,7 @@ public ScrollTable(String header, Collection items) { } private ScrollTable(String header, Stream items) { - this.table = new JTable(new DefaultTableModel(new String[] { header }, 1)); + this.table = new JTable(new DefaultTableModel(new String[]{ header }, 1)); this.scrollPane = new JScrollPane().withViewPort(table); this.model = (DefaultTableModel) table.getModel(); model.removeRow(0); @@ -71,7 +71,7 @@ private ScrollTable(String header, Stream items) { } public void addItem(E item) { - model.addRow(new Object[] { item }); + model.addRow(new Object[]{ item }); } public int getSelectedRow() { @@ -132,7 +132,7 @@ public List getItems() { @Override public Component[] getComponents() { - return new Component[] { scrollPane, table }; + return new Component[]{ scrollPane, table }; } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index e80a9f47..1a1c7f4f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -206,8 +206,8 @@ private void updateBorder(Language lang) { public boolean hasValidSettings() { return languageComponentsMap.values().stream().allMatch(LanguageComponents::hasValidValue) - && languageComponentsMap.values().stream().map(LanguageComponents::getLanguage).distinct().count() == languageComponentsMap - .size(); + && languageComponentsMap.values().stream().map(LanguageComponents::getLanguage).distinct().count() == languageComponentsMap + .size(); } private Stream getLanguageComponentsForLanguageStream(Language language) { @@ -245,7 +245,7 @@ public boolean isEmpty() { public boolean hasValidSettings() { return !isVisible() - || (txtFileStructure.hasValidValue() - && (!chkIncludeLanguageCode.isSelected() || languageMapping.hasValidSettings())); + || (txtFileStructure.hasValidValue() + && (!chkIncludeLanguageCode.isSelected() || languageMapping.hasValidSettings())); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java index 2f734740..118e4eb7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java @@ -24,7 +24,7 @@ public abstract class StructurePanel> extends JPanel public StructurePanel() { this.btnBuildStructure = new JButton(Messages.getString("StructureBuilderDialog.Structure")); - this.cbxReplaceSpaceChar = new MyComboBox<>(new String[] { "-", ".", "_" }); + this.cbxReplaceSpaceChar = new MyComboBox<>(new String[]{ "-", ".", "_" }); this.chkReplaceSpace = new JCheckBox(Messages.getString("PreferenceDialog.ReplaceSpaceWith")) .addCheckedChangeListener(cbxReplaceSpaceChar::setEnabled); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java index b1b18e1d..eaf85052 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java @@ -3,7 +3,6 @@ import javax.swing.*; import java.io.Serial; -import lombok.experimental.ExtensionMethod; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java index 89a84073..588a4a06 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java @@ -1,14 +1,13 @@ package org.lodder.subtools.multisubdownloader.lib.control; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.exception.ReleaseControlException; import org.lodder.subtools.sublibrary.model.Release; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; - @Getter(value = AccessLevel.PROTECTED) @AllArgsConstructor public abstract class ReleaseControl { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java index abc9efd0..2043f837 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java @@ -23,8 +23,8 @@ public boolean useSubtitle(Subtitle subtitle, Release release) { public boolean excludeSubtitle(Subtitle subtitle, Release release) { return excludeSubtitleHearingImpaired(subtitle, release) - || excludeSubtitleKeywordMatch(subtitle, release) - || excludeSubtitleExactMatch(subtitle, release); + || excludeSubtitleKeywordMatch(subtitle, release) + || excludeSubtitleExactMatch(subtitle, release); } private boolean excludeSubtitleHearingImpaired(Subtitle subtitle, Release release) { @@ -33,7 +33,7 @@ private boolean excludeSubtitleHearingImpaired(Subtitle subtitle, Release releas private boolean excludeSubtitleKeywordMatch(Subtitle subtitle, Release release) { return settings.isOptionSubtitleKeywordMatch() && - (keyword.excludeSubtitle(release, subtitle) || releaseGroup.excludeSubtitle(release, subtitle)); + (keyword.excludeSubtitle(release, subtitle) || releaseGroup.excludeSubtitle(release, subtitle)); } private boolean excludeSubtitleExactMatch(Subtitle subtitle, Release release) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java index bce62a65..dc76727f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java @@ -18,12 +18,12 @@ public boolean useSubtitle(Release release, Subtitle subtitle) { if (subtitle.getQuality().isEmpty()) { subtitle.setQuality(ReleaseParser.getQualityKeyword(subtitle.getFileName())); } - if(!checkKeywordSubtitleMatch(subtitle, keywordsFile)){ + if (!checkKeywordSubtitleMatch(subtitle, keywordsFile)) { return false; } - LOGGER.debug("getSubtitlesFiltered: found KEYWORD match [{}] ", subtitle.getFileName()); - subtitle.setSubtitleMatchType(SubtitleMatchType.KEYWORD); - return true; + LOGGER.debug("getSubtitlesFiltered: found KEYWORD match [{}] ", subtitle.getFileName()); + subtitle.setSubtitleMatchType(SubtitleMatchType.KEYWORD); + return true; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java index 49918d0a..52f2cfc7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java @@ -17,7 +17,7 @@ public boolean useSubtitle(Release release, Subtitle subtitle) { if (subtitle.getReleaseGroup().isEmpty()) { subtitle.setReleaseGroup(ReleaseParser.extractReleasegroup(subtitle.getFileName(), subtitle.getFileName().endsWith(".srt"))); } - if(!StringUtils.containsAnyIgnoreCase(subtitle.getReleaseGroup(), release.getReleaseGroup(), subtitle.getReleaseGroup())){ + if (!StringUtils.containsAnyIgnoreCase(subtitle.getReleaseGroup(), release.getReleaseGroup(), subtitle.getReleaseGroup())) { return false; } LOGGER.debug("getSubtitlesFiltered: found KEYWORD based TEAM match [{}] ", subtitle.getFileName()); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java index b951626a..0c01e079 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java @@ -10,7 +10,7 @@ public abstract class SubtitleFilter { public abstract boolean useSubtitle(Release release, Subtitle subtitle); - public boolean excludeSubtitle(Release release, Subtitle subtitle){ + public boolean excludeSubtitle(Release release, Subtitle subtitle) { return !useSubtitle(release, subtitle); } @@ -28,29 +28,29 @@ private boolean keywordCheck(String videoFileName, String subFileName) { String subFileNameLower = subFileName.toLowerCase(); return containsBoth(videoFileNameLower, subFileNameLower, "dl", "720p", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "dl", "1080p", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "1080p", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "dl", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "720p") - || containsBoth(videoFileNameLower, subFileNameLower, "1080p", "bluray") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "bluray") - || containsBoth(videoFileNameLower, subFileNameLower, "x264", "bluray") - || containsBoth(videoFileNameLower, subFileNameLower, "x265", "bluray") - || containsBoth(videoFileNameLower, subFileNameLower, "xvid", "dvdrip") - || containsBoth(videoFileNameLower, subFileNameLower, "xvid", "hdtv") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "ts", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "bdrip", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "480p", "brrip", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "x264") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "x265") - || containsBoth(videoFileNameLower, subFileNameLower, "dvdscreener", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "r5", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "cam", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "x264") - || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "x265") - || containsBoth(videoFileNameLower, subFileNameLower, "dvdrip"); + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "web") + || containsBoth(videoFileNameLower, subFileNameLower, "dl", "1080p", "web") + || containsBoth(videoFileNameLower, subFileNameLower, "1080p", "web") + || containsBoth(videoFileNameLower, subFileNameLower, "dl", "web") + || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "720p") + || containsBoth(videoFileNameLower, subFileNameLower, "1080p", "bluray") + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "bluray") + || containsBoth(videoFileNameLower, subFileNameLower, "x264", "bluray") + || containsBoth(videoFileNameLower, subFileNameLower, "x265", "bluray") + || containsBoth(videoFileNameLower, subFileNameLower, "xvid", "dvdrip") + || containsBoth(videoFileNameLower, subFileNameLower, "xvid", "hdtv") + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "ts", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "bdrip", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "480p", "brrip", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "x264") + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "x265") + || containsBoth(videoFileNameLower, subFileNameLower, "dvdscreener", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "r5", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "cam", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "x264") + || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "x265") + || containsBoth(videoFileNameLower, subFileNameLower, "dvdrip"); } private boolean containsBoth(String string1, String string2, String... values) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index b8e9b650..9871eafa 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -3,6 +3,8 @@ import java.nio.file.Path; import java.util.Map; +import lombok.Setter; +import lombok.experimental.Accessors; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; import org.lodder.subtools.multisubdownloader.settings.model.structure.SerieStructureTag; @@ -14,9 +16,6 @@ import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import lombok.Setter; -import lombok.experimental.Accessors; - public class FilenameLibraryBuilder extends LibraryBuilder { private final String structure; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java index c4ac0dd2..7d2fb5ba 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java @@ -29,7 +29,7 @@ protected String replace(String structure, StructureTag tag, String value) { protected String replaceFormattedEpisodeNumber(String structure, StructureTag tag, List episodeNumbers, boolean leadingZero) { if (structure.contains(tag.getLabel())) { - String afterLabel =StringUtils.substringAfter(structure, tag.getLabel()); + String afterLabel = StringUtils.substringAfter(structure, tag.getLabel()); String separator = StringUtils.isNotEmpty(afterLabel) ? afterLabel.substring(0, 1) : ""; if ("%".equals(separator)) { separator = ""; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java index 8a8410a0..235ffcad 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java @@ -2,10 +2,9 @@ import java.util.Arrays; -import org.lodder.subtools.multisubdownloader.Messages; - import lombok.AccessLevel; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.multisubdownloader.Messages; @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public enum LibraryOtherFileActionType { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java index 0b800b3c..79d09418 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java @@ -3,6 +3,8 @@ import java.nio.file.Path; import java.nio.file.Paths; +import lombok.Setter; +import lombok.experimental.Accessors; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; import org.lodder.subtools.multisubdownloader.settings.model.structure.FolderStructureTag; import org.lodder.subtools.multisubdownloader.settings.model.structure.MovieStructureTag; @@ -14,9 +16,6 @@ import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import lombok.Setter; -import lombok.experimental.Accessors; - public class PathLibraryBuilder extends LibraryBuilder { private final String structure; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java index d64e1261..d6b8717b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java @@ -7,6 +7,7 @@ import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; import org.lodder.subtools.multisubdownloader.subtitleproviders.adapters.JPodnapisiAdapter; import org.lodder.subtools.sublibrary.Manager; + public class PodnapisiServiceProvider implements ServiceProvider { @Override public int getPriority() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java index 2bc324b0..e3e38231 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java @@ -15,6 +15,8 @@ import java.util.prefs.Preferences; import java.util.stream.IntStream; +import lombok.Getter; +import lombok.experimental.ExtensionMethod; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.lodder.subtools.multisubdownloader.gui.dialog.MappingEpisodeNameDialog.MappingType; @@ -34,15 +36,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - @ExtensionMethod({ Files.class }) public class SettingsControl { private static final Logger LOGGER = LoggerFactory.getLogger(SettingsControl.class); private static final String BACKING_STORE_AVAIL = "BackingStoreAvail"; - + private final Manager manager; private final Preferences preferences; @Getter @@ -352,7 +351,7 @@ public void migrateSettingsV6ToV7() { public void migrateSettingsV7ToV8() { if (settings.isLoginOpenSubtitlesEnabled() - && !OpenSubtitlesApi.isValidCredentials(settings.getLoginOpenSubtitlesUsername(), settings.getLoginOpenSubtitlesPassword())) { + && !OpenSubtitlesApi.isValidCredentials(settings.getLoginOpenSubtitlesUsername(), settings.getLoginOpenSubtitlesPassword())) { settings.setLoginOpenSubtitlesEnabled(false); LOGIN_OPEN_SUBTITLES_ENABLED.store(this, preferences); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java index c1301277..8b617c7b 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java @@ -5,13 +5,12 @@ import java.util.LinkedHashMap; import java.util.Map; -import org.lodder.subtools.multisubdownloader.lib.library.LibraryActionType; -import org.lodder.subtools.multisubdownloader.lib.library.LibraryOtherFileActionType; -import org.lodder.subtools.sublibrary.Language; - import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import org.lodder.subtools.multisubdownloader.lib.library.LibraryActionType; +import org.lodder.subtools.multisubdownloader.lib.library.LibraryOtherFileActionType; +import org.lodder.subtools.sublibrary.Language; @Getter @Setter diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathMatchType.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathMatchType.java index 7d587202..923c5b78 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathMatchType.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathMatchType.java @@ -1,7 +1,6 @@ package org.lodder.subtools.multisubdownloader.settings.model; -import java.awt.Image; -import java.awt.Toolkit; +import java.awt.*; import lombok.Getter; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java index c2f1e2fe..5ac23b01 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java @@ -2,7 +2,6 @@ import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -11,16 +10,14 @@ import java.util.Map; import java.util.Set; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.control.VideoPatterns; import org.lodder.subtools.sublibrary.data.UserInteractionSettingsIntf; import org.lodder.subtools.sublibrary.model.SubtitleSource; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; -import lombok.experimental.ExtensionMethod; - @Getter @Setter @Accessors(chain = true) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/SettingsExcludeItem.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/SettingsExcludeItem.java index ef44ad9b..e52f524a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/SettingsExcludeItem.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/SettingsExcludeItem.java @@ -4,9 +4,8 @@ import java.util.function.Predicate; import java.util.regex.Pattern; -import org.lodder.subtools.sublibrary.util.NamedPattern; - import lombok.Getter; +import org.lodder.subtools.sublibrary.util.NamedPattern; @Deprecated(since = "Settings version 6") @Getter diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java index f805a643..13673395 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java @@ -1,10 +1,9 @@ package org.lodder.subtools.multisubdownloader.settings.model.structure; -import org.lodder.subtools.multisubdownloader.Messages; - import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.multisubdownloader.Messages; @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java index b3c29d54..f00f0c7c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java @@ -1,10 +1,9 @@ package org.lodder.subtools.multisubdownloader.settings.model.structure; -import org.lodder.subtools.multisubdownloader.Messages; - import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.multisubdownloader.Messages; @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java index f092f23d..bcc697c9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java @@ -1,8 +1,7 @@ package org.lodder.subtools.multisubdownloader.settings.model.structure; -import org.lodder.subtools.multisubdownloader.Messages; - import lombok.Getter; +import org.lodder.subtools.multisubdownloader.Messages; @Getter public enum SerieStructureTag implements StructureTag { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index c1bb1891..282b7410 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -76,8 +76,8 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { try { Release release = vfp.parse(fileSub); if ((release.getVideoType() == VideoType.EPISODE) - && (((TvRelease) release).getSeason() == tvRelease.getSeason() && Utils.containsAll( - ((TvRelease) release).getEpisodeNumbers(), tvRelease.getEpisodeNumbers()))) { + && (((TvRelease) release).getSeason() == tvRelease.getSeason() && Utils.containsAll( + ((TvRelease) release).getEpisodeNumbers(), tvRelease.getEpisodeNumbers()))) { TvReleaseControl epCtrl = new TvReleaseControl((TvRelease) release, settings, manager, userInteractionHandler); epCtrl.process(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index ff220c2d..3c2419e4 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -7,6 +7,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.podnapisi.JPodnapisiApi; @@ -26,9 +27,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.Getter; -import lombok.experimental.ExtensionMethod; - @Getter public class JPodnapisiAdapter extends AbstractAdapter { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index 24ebe40a..7670cfe2 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -151,7 +151,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection getProviderSerieIds(String serieName) throws Op try { return manager.getPageContentBuilder() .url("https://www.opensubtitles.org/libs/suggest.php?format=json3&MovieName=" - + URLEncoder.encode(serieName.toLowerCase(), StandardCharsets.UTF_8)) + + URLEncoder.encode(serieName.toLowerCase(), StandardCharsets.UTF_8)) .userAgent("") .cacheType(CacheType.MEMORY) .retries(1) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesExecuter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesExecuter.java index 1889c005..20fcb6f9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesExecuter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesExecuter.java @@ -1,8 +1,7 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles; -import org.opensubtitles.invoker.ApiException; - import com.pivovarit.function.ThrowingSupplier; +import org.opensubtitles.invoker.ApiException; public abstract class OpenSubtitlesExecuter { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java index 50592fed..28f3ea52 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java @@ -1,5 +1,9 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.exception.OpenSubtitlesException; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param.AiTranslatedEnum; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param.ForeignPartsOnlyEnum; @@ -18,11 +22,6 @@ import org.opensubtitles.invoker.ApiClient; import org.opensubtitles.model.Subtitles200Response; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.experimental.Accessors; - @Accessors(fluent = true, chain = true) @Getter @Setter diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/exception/OpenSubtitlesException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/exception/OpenSubtitlesException.java index e863b27a..c330dd15 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/exception/OpenSubtitlesException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/exception/OpenSubtitlesException.java @@ -2,11 +2,10 @@ import java.io.Serial; +import lombok.experimental.StandardException; import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; import org.lodder.subtools.sublibrary.model.SubtitleSource; -import lombok.experimental.StandardException; - @StandardException public class OpenSubtitlesException extends SubtitlesProviderException { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java index 74602779..db4df717 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java @@ -26,7 +26,7 @@ public OpenSubtitlesMovieDescriptor(String name, int year, int imdbId) { @Override public boolean equals(Object object) { return object instanceof OpenSubtitlesMovieDescriptor other - && imdbId == other.imdbId && year == other.year && name.equals(other.name); + && imdbId == other.imdbId && year == other.year && name.equals(other.name); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpensubtitleSerieId.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpensubtitleSerieId.java index 123dcfac..3a5373da 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpensubtitleSerieId.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpensubtitleSerieId.java @@ -2,9 +2,8 @@ import java.io.Serial; -import org.lodder.subtools.sublibrary.data.ProviderSerieId; - import lombok.Getter; +import org.lodder.subtools.sublibrary.data.ProviderSerieId; @Getter public class OpensubtitleSerieId extends ProviderSerieId { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/exception/PodnapisiException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/exception/PodnapisiException.java index 97d96dd9..bb0fa8ee 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/exception/PodnapisiException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/exception/PodnapisiException.java @@ -2,11 +2,10 @@ import java.io.Serial; +import lombok.experimental.StandardException; import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; import org.lodder.subtools.sublibrary.model.SubtitleSource; -import lombok.experimental.StandardException; - @StandardException public class PodnapisiException extends SubtitlesProviderException { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/model/PodnapisiSubtitleDescriptor.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/model/PodnapisiSubtitleDescriptor.java index ada3e7c0..625b8350 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/model/PodnapisiSubtitleDescriptor.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/model/PodnapisiSubtitleDescriptor.java @@ -1,10 +1,9 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.podnapisi.model; -import org.lodder.subtools.sublibrary.Language; - import lombok.Builder; import lombok.Getter; import lombok.Setter; +import org.lodder.subtools.sublibrary.Language; /** * Created by IntelliJ IDEA. diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java index 7752fbfa..bd55f72b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java @@ -45,8 +45,8 @@ public class SubsceneApi extends Html implements SubtitleApi { private static final Predicate RETRY_PREDICATE = exception -> (exception instanceof HttpClientException httpClientException - && (httpClientException.getResponseCode() == 409 || httpClientException.getResponseCode() == 429)) - || (exception instanceof ManagerException managerException && managerException.getMessage().contains("409 Conflict")); + && (httpClientException.getResponseCode() == 409 || httpClientException.getResponseCode() == 429)) + || (exception instanceof ManagerException managerException && managerException.getMessage().contains("409 Conflict")); private int selectedLanguage; private boolean selectedIncludeHearingImpaired; @@ -104,7 +104,7 @@ public List getSubtitles(SerieMapping providerSerieI .setUploader(row.select(".a5 > a").text().trim()) .setComment(row.select(".a6 > div").text().trim())) .filter(subDescriptor -> subDescriptor.getSeasonEpisode() != null - && subDescriptor.getSeasonEpisode().getEpisodes().stream().anyMatch(ep -> ep == episode)) + && subDescriptor.getSeasonEpisode().getEpisodes().stream().anyMatch(ep -> ep == episode)) .toList(); } catch (Exception e) { throw new SubsceneException(e); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/exception/SubsceneException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/exception/SubsceneException.java index 4f3d97fd..6f43e96e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/exception/SubsceneException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/exception/SubsceneException.java @@ -2,11 +2,10 @@ import java.io.Serial; +import lombok.experimental.StandardException; import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; import org.lodder.subtools.sublibrary.model.SubtitleSource; -import lombok.experimental.StandardException; - @StandardException public class SubsceneException extends SubtitlesProviderException { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java index 7e0fc31c..e2eaadf1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java @@ -2,9 +2,8 @@ import java.io.Serial; -import org.lodder.subtools.sublibrary.data.ProviderSerieId; - import lombok.Getter; +import org.lodder.subtools.sublibrary.data.ProviderSerieId; @Getter public class SubSceneSerieId extends ProviderSerieId { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubsceneSubtitleDescriptor.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubsceneSubtitleDescriptor.java index a0026048..fe0ecaa6 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubsceneSubtitleDescriptor.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubsceneSubtitleDescriptor.java @@ -1,16 +1,14 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.subscene.model; -import org.lodder.subtools.multisubdownloader.subtitleproviders.subscene.exception.SubsceneException; -import org.lodder.subtools.sublibrary.Language; -import org.lodder.subtools.sublibrary.model.SeasonEpisode; - import com.pivovarit.function.ThrowingSupplier; - import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; +import org.lodder.subtools.multisubdownloader.subtitleproviders.subscene.exception.SubsceneException; +import org.lodder.subtools.sublibrary.Language; +import org.lodder.subtools.sublibrary.model.SeasonEpisode; @EqualsAndHashCode @Accessors(chain = true) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index a9aa92f5..c42a9c94 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -54,7 +54,7 @@ public Set getSubtitles(SerieMapping providerSeri .orElseGet(Set::of); } - private Set getSubtitles(String episodeUrl, Language language) throws TvSubtitlesException { + private Set getSubtitles(String episodeUrl, Language language) throws TvSubtitlesException { return getManager().valueBuilder() .memoryCache() .key("%s-subtitles-%s-%s".formatted(getSubtitleSource().name(), episodeUrl, language)) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/exception/TvSubtitlesException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/exception/TvSubtitlesException.java index 4cf4df61..b0d4b2f4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/exception/TvSubtitlesException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/exception/TvSubtitlesException.java @@ -2,11 +2,10 @@ import java.io.Serial; +import lombok.experimental.StandardException; import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; import org.lodder.subtools.sublibrary.model.SubtitleSource; -import lombok.experimental.StandardException; - @StandardException public class TvSubtitlesException extends SubtitlesProviderException { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java index d999a26a..0768a03d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java @@ -8,6 +8,11 @@ import java.util.Map.Entry; import java.util.Queue; +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.gui.dialog.Cancelable; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.sorting.ScoreCalculator; @@ -19,12 +24,6 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; -import lombok.Getter; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.experimental.Accessors; - @RequiredArgsConstructor public class SearchManager implements Cancelable { diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java index 8b9ddbd3..897e1a3f 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java @@ -1,8 +1,7 @@ package org.lodder.subtools.multisubdownloader.lib.control.subtitles; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.List; From b5bf73baa5a76e9da7a63041ea311eddbdfbf136 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 11:47:32 +0200 Subject: [PATCH 09/54] remove obsolete file --- .../gui/jcomponent/jtextfield/MyTextField.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextField.java diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextField.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextField.java deleted file mode 100644 index 95e92d95..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextField.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield; - -import java.io.Serial; - -public class MyTextField extends MyTextFieldCommon> { - - @Serial - private static final long serialVersionUID = 1580566911085697756L; - - private MyTextField() { - super(); - } - - public static MyTextFieldToStringMapperIntf> buildForType(Class type) { - return new MyTextField<>(); - } -} From 307c7a3e4ab93611c48b29a35857852c3f4c016a Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 11:50:36 +0200 Subject: [PATCH 10/54] formatting --- .../java/util/Optional/OptionalExtension.java | 2 + .../OptionalLong/OptionalLongExtension.java | 6 +- .../subtools/sublibrary/DetectLanguage.java | 9 +-- .../lodder/subtools/sublibrary/Manager.java | 13 ++- .../subtools/sublibrary/cache/Cache.java | 4 +- .../sublibrary/cache/TypedDiskCache.java | 3 +- .../sublibrary/control/ReleaseParser.java | 4 +- .../subtools/sublibrary/control/Roman.java | 2 +- .../sublibrary/control/VideoPatterns.java | 2 +- .../data/UserInteractionSettings.java | 3 +- .../sublibrary/data/imdb/ImdbAdapter.java | 6 +- .../sublibrary/data/imdb/ImdbApi.java | 3 +- .../sublibrary/data/omdb/OmdbAdapter.java | 5 +- .../sublibrary/data/omdb/OmdbApi.java | 3 +- .../data/omdb/model/OmdbDetails.java | 3 +- .../sublibrary/data/tvdb/TheTvdbAdapter.java | 3 +- .../sublibrary/data/tvdb/TheTvdbMirrors.java | 2 +- .../data/tvdb/model/TheTvdbEpisode.java | 3 +- .../data/tvdb/model/TheTvdbSerie.java | 3 +- .../subtools/sublibrary/gui/InputPane.java | 26 +++--- .../subtools/sublibrary/gui/OptionsPane.java | 6 +- .../sublibrary/model/MovieRelease.java | 3 +- .../subtools/sublibrary/model/Release.java | 3 +- .../subtools/sublibrary/model/Subtitle.java | 8 +- .../subtools/sublibrary/model/TvRelease.java | 7 +- .../settings/model/SerieMapping.java | 2 +- .../UserInteractionHandlerCLI.java | 5 +- .../sublibrary/util/CopyDirVisitor.java | 2 +- .../sublibrary/util/http/HttpClient.java | 2 +- .../sublibrary/util/lazy/LazyBiFunction.java | 3 +- .../sublibrary/util/lazy/LazyFunction.java | 5 +- .../sublibrary/util/lazy/LazyRunnable.java | 3 +- .../sublibrary/util/lazy/LazySupplier.java | 15 ++-- .../util/lazy/LazyThrowingBiFunction.java | 33 ++++---- .../util/lazy/LazyThrowingFunction.java | 33 ++++---- .../util/lazy/LazyThrowingRunnable.java | 39 +++++---- .../util/lazy/LazyThrowingSupplier.java | 79 +++++++++---------- .../util/prompter/PrompterBuilderBoolean.java | 3 +- .../util/prompter/PrompterBuilderInt.java | 3 +- .../util/prompter/PrompterBuilderValue.java | 3 +- .../PrompterBuilderValueFromList.java | 9 +-- .../PrompterBuilderValuesFromList.java | 9 +-- .../subtools/sublibrary/xml/StringUtils.java | 2 + .../subtools/sublibrary/xml/XMLHelper.java | 19 +++-- 44 files changed, 182 insertions(+), 219 deletions(-) diff --git a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java index 531936f7..2408fb62 100644 --- a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java +++ b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java @@ -190,10 +190,12 @@ public static Optional orElseMap(@This Optional o public static OptionalInt mapToInt(@This Optional optional, ThrowingToIntFunction mapper) throws X { return optional.isPresent() ? OptionalInt.of(mapper.applyAsInt(optional.get())) : OptionalInt.empty(); } + // public static OptionalInt mapToOptionalInt(@This Optional optional) { return optional.map(OptionalInt::of).orElseGet(OptionalInt::empty); } + // // // // diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java index 48585652..d1aa2461 100644 --- a/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java +++ b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java @@ -24,9 +24,9 @@ public class OptionalLongExtension { * @throws X exception type of the throwing Function */ public static OptionalLong map(@This OptionalLong optional, ThrowingUnaryOperator function) throws X { - if(optional.isPresent()){ + if (optional.isPresent()) { Long value = function.apply(optional.getAsLong()); - if(value != null){ + if (value != null) { return OptionalLong.of(value); } } @@ -44,7 +44,7 @@ public static OptionalLong map(@This OptionalLong optional * @return the result of the function wrapped in an @{link Optional} if the value is present, otherwise an empty {@code Optional} * @throws X exception type of the throwing Function */ - public static Optional mapToObj(@This OptionalLong optional, ThrowingFunction function) throws X { + public static Optional mapToObj(@This OptionalLong optional, ThrowingFunction function) throws X { return optional.isPresent() ? Optional.ofNullable(function.apply(optional.getAsLong())) : Optional.empty(); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/DetectLanguage.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/DetectLanguage.java index 7c781ccc..5cea36b7 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/DetectLanguage.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/DetectLanguage.java @@ -7,17 +7,16 @@ import java.nio.file.Path; import java.util.Optional; -import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; -import org.lodder.subtools.sublibrary.util.lazy.LazyThrowingSupplier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.optimaize.langdetect.LanguageDetector; import com.optimaize.langdetect.LanguageDetectorBuilder; import com.optimaize.langdetect.ngram.NgramExtractors; import com.optimaize.langdetect.profiles.LanguageProfileReader; import com.optimaize.langdetect.text.CommonTextObjectFactories; import com.optimaize.langdetect.text.TextObjectFactory; +import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; +import org.lodder.subtools.sublibrary.util.lazy.LazyThrowingSupplier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class DetectLanguage { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java index f74926e1..80efadf4 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java @@ -25,7 +25,6 @@ import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; -import lombok.experimental.ExtensionMethod; import name.falgout.jeffrey.throwing.Nothing; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -405,13 +404,13 @@ public interface ValueBuilderValueSupplierIntf { ValueBuilderGetValueStoreTempValueIntf valueSupplier(ThrowingSupplier valueSupplier); , S extends T, X extends Exception> ValueBuilderGetCollectionIntf - collectionSupplier(Class collectionValueType, ThrowingSupplier valueSupplier); + collectionSupplier(Class collectionValueType, ThrowingSupplier valueSupplier); ValueBuilderGetOptionalStoreTempValueIntf - optionalSupplier(ThrowingSupplier, X> valueSupplier); + optionalSupplier(ThrowingSupplier, X> valueSupplier); ValueBuilderGetOptionalIntStoreTempValueIntf - optionalIntSupplier(ThrowingSupplier optionalIntSupplier); + optionalIntSupplier(ThrowingSupplier optionalIntSupplier); } public interface ValueBuilderGetValueStoreTempValueIntf extends ValueBuilderGetValueIntf { @@ -561,7 +560,7 @@ public ValueBuilder returnType(Class returnType) @Override public , S extends T> ValueBuilderGetCollectionIntf - returnType(Class collectionReturnType, Class returnType) { + returnType(Class collectionReturnType, Class returnType) { this.returnType = (Class) returnType; return (ValueBuilder) this; } @@ -574,7 +573,7 @@ public ValueBuilder valueSupplier(Th @Override public ValueBuilder - optionalSupplier(ThrowingSupplier, E> valueSupplier) { + optionalSupplier(ThrowingSupplier, E> valueSupplier) { this.optionalSupplier = (ThrowingSupplier) valueSupplier; return (ValueBuilder) this; } @@ -587,7 +586,7 @@ public ValueBuilder optionalIntSupplier(Thr @Override public , S extends T, E extends Exception> ValueBuilder - collectionSupplier(Class collectionValueType, ThrowingSupplier collectionSupplier) { + collectionSupplier(Class collectionValueType, ThrowingSupplier collectionSupplier) { this.collectionSupplier = (ThrowingSupplier) collectionSupplier; return (ValueBuilder) this; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java index b1b15cd1..2742a419 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java @@ -9,12 +9,10 @@ import java.util.function.Predicate; import java.util.stream.Stream; -import org.apache.commons.lang3.tuple.Pair; - import com.pivovarit.function.ThrowingSupplier; - import lombok.AccessLevel; import lombok.Getter; +import org.apache.commons.lang3.tuple.Pair; @Getter(value = AccessLevel.PROTECTED) public abstract class Cache { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java index eac42aa5..1fe6735a 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java @@ -2,11 +2,10 @@ import java.util.function.Function; -import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; - import lombok.Setter; import lombok.experimental.Accessors; import net.jodah.typetools.TypeResolver; +import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; public class TypedDiskCache extends DiskCache { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java index 0ef935bd..178f18ba 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java @@ -43,8 +43,8 @@ private Release parsePatternResult(Path file, String fileParseName) throws Relea String seriesName = ""; List episodeNumbers = new ArrayList<>(); int seasonNumber = 0; - Integer year = namedGroups.contains("year") ? Integer.parseInt(namedMatcher.group("year")): null; - String description =namedGroups.contains("description") ? namedMatcher.group("description").substring(1): ""; + Integer year = namedGroups.contains("year") ? Integer.parseInt(namedMatcher.group("year")) : null; + String description = namedGroups.contains("description") ? namedMatcher.group("description").substring(1) : ""; if (namedGroups.contains("moviename")) { String movieName; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/Roman.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/Roman.java index b0f8e70a..f0697080 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/Roman.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/Roman.java @@ -1,7 +1,7 @@ package org.lodder.subtools.sublibrary.control; /** - * Source + * Source */ public class Roman { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java index bf337d46..6d974e08 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java @@ -55,7 +55,7 @@ public static Stream getValuesStream() { public enum AudioEncoding implements VideoPatternEnumIntf { DD5_1("dd5.1", "dd5-1"); - private final String[] values; + private final String[] values; AudioEncoding(String... values) { this.values = values; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettings.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettings.java index f68c0696..4a91aa32 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettings.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettings.java @@ -2,10 +2,9 @@ import java.util.List; -import org.lodder.subtools.sublibrary.control.VideoPatterns; - import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.sublibrary.control.VideoPatterns; @RequiredArgsConstructor @Getter diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java index b611cb32..ce16cd58 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java @@ -111,9 +111,9 @@ private OptionalInt getImdbIdCommon(String title, Integer year, return userInteractionHandler .selectFromList( providerSerieIds.stream().sorted(Comparator - .comparing((ProviderSerieId providerSerieId) -> providerSerieId.getName().replaceAll("[^A-Za-z]", "") - .equalsIgnoreCase(formattedTitle), Comparator.reverseOrder()) - .thenComparing(ProviderSerieId::getName)) + .comparing((ProviderSerieId providerSerieId) -> providerSerieId.getName().replaceAll("[^A-Za-z]", "") + .equalsIgnoreCase(formattedTitle), Comparator.reverseOrder()) + .thenComparing(ProviderSerieId::getName)) .toList(), Messages.getString("Prompter.SelectImdbMatchForSerie").formatted(title), getProviderName(), diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java index 694b80c1..868a9f3c 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java @@ -2,13 +2,12 @@ import java.util.Optional; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.imdb.exception.ImdbException; import org.lodder.subtools.sublibrary.data.imdb.model.ImdbDetails; -import lombok.RequiredArgsConstructor; - @RequiredArgsConstructor public class ImdbApi { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java index b2c3bd06..fa7bf596 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java @@ -2,6 +2,8 @@ import java.util.Optional; +import lombok.AccessLevel; +import lombok.Getter; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.data.omdb.model.OmdbDetails; @@ -11,9 +13,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.AccessLevel; -import lombok.Getter; - @Getter(value = AccessLevel.PROTECTED) public class OmdbAdapter { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java index f44ad5ce..91e1f35a 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java @@ -2,14 +2,13 @@ import java.util.Optional; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.omdb.exception.OmdbException; import org.lodder.subtools.sublibrary.data.omdb.model.OmdbDetails; import org.w3c.dom.Element; -import lombok.RequiredArgsConstructor; - @RequiredArgsConstructor class OmdbApi { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java index 90d97fcd..84eab735 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java @@ -3,10 +3,9 @@ import java.io.Serial; import java.io.Serializable; -import org.lodder.subtools.sublibrary.data.ReleaseDBIntf; - import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.lodder.subtools.sublibrary.data.ReleaseDBIntf; @Getter @RequiredArgsConstructor diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index 8c4e1db0..474e4718 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -12,7 +12,6 @@ import lombok.AccessLevel; import lombok.Getter; -import name.falgout.jeffrey.throwing.ThrowingLongFunction; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.Manager; @@ -97,7 +96,7 @@ public Optional getSerie(String serieName) { if (tvdbSerie.isEmpty()) { valueBuilder.optionalValue(tvdbSerie) .storeTempNullValue() - .timeToLive(valueBuilder.getTemporaryTimeToLive().map(v -> v * 2) + .timeToLive(valueBuilder.getTemporaryTimeToLive().map(v -> v * 2) .orElseGet(() -> TimeUnit.SECONDS.convert(1, TimeUnit.DAYS))) .storeAsTempValue(); } else { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java index a92dac69..449789e3 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java @@ -50,7 +50,7 @@ public TheTvdbMirrors(String apikey, Manager manager) throws ManagerException, P } public String getMirror(String type) { - return switch(type){ + return switch (type) { case TYPE_XML -> xmlList.isEmpty() ? null : xmlList.get(RNDM.nextInt(xmlList.size())); case TYPE_BANNER -> bannerList.isEmpty() ? null : bannerList.get(RNDM.nextInt(bannerList.size())); case TYPE_ZIP -> zipList.isEmpty() ? null : zipList.get(RNDM.nextInt(zipList.size())); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbEpisode.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbEpisode.java index 9deeaa23..6fd2d154 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbEpisode.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbEpisode.java @@ -5,11 +5,10 @@ import java.util.ArrayList; import java.util.List; -import org.lodder.subtools.sublibrary.Language; - import lombok.Getter; import lombok.Setter; import lombok.ToString; +import org.lodder.subtools.sublibrary.Language; @ToString @Getter diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbSerie.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbSerie.java index bd7c6f2e..d1fcec12 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbSerie.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbSerie.java @@ -5,11 +5,10 @@ import java.util.ArrayList; import java.util.List; -import org.lodder.subtools.sublibrary.Language; - import lombok.Getter; import lombok.Setter; import lombok.ToString; +import org.lodder.subtools.sublibrary.Language; @ToString @Getter diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java index 0c8cc37d..adf4f572 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java @@ -1,27 +1,21 @@ package org.lodder.subtools.sublibrary.gui; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.Serial; -import java.util.Optional; -import java.util.function.Predicate; - -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JTextField; - -import org.lodder.subtools.multisubdownloader.Messages; - +import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.Serial; +import java.util.Optional; +import java.util.function.Predicate; import lombok.Setter; import lombok.experimental.Accessors; +import org.lodder.subtools.multisubdownloader.Messages; public class InputPane { @@ -140,9 +134,9 @@ public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (isVisible() - && e.getSource() == optionPane - && (JOptionPane.VALUE_PROPERTY.equals(prop) - || JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) { + && e.getSource() == optionPane + && (JOptionPane.VALUE_PROPERTY.equals(prop) + || JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) { Object value = optionPane.getValue(); if (value == JOptionPane.UNINITIALIZED_VALUE) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/OptionsPane.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/OptionsPane.java index 446ec116..b3d7b831 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/OptionsPane.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/OptionsPane.java @@ -1,15 +1,13 @@ package org.lodder.subtools.sublibrary.gui; +import javax.swing.*; +import java.awt.*; import java.util.Arrays; import java.util.Collection; import java.util.Optional; import java.util.function.Function; import java.util.stream.Stream; -import javax.swing.JOptionPane; - -import java.awt.Component; - import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java index 5444682b..4c3c2636 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java @@ -3,11 +3,10 @@ import java.nio.file.Path; import java.util.OptionalInt; -import org.apache.commons.lang3.StringUtils; - import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import org.apache.commons.lang3.StringUtils; @Getter @Setter diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java index 1c5a6002..0dcec907 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java @@ -6,9 +6,8 @@ import java.util.List; import java.util.Set; -import org.apache.commons.lang3.StringUtils; - import lombok.Getter; +import org.apache.commons.lang3.StringUtils; @Getter public abstract class Release extends Video { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Subtitle.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Subtitle.java index 7717233a..02e27305 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Subtitle.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Subtitle.java @@ -2,17 +2,15 @@ import java.nio.file.Path; -import org.apache.commons.lang3.builder.EqualsExclude; -import org.lodder.subtools.sublibrary.Language; -import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; - import com.pivovarit.function.ThrowingSupplier; - import lombok.AccessLevel; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.builder.EqualsExclude; +import org.lodder.subtools.sublibrary.Language; +import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; @Setter @Getter diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java index 3c0e75ba..c176dc35 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java @@ -5,12 +5,11 @@ import java.util.List; import java.util.OptionalInt; -import org.apache.commons.lang3.StringUtils; -import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbEpisode; - import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import org.apache.commons.lang3.StringUtils; +import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbEpisode; @Getter @Setter @@ -141,7 +140,7 @@ public int getFirstEpisodeNumber() { @Override public String toString() { return this.getClass().getSimpleName() + ": " + this.getName() + " s" + this.getSeason() + " e" - + this.getEpisodeNumbers().toString() + " " + this.getQuality() + " " + this.getReleaseGroup(); + + this.getEpisodeNumbers().toString() + " " + this.getQuality() + " " + this.getReleaseGroup(); } @Override diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/settings/model/SerieMapping.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/settings/model/SerieMapping.java index 6f6d7682..4fe8b314 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/settings/model/SerieMapping.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/settings/model/SerieMapping.java @@ -53,7 +53,7 @@ public static String formatName(String name) { public boolean matches(String serieName) { String serieNameFormatted = formatName(serieName); return getFormattedName().contains(serieNameFormatted) - || (serieNameFormatted.contains(getFormattedName()) && getFormattedName().length() > 3); + || (serieNameFormatted.contains(getFormattedName()) && getFormattedName().length() > 3); } public boolean exactMatch(String serieName) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerCLI.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerCLI.java index 5419f24d..066e55fb 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerCLI.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerCLI.java @@ -5,6 +5,8 @@ import java.util.function.Function; import java.util.function.Predicate; +import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.codehaus.plexus.components.interactivity.DefaultPrompter; import org.codehaus.plexus.components.interactivity.Prompter; import org.lodder.subtools.sublibrary.data.UserInteractionSettingsIntf; @@ -12,9 +14,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - @Getter @RequiredArgsConstructor public class UserInteractionHandlerCLI implements UserInteractionHandler { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/CopyDirVisitor.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/CopyDirVisitor.java index fa0bea00..d0d7ee77 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/CopyDirVisitor.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/CopyDirVisitor.java @@ -21,7 +21,7 @@ public class CopyDirVisitor extends SimpleFileVisitor { private final StandardCopyOption[] copyOptions; public CopyDirVisitor(Path fromPath, Path toPath) { - this(fromPath, toPath, new StandardCopyOption[] { StandardCopyOption.REPLACE_EXISTING }); + this(fromPath, toPath, new StandardCopyOption[]{ StandardCopyOption.REPLACE_EXISTING }); } @Override diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java index c07f40ff..2530ff90 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java @@ -145,7 +145,7 @@ private InputStream getInputStream(URL url) throws Exception { if (status != HttpURLConnection.HTTP_OK) { if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM - || status == HttpURLConnection.HTTP_SEE_OTHER) { + || status == HttpURLConnection.HTTP_SEE_OTHER) { if (HttpClient.isUrl(conn.getHeaderField("Location"))) { url = new URI(conn.getHeaderField("Location")).toURL(); } else { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyBiFunction.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyBiFunction.java index fe55374b..54dfc9f6 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyBiFunction.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyBiFunction.java @@ -1,8 +1,7 @@ package org.lodder.subtools.sublibrary.util.lazy; -import org.lodder.subtools.sublibrary.util.Nothing; - import com.pivovarit.function.ThrowingBiFunction; +import org.lodder.subtools.sublibrary.util.Nothing; public class LazyBiFunction extends LazyThrowingBiFunction { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyFunction.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyFunction.java index 6b7a3551..29c99968 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyFunction.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyFunction.java @@ -1,13 +1,12 @@ package org.lodder.subtools.sublibrary.util.lazy; -import org.lodder.subtools.sublibrary.util.Nothing; - import com.pivovarit.function.ThrowingFunction; +import org.lodder.subtools.sublibrary.util.Nothing; public class LazyFunction extends LazyThrowingFunction { public LazyFunction(ThrowingFunction function) { super(function); - } + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyRunnable.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyRunnable.java index 0065d68e..f0304058 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyRunnable.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyRunnable.java @@ -1,8 +1,7 @@ package org.lodder.subtools.sublibrary.util.lazy; -import org.lodder.subtools.sublibrary.util.Nothing; - import com.pivovarit.function.ThrowingRunnable; +import org.lodder.subtools.sublibrary.util.Nothing; public class LazyRunnable extends LazyThrowingRunnable { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazySupplier.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazySupplier.java index 480e1c1c..eeb8d823 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazySupplier.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazySupplier.java @@ -1,16 +1,15 @@ package org.lodder.subtools.sublibrary.util.lazy; -import org.lodder.subtools.sublibrary.util.Nothing; - import com.pivovarit.function.ThrowingSupplier; +import org.lodder.subtools.sublibrary.util.Nothing; public class LazySupplier extends LazyThrowingSupplier { - public LazySupplier(ThrowingSupplier supplier) { - super(supplier); - } + public LazySupplier(ThrowingSupplier supplier) { + super(supplier); + } - public LazySupplier(T value) { - super(value); - } + public LazySupplier(T value) { + super(value); + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingBiFunction.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingBiFunction.java index 485b17fe..89f08038 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingBiFunction.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingBiFunction.java @@ -1,7 +1,6 @@ package org.lodder.subtools.sublibrary.util.lazy; import com.pivovarit.function.ThrowingBiFunction; - import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @@ -11,27 +10,27 @@ public class LazyThrowingBiFunction { private V object; - private final Object lock = new Object(); + private final Object lock = new Object(); - private volatile boolean initialized = false; + private volatile boolean initialized = false; public V apply(T arg1, S arg2) throws X { - if (!initialized) { - synchronized (lock) { - if (!initialized) { + if (!initialized) { + synchronized (lock) { + if (!initialized) { object = function.apply(arg1, arg2); - initialized = true; - } - } - } + initialized = true; + } + } + } return object; - } + } - public boolean isInitialized() { - return initialized; - } + public boolean isInitialized() { + return initialized; + } - public void reset() { - initialized = false; - } + public void reset() { + initialized = false; + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingFunction.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingFunction.java index 0910eb7e..80e38067 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingFunction.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingFunction.java @@ -1,7 +1,6 @@ package org.lodder.subtools.sublibrary.util.lazy; import com.pivovarit.function.ThrowingFunction; - import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @@ -11,27 +10,27 @@ public class LazyThrowingFunction { private S object; - private final Object lock = new Object(); + private final Object lock = new Object(); - private volatile boolean initialized = false; + private volatile boolean initialized = false; public S apply(T arg) throws X { - if (!initialized) { - synchronized (lock) { - if (!initialized) { + if (!initialized) { + synchronized (lock) { + if (!initialized) { object = function.apply(arg); - initialized = true; - } - } - } + initialized = true; + } + } + } return object; - } + } - public boolean isInitialized() { - return initialized; - } + public boolean isInitialized() { + return initialized; + } - public void reset() { - initialized = false; - } + public void reset() { + initialized = false; + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingRunnable.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingRunnable.java index be7fa9ca..8b3f4d2b 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingRunnable.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingRunnable.java @@ -1,34 +1,33 @@ package org.lodder.subtools.sublibrary.util.lazy; import com.pivovarit.function.ThrowingRunnable; - import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class LazyThrowingRunnable { - private final ThrowingRunnable runnable; + private final ThrowingRunnable runnable; - private final Object lock = new Object(); + private final Object lock = new Object(); - private volatile boolean initialized = false; + private volatile boolean initialized = false; public void run() throws X { - if (!initialized) { - synchronized (lock) { - if (!initialized) { + if (!initialized) { + synchronized (lock) { + if (!initialized) { runnable.run(); - initialized = true; - } - } - } - } - - public boolean isInitialized() { - return initialized; - } - - public void reset() { - initialized = false; - } + initialized = true; + } + } + } + } + + public boolean isInitialized() { + return initialized; + } + + public void reset() { + initialized = false; + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingSupplier.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingSupplier.java index 1feca2d8..a623e06f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingSupplier.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/lazy/LazyThrowingSupplier.java @@ -2,49 +2,48 @@ import com.pivovarit.function.ThrowingConsumer; import com.pivovarit.function.ThrowingSupplier; - import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class LazyThrowingSupplier { - private final ThrowingSupplier supplier; - - private T object; - - private final Object lock = new Object(); - - private volatile boolean initialized = false; - - public LazyThrowingSupplier(T value) { - supplier = null; - object = value; - initialized = true; - } - - public T get() throws X { - if (!initialized) { - synchronized (lock) { - if (!initialized) { - object = supplier.get(); - initialized = true; - } - } - } - return object; - } - - public boolean isInitialized() { - return initialized; - } - - public void doIfInitialized(ThrowingConsumer consumer) throws X { - if (initialized) { - consumer.accept(object); - } - } - - public void reset() { - initialized = false; - } + private final ThrowingSupplier supplier; + + private T object; + + private final Object lock = new Object(); + + private volatile boolean initialized = false; + + public LazyThrowingSupplier(T value) { + supplier = null; + object = value; + initialized = true; + } + + public T get() throws X { + if (!initialized) { + synchronized (lock) { + if (!initialized) { + object = supplier.get(); + initialized = true; + } + } + } + return object; + } + + public boolean isInitialized() { + return initialized; + } + + public void doIfInitialized(ThrowingConsumer consumer) throws X { + if (initialized) { + consumer.accept(object); + } + } + + public void reset() { + initialized = false; + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderBoolean.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderBoolean.java index 38d94fb9..e61e91aa 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderBoolean.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderBoolean.java @@ -3,10 +3,9 @@ import java.util.function.BooleanSupplier; import java.util.function.Predicate; -import org.codehaus.plexus.components.interactivity.Prompter; - import lombok.Setter; import lombok.experimental.Accessors; +import org.codehaus.plexus.components.interactivity.Prompter; public class PrompterBuilderBoolean { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderInt.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderInt.java index 9b0b99ab..aa09ee93 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderInt.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderInt.java @@ -5,10 +5,9 @@ import java.util.function.Predicate; import java.util.function.ToIntFunction; -import org.codehaus.plexus.components.interactivity.Prompter; - import lombok.Setter; import lombok.experimental.Accessors; +import org.codehaus.plexus.components.interactivity.Prompter; public class PrompterBuilderInt { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValue.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValue.java index 2c010eb0..8a6905cf 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValue.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValue.java @@ -5,10 +5,9 @@ import java.util.function.Predicate; import java.util.function.Supplier; -import org.codehaus.plexus.components.interactivity.Prompter; - import lombok.Setter; import lombok.experimental.Accessors; +import org.codehaus.plexus.components.interactivity.Prompter; public class PrompterBuilderValue { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java index 8665f883..12327fb3 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java @@ -10,13 +10,12 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import lombok.Setter; +import lombok.experimental.Accessors; import org.apache.commons.lang3.StringUtils; import org.codehaus.plexus.components.interactivity.Prompter; import org.codehaus.plexus.components.interactivity.PrompterException; -import lombok.Setter; -import lombok.experimental.Accessors; - public class PrompterBuilderValueFromList { private PrompterBuilderValueFromList() { @@ -116,8 +115,8 @@ public Optional prompt(Prompter prompter) { value = prompter.prompt(message); } else { String choicesMessage = IntStream.range(0, elements.size()) - .mapToObj(number -> " - " + (number + 1) + ": " + toStringMapper.apply(elements.get(number))) - .collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator(); + .mapToObj(number -> " - " + (number + 1) + ": " + toStringMapper.apply(elements.get(number))) + .collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator(); value = prompter.prompt(StringUtils.isBlank(message) ? choicesMessage : message + System.lineSeparator() + choicesMessage); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java index 3f189cc2..d86ba0fb 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java @@ -9,13 +9,12 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import lombok.Setter; +import lombok.experimental.Accessors; import org.apache.commons.lang3.StringUtils; import org.codehaus.plexus.components.interactivity.Prompter; import org.codehaus.plexus.components.interactivity.PrompterException; -import lombok.Setter; -import lombok.experimental.Accessors; - public class PrompterBuilderValuesFromList { private PrompterBuilderValuesFromList() { @@ -105,8 +104,8 @@ public List prompt(Prompter prompter) { value = prompter.prompt(message); } else { String choicesMessage = IntStream.range(0, elements.size()) - .mapToObj(number -> " - " + (number + 1) + ": " + toStringMapper.apply(elements.get(number))) - .collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator(); + .mapToObj(number -> " - " + (number + 1) + ": " + toStringMapper.apply(elements.get(number))) + .collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator(); value = prompter.prompt(StringUtils.isBlank(message) ? choicesMessage : message + System.lineSeparator() + choicesMessage); } if (StringUtils.isBlank(value) && includeNull) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/StringUtils.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/StringUtils.java index cd6c993d..770a3cfb 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/StringUtils.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/StringUtils.java @@ -2,6 +2,7 @@ import java.util.HashMap; + /** * Source */ @@ -10,6 +11,7 @@ private StringUtils() { } private static final HashMap htmlEntities; + static { htmlEntities = new HashMap<>(); htmlEntities.put("<", "<"); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java index 4673c7da..ec848daa 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java @@ -1,5 +1,13 @@ package org.lodder.subtools.sublibrary.xml; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; @@ -10,15 +18,6 @@ import java.nio.file.Path; import java.util.Optional; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - import org.lodder.subtools.sublibrary.util.http.HttpClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,7 +77,7 @@ public static boolean getBooleanAttributeValue(String sTag, String sAttribute, E LOGGER.trace("getBooleanAttributeValue: sTag [{}], sAttribute [{}]", sTag, sAttribute); NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); return ((Element) nlList).getAttribute(sAttribute) != null - && Boolean.parseBoolean(((Element) nlList).getAttribute(sAttribute)); + && Boolean.parseBoolean(((Element) nlList).getAttribute(sAttribute)); } public static String cleanBadChars(String string) { From 794910e0cb5fe20d56784bb9541dd9326dc0b6fb Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 20:31:29 +0200 Subject: [PATCH 11/54] changes --- MultiSubDownloader/pom.xml | 9 +++ .../subtools/multisubdownloader/App.java | 2 +- .../subtools/multisubdownloader/CLI.java | 2 +- .../gui/panels/preference/GeneralPanel.java | 4 +- .../lib/control/MovieReleaseControl.java | 2 +- .../lib/control/TvReleaseControl.java | 8 +-- .../subtitleproviders/adapters/Adapter.java | 4 +- .../adapters/JAddic7edAdapter.java | 4 +- .../adapters/JAddic7edViaProxyAdapter.java | 4 +- .../adapters/JOpenSubAdapter.java | 4 +- .../adapters/JPodnapisiAdapter.java | 2 +- .../adapters/JSubsceneAdapter.java | 8 +-- .../adapters/JTVsubtitlesAdapter.java | 6 +- .../addic7ed/JAddic7edApi.java | 14 ++-- .../gestdown/JAddic7edProxyGestdownApi.java | 2 +- .../subscene/SubsceneApi.java | 4 +- .../tvsubtitles/JTVSubtitlesApi.java | 6 +- SubLibrary/pom.xml | 14 ++++ .../subtools/multisubdownloader/Messages.java | 21 +++--- .../subtools/sublibrary/cache/Cache.java | 37 +++------- .../subtools/sublibrary/cache/DiskCache.java | 47 ++++++------- .../sublibrary/cache/ExpiringCacheObject.java | 18 ++--- .../ExpiringSerializableCacheObject.java | 4 -- .../sublibrary/cache/InMemoryCache.java | 14 ++-- .../subtools/sublibrary/cache/LRUMap.java | 10 +++ .../cache/SerializableDiskCache.java | 12 ++-- .../cache/TemporaryCacheObject.java | 14 ++-- .../TemporarySerializableCacheObject.java | 4 -- .../sublibrary/cache/TypedDiskCache.java | 33 ++++----- .../sublibrary/control/ReleaseParser.java | 4 +- .../subtools/sublibrary/control/Roman.java | 4 +- .../lodder/subtools/sublibrary/data/Html.java | 9 ++- .../sublibrary/data/ProviderSerieId.java | 11 ++- .../sublibrary/data/imdb/ImdbAdapter.java | 8 +-- .../sublibrary/data/imdb/ImdbApi.java | 5 +- .../sublibrary/data/imdb/ImdbSearchIdApi.java | 6 +- .../data/imdb/exception/ImdbException.java | 2 +- .../imdb/exception/ImdbSearchIdException.java | 2 +- .../sublibrary/data/omdb/OmdbAdapter.java | 9 +-- .../sublibrary/data/omdb/OmdbApi.java | 5 +- .../data/omdb/exception/OmdbException.java | 2 +- .../data/omdb/model/OmdbDetails.java | 11 ++- .../sublibrary/data/tvdb/TheTvdbAdapter.java | 20 +++--- .../sublibrary/data/tvdb/TheTvdbApi.java | 68 +++++++++---------- .../sublibrary/data/tvdb/TheTvdbMirrors.java | 21 +++--- .../data/tvdb/model/TheTvdbEpisode.java | 61 ++++++++--------- .../data/tvdb/model/TheTvdbSerie.java | 48 ++++++------- .../subtools/sublibrary/model/TvRelease.java | 5 +- pom.xml | 5 ++ 49 files changed, 304 insertions(+), 315 deletions(-) diff --git a/MultiSubDownloader/pom.xml b/MultiSubDownloader/pom.xml index b8cf15bf..f46fa57d 100644 --- a/MultiSubDownloader/pom.xml +++ b/MultiSubDownloader/pom.xml @@ -70,6 +70,10 @@ systems.manifold manifold-ext-rt + + systems.manifold + manifold-props-rt + org.projectlombok lombok @@ -132,6 +136,11 @@ manifold-ext ${manifold.version} + + systems.manifold + manifold-props + ${manifold.version} + diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java index f236e9ab..b2817d3a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java @@ -70,7 +70,7 @@ public static void main(String[] args) throws ReflectiveOperationException, Unsu final Container app = new Container(); final Manager manager = createManager(!line.hasCliOption(CliOption.NO_GUI)); prefCtrl = new SettingsControl(manager); - Messages.setLanguage(prefCtrl.getSettings().getLanguage()); + Messages.language = prefCtrl.getSettings().getLanguage(); Bootstrapper bootstrapper = new Bootstrapper(app, prefCtrl.getSettings(), preferences, manager); if (line.hasCliOption(CliOption.TRACE)) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 0b417aec..7bec6b5a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -76,7 +76,7 @@ public void setUp(CommandLine line) throws CliException { this.subtitleSelection = line.hasCliOption(CliOption.SELECTION); this.verboseProgress = line.hasCliOption(CliOption.VERBOSE_PROGRESS); this.dryRun = line.hasCliOption(CliOption.DRY_RUN); - Messages.setLanguage(language); + Messages.language = language; } public void run() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index 50177aab..7ef8601b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -153,8 +153,8 @@ public void loadPreferenceSettings() { } public void savePreferenceSettings() { - if (Messages.getLanguage() != cbxLanguage.getSelectedItem()) { - Messages.setLanguage(cbxLanguage.getSelectedItem()); + if (Messages.language != cbxLanguage.getSelectedItem()) { + Messages.language = cbxLanguage.getSelectedItem(); gui.redraw(); } List defaultIncomingFolders = defaultIncomingFoldersList.stream().map(LabelPanel::getObject).toList(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java index 86db91ed..8b557b02 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java @@ -45,7 +45,7 @@ public void process() throws ReleaseControlException { } movieDetails.ifPresentOrElse(info -> { movieRelease.setYear(info.year()); - movieRelease.setName(info.getName()); + movieRelease.setName(info.name); }, () -> LOGGER.error("Unable to get details from OMDB API, continue with filename info {}", movieRelease)); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index e637b816..d199f72a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -44,9 +44,9 @@ public void process() throws ReleaseControlException { private void processTvdb() throws ReleaseControlException { jtvdba.getSerie(tvRelease.getName()).ifPresentOrThrow(tvdbSerie -> { - tvRelease.setTvdbId(tvdbSerie.getId()); - tvRelease.setOriginalName(tvdbSerie.getSerieName()); - jtvdba.getEpisode(tvdbSerie.getId(), tvRelease.getSeason(), tvRelease.getEpisodeNumbers().get(0)) + tvRelease.setTvdbId(tvdbSerie.id); + tvRelease.setOriginalName(tvdbSerie.serieName); + jtvdba.getEpisode(tvdbSerie.id, tvRelease.getSeason(), tvRelease.getEpisodeNumbers().get(0)) .ifPresentOrThrow( tvRelease::updateTvdbEpisodeInfo, () -> new ReleaseControlException("Season %s Episode %s not found, check file".formatted(tvRelease.getSeason(), @@ -57,7 +57,7 @@ private void processTvdb() throws ReleaseControlException { private void processSpecial() throws ReleaseControlException { jtvdba.getSerie(tvRelease.getName()).ifPresentOrThrow(tvdbSerie -> { tvRelease.setTvdbId(tvdbSerie.getId()); - tvRelease.setOriginalName(tvdbSerie.getSerieName()); + tvRelease.setOriginalName(tvdbSerie.serieName); if (getSettings().getProcessEpisodeSource() == SettingsProcessEpisodeSource.TVDB) { jtvdba.getEpisode(tvdbSerie.getId(), tvRelease.getSeason(), tvRelease.getEpisodeNumbers().get(0)) .ifPresent(tvRelease::updateTvdbEpisodeInfo); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 7a65627b..9640f7c7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -180,7 +180,7 @@ default Optional getProviderSerieId(String serieName, String serie SerieMapping serieMapping; if (!getUserInteractionSettings().isOptionsConfirmProviderMapping() && providerSerieIds.size() == 1) { - serieMapping = new SerieMapping(serieName, providerSerieIds.get(0).getId(), providerSerieIds.get(0).getName(), seasonToUse); + serieMapping = new SerieMapping(serieName, providerSerieIds.get(0).id, providerSerieIds.get(0).name, seasonToUse); } else { ValueBuilderIsPresentIntf previousResultsValueBuilder = getManager().valueBuilder() .cacheType(CacheType.MEMORY) @@ -216,7 +216,7 @@ default Optional getProviderSerieId(String serieName, String serie return Optional.empty(); } // create a serieMapping for the selected value - serieMapping = new SerieMapping(serieName, uriForSerie.get().getId(), uriForSerie.get().getName(), seasonToUse); + serieMapping = new SerieMapping(serieName, uriForSerie.get().id, uriForSerie.get().name, seasonToUse); } if (tvdbIdOptional.isPresent()) { tvdbIdValueBuilder.get().value(serieMapping).store(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java index b4b32e44..f9eff738 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java @@ -125,7 +125,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws Addic7edException { return getApi().getProviderId(serieName).stream() - .sorted(Comparator.comparing(n -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.getName().replaceAll("[^A-Za-z]", "")))) + .sorted(Comparator.comparing(n -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", "")))) .toList(); } @@ -136,6 +136,6 @@ public boolean useSeasonForSerieId() { @Override public String providerSerieIdToDisplayString(ProviderSerieId providerSerieId) { - return providerSerieId.getName(); + return providerSerieId.name; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index dc9935ac..d3d2c14b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -122,7 +122,7 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona } return serieIds.stream() .sorted(Comparator - .comparing(n -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.getName().replaceAll("[^A-Za-z]", "")))) + .comparing(n -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", "")))) .toList(); } @@ -138,7 +138,7 @@ public boolean useSeasonForSerieId() { @Override public String providerSerieIdToDisplayString(ProviderSerieId providerSerieId) { - return providerSerieId.getName(); + return providerSerieId.name; } @Getter diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index b19afebb..1113f442 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -162,7 +162,7 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOpt throws OpenSubtitlesException { return getApi().getProviderSerieIds(serieName).stream() .sorted(Comparator.comparing( - (OpensubtitleSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.getName().replaceAll("[^A-Za-z]", ""))) + (OpensubtitleSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", ""))) .thenComparing(OpensubtitleSerieId::getYear, Comparator.reverseOrder())) .toList(); } @@ -174,6 +174,6 @@ public boolean useSeasonForSerieId() { @Override public String providerSerieIdToDisplayString(OpensubtitleSerieId providerSerieId) { - return "%s (%s)".formatted(providerSerieId.getName(), providerSerieId.getYear()); + return "${providerSerieId.name} (${providerSerieId.getYear()})"; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index 3c2419e4..373e656d 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -132,6 +132,6 @@ public boolean useSeasonForSerieId() { @Override public String providerSerieIdToDisplayString(ProviderSerieId providerSerieId) { - return providerSerieId.getName(); + return providerSerieId.name; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index 7670cfe2..ddff758f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -124,7 +124,7 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona .sorted(Comparator .comparing((SubSceneSerieId serieId) -> serieId.getSeason() == 0) .thenComparing(serieId -> { - Matcher matcher = yearPattern.matcher(serieId.getName()); + Matcher matcher = yearPattern.matcher(serieId.name); return matcher.find() ? Integer.parseInt(matcher.group()) : 0; }, Comparator.reverseOrder()) .thenComparing(SubSceneSerieId::getSeason, Comparator.reverseOrder())) @@ -161,11 +161,11 @@ public boolean useSeasonForSerieId() { @Override public String providerSerieIdToDisplayString(SubSceneSerieId providerSerieId) { - if (providerSerieId.getId().endsWith("-season")) { + if (providerSerieId.id.endsWith("-season")) { OptionalInt season = IntStream.rangeClosed(1, 100) - .filter(i -> providerSerieId.getId().endsWith("-%s-season".formatted(SubsceneApi.getOrdinalName(i).toLowerCase()))).findAny(); + .filter(i -> providerSerieId.id.endsWith("-${SubsceneApi.getOrdinalName(i).toLowerCase()}-season")).findAny(); if (season.isPresent()) { - return "%s (%s %s)".formatted(providerSerieId.getName(), Messages.getString("App.Season"), season.getAsInt()); + return "${providerSerieId.name} (${Messages.getString(\"App.Season\")} ${season.getAsInt()})"; } } return providerSerieId.getName(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java index 6baf0d37..7056f494 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java @@ -126,9 +126,9 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona Pattern yearPatter = Pattern.compile("\\((\\d\\d\\d\\d)-(\\d\\d\\d\\d)\\)"); return getApi().getUrisForSerieName(serieName).stream() .sorted(Comparator.comparing( - (ProviderSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.getName().replaceAll("[^A-Za-z]", ""))) + (ProviderSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", ""))) .thenComparing((ProviderSerieId providerSerieId) -> { - Matcher matcher = yearPatter.matcher(providerSerieId.getName()); + Matcher matcher = yearPatter.matcher(providerSerieId.name); if (matcher.find()) { return Integer.parseInt(matcher.group(2)); } @@ -144,6 +144,6 @@ public boolean useSeasonForSerieId() { @Override public String providerSerieIdToDisplayString(ProviderSerieId providerSerieId) { - return providerSerieId.getName(); + return providerSerieId.name; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java index 4565b0f1..1e50c281 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java @@ -52,7 +52,7 @@ public JAddic7edApi(String username, String password, boolean speedy, Manager ma public void login(String username, String password) throws Addic7edException { try { - getManager().postBuilder() + manager.postBuilder() .url(DOMAIN + "/dologin.php") .addData("username", username) .addData("password", password) @@ -75,7 +75,7 @@ public List getProviderId(String serieName) throws Addic7edExce String serieNameFormatted = serieName.replaceAll("[^A-Za-z]", ""); List providerSerieIdsFormatted = providerSerieIds.stream().filter(providerId -> { - String formattedSerieName = providerId.getName().replaceAll("[^A-Za-z]", ""); + String formattedSerieName = providerId.name.replaceAll("[^A-Za-z]", ""); return StringUtils.containsIgnoreCase(serieNameFormatted, formattedSerieName) || StringUtils.containsIgnoreCase(formattedSerieName, serieNameFormatted); }).toList(); @@ -98,7 +98,7 @@ public List getProviderId(String serieName) throws Addic7edExce public List getSubtitles(SerieMapping addic7edSerieMapping, int season, int episode, Language language) throws Addic7edException { - return getManager().valueBuilder() + return manager.valueBuilder() .memoryCache() .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), addic7edSerieMapping.getProviderId(), season, episode, language)) @@ -118,9 +118,9 @@ public List getSubtitles(SerieMapping addic7edSerieM String title = null; - Elements elTitel = doc.get().getElementsByClass("titulo"); - if (elTitel.size() == 1) { - Matcher matcher = TITLE_PATTERN.matcher(elTitel.get(0).html()); + Elements elTitle = doc.get().getElementsByClass("titulo"); + if (elTitle.size() == 1) { + Matcher matcher = TITLE_PATTERN.matcher(elTitle.get(0).html()); if (matcher.matches()) { title = matcher.group(1); } @@ -209,7 +209,7 @@ private Optional getContent(String url) throws Addic7edException { private Optional getContent(String url, Predicate emptyResultPredicate) throws Addic7edException { try { - if (!speedy && !getManager().valueBuilder().cacheType(CacheType.MEMORY).key(url).isPresent()) { + if (!speedy && !manager.valueBuilder().cacheType(CacheType.MEMORY).key(url).isPresent()) { // if (ChronoUnit.SECONDS.between(lastRequest, LocalDateTime.now()) < RATEDURATION) { // LOGGER.info("RateLimit is reached for ADDIC7ed, please wait {} seconds", RATEDURATION); // } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java index 1fad0e0b..5018139b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java @@ -48,7 +48,7 @@ public List getProviderSerieName(int tvdbId) throws ApiExceptio } public Set getSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) throws ApiException { - return getManager().valueBuilder() + return manager.valueBuilder() .memoryCache() .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.getProviderId(), season, episode, language)) .collectionSupplier(Subtitle.class, () -> { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java index bd55f72b..c8d103f0 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java @@ -89,7 +89,7 @@ public Map> getSubSceneSerieNames(String serieName public List getSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) throws SubsceneException { - return getManager().valueBuilder().memoryCache() + return manager.valueBuilder().memoryCache() .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().getName(), providerSerieId.getProviderId(), season, episode, language)) .collectionSupplier(SubsceneSubtitleDescriptor.class, () -> { setLanguageWithCookie(language); @@ -151,7 +151,7 @@ private void setIncludeHearingImpairedWithCookie(boolean includeHearingImpaired) } private void addCookie(String cookieName, String cookieValue) { - getManager().storeCookies("subscene.com", Map.of(cookieName, cookieValue)); + manager.storeCookies("subscene.com", Map.of(cookieName, cookieValue)); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index c42a9c94..044b88f3 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -35,7 +35,7 @@ public JTVSubtitlesApi(Manager manager) { public List getUrisForSerieName(String serieName) throws TvSubtitlesException { try { - return getManager().postBuilder() + return manager.postBuilder() .url(DOMAIN + "/search.php") .addData("qs", serieName) .postAsJsoupDocument() @@ -55,7 +55,7 @@ public Set getSubtitles(SerieMapping providerSeri } private Set getSubtitles(String episodeUrl, Language language) throws TvSubtitlesException { - return getManager().valueBuilder() + return manager.valueBuilder() .memoryCache() .key("%s-subtitles-%s-%s".formatted(getSubtitleSource().name(), episodeUrl, language)) .collectionSupplier(TVsubtitlesSubtitleDescriptor.class, () -> { @@ -117,7 +117,7 @@ private Set getSubtitles(String episodeUrl, Langu } private Optional getEpisodeUrl(String showUrl, int season, int episode) throws TvSubtitlesException { - return getManager().valueBuilder() + return manager.valueBuilder() .memoryCache() .key("%s-episodeUrl-%s-%s-%s".formatted(getSubtitleSource().name(), showUrl, season, episode)) .optionalSupplier(() -> { diff --git a/SubLibrary/pom.xml b/SubLibrary/pom.xml index 5e61274c..2a99679d 100644 --- a/SubLibrary/pom.xml +++ b/SubLibrary/pom.xml @@ -83,6 +83,10 @@ systems.manifold manifold-ext-rt + + systems.manifold + manifold-props-rt + org.projectlombok lombok @@ -138,6 +142,16 @@ manifold-ext ${manifold.version} + + systems.manifold + manifold-props + ${manifold.version} + + + systems.manifold + manifold-strings + ${manifold.version} + diff --git a/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java b/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java index 8ae5416d..d0f5892a 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java @@ -5,40 +5,37 @@ import java.util.MissingResourceException; import java.util.ResourceBundle; +import manifold.ext.props.rt.api.var; import org.lodder.subtools.sublibrary.Language; public class Messages { private static final String BUNDLE_NAME = "messages"; private static final Language DEFAULT_LANGUAGE = Language.ENGLISH; - private static Language LANGUAGE; - private static ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME, Locale.forLanguageTag(DEFAULT_LANGUAGE.getLangCode())); + private static ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, Locale.forLanguageTag(DEFAULT_LANGUAGE.getLangCode())); + static @var Language language; private Messages() { } public static String getString(String key) { try { - return RESOURCE_BUNDLE.getString(key); + return resourceBundle.getString(key); } catch (MissingResourceException e) { - return '!' + key + '!'; + return "!$key!"; } } public static String getString(String key, Object... replacements) { try { - return RESOURCE_BUNDLE.getString(key).formatted(replacements); + return resourceBundle.getString(key).formatted(replacements); } catch (MissingResourceException e) { - return '!' + key + '!'; + return "!$key!"; } } public static void setLanguage(Language language) { - LANGUAGE = language; - RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME, Locale.forLanguageTag(language.getLangCode())); - } - - public static Language getLanguage() { - return LANGUAGE; + Messages.language = language; + resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, Locale.forLanguageTag(language.getLangCode())); } public static List getAvailableLanguages() { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java index 2742a419..6a9f1d5f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java @@ -1,5 +1,7 @@ package org.lodder.subtools.sublibrary.cache; +import static manifold.ext.props.rt.api.PropOption.*; + import java.util.HashMap; import java.util.List; import java.util.Map; @@ -10,18 +12,14 @@ import java.util.stream.Stream; import com.pivovarit.function.ThrowingSupplier; -import lombok.AccessLevel; -import lombok.Getter; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.tuple.Pair; -@Getter(value = AccessLevel.PROTECTED) public abstract class Cache { - private final Map> cacheMap; - private final Integer maxItems; + @val(Protected) Map> cacheMap; protected Cache(Integer maxItems) { - this.maxItems = maxItems; this.cacheMap = maxItems != null ? new LRUMap<>(maxItems) : new HashMap<>(); } @@ -52,42 +50,29 @@ public Optional get(K key) { return Optional.empty(); } else { obj.updateLastAccessed(); - return Optional.ofNullable(obj.getValue()); + return Optional.ofNullable(obj.value); } } } public boolean isTemporaryObject(K key) { synchronized (cacheMap) { - CacheObject obj = cacheMap.get(key); - if (obj == null) { - return false; - } else { - return obj instanceof TemporaryCacheObject; - } + return cacheMap.get(key) instanceof TemporaryCacheObject; } } public boolean isTemporaryExpired(K key) { synchronized (cacheMap) { CacheObject obj = cacheMap.get(key); - if (obj == null) { - return false; - } else { - return obj instanceof TemporaryCacheObject tempCacheObject && tempCacheObject.isExpired(); - } + return obj instanceof TemporaryCacheObject tempCacheObject && tempCacheObject.isExpired(); } } public OptionalLong getTemporaryTimeToLive(K key) { synchronized (cacheMap) { CacheObject obj = cacheMap.get(key); - if (obj == null) { - return OptionalLong.empty(); - } else { - return obj instanceof TemporaryCacheObject tempCacheObject ? OptionalLong.of(tempCacheObject.getTimeToLive()) - : OptionalLong.empty(); - } + return obj instanceof TemporaryCacheObject tempCacheObject ? OptionalLong.of(tempCacheObject.timeToLive) + : OptionalLong.empty(); } } @@ -111,7 +96,7 @@ public V getOrPut(K key, ThrowingSupplier supplier) return null; } else { obj.updateLastAccessed(); - return obj.getValue(); + return obj.value; } } @@ -134,7 +119,7 @@ public List> getEntries() { public List> getEntries(Predicate keyFilter) { synchronized (cacheMap) { - return getEntryStream(keyFilter).map(entry -> Pair.of(entry.getKey(), entry.getValue().getValue())).toList(); + return getEntryStream(keyFilter).map(entry -> Pair.of(entry.getKey(), entry.getValue().value)).toList(); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java index adc84d00..0890406f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java @@ -21,6 +21,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.util.lazy.LazyBiFunction; import org.slf4j.Logger; @@ -29,20 +30,22 @@ public abstract class DiskCache extends Cache { private static final Logger LOGGER = LoggerFactory.getLogger(DiskCache.class); - public static final Object LOCK = new Object(); + private static final Object LOCK = new Object(); + private final Long timeToLiveSeconds; private final Set doublesToRemove = new HashSet<>(); private final Map> removedToAdd = new HashMap<>(); - + protected abstract @val Class dbKeyType; + protected abstract @val Class dbValueType; private final LazyBiFunction, String, Connection> connection = new LazyBiFunction<>((cache, tableName) -> { try { - synchronized (cache.getCacheMap()) { + synchronized (cache.cacheMap) { Path path = Path.of(System.getProperty("user.home")).resolve(".MultiSubDownloader"); if (!Files.exists(path)) { try { Files.createDirectory(path); } catch (IOException e) { - throw new RuntimeException("Could not create folder " + path, e); + throw new RuntimeException("Could not create folder $path", e); } } Class.forName("org.hsqldb.jdbcDriver"); @@ -50,24 +53,23 @@ public abstract class DiskCache extends Cache { "jdbc:hsqldb:file:" + path + "/diskcache.hsqldb;hsqldb.write_delay=false;shutdown=true", "user", "pass"); try (Statement stmt = connection.createStatement()) { - stmt.execute("create table IF NOT EXISTS %s (key %s, cacheobject %s);".formatted(tableName, - getDbKeyType() == String.class ? "VARCHAR(32768)" : "OBJECT", - getDbValueType() == String.class ? "VARCHAR(32768)" : "OBJECT")); + stmt.execute("create table IF NOT EXISTS $tableName (key %s, cacheobject %s);".formatted( + dbKeyType == String.class ? "VARCHAR(32768)" : "OBJECT", + dbValueType == String.class ? "VARCHAR(32768)" : "OBJECT")); } boolean errorWhileReadingCacheFile = false; try ( - Statement stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT key, cacheobject FROM %s;".formatted(tableName))) { - // Map> tempCache = new HashMap<>(); + Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT key, cacheobject FROM $tableName;")) { Multimap> tempCache = MultimapBuilder.hashKeys() .treeSetValues(Comparator.comparingLong((CacheObject value) -> value.getAge()).reversed()).build(); - synchronized (cache.getCacheMap()) { + synchronized (cache.cacheMap) { while (rs.next()) { try { tempCache.put(cache.diskObjectToKey(rs.getObject("key")), cache.diskCacheObjectToValue(rs.getObject("cacheobject"))); } catch (SQLException e2) { - LOGGER.error("Unable to insert object in disk cache. (%s)".formatted(e2.getMessage()), e2); + LOGGER.error("Unable to insert object in disk cache. (${e2.getMessage()})", e2); errorWhileReadingCacheFile = true; } } @@ -80,7 +82,7 @@ public abstract class DiskCache extends Cache { .forEach(entry -> put(entry.getKey(), entry.getValue().iterator().next())); } } catch (SQLException e) { - LOGGER.error("Unable while insert objects in disk cache!" + e.getMessage(), e); + LOGGER.error("Unable while insert objects in disk cache! (${e.getMessage()})", e); } if (errorWhileReadingCacheFile) { LOGGER.error("Deleting cache file to fix errors"); @@ -88,7 +90,7 @@ public abstract class DiskCache extends Cache { try { path.deletePath(); } catch (IOException e) { - LOGGER.error("Error while deleting the cache file, please delete it yourself: %s (%s)".formatted(path, e.getMessage()), e); + LOGGER.error("Error while deleting the cache file, please delete it yourself: $path (${e.getMessage()})", e); } connection = DriverManager.getConnection( "jdbc:hsqldb:file:" + path + "/diskcache.hsqldb;hsqldb.write_delay=false;shutdown=true", "user", "pass"); @@ -103,10 +105,6 @@ public abstract class DiskCache extends Cache { }); private final String tableName; - protected abstract Class getDbKeyType(); - - protected abstract Class getDbValueType(); - private Connection getConnection() { return connection.apply(this, tableName); } @@ -132,8 +130,8 @@ public void cleanup() { } public void cleanup(Predicate keyFilter) { - synchronized (getCacheMap()) { - Iterator>> itr = getCacheMap().entrySet().iterator(); + synchronized (cacheMap) { + Iterator>> itr = cacheMap.entrySet().iterator(); while (itr.hasNext()) { Entry> entry = itr.next(); if ((keyFilter == null || keyFilter.test(entry.getKey())) && entry.getValue().isExpired(timeToLiveSeconds * 1000)) { @@ -155,8 +153,7 @@ public void remove(K key) { private void removeFromDisk(K key) { synchronized (LOCK) { - try (PreparedStatement prep = getConnection().prepareStatement("delete from %s where key = ?".formatted(tableName))) { - // prep.clearParameters(); + try (PreparedStatement prep = getConnection().prepareStatement("delete from $tableName where key = ?")) { prep.setObject(1, keyToDiskObject(key)); prep.executeUpdate(); } catch (SQLException e) { @@ -191,11 +188,11 @@ public final void put(K key, V value, long timeToLive) { private void putFromMemoryCache(K key) { synchronized (LOCK) { - try (PreparedStatement prep = getConnection().prepareCall("INSERT INTO %s (key,cacheobject) VALUES (?,?)".formatted(tableName))) { + try (PreparedStatement prep = getConnection().prepareCall("INSERT INTO $tableName (key,cacheobject) VALUES (?,?)")) { prep.clearParameters(); prep.setObject(1, keyToDiskObject(key)); - synchronized (getCacheMap()) { - CacheObject cacheObject = getCacheMap().get(key); + synchronized (cacheMap) { + CacheObject cacheObject = cacheMap.get(key); prep.setObject(2, cacheObjectToDiskObject(cacheObject)); prep.execute(); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringCacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringCacheObject.java index 888e0254..3b54710e 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringCacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringCacheObject.java @@ -9,22 +9,22 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; import lombok.ToString; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; +import manifold.ext.props.rt.api.var; @ToString -@Setter -@Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) class ExpiringCacheObject implements CacheObject, Serializable { @Serial private static final long serialVersionUID = 3852086993086134232L; private static final Pattern PATTERN = Pattern.compile("created:(.*?)|lastAccessed:(.*?)|value:(.*)"); - private final long created; - private long lastAccessed = System.currentTimeMillis(); - private T value; + + @override @val long created; + @var long lastAccessed = System.currentTimeMillis(); + @override @var T value; protected ExpiringCacheObject(T value) { this.created = System.currentTimeMillis(); @@ -43,7 +43,7 @@ public boolean isExpired(long ttl) { @Override public String toString(Function valueToStringMapper) { - return "created:%s|lastAccessed:%s|value:%s".formatted(created, lastAccessed, valueToStringMapper.apply(value)); + return "created:$created|lastAccessed:$lastAccessed|value:${valueToStringMapper.apply(value)}"; } public static Optional> fromString(String string, Function valueToObjectMapper) { @@ -59,6 +59,6 @@ public static Optional> fromString(String string, Function extends ExpiringCacheObject implements Serializable { @Serial diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/InMemoryCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/InMemoryCache.java index 281d7b75..d387484d 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/InMemoryCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/InMemoryCache.java @@ -1,17 +1,17 @@ package org.lodder.subtools.sublibrary.cache; +import static manifold.ext.props.rt.api.PropOption.*; + import java.io.Serializable; import java.util.function.Predicate; -import lombok.AccessLevel; -import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.val; -@Getter(value = AccessLevel.PROTECTED) public class InMemoryCache extends Cache { - private final Long timeToLive; + @val(Protected) Long timeToLive; protected InMemoryCache(Long timeToLiveSeconds, Long timerIntervalSeconds, Integer maxItems) { super(maxItems); @@ -79,6 +79,7 @@ private void createCleanUpThread(long timerInterval) { try { Thread.sleep(timerInterval); } catch (InterruptedException ignored) { + //ignore } cleanup(); } @@ -93,9 +94,8 @@ public void cleanup() { } public void cleanup(Predicate keyFilter) { - synchronized (getCacheMap()) { - getCacheMap().entrySet() - .removeIf(entry -> (keyFilter == null || keyFilter.test(entry.getKey())) && entry.getValue().isExpired(timeToLive)); + synchronized (cacheMap) { + cacheMap.entrySet().removeIf(entry -> (keyFilter == null || keyFilter.test(entry.getKey())) && entry.getValue().isExpired(timeToLive)); Thread.yield(); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/LRUMap.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/LRUMap.java index 7cca550b..eede6031 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/LRUMap.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/LRUMap.java @@ -16,4 +16,14 @@ public class LRUMap extends LinkedHashMap { protected boolean removeEldestEntry(Map.Entry eldest) { return size() > maxItems; } + + @Override + public int hashCode() { + return maxItems + super.hashCode(); + } + + @Override + public boolean equals(Object o) { + return o instanceof LRUMap map && this.maxItems == map.maxItems && super.equals(map); + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/SerializableDiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/SerializableDiskCache.java index f0964b1b..bbd7bfc7 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/SerializableDiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/SerializableDiskCache.java @@ -1,18 +1,18 @@ package org.lodder.subtools.sublibrary.cache; +import static manifold.ext.props.rt.api.PropOption.*; + import java.io.Serializable; -import lombok.AccessLevel; -import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; public class SerializableDiskCache extends DiskCache { - @Getter(value = AccessLevel.PROTECTED) - private final Class dbKeyType; - @Getter(value = AccessLevel.PROTECTED) - private final Class dbValueType; + @override @val(Protected) Class dbKeyType; + @override @val(Protected) Class dbValueType; @SuppressWarnings("rawtypes") public static DiskCacheBuilderKeyTypeIntf cacheBuilder() { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporaryCacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporaryCacheObject.java index d022efb6..0e9481f8 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporaryCacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporaryCacheObject.java @@ -9,22 +9,20 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; import lombok.ToString; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; @ToString -@Setter -@Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) class TemporaryCacheObject implements CacheObject, Serializable { @Serial private static final long serialVersionUID = -152474119228350222L; private static final Pattern PATTERN = Pattern.compile("created:(.*?)|expire:(.*?)|value:(.*)"); - private final long created; - private final long timeToLive; - private T value; + @override @val long created; + @val long timeToLive; + @override @val T value; protected TemporaryCacheObject(long timeToLive, T value) { this.created = System.currentTimeMillis(); @@ -65,6 +63,6 @@ public static Optional> fromString(String string, Fu @Override public long getAge() { - return getCreated(); + return created; } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporarySerializableCacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporarySerializableCacheObject.java index 562c4b84..11a83374 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporarySerializableCacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporarySerializableCacheObject.java @@ -3,13 +3,9 @@ import java.io.Serial; import java.io.Serializable; -import lombok.Getter; -import lombok.Setter; import lombok.ToString; @ToString -@Setter -@Getter class TemporarySerializableCacheObject extends TemporaryCacheObject implements Serializable { @Serial diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java index 1fe6735a..a9fa3a07 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java @@ -2,10 +2,10 @@ import java.util.function.Function; +import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import net.jodah.typetools.TypeResolver; -import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; public class TypedDiskCache extends DiskCache { @@ -13,12 +13,20 @@ public class TypedDiskCache extends DiskCache { private final Function toObjectMapperKey; private final Function toStringMapperValue; private final Function toObjectMapperValue; - @SuppressWarnings("unchecked") - private final LazySupplier> keyType = - new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[0]); - @SuppressWarnings("unchecked") - private final LazySupplier> valueType = - new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[1]); +// @SuppressWarnings("unchecked") +// private final LazySupplier> keyType = +// new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[0]); +// @override @val(Protected) Class dbKeyType = keyType.get(); +// @SuppressWarnings("unchecked") +// private final LazySupplier> valueType = +// new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[1]); +// +// @override @val(Protected) Class dbValueType = valueType.get(); + + @Getter(lazy = true) @SuppressWarnings("unchecked") + private final Class dbKeyType = (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[0]; + @Getter(lazy = true) @SuppressWarnings("unchecked") + private final Class dbValueType = (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[1]; @SuppressWarnings("rawtypes") public static DiskCacheBuilderToStringMapperKeyIntf cacheBuilder() { @@ -123,15 +131,4 @@ protected Object keyToDiskObject(K key) { protected Object cacheObjectToDiskObject(CacheObject value) { return value.toString(toStringMapperValue); } - - @Override - protected Class getDbKeyType() { - return keyType.get(); - } - - @Override - protected Class getDbValueType() { - return valueType.get(); - } - } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java index 178f18ba..dec034c8 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java @@ -20,8 +20,8 @@ public class ReleaseParser { - private NamedMatcher namedMatcher; private static final Logger LOGGER = LoggerFactory.getLogger(ReleaseParser.class); + private NamedMatcher namedMatcher; public final Release parse(Path file) throws ReleaseParseException { String folderName = file.getParent() != null ? file.getParent().getFileName().toString() : ""; @@ -35,7 +35,7 @@ public final Release parse(Path file) throws ReleaseParseException { } } } - throw new ReleaseParseException("Unknown format, can't be parsed: " + file.toAbsolutePath()); + throw new ReleaseParseException("Unknown format, can't be parsed: ${file.toAbsolutePath()}"); } private Release parsePatternResult(Path file, String fileParseName) throws ReleaseParseException { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/Roman.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/Roman.java index f0697080..70d84279 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/Roman.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/Roman.java @@ -1,9 +1,11 @@ package org.lodder.subtools.sublibrary.control; +import lombok.experimental.UtilityClass; + /** * Source */ - +@UtilityClass public class Roman { private static int decodeSingle(char letter) { return switch (letter) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/Html.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/Html.java index c9d9a064..c5eadda7 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/Html.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/Html.java @@ -3,15 +3,14 @@ import java.util.Map; import java.util.concurrent.TimeUnit; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.Manager.PageContentBuilderCacheTypeIntf; -@RequiredArgsConstructor +@AllArgsConstructor public class Html { - @Getter - private final Manager manager; + @val Manager manager; private final String userAgent; public Html(Manager manager) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ProviderSerieId.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ProviderSerieId.java index e38445e1..cf1d0168 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ProviderSerieId.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ProviderSerieId.java @@ -3,17 +3,16 @@ import java.io.Serial; import java.io.Serializable; +import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor +@AllArgsConstructor @EqualsAndHashCode public class ProviderSerieId implements Serializable { @Serial private static final long serialVersionUID = -120703658294502220L; - private final String name; - private final String id; + @val String name; + @val String id; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java index ce16cd58..bce77edc 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java @@ -105,20 +105,20 @@ private OptionalInt getImdbIdCommon(String title, Integer year, } if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping() && providerSerieIds.size() == 1) { // found single exact match - return OptionalInt.of(Integer.parseInt(providerSerieIds.iterator().next().getId())); + return OptionalInt.of(Integer.parseInt(providerSerieIds.iterator().next().id)); } String formattedTitle = title.replaceAll("[^A-Za-z]", ""); return userInteractionHandler .selectFromList( providerSerieIds.stream().sorted(Comparator - .comparing((ProviderSerieId providerSerieId) -> providerSerieId.getName().replaceAll("[^A-Za-z]", "") + .comparing((ProviderSerieId providerSerieId) -> providerSerieId.name.replaceAll("[^A-Za-z]", "") .equalsIgnoreCase(formattedTitle), Comparator.reverseOrder()) .thenComparing(ProviderSerieId::getName)) .toList(), Messages.getString("Prompter.SelectImdbMatchForSerie").formatted(title), getProviderName(), ProviderSerieId::getName) - .mapToInt(providerSerieId -> Integer.parseInt(providerSerieId.getId())); + .mapToInt(providerSerieId -> Integer.parseInt(providerSerieId.id)); } private OptionalInt promptUserToEnterImdbId(String title, int year) { @@ -126,7 +126,7 @@ private OptionalInt promptUserToEnterImdbId(String title, int year) { Messages.getString("Prompter.ValueIsNotValid"), StringUtils::isNumeric).mapToInt(Integer::parseInt); } - public synchronized static ImdbAdapter getInstance(Manager manager, UserInteractionHandler userInteractionHandler) { + public static synchronized ImdbAdapter getInstance(Manager manager, UserInteractionHandler userInteractionHandler) { if (instance == null) { instance = new ImdbAdapter(manager, userInteractionHandler); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java index 868a9f3c..386b2c9a 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java @@ -3,7 +3,6 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.imdb.exception.ImdbException; import org.lodder.subtools.sublibrary.data.imdb.model.ImdbDetails; @@ -17,9 +16,9 @@ public class ImdbApi { public Optional getMovieDetails(int imdbId) throws ImdbException { return manager.valueBuilder() .memoryCache() - .key("%s-moviedetails-%s".formatted("IMDB", imdbId)) + .key("IMDB-moviedetails-$imdbId") .optionalSupplier(() -> { - final String url = "%s/title/tt%s/releaseinfo".formatted(DOMAIN, StringUtils.leftPad(String.valueOf(imdbId), 7, "0")); + final String url = "$DOMAIN/title/tt${String.format(\"%07d\", imdbId)}/releaseinfo"; try { org.jsoup.nodes.Element element = manager.getPageContentBuilder() .url(url) diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java index 2290ee40..53bb0e9d 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java @@ -24,7 +24,7 @@ record ImdbSearchIdApi(Manager manager) { public Set getImdbIdOnImdb(String title, Integer year) throws ImdbSearchIdException { return manager.valueBuilder() .memoryCache() - .key("%s-imdbid-imdb-%s-%s".formatted("IMDB", title, year)) + .key("IMDB-imdbid-imdb-$title-$year") .collectionSupplier(ProviderSerieId.class, () -> { StringBuilder sb = new StringBuilder("https://www.imdb.com/find?q="); @@ -49,7 +49,7 @@ public Set getImdbIdOnImdb(String title, Integer year) throws I public Set getImdbIdOnYahoo(String title, Integer year) throws ImdbSearchIdException { return manager.valueBuilder() .memoryCache() - .key("%s-imdbid-yahoo-%s-%s".formatted("IMDB", title, year)) + .key("IMDB-imdbid-yahoo-$title-$year") .collectionSupplier(ProviderSerieId.class, () -> { StringBuilder sb = new StringBuilder("http://search.yahoo.com/search;_ylt=A1f4cfvx9C1I1qQAACVjAQx.?p="); sb.append(URLEncoder.encode(title, StandardCharsets.UTF_8)); @@ -79,7 +79,7 @@ public Set getImdbIdOnYahoo(String title, Integer year) throws public Set getImdbIdOnGoogle(String title, Integer year) throws ImdbSearchIdException { return manager.valueBuilder() .memoryCache() - .key("%s-imdbid-google-%s-%s".formatted("IMDB", title, year)) + .key("IMDB-imdbid-google-$title-$year") .collectionSupplier(ProviderSerieId.class, () -> { StringBuilder sb = new StringBuilder("http://www.google.com/search?q="); sb.append(URLEncoder.encode(title, StandardCharsets.UTF_8)); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/exception/ImdbException.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/exception/ImdbException.java index 1b80bef5..40fbd8e7 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/exception/ImdbException.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/exception/ImdbException.java @@ -8,7 +8,7 @@ public class ImdbException extends Exception { private static final long serialVersionUID = 8887410537703318009L; public ImdbException(String s, String url, Exception e) { - super(s + " :" + url, e); + super("$s: $url", e); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/exception/ImdbSearchIdException.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/exception/ImdbSearchIdException.java index a33c5d3d..584f54d4 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/exception/ImdbSearchIdException.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/exception/ImdbSearchIdException.java @@ -8,7 +8,7 @@ public class ImdbSearchIdException extends Exception { private static final long serialVersionUID = 8887410537703318009L; public ImdbSearchIdException(String s, String url, Exception e) { - super(s + " :" + url, e); + super("$s: $url", e); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java index fa7bf596..5751d695 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java @@ -2,8 +2,6 @@ import java.util.Optional; -import lombok.AccessLevel; -import lombok.Getter; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.data.omdb.model.OmdbDetails; @@ -13,7 +11,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Getter(value = AccessLevel.PROTECTED) public class OmdbAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(OmdbAdapter.class); @@ -44,17 +41,17 @@ public Optional getMovieDetails(int imdbId) { try { return manager.valueBuilder() .cacheType(CacheType.DISK) - .key("%S-movieDetails-%s".formatted(getProviderName(), imdbId)) + .key("$providerName-movieDetails-$imdbId") .optionalSupplier(() -> getApi().getMovieDetails(imdbId)) .storeTempNullValue() .getOptional(); } catch (Exception e) { - LOGGER.error("API %s getMovieDetails for id [%s] (%s)".formatted(getProviderName(), imdbId, e.getMessage()), e); + LOGGER.error("API $providerName getMovieDetails for id [$imdbId] (${e.getMessage()})", e); return Optional.empty(); } } - public synchronized static OmdbAdapter getInstance(Manager manager, UserInteractionHandler userInteractionHandler) { + public static synchronized OmdbAdapter getInstance(Manager manager, UserInteractionHandler userInteractionHandler) { if (instance == null) { instance = new OmdbAdapter(manager, userInteractionHandler); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java index 91e1f35a..759e7001 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java @@ -3,7 +3,6 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.omdb.exception.OmdbException; import org.lodder.subtools.sublibrary.data.omdb.model.OmdbDetails; @@ -17,9 +16,9 @@ class OmdbApi { public Optional getMovieDetails(int imdbId) throws OmdbException { return manager.valueBuilder() .memoryCache() - .key("%s-moviedetails-%s".formatted("OMDB", imdbId)) + .key("OMDB-moviedetails-$imdbId") .optionalSupplier(() -> { - final String url = "http://www.omdbapi.com/?i=tt" + StringUtils.leftPad(String.valueOf(imdbId), 7, "0") + "&plot=short&r=xml"; + final String url = "http://www.omdbapi.com/?i=tt${String.format(\"%07d\", imdbId)}&plot=short&r=xml"; try { return manager.getPageContentBuilder() .url(url) diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/exception/OmdbException.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/exception/OmdbException.java index 780c20d9..8195ab96 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/exception/OmdbException.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/exception/OmdbException.java @@ -8,7 +8,7 @@ public class OmdbException extends Exception { private static final long serialVersionUID = 8887410537703318009L; public OmdbException(String s, String url, Exception e) { - super(s + " :" + url, e); + super("$s: $url", e); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java index 84eab735..6122a643 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java @@ -3,17 +3,16 @@ import java.io.Serial; import java.io.Serializable; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.data.ReleaseDBIntf; -@Getter -@RequiredArgsConstructor +@AllArgsConstructor public class OmdbDetails implements ReleaseDBIntf, Serializable { @Serial private static final long serialVersionUID = 7701770682134890544L; - private final String title; - private final int year; + @val String title; + @val int year; @Override public String getName() { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index 474e4718..68af1a7e 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -61,7 +61,7 @@ public Optional getSerie(String serieName) { String encodedSerieName = URLEncoder.encode(serieName.toLowerCase().replace(" ", "-"), StandardCharsets.UTF_8); ValueBuilderIsPresentIntf valueBuilder = manager.valueBuilder() .cacheType(CacheType.DISK) - .key("%s-tvdbSerie-%s".formatted(getProviderName(), encodedSerieName)); + .key("$providerName-tvdbSerie-$encodedSerieName"); if (valueBuilder.isPresent() && (!valueBuilder.isTemporaryObject() || !valueBuilder.isExpiredTemporary())) { return valueBuilder.returnType(TheTvdbSerie.class).getOptional(); } @@ -80,14 +80,14 @@ public Optional getSerie(String serieName) { } else { String formattedSerieName = serieName.replaceAll("[^A-Za-z]", ""); Comparator comparator = Comparator - .comparing((TheTvdbSerie s) -> formattedSerieName.equalsIgnoreCase(s.getSerieName().replaceAll("[^A-Za-z]", "")), + .comparing((TheTvdbSerie s) -> formattedSerieName.equalsIgnoreCase(s.serieName.replaceAll("[^A-Za-z]", "")), Comparator.reverseOrder()) .thenComparing(TheTvdbSerie::getFirstAired, Comparator.reverseOrder()); try { tvdbSerie = userInteractionHandler .selectFromList(serieIds.stream().sorted(comparator).toList(), Messages.getString("Prompter.SelectTvdbMatchForSerie").formatted(serieName), - getProviderName(), s -> "%s (%s)".formatted(s.getSerieName(), s.getFirstAired())) + getProviderName(), s -> "${s.serieName} (${s.firstAired})") .orElseMap(() -> askUserToEnterTvdbId(serieName).mapToOptionalObj(id -> getApi().getSerie(id, null))); } catch (TheTvdbException e) { tvdbSerie = Optional.empty(); @@ -103,8 +103,8 @@ public Optional getSerie(String serieName) { valueBuilder.optionalValue(tvdbSerie).store(); manager.valueBuilder() .cacheType(CacheType.DISK) - .key("%s-serieId-%s".formatted(getProviderName(), encodedSerieName)) - .optionalValue(tvdbSerie.map(tvdbS -> new SerieMapping(serieName, tvdbS.getId(), tvdbS.getSerieName()))) + .key("$providerName-serieId-$encodedSerieName") + .optionalValue(tvdbSerie.map(tvdbS -> new SerieMapping(serieName, tvdbS.id, tvdbS.serieName))) .storeTempNullValue() .store(); } @@ -119,8 +119,8 @@ public Optional getEpisode(int tvdbId, int season, int episode) try { return getApi().getEpisode(tvdbId, season, episode, Language.ENGLISH); } catch (TheTvdbException e) { - LOGGER.error("API %s getEpisode for serie id [%s] %s (%s)".formatted(getProviderName(), tvdbId, - TvRelease.formatSeasonEpisode(season, episode), e.getMessage()), e); + LOGGER.error("API $providerName getEpisode for serie id [$tvdbId] %s (${e.getMessage()})".formatted( + TvRelease.formatSeasonEpisode(season, episode)), e); return Optional.empty(); } }).storeTempNullValue().getOptional(); @@ -135,15 +135,15 @@ public synchronized static TheTvdbAdapter getInstance(Manager manager, UserInter } private OptionalInt askUserToEnterTvdbId(String showName) { - LOGGER.error("Unknown serie name in tvdb: " + showName); - String tvdbidString = JOptionPane.showInputDialog(null, "Enter tvdb id for serie " + showName); + LOGGER.error("Unknown serie name in tvdb: $showName"); + String tvdbidString = JOptionPane.showInputDialog(null, "Enter tvdb id for serie $showName"); if (tvdbidString == null) { return OptionalInt.empty(); } try { return OptionalInt.of(Integer.parseInt(tvdbidString)); } catch (NumberFormatException e) { - LOGGER.error("Invalid tvdb id: " + tvdbidString); + LOGGER.error("Invalid tvdb id: $tvdbidString"); return askUserToEnterTvdbId(showName); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java index 24566af9..f4372f33 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java @@ -35,7 +35,7 @@ public TheTvdbApi(Manager manager, String apikey) { public List getSeries(String serieName, Language language) throws TheTvdbException { return manager.valueBuilder() .memoryCache() - .key("%s-series-%s-%s".formatted("TVDB", serieName, language)) + .key("TVDB-series-$serieName-$language") .collectionSupplier(TheTvdbSerie.class, () -> { String encodedSerieName = URLEncoder.encode(serieName.toLowerCase().replace(" ", "-"), StandardCharsets.UTF_8); try { @@ -70,7 +70,7 @@ public Optional getSerie(int tvdbId, Language language) throws The public Optional getEpisode(int tvdbId, int season, int episode, Language language) throws TheTvdbException { return manager.valueBuilder() .memoryCache() - .key("%s-episode-%s-%s-%s-%s".formatted("TVDB", tvdbId, season, episode, language)) + .key("TVDB-episode-$tvdbId-$season-$episode-$language") .optionalSupplier(() -> { try { Response response = @@ -90,44 +90,44 @@ public Optional getEpisode(int tvdbId, int season, int episode, } private TheTvdbSerie seriesToTVDBSerie(Series serie, Language lang) { - TheTvdbSerie TheTVDBSerie = new TheTvdbSerie(); - - TheTVDBSerie.setId(serie.id); - TheTVDBSerie.setAirsDayOfWeek(serie.airsDayOfWeek); - TheTVDBSerie.setAirsTime(serie.airsTime); - TheTVDBSerie.setContentRating(serie.rating); - TheTVDBSerie.setFirstAired(serie.firstAired); - TheTVDBSerie.setGenres(serie.genre); - TheTVDBSerie.setImdbId(serie.imdbId); - TheTVDBSerie.setLanguage(lang); - TheTVDBSerie.setNetwork(serie.network); - // TheTVDBSerie.setOverview(serie.overview); - TheTVDBSerie.setRating(serie.rating); - TheTVDBSerie.setRuntime(serie.runtime); - // TheTVDBSerie.setSerieId(toString(serie.id)); - TheTVDBSerie.setSerieName(serie.seriesName); - TheTVDBSerie.setStatus(serie.status); - - return TheTVDBSerie; + TheTvdbSerie theTVDBSerie = new TheTvdbSerie(); + + theTVDBSerie.id = serie.id; + theTVDBSerie.airsDayOfWeek = serie.airsDayOfWeek; + theTVDBSerie.airsTime = serie.airsTime; + theTVDBSerie.contentRating = serie.rating; + theTVDBSerie.firstAired = serie.firstAired; + theTVDBSerie.genres = serie.genre; + theTVDBSerie.imdbId = serie.imdbId; + theTVDBSerie.language = lang; + theTVDBSerie.network = serie.network; + // theTVDBSerie.overview = serie.overview; + theTVDBSerie.rating = serie.rating; + theTVDBSerie.runtime = serie.runtime; + // theTVDBSerie.serieId = toString(serie.id); + theTVDBSerie.serieName = serie.seriesName; + theTVDBSerie.status = serie.status; + + return theTVDBSerie; } private TheTvdbEpisode episodeToTVDBEpisode(Episode episode, Language lang) { TheTvdbEpisode tvdbEpisode = new TheTvdbEpisode(); - tvdbEpisode.setId(toString(episode.id)); - tvdbEpisode.setDvdEpisodeNumber(toString(episode.dvdEpisodeNumber)); - tvdbEpisode.setDvdSeason(toString(episode.dvdSeason)); - tvdbEpisode.setEpisodeName(episode.episodeName); - tvdbEpisode.setEpisodeNumber(episode.airedEpisodeNumber); - tvdbEpisode.setFirstAired(episode.firstAired); - tvdbEpisode.setLanguage(lang); + tvdbEpisode.id = toString(episode.id); + tvdbEpisode.dvdEpisodeNumber = toString(episode.dvdEpisodeNumber); + tvdbEpisode.dvdSeason = toString(episode.dvdSeason); + tvdbEpisode.episodeName = episode.episodeName; + tvdbEpisode.episodeNumber = episode.airedEpisodeNumber; + tvdbEpisode.firstAired = episode.firstAired; + tvdbEpisode.language = lang; // tvdbEpisode.setOverview(episode.language.overview); - tvdbEpisode.setSeasonNumber(episode.airedSeason); - tvdbEpisode.setAbsoluteNumber(toString(episode.absoluteNumber)); - tvdbEpisode.setLastUpdated(toString(episode.lastUpdated)); - tvdbEpisode.setSeasonId(toString(episode.airedSeasonID)); - tvdbEpisode.setAirsAfterSeason(0); - tvdbEpisode.setAirsBeforeEpisode(0); + tvdbEpisode.seasonNumber = episode.airedSeason; + tvdbEpisode.absoluteNumber = toString(episode.absoluteNumber); + tvdbEpisode.lastUpdated = toString(episode.lastUpdated); + tvdbEpisode.seasonId = toString(episode.airedSeasonID); + tvdbEpisode.airsAfterSeason = 0; + tvdbEpisode.airsBeforeEpisode = 0; return tvdbEpisode; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java index 449789e3..24276386 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java @@ -13,7 +13,7 @@ /** * @author lodder - * Source + * Source */ public class TheTvdbMirrors { @@ -35,16 +35,15 @@ public TheTvdbMirrors(String apikey, Manager manager) throws ManagerException, P synchronized (this) { manager.getPageContentBuilder() .url("http://www.thetvdb.com/api/" + apikey + "/mirrors.xml") - .getAsDocument().ifPresent(doc -> { - doc.getElementsByTagName("Mirror").stream() - .filter(nMirror -> nMirror.getNodeType() == Node.ELEMENT_NODE) - .map(Element.class::cast) - .forEach(eMirror -> { - String url = XMLHelper.getStringTagValue("mirrorpath", eMirror); - int typeMask = XMLHelper.getIntTagValue("typemask", eMirror); - addMirror(typeMask, url); - }); - }); + .getAsDocument().ifPresent(doc -> + doc.getElementsByTagName("Mirror").stream() + .filter(nMirror -> nMirror.getNodeType() == Node.ELEMENT_NODE) + .map(Element.class::cast) + .forEach(eMirror -> { + String url = XMLHelper.getStringTagValue("mirrorpath", eMirror); + int typeMask = XMLHelper.getIntTagValue("typemask", eMirror); + addMirror(typeMask, url); + })); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbEpisode.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbEpisode.java index 6fd2d154..bf9a6cd9 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbEpisode.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbEpisode.java @@ -5,43 +5,40 @@ import java.util.ArrayList; import java.util.List; -import lombok.Getter; -import lombok.Setter; import lombok.ToString; +import manifold.ext.props.rt.api.var; import org.lodder.subtools.sublibrary.Language; @ToString -@Getter -@Setter public class TheTvdbEpisode implements Serializable { @Serial private static final long serialVersionUID = 913790243120597542L; - private String id; - private String combinedEpisodeNumber; - private String combinedSeason; - private String dvdChapter; - private String dvdDiscId; - private String dvdEpisodeNumber; - private String dvdSeason; - private List directors = new ArrayList<>(); - private String epImgFlag; - private String episodeName; - private int episodeNumber; - private String firstAired; - private List guestStars = new ArrayList<>(); - private String imdbId; - private Language language; - // private String overview; - private String productionCode; - private String rating; - private int seasonNumber; - private List writers = new ArrayList<>(); - private String absoluteNumber; - private int airsAfterSeason; - private int airsBeforeSeason; - private int airsBeforeEpisode; - private String filename; - private String lastUpdated; - private String seriesId; - private String seasonId; + @var String id; + @var String combinedEpisodeNumber; + @var String combinedSeason; + @var String dvdChapter; + @var String dvdDiscId; + @var String dvdEpisodeNumber; + @var String dvdSeason; + @var List directors = new ArrayList<>(); + @var String epImgFlag; + @var String episodeName; + @var int episodeNumber; + @var String firstAired; + @var List guestStars = new ArrayList<>(); + @var String imdbId; + @var Language language; + // @var String overview; + @var String productionCode; + @var String rating; + @var int seasonNumber; + @var List writers = new ArrayList<>(); + @var String absoluteNumber; + @var int airsAfterSeason; + @var int airsBeforeSeason; + @var int airsBeforeEpisode; + @var String filename; + @var String lastUpdated; + @var String seriesId; + @var String seasonId; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbSerie.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbSerie.java index d1fcec12..cc7dc468 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbSerie.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/model/TheTvdbSerie.java @@ -5,37 +5,33 @@ import java.util.ArrayList; import java.util.List; -import lombok.Getter; -import lombok.Setter; import lombok.ToString; +import manifold.ext.props.rt.api.var; import org.lodder.subtools.sublibrary.Language; @ToString -@Getter -@Setter public class TheTvdbSerie implements Serializable { @Serial private static final long serialVersionUID = -4036836377513152443L; - private int id; - // private String serieId; - private Language language; - private String serieName; - private String banner; - // private String overview; - private String firstAired; - private String imdbId; - private String zap2ItId; - private List actors = new ArrayList<>(); - private String airsDayOfWeek; - private String airsTime; - private String contentRating; - private List genres = new ArrayList<>(); - private String network; - private String rating; - private String runtime; - private String status; - private String fanArt; - private String lastUpdated; - private String poster; - + @var int id; + //@var String serieId; + @var Language language; + @var String serieName; + @var String banner; + //@var String overview; + @var String firstAired; + @var String imdbId; + @var String zap2ItId; + @var List actors = new ArrayList<>(); + @var String airsDayOfWeek; + @var String airsTime; + @var String contentRating; + @var List genres = new ArrayList<>(); + @var String network; + @var String rating; + @var String runtime; + @var String status; + @var String fanArt; + @var String lastUpdated; + @var String poster; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java index c176dc35..91698a34 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java @@ -36,8 +36,7 @@ public static String formatName(String serieName, int season, int episode) { } public static String formatSeasonEpisode(int season, int episode) { - return "S%sE%s".formatted(StringUtils.leftPad(String.valueOf(season), 2, "0"), - StringUtils.leftPad(String.valueOf(episode), 2, "0")); + return "S%02dE%02d".formatted(season, episode); } public interface TvReleaseBuilderShowName { @@ -126,7 +125,7 @@ private TvRelease(Path file, String description, String releaseGroup, String qua } public void updateTvdbEpisodeInfo(TheTvdbEpisode tvdbEpisode) { - this.title = tvdbEpisode.getEpisodeName(); // update to reflect correct episode title + this.title = tvdbEpisode.episodeName; // update to reflect correct episode title } public OptionalInt getTvdbId() { diff --git a/pom.xml b/pom.xml index df9e1f50..c7b346d0 100644 --- a/pom.xml +++ b/pom.xml @@ -142,6 +142,11 @@ manifold-ext-rt ${manifold.version} + + systems.manifold + manifold-props-rt + ${manifold.version} + org.projectlombok lombok From ce818572c92cb0c565147375bf1b43abf851a3bf Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 21:18:41 +0200 Subject: [PATCH 12/54] changes --- .../subtools/multisubdownloader/App.java | 2 +- .../subtools/multisubdownloader/CLI.java | 4 +- .../subtools/multisubdownloader/GUI.java | 32 ++--- .../UpdateAvailableGithub.java | 4 +- .../UserInteractionHandler.java | 8 +- .../actions/DownloadAction.java | 4 +- .../actions/FileListAction.java | 6 +- .../actions/UserInteractionHandlerAction.java | 2 +- .../actions/search/FileGuiSearchAction.java | 2 +- .../gui/dialog/PreferenceDialog.java | 4 +- .../gui/dialog/RenameDialog.java | 4 +- .../preference/DefaultSelectionPanel.java | 6 +- .../gui/panels/preference/GeneralPanel.java | 34 +++--- .../gui/panels/preference/OptionsPanel.java | 45 ++++--- .../preference/SerieProvidersPanel.java | 61 +++++----- .../gui/workers/RenameWorker.java | 4 +- .../subtools/multisubdownloader/lib/Info.java | 28 ++--- .../lib/control/TvReleaseControl.java | 2 +- .../control/subtitles/SubtitleFiltering.java | 6 +- .../Addic7edServiceProvider.java | 4 +- .../OpenSubtitlesServiceProvider.java | 6 +- .../settings/SettingValue.java | 76 ++++++------ .../settings/SettingsControl.java | 80 ++++++------- .../settings/model/Settings.java | 110 +++++++++--------- .../subtitleproviders/Local.java | 2 +- .../subtitleproviders/adapters/Adapter.java | 2 +- .../workers/SearchManager.java | 2 +- .../subtitles/SubtitleFilteringTest.java | 6 +- .../data/UserInteractionSettings.java | 20 ++-- .../sublibrary/data/imdb/ImdbAdapter.java | 2 +- .../sublibrary/data/tvdb/TheTvdbAdapter.java | 2 +- 31 files changed, 282 insertions(+), 288 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java index b2817d3a..3145246e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java @@ -70,7 +70,7 @@ public static void main(String[] args) throws ReflectiveOperationException, Unsu final Container app = new Container(); final Manager manager = createManager(!line.hasCliOption(CliOption.NO_GUI)); prefCtrl = new SettingsControl(manager); - Messages.language = prefCtrl.getSettings().getLanguage(); + Messages.language = prefCtrl.getSettings().language; Bootstrapper bootstrapper = new Bootstrapper(app, prefCtrl.getSettings(), preferences, manager); if (line.hasCliOption(CliOption.TRACE)) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 7bec6b5a..a203b601 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -62,7 +62,7 @@ public CLI(SettingsControl settingControl, Container app) { private void checkUpdate(Manager manager) { UpdateAvailableGithub u = new UpdateAvailableGithub(manager, settings); - if (u.shouldCheckForNewUpdate(settings.getUpdateCheckPeriod()) && u.isNewVersionAvailable()) { + if (u.shouldCheckForNewUpdate(settings.updateCheckPeriod) && u.isNewVersionAvailable()) { System.out.println(Messages.getString("UpdateAppAvailable") + ": " + u.getLatestDownloadUrl()); } } @@ -148,7 +148,7 @@ private List getFolders(CommandLine line) { if (line.hasCliOption(CliOption.FOLDER)) { return List.of(Path.of(line.getCliOptionValue(CliOption.FOLDER))); } else { - return new ArrayList<>(this.settings.getDefaultFolders()); + return new ArrayList<>(this.settings.defaultFolders); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index 900b5303..30c0ee7d 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -116,7 +116,7 @@ public void redraw() { private void checkUpdate(final boolean forceUpdateCheck) { UpdateAvailableGithub u = new UpdateAvailableGithub(manager, settings); Optional updateUrl = (forceUpdateCheck && u.isNewVersionAvailable()) - || (!forceUpdateCheck && u.shouldCheckForNewUpdate(settingsControl.getSettings().getUpdateCheckPeriod()) + || (!forceUpdateCheck && u.shouldCheckForNewUpdate(settingsControl.getSettings().updateCheckPeriod) && u.isNewVersionAvailable()) ? u.getLatestDownloadUrl() : Optional.empty(); if (updateUrl.isPresent()) { final JEditorPane editorPane = new JEditorPane(); @@ -148,7 +148,7 @@ private void checkUpdate(final boolean forceUpdateCheck) { * Initialize the contents of the frame. */ private void initialize() { - MemoryFolderChooser.getInstance().setMemory(settingsControl.getSettings().getLastOutputDir()); + MemoryFolderChooser.getInstance().setMemory(settingsControl.getSettings().lastOutputDir); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { @@ -205,7 +205,7 @@ private void createMenu() { (videoType, title) -> new RenameDialog(self(), settings, videoType, title, manager, userInteractionHandler).setVisible(true); ExportImport exportImport = new ExportImport(manager, settingsControl, userInteractionHandler, this); menuBar = new Menu() - .withShowOnlyFound(settings.isOptionsShowOnlyFound()) + .withShowOnlyFound(settings.optionsShowOnlyFound) .withFileQuitAction(this::close) .withViewFilenameAction(() -> visibilityFunction.accept(SearchColumnName.FILENAME, menuBar.isViewFilenameSelected())) .withViewTypeAction(() -> visibilityFunction.accept(SearchColumnName.TYPE, menuBar.isViewTypeSelected())) @@ -213,7 +213,7 @@ private void createMenu() { .withViewSeasonAction(() -> visibilityFunction.accept(SearchColumnName.SEASON, menuBar.isViewSeasonSelected())) .withViewEpisodeAction(() -> visibilityFunction.accept(SearchColumnName.EPISODE, menuBar.isViewEpisodeSelected())) .withViewShowOnlyFoundAction(() -> { - settings.setOptionsShowOnlyFound(menuBar.isShowOnlyFound()); + settings.optionsShowOnlyFound = menuBar.isShowOnlyFound(); ((VideoTableModel) pnlSearchFile.getResultPanel().getTable().getModel()).setShowOnlyFound(menuBar.isShowOnlyFound()); }) .withViewClearLogAction(() -> pnlLogging.setLogText("")) @@ -239,7 +239,7 @@ private void createTextSearchPanel() { ResultPanel resultPanel = new ResultPanel(); SearchTextInputPanel pnlSearchTextInput = new SearchTextInputPanel(); pnlSearchText = new SearchPanel<>(pnlSearchTextInput, resultPanel); - pnlSearchTextInput.setSelectedLanguage(settings.getSubtitleLanguage() == null ? Language.DUTCH : settings.getSubtitleLanguage()); + pnlSearchTextInput.setSelectedLanguage(settings.subtitleLanguage == null ? Language.DUTCH : settings.subtitleLanguage); resultPanel.showSelectFoundSubtitlesButton(); resultPanel.setTable(createSubtitleTable()); resultPanel.setDownloadAction(arg -> downloadText()); @@ -268,8 +268,8 @@ private void createFileSearchPanel() { ResultPanel resultPanel = new ResultPanel(); pnlSearchFileInput = new SearchFileInputPanel(); - pnlSearchFileInput.setRecursiveSelected(settings.isOptionRecursive()); - pnlSearchFileInput.setSelectedLanguage(settings.getSubtitleLanguage() == null ? Language.DUTCH : settings.getSubtitleLanguage()); + pnlSearchFileInput.setRecursiveSelected(settings.optionRecursive); + pnlSearchFileInput.setSelectedLanguage(settings.subtitleLanguage == null ? Language.DUTCH : settings.subtitleLanguage); pnlSearchFile = new SearchPanel<>(pnlSearchFileInput, resultPanel); resultPanel.setTable(createVideoTable()); @@ -303,7 +303,7 @@ private CustomTable createVideoTable() { CustomTable customTable = new CustomTable(); VideoTableModel videoTableModel = VideoTableModel.getDefaultVideoTableModel(); customTable.setModel(videoTableModel); - videoTableModel.setShowOnlyFound(settingsControl.getSettings().isOptionsShowOnlyFound()); + videoTableModel.setShowOnlyFound(settingsControl.getSettings().optionsShowOnlyFound); videoTableModel.setUserInteractionHandler(userInteractionHandler); final RowSorter sorter = new TableRowSorter<>(customTable.getModel()); customTable.setRowSorter(sorter); @@ -332,7 +332,7 @@ private void restoreScreenSettings() { customTable.setColumnVisibility(searchColumn, !hidden); }; - ScreenSettings screenSettings = settingsControl.getSettings().getScreenSettings(); + ScreenSettings screenSettings = settingsControl.getSettings().screenSettings; visibilityConsumer.accept(SearchColumnName.EPISODE, screenSettings.isHideEpisode(), menuBar::withViewEpisodeSelected); visibilityConsumer.accept(SearchColumnName.FILENAME, screenSettings.isHideFilename(), menuBar::withViewFileNameSelected); @@ -484,19 +484,19 @@ public void propertyChange(PropertyChangeEvent event) { } private void close() { - settingsControl.getSettings().setOptionRecursive(pnlSearchFileInput.isRecursiveSelected()); - settingsControl.getSettings().setSubtitleLanguage(pnlSearchFileInput.getSelectedLanguage()); + settingsControl.getSettings().optionRecursive = pnlSearchFileInput.isRecursiveSelected(); + settingsControl.getSettings().subtitleLanguage = pnlSearchFileInput.getSelectedLanguage(); storeScreenSettings(); settingsControl.store(); } private void storeScreenSettings() { CustomTable customTable = pnlSearchFile.getResultPanel().getTable(); - settingsControl.getSettings().getScreenSettings().setHideEpisode(customTable.isHideColumn(SearchColumnName.EPISODE)); - settingsControl.getSettings().getScreenSettings().setHideFilename(customTable.isHideColumn(SearchColumnName.FILENAME)); - settingsControl.getSettings().getScreenSettings().setHideSeason(customTable.isHideColumn(SearchColumnName.SEASON)); - settingsControl.getSettings().getScreenSettings().setHideTitle(customTable.isHideColumn(SearchColumnName.TITLE)); - settingsControl.getSettings().getScreenSettings().setHideType(customTable.isHideColumn(SearchColumnName.TYPE)); + settingsControl.getSettings().screenSettings.setHideEpisode(customTable.isHideColumn(SearchColumnName.EPISODE)); + settingsControl.getSettings().screenSettings.setHideFilename(customTable.isHideColumn(SearchColumnName.FILENAME)); + settingsControl.getSettings().screenSettings.setHideSeason(customTable.isHideColumn(SearchColumnName.SEASON)); + settingsControl.getSettings().screenSettings.setHideTitle(customTable.isHideColumn(SearchColumnName.TITLE)); + settingsControl.getSettings().screenSettings.setHideType(customTable.isHideColumn(SearchColumnName.TYPE)); } public ProgressDialog setProgressDialog(Cancelable worker) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java index a6130fa3..2558d4e4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java @@ -51,14 +51,14 @@ public boolean shouldCheckForNewUpdate(UpdateCheckPeriod updateCheckPeriod) { } public Optional getLatestDownloadUrl() { - return switch (settings.getUpdateType()) { + return switch (settings.updateType) { case STABLE -> getUrlLatestNewStableGithubRelease(); case NIGHTLY -> getUrlLatestNewNightlyGithubRelease(); }; } public boolean isNewVersionAvailable() { - return switch (settings.getUpdateType()) { + return switch (settings.updateType) { case STABLE -> getUrlLatestNewStableGithubRelease().isPresent(); case NIGHTLY -> getUrlLatestNewNightlyGithubRelease().isPresent(); }; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java index d366f1d4..f34521a6 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java @@ -8,12 +8,12 @@ public interface UserInteractionHandler extends org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler { default List getAutomaticSelection(List subtitles) { - List shortlist = !getSettings().isOptionsMinAutomaticSelection() ? subtitles : + List shortlist = !getSettings().isOptionsMinAutomaticSelection ? subtitles : subtitles.stream() - .filter(subtitle -> subtitle.getScore() >= getSettings().getOptionsMinAutomaticSelectionValue()) + .filter(subtitle -> subtitle.getScore() >= getSettings().optionsMinAutomaticSelectionValue) .toList(); - if (getSettings().isOptionsDefaultSelection()) { - List defaultSelectionsFound = getSettings().getOptionsDefaultSelectionQualityList().stream() + if (getSettings().isOptionsDefaultSelection) { + List defaultSelectionsFound = getSettings().optionsDefaultSelectionQualityList.stream() .flatMap(q -> shortlist.stream().filter(subtitle -> q.isTypeForValue(subtitle.getQuality()))) .distinct().toList(); if (!defaultSelectionsFound.isEmpty()) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java index 8c4b6bbd..4f3193ca 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java @@ -34,8 +34,8 @@ public class DownloadAction { public void download(Release release, Subtitle subtitle, Integer version) throws IOException, ManagerException { switch (release.getVideoType()) { - case EPISODE -> download(release, subtitle, settings.getEpisodeLibrarySettings(), version); - case MOVIE -> download(release, subtitle, settings.getMovieLibrarySettings(), version); + case EPISODE -> download(release, subtitle, settings.episodeLibrarySettings, version); + case MOVIE -> download(release, subtitle, settings.movieLibrarySettings, version); default -> throw new IllegalArgumentException("Unexpected value: " + release.getVideoType()); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java index d82677cb..1b85af9b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java @@ -91,7 +91,7 @@ private List _getFileListing(Path dir, boolean recursive, Language languag } private boolean isExcludedDir(Path path) { - boolean excludedDir = settings.getExcludeList().stream().anyMatch(item -> item.isExcludedPath(path)); + boolean excludedDir = settings.excludeList.stream().anyMatch(item -> item.isExcludedPath(path)); if (excludedDir) { LOGGER.trace("isExcludedDir, skipping [{}]", path); } @@ -99,7 +99,7 @@ private boolean isExcludedDir(Path path) { } private boolean isExcludedFile(Path path) { - boolean excludedFile = settings.getExcludeList().stream().anyMatch(item -> item.isExcludedPath(path)); + boolean excludedFile = settings.excludeList.stream().anyMatch(item -> item.isExcludedPath(path)); if (excludedFile) { LOGGER.trace("isExcludedFile, skipping [{}]", path); } @@ -130,7 +130,7 @@ public boolean fileHasSubtitles(Path file, Language language) throws IOException Set langCodes = new HashSet<>(); langCodes.add(language.getLangCode()); langCodes.addAll(language.getLangCodesOther()); - String customLangCode = settings.getEpisodeLibrarySettings().getLangCodeMap().get(language); + String customLangCode = settings.episodeLibrarySettings.getLangCodeMap().get(language); if (!StringUtils.isBlank(customLangCode)) { langCodes.add(customLangCode); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java index f40f397c..afa14a73 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java @@ -47,7 +47,7 @@ public List subtitleSelection(Release release, final boolean subtitleS if (!release.getMatchingSubs().isEmpty()) { LOGGER.debug("determineWhatSubtitleDownload for videoFile: [{}] # found subs: [{}]", release.getFileName(), release.getMatchingSubs().size()); - if (settings.isOptionsAlwaysConfirm()) { + if (settings.optionsAlwaysConfirm) { return userInteractionHandler.selectSubtitles(release); } else if (release.getMatchingSubs().size() == 1 && release.getMatchingSubs().get(0).getSubtitleMatchType() == SubtitleMatchType.EXACT) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java index 8fd79245..79ddf384 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java @@ -153,7 +153,7 @@ private List createReleases(List files) { private List getFiles(String filePath, Language language, boolean recursive, boolean overwriteExistingSubtitles) { /* Get a list of selected directories */ - List dirs = !filePath.isEmpty() ? List.of(Path.of(filePath)) : this.getSettings().getDefaultFolders(); + List dirs = !filePath.isEmpty() ? List.of(Path.of(filePath)) : this.getSettings().defaultFolders; /* Scan directories for video files */ /* Tell Action where to send progressUpdates */ diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java index 004fdf39..92e3228f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java @@ -68,11 +68,11 @@ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eve tabbedPane.addTab(Messages.getString("PreferenceDialog.TabGeneral"), null, pnlGeneral, null); this.pnlEpisodeLibrary = - new EpisodeLibraryPanel(settingsCtrl.getSettings().getEpisodeLibrarySettings(), manager, false, userInteractionHandler); + new EpisodeLibraryPanel(settingsCtrl.getSettings().episodeLibrarySettings, manager, false, userInteractionHandler); tabbedPane.addTab(Messages.getString("PreferenceDialog.SerieLibrary"), null, pnlEpisodeLibrary, null); this.pnlMovieLibrary = - new MovieLibraryPanel(settingsCtrl.getSettings().getMovieLibrarySettings(), manager, false, userInteractionHandler); + new MovieLibraryPanel(settingsCtrl.getSettings().movieLibrarySettings, manager, false, userInteractionHandler); tabbedPane.addTab(Messages.getString("PreferenceDialog.MovieLibrary"), null, pnlMovieLibrary, null); this.pnlOptions = new OptionsPanel(settingsCtrl); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index 3cd10459..ac687653 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -64,10 +64,10 @@ public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String .addComponent("wrap", this.chkRecursive = new JCheckBox(Messages.getString("RenameDialog.RecursiveSearch"))); if (videoType == VideoType.EPISODE) { - pnlLibrary = new EpisodeLibraryPanel(settings.getEpisodeLibrarySettings(), manager, true, userInteractionHandler) + pnlLibrary = new EpisodeLibraryPanel(settings.episodeLibrarySettings, manager, true, userInteractionHandler) .addTo(getContentPane(), "grow"); } else { - pnlLibrary = new MovieLibraryPanel(settings.getMovieLibrarySettings(), manager, true, userInteractionHandler) + pnlLibrary = new MovieLibraryPanel(settings.movieLibrarySettings, manager, true, userInteractionHandler) .addTo(getContentPane(), "grow"); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java index de1c02d8..2bf5ae64 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java @@ -175,13 +175,13 @@ protected void moveRuleRowUp() { } public void loadPreferenceSettings() { - Source.values().stream().filter(not(settingsCtrl.getSettings().getOptionsDefaultSelectionQualityList()::contains)) + Source.values().stream().filter(not(settingsCtrl.getSettings().optionsDefaultSelectionQualityList::contains)) .forEach(unusedPatternsTable::addItem); - settingsCtrl.getSettings().getOptionsDefaultSelectionQualityList().forEach(usedPatternsTable::addItem); + settingsCtrl.getSettings().optionsDefaultSelectionQualityList.forEach(usedPatternsTable::addItem); } public void savePreferenceSettings() { - settingsCtrl.getSettings().setOptionsDefaultSelectionQualityList(usedPatternsTable.getItems()); + settingsCtrl.getSettings().optionsDefaultSelectionQualityList = usedPatternsTable.getItems(); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index 7ef8601b..d5a68edd 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -142,14 +142,14 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { } public void loadPreferenceSettings() { - cbxLanguage.setSelectedItem(settingsCtrl.getSettings().getLanguage()); - defaultIncomingFoldersList.addItems(PathMatchType.FOLDER.getImage(), settingsCtrl.getSettings().getDefaultIncomingFolders()); - settingsCtrl.getSettings().getExcludeList().forEach(pathOrRegex -> excludeList.addItem(pathOrRegex.getImage(), pathOrRegex)); - cbxUpdateCheckPeriod.setSelectedItem(settingsCtrl.getSettings().getUpdateCheckPeriod()); - cbxUpdateType.setSelectedItem(settingsCtrl.getSettings().getUpdateType()); - chkUseProxy.setSelected(settingsCtrl.getSettings().isGeneralProxyEnabled()); - txtProxyHost.setText(settingsCtrl.getSettings().getGeneralProxyHost()); - txtProxyPort.setObject(settingsCtrl.getSettings().getGeneralProxyPort()); + cbxLanguage.setSelectedItem(settingsCtrl.getSettings().language); + defaultIncomingFoldersList.addItems(PathMatchType.FOLDER.getImage(), settingsCtrl.getSettings().defaultIncomingFolders); + settingsCtrl.getSettings().excludeList.forEach(pathOrRegex -> excludeList.addItem(pathOrRegex.getImage(), pathOrRegex)); + cbxUpdateCheckPeriod.setSelectedItem(settingsCtrl.getSettings().updateCheckPeriod); + cbxUpdateType.setSelectedItem(settingsCtrl.getSettings().updateType); + chkUseProxy.setSelected(settingsCtrl.getSettings().generalProxyEnabled); + txtProxyHost.setText(settingsCtrl.getSettings().generalProxyHost); + txtProxyPort.setObject(settingsCtrl.getSettings().generalProxyPort); } public void savePreferenceSettings() { @@ -159,16 +159,14 @@ public void savePreferenceSettings() { } List defaultIncomingFolders = defaultIncomingFoldersList.stream().map(LabelPanel::getObject).toList(); List exclList = excludeList.stream().map(labelPanel -> new PathOrRegex(labelPanel.getObject().getValue())).toList(); - settingsCtrl.getSettings() - .setLanguage(cbxLanguage.getSelectedItem()) - .setDefaultIncomingFolders(defaultIncomingFolders) - .setExcludeList(exclList) - .setUpdateCheckPeriod(cbxUpdateCheckPeriod.getSelectedItem()) - .setUpdateType(cbxUpdateType.getSelectedItem()) - .setGeneralProxyEnabled(chkUseProxy.isSelected()) - .setGeneralProxyHost(txtProxyHost.getText()) - .setGeneralProxyPort(txtProxyPort.getOptionalObject().orElse(80)); - + settingsCtrl.getSettings().language = cbxLanguage.getSelectedItem(); + settingsCtrl.getSettings().defaultIncomingFolders = defaultIncomingFolders; + settingsCtrl.getSettings().replaceExcludeList(exclList); + settingsCtrl.getSettings().updateCheckPeriod = cbxUpdateCheckPeriod.getSelectedItem(); + settingsCtrl.getSettings().updateType = cbxUpdateType.getSelectedItem(); + settingsCtrl.getSettings().generalProxyEnabled = chkUseProxy.isSelected(); + settingsCtrl.getSettings().generalProxyHost = txtProxyHost.getText(); + settingsCtrl.getSettings().generalProxyPort = txtProxyPort.getOptionalObject().orElse(80); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index 7774a1ed..f0a36533 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -69,32 +69,31 @@ public OptionsPanel(SettingsControl settingsCtrl) { } public void loadPreferenceSettings() { - chkAlwaysConfirm.setSelected(settingsCtrl.getSettings().isOptionsAlwaysConfirm()); - chkMinScoreSelection.setSelected(settingsCtrl.getSettings().isOptionsMinAutomaticSelection()); - sldMinScoreSelection.setValue(settingsCtrl.getSettings().getOptionsMinAutomaticSelectionValue()); - chkDefaultSelection.setSelected(settingsCtrl.getSettings().isOptionsDefaultSelection()); - chkSubtitleExactMethod.setSelected(settingsCtrl.getSettings().isOptionSubtitleExactMatch()); - chkSubtitleKeywordMethod.setSelected(settingsCtrl.getSettings().isOptionSubtitleKeywordMatch()); - chkExcludeHearingImpaired.setSelected(settingsCtrl.getSettings().isOptionSubtitleExcludeHearingImpaired()); - chkOnlyFound.setSelected(settingsCtrl.getSettings().isOptionsShowOnlyFound()); - chkStopOnSearchError.setSelected(settingsCtrl.getSettings().isOptionsStopOnSearchError()); - cbxEpisodeProcessSource.setSelectedItem(settingsCtrl.getSettings().getProcessEpisodeSource()); - chkConfirmProviderMapping.setSelected(settingsCtrl.getSettings().isOptionsConfirmProviderMapping()); + chkAlwaysConfirm.setSelected(settingsCtrl.getSettings().optionsAlwaysConfirm); + chkMinScoreSelection.setSelected(settingsCtrl.getSettings().isOptionsMinAutomaticSelection); + sldMinScoreSelection.setValue(settingsCtrl.getSettings().optionsMinAutomaticSelectionValue); + chkDefaultSelection.setSelected(settingsCtrl.getSettings().isOptionsDefaultSelection); + chkSubtitleExactMethod.setSelected(settingsCtrl.getSettings().optionSubtitleExactMatch); + chkSubtitleKeywordMethod.setSelected(settingsCtrl.getSettings().optionSubtitleKeywordMatch); + chkExcludeHearingImpaired.setSelected(settingsCtrl.getSettings().optionSubtitleExcludeHearingImpaired); + chkOnlyFound.setSelected(settingsCtrl.getSettings().optionsShowOnlyFound); + chkStopOnSearchError.setSelected(settingsCtrl.getSettings().optionsStopOnSearchError); + cbxEpisodeProcessSource.setSelectedItem(settingsCtrl.getSettings().processEpisodeSource); + chkConfirmProviderMapping.setSelected(settingsCtrl.getSettings().isOptionsConfirmProviderMapping); } public void savePreferenceSettings() { - settingsCtrl.getSettings() - .setOptionsAlwaysConfirm(chkAlwaysConfirm.isSelected()) - .setOptionsMinAutomaticSelection(chkMinScoreSelection.isSelected()) - .setOptionsMinAutomaticSelectionValue(sldMinScoreSelection.getValue()) - .setOptionsDefaultSelection(chkDefaultSelection.isSelected()) - .setOptionSubtitleExactMatch(chkSubtitleExactMethod.isSelected()) - .setOptionSubtitleKeywordMatch(chkSubtitleKeywordMethod.isSelected()) - .setOptionSubtitleExcludeHearingImpaired(chkExcludeHearingImpaired.isSelected()) - .setOptionsShowOnlyFound(chkOnlyFound.isSelected()) - .setOptionsStopOnSearchError(chkStopOnSearchError.isSelected()) - .setProcessEpisodeSource(cbxEpisodeProcessSource.getSelectedItem()) - .setOptionsConfirmProviderMapping(chkConfirmProviderMapping.isSelected()); + settingsCtrl.getSettings().optionsAlwaysConfirm = chkAlwaysConfirm.isSelected(); + settingsCtrl.getSettings().optionsMinAutomaticSelection = chkMinScoreSelection.isSelected(); + settingsCtrl.getSettings().optionsMinAutomaticSelectionValue = sldMinScoreSelection.getValue(); + settingsCtrl.getSettings().optionsDefaultSelection = chkDefaultSelection.isSelected(); + settingsCtrl.getSettings().optionSubtitleExactMatch = chkSubtitleExactMethod.isSelected(); + settingsCtrl.getSettings().optionSubtitleKeywordMatch = chkSubtitleKeywordMethod.isSelected(); + settingsCtrl.getSettings().optionSubtitleExcludeHearingImpaired = chkExcludeHearingImpaired.isSelected(); + settingsCtrl.getSettings().optionsShowOnlyFound = chkOnlyFound.isSelected(); + settingsCtrl.getSettings().optionsStopOnSearchError = chkStopOnSearchError.isSelected(); + settingsCtrl.getSettings().processEpisodeSource = cbxEpisodeProcessSource.getSelectedItem(); + settingsCtrl.getSettings().optionsConfirmProviderMapping = chkConfirmProviderMapping.isSelected(); pnlDefaultSelection.savePreferenceSettings(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index b05a2959..47c71ddf 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -103,40 +103,39 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { } public void loadPreferenceSettings() { - chkSourceAddic7ed.setSelected(settingsCtrl.getSettings().isSerieSourceAddic7ed()); - chkUserAddic7edLogin.setSelected(settingsCtrl.getSettings().isLoginAddic7edEnabled()); - chkSourceAddic7edProxy.setSelected(settingsCtrl.getSettings().isSerieSourceAddic7edProxy()); - // chkSourceAddic7edProxy.setEnabled(settingsCtrl.getSettings().isSerieSourceAddic7ed()); - txtAddic7edUsername.setText(settingsCtrl.getSettings().getLoginAddic7edUsername()); - txtAddic7edPassword.setText(settingsCtrl.getSettings().getLoginAddic7edPassword()); - - chkSourceTvSubtitles.setSelected(settingsCtrl.getSettings().isSerieSourceTvSubtitles()); - chkSourcePodnapisi.setSelected(settingsCtrl.getSettings().isSerieSourcePodnapisi()); - chkSourceOpenSubtitles.setSelected(settingsCtrl.getSettings().isSerieSourceOpensubtitles()); - chkUserOpenSubtitlesLogin.setSelected(settingsCtrl.getSettings().isLoginOpenSubtitlesEnabled()); - txtOpenSubtitlesUsername.setText(settingsCtrl.getSettings().getLoginOpenSubtitlesUsername()); - txtOpenSubtitlesPassword.setText(settingsCtrl.getSettings().getLoginOpenSubtitlesPassword()); - chkSourceSubscene.setSelected(settingsCtrl.getSettings().isSerieSourceSubscene()); - chkSourceLocal.setSelected(settingsCtrl.getSettings().isSerieSourceLocal()); - settingsCtrl.getSettings().getLocalSourcesFolders().forEach(path -> localSourcesFoldersList.addItem(PathMatchType.FOLDER.getImage(), path)); + chkSourceAddic7ed.setSelected(settingsCtrl.getSettings().serieSourceAddic7ed); + chkUserAddic7edLogin.setSelected(settingsCtrl.getSettings().loginAddic7edEnabled); + chkSourceAddic7edProxy.setSelected(settingsCtrl.getSettings().serieSourceAddic7edProxy); + // chkSourceAddic7edProxy.setEnabled(settingsCtrl.getSettings().serieSourceAddic7ed); + txtAddic7edUsername.setText(settingsCtrl.getSettings().loginAddic7edUsername); + txtAddic7edPassword.setText(settingsCtrl.getSettings().loginAddic7edPassword); + + chkSourceTvSubtitles.setSelected(settingsCtrl.getSettings().serieSourceTvSubtitles); + chkSourcePodnapisi.setSelected(settingsCtrl.getSettings().serieSourcePodnapisi); + chkSourceOpenSubtitles.setSelected(settingsCtrl.getSettings().serieSourceOpensubtitles); + chkUserOpenSubtitlesLogin.setSelected(settingsCtrl.getSettings().loginOpenSubtitlesEnabled); + txtOpenSubtitlesUsername.setText(settingsCtrl.getSettings().loginOpenSubtitlesUsername); + txtOpenSubtitlesPassword.setText(settingsCtrl.getSettings().loginOpenSubtitlesPassword); + chkSourceSubscene.setSelected(settingsCtrl.getSettings().serieSourceSubscene); + chkSourceLocal.setSelected(settingsCtrl.getSettings().serieSourceLocal); + settingsCtrl.getSettings().localSourcesFolders.forEach(path -> localSourcesFoldersList.addItem(PathMatchType.FOLDER.getImage(), path)); } public void savePreferenceSettings() { - settingsCtrl.getSettings() - .setSerieSourceAddic7ed(chkSourceAddic7ed.isSelected()) - .setLoginAddic7edEnabled(chkUserAddic7edLogin.isSelected()) - .setSerieSourceAddic7edProxy(chkSourceAddic7edProxy.isSelected()) - .setLoginAddic7edUsername(txtAddic7edUsername.getText()) - .setLoginAddic7edPassword(new String(txtAddic7edPassword.getPassword())) - .setSerieSourceTvSubtitles(chkSourceTvSubtitles.isSelected()) - .setSerieSourcePodnapisi(chkSourcePodnapisi.isSelected()) - .setSerieSourceOpensubtitles(chkSourceOpenSubtitles.isSelected()) - .setLoginOpenSubtitlesEnabled(chkUserOpenSubtitlesLogin.isSelected()) - .setLoginOpenSubtitlesUsername(txtOpenSubtitlesUsername.getText()) - .setLoginOpenSubtitlesPassword(new String(txtOpenSubtitlesPassword.getPassword())) - .setSerieSourceSubscene(chkSourceSubscene.isSelected()) - .setSerieSourceLocal(chkSourceLocal.isSelected()) - .setLocalSourcesFolders(localSourcesFoldersList.stream().map(LabelPanel::getObject).toList()); + settingsCtrl.getSettings().serieSourceAddic7ed = chkSourceAddic7ed.isSelected(); + settingsCtrl.getSettings().loginAddic7edEnabled = chkUserAddic7edLogin.isSelected(); + settingsCtrl.getSettings().serieSourceAddic7edProxy = chkSourceAddic7edProxy.isSelected(); + settingsCtrl.getSettings().loginAddic7edUsername = txtAddic7edUsername.getText(); + settingsCtrl.getSettings().loginAddic7edPassword = new String(txtAddic7edPassword.getPassword()); + settingsCtrl.getSettings().serieSourceTvSubtitles = chkSourceTvSubtitles.isSelected(); + settingsCtrl.getSettings().serieSourcePodnapisi = chkSourcePodnapisi.isSelected(); + settingsCtrl.getSettings().serieSourceOpensubtitles = chkSourceOpenSubtitles.isSelected(); + settingsCtrl.getSettings().loginOpenSubtitlesEnabled = chkUserOpenSubtitlesLogin.isSelected(); + settingsCtrl.getSettings().loginOpenSubtitlesUsername = txtOpenSubtitlesUsername.getText(); + settingsCtrl.getSettings().loginOpenSubtitlesPassword = new String(txtOpenSubtitlesPassword.getPassword()); + settingsCtrl.getSettings().serieSourceSubscene = chkSourceSubscene.isSelected(); + settingsCtrl.getSettings().serieSourceLocal = chkSourceLocal.isSelected(); + settingsCtrl.getSettings().localSourcesFolders = localSourcesFoldersList.stream().map(LabelPanel::getObject).toList(); } private boolean hasValidSettingsAddic7ed() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java index 39d2e0b6..e05270e2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java @@ -54,10 +54,10 @@ protected Void doInBackground() { RenameAction renameAction = null; if (selectedShow.getVideoType() == VideoType.EPISODE) { LOGGER.debug("Treat as EPISODE"); - renameAction = new RenameAction(settings.getEpisodeLibrarySettings(), manager, userInteractionHandler); + renameAction = new RenameAction(settings.episodeLibrarySettings, manager, userInteractionHandler); } else if (selectedShow.getVideoType() == VideoType.MOVIE) { LOGGER.debug("Treat as MOVIE"); - renameAction = new RenameAction(settings.getMovieLibrarySettings(), manager, userInteractionHandler); + renameAction = new RenameAction(settings.movieLibrarySettings, manager, userInteractionHandler); } if (renameAction != null) { renameAction.rename(selectedShow.getPath().resolve(selectedShow.getFileName()), selectedShow); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/Info.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/Info.java index be0af20f..02eb739a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/Info.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/Info.java @@ -17,12 +17,12 @@ public static void subtitleSources(Settings settings, boolean isCli) { } for (SubtitleSource source : SubtitleSource.values()) { boolean enabled = switch (source) { - case ADDIC7ED -> settings.isSerieSourceAddic7ed(); - case LOCAL -> settings.isSerieSourceLocal(); - case OPENSUBTITLES -> settings.isSerieSourceOpensubtitles(); - case PODNAPISI -> settings.isSerieSourcePodnapisi(); - case TVSUBTITLES -> settings.isSerieSourceTvSubtitles(); - case SUBSCENE -> settings.isSerieSourceSubscene(); + case ADDIC7ED -> settings.serieSourceAddic7ed; + case LOCAL -> settings.serieSourceLocal; + case OPENSUBTITLES -> settings.serieSourceOpensubtitles; + case PODNAPISI -> settings.serieSourcePodnapisi; + case TVSUBTITLES -> settings.serieSourceTvSubtitles; + case SUBSCENE -> settings.serieSourceSubscene; }; if (isCli) { System.out.println(" - provider : " + source + " enabled: " + enabled); @@ -40,15 +40,15 @@ public static void subtitleSources(Settings settings, boolean isCli) { public static void subtitleFiltering(Settings settings, boolean isCli) { if (isCli) { System.out.println("----- Subtitle Filtering ------"); - System.out.println(" - OptionSubtitleExactMatch : " + settings.isOptionSubtitleExactMatch()); - System.out.println(" - OptionSubtitleKeywordMatch : " + settings.isOptionSubtitleKeywordMatch()); - System.out.println(" - OptionSubtitleExcludeHearingImpaired : " + settings.isOptionSubtitleExcludeHearingImpaired()); + System.out.println(" - OptionSubtitleExactMatch : " + settings.optionSubtitleExactMatch); + System.out.println(" - OptionSubtitleKeywordMatch : " + settings.optionSubtitleKeywordMatch); + System.out.println(" - OptionSubtitleExcludeHearingImpaired : " + settings.optionSubtitleExcludeHearingImpaired); System.out.println("-------------------------------"); } else { LOGGER.info("----- Subtitle Filtering ------"); - LOGGER.info(" - OptionSubtitleExactMatch: {} ", settings.isOptionSubtitleExactMatch()); - LOGGER.info(" - OptionSubtitleKeywordMatch: {} ", settings.isOptionSubtitleKeywordMatch()); - LOGGER.info(" - OptionSubtitleExcludeHearingImpaired: {} ", settings.isOptionSubtitleExcludeHearingImpaired()); + LOGGER.info(" - OptionSubtitleExactMatch: {} ", settings.optionSubtitleExactMatch); + LOGGER.info(" - OptionSubtitleKeywordMatch: {} ", settings.optionSubtitleKeywordMatch); + LOGGER.info(" - OptionSubtitleExcludeHearingImpaired: {} ", settings.optionSubtitleExcludeHearingImpaired); LOGGER.info("-------------------------------"); } @@ -57,11 +57,11 @@ public static void subtitleFiltering(Settings settings, boolean isCli) { public static void downloadOptions(Settings settings, boolean isCli) { if (isCli) { System.out.println("----- Download Options ------"); - System.out.println(" - OptionsAlwaysConfirm : " + settings.isOptionsAlwaysConfirm()); + System.out.println(" - OptionsAlwaysConfirm : " + settings.optionsAlwaysConfirm); System.out.println("-----------------------------"); } else { LOGGER.info("----- Download Options ------"); - LOGGER.info(" - OptionsAlwaysConfirm : " + settings.isOptionsAlwaysConfirm()); + LOGGER.info(" - OptionsAlwaysConfirm : " + settings.optionsAlwaysConfirm); LOGGER.info("-----------------------------"); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index d199f72a..d04b1e7c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -58,7 +58,7 @@ private void processSpecial() throws ReleaseControlException { jtvdba.getSerie(tvRelease.getName()).ifPresentOrThrow(tvdbSerie -> { tvRelease.setTvdbId(tvdbSerie.getId()); tvRelease.setOriginalName(tvdbSerie.serieName); - if (getSettings().getProcessEpisodeSource() == SettingsProcessEpisodeSource.TVDB) { + if (getSettings().processEpisodeSource == SettingsProcessEpisodeSource.TVDB) { jtvdba.getEpisode(tvdbSerie.getId(), tvRelease.getSeason(), tvRelease.getEpisodeNumbers().get(0)) .ifPresent(tvRelease::updateTvdbEpisodeInfo); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java index 2043f837..a0f26627 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java @@ -28,15 +28,15 @@ public boolean excludeSubtitle(Subtitle subtitle, Release release) { } private boolean excludeSubtitleHearingImpaired(Subtitle subtitle, Release release) { - return settings.isOptionSubtitleExcludeHearingImpaired() && subtitle.isHearingImpaired(); + return settings.optionSubtitleExcludeHearingImpaired && subtitle.isHearingImpaired(); } private boolean excludeSubtitleKeywordMatch(Subtitle subtitle, Release release) { - return settings.isOptionSubtitleKeywordMatch() && + return settings.optionSubtitleKeywordMatch && (keyword.excludeSubtitle(release, subtitle) || releaseGroup.excludeSubtitle(release, subtitle)); } private boolean excludeSubtitleExactMatch(Subtitle subtitle, Release release) { - return settings.isOptionSubtitleExactMatch() && exactName.excludeSubtitle(release, subtitle); + return settings.optionSubtitleExactMatch && exactName.excludeSubtitle(release, subtitle); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java index 1ad0d64c..eef7d289 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java @@ -51,8 +51,8 @@ private SubtitleProvider createProvider(UserInteractionHandler userInteractionHa String username = ""; String password = ""; if (settings.isLoginAddic7edEnabled()) { - username = StringUtils.trim(settings.getLoginAddic7edUsername()); - password = StringUtils.trim(settings.getLoginAddic7edPassword()); + username = StringUtils.trim(settings.loginAddic7edUsername); + password = StringUtils.trim(settings.loginAddic7edPassword); /* Protect against empty login */ loginEnabled = !username.isEmpty() && !password.isEmpty(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java index 535722a6..56310834 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java @@ -46,9 +46,9 @@ private SubtitleProvider createProvider(UserInteractionHandler userInteractionHa boolean loginEnabled = false; String username = ""; String password = ""; - if (settings.isLoginOpenSubtitlesEnabled()) { - username = StringUtils.trim(settings.getLoginOpenSubtitlesUsername()); - password = StringUtils.trim(settings.getLoginOpenSubtitlesPassword()); + if (settings.loginOpenSubtitlesEnabled) { + username = StringUtils.trim(settings.loginOpenSubtitlesUsername); + password = StringUtils.trim(settings.loginOpenSubtitlesPassword); /* Protect against empty login */ loginEnabled = !username.isEmpty() && !password.isEmpty(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java index a3347440..ad432ad1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java @@ -144,32 +144,32 @@ public enum SettingValue { // SCREEN SETTINGS SCREEN_HIDE_EPISODE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getScreenSettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().screenSettings) .valueGetter(ScreenSettings::isHideEpisode) .valueSetter(ScreenSettings::setHideEpisode) .defaultValue(true)), SCREEN_HIDE_FILENAME(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getScreenSettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().screenSettings) .valueGetter(ScreenSettings::isHideFilename) .valueSetter(ScreenSettings::setHideFilename) .defaultValue(false)), SCREEN_HIDE_SEASON(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getScreenSettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().screenSettings) .valueGetter(ScreenSettings::isHideSeason) .valueSetter(ScreenSettings::setHideSeason) .defaultValue(true)), SCREEN_HIDE_TITLE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getScreenSettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().screenSettings) .valueGetter(ScreenSettings::isHideTitle) .valueSetter(ScreenSettings::setHideTitle) .defaultValue(true)), SCREEN_HIDE_TYPE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getScreenSettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().screenSettings) .valueGetter(ScreenSettings::isHideType) .valueSetter(ScreenSettings::setHideType) .defaultValue(true)), SCREEN_HIDE_W_I_P(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getScreenSettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().screenSettings) .valueGetter(ScreenSettings::isHideWIP) .valueSetter(ScreenSettings::setHideWIP) .defaultValue(true)), @@ -193,77 +193,77 @@ public enum SettingValue { // LIBRARY SERIE EPISODE_LIBRARY_BACKUP_SUBTITLE_PATH(createSettingPath() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::getLibraryBackupSubtitlePath) .valueSetter(LibrarySettings::setLibraryBackupSubtitlePath) .defaultValue(null)), EPISODE_LIBRARY_BACKUP_SUBTITLE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::isLibraryBackupSubtitle) .valueSetter(LibrarySettings::setLibraryBackupSubtitle) .defaultValue(false)), EPISODE_LIBRARY_BACKUP_USE_WEBSITE_FILE_NAME(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::isLibraryBackupUseWebsiteFileName) .valueSetter(LibrarySettings::setLibraryBackupUseWebsiteFileName) .defaultValue(false)), EPISODE_LIBRARY_ACTION(createSettingEnum(LibraryActionType.class) - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::getLibraryAction) .valueSetter(LibrarySettings::setLibraryAction) .defaultValue(LibraryActionType.NOTHING)), EPISODE_LIBRARY_USE_T_V_D_B_NAMING(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::isLibraryUseTVDBNaming) .valueSetter(LibrarySettings::setLibraryUseTVDBNaming) .defaultValue(false)), EPISODE_LIBRARY_OTHER_FILE_ACTION(createSettingEnum(LibraryOtherFileActionType.class) - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::getLibraryOtherFileAction) .valueSetter(LibrarySettings::setLibraryOtherFileAction) .defaultValue(LibraryOtherFileActionType.NOTHING)), EPISODE_LIBRARY_FOLDER(createSettingPath() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::getLibraryFolder) .valueSetter(LibrarySettings::setLibraryFolder) .defaultValue(null)), EPISODE_LIBRARY_FOLDER_STRUCTURE(createSettingString() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::getLibraryFolderStructure) .valueSetter(LibrarySettings::setLibraryFolderStructure) .defaultValue("")), EPISODE_LIBRARY_REMOVE_EMPTY_FOLDERS(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::isLibraryRemoveEmptyFolders) .valueSetter(LibrarySettings::setLibraryRemoveEmptyFolders) .defaultValue(false)), EPISODE_LIBRARY_FILENAME_STRUCTURE(createSettingString() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::getLibraryFilenameStructure) .valueSetter(LibrarySettings::setLibraryFilenameStructure) .defaultValue("")), EPISODE_LIBRARY_REPLACE_SPACE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::isLibraryFilenameReplaceSpace) .valueSetter(LibrarySettings::setLibraryFilenameReplaceSpace) .defaultValue(false)), EPISODE_LIBRARY_REPLACING_SIGN(createSettingCharacter() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::getLibraryFilenameReplacingSpaceChar) .valueSetter(LibrarySettings::setLibraryFilenameReplacingSpaceChar) .defaultValue('_')), EPISODE_LIBRARY_FOLDER_REPLACE_SPACE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::isLibraryFolderReplaceSpace) .valueSetter(LibrarySettings::setLibraryFolderReplaceSpace) .defaultValue(false)), EPISODE_LIBRARY_FOLDER_REPLACING_SIGN(createSettingCharacter() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::getLibraryFolderReplacingSpaceChar) .valueSetter(LibrarySettings::setLibraryFolderReplacingSpaceChar) .defaultValue('_')), EPISODE_LIBRARY_INCLUDE_LANGUAGE_CODE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .valueGetter(LibrarySettings::isLibraryIncludeLanguageCode) .valueSetter(LibrarySettings::setLibraryIncludeLanguageCode) .defaultValue(false)), @@ -272,82 +272,82 @@ public enum SettingValue { .toObjectMapperKey(Language::valueOf) .toStringMapperValue(Function.identity()) .toObjectMapperValue(Function.identity()) - .rootElementFunction(sCtr -> sCtr.getSettings().getEpisodeLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().episodeLibrarySettings) .mapGetter(LibrarySettings::getLangCodeMap)), // LIBRARY MOVIE MOVIE_LIBRARY_BACKUP_SUBTITLE_PATH(createSettingPath() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::getLibraryBackupSubtitlePath) .valueSetter(LibrarySettings::setLibraryBackupSubtitlePath) .defaultValue(null)), MOVIE_LIBRARY_BACKUP_SUBTITLE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::isLibraryBackupSubtitle) .valueSetter(LibrarySettings::setLibraryBackupSubtitle) .defaultValue(false)), MOVIE_LIBRARY_BACKUP_USE_WEBSITE_FILE_NAME(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::isLibraryBackupUseWebsiteFileName) .valueSetter(LibrarySettings::setLibraryBackupUseWebsiteFileName) .defaultValue(false)), MOVIE_LIBRARY_ACTION(createSettingEnum(LibraryActionType.class) - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::getLibraryAction) .valueSetter(LibrarySettings::setLibraryAction) .defaultValue(LibraryActionType.NOTHING)), MOVIE_LIBRARY_USE_T_V_D_B_NAMING(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::isLibraryUseTVDBNaming) .valueSetter(LibrarySettings::setLibraryUseTVDBNaming) .defaultValue(false)), MOVIE_LIBRARY_OTHER_FILE_ACTION(createSettingEnum(LibraryOtherFileActionType.class) - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::getLibraryOtherFileAction) .valueSetter(LibrarySettings::setLibraryOtherFileAction) .defaultValue(LibraryOtherFileActionType.NOTHING)), MOVIE_LIBRARY_FOLDER(createSettingPath() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::getLibraryFolder) .valueSetter(LibrarySettings::setLibraryFolder) .defaultValue(null)), MOVIE_LIBRARY_FOLDER_STRUCTURE(createSettingString() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::getLibraryFolderStructure) .valueSetter(LibrarySettings::setLibraryFolderStructure) .defaultValue("")), MOVIE_LIBRARY_REMOVE_EMPTY_FOLDERS(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::isLibraryRemoveEmptyFolders) .valueSetter(LibrarySettings::setLibraryRemoveEmptyFolders) .defaultValue(false)), MOVIE_LIBRARY_FILENAME_STRUCTURE(createSettingString() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::getLibraryFilenameStructure) .valueSetter(LibrarySettings::setLibraryFilenameStructure) .defaultValue("")), MOVIE_LIBRARY_REPLACE_SPACE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::isLibraryFilenameReplaceSpace) .valueSetter(LibrarySettings::setLibraryFilenameReplaceSpace) .defaultValue(false)), MOVIE_LIBRARY_REPLACING_SIGN(createSettingCharacter() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::getLibraryFilenameReplacingSpaceChar) .valueSetter(LibrarySettings::setLibraryFilenameReplacingSpaceChar) .defaultValue('_')), MOVIE_LIBRARY_FOLDER_REPLACE_SPACE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::isLibraryFolderReplaceSpace) .valueSetter(LibrarySettings::setLibraryFolderReplaceSpace) .defaultValue(false)), MOVIE_LIBRARY_FOLDER_REPLACING_SIGN(createSettingCharacter() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::getLibraryFolderReplacingSpaceChar) .valueSetter(LibrarySettings::setLibraryFolderReplacingSpaceChar) .defaultValue('_')), MOVIE_LIBRARY_INCLUDE_LANGUAGE_CODE(createSettingBoolean() - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .valueGetter(LibrarySettings::isLibraryIncludeLanguageCode) .valueSetter(LibrarySettings::setLibraryIncludeLanguageCode) .defaultValue(false)), @@ -356,7 +356,7 @@ public enum SettingValue { .toObjectMapperKey(Language::valueOf) .toStringMapperValue(Function.identity()) .toObjectMapperValue(Function.identity()) - .rootElementFunction(sCtr -> sCtr.getSettings().getMovieLibrarySettings()) + .rootElementFunction(sCtr -> sCtr.getSettings().movieLibrarySettings) .mapGetter(LibrarySettings::getLangCodeMap)), // SERIE SOURCE SETTINGS diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java index e3e38231..ba5cca28 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java @@ -107,10 +107,10 @@ public void importPreferences(Path file) throws IOException, BackingStoreExcepti } public void updateProxySettings() { - if (settings.isGeneralProxyEnabled()) { + if (settings.generalProxyEnabled) { System.getProperties().put("proxySet", "true"); - System.getProperties().put("proxyHost", settings.getGeneralProxyHost()); - System.getProperties().put("proxyPort", settings.getGeneralProxyPort()); + System.getProperties().put("proxyHost", settings.generalProxyHost); + System.getProperties().put("proxyPort", settings.generalProxyPort); } else { System.getProperties().put("proxySet", "false"); } @@ -121,7 +121,7 @@ public void updateProxySettings() { */ private void migrateSettings() { SettingValue.loadAll(this, preferences); - int version = settings.getSettingsVersion(); + int version = settings.settingsVersion; if (version == 0) { migrateSettingsV0ToV1(); settings = new Settings(); @@ -164,7 +164,7 @@ public void migrateSettingsV0ToV1() { // int lastItemExclude = preferences.getInt("lastItemExclude", 0); // if (lastItemExclude > 0) { - // List excludeList = settings.getExcludeList(); + // List excludeList = settings.excludeList; // IntStream.range(0, preferences.getInt("lastItemExclude", 0)).forEach(i -> { // String description = preferences.get("ExcludeDescription" + i, ""); // PathMatchType type; @@ -179,23 +179,23 @@ public void migrateSettingsV0ToV1() { // } EPISODE_LIBRARY_FOLDER_STRUCTURE.load(this, preferences); - settings.getEpisodeLibrarySettings() - .setLibraryFolderStructure(migrateLibraryStructureV0(settings.getEpisodeLibrarySettings().getLibraryFolderStructure())); + settings.episodeLibrarySettings + .setLibraryFolderStructure(migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFolderStructure())); EPISODE_LIBRARY_FOLDER_STRUCTURE.store(this, preferences); EPISODE_LIBRARY_FILENAME_STRUCTURE.load(this, preferences); - settings.getEpisodeLibrarySettings() - .setLibraryFilenameStructure(migrateLibraryStructureV0(settings.getEpisodeLibrarySettings().getLibraryFilenameStructure())); + settings.episodeLibrarySettings + .setLibraryFilenameStructure(migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFilenameStructure())); EPISODE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); MOVIE_LIBRARY_FOLDER_STRUCTURE.load(this, preferences); - settings.getEpisodeLibrarySettings() - .setLibraryFolderStructure(migrateLibraryStructureV0(settings.getEpisodeLibrarySettings().getLibraryFolderStructure())); + settings.episodeLibrarySettings + .setLibraryFolderStructure(migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFolderStructure())); MOVIE_LIBRARY_FOLDER_STRUCTURE.store(this, preferences); MOVIE_LIBRARY_FILENAME_STRUCTURE.load(this, preferences); - settings.getEpisodeLibrarySettings() - .setLibraryFilenameStructure(migrateLibraryStructureV0(settings.getEpisodeLibrarySettings().getLibraryFilenameStructure())); + settings.episodeLibrarySettings + .setLibraryFilenameStructure(migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFilenameStructure())); MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); try { @@ -208,29 +208,29 @@ public void migrateSettingsV0ToV1() { LOGGER.error("Error during migration of settings, ignoring..."); } - settings.setSettingsVersion(1); + settings.settingsVersion = 1; SETTINGS_VERSION.store(this, preferences); } @SuppressWarnings("deprecation") public void migrateSettingsV1ToV2() { - settings.getEpisodeLibrarySettings() + settings.episodeLibrarySettings .setLibraryOtherFileAction(LibraryOtherFileActionType.fromString(preferences.get(EPISODE_LIBRARY_OTHER_FILE_ACTION.getKey(), ""))); EPISODE_LIBRARY_OTHER_FILE_ACTION.store(this, preferences); - settings.getMovieLibrarySettings() + settings.movieLibrarySettings .setLibraryOtherFileAction(LibraryOtherFileActionType.fromString(preferences.get(MOVIE_LIBRARY_OTHER_FILE_ACTION.getKey(), ""))); MOVIE_LIBRARY_OTHER_FILE_ACTION.store(this, preferences); - settings.getEpisodeLibrarySettings() + settings.episodeLibrarySettings .setLibraryAction(LibraryActionType.fromString(preferences.get(EPISODE_LIBRARY_ACTION.getKey(), ""))); EPISODE_LIBRARY_ACTION.store(this, preferences); - settings.getMovieLibrarySettings() + settings.movieLibrarySettings .setLibraryAction(LibraryActionType.fromString(preferences.get(MOVIE_LIBRARY_ACTION.getKey(), ""))); MOVIE_LIBRARY_ACTION.store(this, preferences); - settings.setSettingsVersion(2); + settings.settingsVersion = 2; SETTINGS_VERSION.store(this, preferences); } @@ -252,7 +252,7 @@ public void migrateSettingsV2ToV3() { // }); // preferences.remove("DictionarySize"); - settings.setSettingsVersion(3); + settings.settingsVersion = 3; SETTINGS_VERSION.store(this, preferences); } @@ -269,7 +269,7 @@ public void migrateSettingsV3ToV4() { // preferences.put("ExcludeItem" + i, newValue); // }); // EXCLUDE_ITEM.store(this, preferences); - settings.setSettingsVersion(4); + settings.settingsVersion = 4; SETTINGS_VERSION.store(this, preferences); } @@ -282,7 +282,7 @@ public void migrateSettingsV4ToV5() { .key(serieMappingPair.getKey()) .remove(); })); - settings.setSettingsVersion(5); + settings.settingsVersion = 5; SETTINGS_VERSION.store(this, preferences); } @@ -306,7 +306,7 @@ public void migrateSettingsV5ToV6() { } DEFAULT_SELECTION_QUALITY.store(this, preferences); - settings.setSettingsVersion(6); + settings.settingsVersion = 6; SETTINGS_VERSION.store(this, preferences); } @@ -318,44 +318,44 @@ public void migrateSettingsV6ToV7() { librarySettings.getLangCodeMap().put(language, value.trim()); } }; - consumer.accept("EpisodeLibraryDefaultNlText", Language.DUTCH, settings.getEpisodeLibrarySettings()); - consumer.accept("EpisodeLibraryDefaultEnText", Language.ENGLISH, settings.getEpisodeLibrarySettings()); - consumer.accept("MovieLibraryDefaultNlText", Language.DUTCH, settings.getMovieLibrarySettings()); - consumer.accept("MovieLibraryDefaultENText", Language.ENGLISH, settings.getMovieLibrarySettings()); + consumer.accept("EpisodeLibraryDefaultNlText", Language.DUTCH, settings.episodeLibrarySettings); + consumer.accept("EpisodeLibraryDefaultEnText", Language.ENGLISH, settings.episodeLibrarySettings); + consumer.accept("MovieLibraryDefaultNlText", Language.DUTCH, settings.movieLibrarySettings); + consumer.accept("MovieLibraryDefaultENText", Language.ENGLISH, settings.movieLibrarySettings); EPISODE_LIBRARY_LANG_CODE_MAPPING.store(this, preferences); MOVIE_LIBRARY_LANG_CODE_MAPPING.store(this, preferences); - if (settings.getEpisodeLibrarySettings().hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) { - if (StringUtils.isBlank(settings.getEpisodeLibrarySettings().getLibraryFilenameStructure())) { - settings.getMovieLibrarySettings().setLibraryFilenameStructure("%SHOW NAME%%SEPARATOR%%Season %S%"); + if (settings.episodeLibrarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) { + if (StringUtils.isBlank(settings.episodeLibrarySettings.getLibraryFilenameStructure())) { + settings.movieLibrarySettings.setLibraryFilenameStructure("%SHOW NAME%%SEPARATOR%%Season %S%"); MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); EPISODE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); } - if (StringUtils.isBlank(settings.getEpisodeLibrarySettings().getLibraryFolderStructure())) { - settings.getMovieLibrarySettings().setLibraryFolderStructure("%SHOW NAME%.S%SS%E%EE%.%TITLE%"); + if (StringUtils.isBlank(settings.episodeLibrarySettings.getLibraryFolderStructure())) { + settings.movieLibrarySettings.setLibraryFolderStructure("%SHOW NAME%.S%SS%E%EE%.%TITLE%"); EPISODE_LIBRARY_FOLDER_STRUCTURE.store(this, preferences); } } - if (settings.getMovieLibrarySettings().hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) { - if (StringUtils.isBlank(settings.getMovieLibrarySettings().getLibraryFilenameStructure())) { - settings.getMovieLibrarySettings().setLibraryFilenameStructure("%MOVIE TITLE% (%YEAR%)"); + if (settings.movieLibrarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) { + if (StringUtils.isBlank(settings.movieLibrarySettings.getLibraryFilenameStructure())) { + settings.movieLibrarySettings.setLibraryFilenameStructure("%MOVIE TITLE% (%YEAR%)"); MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); } } - settings.setSettingsVersion(7); + settings.settingsVersion = 7; SETTINGS_VERSION.store(this, preferences); } public void migrateSettingsV7ToV8() { - if (settings.isLoginOpenSubtitlesEnabled() - && !OpenSubtitlesApi.isValidCredentials(settings.getLoginOpenSubtitlesUsername(), settings.getLoginOpenSubtitlesPassword())) { - settings.setLoginOpenSubtitlesEnabled(false); + if (settings.loginOpenSubtitlesEnabled + && !OpenSubtitlesApi.isValidCredentials(settings.loginOpenSubtitlesUsername, settings.loginOpenSubtitlesPassword)) { + settings.loginOpenSubtitlesEnabled = false; LOGIN_OPEN_SUBTITLES_ENABLED.store(this, preferences); } - settings.setSettingsVersion(8); + settings.settingsVersion = 8; SETTINGS_VERSION.store(this, preferences); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java index 5ac23b01..5935b97e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java @@ -10,60 +10,58 @@ import java.util.Map; import java.util.Set; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; +import manifold.ext.props.rt.api.var; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.control.VideoPatterns; import org.lodder.subtools.sublibrary.data.UserInteractionSettingsIntf; import org.lodder.subtools.sublibrary.model.SubtitleSource; -@Getter -@Setter -@Accessors(chain = true) public class Settings implements UserInteractionSettingsIntf { - private Path lastOutputDir; - private boolean optionsAlwaysConfirm; - private boolean optionSubtitleExactMatch = true; - private boolean optionSubtitleKeywordMatch = true; - private boolean optionSubtitleExcludeHearingImpaired; - private boolean optionsShowOnlyFound, optionsStopOnSearchError; - private final Set excludeList = new LinkedHashSet<>(); - private final LibrarySettings movieLibrarySettings = new LibrarySettings(); - private final LibrarySettings episodeLibrarySettings = new LibrarySettings(); - private String generalProxyHost = ""; - private int generalProxyPort = 80; - private boolean generalProxyEnabled; - private List defaultIncomingFolders = new ArrayList<>(); - private List localSourcesFolders = new ArrayList<>(); - private boolean optionRecursive; - private final ScreenSettings screenSettings = new ScreenSettings(); - private boolean loginAddic7edEnabled; - private String loginAddic7edUsername; - private String loginAddic7edPassword; - private boolean loginOpenSubtitlesEnabled; - private String loginOpenSubtitlesUsername; - private String loginOpenSubtitlesPassword; - private boolean serieSourceAddic7ed = true; - private boolean serieSourceAddic7edProxy = true; - private boolean serieSourceTvSubtitles = true; - private boolean serieSourcePodnapisi = true; - private boolean serieSourceOpensubtitles = true; - private boolean serieSourceLocal = true; - private boolean serieSourceSubscene = true; - private SettingsProcessEpisodeSource processEpisodeSource = SettingsProcessEpisodeSource.TVDB; - private final Map sortWeights; - private Language subtitleLanguage; - private boolean optionsMinAutomaticSelection; - private int optionsMinAutomaticSelectionValue; - private UpdateCheckPeriod updateCheckPeriod; - private UpdateType updateType; - private boolean optionsDefaultSelection; - private List optionsDefaultSelectionQualityList = new ArrayList<>(); - private int settingsVersion; - private boolean optionsConfirmProviderMapping; - private Language language; + @var Path lastOutputDir; + @override @var boolean optionsAlwaysConfirm; + @var boolean optionSubtitleExactMatch = true; + @var boolean optionSubtitleKeywordMatch = true; + @var boolean optionSubtitleExcludeHearingImpaired; + @var boolean optionsShowOnlyFound; + @var boolean optionsStopOnSearchError; + @val Set excludeList = new LinkedHashSet<>(); + @val LibrarySettings movieLibrarySettings = new LibrarySettings(); + @val LibrarySettings episodeLibrarySettings = new LibrarySettings(); + @var String generalProxyHost = ""; + @var int generalProxyPort = 80; + @var boolean generalProxyEnabled; + @var List defaultIncomingFolders = new ArrayList<>(); + @var List localSourcesFolders = new ArrayList<>(); + @var boolean optionRecursive; + @val ScreenSettings screenSettings = new ScreenSettings(); + @var boolean loginAddic7edEnabled; + @var String loginAddic7edUsername; + @var String loginAddic7edPassword; + @var boolean loginOpenSubtitlesEnabled; + @var String loginOpenSubtitlesUsername; + @var String loginOpenSubtitlesPassword; + @var boolean serieSourceAddic7ed = true; + @var boolean serieSourceAddic7edProxy = true; + @var boolean serieSourceTvSubtitles = true; + @var boolean serieSourcePodnapisi = true; + @var boolean serieSourceOpensubtitles = true; + @var boolean serieSourceLocal = true; + @var boolean serieSourceSubscene = true; + @var SettingsProcessEpisodeSource processEpisodeSource = SettingsProcessEpisodeSource.TVDB; + @val Map sortWeights; + @var Language subtitleLanguage; + @override @var boolean optionsMinAutomaticSelection; + @override @var int optionsMinAutomaticSelectionValue; + @var UpdateCheckPeriod updateCheckPeriod; + @var UpdateType updateType; + @override @var boolean optionsDefaultSelection; + @override @var List optionsDefaultSelectionQualityList = new ArrayList<>(); + @var int settingsVersion; + @override @var boolean optionsConfirmProviderMapping; + @var Language language; public Settings() { // TODO: user should be able to edit/add these through a panel @@ -78,26 +76,26 @@ public Settings() { } public List getDefaultFolders() { - return getDefaultIncomingFolders(); + return defaultIncomingFolders; } public boolean hasDefaultFolders() { - return !getDefaultIncomingFolders().isEmpty(); + return !defaultIncomingFolders.isEmpty(); } public boolean isSerieSource(SubtitleSource sbtitleSource) { // TODO: dynamically inject SubtitleProvider to settings return switch (sbtitleSource) { - case ADDIC7ED -> this.isSerieSourceAddic7ed(); - case OPENSUBTITLES -> this.isSerieSourceOpensubtitles(); - case PODNAPISI -> this.isSerieSourcePodnapisi(); - case TVSUBTITLES -> this.isSerieSourceTvSubtitles(); - case LOCAL -> this.isSerieSourceLocal(); - case SUBSCENE -> this.isSerieSourceSubscene(); + case ADDIC7ED -> serieSourceAddic7ed; + case OPENSUBTITLES -> serieSourceOpensubtitles; + case PODNAPISI ->serieSourcePodnapisi; + case TVSUBTITLES -> serieSourceTvSubtitles; + case LOCAL -> serieSourceLocal; + case SUBSCENE -> serieSourceSubscene; }; } - public Settings setExcludeList(Collection exclusions) { + public Settings replaceExcludeList(Collection exclusions) { excludeList.clear(); excludeList.addAll(exclusions); return this; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index 282b7410..c0e15951 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -55,7 +55,7 @@ public SubtitleSource getSubtitleSource() { } private List getPossibleSubtitles(String filter) { - return settings.getLocalSourcesFolders().stream() + return settings.localSourcesFolders.stream() .flatMap(local -> getAllSubtitlesFiles(local, filter).stream()) .toList(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 9640f7c7..3ec34dc4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -179,7 +179,7 @@ default Optional getProviderSerieId(String serieName, String serie } SerieMapping serieMapping; - if (!getUserInteractionSettings().isOptionsConfirmProviderMapping() && providerSerieIds.size() == 1) { + if (!getUserInteractionSettings().isOptionsConfirmProviderMapping && providerSerieIds.size() == 1) { serieMapping = new SerieMapping(serieName, providerSerieIds.get(0).id, providerSerieIds.get(0).name, seasonToUse); } else { ValueBuilderIsPresentIntf previousResultsValueBuilder = getManager().valueBuilder() diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java index 0768a03d..58caf995 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java @@ -89,7 +89,7 @@ public void addRelease(Release release) { this.queue.forEach((key, value) -> queue.get(key).add(release)); /* Create a scoreCalculator so we can score subtitles for this release */ // TODO: extract to factory - SortWeight weights = new SortWeight(release, this.settings.getSortWeights()); + SortWeight weights = new SortWeight(release, this.settings.sortWeights); this.scoreCalculators.put(release, new ScoreCalculator(weights)); } diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java index 897e1a3f..43177282 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java @@ -96,9 +96,9 @@ void testExactMatchAndKeywordMatchFilter() { private Settings createSettings(boolean keyword, boolean exact, boolean excludehearing) { Settings settings = mock(Settings.class); - when(settings.isOptionSubtitleExactMatch()).thenReturn(exact); - when(settings.isOptionSubtitleKeywordMatch()).thenReturn(keyword); - when(settings.isOptionSubtitleExcludeHearingImpaired()).thenReturn(excludehearing); + when(settings.optionSubtitleExactMatch).thenReturn(exact); + when(settings.optionSubtitleKeywordMatch).thenReturn(keyword); + when(settings.optionSubtitleExcludeHearingImpaired).thenReturn(excludehearing); return settings; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettings.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettings.java index 4a91aa32..ac9d9e09 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettings.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettings.java @@ -2,23 +2,23 @@ import java.util.List; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.control.VideoPatterns; -@RequiredArgsConstructor -@Getter +@AllArgsConstructor public class UserInteractionSettings implements UserInteractionSettingsIntf { - private final boolean optionsAlwaysConfirm; + @override @val boolean optionsAlwaysConfirm; - private final boolean optionsMinAutomaticSelection; + @override @val boolean optionsMinAutomaticSelection; - private final int optionsMinAutomaticSelectionValue; + @override @val int optionsMinAutomaticSelectionValue; - private final boolean optionsDefaultSelection; + @override @val boolean optionsDefaultSelection; - private final List optionsDefaultSelectionQualityList; + @override @val List optionsDefaultSelectionQualityList; - private final boolean optionsConfirmProviderMapping; + @override @val boolean optionsConfirmProviderMapping; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java index bce77edc..4cd0703c 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java @@ -103,7 +103,7 @@ private OptionalInt getImdbIdCommon(String title, Integer year, LOGGER.error("API %s getImdbId for title [%s] and year [%s] (%s)".formatted(getProviderName(), title, year, e.getMessage()), e); return OptionalInt.empty(); } - if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping() && providerSerieIds.size() == 1) { + if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping && providerSerieIds.size() == 1) { // found single exact match return OptionalInt.of(Integer.parseInt(providerSerieIds.iterator().next().id)); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index 68af1a7e..4f17431a 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -75,7 +75,7 @@ public Optional getSerie(String serieName) { } if (serieIds.isEmpty()) { tvdbSerie = Optional.empty(); - } else if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping() && serieIds.size() == 1) { + } else if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping && serieIds.size() == 1) { tvdbSerie = Optional.of(serieIds.get(0)); } else { String formattedSerieName = serieName.replaceAll("[^A-Za-z]", ""); From edd5351da6d6233d293fd21402d131326e677856 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 21:47:50 +0200 Subject: [PATCH 13/54] changes --- .../subtools/multisubdownloader/UpdateAvailableGithub.java | 6 +++--- .../subtools/multisubdownloader/workers/SearchWorker.java | 2 +- .../sublibrary/exception/ControlFactoryException.java | 7 +++---- .../exception/SubtitlesProviderInitException.java | 5 ++--- .../java/org/lodder/subtools/sublibrary/gui/InputPane.java | 5 ++--- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java index 2558d4e4..3842d575 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java @@ -28,9 +28,9 @@ public class UpdateAvailableGithub { private static final Logger LOGGER = LoggerFactory.getLogger(UpdateAvailableGithub.class); - private final static String DOMAIN = "https://github.com"; - private final static String REPO_URI = "/phdelodder/SubTools"; - private final static String REPO_URL = DOMAIN + REPO_URI; + private static final String DOMAIN = "https://github.com"; + private static final String REPO_URI = "/phdelodder/SubTools"; + private static final String REPO_URL = DOMAIN + REPO_URI; private final Manager manager; private final Settings settings; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java index 3833c03e..261b6868 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java @@ -55,7 +55,7 @@ public void run() { } } } catch (SubtitlesProviderInitException e) { - LOGGER.error("API %s INIT (%s)".formatted(e.getProviderName(), e.getMessage()), e); + LOGGER.error("API %s INIT (%s)".formatted(e.providerName, e.getMessage()), e); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/ControlFactoryException.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/ControlFactoryException.java index bec0fe60..bbb764c8 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/ControlFactoryException.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/ControlFactoryException.java @@ -4,11 +4,10 @@ public class ControlFactoryException extends Exception { - public ControlFactoryException(String string) { - super(string); - } - @Serial private static final long serialVersionUID = -7387961966699689531L; + public ControlFactoryException(String string) { + super(string); + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/SubtitlesProviderInitException.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/SubtitlesProviderInitException.java index f056298a..9b138527 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/SubtitlesProviderInitException.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/SubtitlesProviderInitException.java @@ -2,14 +2,13 @@ import java.io.Serial; -import lombok.Getter; +import manifold.ext.props.rt.api.val; public class SubtitlesProviderInitException extends RuntimeException { @Serial private static final long serialVersionUID = -2959483164333075297L; - @Getter - private final String providerName; + @val String providerName; public SubtitlesProviderInitException(String providerName, Throwable e) { super(e); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java index adf4f572..404acce9 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java @@ -62,8 +62,8 @@ public static class InputPaneBuilder extends JDialog implements ActionListener, InputPaneBuilderTitleIntf { @Serial private static final long serialVersionUID = 1L; - private final static String OK = Messages.getString("App.OK"); - private final static String CANCEL = Messages.getString("App.Cancel"); + private static final String OK = Messages.getString("App.OK"); + private static final String CANCEL = Messages.getString("App.Cancel"); private String title; private String message; private String errorMessage; @@ -125,7 +125,6 @@ public void componentShown(ComponentEvent ce) { pack(); setVisible(true); - optionPane.getValue(); return typedText; } From 4f9a2a8c9d993580d24429eea9062f889d53fb75 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 22:51:38 +0200 Subject: [PATCH 14/54] changes --- .../subtools/multisubdownloader/CLI.java | 4 +- .../UserInteractionHandlerCLI.java | 2 +- .../actions/DownloadAction.java | 4 +- .../actions/RenameAction.java | 2 +- .../actions/UserInteractionHandlerAction.java | 6 +- .../cli/progress/CLISearchProgress.java | 2 +- .../gui/dialog/RenameDialog.java | 2 +- .../gui/dialog/SelectDialog.java | 4 +- .../progress/search/SearchProgressDialog.java | 3 +- .../gui/extra/table/VideoTableModel.java | 4 +- .../gui/workers/DownloadWorker.java | 2 +- .../gui/workers/RenameWorker.java | 2 +- .../lib/control/MovieReleaseControl.java | 6 +- .../subtitles/filters/ReleaseGroupFilter.java | 2 +- .../subtitles/filters/SubtitleFilter.java | 2 +- .../control/subtitles/sorting/SortWeight.java | 6 +- .../sorting/replacers/GroupReplacer.java | 2 +- .../lib/library/FilenameLibraryBuilder.java | 16 ++-- .../lib/library/PathLibraryBuilder.java | 10 +-- .../subtitleproviders/Local.java | 2 +- .../subtitleproviders/adapters/Adapter.java | 12 +-- .../adapters/JOpenSubAdapter.java | 2 +- .../subscene/SubsceneApi.java | 2 +- .../subtitles/SubtitleFilteringTest.java | 6 +- .../sorting/ScoreCalculatorTest.java | 4 +- .../subtitles/sorting/SortWeightTest.java | 4 +- .../sorting/replacers/GroupReplacerTest.java | 4 +- .../sublibrary/model/MovieRelease.java | 18 ++--- .../subtools/sublibrary/model/Release.java | 21 +++-- .../sublibrary/model/SeasonEpisode.java | 8 +- .../subtools/sublibrary/model/TvRelease.java | 3 +- .../sublibrary/control/ReleaseParserTest.java | 79 +++++++++---------- 32 files changed, 118 insertions(+), 128 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index a203b601..13aed56b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -125,13 +125,13 @@ private void download(Release release) { if (downloadAll) { selection = release.getMatchingSubs(); if (!selection.isEmpty()) { - System.out.println("Downloading ALL found subtitles for release: " + release.getFileName()); + System.out.println("Downloading ALL found subtitles for release: ${release.fileName}"); } } else { selection = userInteractionHandlerAction.subtitleSelection(release, subtitleSelection, dryRun); } if (selection.isEmpty()) { - System.out.println("No subtitles found for: " + release.getFileName()); + System.out.println("No subtitles found for: ${release.fileName}"); } else { IntStream.range(0, selection.size()).forEach(j -> { System.out.println("Downloading subtitle: " + release.getMatchingSubs().get(0).getFileName()); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java index 8e393db3..666c63cb 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java @@ -43,7 +43,7 @@ public UserInteractionHandlerCLI(UserInteractionSettingsIntf settings) { @Override public List selectSubtitles(Release release) { - System.out.printf("\n%s : %s%n", Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease"), release.getFileName()); + System.out.printf("\n%s : %s%n", Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease"), release.fileName); return PrompterUtil .getElementsFromList(release.getMatchingSubs()) .displayAsTable(createTableDisplayer()) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java index 4f3193ca..429446fa 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java @@ -41,7 +41,7 @@ public void download(Release release, Subtitle subtitle, Integer version) throws } public void download(Release release, Subtitle subtitle) throws IOException, ManagerException { - LOGGER.info("Downloading subtitle: [{}] for release: [{}]", subtitle.getFileName(), release.getFileName()); + LOGGER.info("Downloading subtitle: [{}] for release: [{}]", subtitle.getFileName(), release.fileName); download(release, subtitle, 0); } @@ -82,7 +82,7 @@ private void download(Release release, Subtitle subtitle, LibrarySettings librar if (success) { if (!librarySettings.hasLibraryAction(LibraryActionType.NOTHING)) { - Path oldLocationFile = release.getPath().resolve(release.getFileName()); + Path oldLocationFile = release.getPath().resolve(release.fileName); if (oldLocationFile.exists()) { LOGGER.info("Moving/Renaming [{}] to folder [{}] this might take a while... ", videoFileName, path); oldLocationFile.moveToDir(path); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java index 67c84a40..028d241c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/RenameAction.java @@ -52,7 +52,7 @@ public void rename(Path f, Release release) { } LOGGER.trace("rename: newDir [{}]", newDir); - Path file = release.getPath().resolve(release.getFileName()); + Path file = release.getPath().resolve(release.fileName); try { if (librarySettings.hasLibraryAction(LibraryActionType.MOVE) || librarySettings.hasLibraryAction(LibraryActionType.MOVEANDRENAME)) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java index afa14a73..3b8baa64 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java @@ -46,7 +46,7 @@ public List subtitleSelection(Release release, final boolean subtitleS } else { if (!release.getMatchingSubs().isEmpty()) { LOGGER.debug("determineWhatSubtitleDownload for videoFile: [{}] # found subs: [{}]", - release.getFileName(), release.getMatchingSubs().size()); + release.fileName, release.getMatchingSubs().size()); if (settings.optionsAlwaysConfirm) { return userInteractionHandler.selectSubtitles(release); } else if (release.getMatchingSubs().size() == 1 @@ -74,14 +74,14 @@ public List subtitleSelection(Release release, final boolean subtitleS return userInteractionHandler.selectSubtitles(release); } else { LOGGER.info("Multiple subs detected for: [{}] Unhandleable for CMD! switch to GUI or use '--selection' as switch in de CMD", - release.getFileName()); + release.fileName); } } else if (release.getMatchingSubs().size() == 1) { LOGGER.debug("determineWhatSubtitleDownload: only one sub taking it!!!!"); return List.of(release.getMatchingSubs().get(0)); } } - LOGGER.debug("determineWhatSubtitleDownload: No subs found for [{}]", release.getFileName()); + LOGGER.debug("determineWhatSubtitleDownload: No subs found for [{}]", release.fileName); } return List.of(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java index 4d406e3c..ce4bc143 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java @@ -19,7 +19,7 @@ public CLISearchProgress() { @Override public void progress(SubtitleProvider provider, int jobsLeft, Release release) { - this.tableModel.update(provider.getName(), jobsLeft, release == null ? "Done" : release.getFileName()); + this.tableModel.update(provider.getName(), jobsLeft, release == null ? "Done" : release.fileName); this.printProgress(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index ac687653..5af1628e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -153,7 +153,7 @@ private void rename(Path dir) throws IOException { if (!file.fileNameContainsIgnoreCase("sample") && extensions.contains(file.getExtension())) { Release release = releaseFactory.createRelease(file, userInteractionHandler); if (release != null) { - publish(release.getFileName()); + publish(release.fileName); if (release.getVideoType() == videoType) { renameAction.rename(file, release); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java index 9b0d1d2a..aa8ff5cd 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java @@ -42,9 +42,7 @@ public SelectDialog(JFrame frame, List subtitles, Release release) { private void initialize() { getContentPane().setLayout(new MigLayout("", "[1000px:n,grow,fill]", "[][::100px,fill][grow]")); - JLabel lblNewLabel = - new JLabel(Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease") - + release.getFileName()); + JLabel lblNewLabel = new JLabel(Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease") + release.fileName); getContentPane().add(lblNewLabel, "cell 0 0"); { JScrollPane scrollPane = new JScrollPane(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java index cf6901a4..f270dad8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java @@ -39,8 +39,7 @@ public SearchProgressDialog(GUI window, Cancelable searchAction) { @Override public void progress(SubtitleProvider provider, int jobsLeft, Release release) { this.setVisible(); - this.tableModel.update(provider.getName(), jobsLeft, - release == null ? "Done" : release.getFileName()); + this.tableModel.update(provider.getName(), jobsLeft, release == null ? "Done" : release.fileName); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java index 4d4e74e4..ee0bb6d1 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java @@ -101,12 +101,12 @@ public Row(Release release, UserInteractionHandler userInteractionHandler) { if (release instanceof TvRelease tvRelease) { yield tvRelease.getOriginalName(); } else if (release instanceof MovieRelease movieRelease) { - yield movieRelease.getName(); + yield movieRelease.name; } else { throw new IllegalArgumentException("Unexpected release type: " + release.getClass()); } } - case FILENAME -> release.getFileName(); + case FILENAME -> release.fileName; case FOUND -> calculateSubsFound(); case SELECT -> false; case OBJECT -> release; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java index 17c11f5e..b558f09f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java @@ -63,7 +63,7 @@ protected Void doInBackground() { progress = 1; } setProgress(progress); - publish(selectedShow.getFileName()); + publish(selectedShow.fileName); List selection = userInteractionHandlerAction.subtitleSelection(selectedShow, true); try { for (int j = 0; j < selection.size(); j++) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java index e05270e2..f8ec2a4c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java @@ -60,7 +60,7 @@ protected Void doInBackground() { renameAction = new RenameAction(settings.movieLibrarySettings, manager, userInteractionHandler); } if (renameAction != null) { - renameAction.rename(selectedShow.getPath().resolve(selectedShow.getFileName()), selectedShow); + renameAction.rename(selectedShow.getPath().resolve(selectedShow.fileName), selectedShow); } model.removeShow(selectedShow); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java index 8b557b02..2947bf46 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java @@ -31,7 +31,7 @@ public MovieReleaseControl(MovieRelease movieRelease, Settings settings, Manager @Override public void process() throws ReleaseControlException { - if (StringUtils.isBlank(movieRelease.getName())) { + if (StringUtils.isBlank(movieRelease.name)) { throw new ReleaseControlException("Unable to extract/find title, check file", movieRelease); } else { int imdbId = imdbAdapter.getImdbId(movieRelease.getName(), movieRelease.getYear()) @@ -44,8 +44,8 @@ public void process() throws ReleaseControlException { movieDetails = movieRelease.getImdbId().mapToObj(omdbAdapter::getMovieDetails).orElseGet(Optional::empty); } movieDetails.ifPresentOrElse(info -> { - movieRelease.setYear(info.year()); - movieRelease.setName(info.name); + movieRelease.year = info.year(); + movieRelease.name = info.name; }, () -> LOGGER.error("Unable to get details from OMDB API, continue with filename info {}", movieRelease)); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java index 52f2cfc7..8ad06662 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java @@ -17,7 +17,7 @@ public boolean useSubtitle(Release release, Subtitle subtitle) { if (subtitle.getReleaseGroup().isEmpty()) { subtitle.setReleaseGroup(ReleaseParser.extractReleasegroup(subtitle.getFileName(), subtitle.getFileName().endsWith(".srt"))); } - if (!StringUtils.containsAnyIgnoreCase(subtitle.getReleaseGroup(), release.getReleaseGroup(), subtitle.getReleaseGroup())) { + if (!StringUtils.containsAnyIgnoreCase(subtitle.getReleaseGroup(), release.releaseGroup, subtitle.getReleaseGroup())) { return false; } LOGGER.debug("getSubtitlesFiltered: found KEYWORD based TEAM match [{}] ", subtitle.getFileName()); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java index 0c01e079..357aefab 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java @@ -15,7 +15,7 @@ public boolean excludeSubtitle(Release release, Subtitle subtitle) { } protected String getReleaseName(Release release) { - return release.getFileName() == null ? "" : release.getFileName().toLowerCase().replace("." + release.getExtension(), ""); + return release.fileName == null ? "" : release.fileName.toLowerCase().replace("." + release.extension, ""); } protected boolean checkKeywordSubtitleMatch(Subtitle subtitle, String keywordsFile) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeight.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeight.java index fc732bc0..fcc2a6ba 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeight.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeight.java @@ -33,9 +33,9 @@ protected void setWeights(Release release, Map defaultWeights) replaceReservedKeywords(release, defaultWeights); /* get a list of tags */ - List tags = ReleaseParser.getQualityKeyWords(release.getQuality()); - if (StringUtils.isNotBlank(release.getReleaseGroup())) { - tags.add(release.getReleaseGroup().toLowerCase()); + List tags = ReleaseParser.getQualityKeyWords(release.quality); + if (StringUtils.isNotBlank(release.releaseGroup)) { + tags.add(release.releaseGroup.toLowerCase()); } /* only store tags for which we have a weight defined */ diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/replacers/GroupReplacer.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/replacers/GroupReplacer.java index cf46a3ef..be7a412b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/replacers/GroupReplacer.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/replacers/GroupReplacer.java @@ -19,7 +19,7 @@ public void replace(Release release, Map weights) { weights.remove(reservedKey); /* add replaced value */ - String group = StringUtils.lowerCase(release.getReleaseGroup()); + String group = StringUtils.lowerCase(release.releaseGroup); weights.put(group, weight); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index 9871eafa..eccf6a5a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -137,12 +137,12 @@ public Path build(Release release) { filename = replace(filename, SerieStructureTag.EPISODE_LONG, formattedNumber(tvRelease.getEpisodeNumbers().get(0), true)); filename = replace(filename, SerieStructureTag.EPISODE_SHORT, formattedNumber(tvRelease.getEpisodeNumbers().get(0), false)); filename = replace(filename, SerieStructureTag.TITLE, tvRelease.getTitle()); - filename = replace(filename, SerieStructureTag.QUALITY, release.getQuality()); - filename = replace(filename, SerieStructureTag.DESCRIPTION, release.getDescription()); + filename = replace(filename, SerieStructureTag.QUALITY, release.quality); + filename = replace(filename, SerieStructureTag.DESCRIPTION, release.description); - filename += "." + release.getExtension(); + filename += "." + release.extension; } else { - filename = release.getFileName(); + filename = release.fileName; } filename = filename.removeIllegalWindowsChars(); if (replaceSpace) { @@ -150,7 +150,7 @@ public Path build(Release release) { } return Path.of(filename); } else { - return Path.of(release.getFileName()); + return Path.of(release.fileName); } } @@ -159,13 +159,13 @@ public String buildSubtitle(Release release, Subtitle sub, String filename, Inte } public String buildSubtitle(Release release, String filename, Language language, Integer version) { - final String extension = "." + release.getExtension(); + final String extension = "." + release.extension; if (version != null) { - filename = filename.substring(0, filename.indexOf(extension)) + "-v" + version + "." + release.getExtension(); + filename = filename.substring(0, filename.indexOf(extension)) + "-v$version.${release.extension}"; } if (includeLanguageCode) { String langCode = language == null ? "" : languageTags.getOrDefault(language, language.getLangCode()); - filename = changeExtension(filename, !"".equals(langCode) ? ".%s.srt".formatted(langCode) : ".srt"); + filename = changeExtension(filename, !"".equals(langCode) ? ".$langCode.srt" : ".srt"); } else { filename = changeExtension(filename, ".srt"); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java index 79d09418..bd79226e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java @@ -140,8 +140,8 @@ private Path buildEpisode(TvRelease tvRelease) { folder = replace(folder, SerieStructureTag.EPISODE_LONG, formattedNumber(tvRelease.getEpisodeNumbers().get(0), true)); folder = replace(folder, SerieStructureTag.EPISODE_SHORT, formattedNumber(tvRelease.getEpisodeNumbers().get(0), false)); folder = replace(folder, SerieStructureTag.TITLE, tvRelease.getTitle()); - folder = replace(folder, SerieStructureTag.QUALITY, tvRelease.getQuality()); - folder = replace(folder, SerieStructureTag.DESCRIPTION, tvRelease.getDescription()); + folder = replace(folder, SerieStructureTag.QUALITY, tvRelease.quality); + folder = replace(folder, SerieStructureTag.DESCRIPTION, tvRelease.description); if (replaceSpace) { folder = folder.replace(' ', replacingSpaceChar); } @@ -152,9 +152,9 @@ private Path buildEpisode(TvRelease tvRelease) { private Path buildMovie(MovieRelease movieRelease) { String folder = structure; - folder = replace(folder, MovieStructureTag.MOVIE_TITLE, movieRelease.getName().removeIllegalWindowsChars()); - folder = replace(folder, MovieStructureTag.YEAR, Integer.toString(movieRelease.getYear())); - folder = replace(folder, MovieStructureTag.QUALITY, movieRelease.getQuality()); + folder = replace(folder, MovieStructureTag.MOVIE_TITLE, movieRelease.name.removeIllegalWindowsChars()); + folder = replace(folder, MovieStructureTag.YEAR, Integer.toString(movieRelease.year)); + folder = replace(folder, MovieStructureTag.QUALITY, movieRelease.quality); if (replaceSpace) { folder = folder.replace(' ', replacingSpaceChar); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index c0e15951..5e64b787 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -115,7 +115,7 @@ public Set searchSubtitles(MovieRelease movieRelease, Language languag Set listFoundSubtitles = new HashSet<>(); ReleaseParser releaseParser = new ReleaseParser(); - String filter = movieRelease.getName(); + String filter = movieRelease.name; for (Path fileSub : getPossibleSubtitles(filter)) { try { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 3ec34dc4..01e6e2a1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -50,8 +50,8 @@ default UserInteractionSettingsIntf getUserInteractionSettings() { @Override default Set searchSubtitles(MovieRelease movieRelease, Language language) { Set subtitles = new HashSet<>(); - if (StringUtils.isNotBlank(movieRelease.getFileName())) { - Path file = movieRelease.getPath().resolve(movieRelease.getFileName()); + if (StringUtils.isNotBlank(movieRelease.fileName)) { + Path file = movieRelease.getPath().resolve(movieRelease.fileName); if (file.exists()) { try { subtitles.addAll(searchMovieSubtitlesWithHash(OpenSubtitlesHasher.computeHash(file), language)); @@ -59,7 +59,7 @@ default Set searchSubtitles(MovieRelease movieRelease, Language langua LOGGER.error("Error calculating file hash", e); } catch (Exception e) { LOGGER.error("API %s searchSubtitles using file hash for movie [%s] (%s)".formatted(getSubtitleSource().getName(), - movieRelease.getName(), e.getMessage()), e); + movieRelease.name, e.getMessage()), e); } } } @@ -68,15 +68,15 @@ default Set searchSubtitles(MovieRelease movieRelease, Language langua subtitles.addAll(searchMovieSubtitlesWithId(imdbId, language)); } catch (Exception e) { LOGGER.error("API %s searchSubtitles using imdbid [%s] for movie [%s] (%s)".formatted(getSubtitleSource().getName(), - imdbId, movieRelease.getName(), e.getMessage()), e); + imdbId, movieRelease.name, e.getMessage()), e); } }); if (subtitles.isEmpty()) { try { - subtitles.addAll(searchMovieSubtitlesWithName(movieRelease.getName(), movieRelease.getYear(), language)); + subtitles.addAll(searchMovieSubtitlesWithName(movieRelease.name, movieRelease.year, language)); } catch (Exception e) { LOGGER.error("API %s searchSubtitles using title for movie [%s] (%s)".formatted(getSubtitleSource().getName(), - movieRelease.getName(), e.getMessage()), e); + movieRelease.name, e.getMessage()), e); } } return convertToSubtitles(movieRelease, subtitles, language); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index 1113f442..ae07a193 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -101,7 +101,7 @@ public List searchMovieSubtitlesWithName(Strin @Override public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, Language language) { return subtitles.stream().map(org.opensubtitles.model.Subtitle::getAttributes) - .filter(attributes -> movieRelease.getYear() == attributes.getFeatureDetails().getYear().intValue()) + .filter(attributes -> movieRelease.year == attributes.getFeatureDetails().getYear().intValue()) .flatMap(attributes -> attributes.getFiles().stream().map(file -> createSubtitle(file, attributes))) .collect(Collectors.toSet()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java index c8d103f0..6cd84178 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java @@ -104,7 +104,7 @@ public List getSubtitles(SerieMapping providerSerieI .setUploader(row.select(".a5 > a").text().trim()) .setComment(row.select(".a6 > div").text().trim())) .filter(subDescriptor -> subDescriptor.getSeasonEpisode() != null - && subDescriptor.getSeasonEpisode().getEpisodes().stream().anyMatch(ep -> ep == episode)) + && subDescriptor.getSeasonEpisode().episodes.stream().anyMatch(ep -> ep == episode)) .toList(); } catch (Exception e) { throw new SubsceneException(e); diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java index 43177282..7ce92e63 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java @@ -106,9 +106,9 @@ private Settings createSettings(boolean keyword, boolean exact, boolean excludeh private Release createRelease(String filename, String releasegroup) { Release release = mock(Release.class); - when(release.getFileName()).thenReturn(filename); - when(release.getExtension()).thenReturn("mkv"); - when(release.getReleaseGroup()).thenReturn(releasegroup); + when(release.fileName).thenReturn(filename); + when(release.extension).thenReturn("mkv"); + when(release.releaseGroup).thenReturn(releasegroup); return release; } diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java index 311ebc7f..ef314f41 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java @@ -53,8 +53,8 @@ private Subtitle createSubtitle(String filename, String quality, String team) { private SortWeight createWeights(String quality, String group) { // Arrested.Development.S01E01.DVDRip.XviD-MEDiEVAL Release release = mock(Release.class); - when(release.getQuality()).thenReturn(quality); - when(release.getReleaseGroup()).thenReturn(group); + when(release.quality).thenReturn(quality); + when(release.releaseGroup).thenReturn(group); HashMap definedWeights = new HashMap<>(); definedWeights.put("hdtv", 2); diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeightTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeightTest.java index 16651f04..34a634ce 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeightTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeightTest.java @@ -15,8 +15,8 @@ class SortWeightTest { void test_it_generates_weights_for_release() throws Exception { // Arrested.Development.S01E01.DVDRip.XviD-MEDiEVAL Release release = mock(Release.class); - when(release.getQuality()).thenReturn("DVDRip XviD"); - when(release.getReleaseGroup()).thenReturn("MEDiEVAL"); + when(release.quality).thenReturn("DVDRip XviD"); + when(release.releaseGroup).thenReturn("MEDiEVAL"); HashMap definedWeights = new HashMap<>(); definedWeights.put("dvdrip", 2); diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/replacers/GroupReplacerTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/replacers/GroupReplacerTest.java index 8cdf59d4..70d23619 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/replacers/GroupReplacerTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/replacers/GroupReplacerTest.java @@ -21,7 +21,7 @@ public void setUp() throws Exception { @Test void test_it_replaces_the_keyword_group_to_a_releasename() throws Exception { Release release = mock(Release.class); - when(release.getReleaseGroup()).thenReturn("Acme"); + when(release.releaseGroup).thenReturn("Acme"); HashMap definedWeights = new HashMap<>(); definedWeights.put("%GROUP%", 5); @@ -38,7 +38,7 @@ void test_it_replaces_the_keyword_group_to_a_releasename() throws Exception { @Test void testEmptyWeights() throws Exception { Release release = mock(Release.class); - when(release.getReleaseGroup()).thenReturn("Acme"); + when(release.releaseGroup).thenReturn("Acme"); HashMap definedWeights = new HashMap<>(); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java index 4c3c2636..09a11b9f 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java @@ -6,16 +6,14 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import org.apache.commons.lang3.StringUtils; +import manifold.ext.props.rt.api.var; -@Getter -@Setter public class MovieRelease extends Release { - private String name; - private Integer year; - private int imdbId; - private int tvdbId; + @var String name; + @var Integer year; + @Getter @Setter private int imdbId; + @Getter @Setter private int tvdbId; public interface MovieReleaseBuilderName { MovieReleaseBuilderOther name(String name); @@ -63,7 +61,7 @@ private MovieRelease(Path file, String description, String releaseGroup, String } public String getImdbIdAsString() { - return "tt" + StringUtils.leftPad(String.valueOf(imdbId), 7, "0"); + return "tt" + String.format("%07d", imdbId); } public OptionalInt getTvdbId() { @@ -76,11 +74,11 @@ public OptionalInt getImdbId() { @Override public String toString() { - return this.getClass().getSimpleName() + ": " + this.getName() + " " + this.getQuality() + " " + this.getReleaseGroup(); + return "${getClass().getSimpleName()}: $name ${quality} ${releaseGroup}"; } @Override public String getReleaseDescription() { - return getName(); + return name; } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java index 0dcec907..c12ad6cc 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java @@ -6,17 +6,16 @@ import java.util.List; import java.util.Set; -import lombok.Getter; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; -@Getter public abstract class Release extends Video { - private final Set matchingSubs = new HashSet<>(); - private final Path path; - private final String quality; - private final String description; - private final String releaseGroup; + @val Set matchingSubs = new HashSet<>(); + @val Path path; + @val String quality; + @val String description; + @val String releaseGroup; public void addMatchingSub(Subtitle sub) { matchingSubs.add(sub); @@ -47,19 +46,19 @@ public Path getPath() { } public String getExtension() { - return StringUtils.substringAfterLast(getFileName(), "."); + return StringUtils.substringAfterLast(fileName, "."); } public boolean hasExtension(String extension) { - return StringUtils.endsWith(getFileName(), "." + extension); + return StringUtils.endsWith(fileName, "." + extension); } @Override public String toString() { - return this.getClass().getSimpleName() + ": " + this.getFileName() + " " + this.getQuality(); + return "${getClass().getSimpleName()}: $fileName $quality"; } public String getReleaseDescription() { - return getFileName(); + return fileName; } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/SeasonEpisode.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/SeasonEpisode.java index d56481fd..f93db1cd 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/SeasonEpisode.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/SeasonEpisode.java @@ -6,17 +6,15 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import lombok.Getter; +import manifold.ext.props.rt.api.val; public class SeasonEpisode { private static final Pattern SEASON_EPISODE_PATTERN_1 = Pattern.compile("S(\\d{1,2})E(\\d{1,2})"); private static final Pattern SEASON_EPISODE_PATTERN_2 = Pattern.compile("[. ](\\d{1,2})x(\\d{1,2})"); private static final Pattern SEASON_EPISODES_PATTERN_1 = Pattern.compile("S(\\d{1,2})E(\\d{1,2})E(\\d{1,2})"); - @Getter - private final int season; - @Getter - private final List episodes; + @val int season; + @val List episodes; public SeasonEpisode(int season, int episode) { this.season = season; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java index 91698a34..c3b8d8eb 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java @@ -138,8 +138,7 @@ public int getFirstEpisodeNumber() { @Override public String toString() { - return this.getClass().getSimpleName() + ": " + this.getName() + " s" + this.getSeason() + " e" - + this.getEpisodeNumbers().toString() + " " + this.getQuality() + " " + this.getReleaseGroup(); + return "${getClass().getSimpleName()}: $name s$season e$episodeNumbers $quality $releaseGroup"; } @Override diff --git a/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java b/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java index eb0f50e5..f07a8d91 100644 --- a/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java +++ b/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java @@ -37,14 +37,14 @@ void testListGetQualityKeyWords() throws Exception { Path file = Path.of("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.mkv"); Release release = releaseparser.parse(file); - List q = ReleaseParser.getQualityKeyWords(release.getQuality()); + List q = ReleaseParser.getQualityKeyWords(release.quality); assertThat(q).containsExactly("720p", "hdtv", "x264"); file = Path.of("The.Drop.2014.1080p.WEB-DL.DD5.1.H264-RARBG.mkv"); release = releaseparser.parse(file); - q = ReleaseParser.getQualityKeyWords(release.getQuality()); + q = ReleaseParser.getQualityKeyWords(release.quality); assertThat(q).containsExactly("1080p", "web-dl", "dd5 1", "h264"); } @@ -57,10 +57,10 @@ void testTV() throws Exception { Release release = releaseparser.parse(file); assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); - assertThat(release.getExtension()).isEqualTo("mkv"); - assertThat(release.getFileName()).isEqualTo("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.mkv"); - assertThat(release.getReleaseGroup()).isEqualTo("DIMENSION"); - assertThat(release.getQuality()).isEqualTo("720p hdtv x264"); + assertThat(release.extension).isEqualTo("mkv"); + assertThat(release.fileName).isEqualTo("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.mkv"); + assertThat(release.releaseGroup).isEqualTo("DIMENSION"); + assertThat(release.quality).isEqualTo("720p hdtv x264"); TvRelease tvrelease = (TvRelease) release; @@ -72,10 +72,10 @@ void testTV() throws Exception { release = releaseparser.parse(file); assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); - assertThat(release.getExtension()).isEqualTo("mkv"); - assertThat(release.getFileName()).isEqualTo("S04E02 - White Collar - Most Wanted.mkv"); - assertThat(release.getReleaseGroup()).isEqualTo(""); - assertThat(release.getQuality()).isEqualTo(""); + assertThat(release.extension).isEqualTo("mkv"); + assertThat(release.fileName).isEqualTo("S04E02 - White Collar - Most Wanted.mkv"); + assertThat(release.releaseGroup).isEqualTo(""); + assertThat(release.quality).isEqualTo(""); tvrelease = (TvRelease) release; @@ -87,11 +87,10 @@ void testTV() throws Exception { release = releaseparser.parse(file); assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); - assertThat(release.getExtension()).isEqualTo("mkv"); - assertEquals(release.getFileName(), - "Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv"); - assertThat(release.getReleaseGroup()).isEqualTo("DIMENSION"); - assertThat(release.getQuality()).isEqualTo("720p hdtv x264"); + assertThat(release.extension).isEqualTo("mkv"); + assertEquals(release.fileName, "Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv"); + assertThat(release.releaseGroup).isEqualTo("DIMENSION"); + assertThat(release.quality).isEqualTo("720p hdtv x264"); tvrelease = (TvRelease) release; @@ -103,10 +102,10 @@ void testTV() throws Exception { release = releaseparser.parse(file); assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); - assertThat(release.getExtension()).isEqualTo("mp4"); - assertThat(release.getFileName()).isEqualTo("hawaii.five-0.2010.410.hdtv-lol.mp4"); - assertThat(release.getReleaseGroup()).isEqualTo("lol"); - assertThat(release.getQuality()).isEqualTo("hdtv"); + assertThat(release.extension).isEqualTo("mp4"); + assertThat(release.fileName).isEqualTo("hawaii.five-0.2010.410.hdtv-lol.mp4"); + assertThat(release.releaseGroup).isEqualTo("lol"); + assertThat(release.quality).isEqualTo("hdtv"); tvrelease = (TvRelease) release; @@ -118,10 +117,10 @@ void testTV() throws Exception { release = releaseparser.parse(file); assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); - assertThat(release.getExtension()).isEqualTo("mkv"); - assertThat(release.getFileName()).isEqualTo("Greys.Anatomy.S10E01E02.720p.HDTV.X264-DIMENSION.mkv"); - assertThat(release.getReleaseGroup()).isEqualTo("DIMENSION"); - assertThat(release.getQuality()).isEqualTo("720p hdtv x264"); + assertThat(release.extension).isEqualTo("mkv"); + assertThat(release.fileName).isEqualTo("Greys.Anatomy.S10E01E02.720p.HDTV.X264-DIMENSION.mkv"); + assertThat(release.releaseGroup).isEqualTo("DIMENSION"); + assertThat(release.quality).isEqualTo("720p hdtv x264"); tvrelease = (TvRelease) release; @@ -148,43 +147,43 @@ void testMovie() throws Exception { Release release = releaseparser.parse(file); assertThat(release.getVideoType()).isEqualTo(VideoType.MOVIE); - assertThat(release.getExtension()).isEqualTo("mkv"); - assertThat(release.getFileName()).isEqualTo("Back.to.the.Future.Part.II.1989.720p.BluRay.X264-AMIABLE.mkv"); - assertThat(release.getReleaseGroup()).isEqualTo("AMIABLE"); - assertThat(release.getQuality()).isEqualTo("720p bluray x264"); + assertThat(release.extension).isEqualTo("mkv"); + assertThat(release.fileName).isEqualTo("Back.to.the.Future.Part.II.1989.720p.BluRay.X264-AMIABLE.mkv"); + assertThat(release.releaseGroup).isEqualTo("AMIABLE"); + assertThat(release.quality).isEqualTo("720p bluray x264"); MovieRelease movieRelease = (MovieRelease) release; - assertThat((int) movieRelease.getYear()).isEqualTo(1989); - assertThat(movieRelease.getName()).isEqualTo("Back to the Future Part II"); + assertThat(movieRelease.year).isEqualTo(1989); + assertThat(movieRelease.name).isEqualTo("Back to the Future Part II"); file = Path.of("The.Equalizer.2014.720p.BluRay.x264-SPARKS.mkv"); release = releaseparser.parse(file); assertThat(release.getVideoType()).isEqualTo(VideoType.MOVIE); - assertThat(release.getExtension()).isEqualTo("mkv"); - assertThat(release.getFileName()).isEqualTo("The.Equalizer.2014.720p.BluRay.x264-SPARKS.mkv"); - assertThat(release.getReleaseGroup()).isEqualTo("SPARKS"); - assertThat(release.getQuality()).isEqualTo("720p bluray x264"); + assertThat(release.extension).isEqualTo("mkv"); + assertThat(release.fileName).isEqualTo("The.Equalizer.2014.720p.BluRay.x264-SPARKS.mkv"); + assertThat(release.releaseGroup).isEqualTo("SPARKS"); + assertThat(release.quality).isEqualTo("720p bluray x264"); movieRelease = (MovieRelease) release; - assertThat((int) movieRelease.getYear()).isEqualTo(2014); - assertThat(movieRelease.getName()).isEqualTo("The Equalizer"); + assertThat(movieRelease.year).isEqualTo(2014); + assertThat(movieRelease.name).isEqualTo("The Equalizer"); file = Path.of("The.Trip.to.Italy.2014.LIMITED.720p.BluRay.x264-GECKOS.mkv"); release = releaseparser.parse(file); assertThat(release.getVideoType()).isEqualTo(VideoType.MOVIE); - assertThat(release.getExtension()).isEqualTo("mkv"); + assertThat(release.extension).isEqualTo("mkv"); assertEquals(release.getFileName(), "The.Trip.to.Italy.2014.LIMITED.720p.BluRay.x264-GECKOS.mkv"); - assertThat(release.getReleaseGroup()).isEqualTo("GECKOS"); - assertThat(release.getQuality()).isEqualTo("720p bluray x264"); + assertThat(release.releaseGroup).isEqualTo("GECKOS"); + assertThat(release.quality).isEqualTo("720p bluray x264"); movieRelease = (MovieRelease) release; - assertThat((int) movieRelease.getYear()).isEqualTo(2014); - assertThat(movieRelease.getName()).isEqualTo("The Trip to Italy"); + assertThat(movieRelease.year).isEqualTo(2014); + assertThat(movieRelease.name).isEqualTo("The Trip to Italy"); } } From b9268cd946a9b1b669aba5310ba8ff57d92d13a4 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 2 Jun 2024 22:51:42 +0200 Subject: [PATCH 15/54] changes --- .../subtools/multisubdownloader/CLI.java | 4 +- .../subtools/multisubdownloader/GUI.java | 12 +++--- .../UserInteractionHandler.java | 4 +- .../actions/DownloadAction.java | 16 ++++---- .../actions/UserInteractionHandlerAction.java | 2 +- .../gui/extra/table/VideoTableModel.java | 6 +-- .../control/subtitles/SubtitleFiltering.java | 2 +- .../subtitles/filters/ExactNameFilter.java | 6 +-- .../subtitles/filters/KeywordFilter.java | 8 ++-- .../subtitles/filters/ReleaseGroupFilter.java | 10 ++--- .../subtitles/filters/SubtitleFilter.java | 2 +- .../subtitles/sorting/ScoreCalculator.java | 2 +- .../subtitles/sorting/SubtitleComparator.java | 2 +- .../lib/library/FilenameLibraryBuilder.java | 2 +- .../workers/SearchManager.java | 2 +- .../subtitles/SubtitleFilteringTest.java | 8 ++-- .../sorting/ScoreCalculatorTest.java | 6 +-- .../subtools/sublibrary/model/Release.java | 8 ++-- .../subtools/sublibrary/model/Subtitle.java | 37 +++++++++---------- 19 files changed, 67 insertions(+), 72 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 13aed56b..cd69cec5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -134,9 +134,9 @@ private void download(Release release) { System.out.println("No subtitles found for: ${release.fileName}"); } else { IntStream.range(0, selection.size()).forEach(j -> { - System.out.println("Downloading subtitle: " + release.getMatchingSubs().get(0).getFileName()); + System.out.println("Downloading subtitle: " + release.matchingSubs.get(j).fileName); try { - downloadAction.download(release, release.getMatchingSubs().get(j), selection.size() == 1 ? null : j + 1); + downloadAction.download(release, release.matchingSubs.get(j), selection.size() == 1 ? null : j + 1); } catch (IOException | ManagerException e) { LOGGER.error("Error while downloading subtitle for %s (%s)".formatted(release.getReleaseDescription(), e.getMessage()), e); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index 30c0ee7d..cfa2db84 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -416,21 +416,19 @@ private void downloadText() { if ((Boolean) model.getValueAt(i, subtitleTable.getColumnIdByName(SearchColumnName.SELECT))) { final Subtitle subtitle = (Subtitle) model.getValueAt(i, subtitleTable.getColumnIdByName(SearchColumnName.OBJECT)); String filename = ""; - if (!subtitle.getFileName().endsWith(".srt")) { - filename = subtitle.getFileName() + ".srt"; + if (!subtitle.fileName.endsWith(".srt")) { + filename = subtitle.fileName + ".srt"; } if (OsCheck.getOperatingSystemType() == OSType.Windows) { filename = filename.removeIllegalWindowsChars(); } try { - if (subtitle.getSourceLocation() == Subtitle.SourceLocation.FILE) { - subtitle.getFile().copyToDir(path); + if (subtitle.sourceLocation == Subtitle.SourceLocation.FILE) { + subtitle.file.copyToDir(path); } else { Manager manager = (Manager) this.app.make("Manager"); - String url = - subtitle.getSourceLocation() == Subtitle.SourceLocation.URL ? subtitle.getUrl() - : subtitle.getUrlSupplier().get(); + String url = subtitle.sourceLocation == Subtitle.SourceLocation.URL ? subtitle.url : subtitle.urlSupplier.get(); manager.store(url, path.resolve(filename)); } } catch (IOException | ManagerException e) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java index f34521a6..94c02e85 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java @@ -10,11 +10,11 @@ public interface UserInteractionHandler extends org.lodder.subtools.sublibrary.u default List getAutomaticSelection(List subtitles) { List shortlist = !getSettings().isOptionsMinAutomaticSelection ? subtitles : subtitles.stream() - .filter(subtitle -> subtitle.getScore() >= getSettings().optionsMinAutomaticSelectionValue) + .filter(subtitle -> subtitle.score >= getSettings().optionsMinAutomaticSelectionValue) .toList(); if (getSettings().isOptionsDefaultSelection) { List defaultSelectionsFound = getSettings().optionsDefaultSelectionQualityList.stream() - .flatMap(q -> shortlist.stream().filter(subtitle -> q.isTypeForValue(subtitle.getQuality()))) + .flatMap(q -> shortlist.stream().filter(subtitle -> q.isTypeForValue(subtitle.quality))) .distinct().toList(); if (!defaultSelectionsFound.isEmpty()) { return defaultSelectionsFound; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java index 429446fa..fb13a51e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java @@ -41,7 +41,7 @@ public void download(Release release, Subtitle subtitle, Integer version) throws } public void download(Release release, Subtitle subtitle) throws IOException, ManagerException { - LOGGER.info("Downloading subtitle: [{}] for release: [{}]", subtitle.getFileName(), release.fileName); + LOGGER.info("Downloading subtitle: [{}] for release: [{}]", subtitle.fileName, release.fileName); download(release, subtitle, 0); } @@ -64,13 +64,13 @@ private void download(Release release, Subtitle subtitle, LibrarySettings librar Path subFile = path.resolve(subFileName); boolean success; - if (subtitle.getSourceLocation() == Subtitle.SourceLocation.FILE) { - subtitle.getFile().copyToDir(path); + if (subtitle.sourceLocation == Subtitle.SourceLocation.FILE) { + subtitle.file.copyToDir(path); success = true; } else { String url; try { - url = subtitle.getSourceLocation() == Subtitle.SourceLocation.URL ? subtitle.getUrl() : subtitle.getUrlSupplier().get(); + url = subtitle.sourceLocation == Subtitle.SourceLocation.URL ? subtitle.url : subtitle.urlSupplier.get(); success = manager.store(url, subFile); LOGGER.debug("doDownload file was [{}] ", success); } catch (SubtitlesProviderException e) { @@ -90,13 +90,13 @@ private void download(Release release, Subtitle subtitle, LibrarySettings librar CleanAction cleanAction = new CleanAction(librarySettings); cleanAction.cleanUpFiles(release, path, videoFileName); } - if (librarySettings.isLibraryRemoveEmptyFolders() && release.getPath().isEmptyDir()) { - release.getPath().deletePath(); + if (librarySettings.isLibraryRemoveEmptyFolders() && release.path.isEmptyDir()) { + release.path.deletePath(); } } } if (librarySettings.isLibraryBackupSubtitle()) { - String langFolder = subtitle.getLanguage() == null ? Language.ENGLISH.getName() : subtitle.getLanguage().getName(); + String langFolder = subtitle.language == null ? Language.ENGLISH.getName() : subtitle.language.getName(); Path backupPath = librarySettings.getLibraryBackupSubtitlePath().resolve(langFolder); if (!backupPath.exists()) { @@ -108,7 +108,7 @@ private void download(Release release, Subtitle subtitle, LibrarySettings librar } if (librarySettings.isLibraryBackupUseWebsiteFileName()) { - subFile.copyToDirAndRename(backupPath, subtitle.getFileName()); + subFile.copyToDirAndRename(backupPath, subtitle.fileName); } else { subFile.copyToDirAndRename(backupPath, subFileName); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java index 3b8baa64..728962eb 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java @@ -50,7 +50,7 @@ public List subtitleSelection(Release release, final boolean subtitleS if (settings.optionsAlwaysConfirm) { return userInteractionHandler.selectSubtitles(release); } else if (release.getMatchingSubs().size() == 1 - && release.getMatchingSubs().get(0).getSubtitleMatchType() == SubtitleMatchType.EXACT) { + && release.getMatchingSubs().get(0).subtitleMatchType == SubtitleMatchType.EXACT) { LOGGER.debug("determineWhatSubtitleDownload: Exact Match"); return List.of(release.getMatchingSubs().get(0)); } else if (release.getMatchingSubs().size() > 1) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java index ee0bb6d1..939916ed 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java @@ -140,11 +140,11 @@ public boolean isSelected() { public void addRow(Subtitle subtitle) { synchronized (this) { Vector row = SUBTITLE_COLUMNS.stream().map(searchColumn -> switch (searchColumn) { - case FILENAME -> subtitle.getFileName(); + case FILENAME -> subtitle.fileName; case SELECT -> false; case OBJECT -> subtitle; - case SOURCE -> subtitle.getSubtitleSource(); - case SCORE -> subtitle.getScore(); + case SOURCE -> subtitle.subtitleSource; + case SCORE -> subtitle.score; default -> throw new IllegalArgumentException("Unexpected value: " + searchColumn); }).collect(Collectors.toCollection(Vector::new)); this.addRow(row); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java index a0f26627..3418cbed 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFiltering.java @@ -28,7 +28,7 @@ public boolean excludeSubtitle(Subtitle subtitle, Release release) { } private boolean excludeSubtitleHearingImpaired(Subtitle subtitle, Release release) { - return settings.optionSubtitleExcludeHearingImpaired && subtitle.isHearingImpaired(); + return settings.optionSubtitleExcludeHearingImpaired && subtitle.hearingImpaired; } private boolean excludeSubtitleKeywordMatch(Subtitle subtitle, Release release) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java index 04af46a9..8a7e31a2 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java @@ -20,9 +20,9 @@ public class ExactNameFilter extends SubtitleFilter { public boolean useSubtitle(Release release, Subtitle subtitle) { Pattern p = patterns.computeIfAbsent(getReleaseName(release), k -> Pattern.compile(getReleaseName(release).replace(" ", "[. ]"), Pattern.CASE_INSENSITIVE)); - if (p.matcher(subtitle.getFileName().toLowerCase().replace(".srt", "")).matches()) { - LOGGER.debug("getSubtitlesFiltered: found EXACT match [{}] ", subtitle.getFileName()); - subtitle.setSubtitleMatchType(SubtitleMatchType.EXACT); + if (p.matcher(subtitle.fileName.toLowerCase().replace(".srt", "")).matches()) { + LOGGER.debug("getSubtitlesFiltered: found EXACT match [{}] ", subtitle.fileName); + subtitle.subtitleMatchType = SubtitleMatchType.EXACT; return true; } return false; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java index dc76727f..bf84a035 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java @@ -15,14 +15,14 @@ public class KeywordFilter extends SubtitleFilter { public boolean useSubtitle(Release release, Subtitle subtitle) { String keywordsFile = ReleaseParser.getQualityKeyword(getReleaseName(release)); - if (subtitle.getQuality().isEmpty()) { - subtitle.setQuality(ReleaseParser.getQualityKeyword(subtitle.getFileName())); + if (subtitle.quality.isEmpty()) { + subtitle.quality = ReleaseParser.getQualityKeyword(subtitle.fileName); } if (!checkKeywordSubtitleMatch(subtitle, keywordsFile)) { return false; } - LOGGER.debug("getSubtitlesFiltered: found KEYWORD match [{}] ", subtitle.getFileName()); - subtitle.setSubtitleMatchType(SubtitleMatchType.KEYWORD); + LOGGER.debug("getSubtitlesFiltered: found KEYWORD match [{}] ", subtitle.fileName); + subtitle.subtitleMatchType = SubtitleMatchType.KEYWORD; return true; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java index 8ad06662..e90060f7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java @@ -14,14 +14,14 @@ public class ReleaseGroupFilter extends SubtitleFilter { @Override public boolean useSubtitle(Release release, Subtitle subtitle) { - if (subtitle.getReleaseGroup().isEmpty()) { - subtitle.setReleaseGroup(ReleaseParser.extractReleasegroup(subtitle.getFileName(), subtitle.getFileName().endsWith(".srt"))); + if (subtitle.releaseGroup.isEmpty()) { + subtitle.releaseGroup = ReleaseParser.extractReleasegroup(subtitle.fileName, subtitle.fileName.endsWith(".srt")); } - if (!StringUtils.containsAnyIgnoreCase(subtitle.getReleaseGroup(), release.releaseGroup, subtitle.getReleaseGroup())) { + if (!StringUtils.containsAnyIgnoreCase(subtitle.releaseGroup, release.releaseGroup, subtitle.releaseGroup)) { return false; } - LOGGER.debug("getSubtitlesFiltered: found KEYWORD based TEAM match [{}] ", subtitle.getFileName()); - subtitle.setSubtitleMatchType(SubtitleMatchType.TEAM); + LOGGER.debug("getSubtitlesFiltered: found KEYWORD based TEAM match [{}] ", subtitle.fileName); + subtitle.subtitleMatchType = SubtitleMatchType.TEAM; return true; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java index 357aefab..1437c85c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java @@ -19,7 +19,7 @@ protected String getReleaseName(Release release) { } protected boolean checkKeywordSubtitleMatch(Subtitle subtitle, String keywordsFile) { - String keywordsSub = ReleaseParser.getQualityKeyword(subtitle.getFileName()); + String keywordsSub = ReleaseParser.getQualityKeyword(subtitle.fileName); return keywordsFile.equalsIgnoreCase(keywordsSub) || keywordCheck(keywordsFile, keywordsSub); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java index c50555e7..bca362f0 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java @@ -15,7 +15,7 @@ public int calculate(Subtitle subtitle) { return 0; } - String subtitleInfo = "%s %s %s".formatted(subtitle.getFileName(), subtitle.getQuality(), subtitle.getReleaseGroup()).trim().toLowerCase(); + String subtitleInfo = "${subtitle.fileName} ${subtitle.quality} ${subtitle.releaseGroup}".trim().toLowerCase(); int score = weights.getWeights().keySet().stream().filter(subtitleInfo::contains).mapToInt(weights.getWeights()::get).sum(); return (int) Math.ceil((float) score / weights.getMaxScore() * 100); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SubtitleComparator.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SubtitleComparator.java index 09ad5f68..a83f0b39 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SubtitleComparator.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SubtitleComparator.java @@ -14,6 +14,6 @@ public class SubtitleComparator implements Comparator, Serializable { @Override public int compare(Subtitle a, Subtitle b) { /* inverse sorting */ - return Integer.compare(b.getScore(), a.getScore()); + return Integer.compare(b.score, a.score); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index eccf6a5a..ebae9787 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -155,7 +155,7 @@ public Path build(Release release) { } public String buildSubtitle(Release release, Subtitle sub, String filename, Integer version) { - return buildSubtitle(release, filename, sub.getLanguage(), version); + return buildSubtitle(release, filename, sub.language, version); } public String buildSubtitle(Release release, String filename, Language language, Integer version) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java index 58caf995..5ea9174b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java @@ -110,7 +110,7 @@ public void onCompleted(SearchWorker worker) { /* set the score of the found subtitles */ ScoreCalculator calculator = this.scoreCalculators.get(release); - subtitles.forEach(subtitle -> subtitle.setScore(calculator.calculate(subtitle))); + subtitles.forEach(subtitle -> subtitle.score = calculator.calculate(subtitle)); synchronized (this) { calculateProgress(); diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java index 7ce92e63..fd86c497 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java @@ -116,10 +116,10 @@ private Release createRelease(String filename, String releasegroup) { private Subtitle createSubtitle(String filename, String releaseGroup, boolean excludeHearing, String quality) { Subtitle subtitle = mock(Subtitle.class); - when(subtitle.getFileName()).thenReturn(filename); - when(subtitle.getReleaseGroup()).thenReturn(releaseGroup); - when(subtitle.getQuality()).thenReturn(quality); - when(subtitle.isHearingImpaired()).thenReturn(excludeHearing); + when(subtitle.fileName).thenReturn(filename); + when(subtitle.releaseGroup).thenReturn(releaseGroup); + when(subtitle.quality).thenReturn(quality); + when(subtitle.hearingImpaired).thenReturn(excludeHearing); return subtitle; } diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java index ef314f41..e645e841 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java @@ -44,9 +44,9 @@ void test_it_calculates_the_score_for_subtitle() throws Exception { private Subtitle createSubtitle(String filename, String quality, String team) { Subtitle subtitle = mock(Subtitle.class); - when(subtitle.getFileName()).thenReturn(filename); - when(subtitle.getQuality()).thenReturn(quality); - when(subtitle.getReleaseGroup()).thenReturn(team); + when(subtitle.fileName).thenReturn(filename); + when(subtitle.quality).thenReturn(quality); + when(subtitle.releaseGroup).thenReturn(team); return subtitle; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java index c12ad6cc..8dae502f 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java @@ -11,22 +11,22 @@ public abstract class Release extends Video { - @val Set matchingSubs = new HashSet<>(); + private final Set matchingSubsSet = new HashSet<>(); @val Path path; @val String quality; @val String description; @val String releaseGroup; public void addMatchingSub(Subtitle sub) { - matchingSubs.add(sub); + matchingSubsSet.add(sub); } public List getMatchingSubs() { - return new ArrayList<>(matchingSubs); + return new ArrayList<>(matchingSubsSet); } public int getMatchingSubCount() { - return matchingSubs.size(); + return matchingSubsSet.size(); } protected Release(VideoType videoFileType, Path path, String description, String releaseGroup, String quality) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Subtitle.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Subtitle.java index 02e27305..c4099768 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Subtitle.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Subtitle.java @@ -5,34 +5,31 @@ import com.pivovarit.function.ThrowingSupplier; import lombok.AccessLevel; import lombok.EqualsAndHashCode; -import lombok.Getter; import lombok.RequiredArgsConstructor; -import lombok.Setter; +import manifold.ext.props.rt.api.val; +import manifold.ext.props.rt.api.var; import org.apache.commons.lang3.builder.EqualsExclude; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.exception.SubtitlesProviderException; -@Setter -@Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) @EqualsAndHashCode public class Subtitle { @EqualsExclude - private final ThrowingSupplier urlSupplier; - private final String url; - private final Path file; - private final SourceLocation sourceLocation; - - private String fileName; - private Language language; - private String releaseGroup; - private String uploader; - private SubtitleMatchType subtitleMatchType; - private SubtitleSource subtitleSource; - private boolean hearingImpaired; - - private String quality; - private int score; + @val ThrowingSupplier urlSupplier; + @val String url; + @val Path file; + @val SourceLocation sourceLocation; + + @var String fileName; + @var Language language; + @var String releaseGroup; + @var String uploader; + @var SubtitleMatchType subtitleMatchType; + @var SubtitleSource subtitleSource; + @var boolean hearingImpaired; + @var String quality; + @var int score; public enum SourceLocation { URL, URL_SUPPLIER, FILE @@ -73,7 +70,7 @@ public static Subtitle downloadSource(Path file) { @Override public String toString() { - return this.getClass().getSimpleName() + ": " + this.getFileName() + " " + this.getQuality(); + return "${getClass().getSimpleName()}: $fileName $quality"; } public Subtitle fileName(String fileName) { From 255b048aa439fb73740145978a3ba2a8bed65606 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Tue, 4 Jun 2024 00:35:53 +0200 Subject: [PATCH 16/54] changes --- MultiSubDownloader/pom.xml | 5 ++ .../subtools/multisubdownloader/CLI.java | 4 +- .../actions/DownloadAction.java | 8 +-- .../actions/UserInteractionHandlerAction.java | 8 +-- .../gui/dialog/RenameDialog.java | 2 +- .../gui/extra/table/VideoTableModel.java | 10 +-- .../panels/preference/StructureFilePanel.java | 2 +- .../gui/workers/RenameWorker.java | 4 +- .../lib/ReleaseFactory.java | 2 +- .../lib/control/TvReleaseControl.java | 29 ++++---- .../subtitles/filters/ReleaseGroupFilter.java | 2 +- .../lib/library/FilenameLibraryBuilder.java | 16 ++--- .../lib/library/PathLibraryBuilder.java | 16 ++--- .../subtitleproviders/Local.java | 20 +++--- .../subtitleproviders/adapters/Adapter.java | 12 ++-- .../adapters/JAddic7edAdapter.java | 8 +-- .../adapters/JAddic7edViaProxyAdapter.java | 8 +-- .../adapters/JOpenSubAdapter.java | 13 ++-- .../adapters/JPodnapisiAdapter.java | 8 +-- .../adapters/JSubsceneAdapter.java | 17 +++-- .../adapters/JTVsubtitlesAdapter.java | 8 +-- .../addic7ed/JAddic7edApi.java | 8 +-- .../tvsubtitles/JTVSubtitlesApi.java | 2 +- .../sorting/ScoreCalculatorTest.java | 2 +- .../sublibrary/control/ReleaseParser.java | 16 ++--- .../sublibrary/data/tvdb/TheTvdbAdapter.java | 2 +- .../subtools/sublibrary/model/Release.java | 10 +-- .../subtools/sublibrary/model/TvRelease.java | 32 ++++----- .../subtools/sublibrary/model/Video.java | 8 +-- .../sublibrary/control/ReleaseParserTest.java | 69 +++++++++---------- 30 files changed, 173 insertions(+), 178 deletions(-) diff --git a/MultiSubDownloader/pom.xml b/MultiSubDownloader/pom.xml index f46fa57d..5c22c1bc 100644 --- a/MultiSubDownloader/pom.xml +++ b/MultiSubDownloader/pom.xml @@ -141,6 +141,11 @@ manifold-props ${manifold.version} + + systems.manifold + manifold-strings + ${manifold.version} + diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index cd69cec5..232dcd48 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -91,7 +91,7 @@ public void download(List releases) { try { this.download(release); } catch (Exception e) { - LOGGER.error("Error while downloading subtitle for %s (%s)".formatted(release.getReleaseDescription(), e.getMessage()), e); + LOGGER.error("Error while downloading subtitle for ${release.releaseDescription} (%${e.getMessage()})", e); } } } @@ -138,7 +138,7 @@ private void download(Release release) { try { downloadAction.download(release, release.matchingSubs.get(j), selection.size() == 1 ? null : j + 1); } catch (IOException | ManagerException e) { - LOGGER.error("Error while downloading subtitle for %s (%s)".formatted(release.getReleaseDescription(), e.getMessage()), e); + LOGGER.error("Error while downloading subtitle for ${release.releaseDescription} (${e.getMessage()})", e); } }); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java index fb13a51e..5ae56bff 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/DownloadAction.java @@ -33,10 +33,10 @@ public class DownloadAction { private final UserInteractionHandler userInteractionHandler; public void download(Release release, Subtitle subtitle, Integer version) throws IOException, ManagerException { - switch (release.getVideoType()) { + switch (release.videoType) { case EPISODE -> download(release, subtitle, settings.episodeLibrarySettings, version); case MOVIE -> download(release, subtitle, settings.movieLibrarySettings, version); - default -> throw new IllegalArgumentException("Unexpected value: " + release.getVideoType()); + default -> throw new IllegalArgumentException("Unexpected value: " + release.videoType); } } @@ -74,8 +74,8 @@ private void download(Release release, Subtitle subtitle, LibrarySettings librar success = manager.store(url, subFile); LOGGER.debug("doDownload file was [{}] ", success); } catch (SubtitlesProviderException e) { - LOGGER.error("Error while getting url for [%s] for subtitle provider [%s] (%s)".formatted(release.getReleaseDescription(), - e.getSubtitleProvider(), e.getMessage()), e); + LOGGER.error("Error while getting url for [${release.releaseDescription}] " + + "for subtitle provider [${e.subtitleProvider}] (${e.getMessage()})", e); throw new RuntimeException(e); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java index 728962eb..d4d903d8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/UserInteractionHandlerAction.java @@ -50,9 +50,9 @@ public List subtitleSelection(Release release, final boolean subtitleS if (settings.optionsAlwaysConfirm) { return userInteractionHandler.selectSubtitles(release); } else if (release.getMatchingSubs().size() == 1 - && release.getMatchingSubs().get(0).subtitleMatchType == SubtitleMatchType.EXACT) { + && release.getMatchingSubs().first.subtitleMatchType == SubtitleMatchType.EXACT) { LOGGER.debug("determineWhatSubtitleDownload: Exact Match"); - return List.of(release.getMatchingSubs().get(0)); + return List.of(release.getMatchingSubs().first); } else if (release.getMatchingSubs().size() > 1) { LOGGER.debug("determineWhatSubtitleDownload: Multiple subs detected"); @@ -61,7 +61,7 @@ public List subtitleSelection(Release release, final boolean subtitleS shortlist.forEach(release::addMatchingSub); // automatic selection results in 1 result if (shortlist.size() == 1) { - return List.of(release.getMatchingSubs().get(0)); + return List.of(release.getMatchingSubs().first); } // nothing match the minimum automatic selection value if (shortlist.isEmpty()) { @@ -78,7 +78,7 @@ public List subtitleSelection(Release release, final boolean subtitleS } } else if (release.getMatchingSubs().size() == 1) { LOGGER.debug("determineWhatSubtitleDownload: only one sub taking it!!!!"); - return List.of(release.getMatchingSubs().get(0)); + return List.of(release.getMatchingSubs().first); } } LOGGER.debug("determineWhatSubtitleDownload: No subs found for [{}]", release.fileName); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index 5af1628e..fb03c1f4 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -154,7 +154,7 @@ private void rename(Path dir) throws IOException { Release release = releaseFactory.createRelease(file, userInteractionHandler); if (release != null) { publish(release.fileName); - if (release.getVideoType() == videoType) { + if (release.videoType == videoType) { renameAction.rename(file, release); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java index 939916ed..1293714f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java @@ -99,7 +99,7 @@ public Row(Release release, UserInteractionHandler userInteractionHandler) { this.rowObject = SHOW_COLUMNS.stream().map(searchColumn -> switch (searchColumn) { case RELEASE -> { if (release instanceof TvRelease tvRelease) { - yield tvRelease.getOriginalName(); + yield tvRelease.originalName; } else if (release instanceof MovieRelease movieRelease) { yield movieRelease.name; } else { @@ -110,10 +110,10 @@ public Row(Release release, UserInteractionHandler userInteractionHandler) { case FOUND -> calculateSubsFound(); case SELECT -> false; case OBJECT -> release; - case SEASON -> release instanceof TvRelease tvRelease ? tvRelease.getSeason() : null; - case EPISODE -> release instanceof TvRelease tvRelease ? tvRelease.getEpisodeNumbers().get(0) : null; - case TYPE -> release.getVideoType(); - case TITLE -> release instanceof TvRelease tvRelease ? tvRelease.getTitle() : null; + case SEASON -> release instanceof TvRelease tvRelease ? tvRelease.season : null; + case EPISODE -> release instanceof TvRelease tvRelease ? tvRelease.firstEpisodeNumber : null; + case TYPE -> release.videoType; + case TITLE -> release instanceof TvRelease tvRelease ? tvRelease.title : null; default -> throw new IllegalArgumentException("Unexpected value: " + searchColumn); }).collect(Collectors.toCollection(Vector::new)); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index 1a1c7f4f..82986527 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -200,7 +200,7 @@ private void updateBorder(Language lang) { return; } - Border border = componentList.size() > 1 ? ERROR_BORDER : getDefaultBorder(componentList.get(0)); + Border border = componentList.size() > 1 ? ERROR_BORDER : getDefaultBorder(componentList.first); componentList.forEach(components -> components.cmbLanguage.setBorder(border)); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java index f8ec2a4c..2386bbe5 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java @@ -52,10 +52,10 @@ protected Void doInBackground() { setProgress(progress); RenameAction renameAction = null; - if (selectedShow.getVideoType() == VideoType.EPISODE) { + if (selectedShow.videoType == VideoType.EPISODE) { LOGGER.debug("Treat as EPISODE"); renameAction = new RenameAction(settings.episodeLibrarySettings, manager, userInteractionHandler); - } else if (selectedShow.getVideoType() == VideoType.MOVIE) { + } else if (selectedShow.videoType == VideoType.MOVIE) { LOGGER.debug("Treat as MOVIE"); renameAction = new RenameAction(settings.movieLibrarySettings, manager, userInteractionHandler); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java index 3e656600..52a9650e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java @@ -34,7 +34,7 @@ public ReleaseFactory(Settings settings, Manager manager) { public Release createRelease(Path file, UserInteractionHandler userInteractionHandler) { try { Release r = releaseParser.parse(file); - ReleaseControl releaseControl = switch (r.getVideoType()) { + ReleaseControl releaseControl = switch (r.videoType) { case EPISODE -> new TvReleaseControl((TvRelease) r, settings, manager, userInteractionHandler); case MOVIE -> new MovieReleaseControl((MovieRelease) r, settings, manager, userInteractionHandler); }; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index d04b1e7c..1d8135ae 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -27,14 +27,11 @@ public TvReleaseControl(TvRelease tvRelease, Settings settings, Manager manager, @Override public void process() throws ReleaseControlException { - // return episodeFile; - if (StringUtils.isBlank(tvRelease.getName())) { + if (StringUtils.isBlank(tvRelease.name)) { throw new ReleaseControlException("Unable to extract episode details, check file", tvRelease); } else { - LOGGER.debug("process: show name [{}], season [{}], episode [{}]", tvRelease.getName(), - tvRelease.getSeason(), tvRelease.getEpisodeNumbers()); - - if (tvRelease.isSpecial()) { + LOGGER.debug("process: show name [{}], season [{}], episode [{}]", tvRelease.name, tvRelease.season, tvRelease.episodeNumbers); + if (tvRelease.special) { processSpecial(); } else { processTvdb(); @@ -43,23 +40,23 @@ public void process() throws ReleaseControlException { } private void processTvdb() throws ReleaseControlException { - jtvdba.getSerie(tvRelease.getName()).ifPresentOrThrow(tvdbSerie -> { - tvRelease.setTvdbId(tvdbSerie.id); - tvRelease.setOriginalName(tvdbSerie.serieName); - jtvdba.getEpisode(tvdbSerie.id, tvRelease.getSeason(), tvRelease.getEpisodeNumbers().get(0)) + jtvdba.getSerie(tvRelease.name).ifPresentOrThrow(tvdbSerie -> { + tvRelease.tvdbId = tvdbSerie.id; + tvRelease.originalName = tvdbSerie.serieName; + jtvdba.getEpisode(tvdbSerie.id, tvRelease.season, tvRelease.firstEpisodeNumber) .ifPresentOrThrow( tvRelease::updateTvdbEpisodeInfo, - () -> new ReleaseControlException("Season %s Episode %s not found, check file".formatted(tvRelease.getSeason(), - tvRelease.getEpisodeNumbers().toString()), tvRelease)); + () -> new ReleaseControlException("Season ${tvRelease.season} Episode ${tvRelease.episodeNumbers} not found, check file", + tvRelease)); }, () -> new ReleaseControlException("Show not found, check file", tvRelease)); } private void processSpecial() throws ReleaseControlException { - jtvdba.getSerie(tvRelease.getName()).ifPresentOrThrow(tvdbSerie -> { - tvRelease.setTvdbId(tvdbSerie.getId()); - tvRelease.setOriginalName(tvdbSerie.serieName); + jtvdba.getSerie(tvRelease.name).ifPresentOrThrow(tvdbSerie -> { + tvRelease.tvdbId = tvdbSerie.id; + tvRelease.originalName = tvdbSerie.serieName; if (getSettings().processEpisodeSource == SettingsProcessEpisodeSource.TVDB) { - jtvdba.getEpisode(tvdbSerie.getId(), tvRelease.getSeason(), tvRelease.getEpisodeNumbers().get(0)) + jtvdba.getEpisode(tvdbSerie.id, tvRelease.season, tvRelease.firstEpisodeNumber) .ifPresent(tvRelease::updateTvdbEpisodeInfo); } }, () -> new ReleaseControlException("Show not found, check file", tvRelease)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java index e90060f7..54024431 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java @@ -15,7 +15,7 @@ public class ReleaseGroupFilter extends SubtitleFilter { @Override public boolean useSubtitle(Release release, Subtitle subtitle) { if (subtitle.releaseGroup.isEmpty()) { - subtitle.releaseGroup = ReleaseParser.extractReleasegroup(subtitle.fileName, subtitle.fileName.endsWith(".srt")); + subtitle.releaseGroup = ReleaseParser.extractReleaseGroup(subtitle.fileName, subtitle.fileName.endsWith(".srt")); } if (!StringUtils.containsAnyIgnoreCase(subtitle.releaseGroup, release.releaseGroup, subtitle.releaseGroup)) { return false; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index ebae9787..566384ab 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -129,14 +129,14 @@ public Path build(Release release) { if (release instanceof TvRelease tvRelease && StringUtils.isNotBlank(structure)) { filename = structure; // order is important! - filename = replace(filename, SerieStructureTag.SHOW_NAME, getShowName(tvRelease.getName())); - filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_LONG, tvRelease.getEpisodeNumbers(), true); - filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_SHORT, tvRelease.getEpisodeNumbers(), false); - filename = replace(filename, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.getSeason(), true)); - filename = replace(filename, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.getSeason(), false)); - filename = replace(filename, SerieStructureTag.EPISODE_LONG, formattedNumber(tvRelease.getEpisodeNumbers().get(0), true)); - filename = replace(filename, SerieStructureTag.EPISODE_SHORT, formattedNumber(tvRelease.getEpisodeNumbers().get(0), false)); - filename = replace(filename, SerieStructureTag.TITLE, tvRelease.getTitle()); + filename = replace(filename, SerieStructureTag.SHOW_NAME, getShowName(tvRelease.name)); + filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_LONG, tvRelease.episodeNumbers, true); + filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_SHORT, tvRelease.episodeNumbers, false); + filename = replace(filename, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.season, true)); + filename = replace(filename, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.season, false)); + filename = replace(filename, SerieStructureTag.EPISODE_LONG, formattedNumber(tvRelease.firstEpisodeNumber, true)); + filename = replace(filename, SerieStructureTag.EPISODE_SHORT, formattedNumber(tvRelease.firstEpisodeNumber, false)); + filename = replace(filename, SerieStructureTag.TITLE, tvRelease.title); filename = replace(filename, SerieStructureTag.QUALITY, release.quality); filename = replace(filename, SerieStructureTag.DESCRIPTION, release.description); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java index bd79226e..58ca81fc 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java @@ -131,15 +131,15 @@ public Path build(Release release) { private Path buildEpisode(TvRelease tvRelease) { String folder = structure; - folder = folder.replace(SerieStructureTag.SHOW_NAME.getLabel(), getShowName(tvRelease.getName())).removeIllegalWindowsChars(); + folder = folder.replace(SerieStructureTag.SHOW_NAME.getLabel(), getShowName(tvRelease.name)).removeIllegalWindowsChars(); // order is important! - folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_LONG, tvRelease.getEpisodeNumbers(), true); - folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_SHORT, tvRelease.getEpisodeNumbers(), false); - folder = replace(folder, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.getSeason(), true)); - folder = replace(folder, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.getSeason(), false)); - folder = replace(folder, SerieStructureTag.EPISODE_LONG, formattedNumber(tvRelease.getEpisodeNumbers().get(0), true)); - folder = replace(folder, SerieStructureTag.EPISODE_SHORT, formattedNumber(tvRelease.getEpisodeNumbers().get(0), false)); - folder = replace(folder, SerieStructureTag.TITLE, tvRelease.getTitle()); + folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_LONG, tvRelease.episodeNumbers, true); + folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_SHORT, tvRelease.episodeNumbers, false); + folder = replace(folder, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.season, true)); + folder = replace(folder, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.season, false)); + folder = replace(folder, SerieStructureTag.EPISODE_LONG, formattedNumber(tvRelease.firstEpisodeNumber, true)); + folder = replace(folder, SerieStructureTag.EPISODE_SHORT, formattedNumber(tvRelease.firstEpisodeNumber, false)); + folder = replace(folder, SerieStructureTag.TITLE, tvRelease.title); folder = replace(folder, SerieStructureTag.QUALITY, tvRelease.quality); folder = replace(folder, SerieStructureTag.DESCRIPTION, tvRelease.description); if (replaceSpace) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index 5e64b787..f3b5dc63 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -66,22 +66,22 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { ReleaseParser vfp = new ReleaseParser(); String filter; - if (tvRelease.getOriginalName().length() > 0) { - filter = tvRelease.getOriginalName().replaceAll("[^A-Za-z]", "").trim(); + if (tvRelease.originalName.length() > 0) { + filter = tvRelease.originalName.replaceAll("[^A-Za-z]", "").trim(); } else { - filter = tvRelease.getName().replaceAll("[^A-Za-z]", "").trim(); + filter = tvRelease.name.replaceAll("[^A-Za-z]", "").trim(); } for (Path fileSub : getPossibleSubtitles(filter)) { try { Release release = vfp.parse(fileSub); - if ((release.getVideoType() == VideoType.EPISODE) - && (((TvRelease) release).getSeason() == tvRelease.getSeason() && Utils.containsAll( - ((TvRelease) release).getEpisodeNumbers(), tvRelease.getEpisodeNumbers()))) { + if ((release.videoType == VideoType.EPISODE) + && (((TvRelease) release).season == tvRelease.season && Utils.containsAll( + ((TvRelease) release).episodeNumbers, tvRelease.episodeNumbers))) { TvReleaseControl epCtrl = new TvReleaseControl((TvRelease) release, settings, manager, userInteractionHandler); epCtrl.process(); - if (((TvRelease) release).getTvdbId().equals(tvRelease.getTvdbId())) { + if (((TvRelease) release).tvdbIdOptional.equals(tvRelease.tvdbIdOptional)) { Language detectedLang = DetectLanguage.execute(fileSub); if (detectedLang == language) { LOGGER.debug("Local Sub found, adding [{}]", fileSub); @@ -92,7 +92,7 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { .language(language) .quality(ReleaseParser.getQualityKeyword(fileSub.getFileNameAsString())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleasegroup(fileSub.getFileNameAsString(), true)) + .releaseGroup(ReleaseParser.extractReleaseGroup(fileSub.getFileNameAsString(), true)) .uploader(fileSub.toAbsolutePath().toString()) .hearingImpaired(false)); } @@ -120,7 +120,7 @@ public Set searchSubtitles(MovieRelease movieRelease, Language languag for (Path fileSub : getPossibleSubtitles(filter)) { try { Release release = releaseParser.parse(fileSub); - if (release.getVideoType() == VideoType.MOVIE) { + if (release.videoType == VideoType.MOVIE) { MovieReleaseControl movieCtrl = new MovieReleaseControl((MovieRelease) release, settings, manager, userInteractionHandler); movieCtrl.process(); if (((MovieRelease) release).getImdbId().equals(movieRelease.getImdbId())) { @@ -134,7 +134,7 @@ public Set searchSubtitles(MovieRelease movieRelease, Language languag .language(language) // TODO previously: language(""). This was not correct? .quality(ReleaseParser.getQualityKeyword(fileSub.getFileNameAsString())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleasegroup(fileSub.getFileNameAsString(), true)) + .releaseGroup(ReleaseParser.extractReleaseGroup(fileSub.getFileNameAsString(), true)) .uploader(fileSub.toAbsolutePath().toString()) .hearingImpaired(false)); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 01e6e2a1..62b24cf4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -95,9 +95,9 @@ default Set searchSubtitles(TvRelease tvRelease, Language language) { try { return convertToSubtitles(tvRelease, searchSerieSubtitles(tvRelease, language), language); } catch (Exception e) { - String displayName = StringUtils.defaultIfBlank(tvRelease.getOriginalName(), tvRelease.getName()); + String displayName = StringUtils.defaultIfBlank(tvRelease.originalName, tvRelease.name); LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(displayName, tvRelease.getSeason(), tvRelease.getFirstEpisodeNumber()), e.getMessage()), e); + TvRelease.formatName(displayName, tvRelease.season, tvRelease.firstEpisodeNumber), e.getMessage()), e); return Set.of(); } } @@ -110,7 +110,7 @@ default Set searchSubtitles(TvRelease tvRelease, Language language) { @Override default Optional getProviderSerieId(TvRelease tvRelease) throws X { - if (StringUtils.isNotBlank(tvRelease.getCustomName())) { + if (StringUtils.isNotBlank(tvRelease.customName)) { return getProviderSerieId(tvRelease, TvRelease::getOriginalName, TvRelease::getCustomName); } else { Optional providerSerieId = getProviderSerieId(tvRelease, TvRelease::getOriginalName); @@ -124,8 +124,8 @@ default Optional getProviderSerieId(TvRelease tvRelease, Function< default Optional getProviderSerieId(TvRelease tvRelease, Function nameFunction, Function customNameFunction) throws X { - return getProviderSerieId(nameFunction.apply(tvRelease), customNameFunction.apply(tvRelease), tvRelease.getDisplayName(), - tvRelease.getSeason(), tvRelease.getTvdbId()); + return getProviderSerieId(nameFunction.apply(tvRelease), customNameFunction.apply(tvRelease), tvRelease.displayName, + tvRelease.season, tvRelease.getTvdbIdOptional()); } default Optional getProviderSerieId(String serieName, String displayName, int season, @@ -180,7 +180,7 @@ default Optional getProviderSerieId(String serieName, String serie SerieMapping serieMapping; if (!getUserInteractionSettings().isOptionsConfirmProviderMapping && providerSerieIds.size() == 1) { - serieMapping = new SerieMapping(serieName, providerSerieIds.get(0).id, providerSerieIds.get(0).name, seasonToUse); + serieMapping = new SerieMapping(serieName, providerSerieIds.first.id, providerSerieIds.first.name, seasonToUse); } else { ValueBuilderIsPresentIntf previousResultsValueBuilder = getManager().valueBuilder() .cacheType(CacheType.MEMORY) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java index f9eff738..34bd760f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java @@ -90,13 +90,13 @@ public Set convertToSubtitles(MovieRelease movieRelease, Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws Addic7edException { return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.getEpisodeNumbers().stream() + .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return getApi().getSubtitles(providerSerieId, tvRelease.getSeason(), episode, language).stream(); + return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); } catch (Addic7edException e) { LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.getSeason(), episode), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); } @@ -115,7 +115,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection convertToSubtitles(MovieRelease movieRelease, Set @Override public Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws ApiException { return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.getEpisodeNumbers().stream() + .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return new ExecuteCall<>(() -> getApi().getSubtitles(providerSerieId, tvRelease.getSeason(), episode, language)) + return new ExecuteCall<>(() -> getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language)) .message("getSubtitles: [%s]".formatted( - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.getSeason(), episode))) + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode))) .retryWhenHttpCode(ReturnCode.REFRESHING) .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .execute().stream(); } catch (ApiException e) { LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.getSeason(), episode), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index ae07a193..81aeabc3 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -109,19 +109,19 @@ public Set convertToSubtitles(MovieRelease movieRelease, Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws OpenSubtitlesException { return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.getEpisodeNumbers().stream() + .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { return getApi().searchSubtitles() .query(providerSerieId.getName()) - .season(tvRelease.getSeason()) + .season(tvRelease.season) .episode(episode) .language(language) .searchSubtitles() .getData().stream(); } catch (OpenSubtitlesException e) { LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.getSeason(), episode), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); } @@ -132,11 +132,10 @@ public Set searchSerieSubtitles(TvRelease tvRe @Override public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, Language language) { - String name = StringUtils.lowerCase(RegExUtils.replaceAll(tvRelease.getName(), "[^A-Za-z]", "")); - String originalName = StringUtils.lowerCase(RegExUtils.replaceAll(tvRelease.getOriginalName(), "[^A-Za-z]", "")); + String name = StringUtils.lowerCase(RegExUtils.replaceAll(tvRelease.name, "[^A-Za-z]", "")); + String originalName = StringUtils.lowerCase(RegExUtils.replaceAll(tvRelease.originalName, "[^A-Za-z]", "")); return subtitles.stream().map(org.opensubtitles.model.Subtitle::getAttributes) .flatMap(attributes -> attributes.getFiles().stream() - .filter(file -> file.getFileName() != null) .filter(file -> { String subFileName = file.getFileName().replaceAll("[^A-Za-z]", "").toLowerCase(); return subFileName.contains(name) || (StringUtils.isNotBlank(originalName) && subFileName.contains(originalName)); @@ -152,7 +151,7 @@ private Subtitle createSubtitle(Latest200ResponseDataInnerAttributesFilesInner f .language(Language.fromIdOptional(attributes.getLanguage()).orElse(null)) .quality(ReleaseParser.getQualityKeyword(file.getFileName())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleasegroup(file.getFileName(), file.getFileName().endsWith(".srt"))) + .releaseGroup(ReleaseParser.extractReleaseGroup(file.getFileName(), file.getFileName().endsWith(".srt"))) .uploader(attributes.getUploader().getName()) .hearingImpaired(attributes.isHearingImpaired()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index 373e656d..05495580 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -84,13 +84,13 @@ public Set convertToSubtitles(MovieRelease movieRelease, Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws PodnapisiException { return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.getEpisodeNumbers().stream() + .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return getApi().getSerieSubtitles(providerSerieId, tvRelease.getSeason(), episode, language).stream(); + return getApi().getSerieSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); } catch (PodnapisiException e) { LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.getSeason(), episode), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); } @@ -113,7 +113,7 @@ private Set buildListSubtitles(Language language, Collection convertToSubtitles(MovieRelease movieRelease, Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws SubsceneException { return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.getEpisodeNumbers().stream() + .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return getApi().getSubtitles(providerSerieId, tvRelease.getSeason(), episode, language).stream(); + return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); } catch (SubsceneException e) { LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.getSeason(), episode), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); } @@ -136,22 +136,21 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, Language language) { return subtitles.stream() .filter(sub -> language == sub.getLanguage()) - .filter(sub -> sub.getName().contains(getSeasonEpisodeString(tvRelease.getSeason(), tvRelease.getEpisodeNumbers().get(0)))) + .filter(sub -> sub.getName().contains(getSeasonEpisodeString(tvRelease.season, tvRelease.firstEpisodeNumber))) .map(sub -> Subtitle.downloadSource(sub.getUrlSupplier()) .subtitleSource(getSubtitleSource()) .fileName(sub.getName().removeIllegalFilenameChars()) .language(sub.getLanguage()) .quality(ReleaseParser.getQualityKeyword(sub.getName())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleasegroup(sub.getName(), false)) + .releaseGroup(ReleaseParser.extractReleaseGroup(sub.getName(), false)) .uploader(sub.getUploader()) .hearingImpaired(sub.isHearingImpaired())) .collect(Collectors.toSet()); } private String getSeasonEpisodeString(int season, int episode) { - return "S" + org.apache.commons.lang3.StringUtils.leftPad(String.valueOf(season), 2, "0") + "E" - + org.apache.commons.lang3.StringUtils.leftPad(String.valueOf(episode), 2, "0"); + return "S%02dE%02d".formatted(season, episode); } @Override @@ -165,9 +164,9 @@ public String providerSerieIdToDisplayString(SubSceneSerieId providerSerieId) { OptionalInt season = IntStream.rangeClosed(1, 100) .filter(i -> providerSerieId.id.endsWith("-${SubsceneApi.getOrdinalName(i).toLowerCase()}-season")).findAny(); if (season.isPresent()) { - return "${providerSerieId.name} (${Messages.getString(\"App.Season\")} ${season.getAsInt()})"; + return "%s %s %s".formatted(providerSerieId.name, Messages.getString("App.Season"), season.getAsInt()); } } - return providerSerieId.getName(); + return providerSerieId.name; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java index 7056f494..ed3d9140 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java @@ -91,13 +91,13 @@ public Set convertToSubtitles(MovieRelease movieRelease, Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws TvSubtitlesException { return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.getEpisodeNumbers().stream() + .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return getApi().getSubtitles(providerSerieId, tvRelease.getSeason(), episode, language).stream(); + return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); } catch (TvSubtitlesException e) { LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.getSeason(), episode), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); } @@ -115,7 +115,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection getSubtitles(SerieMapping addic7edSerieM URLEncoder.encode(addic7edSerieMapping.getProviderName().replace(" ", "_"), UTF_8), season, episode, - languageIds.size() == 1 ? languageIds.get(0).getId() : LanguageId.ALL.getId()); + languageIds.size() == 1 ? languageIds.first.getId() : LanguageId.ALL.getId()); Optional doc = getContent(url); if (doc.isEmpty()) { @@ -120,7 +120,7 @@ public List getSubtitles(SerieMapping addic7edSerieM Elements elTitle = doc.get().getElementsByClass("titulo"); if (elTitle.size() == 1) { - Matcher matcher = TITLE_PATTERN.matcher(elTitle.get(0).html()); + Matcher matcher = TITLE_PATTERN.matcher(elTitle.first.html()); if (matcher.matches()) { title = matcher.group(1); } @@ -141,7 +141,7 @@ public List getSubtitles(SerieMapping addic7edSerieM Elements classesNewsTitle = block.getElementsByClass("NewsTitle"); Elements classesNewsDate = block.getElementsByClass("newsDate").select("td[colspan=3]"); if (classesNewsTitle.size() == 1 && classesNewsDate.size() == 1) { - Matcher m = VERSION_PATTERN.matcher(classesNewsTitle.get(0).text().trim()); + Matcher m = VERSION_PATTERN.matcher(classesNewsTitle.first.text().trim()); if (!m.matches()) { break; } else { @@ -168,7 +168,7 @@ public List getSubtitles(SerieMapping addic7edSerieM Elements downloadElements = td.getElementsByClass("buttonDownload"); if (lang != null && downloadElements.size() > 0) { if (downloadElements.size() == 1) { - download = DOMAIN + downloadElements.get(0).attr("href"); + download = DOMAIN + downloadElements.first.attr("href"); } if (downloadElements.size() == 2) { download = DOMAIN + downloadElements.get(1).attr("href"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index 044b88f3..cfa16ab7 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -75,7 +75,7 @@ private Set getSubtitles(String episodeUrl, Langu String filename = null, rip = null, title = null, author = null; Elements subtitlePageTableDoc = subtitlePageDoc.getElementsByClass("subtitle1"); if (subtitlePageTableDoc.size() == 1) { - for (Element item : subtitlePageTableDoc.get(0).getElementsByTag("tr")) { + for (Element item : subtitlePageTableDoc.first.getElementsByTag("tr")) { Elements row = item.getElementsByTag("td"); if (row.size() != 3) { continue; diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java index e645e841..38bdb3f0 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculatorTest.java @@ -12,7 +12,7 @@ class ScoreCalculatorTest { @Test - void test_it_calculates_the_score_for_subtitle() throws Exception { + void test_it_calculates_the_score_for_subtitle() { SortWeight weights = createWeights("DVDRip XviD", "MEDiEVAL"); ScoreCalculator calculator = new ScoreCalculator(weights); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java index dec034c8..8d3f8873 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java @@ -26,7 +26,7 @@ public class ReleaseParser { public final Release parse(Path file) throws ReleaseParseException { String folderName = file.getParent() != null ? file.getParent().getFileName().toString() : ""; - for (String fileParseName : List.of(file.getFileName().toString(), folderName)) { + for (String fileParseName : List.of(file.fileName.toString(), folderName)) { for (NamedPattern np : VideoPatterns.COMPILED_PATTERNS) { namedMatcher = np.matcher(fileParseName); if (namedMatcher.find()) { @@ -64,7 +64,7 @@ private Release parsePatternResult(Path file, String fileParseName) throws Relea .file(file) .year(year) .description(description) - .releaseGroup(extractReleasegroup(file.getFileName().toString(), true)) + .releaseGroup(extractReleaseGroup(file.getFileName().toString(), true)) .quality(getQualityKeyword(fileParseName)) .build(); } @@ -135,7 +135,7 @@ private Release parsePatternResult(Path file, String fileParseName) throws Relea .episodes(episodeNumbers) .file(file) .description(PathExt.withoutExtension(description)) - .releaseGroup(extractReleasegroup(file.getFileName().toString(), true)) + .releaseGroup(extractReleaseGroup(file.getFileName().toString(), true)) .special(isSpecialEpisode(seasonNumber, episodeNumbers)) .quality(getQualityKeyword(fileParseName)) .build(); @@ -185,12 +185,12 @@ public static List getQualityKeyWords(String name) { while (m.find()) { keywords.add(m.group(0)); } - LOGGER.trace("getQualityKeyWords: keyswords: {}", keywords); + LOGGER.trace("getQualityKeyWords: keywords: {}", keywords); return keywords; } - public static String extractReleasegroup(final String fileName, boolean hasExtension) { - LOGGER.trace("extractReleasegroup: name: {} , hasExtension: {}", fileName, hasExtension); + public static String extractReleaseGroup(final String fileName, boolean hasExtension) { + LOGGER.trace("extractReleaseGroup: name: {} , hasExtension: {}", fileName, hasExtension); Pattern releaseGroupPattern; if (hasExtension) { releaseGroupPattern = Pattern.compile("-([\\w]+).[\\w]+$"); @@ -203,7 +203,7 @@ public static String extractReleasegroup(final String fileName, boolean hasExten releaseGroup = matcher.group(1); } - LOGGER.trace("extractReleasegroup: release group: {}", releaseGroup); + LOGGER.trace("extractReleaseGroup: release group: {}", releaseGroup); return releaseGroup; } @@ -211,6 +211,6 @@ public static boolean isSpecialEpisode(final int season, final List epi if (season == 0) { return true; } - return episodeNumbers.size() == 1 && episodeNumbers.get(0) == 0; + return episodeNumbers.size() == 1 && episodeNumbers.first == 0; } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index 4f17431a..9f895ffe 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -76,7 +76,7 @@ public Optional getSerie(String serieName) { if (serieIds.isEmpty()) { tvdbSerie = Optional.empty(); } else if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping && serieIds.size() == 1) { - tvdbSerie = Optional.of(serieIds.get(0)); + tvdbSerie = Optional.of(serieIds.first); } else { String formattedSerieName = serieName.replaceAll("[^A-Za-z]", ""); Comparator comparator = Comparator diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java index 8dae502f..1098c398 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java @@ -12,7 +12,7 @@ public abstract class Release extends Video { private final Set matchingSubsSet = new HashSet<>(); - @val Path path; + @val Path filePath; @val String quality; @val String description; @val String releaseGroup; @@ -29,20 +29,20 @@ public int getMatchingSubCount() { return matchingSubsSet.size(); } - protected Release(VideoType videoFileType, Path path, String description, String releaseGroup, String quality) { + protected Release(VideoType videoFileType, Path filePath, String description, String releaseGroup, String quality) { super(videoFileType); - this.path = path; + this.filePath = filePath; this.description = description; this.releaseGroup = releaseGroup; this.quality = quality; } public String getFileName() { - return path != null ? path.getFileName().toString() : null; + return filePath != null ? filePath.getFileName().toString() : null; } public Path getPath() { - return path != null ? path.getParent() : null; + return filePath != null ? filePath.getParent() : null; } public String getExtension() { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java index c3b8d8eb..66c76bf7 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java @@ -5,30 +5,29 @@ import java.util.List; import java.util.OptionalInt; -import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.val; +import manifold.ext.props.rt.api.var; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbEpisode; -@Getter -@Setter public class TvRelease extends Release { // parsed from the filename - private final String name; - private String title; - private final int season; - private int tvdbId; - private final List episodeNumbers; + @val String name; + @val List episodeNumbers; + @val int season; + @var String title; + @var int tvdbId; // tvdb name - private String originalName; - private boolean special; + @var String originalName; + @val boolean special; // custom name which can be used to search subtitle providers - private String customName; + @val String customName; public String getNameWithSeasonEpisode() { - return formatName(name, season, episodeNumbers.isEmpty() ? -1 : episodeNumbers.get(0)); + return formatName(name, season, episodeNumbers.isEmpty() ? -1 : firstEpisodeNumber); } public static String formatName(String serieName, int season, int episode) { @@ -112,8 +111,7 @@ public TvRelease build() { } private TvRelease(Path file, String description, String releaseGroup, String quality, String name, String originalName, String customName, - String title, int season, - List episodeNumbers, boolean special) { + String title, int season, List episodeNumbers, boolean special) { super(VideoType.EPISODE, file, description, releaseGroup, quality); this.name = name; this.title = title; @@ -128,12 +126,12 @@ public void updateTvdbEpisodeInfo(TheTvdbEpisode tvdbEpisode) { this.title = tvdbEpisode.episodeName; // update to reflect correct episode title } - public OptionalInt getTvdbId() { + public OptionalInt getTvdbIdOptional() { return tvdbId == 0 ? OptionalInt.empty() : OptionalInt.of(tvdbId); } public int getFirstEpisodeNumber() { - return episodeNumbers.get(0); + return episodeNumbers.first; } @Override @@ -147,6 +145,6 @@ public String getReleaseDescription() { } public String getDisplayName() { - return StringUtils.isNotBlank(getOriginalName()) ? getOriginalName() : getName(); + return StringUtils.defaultIfBlank(originalName, name); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java index e9bc212c..fa24ffa8 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java @@ -1,14 +1,12 @@ package org.lodder.subtools.sublibrary.model; -import lombok.Getter; -import lombok.Setter; +import manifold.ext.props.rt.api.val; -@Getter @Setter public abstract class Video { - private final VideoType videoType; + @val VideoType videoType; - public Video(VideoType videoType) { + Video(VideoType videoType) { this.videoType = videoType; } } diff --git a/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java b/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java index f07a8d91..5ef30530 100644 --- a/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java +++ b/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java @@ -16,17 +16,17 @@ class ReleaseParserTest { @Test - void testReleaseGroup() throws Exception { - String releaseGroup = ReleaseParser.extractReleasegroup("The.Following.S03E01.HDTV.XviD-AFG", false); + void testReleaseGroup() { + String releaseGroup = ReleaseParser.extractReleaseGroup("The.Following.S03E01.HDTV.XviD-AFG", false); assertThat(releaseGroup).isEqualTo("AFG"); - releaseGroup = ReleaseParser.extractReleasegroup("The.Following.S03E01.HDTV.XviD-AFG", true); + releaseGroup = ReleaseParser.extractReleaseGroup("The.Following.S03E01.HDTV.XviD-AFG", true); assertThat(releaseGroup).isEqualTo("A"); - releaseGroup = ReleaseParser.extractReleasegroup("The.Following.S03E01.HDTV.XviD-AFG.srt", false); - assertThat(releaseGroup).isEqualTo(""); + releaseGroup = ReleaseParser.extractReleaseGroup("The.Following.S03E01.HDTV.XviD-AFG.srt", false); + assertThat(releaseGroup).isEmpty(); - releaseGroup = ReleaseParser.extractReleasegroup("The.Following.S03E01.HDTV.XviD-AFG.srt", true); + releaseGroup = ReleaseParser.extractReleaseGroup("The.Following.S03E01.HDTV.XviD-AFG.srt", true); assertThat(releaseGroup).isEqualTo("AFG"); } @@ -56,7 +56,7 @@ void testTV() throws Exception { Path file = Path.of("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.mkv"); Release release = releaseparser.parse(file); - assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); + assertThat(release.videoType).isEqualTo(VideoType.EPISODE); assertThat(release.extension).isEqualTo("mkv"); assertThat(release.fileName).isEqualTo("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.mkv"); assertThat(release.releaseGroup).isEqualTo("DIMENSION"); @@ -64,29 +64,29 @@ void testTV() throws Exception { TvRelease tvrelease = (TvRelease) release; - assertThat(tvrelease.getSeason()).isEqualTo(10); - assertThat(tvrelease.getEpisodeNumbers().size()).isEqualTo(1); - assertThat((int) tvrelease.getEpisodeNumbers().get(0)).isEqualTo(12); + assertThat(tvrelease.season).isEqualTo(10); + assertThat(tvrelease.episodeNumbers).hasSize(1); + assertThat(tvrelease.firstEpisodeNumber).isEqualTo(12); file = Path.of("S04E02 - White Collar - Most Wanted.mkv"); release = releaseparser.parse(file); - assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); + assertThat(release.videoType).isEqualTo(VideoType.EPISODE); assertThat(release.extension).isEqualTo("mkv"); assertThat(release.fileName).isEqualTo("S04E02 - White Collar - Most Wanted.mkv"); - assertThat(release.releaseGroup).isEqualTo(""); - assertThat(release.quality).isEqualTo(""); + assertThat(release.releaseGroup).isEmpty(); + assertThat(release.quality).isEmpty(); tvrelease = (TvRelease) release; - assertThat(tvrelease.getSeason()).isEqualTo(4); - assertThat(tvrelease.getEpisodeNumbers().size()).isEqualTo(1); - assertThat((int) tvrelease.getEpisodeNumbers().get(0)).isEqualTo(2); + assertThat(tvrelease.season).isEqualTo(4); + assertThat(tvrelease.episodeNumbers).hasSize(1); + assertThat(tvrelease.firstEpisodeNumber).isEqualTo(2); file = Path.of("Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv"); release = releaseparser.parse(file); - assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); + assertThat(release.videoType).isEqualTo(VideoType.EPISODE); assertThat(release.extension).isEqualTo("mkv"); assertEquals(release.fileName, "Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv"); assertThat(release.releaseGroup).isEqualTo("DIMENSION"); @@ -94,14 +94,14 @@ void testTV() throws Exception { tvrelease = (TvRelease) release; - assertThat(tvrelease.getSeason()).isEqualTo(1); - assertThat(tvrelease.getEpisodeNumbers().size()).isEqualTo(1); - assertThat((int) tvrelease.getEpisodeNumbers().get(0)).isEqualTo(1); + assertThat(tvrelease.season).isEqualTo(1); + assertThat(tvrelease.episodeNumbers).hasSize(1); + assertThat(tvrelease.firstEpisodeNumber).isEqualTo(1); file = Path.of("hawaii.five-0.2010.410.hdtv-lol.mp4"); release = releaseparser.parse(file); - assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); + assertThat(release.videoType).isEqualTo(VideoType.EPISODE); assertThat(release.extension).isEqualTo("mp4"); assertThat(release.fileName).isEqualTo("hawaii.five-0.2010.410.hdtv-lol.mp4"); assertThat(release.releaseGroup).isEqualTo("lol"); @@ -109,14 +109,14 @@ void testTV() throws Exception { tvrelease = (TvRelease) release; - assertThat(tvrelease.getSeason()).isEqualTo(4); - assertThat(tvrelease.getEpisodeNumbers().size()).isEqualTo(1); - assertThat((int) tvrelease.getEpisodeNumbers().get(0)).isEqualTo(10); + assertThat(tvrelease.season).isEqualTo(4); + assertThat(tvrelease.episodeNumbers).hasSize(1); + assertThat(tvrelease.firstEpisodeNumber).isEqualTo(10); file = Path.of("Greys.Anatomy.S10E01E02.720p.HDTV.X264-DIMENSION.mkv"); release = releaseparser.parse(file); - assertThat(release.getVideoType()).isEqualTo(VideoType.EPISODE); + assertThat(release.videoType).isEqualTo(VideoType.EPISODE); assertThat(release.extension).isEqualTo("mkv"); assertThat(release.fileName).isEqualTo("Greys.Anatomy.S10E01E02.720p.HDTV.X264-DIMENSION.mkv"); assertThat(release.releaseGroup).isEqualTo("DIMENSION"); @@ -124,14 +124,14 @@ void testTV() throws Exception { tvrelease = (TvRelease) release; - assertThat(tvrelease.getSeason()).isEqualTo(10); - assertThat(tvrelease.getEpisodeNumbers().size()).isEqualTo(2); - assertThat((int) tvrelease.getEpisodeNumbers().get(0)).isEqualTo(1); - assertThat((int) tvrelease.getEpisodeNumbers().get(1)).isEqualTo(2); + assertThat(tvrelease.season).isEqualTo(10); + assertThat(tvrelease.episodeNumbers).hasSize(2); + assertThat(tvrelease.firstEpisodeNumber).isEqualTo(1); + assertThat(tvrelease.episodeNumbers.get(1)).isEqualTo(2); } @Test - void testReleaseParseExceptionMessage() throws ReleaseParseException { + void testReleaseParseExceptionMessage() { Path file = Path.of("exceptiontesting.mkv"); assertThatExceptionOfType(ReleaseParseException.class) @@ -146,7 +146,7 @@ void testMovie() throws Exception { Path file = Path.of("Back.to.the.Future.Part.II.1989.720p.BluRay.X264-AMIABLE.mkv"); Release release = releaseparser.parse(file); - assertThat(release.getVideoType()).isEqualTo(VideoType.MOVIE); + assertThat(release.videoType).isEqualTo(VideoType.MOVIE); assertThat(release.extension).isEqualTo("mkv"); assertThat(release.fileName).isEqualTo("Back.to.the.Future.Part.II.1989.720p.BluRay.X264-AMIABLE.mkv"); assertThat(release.releaseGroup).isEqualTo("AMIABLE"); @@ -160,7 +160,7 @@ void testMovie() throws Exception { file = Path.of("The.Equalizer.2014.720p.BluRay.x264-SPARKS.mkv"); release = releaseparser.parse(file); - assertThat(release.getVideoType()).isEqualTo(VideoType.MOVIE); + assertThat(release.videoType).isEqualTo(VideoType.MOVIE); assertThat(release.extension).isEqualTo("mkv"); assertThat(release.fileName).isEqualTo("The.Equalizer.2014.720p.BluRay.x264-SPARKS.mkv"); assertThat(release.releaseGroup).isEqualTo("SPARKS"); @@ -174,10 +174,9 @@ void testMovie() throws Exception { file = Path.of("The.Trip.to.Italy.2014.LIMITED.720p.BluRay.x264-GECKOS.mkv"); release = releaseparser.parse(file); - assertThat(release.getVideoType()).isEqualTo(VideoType.MOVIE); + assertThat(release.videoType).isEqualTo(VideoType.MOVIE); assertThat(release.extension).isEqualTo("mkv"); - assertEquals(release.getFileName(), - "The.Trip.to.Italy.2014.LIMITED.720p.BluRay.x264-GECKOS.mkv"); + assertEquals(release.getFileName(), "The.Trip.to.Italy.2014.LIMITED.720p.BluRay.x264-GECKOS.mkv"); assertThat(release.releaseGroup).isEqualTo("GECKOS"); assertThat(release.quality).isEqualTo("720p bluray x264"); From 076022523ef16f26bf5023e825aa02a0e12c929d Mon Sep 17 00:00:00 2001 From: EotT123 Date: Wed, 5 Jun 2024 23:47:16 +0200 Subject: [PATCH 17/54] small change --- .../lib/control/subtitles/sorting/ScoreCalculator.java | 4 +--- .../org/lodder/subtools/sublibrary/model/MovieRelease.java | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java index bca362f0..b165baea 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java @@ -14,9 +14,7 @@ public int calculate(Subtitle subtitle) { if (weights.getMaxScore() <= 0) { return 0; } - - String subtitleInfo = "${subtitle.fileName} ${subtitle.quality} ${subtitle.releaseGroup}".trim().toLowerCase(); - + String subtitleInfo = "%s %s %s".formatted(subtitle.fileName, subtitle.quality, subtitle.releaseGroup).trim().toLowerCase(); int score = weights.getWeights().keySet().stream().filter(subtitleInfo::contains).mapToInt(weights.getWeights()::get).sum(); return (int) Math.ceil((float) score / weights.getMaxScore() * 100); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java index 09a11b9f..180f393b 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java @@ -3,7 +3,6 @@ import java.nio.file.Path; import java.util.OptionalInt; -import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import manifold.ext.props.rt.api.var; @@ -12,8 +11,8 @@ public class MovieRelease extends Release { @var String name; @var Integer year; - @Getter @Setter private int imdbId; - @Getter @Setter private int tvdbId; + @Setter private int imdbId; + @Setter private int tvdbId; public interface MovieReleaseBuilderName { MovieReleaseBuilderOther name(String name); From 012081f41f5acdabaa51ee0cb3948397234795d2 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 13:44:34 +0100 Subject: [PATCH 18/54] changes --- .../java/awt/Component/ComponentExt.java | 5 +- .../AbstractButton/AbstractButtonExt.java | 9 +- .../gui/jcomponent/jcombobox/MyComboBox.java | 58 ++--- .../preference/StructureFolderPanel.java | 33 ++- .../lib/control/TvReleaseControl.java | 22 +- .../subtitleproviders/adapters/Adapter.java | 63 ++--- .../tvsubtitles/JTVSubtitlesApi.java | 47 ++-- SubLibrary/pom.xml | 12 +- .../java/util/Optional/OptionalExt.java | 220 +++++++++++++++++ .../java/util/Optional/OptionalExtension.java | 225 ------------------ .../java/util/OptionalInt/OptionalIntExt.java | 125 ++++++++++ .../OptionalInt/OptionalIntExtension.java | 78 ------ .../util/OptionalLong/OptionalLongExt.java | 82 +++++++ .../OptionalLong/OptionalLongExtension.java | 77 ------ .../lodder/subtools/sublibrary/Manager.java | 170 +++++++------ .../subtools/sublibrary/cache/Cache.java | 8 +- .../subtools/sublibrary/cache/DiskCache.java | 135 ++++++----- .../sublibrary/cache/InMemoryCache.java | 8 +- .../cache/SerializableDiskCache.java | 8 +- .../sublibrary/cache/TypedDiskCache.java | 43 ++-- .../sublibrary/data/imdb/ImdbAdapter.java | 12 +- .../sublibrary/data/tvdb/TheTvdbAdapter.java | 18 +- pom.xml | 17 +- 23 files changed, 805 insertions(+), 670 deletions(-) create mode 100644 SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExt.java delete mode 100644 SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java create mode 100644 SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExt.java delete mode 100644 SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExtension.java create mode 100644 SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExt.java delete mode 100644 SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java diff --git a/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java b/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java index 013e25eb..088c10b8 100644 --- a/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java +++ b/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java @@ -16,10 +16,11 @@ public class ComponentExt { public static void setRecursive(@This Component component, Consumer consumer) { - setRecursive(component, consumer, c -> true); + setRecursive(component, consumer, _ -> true); } - public static void setRecursive(@This Component component, Consumer consumer, Predicate condition) { + public static void setRecursive(@This Component component, Consumer consumer, + Predicate condition) { if (component != null) { consumer.accept(component); if (component instanceof Container container && condition.test(container)) { diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java index fc66ded3..d1120211 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java @@ -20,17 +20,18 @@ public class AbstractButtonExt { } public static @Self AbstractButton withActionListener(@This AbstractButton abstractButton, Runnable listener) { - withActionListener(abstractButton, arg -> listener.run()); + withActionListener(abstractButton, _ -> listener.run()); return abstractButton; } - public static @Self AbstractButton withActionListenerSelf(@This AbstractButton abstractButton, Consumer<@Self AbstractButton> selfConsumerListener) { - withActionListener(abstractButton, arg -> selfConsumerListener.accept(abstractButton)); + public static @Self AbstractButton withActionListenerSelf(@This AbstractButton abstractButton, + Consumer<@Self AbstractButton> selfConsumerListener) { + withActionListener(abstractButton, _ -> selfConsumerListener.accept(abstractButton)); return abstractButton; } public static @Self AbstractButton withSelectedListener(@This AbstractButton abstractButton, BooleanConsumer selectedConsumer) { - withActionListener(abstractButton, arg -> selectedConsumer.accept(abstractButton.isSelected())); + withActionListener(abstractButton, _ -> selectedConsumer.accept(abstractButton.isSelected())); return abstractButton; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java index b524fe3f..2f49d481 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java @@ -13,6 +13,7 @@ import java.util.function.Predicate; import com.google.common.collect.Iterables; +import manifold.ext.rt.api.Self; import org.lodder.subtools.multisubdownloader.gui.ToStringListCellRenderer; public class MyComboBox extends JComboBox { @@ -21,18 +22,14 @@ public class MyComboBox extends JComboBox { private Border defaultBorder; private Predicate selectedValueVerifier; - @Serial - private static final long serialVersionUID = -8449456978689044914L; + @Serial private static final long serialVersionUID = -8449456978689044914L; /** - * Creates a MyComboBox that takes its items from an - * existing ComboBoxModel. Since the - * ComboBoxModel is provided, a combo box created using - * this constructor does not create a default combo box model and - * may impact how the insert, remove and add methods behave. + * Creates a MyComboBox that takes its items from an existing ComboBoxModel. Since the + * ComboBoxModel is provided, a combo box created using this constructor does not create a default + * combo box model and may impact how the insert, remove and add methods behave. * - * @param aModel the ComboBoxModel that provides the - * displayed list of items + * @param aModel the ComboBoxModel that provides the displayed list of items * @see DefaultComboBoxModel */ public MyComboBox(ComboBoxModel aModel) { @@ -41,9 +38,8 @@ public MyComboBox(ComboBoxModel aModel) { } /** - * Creates a MyComboBox that contains the elements - * in the specified array. By default, the first item in the array - * (and therefore the data model) becomes selected. + * Creates a MyComboBox that contains the elements in the specified array. By default, the first item + * in the array (and therefore the data model) becomes selected. * * @param items an array of objects to insert into the combo box * @see DefaultComboBoxModel @@ -54,9 +50,8 @@ public MyComboBox(E[] items) { } /** - * Creates a MyComboBox that contains the elements - * in the specified collection. By default, the first item in the - * collection (and therefore the data model) becomes selected. + * Creates a MyComboBox that contains the elements in the specified collection. By default, the first + * item in the collection (and therefore the data model) becomes selected. * * @param items a collection of objects to insert into the combo box * @param elementType the type of elements in the list @@ -68,9 +63,8 @@ public MyComboBox(Collection items, Class elementType) { } /** - * Creates a MyComboBox that contains the elements - * in the specified Vector. By default, the first item in the vector - * (and therefore the data model) becomes selected. + * Creates a MyComboBox that contains the elements in the specified Vector. By default, the first item + * in the vector (and therefore the data model) becomes selected. * * @param items an array of vectors to insert into the combo box * @see DefaultComboBoxModel @@ -81,10 +75,8 @@ public MyComboBox(Vector items) { } /** - * Creates a MyComboBox with a default data model. - * The default data model is an empty list of objects. - * Use addItem to add items. By default, the first item - * in the data model becomes selected. + * Creates a MyComboBox with a default data model. The default data model is an empty list of objects. + * Use addItem to add items. By default, the first item in the data model becomes selected. * * @see DefaultComboBoxModel */ @@ -97,51 +89,51 @@ public static MyComboBox ofValues(E... values) { return new MyComboBox<>(values); } - public MyComboBox withModel(ComboBoxModel model) { + public @Self MyComboBox withModel(ComboBoxModel model) { setModel(model); return this; } - public MyComboBox withRenderer(ListCellRenderer renderer) { + public @Self MyComboBox withRenderer(ListCellRenderer renderer) { setRenderer(renderer); return this; } - public MyComboBox withToStringRenderer(Function toStringRenderer) { + public @Self MyComboBox withToStringRenderer(Function toStringRenderer) { return withRenderer(ToStringListCellRenderer.of(getRenderer(), toStringRenderer)); } - public MyComboBox withToMessageStringRenderer(Function toStringRenderer) { + public @Self MyComboBox withToMessageStringRenderer(Function toStringRenderer) { return withRenderer(ToStringListCellRenderer.ofMessage(getRenderer(), toStringRenderer)); } - public MyComboBox withItemListener(ItemListener itemListener) { + public @Self MyComboBox withItemListener(ItemListener itemListener) { this.addItemListener(itemListener); return this; } - public MyComboBox withItemListener(Runnable itemListener) { + public @Self MyComboBox withItemListener(Runnable itemListener) { return withItemListener(arg -> itemListener.run()); } - public MyComboBox withSelectedItem(E item) { + public @Self MyComboBox withSelectedItem(E item) { setSelectedItem(item); return this; } - public MyComboBox withActionListener(ActionListener actionListener) { + public @Self MyComboBox withActionListener(ActionListener actionListener) { addActionListener(actionListener); return this; } @SuppressWarnings("unchecked") - public MyComboBox withEventConsumer(Consumer> actionListener) { + public @Self MyComboBox withEventConsumer(Consumer> actionListener) { addActionListener(event -> actionListener.accept((MyComboBox) (event.getSource()))); return this; } @SuppressWarnings("unchecked") - public MyComboBox withSelectedItemConsumer(Consumer actionListener) { + public @Self MyComboBox withSelectedItemConsumer(Consumer actionListener) { addActionListener(event -> actionListener.accept(((MyComboBox) (event.getSource())).getSelectedItem())); return this; } @@ -152,7 +144,7 @@ public E getSelectedItem() { return (E) super.getSelectedItem(); } - public MyComboBox withSelectedValueVerifier(Predicate valueVerifier) { + public @Self MyComboBox withSelectedValueVerifier(Predicate valueVerifier) { this.selectedValueVerifier = valueVerifier; return this; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index 22a13c13..91b13731 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -36,28 +36,33 @@ public StructureFolderPanel(LibrarySettings librarySettings, VideoType videoType super(new MigLayout("insets 0, fill, nogrid")); this.librarySettings = librarySettings; - JPanel titelPanel = TitlePanel.title(Messages.getString("PreferenceDialog.MoveToLibrary")) + JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.MoveToLibrary")) .margin(0).padding(0).marginLeft(20).paddingLeft(20).useGrid() .panelColumnConstraints("[shrink][grow][shrink]").addTo(this, "span, grow"); { - new JLabel(Messages.getString("PreferenceDialog.Location")).addTo(titelPanel, "shrink"); - this.txtLibraryFolder = MyTextFieldPath.builder().requireValue().build().withColumns(20).addTo(titelPanel, "grow"); + new JLabel(Messages.getString("PreferenceDialog.Location")).addTo(titlePanel, "shrink"); + this.txtLibraryFolder = + MyTextFieldPath.builder().requireValue().build().withColumns(20).addTo(titlePanel, "grow"); new JButton(Messages.getString("App.Browse")) .withActionListener(() -> MemoryFolderChooser.getInstance() .selectDirectory(getRootPane(), Messages.getString("PreferenceDialog.LibraryFolder")) .ifPresent(txtLibraryFolder::setObject)) - .addTo(titelPanel, "shrink, wrap"); + .addTo(titlePanel, "shrink, wrap"); - new JLabel(Messages.getString("StructureBuilderDialog.Structure")).addTo(titelPanel, "shrink"); - this.txtFolderStructure = - MyTextFieldString.builder().requireValue().build().withColumns(20).withDisabled().addTo(titelPanel, "grow"); + new JLabel(Messages.getString("StructureBuilderDialog.Structure")).addTo(titlePanel, "shrink"); + this.txtFolderStructure = MyTextFieldString.builder() + .requireValue() + .build() + .withColumns(20) + .withDisabled() + .addTo(titlePanel, "grow"); JButton btnStructure = new JButton(Messages.getString("StructureBuilderDialog.Structure")) .withActionListener(() -> { StructureBuilderDialog sDialog = new StructureBuilderDialog(null, Messages.getString("PreferenceDialog.StructureBuilderTitle"), - true, videoType, StructureBuilderDialog.StructureType.FOLDER, manager, userInteractionHandler, - getLibraryStructureBuilder()); + true, videoType, StructureBuilderDialog.StructureType.FOLDER, manager, + userInteractionHandler, getLibraryStructureBuilder()); String value = sDialog.showDialog(txtFolderStructure.getText()); if (!"".equals(value)) { txtFolderStructure.setText(value); @@ -65,12 +70,14 @@ public StructureFolderPanel(LibrarySettings librarySettings, VideoType videoType }) .withDisabled() - .addTo(titelPanel, "shrink, wrap"); + .addTo(titlePanel, "shrink, wrap"); - this.chkRemoveEmptyFolder = new JCheckBox(Messages.getString("PreferenceDialog.RemoveEmptyFolders")).addTo(titelPanel, "span, wrap"); + this.chkRemoveEmptyFolder = new JCheckBox(Messages.getString("PreferenceDialog.RemoveEmptyFolders")) + .addTo(titlePanel, "span, wrap"); - PanelCheckBox.checkbox(this.chkReplaceSpace = new JCheckBox(Messages.getString("PreferenceDialog.ReplaceSpaceWith"))) - .panelOnSameLine().addTo(titelPanel, "span") + PanelCheckBox.checkbox(this.chkReplaceSpace = + new JCheckBox(Messages.getString("PreferenceDialog.ReplaceSpaceWith"))) + .panelOnSameLine().addTo(titlePanel, "span") .addComponent(this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); // behaviour diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index 1d8135ae..bb3ce9c0 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -19,7 +19,8 @@ public class TvReleaseControl extends ReleaseControl { private final TheTvdbAdapter jtvdba; private final TvRelease tvRelease; - public TvReleaseControl(TvRelease tvRelease, Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { + public TvReleaseControl(TvRelease tvRelease, Settings settings, Manager manager, + UserInteractionHandler userInteractionHandler) { super(settings, manager); this.tvRelease = tvRelease; this.jtvdba = TheTvdbAdapter.getInstance(manager, userInteractionHandler); @@ -30,7 +31,8 @@ public void process() throws ReleaseControlException { if (StringUtils.isBlank(tvRelease.name)) { throw new ReleaseControlException("Unable to extract episode details, check file", tvRelease); } else { - LOGGER.debug("process: show name [{}], season [{}], episode [{}]", tvRelease.name, tvRelease.season, tvRelease.episodeNumbers); + LOGGER.debug("process: show name [{}], season [{}], episode [{}]", tvRelease.name, tvRelease.season, + tvRelease.episodeNumbers); if (tvRelease.special) { processSpecial(); } else { @@ -40,26 +42,26 @@ public void process() throws ReleaseControlException { } private void processTvdb() throws ReleaseControlException { - jtvdba.getSerie(tvRelease.name).ifPresentOrThrow(tvdbSerie -> { + jtvdba.getSerie(tvRelease.name).useIfPresent(tvdbSerie -> { tvRelease.tvdbId = tvdbSerie.id; tvRelease.originalName = tvdbSerie.serieName; jtvdba.getEpisode(tvdbSerie.id, tvRelease.season, tvRelease.firstEpisodeNumber) - .ifPresentOrThrow( - tvRelease::updateTvdbEpisodeInfo, - () -> new ReleaseControlException("Season ${tvRelease.season} Episode ${tvRelease.episodeNumbers} not found, check file", - tvRelease)); - }, () -> new ReleaseControlException("Show not found, check file", tvRelease)); + .useIfPresent(tvRelease::updateTvdbEpisodeInfo) + .orElseThrow(() -> new ReleaseControlException( + "Season ${tvRelease.season} Episode ${tvRelease.episodeNumbers} not found, check file", + tvRelease)); + }).orElseThrow(() -> new ReleaseControlException("Show not found, check file", tvRelease)); } private void processSpecial() throws ReleaseControlException { - jtvdba.getSerie(tvRelease.name).ifPresentOrThrow(tvdbSerie -> { + jtvdba.getSerie(tvRelease.name).useIfPresent(tvdbSerie -> { tvRelease.tvdbId = tvdbSerie.id; tvRelease.originalName = tvdbSerie.serieName; if (getSettings().processEpisodeSource == SettingsProcessEpisodeSource.TVDB) { jtvdba.getEpisode(tvdbSerie.id, tvRelease.season, tvRelease.firstEpisodeNumber) .ifPresent(tvRelease::updateTvdbEpisodeInfo); } - }, () -> new ReleaseControlException("Show not found, check file", tvRelease)); + }).orElseThrow(() -> new ReleaseControlException("Show not found, check file", tvRelease)); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 62b24cf4..60b16c7f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -58,8 +58,8 @@ default Set searchSubtitles(MovieRelease movieRelease, Language langua } catch (IOException e) { LOGGER.error("Error calculating file hash", e); } catch (Exception e) { - LOGGER.error("API %s searchSubtitles using file hash for movie [%s] (%s)".formatted(getSubtitleSource().getName(), - movieRelease.name, e.getMessage()), e); + LOGGER.error("API %s searchSubtitles using file hash for movie [%s] (%s)".formatted( + getSubtitleSource().getName(), movieRelease.name, e.getMessage()), e); } } } @@ -67,16 +67,16 @@ default Set searchSubtitles(MovieRelease movieRelease, Language langua try { subtitles.addAll(searchMovieSubtitlesWithId(imdbId, language)); } catch (Exception e) { - LOGGER.error("API %s searchSubtitles using imdbid [%s] for movie [%s] (%s)".formatted(getSubtitleSource().getName(), - imdbId, movieRelease.name, e.getMessage()), e); + LOGGER.error("API %s searchSubtitles using imdbid [%s] for movie [%s] (%s)".formatted( + getSubtitleSource().getName(), imdbId, movieRelease.name, e.getMessage()), e); } }); if (subtitles.isEmpty()) { try { subtitles.addAll(searchMovieSubtitlesWithName(movieRelease.name, movieRelease.year, language)); } catch (Exception e) { - LOGGER.error("API %s searchSubtitles using title for movie [%s] (%s)".formatted(getSubtitleSource().getName(), - movieRelease.name, e.getMessage()), e); + LOGGER.error("API %s searchSubtitles using title for movie [%s] (%s)".formatted( + getSubtitleSource().getName(), movieRelease.name, e.getMessage()), e); } } return convertToSubtitles(movieRelease, subtitles, language); @@ -97,7 +97,9 @@ default Set searchSubtitles(TvRelease tvRelease, Language language) { } catch (Exception e) { String displayName = StringUtils.defaultIfBlank(tvRelease.originalName, tvRelease.name); LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(displayName, tvRelease.season, tvRelease.firstEpisodeNumber), e.getMessage()), e); + TvRelease.formatName(displayName, tvRelease.season, tvRelease.firstEpisodeNumber), + e.getMessage()), + e); return Set.of(); } } @@ -118,14 +120,15 @@ default Optional getProviderSerieId(TvRelease tvRelease) throws X } } - default Optional getProviderSerieId(TvRelease tvRelease, Function nameFunction) throws X { + default Optional getProviderSerieId(TvRelease tvRelease, Function nameFunction) + throws X { return getProviderSerieId(tvRelease, nameFunction, nameFunction); } default Optional getProviderSerieId(TvRelease tvRelease, Function nameFunction, Function customNameFunction) throws X { - return getProviderSerieId(nameFunction.apply(tvRelease), customNameFunction.apply(tvRelease), tvRelease.displayName, - tvRelease.season, tvRelease.getTvdbIdOptional()); + return getProviderSerieId(nameFunction.apply(tvRelease), customNameFunction.apply(tvRelease), + tvRelease.displayName, tvRelease.season, tvRelease.getTvdbIdOptional()); } default Optional getProviderSerieId(String serieName, String displayName, int season, @@ -133,10 +136,10 @@ default Optional getProviderSerieId(String serieName, String displ return getProviderSerieId(serieName, serieName, displayName, season, tvdbIdOptional); } - default Optional getProviderSerieId(String serieName, String serieNameToSearchFor, String displayName, int season, - OptionalInt tvdbIdOptional) throws X { - Supplier> tvdbIdValueBuilder = - () -> tvdbIdOptional.mapToObj(tvdbId -> getManager().valueBuilder().cacheType(CacheType.DISK) + default Optional getProviderSerieId(String serieName, String serieNameToSearchFor, String displayName, + int season, OptionalInt tvdbIdOptional) throws X { + Supplier> tvdbIdValueBuilder = () -> tvdbIdOptional.mapToObj( + tvdbId -> getManager().valueBuilder().cacheType(CacheType.DISK) .key("%s-serieName-tvdbId:%s-%s".formatted(getProviderName(), tvdbId, useSeasonForSerieId() ? season : -1))).orElseThrow(); if (tvdbIdOptional.isPresent() && tvdbIdValueBuilder.get().isPresent()) { @@ -157,9 +160,10 @@ default Optional getProviderSerieId(String serieName, String serie return Optional.empty(); } } else { - Optional serieMapping = serieNameValueBuilder.returnType(SerieMapping.class).getOptional(); - serieMapping.ifPresent( - providerSerieName -> tvdbIdOptional.ifPresent(tvdbId -> tvdbIdValueBuilder.get().value(providerSerieName).store())); + Optional serieMapping = + serieNameValueBuilder.returnType(SerieMapping.class).getOptional(); + serieMapping.ifPresent(providerSerieName -> tvdbIdOptional.ifPresent( + tvdbId -> tvdbIdValueBuilder.get().value(providerSerieName).store())); return serieMapping; } } @@ -180,33 +184,34 @@ default Optional getProviderSerieId(String serieName, String serie SerieMapping serieMapping; if (!getUserInteractionSettings().isOptionsConfirmProviderMapping && providerSerieIds.size() == 1) { - serieMapping = new SerieMapping(serieName, providerSerieIds.first.id, providerSerieIds.first.name, seasonToUse); + serieMapping = + new SerieMapping(serieName, providerSerieIds.first.id, providerSerieIds.first.name, seasonToUse); } else { ValueBuilderIsPresentIntf previousResultsValueBuilder = getManager().valueBuilder() .cacheType(CacheType.MEMORY) - .key("%s-serieName-prev-results:%s-%s".formatted(getProviderName(), displayName.toLowerCase(), seasonToUse)); + .key("%s-serieName-prev-results:%s-%s".formatted(getProviderName(), displayName.toLowerCase(), + seasonToUse)); boolean previousResultsPresent = previousResultsValueBuilder.isPresent(); Optional uriForSerie; // Check if the previous results were the same for the service. If so, don't ask the user to select again - if (previousResultsPresent - && previousResultsValueBuilder.returnType((Class>) null, null).getCollection().equals(providerSerieIds)) { + if (previousResultsPresent && previousResultsValueBuilder.returnType((Class>) null, null) + .getCollection() + .equals(providerSerieIds)) { uriForSerie = Optional.empty(); } else { // let the user select the correct provider serie id - uriForSerie = getUserInteractionHandler().selectFromList(providerSerieIds, - useSeasonForSerieId() - ? Messages.getString("SelectDialog.SelectSerieNameForNameWithSeason").formatted(displayName, seasonToUse) - : Messages.getString("SelectDialog.SelectSerieNameForName").formatted(displayName), - getProviderName(), - this::providerSerieIdToDisplayString); + uriForSerie = getUserInteractionHandler().selectFromList(providerSerieIds, useSeasonForSerieId() ? + Messages.getString("SelectDialog.SelectSerieNameForNameWithSeason") + .formatted(displayName, seasonToUse) : + Messages.getString("SelectDialog.SelectSerieNameForName").formatted(displayName), + getProviderName(), this::providerSerieIdToDisplayString); } if (uriForSerie.isEmpty()) { if (serieNameToSearchFor.equals(serieName)) { // if no provider serie id was selected, store a temporary null value with expiration time of 1 day, // or the doubled previously temporary value (if present) - serieNameValueBuilder - .value(new SerieMapping(serieNameToSearchFor, null, null, seasonToUse)) + serieNameValueBuilder.value(new SerieMapping(serieNameToSearchFor, null, null, seasonToUse)) .storeTempNullValue() .timeToLive(serieNameValueBuilder.getTemporaryTimeToLive().map(v -> v * 2) .orElseGet(() -> TimeUnit.SECONDS.convert(1, TimeUnit.DAYS))) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index cfa16ab7..3565aea2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -39,22 +39,24 @@ public List getUrisForSerieName(String serieName) throws TvSubt .url(DOMAIN + "/search.php") .addData("qs", serieName) .postAsJsoupDocument() - .select(".left_articles > ul > li a").stream() - .map(element -> new ProviderSerieId(element.text(), StringUtils.substringAfterLast(element.attr("href"), "/"))) + .select(".left_articles > ul > li a") + .stream() + .map(element -> new ProviderSerieId(element.text(), + StringUtils.substringAfterLast(element.attr("href"), "/"))) .toList(); } catch (Exception e) { throw new TvSubtitlesException(e); } } - public Set getSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) - throws TvSubtitlesException { - return getEpisodeUrl(SERIE_URL_PREFIX + providerSerieId.getProviderId(), season, episode) - .mapToObj((String episodeUrl) -> getSubtitles(episodeUrl, language)) - .orElseGet(Set::of); + public Set getSubtitles(SerieMapping providerSerieId, int season, int episode, + Language language) throws TvSubtitlesException { + return getEpisodeUrl(SERIE_URL_PREFIX + providerSerieId.getProviderId(), season, episode).mapThrowing( + (String episodeUrl) -> getSubtitles(episodeUrl, language)).orElseGet(Set::of); } - private Set getSubtitles(String episodeUrl, Language language) throws TvSubtitlesException { + private Set getSubtitles(String episodeUrl, Language language) + throws TvSubtitlesException { return manager.valueBuilder() .memoryCache() .key("%s-subtitles-%s-%s".formatted(getSubtitleSource().name(), episodeUrl, language)) @@ -62,7 +64,8 @@ private Set getSubtitles(String episodeUrl, Langu Set lSubtitles = new HashSet<>(); try { Document searchEpisodeDoc = - this.getHtml(episodeUrl.replace(".html", "-" + language.getLangCode() + ".html")).cacheType(CacheType.NONE) + this.getHtml(episodeUrl.replace(".html", "-" + language.getLangCode() + ".html")) + .cacheType(CacheType.NONE) .getAsJsoupDocument(); Elements searchEpisodes = searchEpisodeDoc.select(".left_articles > a"); @@ -71,7 +74,8 @@ private Set getSubtitles(String episodeUrl, Langu for (Element ep : searchEpisodes) { String url = ep.attr("href"); if (url.contains("subtitle-")) { - Document subtitlePageDoc = this.getHtml(DOMAIN + url).cacheType(CacheType.NONE).getAsJsoupDocument(); + Document subtitlePageDoc = + this.getHtml(DOMAIN + url).cacheType(CacheType.NONE).getAsJsoupDocument(); String filename = null, rip = null, title = null, author = null; Elements subtitlePageTableDoc = subtitlePageDoc.getElementsByClass("subtitle1"); if (subtitlePageTableDoc.size() == 1) { @@ -93,8 +97,9 @@ private Set getSubtitles(String episodeUrl, Langu TVsubtitlesSubtitleDescriptor sub = TVsubtitlesSubtitleDescriptor.builder() .filename(filename) .url(DOMAIN + "/files/" + URLEncoder.encode( - filename.replace(title + ".", "").replace(".srt", ".zip").replace(" - ", "_"), - StandardCharsets.UTF_8)) + filename.replace(title + ".", "") + .replace(".srt", ".zip") + .replace(" - ", "_"), StandardCharsets.UTF_8)) .rip(rip) .author(author) .build(); @@ -122,18 +127,24 @@ private Optional getEpisodeUrl(String showUrl, int season, int episode) .key("%s-episodeUrl-%s-%s-%s".formatted(getSubtitleSource().name(), showUrl, season, episode)) .optionalSupplier(() -> { try { - String formattedSeasonEpisode = season + "x" + (episode < 10 ? "0" + episode : String.valueOf(episode)); - return getHtml(showUrl.replace(".html", "-" + season + ".html")) - .getAsJsoupDocument() - .getElementById("table5").getElementsByTag("tr").stream().skip(1) + String formattedSeasonEpisode = + season + "x" + (episode < 10 ? "0" + episode : String.valueOf(episode)); + return getHtml(showUrl.replace(".html", "-" + season + ".html")).getAsJsoupDocument() + .getElementById("table5") + .getElementsByTag("tr") + .stream() + .skip(1) .filter(row -> Optional.ofNullable(row.selectFirst("td")) .map(element -> formattedSeasonEpisode.equals(element.text())) .orElse(false)) - .map(element -> DOMAIN + "/" + element.select("td").get(1).selectFirst("a").attr("href")).findAny(); + .map(element -> DOMAIN + "/" + + element.select("td").get(1).selectFirst("a").attr("href")) + .findAny(); } catch (Exception e) { throw new TvSubtitlesException(e); } - }).getOptional(); + }) + .getOptional(); } @Override diff --git a/SubLibrary/pom.xml b/SubLibrary/pom.xml index 2a99679d..414f9904 100644 --- a/SubLibrary/pom.xml +++ b/SubLibrary/pom.xml @@ -61,10 +61,14 @@ org.jsoup - jsoup - - - org.hsqldb + jsoup + + + org.jspecify + jspecify + + + org.hsqldb hsqldb diff --git a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExt.java b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExt.java new file mode 100644 index 00000000..87625224 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExt.java @@ -0,0 +1,220 @@ +package extensions.java.util.Optional; + +import java.util.Optional; +import java.util.OptionalInt; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; +import name.falgout.jeffrey.throwing.ThrowingConsumer; +import name.falgout.jeffrey.throwing.ThrowingFunction; +import name.falgout.jeffrey.throwing.ThrowingToIntFunction; + +@UtilityClass +@SuppressWarnings("OptionalUsedAsFieldOrParameterType") +@Extension +public class OptionalExt { + + /** + * If the value is present, apply the {@link ThrowingFunction} and return the value. Otherwise return {@code null} + * + * @param optional input object of the extension method + * @param function the {@link ThrowingFunction} to apply to the value if present + * @param The type of value of the input {@code Optional} + * @param type of the return value + * @param type of the exception that can be thrown + * @return the result of the {@link ThrowingFunction} if the value is present, otherwise {@code null} + * @throws X exception type of the throwing Function + */ + public static Optional mapThrowing(@This Optional optional, + ThrowingFunction function) throws X { + return optional.isPresent() ? Optional.ofNullable(function.apply(optional.get())) : Optional.empty(); + } + // + // /** + // * If a value is present, returns the result of applying the given {@code Optional}-bearing mapping + // function to the + // * value, otherwise returns an empty {@code Optional}. + // * + // *

+ // * This method is similar to {@link Optional#map(Function)}, but the mapping function is one whose result + // is already + // * an {@code Optional}, and if invoked, {@code flatMap} does not wrap it within an additional {@code + // Optional}. + // * + // * @param optional input object of the extension method + // * @param The type of value of the input {@code Optional} + // * @param The type of exception that can be thrown by the {@code ThrowingFunction} + // * @param mapper the mapping function to apply to a value, if present + // * @return the result of applying an {@code Optional}-bearing mapping function to the value of this + // * {@code Optional}, if a value is present, otherwise an empty {@code Optional} + // * @throws X exception type of the throwing Function + // * @throws NullPointerException if the mapping function is {@code null} or returns a {@code null} result + // */ + // public static Optional flatMapThrowing(@This Optional optional, + // ThrowingFunction, X> mapper) throws X { + // if (optional.isEmpty()) { + // return Optional.empty(); + // } else { + // return Objects.requireNonNull(mapper.apply(optional.get())); + // } + // } + // + // /** + // * If a value is present, returns the value, otherwise returns the result produced by the supplying function. + // * + // * @param The type of value of the input {@code Optional} + // * @param The type of exception that can be thrown by the {@code ThrowingSupplier} + // * @param optional input object of the extension method + // * @param supplier the supplying function that produces a value to be returned + // * @return the value, if present, otherwise the result produced by the supplying function + // * @throws X exception type of the throwing Supplier + // * @throws NullPointerException if no value is present and the supplying function is {@code null} + // */ + // + // public static T orElseGetThrowing(@This Optional optional, + // ThrowingSupplier supplier) throws X { + // return optional.isPresent() ? optional.get() : supplier.get(); + // } + // + // /** + // * If a value is present, applies the given function on the value. Otherwise, get the value from the provided + // * supplier. + // * + // * @param The type of value of the input {@code Optional} + // * @param The type of value of the return value + // * @param optional input object of the extension method + // * @param ifPresentConsumer the function to be applied on the value, if present + // * @param emptyValue the value to return when no value is present + // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is + // * present and the given empty-based action is {@code null}. + // */ + // public static S applyOrElse(@This Optional optional, Function ifPresentConsumer, S + // emptyValue) { + // if (optional.isPresent()) { + // return ifPresentConsumer.apply(optional.get()); + // } else { + // return emptyValue; + // } + // } + // + // /** + // * If a value is present, applies the given function on the value. Otherwise, get the value from the provided + // * supplier. + // * + // * @param The type of value of the input {@code Optional} + // * @param The type of value of the return value + // * @param The type of exception that can be thrown by the {@code ThrowingConsumer} + // * @param optional input object of the extension method + // * @param ifPresentConsumer the function to be applied on the value, if present + // * @param emptyValue the value to return when no value is present + // * @throws X exception type of the throwing Consumer + // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is + // * present and the given empty-based action is {@code null}. + // */ + // public static S applyOrElseThrowing(@This Optional optional, + // ThrowingFunction ifPresentConsumer, S emptyValue) throws X { + // if (optional.isPresent()) { + // return ifPresentConsumer.apply(optional.get()); + // } else { + // return emptyValue; + // } + // } + // + // /** + // * If a value is present, applies the given function on the value. Otherwise, get the value from the provided + // * supplier. + // * + // * @param The type of value of the input {@code Optional} + // * @param The type of value of the return value + // * @param optional input object of the extension method + // * @param ifPresentConsumer the function to be applied on the value, if present + // * @param ifAbsentSupplier the supplier to create a value when no value is present + // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is + // * present and the given empty-based action is {@code null}. + // */ + // public static S applyOrElseGet(@This Optional optional, Function ifPresentConsumer, + // Supplier ifAbsentSupplier) { + // if (optional.isPresent()) { + // return ifPresentConsumer.apply(optional.get()); + // } else { + // return ifAbsentSupplier.get(); + // } + // } + // + // /** + // * If a value is present, applies the given function on the value. Otherwise, get the value from the provided + // * supplier. + // * + // * @param The type of value of the input {@code Optional} + // * @param The type of value of the return value + // * @param The type of exception that can be thrown by the {@code ThrowingConsumer} + // * @param optional input object of the extension method + // * @param ifPresentConsumer the function to be applied on the value, if present + // * @param ifAbsentSupplier the supplier to create a value when no value is present + // * @throws X exception type of the throwing Consumer + // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is + // * present and the given empty-based action is {@code null}. + // */ + // public static S applyElseGetThrowing(@This Optional optional, + // ThrowingFunction ifPresentConsumer, ThrowingSupplier ifAbsentSupplier) throws X { + // if (optional.isPresent()) { + // return ifPresentConsumer.apply(optional.get()); + // } else { + // return ifAbsentSupplier.get(); + // } + // } + // + // /** + // * If a value is present, performs the given action with the value, otherwise does nothing. + // * + // * @param The type of value of the input {@code Optional} + // * @param The type of exception that can be thrown by the {@code ThrowingConsumer} + // * @param optional input object of the extension method + // * @param consumer the action to be performed, if a value is present + // * @throws X exception type of the throwing Consumer + // * @throws NullPointerException if value is present and the given action is {@code null} + // */ + // public static void ifPresentThrowing(@This Optional optional, + // ThrowingConsumer consumer) throws X { + // if (optional.isPresent()) { + // consumer.accept(optional.get()); + // } + // } + // + // /** + // * If a value is present, performs the given action with the value, otherwise performs the given empty-based + // * action. + // * + // * @param The type of value of the input {@code Optional} + // * @param The type of exception that can be thrown by the {@code ThrowingConsumer} + // * @param optional input object of the extension method + // * @param ifPresentConsumer the action to be performed, if a value is present + // * @param ifAbsentRunnable the empty-based action to be performed, if no value is present + // * @throws X exception type of the throwing Consumer + // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is + // * present and the given empty-based action is {@code null}. + // */ + // public static void ifPresentOrElseThrowing(@This Optional optional, + // ThrowingConsumer ifPresentConsumer, ThrowingRunnable ifAbsentRunnable) throws X { + // if (optional.isPresent()) { + // ifPresentConsumer.accept(optional.get()); + // } else { + // ifAbsentRunnable.run(); + // } + // } + + public static OptionalInt mapToInt(@This Optional optional, + ThrowingToIntFunction mapper) throws X { + return optional.isPresent() ? OptionalInt.of(mapper.applyAsInt(optional.get())) : OptionalInt.empty(); + } + + public static @Self Optional useIfPresent(@This Optional optional, + ThrowingConsumer consumer) throws X { + if (optional.isPresent()) { + consumer.accept(optional.get()); + } + return optional; + } +} diff --git a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java deleted file mode 100644 index 2408fb62..00000000 --- a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExtension.java +++ /dev/null @@ -1,225 +0,0 @@ -package extensions.java.util.Optional; - -import java.util.Objects; -import java.util.Optional; -import java.util.OptionalInt; -import java.util.function.Function; -import java.util.function.Supplier; - -import lombok.experimental.UtilityClass; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; -import name.falgout.jeffrey.throwing.ThrowingConsumer; -import name.falgout.jeffrey.throwing.ThrowingFunction; -import name.falgout.jeffrey.throwing.ThrowingRunnable; -import name.falgout.jeffrey.throwing.ThrowingSupplier; -import name.falgout.jeffrey.throwing.ThrowingToIntFunction; - -@Extension -@UtilityClass -public class OptionalExtension { - /** - * If the value is present, apply the {@link ThrowingFunction} and return the value. Otherwise return {@code null} - * - * @param optional input object of the extension method - * @param function the {@link ThrowingFunction} to apply to the value if present - * @param The type of value of the input {@code Optional} - * @param type of the return value - * @param type of the exception that can be thrown - * @return the result of the {@link ThrowingFunction} if the value is present, otherwise {@code null} - * @throws X exception type of the throwing Function - */ - public static , T, S, X extends Throwable> Optional map(@This O optional, ThrowingFunction function) throws X { - return optional.isPresent() ? Optional.ofNullable(function.apply(optional.get())) : Optional.empty(); - } - - /** - * If a value is present, returns the result of applying the given {@code Optional}-bearing mapping function to the value, otherwise returns an - * empty {@code Optional}. - * - *

- * This method is similar to {@link #map(Function)}, but the mapping function is one whose result is already an {@code Optional}, and if invoked, - * {@code flatMap} does not wrap it within an additional {@code Optional}. - * - * @param optional input object of the extension method - * @param The type of value of the input {@code Optional} - * @param The type of value of the {@code Optional} returned by the mapping function - * @param The type of exception that can be thrown by the {@code ThrowingFunction} - * @param mapper the mapping function to apply to a value, if present - * @return the result of applying an {@code Optional}-bearing mapping function to the value of this {@code Optional}, if a value is present, - * otherwise an empty {@code Optional} - * @throws X exception type of the throwing Function - * @throws NullPointerException if the mapping function is {@code null} or returns a {@code null} result - */ - public static , T, O2 extends Optional, S, X extends Throwable> O2 flatMap( - @This O1 optional, ThrowingFunction mapper) throws X { - if (optional.isEmpty()) { - return (O2) Optional.empty(); - } else { - return Objects.requireNonNull(mapper.apply(optional.get())); - } - } - - // /** - // * If a value is present, returns an {@code Optional} describing the value, - // * otherwise returns an {@code Optional} produced by the supplying function. - // * - // * @param - // * The type of value of the input {@code Optional} - // * @param - // * The type of exception that can be thrown by the {@code ThrowingSupplier} - // * @param optional - // * input object of the extension method - // * @param supplier - // * the supplying function that produces an {@code Optional} - // * to be returned - // * @return returns an {@code Optional} describing the value of this - // * {@code Optional}, if a value is present, otherwise an - // * {@code Optional} produced by the supplying function. - // * @throws X - // * exception type of the throwing Supplier - // * @throws NullPointerException - // * if the supplying function is {@code null} or - // * produces a {@code null} result - // */ - // public static Optional orElseGet(@This Optional optional, ThrowingSupplier, X> - // supplier) throws X { - // if (optional.isPresent()) { - // return optional; - // } else { - // return Objects.requireNonNull(supplier.get()); - // } - // } - - /** - * If a value is present, returns the value, otherwise returns the result produced by the supplying function. - * - * @param The type of value of the input {@code Optional} - * @param The type of exception that can be thrown by the {@code ThrowingSupplier} - * @param optional input object of the extension method - * @param supplier the supplying function that produces a value to be returned - * @return the value, if present, otherwise the result produced by the supplying function - * @throws X exception type of the throwing Supplier - * @throws NullPointerException if no value is present and the supplying function is {@code null} - */ - - public static , T, X extends Throwable> T orElseGet(@This O optional, - ThrowingSupplier supplier) throws X { - return optional.isPresent() ? optional.get() : supplier.get(); - } - - /** - * If a value is present, performs the given action with the value, otherwise does nothing. - * - * @param The type of value of the input {@code Optional} - * @param The type of exception that can be thrown by the {@code ThrowingConsumer} - * @param optional input object of the extension method - * @param consumer the action to be performed, if a value is present - * @throws X exception type of the throwing Consumer - * @throws NullPointerException if value is present and the given action is {@code null} - */ - public static , T, X extends Throwable> void ifPresent(@This O optional, ThrowingConsumer consumer) throws X { - if (optional.isPresent()) { - consumer.accept(optional.get()); - } - } - - - /** - * If a value is present, performs the given action with the value, otherwise performs the given empty-based action. - * - * @param The type of value of the input {@code Optional} - * @param The type of exception that can be thrown by the {@code ThrowingConsumer} - * @param optional input object of the extension method - * @param ifPresentConsumer the action to be performed, if a value is present - * @param ifAbsentRunnable the empty-based action to be performed, if no value is present - * @throws X exception type of the throwing Consumer - * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is present and the given - * empty-based action is {@code null}. - */ - public static , T, X extends Throwable> void ifPresentOrElse(@This O optional, - ThrowingConsumer ifPresentConsumer, ThrowingRunnable ifAbsentRunnable) throws X { - if (optional.isPresent()) { - ifPresentConsumer.accept(optional.get()); - } else { - ifAbsentRunnable.run(); - } - } - - // public static Optional ifPresentDo(@This Optional optional, ThrowingConsumer consumer) throws X { - // if (optional.isPresent()) { - // consumer.accept(optional.get()); - // } - // return optional; - // } - // - // //// - // - // public static void orElseDo(@This Optional optional, ThrowingRunnable consumer) throws X { - // if (optional.isEmpty()) { - // consumer.run(); - // } - // } - // - // // - // - // public static Optional ifEmptyDo(@This Optional optional, ThrowingRunnable runnable) throws X { - // if (optional.isEmpty()) { - // runnable.run(); - // } - // return optional; - // } - // - // // - // - public static Optional orElseMap(@This Optional optional, ThrowingSupplier, X> supplier) - throws X { - return optional.isPresent() ? optional : supplier.get(); - } - - // - // // - // - // public static T mapOrElseGet(@This Optional optional, ThrowingFunction ifPresentFunction, - // ThrowingSupplier absentSupplier) throws X { - // return optional.isPresent() ? ifPresentFunction.apply(optional.get()) : absentSupplier.get(); - // } - // - // // - // - public static OptionalInt mapToInt(@This Optional optional, ThrowingToIntFunction mapper) throws X { - return optional.isPresent() ? OptionalInt.of(mapper.applyAsInt(optional.get())) : OptionalInt.empty(); - } - - // - public static OptionalInt mapToOptionalInt(@This Optional optional) { - return optional.map(OptionalInt::of).orElseGet(OptionalInt::empty); - } - - // - // // - // - public static Optional mapToObj(@This Optional optional, ThrowingFunction mapper) throws X { - return optional.isPresent() ? Optional.ofNullable(mapper.apply(optional.get())) : Optional.empty(); - } - - // - // // - // - // public static Optional mapToOptionalObj(@This Optional optional, ThrowingFunction, X> - // mapper) - // throws X { - // return optional.isPresent() ? mapper.apply(optional.get()) : Optional.empty(); - // } - // - // // - // - public static void ifPresentOrThrow(@This Optional optional, ThrowingConsumer consumer, - Supplier exceptionSupplier) throws X { - if (optional.isPresent()) { - consumer.accept(optional.get()); - } else { - throw exceptionSupplier.get(); - } - } -} diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExt.java b/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExt.java new file mode 100644 index 00000000..8220c2b5 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExt.java @@ -0,0 +1,125 @@ +package extensions.java.util.OptionalInt; + + +import java.util.Optional; +import java.util.OptionalInt; + +import com.pivovarit.function.ThrowingIntFunction; +import com.pivovarit.function.ThrowingSupplier; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import name.falgout.jeffrey.throwing.ThrowingIntUnaryOperator; + + +@Extension +@UtilityClass +public class OptionalIntExt { + + /** + * If the value is present, apply the {@link ThrowingIntUnaryOperator} and return the value wrapped in an + * + * @param optional input object of the extension method + * @param function the function to apply to the value if present + * @param type of the exception that can be thrown + * @return the result of the function wrapped in an @{link OptionalInt} if the value is present, otherwise an empty + * {@code OptionalInt} + * @throws X exception type of the throwing Function + * @{link OptionalInt}. Otherwise, return an empty {@code OptionalInt} + */ + public static OptionalInt map(@This OptionalInt optional, + ThrowingIntUnaryOperator function) throws X { + return optional.isPresent() ? OptionalInt.of(function.applyAsInt(optional.getAsInt())) : OptionalInt + .empty(); + } + // + // /** + // * If the value is present, apply the {@link ThrowingUnaryOperator} and return the value wrapped in an @{link + // * Optional}. Otherwise, return an empty {@code Optional} + // * + // * @param optional input object of the extension method + // * @param function the function to apply to the value if present + // * @param type of the result value wrapped in the @{link Optional} + // * @param type of the exception that can be thrown + // * @return the result of the function wrapped in an @{link Optional} if the value is present, otherwise an + // empty + // * {@code Optional} + // * @throws X exception type of the throwing Function + // */ + // public static Optional mapToObj(@This OptionalInt optional, + // ThrowingFunction function) throws X { + // return optional.isPresent() ? Optional.ofNullable(function.apply(optional.getAsInt())) : Optional.empty(); + // } + + + // public static OptionalInt ifPresentDo(@This OptionalInt optional, + // ThrowingIntConsumer consumer) throws X { + // if (optional.isPresent()) { + // consumer.accept(optional.getAsInt()); + // } + // return optional; + // } + // + // //// + // + // public static void orElseDo(@This OptionalInt optional, ThrowingRunnable consumer) + // throws X { + // if (optional.isEmpty()) { + // consumer.run(); + // } + // } + // + // // + // + + public static OptionalInt orElseMap(@This OptionalInt optionalInt, + ThrowingSupplier intSupplier) throws X { + return optionalInt.isPresent() ? optionalInt : intSupplier.get(); + } + + // + + // public static T mapOrElseGet(@This OptionalInt optionalInt, + // ThrowingIntFunction ifPresentFunction, ThrowingSupplier absentSupplier) throws X { + // return optionalInt.isPresent() ? ifPresentFunction.apply(optionalInt.getAsInt()) : absentSupplier.get(); + // } + + // + + public static Optional mapToObj(@This OptionalInt optionalInt, + ThrowingIntFunction mapper) throws X { + return optionalInt.isPresent() ? Optional.ofNullable(mapper.apply(optionalInt.getAsInt())) : Optional + .empty(); + } + + public static Integer orElseNull(@This OptionalInt optionalInt) { + return optionalInt.isPresent() ? optionalInt.getAsInt() : null; + } + // + // public static Optional mapToOptionalObj(@This OptionalInt optionalInt, + // ThrowingIntFunction, X> mapper) + // throws X { + // return optionalInt.isPresent() ? mapper.apply(optionalInt.getAsInt()) : Optional.empty(); + // } + // + // // + // + // public static OptionalInt filter(@This OptionalInt optionalInt, + // ThrowingIntPredicate predicate) + // throws X { + // return optionalInt.isPresent() && predicate.test(optionalInt.getAsInt()) ? optionalInt : OptionalInt + // .empty(); + // } + // + // // + // + // public static void ifPresentOrThrow(@This OptionalInt optionalInt, + // ThrowingIntConsumer consumer, + // Supplier exceptionSupplier) throws X { + // if (optionalInt.isPresent()) { + // consumer.accept(optionalInt.getAsInt()); + // } else { + // throw exceptionSupplier.get(); + // } + // } +} diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExtension.java b/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExtension.java deleted file mode 100644 index 27216da5..00000000 --- a/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExtension.java +++ /dev/null @@ -1,78 +0,0 @@ -package extensions.java.util.OptionalInt; - - -import java.util.Optional; -import java.util.OptionalInt; -import java.util.function.Supplier; - -import com.pivovarit.function.ThrowingIntFunction; -import com.pivovarit.function.ThrowingRunnable; -import com.pivovarit.function.ThrowingSupplier; -import lombok.experimental.UtilityClass; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; -import name.falgout.jeffrey.throwing.ThrowingIntPredicate; -import org.lodder.subtools.sublibrary.util.throwingfunction.ThrowingIntConsumer; - - -@Extension -@UtilityClass -public class OptionalIntExtension { - - public static OptionalInt ifPresentDo(@This OptionalInt optional, ThrowingIntConsumer consumer) throws X { - if (optional.isPresent()) { - consumer.accept(optional.getAsInt()); - } - return optional; - } - - //// - - public static void orElseDo(@This OptionalInt optional, ThrowingRunnable consumer) throws X { - if (optional.isEmpty()) { - consumer.run(); - } - } - - // - - public static OptionalInt orElseMap(@This OptionalInt optionalInt, ThrowingSupplier intSupplier) throws X { - return optionalInt.isPresent() ? optionalInt : intSupplier.get(); - } - - // - - public static T mapOrElseGet(@This OptionalInt optionalInt, ThrowingIntFunction ifPresentFunction, - ThrowingSupplier absentSupplier) throws X { - return optionalInt.isPresent() ? ifPresentFunction.apply(optionalInt.getAsInt()) : absentSupplier.get(); - } - - // - - public static Optional mapToObj(@This OptionalInt optionalInt, ThrowingIntFunction mapper) throws X { - return optionalInt.isPresent() ? Optional.ofNullable(mapper.apply(optionalInt.getAsInt())) : Optional.empty(); - } - - public static Optional mapToOptionalObj(@This OptionalInt optionalInt, ThrowingIntFunction, X> mapper) - throws X { - return optionalInt.isPresent() ? mapper.apply(optionalInt.getAsInt()) : Optional.empty(); - } - - // - - public static OptionalInt filter(@This OptionalInt optionalInt, ThrowingIntPredicate predicate) - throws X { - return optionalInt.isPresent() && predicate.test(optionalInt.getAsInt()) ? optionalInt : OptionalInt.empty(); - } - - // - - public static void ifPresentOrThrow(@This OptionalInt optionalInt, ThrowingIntConsumer consumer, - Supplier exceptionSupplier) throws X { - if (optionalInt.isPresent()) { - consumer.accept(optionalInt.getAsInt()); - } else { - throw exceptionSupplier.get(); - } - } -} diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExt.java b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExt.java new file mode 100644 index 00000000..9fab3cc9 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExt.java @@ -0,0 +1,82 @@ +package extensions.java.util.OptionalLong; + +import java.util.Optional; +import java.util.OptionalLong; + +import com.pivovarit.function.ThrowingFunction; +import com.pivovarit.function.ThrowingUnaryOperator; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import name.falgout.jeffrey.throwing.ThrowingLongUnaryOperator; + +@Extension +@UtilityClass +public class OptionalLongExt { + + /** + * If the value is present, apply the {@link ThrowingLongUnaryOperator} and return the value wrapped in an @{link + * OptionalLong}. Otherwise, return an empty {@code OptionalLong} + * + * @param optional input object of the extension method + * @param function the function to apply to the value if present + * @param type of the exception that can be thrown + * @return the result of the function wrapped in an @{link OptionalLong} if the value is present, otherwise an empty + * {@code OptionalLong} + * @throws X exception type of the throwing Function + */ + public static OptionalLong map(@This OptionalLong optional, + ThrowingLongUnaryOperator function) throws X { + return optional.isPresent() ? OptionalLong.of(function.applyAsLong(optional.getAsLong())) : + OptionalLong.empty(); + } + + /** + * If the value is present, apply the {@link ThrowingUnaryOperator} and return the value wrapped in an @{link + * Optional}. Otherwise, return an empty {@code Optional} + * + * @param optional input object of the extension method + * @param function the function to apply to the value if present + * @param type of the result value wrapped in the @{link Optional} + * @param type of the exception that can be thrown + * @return the result of the function wrapped in an @{link Optional} if the value is present, otherwise an empty + * {@code Optional} + * @throws X exception type of the throwing Function + */ + public static Optional mapToObj(@This OptionalLong optional, + ThrowingFunction function) throws X { + return optional.isPresent() ? Optional.ofNullable(function.apply(optional.getAsLong())) : Optional.empty(); + } + + // public static OptionalLong ifPresentDo(@This OptionalLong optional, + // ThrowingLongConsumer consumer) throws X { + // if (optional.isPresent()) { + // consumer.accept(optional.getAsLong()); + // } + // return optional; + // } + // + // //// + // + // public static void orElseDo(@This OptionalLong optional, ThrowingRunnable + // consumer) throws X { + // if (optional.isEmpty()) { + // consumer.run(); + // } + // } + // + // // + // + // public static Optional mapToObj(@This OptionalLong optionalLong, + // ThrowingLongFunction mapper) throws X { + // return optionalLong.isPresent() ? Optional.ofNullable(mapper.apply(optionalLong.getAsLong())) : + // Optional.empty(); + // } + // + // // + // + // public static OptionalLong map(@This OptionalLong optionalLong, + // ThrowingLongFunction mapper) throws X { + // return optionalLong.isPresent() ? OptionalLong.of(mapper.apply(optionalLong.getAsLong())) : optionalLong; + // } +} diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java deleted file mode 100644 index d1aa2461..00000000 --- a/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExtension.java +++ /dev/null @@ -1,77 +0,0 @@ -package extensions.java.util.OptionalLong; - -import java.util.Optional; -import java.util.OptionalLong; - -import com.pivovarit.function.ThrowingFunction; -import com.pivovarit.function.ThrowingUnaryOperator; -import lombok.experimental.UtilityClass; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; - -@Extension -@UtilityClass -public class OptionalLongExtension { - - /** - * If the value is present, apply the {@link ThrowingUnaryOperator} and return the value wrapped in an @{link OptionalLong}. - * Otherwise, return an empty {@code OptionalLong} - * - * @param optional input object of the extension method - * @param function the function to apply to the value if present - * @param type of the exception that can be thrown - * @return the result of the function wrapped in an @{link OptionalLong} if the value is present, otherwise an empty {@code OptionalLong} - * @throws X exception type of the throwing Function - */ - public static OptionalLong map(@This OptionalLong optional, ThrowingUnaryOperator function) throws X { - if (optional.isPresent()) { - Long value = function.apply(optional.getAsLong()); - if (value != null) { - return OptionalLong.of(value); - } - } - return OptionalLong.empty(); - } - - /** - * If the value is present, apply the {@link ThrowingUnaryOperator} and return the value wrapped in an @{link Optional}. - * Otherwise, return an empty {@code Optional} - * - * @param optional input object of the extension method - * @param function the function to apply to the value if present - * @param type of the result value wrapped in the @{link Optional} - * @param type of the exception that can be thrown - * @return the result of the function wrapped in an @{link Optional} if the value is present, otherwise an empty {@code Optional} - * @throws X exception type of the throwing Function - */ - public static Optional mapToObj(@This OptionalLong optional, ThrowingFunction function) throws X { - return optional.isPresent() ? Optional.ofNullable(function.apply(optional.getAsLong())) : Optional.empty(); - } - -// public static OptionalLong ifPresentDo(@This OptionalLong optional, ThrowingLongConsumer consumer) throws X { -// if (optional.isPresent()) { -// consumer.accept(optional.getAsLong()); -// } -// return optional; -// } -// -// //// -// -// public static void orElseDo(@This OptionalLong optional, ThrowingRunnable consumer) throws X { -// if (optional.isEmpty()) { -// consumer.run(); -// } -// } -// -// // -// -// public static Optional mapToObj(@This OptionalLong optionalLong, ThrowingLongFunction mapper) throws X { -// return optionalLong.isPresent() ? Optional.ofNullable(mapper.apply(optionalLong.getAsLong())) : Optional.empty(); -// } -// -// // -// -// public static OptionalLong map(@This OptionalLong optionalLong, ThrowingLongFunction mapper) throws X { -// return optionalLong.isPresent() ? OptionalLong.of(mapper.apply(optionalLong.getAsLong())) : optionalLong; -// } -} diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java index 80efadf4..00e16076 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java @@ -1,5 +1,7 @@ package org.lodder.subtools.sublibrary; +import static java.util.concurrent.TimeUnit.*; + import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.InputStream; @@ -16,7 +18,6 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.OptionalLong; -import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.function.Predicate; @@ -96,7 +97,8 @@ public interface PostBuilderPostIntf { @Accessors(chain = true, fluent = true) @RequiredArgsConstructor public static class PostBuilder - implements PostBuilderUrlIntf, PostBuilderUserAgentIntf, PostBuilderDataMapIntf, PostBuilderDataIntf, PostBuilderPostIntf { + implements PostBuilderUrlIntf, PostBuilderUserAgentIntf, PostBuilderDataMapIntf, PostBuilderDataIntf, + PostBuilderPostIntf { private final HttpClient httpClient; private String url; private String userAgent; @@ -168,11 +170,13 @@ public interface PageContentBuilderGetIntf { Optional getAsDocument() throws ParserConfigurationException, ManagerException; - Optional getAsDocument(Predicate emptyResultPredicate) throws ParserConfigurationException, ManagerException; + Optional getAsDocument(Predicate emptyResultPredicate) + throws ParserConfigurationException, ManagerException; org.jsoup.nodes.Document getAsJsoupDocument() throws ManagerException; - Optional getAsJsoupDocument(Predicate emptyResultPredicate) throws ManagerException; + Optional getAsJsoupDocument(Predicate emptyResultPredicate) + throws ManagerException; JSONObject getAsJsonObject() throws ManagerException; @@ -182,8 +186,9 @@ public interface PageContentBuilderGetIntf { @Setter @Accessors(chain = true, fluent = true) @RequiredArgsConstructor - public static class PageContentBuilder implements PageContentBuilderGetIntf, PageContentBuilderCacheTypeIntf, - PageContentBuilderUserAgentIntf, PageContentBuilderUrlIntf, PageContentBuilderRetryIntf, PageContentBuilderRetryConditionIntf, + public static class PageContentBuilder + implements PageContentBuilderGetIntf, PageContentBuilderCacheTypeIntf, PageContentBuilderUserAgentIntf, + PageContentBuilderUrlIntf, PageContentBuilderRetryIntf, PageContentBuilderRetryConditionIntf, PageContentBuilderRetryWaitIntf { private final HttpClient httpClient; private final InMemoryCache inMemoryCache; @@ -226,10 +231,11 @@ public Optional getAsDocument() throws ParserConfigurationException, M } @Override - public Optional getAsDocument(Predicate emptyResultPredicate) throws ParserConfigurationException, ManagerException { + public Optional getAsDocument(Predicate emptyResultPredicate) + throws ParserConfigurationException, ManagerException { String html = get(); - return StringUtils.isBlank(html) || (emptyResultPredicate != null && emptyResultPredicate.test(html)) ? Optional.empty() - : XMLHelper.getDocument(html); + return StringUtils.isBlank(html) || (emptyResultPredicate != null && emptyResultPredicate.test(html)) ? + Optional.empty() : XMLHelper.getDocument(html); } @Override @@ -238,10 +244,11 @@ public org.jsoup.nodes.Document getAsJsoupDocument() throws ManagerException { } @Override - public Optional getAsJsoupDocument(Predicate emptyResultPredicate) throws ManagerException { + public Optional getAsJsoupDocument(Predicate emptyResultPredicate) + throws ManagerException { String html = get(); - return StringUtils.isBlank(html) || (emptyResultPredicate != null && emptyResultPredicate.test(html)) ? Optional.empty() - : Optional.of(Jsoup.parse(html)); + return StringUtils.isBlank(html) || (emptyResultPredicate != null && emptyResultPredicate.test(html)) ? + Optional.empty() : Optional.of(Jsoup.parse(html)); } @Override @@ -274,8 +281,9 @@ private String getContentWithoutCache(String urlString, String userAgent) throws } return getContentWithoutCache(urlString, userAgent); } - throw new ManagerException("Error occurred with httpclient response: %s %s".formatted(e.getResponseCode(), e.getResponseMessage()), - e); + throw new ManagerException( + "Error occurred with httpclient response: %s %s".formatted(e.getResponseCode(), + e.getResponseMessage()), e); } catch (IOException e) { if (retries-- > 0 && retryPredicate.test(e)) { return getContentWithoutCache(urlString, userAgent); @@ -315,7 +323,8 @@ public interface ClearExpiredCacheBuilderClearIntf { @RequiredArgsConstructor @SuppressWarnings({ "rawtypes", "unchecked" }) public static class ClearExpiredCacheBuilder - implements ClearExpiredCacheBuilderCacheTypeIntf, ClearExpiredCacheBuilderKeyFilterIntf, ClearExpiredCacheBuilderClearIntf { + implements ClearExpiredCacheBuilderCacheTypeIntf, ClearExpiredCacheBuilderKeyFilterIntf, + ClearExpiredCacheBuilderClearIntf { private final InMemoryCache inMemoryCache; private final DiskCache diskCache; private CacheType cacheType; @@ -373,8 +382,8 @@ public interface ValueBuilderIsPresentIntf extends ValuesBuilderCacheTypeIntf public interface ValuesBuilderCacheTypeIntf extends ValueBuilderRetryIntf { ValueBuilderGetOptionalIntf returnType(Class returnType); - , S extends T> ValueBuilderGetCollectionIntf returnType(Class collectionReturnType, - Class returnType); + , S extends T> ValueBuilderGetCollectionIntf returnType( + Class collectionReturnType, Class returnType); void remove(); } @@ -388,7 +397,8 @@ public interface ValueBuilderRetryIntf extends ValueBuilderValueSupplierIntf< ValueBuilderGetOptionalIntStoreTempValueIntf optionalIntValue(OptionalInt optionalIntValue); - , S extends T> ValueBuilderGetCollectionIntf collectionValue(C collectionValue); + , S extends T> ValueBuilderGetCollectionIntf collectionValue( + C collectionValue); } public interface ValueBuilderRetryConditionIntf { @@ -401,19 +411,21 @@ public interface ValueBuilderRetryWaitIntf { public interface ValueBuilderValueSupplierIntf { - ValueBuilderGetValueStoreTempValueIntf valueSupplier(ThrowingSupplier valueSupplier); + ValueBuilderGetValueStoreTempValueIntf valueSupplier( + ThrowingSupplier valueSupplier); - , S extends T, X extends Exception> ValueBuilderGetCollectionIntf - collectionSupplier(Class collectionValueType, ThrowingSupplier valueSupplier); + , S extends T, X extends Exception> ValueBuilderGetCollectionIntf collectionSupplier( + Class collectionValueType, ThrowingSupplier valueSupplier); - ValueBuilderGetOptionalStoreTempValueIntf - optionalSupplier(ThrowingSupplier, X> valueSupplier); + ValueBuilderGetOptionalStoreTempValueIntf optionalSupplier( + ThrowingSupplier, X> valueSupplier); - ValueBuilderGetOptionalIntStoreTempValueIntf - optionalIntSupplier(ThrowingSupplier optionalIntSupplier); + ValueBuilderGetOptionalIntStoreTempValueIntf optionalIntSupplier( + ThrowingSupplier optionalIntSupplier); } - public interface ValueBuilderGetValueStoreTempValueIntf extends ValueBuilderGetValueIntf { + public interface ValueBuilderGetValueStoreTempValueIntf + extends ValueBuilderGetValueIntf { ValueBuilderGetValueStoreTempValueTtlIntf storeTempNullValue(); } @@ -446,11 +458,13 @@ public interface ValueBuilderGetOptionalIntf extends Val Optional getOptional() throws X; } - public interface ValueBuilderGetOptionalIntStoreTempValueIntf extends ValueBuilderGetOptionalIntIntf { + public interface ValueBuilderGetOptionalIntStoreTempValueIntf + extends ValueBuilderGetOptionalIntIntf { ValueBuilderGetOptionalIntStoreTempValueTtlIntf storeTempNullValue(); } - public interface ValueBuilderGetOptionalIntStoreTempValueTtlIntf extends ValueBuilderGetOptionalIntIntf { + public interface ValueBuilderGetOptionalIntStoreTempValueTtlIntf + extends ValueBuilderGetOptionalIntIntf { ValueBuilderGetOptionalIntIntf timeToLive(long seconds); ValueBuilderGetOptionalIntIntf timeToLiveFunction(Function timeToLiveFunction); @@ -488,13 +502,14 @@ public interface ValueBuilderStoreIntf { @RequiredArgsConstructor @SuppressWarnings({ "rawtypes", "unchecked" }) public static class ValueBuilder, T, X extends Exception> - implements ValueBuilderGetOptionalIntf, ValueBuilderCacheTypeIntf, - ValueBuilderValueSupplierIntf, ValueBuilderKeyIntf, ValueBuilderGetCollectionIntf, ValueBuilderGetOptionalIntIntf, + implements ValueBuilderGetOptionalIntf, ValueBuilderCacheTypeIntf, ValueBuilderValueSupplierIntf, + ValueBuilderKeyIntf, ValueBuilderGetCollectionIntf, ValueBuilderGetOptionalIntIntf, ValueBuilderRetryIntf, ValueBuilderRetryConditionIntf, ValueBuilderRetryWaitIntf, - ValueBuilderIsPresentIntf, ValuesBuilderCacheTypeIntf, - ValueBuilderStoreIntf, ValueBuilderGetOptionalIntStoreTempValueIntf, ValueBuilderGetOptionalStoreTempValueIntf, + ValueBuilderIsPresentIntf, ValuesBuilderCacheTypeIntf, ValueBuilderStoreIntf, + ValueBuilderGetOptionalIntStoreTempValueIntf, ValueBuilderGetOptionalStoreTempValueIntf, ValueBuilderGetOptionalIntStoreTempValueTtlIntf, ValueBuilderGetOptionalStoreTempValueTtlIntf, - ValueBuilderGetValueStoreTempValueIntf, ValueBuilderGetValueStoreTempValueTtlIntf, ValueBuilderGetValueIntf { + ValueBuilderGetValueStoreTempValueIntf, ValueBuilderGetValueStoreTempValueTtlIntf, + ValueBuilderGetValueIntf { private final InMemoryCache inMemoryCache; private final DiskCache diskCache; private String key; @@ -513,10 +528,8 @@ public static class ValueBuilder, T, X extends Exception private Predicate retryPredicate; private int retryWait; private Predicate keyFilter; - @Setter(value = AccessLevel.NONE) - private Long timeToLive; - @Setter(value = AccessLevel.NONE) - private boolean storeTempNullValue; + @Setter(value = AccessLevel.NONE) private Long timeToLive; + @Setter(value = AccessLevel.NONE) private boolean storeTempNullValue; private Function timeToLiveFunction; // @@ -559,34 +572,36 @@ public ValueBuilder returnType(Class returnType) } @Override - public , S extends T> ValueBuilderGetCollectionIntf - returnType(Class collectionReturnType, Class returnType) { + public , S extends T> ValueBuilderGetCollectionIntf returnType( + Class collectionReturnType, Class returnType) { this.returnType = (Class) returnType; return (ValueBuilder) this; } @Override - public ValueBuilder valueSupplier(ThrowingSupplier valueSupplier) { + public ValueBuilder valueSupplier( + ThrowingSupplier valueSupplier) { this.valueSupplier = (ThrowingSupplier) valueSupplier; return (ValueBuilder) this; } @Override - public ValueBuilder - optionalSupplier(ThrowingSupplier, E> valueSupplier) { + public ValueBuilder optionalSupplier( + ThrowingSupplier, E> valueSupplier) { this.optionalSupplier = (ThrowingSupplier) valueSupplier; return (ValueBuilder) this; } @Override - public ValueBuilder optionalIntSupplier(ThrowingSupplier optionalIntSupplier) { + public ValueBuilder optionalIntSupplier( + ThrowingSupplier optionalIntSupplier) { this.optionalIntSupplier = (ThrowingSupplier) optionalIntSupplier; return (ValueBuilder) this; } @Override - public , S extends T, E extends Exception> ValueBuilder - collectionSupplier(Class collectionValueType, ThrowingSupplier collectionSupplier) { + public , S extends T, E extends Exception> ValueBuilder collectionSupplier( + Class collectionValueType, ThrowingSupplier collectionSupplier) { this.collectionSupplier = (ThrowingSupplier) collectionSupplier; return (ValueBuilder) this; } @@ -646,10 +661,9 @@ private T getOrPutValue(Cache cache) throws X { if (value != null) { cache.put(key, value); } else { - if (cache instanceof DiskCache dCache) { - dCache.putWithoutPersist(key, null); - } else { - cache.put(key, null); + switch (cache) { + case DiskCache dCache -> dCache.putWithoutPersist(key, null); + case InMemoryCache mCache -> mCache.put(key, null); } } return value; @@ -711,10 +725,9 @@ private Optional getOrPutOptional(Cache cache) throws X { } else { Optional value = executeSupplier(optionalSupplier); value.ifPresentOrElse(v -> cache.put(key, v), () -> { - if (cache instanceof DiskCache dCache) { - dCache.putWithoutPersist(key, null); - } else { - cache.put(key, null); + switch (cache) { + case DiskCache dCache -> dCache.putWithoutPersist(key, null); + case InMemoryCache mCache -> mCache.put(key, null); } }); return value; @@ -727,27 +740,35 @@ private Optional getOrPutOptional(Cache cache) throws X { @Override public OptionalInt getOptionalInt() throws X { - return switch (cacheType) { - case NONE -> optionalIntSupplier.get(); - case MEMORY -> getOrPutOptionalInt(inMemoryCache); - case DISK -> getOrPutOptionalInt(diskCache); - }; + try { + return switch (cacheType) { + case NONE -> optionalIntSupplier.get(); + case MEMORY -> getOrPutOptionalInt(inMemoryCache); + case DISK -> getOrPutOptionalInt(diskCache); + }; + } catch (Exception e) { + // TODO why is this needed? + try { + throw (X) e; + } catch (ClassCastException e2) { + throw new RuntimeException(e); + } + } } - private OptionalInt getOrPutOptionalInt(Cache cache) throws X { + private OptionalInt getOrPutOptionalInt(Cache cache) throws X { boolean containsKey = cache.contains(key); if (!containsKey && storeTempNullValue) { timeToLive(calculateTtl()).store(); - return cache.get(key).mapToOptionalInt(); + return cache.get(key).mapToInt(t -> t); } else if (containsKey && !isExpiredTemporary()) { - return cache.get(key).mapToOptionalInt(); + return cache.get(key).mapToInt(t -> t); } else { OptionalInt value = executeSupplier(optionalIntSupplier); value.ifPresentOrElse(v -> cache.put(key, v), () -> { - if (cache instanceof DiskCache dCache) { - dCache.putWithoutPersist(key, null); - } else { - cache.put(key, null); + switch (cache) { + case DiskCache dCache -> dCache.putWithoutPersist(key, null); + case InMemoryCache mCache -> mCache.put(key, null); } }); return value; @@ -812,7 +833,7 @@ public OptionalLong getTemporaryTimeToLive() { } private OptionalLong getTemporaryTimeToLive(Cache cache) { - return cache.getTemporaryTimeToLive(key).map(v -> TimeUnit.SECONDS.convert(v, TimeUnit.MILLISECONDS)); + return cache.getTemporaryTimeToLive(key).map(v -> SECONDS.convert(v, MILLISECONDS)); } // ##### \\ @@ -836,20 +857,20 @@ private void store(boolean storeAsTempValue) throws X { } else if (optionalSupplier != null) { value = executeSupplier(optionalSupplier).orElse(null); } else if (optionalIntSupplier != null) { - value = executeSupplier(optionalIntSupplier).mapToObj(i -> i).orElse(null); + value = executeSupplier(optionalIntSupplier).orElseNull(); } else if (collectionSupplier != null) { value = executeSupplier(collectionSupplier); } else if (optionalValue != null) { value = optionalValue.orElse(null); } else if (optionalIntValue != null) { - value = optionalIntValue.mapToObj(i -> i).orElse(null); + value = optionalIntValue.orElseNull(); } else if (collectionValue != null) { value = collectionValue; } else { value = this.value; } if (storeAsTempValue || (storeTempNullValue && value == null)) { - long ttl = timeToLive != null ? timeToLive : TimeUnit.SECONDS.convert(1, TimeUnit.DAYS); + long ttl = timeToLive != null ? timeToLive : SECONDS.convert(1, DAYS); switch (cacheType) { case MEMORY -> inMemoryCache.put(key, value, ttl); case DISK -> diskCache.put(key, value, ttl); @@ -901,13 +922,18 @@ private V executeSupplier(ThrowingSupplier supplier) throws X { } return executeSupplier(supplier); } - throw new RuntimeException("Exception while getting value (%s)".formatted(e.getMessage()), e); + try { + throw (X) e; + } catch (ClassCastException e2) { + throw new RuntimeException("Exception while getting value (%s)".formatted(e.getMessage()), e); + } } } private long calculateTtl() { - return getTemporaryTimeToLive().mapToObj(v -> timeToLiveFunction != null ? timeToLiveFunction.apply(v) : v * 2) - .orElseGet(() -> timeToLive != null ? timeToLive : TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)); + return getTemporaryTimeToLive().mapToObj( + v -> timeToLiveFunction != null ? timeToLiveFunction.apply(v) : v * 2) + .orElseGet(() -> timeToLive != null ? timeToLive : MILLISECONDS.convert(1, DAYS)); } } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java index 6a9f1d5f..022dc885 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java @@ -15,7 +15,7 @@ import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.tuple.Pair; -public abstract class Cache { +public abstract sealed class Cache permits DiskCache, InMemoryCache { @val(Protected) Map> cacheMap; @@ -57,7 +57,7 @@ public Optional get(K key) { public boolean isTemporaryObject(K key) { synchronized (cacheMap) { - return cacheMap.get(key) instanceof TemporaryCacheObject; + return cacheMap.get(key) instanceof TemporaryCacheObject; } } @@ -71,8 +71,8 @@ public boolean isTemporaryExpired(K key) { public OptionalLong getTemporaryTimeToLive(K key) { synchronized (cacheMap) { CacheObject obj = cacheMap.get(key); - return obj instanceof TemporaryCacheObject tempCacheObject ? OptionalLong.of(tempCacheObject.timeToLive) - : OptionalLong.empty(); + return obj instanceof TemporaryCacheObject tempCacheObject ? + OptionalLong.of(tempCacheObject.timeToLive) : OptionalLong.empty(); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java index 0890406f..32f10380 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class DiskCache extends Cache { +public sealed abstract class DiskCache extends Cache permits SerializableDiskCache, TypedDiskCache { private static final Logger LOGGER = LoggerFactory.getLogger(DiskCache.class); private static final Object LOCK = new Object(); @@ -37,72 +37,81 @@ public abstract class DiskCache extends Cache { private final Map> removedToAdd = new HashMap<>(); protected abstract @val Class dbKeyType; protected abstract @val Class dbValueType; - private final LazyBiFunction, String, Connection> connection = new LazyBiFunction<>((cache, tableName) -> { - try { - synchronized (cache.cacheMap) { - Path path = Path.of(System.getProperty("user.home")).resolve(".MultiSubDownloader"); - if (!Files.exists(path)) { - try { - Files.createDirectory(path); - } catch (IOException e) { - throw new RuntimeException("Could not create folder $path", e); - } - } - Class.forName("org.hsqldb.jdbcDriver"); - Connection connection = DriverManager.getConnection( - "jdbc:hsqldb:file:" + path + "/diskcache.hsqldb;hsqldb.write_delay=false;shutdown=true", "user", "pass"); - - try (Statement stmt = connection.createStatement()) { - stmt.execute("create table IF NOT EXISTS $tableName (key %s, cacheobject %s);".formatted( - dbKeyType == String.class ? "VARCHAR(32768)" : "OBJECT", - dbValueType == String.class ? "VARCHAR(32768)" : "OBJECT")); - } - - boolean errorWhileReadingCacheFile = false; - try ( - Statement stmt = connection.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT key, cacheobject FROM $tableName;")) { - Multimap> tempCache = MultimapBuilder.hashKeys() - .treeSetValues(Comparator.comparingLong((CacheObject value) -> value.getAge()).reversed()).build(); + private final LazyBiFunction, String, Connection> connection = + new LazyBiFunction<>((cache, tableName) -> { + try { synchronized (cache.cacheMap) { - while (rs.next()) { + Path path = Path.of(System.getProperty("user.home")).resolve(".MultiSubDownloader"); + if (!Files.exists(path)) { try { - tempCache.put(cache.diskObjectToKey(rs.getObject("key")), cache.diskCacheObjectToValue(rs.getObject("cacheobject"))); - } catch (SQLException e2) { - LOGGER.error("Unable to insert object in disk cache. (${e2.getMessage()})", e2); - errorWhileReadingCacheFile = true; + Files.createDirectory(path); + } catch (IOException e) { + throw new RuntimeException("Could not create folder $path", e); + } + } + Class.forName("org.hsqldb.jdbcDriver"); + Connection connection = DriverManager.getConnection( + "jdbc:hsqldb:file:$path/diskcache.hsqldb;hsqldb.write_delay=false;shutdown=true", + "user", "pass"); + + try (Statement stmt = connection.createStatement()) { + stmt.execute("create table IF NOT EXISTS $tableName (key %s, cacheobject %s);".formatted( + dbKeyType == String.class ? "VARCHAR(32768)" : "OBJECT", + dbValueType == String.class ? "VARCHAR(32768)" : "OBJECT")); + } + + boolean errorWhileReadingCacheFile = false; + try (Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT key, cacheobject FROM $tableName;")) { + Multimap> tempCache = MultimapBuilder.hashKeys() + .treeSetValues(Comparator.comparingLong((CacheObject value) -> value.getAge()) + .reversed()) + .build(); + synchronized (cache.cacheMap) { + while (rs.next()) { + try { + tempCache.put(cache.diskObjectToKey(rs.getObject("key")), + cache.diskCacheObjectToValue(rs.getObject("cacheobject"))); + } catch (SQLException e2) { + LOGGER.error("Unable to insert object in disk cache. (${e2.getMessage()})", e2); + errorWhileReadingCacheFile = true; + } + } + Map>> map = tempCache.asMap(); + map.entrySet().stream().filter(entry -> entry.getValue().size() > 1).forEach(entry -> { + doublesToRemove.add(entry.getKey()); + removedToAdd.put(entry.getKey(), entry.getValue().iterator().next()); + }); + map.entrySet() + .stream() + .sorted(Comparator.comparingLong( + entry -> entry.getValue().iterator().next().getAge())) + .forEach(entry -> put(entry.getKey(), entry.getValue().iterator().next())); } + } catch (SQLException e) { + LOGGER.error("Unable while insert objects in disk cache! (${e.getMessage()})", e); } - Map>> map = tempCache.asMap(); - map.entrySet().stream().filter(entry -> entry.getValue().size() > 1).forEach(entry -> { - doublesToRemove.add(entry.getKey()); - removedToAdd.put(entry.getKey(), entry.getValue().iterator().next()); - }); - map.entrySet().stream().sorted(Comparator.comparingLong(entry -> entry.getValue().iterator().next().getAge())) - .forEach(entry -> put(entry.getKey(), entry.getValue().iterator().next())); + if (errorWhileReadingCacheFile) { + LOGGER.error("Deleting cache file to fix errors"); + connection.close(); + try { + path.deletePath(); + } catch (IOException e) { + LOGGER.error("Error while deleting the cache file, please delete it yourself: $path " + + "(${e.getMessage()})", e); + } + connection = DriverManager.getConnection( + "jdbc:hsqldb:file:$path/diskcache.hsqldb;hsqldb.write_delay=false;shutdown=true", + "user", "pass"); + } + return connection; } + } catch (ClassNotFoundException e) { + throw new RuntimeException("Unable to load jdbcdriver for diskcache"); } catch (SQLException e) { - LOGGER.error("Unable while insert objects in disk cache! (${e.getMessage()})", e); + throw new RuntimeException(e); } - if (errorWhileReadingCacheFile) { - LOGGER.error("Deleting cache file to fix errors"); - connection.close(); - try { - path.deletePath(); - } catch (IOException e) { - LOGGER.error("Error while deleting the cache file, please delete it yourself: $path (${e.getMessage()})", e); - } - connection = DriverManager.getConnection( - "jdbc:hsqldb:file:" + path + "/diskcache.hsqldb;hsqldb.write_delay=false;shutdown=true", "user", "pass"); - } - return connection; - } - } catch (ClassNotFoundException e) { - throw new RuntimeException("Unable to load jdbcdriver for diskcache"); - } catch (SQLException e) { - throw new RuntimeException(e); - } - }); + }); private final String tableName; private Connection getConnection() { @@ -134,7 +143,8 @@ public void cleanup(Predicate keyFilter) { Iterator>> itr = cacheMap.entrySet().iterator(); while (itr.hasNext()) { Entry> entry = itr.next(); - if ((keyFilter == null || keyFilter.test(entry.getKey())) && entry.getValue().isExpired(timeToLiveSeconds * 1000)) { + if ((keyFilter == null || keyFilter.test(entry.getKey())) && + entry.getValue().isExpired(timeToLiveSeconds * 1000)) { itr.remove(); removeFromDisk(entry.getKey()); } @@ -188,7 +198,8 @@ public final void put(K key, V value, long timeToLive) { private void putFromMemoryCache(K key) { synchronized (LOCK) { - try (PreparedStatement prep = getConnection().prepareCall("INSERT INTO $tableName (key,cacheobject) VALUES (?,?)")) { + try (PreparedStatement prep = getConnection().prepareCall( + "INSERT INTO $tableName (key,cacheobject) VALUES (?,?)")) { prep.clearParameters(); prep.setObject(1, keyToDiskObject(key)); synchronized (cacheMap) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/InMemoryCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/InMemoryCache.java index d387484d..dfc51aa6 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/InMemoryCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/InMemoryCache.java @@ -9,11 +9,11 @@ import lombok.experimental.Accessors; import manifold.ext.props.rt.api.val; -public class InMemoryCache extends Cache { +public final class InMemoryCache extends Cache { @val(Protected) Long timeToLive; - protected InMemoryCache(Long timeToLiveSeconds, Long timerIntervalSeconds, Integer maxItems) { + public InMemoryCache(Long timeToLiveSeconds, Long timerIntervalSeconds, Integer maxItems) { super(maxItems); if (maxItems != null && maxItems < 1) { throw new IllegalStateException("maxItems should be a positive number"); @@ -95,7 +95,9 @@ public void cleanup() { public void cleanup(Predicate keyFilter) { synchronized (cacheMap) { - cacheMap.entrySet().removeIf(entry -> (keyFilter == null || keyFilter.test(entry.getKey())) && entry.getValue().isExpired(timeToLive)); + cacheMap.entrySet() + .removeIf(entry -> (keyFilter == null || keyFilter.test(entry.getKey())) && + entry.getValue().isExpired(timeToLive)); Thread.yield(); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/SerializableDiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/SerializableDiskCache.java index bbd7bfc7..61d59587 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/SerializableDiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/SerializableDiskCache.java @@ -9,7 +9,7 @@ import manifold.ext.props.rt.api.override; import manifold.ext.props.rt.api.val; -public class SerializableDiskCache extends DiskCache { +public final class SerializableDiskCache extends DiskCache { @override @val(Protected) Class dbKeyType; @override @val(Protected) Class dbValueType; @@ -46,7 +46,8 @@ public interface DiskCacheBuilderPasswordIntf - implements DiskCacheBuilderOtherIntf, DiskCacheBuilderPasswordIntf, DiskCacheBuilderValueTypeIntf, + implements DiskCacheBuilderOtherIntf, DiskCacheBuilderPasswordIntf, + DiskCacheBuilderValueTypeIntf, DiskCacheBuilderKeyTypeIntf { private Class keyType; private Class valueType; @@ -76,7 +77,8 @@ public SerializableDiskCache build() { } } - private SerializableDiskCache(Class keyType, Class valueType, Long timeToLive, Integer maxItems, String username, String password, + private SerializableDiskCache(Class keyType, Class valueType, Long timeToLive, Integer maxItems, + String username, String password, String cacheName) { super(timeToLive, maxItems, username, password, cacheName); this.dbKeyType = keyType; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java index a9fa3a07..7e6b127d 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java @@ -7,26 +7,30 @@ import lombok.experimental.Accessors; import net.jodah.typetools.TypeResolver; -public class TypedDiskCache extends DiskCache { +public final class TypedDiskCache extends DiskCache { private final Function toStringMapperKey; private final Function toObjectMapperKey; private final Function toStringMapperValue; private final Function toObjectMapperValue; -// @SuppressWarnings("unchecked") -// private final LazySupplier> keyType = -// new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[0]); -// @override @val(Protected) Class dbKeyType = keyType.get(); -// @SuppressWarnings("unchecked") -// private final LazySupplier> valueType = -// new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[1]); -// -// @override @val(Protected) Class dbValueType = valueType.get(); + // @SuppressWarnings("unchecked") + // private final LazySupplier> keyType = + // new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this + // .getClass())[0]); + // @override @val(Protected) Class dbKeyType = keyType.get(); + // @SuppressWarnings("unchecked") + // private final LazySupplier> valueType = + // new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this + // .getClass())[1]); + // + // @override @val(Protected) Class dbValueType = valueType.get(); @Getter(lazy = true) @SuppressWarnings("unchecked") - private final Class dbKeyType = (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[0]; + private final Class dbKeyType = + (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[0]; @Getter(lazy = true) @SuppressWarnings("unchecked") - private final Class dbValueType = (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[1]; + private final Class dbValueType = + (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this.getClass())[1]; @SuppressWarnings("rawtypes") public static DiskCacheBuilderToStringMapperKeyIntf cacheBuilder() { @@ -67,8 +71,10 @@ public interface DiskCacheBuilderPasswordIntf { @Setter @Accessors(chain = true, fluent = true) - public static class DiskCacheBuilder implements DiskCacheBuilderPasswordIntf, DiskCacheBuilderOtherIntf, - DiskCacheBuilderToObjectMapperValueIntf, DiskCacheBuilderToStringMapperValueIntf, DiskCacheBuilderToObjectMapperKeyIntf, + public static class DiskCacheBuilder + implements DiskCacheBuilderPasswordIntf, DiskCacheBuilderOtherIntf, + DiskCacheBuilderToObjectMapperValueIntf, DiskCacheBuilderToStringMapperValueIntf, + DiskCacheBuilderToObjectMapperKeyIntf, DiskCacheBuilderToStringMapperKeyIntf { private Long timeToLive; private Integer maxItems; @@ -96,13 +102,16 @@ public DiskCacheBuilder toStringMapperValue(Function toStri @Override public TypedDiskCache build() { - return new TypedDiskCache<>(timeToLive, maxItems, username, password, toStringMapperKey, toObjectMapperKey, toStringMapperValue, + return new TypedDiskCache<>(timeToLive, maxItems, username, password, toStringMapperKey, toObjectMapperKey, + toStringMapperValue, toObjectMapperValue, cacheName); } } - private TypedDiskCache(Long timeToLive, Integer maxItems, String username, String password, Function toStringMapperKey, - Function toObjectMapperKey, Function toStringMapperValue, Function toObjectMapperValue, + private TypedDiskCache(Long timeToLive, Integer maxItems, String username, String password, + Function toStringMapperKey, + Function toObjectMapperKey, Function toStringMapperValue, + Function toObjectMapperValue, String cacheName) { super(timeToLive, maxItems, username, password, cacheName); this.toStringMapperKey = toStringMapperKey; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java index 4cd0703c..1e7242fc 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java @@ -60,7 +60,8 @@ public Optional getMovieDetails(int imdbId) { try { return imdbApi.get().getMovieDetails(imdbId); } catch (ImdbException e) { - LOGGER.error("API %s getMovieDetails for id [%s] (%s)".formatted(getProviderName(), imdbId, e.getMessage()), e); + LOGGER.error("API %s getMovieDetails for id [%s] (%s)".formatted(getProviderName(), imdbId, + e.getMessage()), e); return Optional.empty(); } }).getOptional(); @@ -100,7 +101,8 @@ private OptionalInt getImdbIdCommon(String title, Integer year, try { providerSerieIds = providerSerieIdSupplier.apply(title, year); } catch (ImdbSearchIdException e) { - LOGGER.error("API %s getImdbId for title [%s] and year [%s] (%s)".formatted(getProviderName(), title, year, e.getMessage()), e); + LOGGER.error("API %s getImdbId for title [%s] and year [%s] (%s)".formatted(getProviderName(), title, year, + e.getMessage()), e); return OptionalInt.empty(); } if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping && providerSerieIds.size() == 1) { @@ -111,7 +113,8 @@ private OptionalInt getImdbIdCommon(String title, Integer year, return userInteractionHandler .selectFromList( providerSerieIds.stream().sorted(Comparator - .comparing((ProviderSerieId providerSerieId) -> providerSerieId.name.replaceAll("[^A-Za-z]", "") + .comparing((ProviderSerieId providerSerieId) -> providerSerieId.name.replaceAll( + "[^A-Za-z]", "") .equalsIgnoreCase(formattedTitle), Comparator.reverseOrder()) .thenComparing(ProviderSerieId::getName)) .toList(), @@ -122,7 +125,8 @@ private OptionalInt getImdbIdCommon(String title, Integer year, } private OptionalInt promptUserToEnterImdbId(String title, int year) { - return userInteractionHandler.enter(getProviderName(), Messages.getString("Prompter.EnterImdbMatchForSerie").formatted(title), + return userInteractionHandler.enter(getProviderName(), + Messages.getString("Prompter.EnterImdbMatchForSerie").formatted(title), Messages.getString("Prompter.ValueIsNotValid"), StringUtils::isNumeric).mapToInt(Integer::parseInt); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index 9f895ffe..7738e6ff 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -80,15 +80,19 @@ public Optional getSerie(String serieName) { } else { String formattedSerieName = serieName.replaceAll("[^A-Za-z]", ""); Comparator comparator = Comparator - .comparing((TheTvdbSerie s) -> formattedSerieName.equalsIgnoreCase(s.serieName.replaceAll("[^A-Za-z]", "")), + .comparing((TheTvdbSerie s) -> formattedSerieName.equalsIgnoreCase( + s.serieName.replaceAll("[^A-Za-z]", "")), Comparator.reverseOrder()) .thenComparing(TheTvdbSerie::getFirstAired, Comparator.reverseOrder()); try { tvdbSerie = userInteractionHandler .selectFromList(serieIds.stream().sorted(comparator).toList(), Messages.getString("Prompter.SelectTvdbMatchForSerie").formatted(serieName), - getProviderName(), s -> "${s.serieName} (${s.firstAired})") - .orElseMap(() -> askUserToEnterTvdbId(serieName).mapToOptionalObj(id -> getApi().getSerie(id, null))); + getProviderName(), s -> "${s.serieName} (${s.firstAired})"); + if (tvdbSerie.isEmpty()) { + tvdbSerie = askUserToEnterTvdbId(serieName) + .mapToObj(tvdbId -> api.getSerie(tvdbId, null).orElse(null)); + } } catch (TheTvdbException e) { tvdbSerie = Optional.empty(); } @@ -119,15 +123,17 @@ public Optional getEpisode(int tvdbId, int season, int episode) try { return getApi().getEpisode(tvdbId, season, episode, Language.ENGLISH); } catch (TheTvdbException e) { - LOGGER.error("API $providerName getEpisode for serie id [$tvdbId] %s (${e.getMessage()})".formatted( - TvRelease.formatSeasonEpisode(season, episode)), e); + LOGGER.error( + "API $providerName getEpisode for serie id [$tvdbId] %s (${e.getMessage()})".formatted( + TvRelease.formatSeasonEpisode(season, episode)), e); return Optional.empty(); } }).storeTempNullValue().getOptional(); } - public synchronized static TheTvdbAdapter getInstance(Manager manager, UserInteractionHandler userInteractionHandler) { + public synchronized static TheTvdbAdapter getInstance(Manager manager, + UserInteractionHandler userInteractionHandler) { if (instance == null) { instance = new TheTvdbAdapter(manager, userInteractionHandler); } diff --git a/pom.xml b/pom.xml index c7b346d0..77e16f93 100644 --- a/pom.xml +++ b/pom.xml @@ -8,11 +8,11 @@ UTF-8 - 2024.1.16 - 1.18.32 - 21 - 21 - 21 + 2024.1.42 + 1.18.36 + 23 + 23 + 23 @@ -221,7 +221,12 @@ org.jsoup jsoup - 1.17.2 + 1.18.3 + + + org.jspecify + jspecify + 1.0.0 org.apache.commons From a57ee6125ddd7e36344f5d4d6f4640b549f00994 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 13:44:51 +0100 Subject: [PATCH 19/54] changes --- .../actions/FileListAction.java | 18 ++--- .../actions/SearchAction.java | 53 +++++++-------- .../multisubdownloader/cli/CliOption.java | 15 ++--- .../cli/actions/CliSearchAction.java | 66 ++++++++++--------- .../cli/progress/CLIFileIndexerProgress.java | 16 ++--- .../cli/progress/CLIProgress.java | 30 ++++----- .../cli/progress/CLISearchProgress.java | 18 ++--- .../providers/EventServiceProvider.java | 12 ++-- .../service/providers/ServiceProvider.java | 3 +- .../providers/ServiceProviderComparator.java | 2 +- .../actions/search/FileGuiSearchAction.java | 36 +++++----- .../gui/actions/search/GuiSearchAction.java | 27 ++++---- .../actions/search/TextGuiSearchAction.java | 24 ++++--- .../Addic7edServiceProvider.java | 20 ++++-- .../LocalServiceProvider.java | 14 ++-- .../OpenSubtitlesServiceProvider.java | 17 +++-- .../PodnapisiServiceProvider.java | 15 +++-- .../SubsceneServiceProvider.java | 14 ++-- .../SubtitleServiceProvider.java | 12 ++-- .../TvSubtitlesServiceProvider.java | 16 +++-- 20 files changed, 240 insertions(+), 188 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java index 1b85af9b..439244bb 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java @@ -12,6 +12,7 @@ import extensions.java.nio.file.Path.PathExt; import lombok.RequiredArgsConstructor; import lombok.experimental.ExtensionMethod; +import manifold.ext.props.rt.api.set; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.listeners.IndexingProgressListener; import org.lodder.subtools.multisubdownloader.settings.model.Settings; @@ -28,13 +29,14 @@ public class FileListAction { private static final String SUBTITLE_EXTENSION = "srt"; private final Settings settings; - private IndexingProgressListener indexingProgressListener; + @set IndexingProgressListener indexingProgressListener; private int progressFileIndex; private int progressFilesTotal; public List getFileListing(Path dir, boolean recursive, Language language, boolean forceSubtitleOverwrite) { - LOGGER.trace("getFileListing: dir [{}] Recursive [{}] languageCode [{}] forceSubtitleOverwrite [{}]", dir, recursive, language, + LOGGER.trace("getFileListing: dir [{}] Recursive [{}] languageCode [{}] forceSubtitleOverwrite [{}]", dir, + recursive, language, forceSubtitleOverwrite); /* Reset progress counters */ this.progressFileIndex = 0; @@ -74,7 +76,8 @@ private List _getFileListing(Path dir, boolean recursive, Language languag try { if (file.isRegularFile()) { - if (isValidVideoFile(file) && (forceSubtitleOverwrite || !fileHasSubtitles(file, language)) && !isExcludedFile(file)) { + if (isValidVideoFile(file) && (forceSubtitleOverwrite || !fileHasSubtitles(file, language)) && + !isExcludedFile(file)) { filelist.add(file); } } else if (recursive && !isExcludedDir(file)) { @@ -136,12 +139,11 @@ public boolean fileHasSubtitles(Path file, Language language) throws IOException } List filters = langCodes.stream().map(word -> word + "." + SUBTITLE_EXTENSION).toList(); String subtitleNameWithoutExtension = subtitleName.replace(subtitleExtensionWithDot, ""); - return file.getParent().list().map(PathExt::getFileNameAsString).filter(fileName -> filters.stream().anyMatch(fileName::endsWith)) + return file.getParent() + .list() + .map(PathExt::getFileNameAsString) + .filter(fileName -> filters.stream().anyMatch(fileName::endsWith)) .anyMatch(fileName -> fileName.contains(subtitleNameWithoutExtension)); } } - - public void setIndexingProgressListener(IndexingProgressListener indexingProgressListener) { - this.indexingProgressListener = indexingProgressListener; - } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java index a317384e..46527c4c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java @@ -1,11 +1,13 @@ package org.lodder.subtools.multisubdownloader.actions; +import static manifold.ext.props.rt.api.PropOption.*; + import java.util.List; -import lombok.AccessLevel; -import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.get; +import manifold.ext.props.rt.api.set; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.exceptions.SearchSetupException; @@ -24,17 +26,21 @@ import org.slf4j.LoggerFactory; @RequiredArgsConstructor -@Getter(value = AccessLevel.PROTECTED) public abstract class SearchAction implements Runnable, Cancelable, SearchHandler { private static final Logger LOGGER = LoggerFactory.getLogger(SearchAction.class); - private final Manager manager; - private final @NonNull Settings settings; - private final @NonNull SubtitleProviderStore subtitleProviderStore; - private StatusListener statusListener; - private SearchManager searchManager; - private List releases; + @get(Protected) @NonNull Manager manager; + @get(Protected) @NonNull Settings settings; + @get(Protected) @NonNull SubtitleProviderStore subtitleProviderStore; + + @get(Protected) @set(Private) StatusListener statusListener; + @get(Protected) @set(Private) SearchManager searchManager; + @get(Protected) @set(Private) List releases; + @get(Protected) Language language; + abstract @get(Protected) IndexingProgressListener indexingProgressListener; + abstract @get(Protected) UserInteractionHandler userInteractionHandler; + abstract @get(Protected) SearchProgressListener searchProgressListener; @Override public void run() { @@ -50,14 +56,12 @@ public void run() { } private void search() throws ActionException { - this.statusListener = this.getIndexingProgressListener(); - this.getIndexingProgressListener().reset(); - this.getSearchProgressListener().reset(); + this.statusListener = this.indexingProgressListener; + this.indexingProgressListener.reset(); + this.searchProgressListener.reset(); validate(); - Language language = this.getLanguage(); - setStatusMessage(Messages.getString("SearchAction.StatusIndexing")); this.releases = createReleases(); @@ -71,9 +75,9 @@ private void search() throws ActionException { return; } - this.getIndexingProgressListener().completed(); + this.indexingProgressListener.completed(); - this.statusListener = this.getSearchProgressListener(); + this.statusListener = this.searchProgressListener; /* Create a new SearchManager. */ this.searchManager = @@ -81,9 +85,9 @@ private void search() throws ActionException { /* Tell the manager which language we want */ .language(language) /* Tell the manager where to push progressUpdates */ - .progressListener(getSearchProgressListener()) + .progressListener(searchProgressListener) /* Tell the manager how to handle user interactions */ - .userInteractionHandler(getUserInteractionHandler()) + .userInteractionHandler(userInteractionHandler) /* Listen for when the manager tells us Subtitles are found */ .onFound(this); @@ -115,17 +119,8 @@ public boolean cancel(boolean mayInterruptIfRunning) { this.searchManager.cancel(mayInterruptIfRunning); } Thread.currentThread().interrupt(); - this.getIndexingProgressListener().completed(); - this.getSearchProgressListener().completed(); + this.indexingProgressListener.completed(); + this.searchProgressListener.completed(); return true; } - - protected abstract Language getLanguage(); - - protected abstract UserInteractionHandler getUserInteractionHandler(); - - protected abstract IndexingProgressListener getIndexingProgressListener(); - - protected abstract SearchProgressListener getSearchProgressListener(); - } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java index 8e8f5b6d..6f11dd77 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java @@ -1,11 +1,10 @@ package org.lodder.subtools.multisubdownloader.cli; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.get; import org.lodder.subtools.multisubdownloader.Messages; -@Getter -@RequiredArgsConstructor +@AllArgsConstructor public enum CliOption { HELP("help", false, "App.OptionHelpMsg"), NO_GUI("nogui", false, "App.OptionNoGuiMsg"), @@ -23,10 +22,10 @@ public enum CliOption { DRY_RUN("dryrun", false, "App.OptionDryRun"), CONFIRM_PROVIDER_MAPPING("confirmProviderMapping", false, "App.OptionConfirmProviderMapping"); - private final String value; - private final String longValue; - private final boolean hasArg; - private final String msgCode; + @get String value; + @get String longValue; + @get boolean hasArg; + @get String msgCode; CliOption(String value, boolean hasArg, String description) { this(value, null, hasArg, description); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java index 43332ce4..bfe5dde0 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java @@ -1,17 +1,19 @@ package org.lodder.subtools.multisubdownloader.cli.actions; +import static manifold.ext.props.rt.api.PropOption.*; + import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import lombok.AccessLevel; -import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; import lombok.experimental.ExtensionMethod; +import manifold.ext.props.rt.api.get; +import manifold.ext.props.rt.api.override; import org.lodder.subtools.multisubdownloader.CLI; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; @@ -33,36 +35,34 @@ import org.slf4j.LoggerFactory; @ExtensionMethod({ Files.class }) -@Setter public class CliSearchAction extends SearchAction { private static final Logger LOGGER = LoggerFactory.getLogger(CliSearchAction.class); private final @NonNull CLI cli; private final @NonNull FileListAction fileListAction; - @Getter - private final @NonNull Language language; private final @NonNull ReleaseFactory releaseFactory; private final @NonNull SubtitleFiltering filtering; - private final boolean overwriteSubtitles; private final @NonNull List folders; private final boolean recursive; - @Getter(value = AccessLevel.PROTECTED) - private final @NonNull IndexingProgressListener indexingProgressListener; - @Getter(value = AccessLevel.PROTECTED) - private final @NonNull SearchProgressListener searchProgressListener; + + @get @override @NonNull Language language; + @get(Protected) @override @NonNull IndexingProgressListener indexingProgressListener; + @get(Protected) @override @NonNull SearchProgressListener searchProgressListener; public interface CliSearchActionBuilderManager { CliSearchActionBuilderSubtitleProviderStore manager(Manager manager); } public interface CliSearchActionBuilderSubtitleProviderStore { - CliSearchActionBuilderIndexingProgressListener subtitleProviderStore(SubtitleProviderStore subtitleProviderStore); + CliSearchActionBuilderIndexingProgressListener subtitleProviderStore( + SubtitleProviderStore subtitleProviderStore); } public interface CliSearchActionBuilderIndexingProgressListener { - CliSearchActionBuilderSearchProgressListener indexingProgressListener(IndexingProgressListener indexingProgressListener); + CliSearchActionBuilderSearchProgressListener indexingProgressListener( + IndexingProgressListener indexingProgressListener); } public interface CliSearchActionBuilderSearchProgressListener { @@ -112,7 +112,8 @@ public static class CliSearchActionBuilder implements CliSearchActionBuilderSearchProgressListener, CliSearchActionBuilderIndexingProgressListener, CliSearchActionBuilderSubtitleProviderStore, CliSearchActionBuilderCLI, CliSearchActionBuilderFileListAction, CliSearchActionBuilderLanguage, CliSearchActionBuilderReleaseFactory, - CliSearchActionBuilderFiltering, CliSearchActionBuilderFolders, CliSearchActionBuilderOther, CliSearchActionBuilderManager { + CliSearchActionBuilderFiltering, CliSearchActionBuilderFolders, CliSearchActionBuilderOther, + CliSearchActionBuilderManager { private final Settings settings; private Manager manager; private SubtitleProviderStore subtitleProviderStore; @@ -129,15 +130,17 @@ public static class CliSearchActionBuilder @Override public CliSearchAction build() throws SearchSetupException { - return new CliSearchAction(manager, settings, subtitleProviderStore, indexingProgressListener, searchProgressListener, cli, - fileListAction, language, releaseFactory, filtering, folders, overwriteSubtitles, recursive); + return new CliSearchAction(manager, settings, subtitleProviderStore, indexingProgressListener, + searchProgressListener, cli, fileListAction, language, releaseFactory, filtering, folders, + overwriteSubtitles, recursive); } } private CliSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, - IndexingProgressListener indexingProgressListener, SearchProgressListener searchProgressListener, - CLI cli, FileListAction fileListAction, Language language, ReleaseFactory releaseFactory, - SubtitleFiltering filtering, List folders, boolean overwriteSubtitles, boolean recursive) throws SearchSetupException { + IndexingProgressListener indexingProgressListener, SearchProgressListener searchProgressListener, CLI cli, + FileListAction fileListAction, Language language, ReleaseFactory releaseFactory, + SubtitleFiltering filtering, List folders, boolean overwriteSubtitles, boolean recursive) + throws SearchSetupException { super(manager, settings, subtitleProviderStore); this.indexingProgressListener = indexingProgressListener; this.searchProgressListener = searchProgressListener; @@ -156,10 +159,11 @@ private CliSearchAction(Manager manager, Settings settings, SubtitleProviderStor @Override protected List createReleases() { - fileListAction.setIndexingProgressListener(this.getIndexingProgressListener()); + fileListAction.indexingProgressListener = this.indexingProgressListener; List files = this.folders.stream() - .flatMap(folder -> fileListAction.getFileListing(folder, recursive, language, overwriteSubtitles).stream()) + .flatMap(folder -> fileListAction.getFileListing(folder, recursive, language, overwriteSubtitles) + .stream()) .toList(); /* fix: remove carriage return from progressbar */ @@ -172,7 +176,7 @@ protected List createReleases() { LOGGER.debug("# Files found to process [{}] ", total); System.out.println(Messages.getString("CliSearchAction.ParsingFoundFiles")); - this.getIndexingProgressListener().progress(progress); + this.indexingProgressListener.progress(progress); List releases = new ArrayList<>(); for (Path file : files) { @@ -180,9 +184,9 @@ protected List createReleases() { progress = (int) Math.floor((float) index / total * 100); /* Tell progressListener which file we are processing */ - this.getIndexingProgressListener().progress(file.getFileNameAsString()); + this.indexingProgressListener.progress(file.getFileNameAsString()); - Release release = this.releaseFactory.createRelease(file, getUserInteractionHandler()); + Release release = this.releaseFactory.createRelease(file, userInteractionHandler); if (release == null) { continue; } @@ -190,7 +194,7 @@ protected List createReleases() { releases.add(release); /* Update progressListener */ - this.getIndexingProgressListener().progress(progress); + this.indexingProgressListener.progress(progress); } return releases; @@ -198,21 +202,23 @@ protected List createReleases() { @Override public void onFound(Release release, List subtitles) { - subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).forEach(release::addMatchingSub); - if (getSearchManager().getProgress() < 100) { + subtitles.stream() + .filter(subtitle -> filtering.useSubtitle(subtitle, release)) + .forEach(release::addMatchingSub); + if (searchManager.getProgress() < 100) { return; } - LOGGER.debug("found files for doDownload [{}]", getReleases().size()); + LOGGER.debug("found files for doDownload [{}]", releases.size()); /* stop printing progress */ - this.getSearchProgressListener().completed(); + this.searchProgressListener.completed(); - this.cli.download(getReleases()); + this.cli.download(releases); } @Override protected UserInteractionHandler getUserInteractionHandler() { - return new UserInteractionHandlerCLI(getSettings()); + return new UserInteractionHandlerCLI(settings); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java index e6b0e978..7816bc3f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java @@ -3,7 +3,7 @@ import org.lodder.subtools.multisubdownloader.actions.ActionException; import org.lodder.subtools.multisubdownloader.listeners.IndexingProgressListener; -public class CLIFileIndexerProgress extends CLIProgress implements IndexingProgressListener { +public class CLIFileIndexerProgress extends CLIProgress implements IndexingProgressListener { private String currentFile; @@ -14,7 +14,7 @@ public CLIFileIndexerProgress() { @Override public void progress(int progress) { - setProgress(progress); + this.progress = progress; this.printProgress(); } @@ -26,7 +26,7 @@ public void progress(String directory) { @Override public void completed() { - if (!this.isEnabled()) { + if (!enabled) { return; } this.disable(); @@ -34,12 +34,12 @@ public void completed() { @Override public void reset() { - this.setEnabled(true); + this.enabled = true; } @Override public void onError(ActionException exception) { - if (!this.isEnabled()) { + if (!enabled) { return; } System.out.println("Error: " + exception.getMessage()); @@ -47,7 +47,7 @@ public void onError(ActionException exception) { @Override public void onStatus(String message) { - if (!this.isEnabled()) { + if (!enabled) { return; } System.out.println(message); @@ -55,11 +55,11 @@ public void onStatus(String message) { @Override protected void printProgress() { - if (!isEnabled()) { + if (!enabled) { return; } - if (isVerbose()) { + if (verbose) { /* newlines to counter the return carriage from printProgBar() */ System.out.println(); System.out.println(this.currentFile); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIProgress.java index 6820adbf..f70b2216 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIProgress.java @@ -1,33 +1,31 @@ package org.lodder.subtools.multisubdownloader.cli.progress; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; +import static manifold.ext.props.rt.api.PropOption.*; -@Getter(value = AccessLevel.PROTECTED) -@Setter(value = AccessLevel.PROTECTED) -abstract class CLIProgress> { +import manifold.ext.props.rt.api.var; +import manifold.ext.rt.api.Self; - private int progress; - private boolean isEnabled; - private boolean isVerbose; +abstract class CLIProgress { + + @var(Protected) int progress; + @var(Protected) boolean enabled; + @var(Protected) boolean verbose; protected CLIProgress() { - isEnabled = true; - isVerbose = false; + enabled = true; + verbose = false; progress = 0; } public void disable() { - this.isEnabled = false; + this.enabled = false; /* Print a line */ System.out.println(); } - @SuppressWarnings("unchecked") - public T verbose(boolean isVerbose) { - this.isVerbose = isVerbose; - return (T) this; + public @Self CLIProgress verbose(boolean verbose) { + this.verbose = verbose; + return this; } protected abstract void printProgress(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java index ce4bc143..1a41e808 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java @@ -7,7 +7,7 @@ import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.sublibrary.model.Release; -public class CLISearchProgress extends CLIProgress implements SearchProgressListener { +public class CLISearchProgress extends CLIProgress implements SearchProgressListener { private final TextTable table; private final SearchProgressTableModel tableModel; @@ -25,13 +25,13 @@ public void progress(SubtitleProvider provider, int jobsLeft, Release release) { @Override public void progress(int progress) { - setProgress(progress); + this.progress = progress; this.printProgress(); } @Override public void completed() { - if (!this.isEnabled()) { + if (!this.enabled) { return; } this.disable(); @@ -39,12 +39,12 @@ public void completed() { @Override public void reset() { - this.setEnabled(true); + this.enabled = true; } @Override public void onError(ActionException exception) { - if (!isEnabled()) { + if (!enabled) { return; } System.out.println("Error: " + exception.getMessage()); @@ -52,7 +52,7 @@ public void onError(ActionException exception) { @Override public void onStatus(String message) { - if (!isEnabled()) { + if (!enabled) { return; } System.out.println(message); @@ -60,17 +60,17 @@ public void onStatus(String message) { @Override protected void printProgress() { - if (!isEnabled()) { + if (!enabled) { return; } /* print table */ - if (isVerbose()) { + if (verbose) { System.out.println(); table.printTable(); } /* print progressbar */ - this.printProgBar(this.getProgress()); + this.printProgBar(this.progress); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/EventServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/EventServiceProvider.java index 9f7e24b2..73087d85 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/EventServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/EventServiceProvider.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.framework.service.providers; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; import org.lodder.subtools.multisubdownloader.framework.event.Emitter; @@ -7,10 +9,12 @@ public class EventServiceProvider implements ServiceProvider { - @Override - public int getPriority() { - return 0; - } + @val @override int priority = 0; + + // @Override + // public int getPriority() { + // return 0; + // } @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/ServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/ServiceProvider.java index 288bfe6e..87c6a642 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/ServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/ServiceProvider.java @@ -1,10 +1,11 @@ package org.lodder.subtools.multisubdownloader.framework.service.providers; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; public interface ServiceProvider { - int getPriority(); + @val int priority; void register(Container app, UserInteractionHandler userInteractionHandler); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/ServiceProviderComparator.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/ServiceProviderComparator.java index 7e5c0ae7..24c07a50 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/ServiceProviderComparator.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/ServiceProviderComparator.java @@ -10,6 +10,6 @@ public class ServiceProviderComparator implements Comparator, S @Override public int compare(ServiceProvider a, ServiceProvider b) { - return Integer.compare(a.getPriority(), b.getPriority()); + return Integer.compare(a.priority, b.priority); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java index 79ddf384..fcd97a02 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java @@ -71,11 +71,13 @@ public static class FileGuiSearchActionBuilder @Override public FileGuiSearchAction build() { - return new FileGuiSearchAction(manager, settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); + return new FileGuiSearchAction(manager, settings, subtitleProviderStore, mainWindow, searchPanel, + releaseFactory); } } - private FileGuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow, + private FileGuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, + GUI mainWindow, SearchPanel searchPanel, ReleaseFactory releaseFactory) { super(manager, settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); this.filelistAction = new FileListAction(settings); @@ -84,21 +86,23 @@ private FileGuiSearchAction(Manager manager, Settings settings, SubtitleProvider @Override protected void validate() throws SearchSetupException { String path = getInputPanel().getIncomingPath(); - if ("".equals(path) && !this.getSettings().hasDefaultFolders()) { + if ("".equals(path) && !this.settings.hasDefaultFolders()) { throw new SearchSetupException(Messages.getString("App.NoFolderSelected")); } } @Override public void onFound(Release release, List subtitles) { - VideoTableModel model = (VideoTableModel) this.getSearchPanel().getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); List filteredSubtitles = - getFiltering() != null ? subtitles.stream().filter(subtitle -> getFiltering().useSubtitle(subtitle, release)).toList() : subtitles; + filtering != null ? + subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).toList() : + subtitles; filteredSubtitles.forEach(release::addMatchingSub); model.addRow(release); - getMainWindow().repaint(); + mainWindow.repaint(); /* Let GuiSearchAction also make some decisions */ super.onFound(release, filteredSubtitles); @@ -112,7 +116,7 @@ protected List createReleases() { boolean recursive = inputPanel.isRecursiveSelected(); boolean overwriteExistingSubtitles = inputPanel.isForceOverwrite(); - VideoTableModel model = (VideoTableModel) this.getSearchPanel().getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); model.clearTable(); /* get a list of video files */ @@ -130,38 +134,40 @@ private List createReleases(List files) { int index = 0; int progress = 0; - this.getIndexingProgressListener().progress(progress); + this.indexingProgressListener.progress(progress); for (Path file : files) { index++; progress = (int) Math.floor((float) index / total * 100); /* Tell progressListener which file we are processing */ - this.getIndexingProgressListener().progress(file.getFileName().toString()); + this.indexingProgressListener.progress(file.getFileName().toString()); - Release r = getReleaseFactory().createRelease(file, getUserInteractionHandler()); + Release r = releaseFactory.createRelease(file, userInteractionHandler); if (r != null) { releases.add(r); } /* Update progressListener */ - this.getIndexingProgressListener().progress(progress); + this.indexingProgressListener.progress(progress); } return releases; } - private List getFiles(String filePath, Language language, boolean recursive, boolean overwriteExistingSubtitles) { + private List getFiles(String filePath, Language language, boolean recursive, + boolean overwriteExistingSubtitles) { /* Get a list of selected directories */ - List dirs = !filePath.isEmpty() ? List.of(Path.of(filePath)) : this.getSettings().defaultFolders; + List dirs = !filePath.isEmpty() ? List.of(Path.of(filePath)) : this.settings.defaultFolders; /* Scan directories for video files */ /* Tell Action where to send progressUpdates */ - this.filelistAction.setIndexingProgressListener(this.getIndexingProgressListener()); + this.filelistAction.indexingProgressListener = this.indexingProgressListener; /* Start the getFileListing Action */ return dirs.stream() - .flatMap(dir -> this.filelistAction.getFileListing(dir, recursive, language, overwriteExistingSubtitles).stream()) + .flatMap(dir -> this.filelistAction.getFileListing(dir, recursive, language, overwriteExistingSubtitles) + .stream()) .toList(); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java index 9abc7830..60de0559 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java @@ -1,10 +1,12 @@ package org.lodder.subtools.multisubdownloader.gui.actions.search; +import static manifold.ext.props.rt.api.PropOption.*; + import java.util.List; -import lombok.AccessLevel; -import lombok.Getter; import lombok.NonNull; +import manifold.ext.props.rt.api.get; +import manifold.ext.props.rt.api.override; import org.lodder.subtools.multisubdownloader.GUI; import org.lodder.subtools.multisubdownloader.UserInteractionHandlerGUI; import org.lodder.subtools.multisubdownloader.actions.SearchAction; @@ -22,16 +24,15 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; -@Getter(value = AccessLevel.PROTECTED) public abstract class GuiSearchAction

extends SearchAction { - private final @NonNull GUI mainWindow; - private final @NonNull SearchPanel

searchPanel; - private final SubtitleFiltering filtering; - private final @NonNull ReleaseFactory releaseFactory; - private final IndexingProgressListener indexingProgressListener; - private final SearchProgressListener searchProgressListener; - private final UserInteractionHandlerGUI userInteractionHandler; + @get(Protected) @NonNull GUI mainWindow; + @get(Protected) @NonNull SearchPanel

searchPanel; + @get(Protected) SubtitleFiltering filtering; + @get(Protected) @NonNull ReleaseFactory releaseFactory; + @get(Protected) @override IndexingProgressListener indexingProgressListener; + @get(Protected) @override SearchProgressListener searchProgressListener; + @get(Protected) @override UserInteractionHandlerGUI userInteractionHandler; GuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow, SearchPanel

searchPanel, ReleaseFactory releaseFactory) { @@ -52,7 +53,7 @@ public abstract class GuiSearchAction

extends SearchAction } protected P getInputPanel() { - return this.getSearchPanel().getInputPanel(); + return this.searchPanel.getInputPanel(); } @Override @@ -72,8 +73,8 @@ public void onFound(Release release, List subtitles) { searchPanel.getResultPanel().enableButtons(); } - if (this.getSearchManager().getProgress() == 100) { - this.getSearchProgressListener().completed(); + if (this.searchManager.getProgress() == 100) { + this.searchProgressListener.completed(); searchPanel.getInputPanel().enableSearchButton(); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java index 8a15c8fe..bed6fa61 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java @@ -56,8 +56,10 @@ public static FileGuiSearchActionBuilderManager createWithSettings(Settings sett @Setter @Accessors(chain = true, fluent = true) public static class TextGuiSearchActionBuilder - implements TextGuiSearchActionBuilderBuild, TextGuiSearchActionBuilderReleaseFactory, TextGuiSearchActionBuilderSearchPanel, - TextGuiSearchActionBuilderGUI, TextGuiSearchActionBuilderSubtitleProviderStore, FileGuiSearchActionBuilderManager { + implements TextGuiSearchActionBuilderBuild, TextGuiSearchActionBuilderReleaseFactory, + TextGuiSearchActionBuilderSearchPanel, + TextGuiSearchActionBuilderGUI, TextGuiSearchActionBuilderSubtitleProviderStore, + FileGuiSearchActionBuilderManager { private final Settings settings; private Manager manager; private SubtitleProviderStore subtitleProviderStore; @@ -67,11 +69,13 @@ public static class TextGuiSearchActionBuilder @Override public TextGuiSearchAction build() { - return new TextGuiSearchAction(manager, settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); + return new TextGuiSearchAction(manager, settings, subtitleProviderStore, mainWindow, searchPanel, + releaseFactory); } } - private TextGuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow, + private TextGuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, + GUI mainWindow, SearchPanel searchPanel, ReleaseFactory releaseFactory) { super(manager, settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); } @@ -88,7 +92,7 @@ protected List createReleases() { String name = getInputPanel().getReleaseName(); VideoSearchType type = getInputPanel().getType(); - VideoTableModel model = (VideoTableModel) this.getSearchPanel().getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); model.clearTable(); // TODO: Redefine what a "release" is. @@ -103,21 +107,23 @@ protected List createReleases() { .name(name) .quality(getInputPanel().getQuality()) .build(); - default -> getReleaseFactory().createRelease(Path.of(name), getUserInteractionHandler()); + default -> releaseFactory.createRelease(Path.of(name), userInteractionHandler); }; return release != null ? List.of(release) : List.of(); } @Override public void onFound(Release release, List subtitles) { - VideoTableModel model = (VideoTableModel) this.getSearchPanel().getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); List subtitlesFiltered = - getFiltering() != null ? subtitles.stream().filter(subtitle -> getFiltering().useSubtitle(subtitle, release)).toList() : subtitles; + filtering != null ? + subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).toList() : + subtitles; subtitlesFiltered.forEach(release::addMatchingSub); // use automatic selection to reduce the selection for the user - List subtitlesFilteredAutomatic = getUserInteractionHandler().getAutomaticSelection(subtitlesFiltered); + List subtitlesFilteredAutomatic = userInteractionHandler.getAutomaticSelection(subtitlesFiltered); subtitlesFilteredAutomatic.forEach(model::addRow); /* Let GuiSearchAction also make some decisions */ diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java index eef7d289..e1b98eeb 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java @@ -2,6 +2,8 @@ import java.util.prefs.Preferences; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; @@ -18,12 +20,14 @@ public class Addic7edServiceProvider implements ServiceProvider { protected Container app; protected SubtitleProvider subtitleProvider; + /* We define a priority lower than SubtitleServiceProvider */ + @val @override int priority = 1; - @Override - public int getPriority() { - /* We define a priority lower than SubtitleServiceProvider */ - return 1; - } + // @Override + // public int getPriority() { + // /* We define a priority lower than SubtitleServiceProvider */ + // return 1; + // } @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { @@ -60,12 +64,14 @@ private SubtitleProvider createProvider(UserInteractionHandler userInteractionHa if (settings.isSerieSourceAddic7edProxy()) { return new JAddic7edViaProxyAdapter(manager, userInteractionHandler); } else { - return new JAddic7edAdapter(loginEnabled, username, password, preferences.getBoolean("speedy", false), manager, userInteractionHandler); + return new JAddic7edAdapter(loginEnabled, username, password, preferences.getBoolean("speedy", false), + manager, userInteractionHandler); } } // TODO is this still needed? - private void registerListener(SubtitleProviderStore subtitleProviderStore, UserInteractionHandler userInteractionHandler) { + private void registerListener(SubtitleProviderStore subtitleProviderStore, + UserInteractionHandler userInteractionHandler) { /* Resolve the EventEmitter from the IoC Container */ Emitter emitter = (Emitter) app.make("EventEmitter"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java index 10fc212f..12e8f8c8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.serviceproviders; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; import org.lodder.subtools.multisubdownloader.framework.event.Emitter; @@ -15,12 +17,14 @@ public class LocalServiceProvider implements ServiceProvider { private UserInteractionHandler userInteractionHandler; protected Container app; protected SubtitleProvider subtitleProvider; + /* We define a priority lower than SubtitleServiceProvider */ + @val @override int priority = 1; - @Override - public int getPriority() { - /* We define a priority lower than SubtitleServiceProvider */ - return 1; - } + // @Override + // public int getPriority() { + // /* We define a priority lower than SubtitleServiceProvider */ + // return 1; + // } @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java index 56310834..5f2f594e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.serviceproviders; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; @@ -15,12 +17,14 @@ public class OpenSubtitlesServiceProvider implements ServiceProvider { protected Container app; protected SubtitleProvider subtitleProvider; + /* We define a priority lower than SubtitleServiceProvider */ + @val @override int priority = 1; - @Override - public int getPriority() { - /* We define a priority lower than SubtitleServiceProvider */ - return 1; - } + // @Override + // public int getPriority() { + // /* We define a priority lower than SubtitleServiceProvider */ + // return 1; + // } @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { @@ -55,7 +59,8 @@ private SubtitleProvider createProvider(UserInteractionHandler userInteractionHa return new JOpenSubAdapter(loginEnabled, username, password, manager, userInteractionHandler); } - private void registerListener(SubtitleProviderStore subtitleProviderStore, UserInteractionHandler userInteractionHandler) { + private void registerListener(SubtitleProviderStore subtitleProviderStore, + UserInteractionHandler userInteractionHandler) { /* Resolve the EventEmitter from the IoC Container */ Emitter emitter = (Emitter) app.make("EventEmitter"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java index d6b8717b..b0b609e7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.serviceproviders; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; import org.lodder.subtools.multisubdownloader.framework.service.providers.ServiceProvider; @@ -9,11 +11,14 @@ import org.lodder.subtools.sublibrary.Manager; public class PodnapisiServiceProvider implements ServiceProvider { - @Override - public int getPriority() { - /* We define a priority lower than SubtitleServiceProvider */ - return 1; - } + /* We define a priority lower than SubtitleServiceProvider */ + @val @override int priority = 1; + + // @Override + // public int getPriority() { + // /* We define a priority lower than SubtitleServiceProvider */ + // return 1; + // } @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubsceneServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubsceneServiceProvider.java index bfd8e652..b2b03a6c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubsceneServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubsceneServiceProvider.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.serviceproviders; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; import org.lodder.subtools.multisubdownloader.framework.service.providers.ServiceProvider; @@ -12,12 +14,14 @@ public class SubsceneServiceProvider implements ServiceProvider { protected Container app; protected SubtitleProvider subtitleProvider; + /* We define a priority lower than SubtitleServiceProvider */ + @val @override int priority = 1; - @Override - public int getPriority() { - /* We define a priority lower than SubtitleServiceProvider */ - return 1; - } + // @Override + // public int getPriority() { + // /* We define a priority lower than SubtitleServiceProvider */ + // return 1; + // } @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubtitleServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubtitleServiceProvider.java index 8af65377..27524b1e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubtitleServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubtitleServiceProvider.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.serviceproviders; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; import org.lodder.subtools.multisubdownloader.framework.service.providers.ServiceProvider; @@ -8,10 +10,12 @@ public class SubtitleServiceProvider implements ServiceProvider { - @Override - public int getPriority() { - return 0; - } + @val @override int priority = 0; + + // @Override + // public int getPriority() { + // return 0; + // } @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/TvSubtitlesServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/TvSubtitlesServiceProvider.java index 67c3edd1..bac85fd7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/TvSubtitlesServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/TvSubtitlesServiceProvider.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.serviceproviders; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.framework.Container; import org.lodder.subtools.multisubdownloader.framework.service.providers.ServiceProvider; @@ -9,11 +11,15 @@ import org.lodder.subtools.sublibrary.Manager; public class TvSubtitlesServiceProvider implements ServiceProvider { - @Override - public int getPriority() { - /* We define a priority lower than SubtitleServiceProvider */ - return 1; - } + + /* We define a priority lower than SubtitleServiceProvider */ + @val @override int priority = 1; + + // @Override + // public int getPriority() { + // /* We define a priority lower than SubtitleServiceProvider */ + // return 1; + // } @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { From 0466ea1a60fe194cd5c4e31afa53cf6814546de8 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 14:32:48 +0100 Subject: [PATCH 20/54] changes --- .../UserInteractionHandlerCLI.java | 9 +- .../gui/dialog/MappingEpisodeNameDialog.java | 132 +++++++++--------- .../gui/dialog/ProgressDialog.java | 17 +-- .../gui/dialog/RenameDialog.java | 24 ++-- .../gui/extra/ArrowButton.java | 55 +++----- .../gui/extra/ImageListCellRenderer.java | 33 ++--- .../gui/extra/JListWithImages.java | 17 ++- .../gui/extra/PanelCheckBox.java | 8 +- .../gui/extra/TitlePanel.java | 16 ++- .../gui/extra/table/CustomColumnName.java | 10 +- .../gui/extra/table/SearchColumnName.java | 23 ++- .../extra/table/SubtitleTableColumnName.java | 39 ++++-- .../gui/extra/table/SubtitleTableModel.java | 17 ++- .../gui/extra/table/VideoTableModel.java | 50 +++---- .../jtextfield/MyPasswordField.java | 12 +- .../gui/panels/SearchPanel.java | 7 +- .../preference/EpisodeLibraryPanel.java | 2 +- .../panels/preference/MovieLibraryPanel.java | 2 +- .../gui/panels/preference/StructurePanel.java | 24 ++-- .../panels/preference/VideoLibraryPanel.java | 33 +++-- .../subtitles/filters/ExactNameFilter.java | 2 +- .../subtitles/filters/KeywordFilter.java | 2 +- .../subtitles/filters/ReleaseGroupFilter.java | 5 +- .../subtitles/filters/SubtitleFilter.java | 2 +- .../sublibrary/model/MovieRelease.java | 2 +- .../subtools/sublibrary/model/Release.java | 2 +- .../subtools/sublibrary/model/TvRelease.java | 11 +- .../subtools/sublibrary/model/Video.java | 2 +- 28 files changed, 277 insertions(+), 281 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java index 666c63cb..bbbea3cf 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java @@ -43,7 +43,8 @@ public UserInteractionHandlerCLI(UserInteractionSettingsIntf settings) { @Override public List selectSubtitles(Release release) { - System.out.printf("\n%s : %s%n", Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease"), release.fileName); + System.out.printf("\n%s : %s%n", Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease"), + release.fileName); return PrompterUtil .getElementsFromList(release.getMatchingSubs()) .displayAsTable(createTableDisplayer()) @@ -53,12 +54,14 @@ public List selectSubtitles(Release release) { .prompt(prompter); } - private ColumnDisplayer createSubtitleDisplayer(SubtitleTableColumnName column, Function toStringMapper) { + private ColumnDisplayer createSubtitleDisplayer(SubtitleTableColumnName column, + Function toStringMapper) { return new ColumnDisplayer<>(column.getColumnName(), (Subtitle s) -> String.valueOf(toStringMapper.apply(s))); } private TableDisplayer createTableDisplayer() { - return new TableDisplayer<>(Stream.of(SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARINGIMPAIRED) + return new TableDisplayer<>(Stream.of(SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, + HEARING_IMPAIRED) .map(stcn -> createSubtitleDisplayer(stcn, stcn.getValueFunction())).toList()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index 4cde04e2..2d2a75c6 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -14,9 +14,10 @@ import java.util.function.BiFunction; import java.util.function.Function; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; +import manifold.ext.props.rt.api.val; +import manifold.ext.props.rt.api.var; import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.tuple.Pair; import org.lodder.subtools.multisubdownloader.Messages; @@ -32,8 +33,7 @@ public class MappingEpisodeNameDialog extends MultiSubDialog { - @Serial - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final JPanel contentPanel = new JPanel(); private final Manager manager; @@ -48,8 +48,8 @@ public class MappingEpisodeNameDialog extends MultiSubDialog { /** * Create the dialog. */ - public MappingEpisodeNameDialog(JFrame frame, final SettingsControl prefCtrl, Manager manager, SubtitleProviderStore subtitleProviderStore, - UserInteractionHandlerGUI userInteractionHandler) { + public MappingEpisodeNameDialog(JFrame frame, final SettingsControl prefCtrl, Manager manager, + SubtitleProviderStore subtitleProviderStore, UserInteractionHandlerGUI userInteractionHandler) { super(frame, Messages.getString("MappingEpisodeNameDialog.Title"), true); this.manager = manager; this.subtitleProviderStore = subtitleProviderStore; @@ -61,7 +61,8 @@ public MappingEpisodeNameDialog(JFrame frame, final SettingsControl prefCtrl, Ma private void selectMappingType(MappingType mappingType) { this.selectedMappingType = mappingType; - this.selectedSubtitleProvider = subtitleProviderStore.getAllProviders().stream() + this.selectedSubtitleProvider = subtitleProviderStore.getAllProviders() + .stream() .filter(subtitleProvider -> subtitleProvider.getProviderName().equals(mappingType.getProviderName())) .findAny(); btnAddCustomMapping.setEnabled(selectedSubtitleProvider.isPresent()); @@ -73,14 +74,12 @@ private void selectMappingType(MappingType mappingType) { public enum MappingType { TVDB("TVDB", "TVDB", new SelectionForKeyPrefix("", "TVDB-serieId-", k -> k.replace("-serieId-", "-tvdbSerie-"))), - ADDIC7ED("Addic7ed", SubtitleSource.ADDIC7ED, - new SelectionForKeyPrefix("", "ADDIC7ED-serieName-name:"), + ADDIC7ED("Addic7ed", SubtitleSource.ADDIC7ED, new SelectionForKeyPrefix("", "ADDIC7ED-serieName-name:"), new SelectionForKeyPrefix("", "ADDIC7ED-serieName-tvdbId:")), ADDIC7ED_PROXY("Addic7ed (Proxy)", SubtitleSource.ADDIC7ED.name() + "-GESTDOWN", new SelectionForKeyPrefix("", "ADDIC7ED-GESTDOWN-serieName-name:"), new SelectionForKeyPrefix("", "ADDIC7ED-GESTDOWN-serieName-tvdbId:")), - SUBSCENE("Subscene", SubtitleSource.SUBSCENE, - new SelectionForKeyPrefix("", "SUBSCENE-serieName-name:"), + SUBSCENE("Subscene", SubtitleSource.SUBSCENE, new SelectionForKeyPrefix("", "SUBSCENE-serieName-name:"), new SelectionForKeyPrefix("", "SUBSCENE-serieName-tvdbId:")), TV_SUBTITLES("TVSubtitles", SubtitleSource.TVSUBTITLES, new SelectionForKeyPrefix("", "TVSUBTITLES-serieName-name:"), @@ -88,11 +87,11 @@ public enum MappingType { OPEN_SUBTITLES("OpenSubtitles", SubtitleSource.OPENSUBTITLES, new SelectionForKeyPrefix("", "OPENSUBTITLES-serieName-name:"), new SelectionForKeyPrefix("", "OPENSUBTITLES-serieName-tvdbId:")), - PODNAPISI("Podnapisi", SubtitleSource.PODNAPISI, - new SelectionForKeyPrefix("", "PODNAPISI-serieName-name:"), + PODNAPISI("Podnapisi", SubtitleSource.PODNAPISI, new SelectionForKeyPrefix("", "PODNAPISI-serieName-name:"), new SelectionForKeyPrefix("", "PODNAPISI-serieName-tvdbId:")); - public static final BiFunction>> MAPPING_SUPPLIER; + public static final BiFunction>> + MAPPING_SUPPLIER; private final String name; private final String providerName; private final String nameColumn; @@ -133,15 +132,11 @@ public SelectionForKeyPrefix(String name, String keyPrefix) { } } - @Getter - @Setter - @RequiredArgsConstructor private static class Row extends Vector { - @Serial - private static final long serialVersionUID = 8620670431074648999L; - private final String key; - private SerieMapping serieMapping; - private final SelectionForKeyPrefix selectionForKeyPrefix; + @Serial private static final long serialVersionUID = 8620670431074648999L; + @val String key; + @val SelectionForKeyPrefix selectionForKeyPrefix; + @var SerieMapping serieMapping; public Row(String key, String name, String providerId, String providerName, SerieMapping serieMapping, SelectionForKeyPrefix selectionForKeyPrefix) { @@ -154,29 +149,33 @@ public Row(String key, String name, String providerId, String providerName, Seri } } - @RequiredArgsConstructor + @AllArgsConstructor private static class MappingTableModel extends DefaultTableModel { - @Serial - private static final long serialVersionUID = 7860605766969472980L; - private final Manager manager; + @Serial private static final long serialVersionUID = 7860605766969472980L; + @val Manager manager; void setMappingType(MappingType mappingType) { - setDataVector(null, new String[]{ mappingType.getNameColumn(), mappingType.getMappingColumn(), mappingType.getProviderNameColumn() }); + setDataVector(null, new String[]{ mappingType.getNameColumn(), mappingType.getMappingColumn(), + mappingType.getProviderNameColumn() }); Arrays.stream(mappingType.getSelectionForKeyPrefixList()) - .flatMap(selectionForKeyPrefix -> MappingType.MAPPING_SUPPLIER.apply(manager, selectionForKeyPrefix).stream() + .flatMap(selectionForKeyPrefix -> MappingType.MAPPING_SUPPLIER.apply(manager, selectionForKeyPrefix) + .stream() .map(serieMappingPair -> { SerieMapping serieMapping = serieMappingPair.getValue(); String name = serieMapping.getName(); - String providerId = serieMapping.getProviderId() == null ? "" : serieMapping.getProviderId(); + String providerId = + serieMapping.getProviderId() == null ? "" : serieMapping.getProviderId(); String providerName = serieMapping.getProviderName(); if (providerId.contains("/")) { providerId = providerId.substring(providerId.lastIndexOf("/") + 1); } providerId = providerId.replace(".html", ""); - return new Row(serieMappingPair.getKey(), name, providerId, providerName, serieMapping, selectionForKeyPrefix); + return new Row(serieMappingPair.getKey(), name, providerId, providerName, serieMapping, + selectionForKeyPrefix); })) - .sorted(Comparator.comparing(row -> row.getSerieMapping() == null || row.getSerieMapping().getProviderName() == null ? "zzz" - : row.getSerieMapping().getName())) + .sorted(Comparator.comparing( + row -> row.serieMapping == null || row.serieMapping.getProviderName() == null ? "zzz" : + row.serieMapping.getName())) .forEach(this::addRow); } @@ -248,15 +247,12 @@ private void initialize() { MappingTableModel model = (MappingTableModel) table.getModel(); Row row = (Row) model.getDataVector().get(rowNbr); - String key = row.getKey(); - manager.valueBuilder() - .cacheType(CacheType.DISK) - .key(key) - .remove(); - if (row.getSelectionForKeyPrefix().deleteOtherFunction() != null) { + String key = row.key; + manager.valueBuilder().cacheType(CacheType.DISK).key(key).remove(); + if (row.selectionForKeyPrefix.deleteOtherFunction() != null) { manager.valueBuilder() .cacheType(CacheType.DISK) - .key(row.getSelectionForKeyPrefix().deleteOtherFunction().apply(key)) + .key(row.selectionForKeyPrefix.deleteOtherFunction().apply(key)) .remove(); } model.removeRow(rowNbr); @@ -270,42 +266,42 @@ private void initialize() { MappingTableModel model = (MappingTableModel) table.getModel(); Row row = (Row) model.getDataVector().get(rowNbr); - String currentName = row.getSerieMapping().getName(); + String currentName = row.serieMapping.getName(); String message = Messages.getString("MappingEpisodeNameDialog.enterNewNameForSerie", currentName); - selectedSubtitleProvider.ifPresent(provider -> { - userInteractionHandler.enter(message, message).ifPresent(newName -> { - TvRelease tvRelease = TvRelease.builder() - .name(currentName) - .season(row.getSerieMapping().getSeason()) - .episode(1) - .originalName(currentName) - .customName(newName).build(); - try { - provider.getProviderSerieId(tvRelease).ifPresentOrElse(providerSerieId -> { - SerieMapping newSerieMapping = - new SerieMapping(currentName, providerSerieId.getProviderId(), providerSerieId.getProviderName(), - providerSerieId.getSeason()); - row.setSerieMapping(newSerieMapping); - List sortKeys = table.getRowSorter().getSortKeys(); - selectMappingType(selectedMappingType); - table.getRowSorter().setSortKeys(sortKeys); - }, () -> userInteractionHandler.message( - Messages.getString("MappingEpisodeNameDialog.NoResultsFoundForSerieName", newName), - Messages.getString("App.Info"))); - } catch (Exception e) { - userInteractionHandler.message( - Messages.getString("App.ErrorOccurred", e.getMessage()), Messages.getString("App.Error")); - } - }); - }); + selectedSubtitleProvider.ifPresent( + provider -> userInteractionHandler.enter(message, message).ifPresent(newName -> { + TvRelease tvRelease = TvRelease.builder() + .name(currentName) + .season(row.serieMapping.getSeason()) + .episode(1) + .originalName(currentName) + .customName(newName) + .build(); + try { + provider.getProviderSerieId(tvRelease).ifPresentOrElse(providerSerieId -> { + SerieMapping newSerieMapping = + new SerieMapping(currentName, providerSerieId.getProviderId(), + providerSerieId.getProviderName(), providerSerieId.getSeason()); + row.serieMapping = newSerieMapping; + List sortKeys = table.getRowSorter().getSortKeys(); + selectMappingType(selectedMappingType); + table.getRowSorter().setSortKeys(sortKeys); + }, () -> userInteractionHandler.message( + Messages.getString("MappingEpisodeNameDialog.NoResultsFoundForSerieName", + newName), Messages.getString("App.Info"))); + } catch (Exception e) { + userInteractionHandler.message( + Messages.getString("App.ErrorOccurred", e.getMessage()), + Messages.getString("App.Error")); + } + })); }); buttonPane.add(btnAddCustomMapping, "skip"); } { - new JButton(Messages.getString("App.Close")) - .defaultButtonFor(getRootPane()) + new JButton(Messages.getString("App.Close")).defaultButtonFor(getRootPane()) .withActionListener(() -> setVisible(false)) .withActionCommand(Messages.getString("App.Close")) .addTo(buttonPane, "skip"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java index bce60dd8..7441f777 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java @@ -5,7 +5,6 @@ import java.awt.event.WindowEvent; import java.io.Serial; -import lombok.Getter; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.progress.Messenger; @@ -17,8 +16,6 @@ public class ProgressDialog extends MultiSubDialog implements Messenger { private static final long serialVersionUID = -2320149791421648965L; private final Cancelable worker; - - @Getter private JProgressBar progressBar; private JLabel label; @@ -26,7 +23,7 @@ public ProgressDialog(JFrame frame, Cancelable sft) { super(frame, Messages.getString("ProgressDialog.Title"), false); worker = sft; StatusMessenger.instance.addListener(this); - initialize_ui(); + initializeUi(); setDialogLocation(frame); repaint(); } @@ -35,11 +32,11 @@ public ProgressDialog(Cancelable sft) { super(Messages.getString("ProgressDialog.Title"), false); worker = sft; StatusMessenger.instance.addListener(this); - initialize_ui(); + initializeUi(); repaint(); } - private void initialize_ui() { + private void initializeUi() { addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { @@ -77,11 +74,11 @@ public void message(String message) { public void updateProgress(int progress) { if (progress == 0) { - getProgressBar().setIndeterminate(true); + progressBar.setIndeterminate(true); } else { - getProgressBar().setIndeterminate(false); - getProgressBar().setValue(progress); - getProgressBar().setString(Integer.toString(progress)); + progressBar.setIndeterminate(false); + progressBar.setValue(progress); + progressBar.setString(Integer.toString(progress)); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index fb03c1f4..b6392301 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -14,8 +14,8 @@ import java.util.stream.Stream; import com.google.common.collect.Streams; -import lombok.Setter; import lombok.experimental.ExtensionMethod; +import manifold.ext.props.rt.api.set; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.actions.RenameAction; @@ -59,9 +59,11 @@ public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String .addComponent("grow", this.txtFolder = MyTextFieldPath.builder().requireValue().build().withColumns(20)) .addComponent("shrink, wrap", new JButton(Messages.getString("App.Browse")) .withActionListener(() -> MemoryFolderChooser.getInstance() - .selectDirectory(getContentPane(), Messages.getString("PreferenceDialog.SelectFolderForRenameReplace")) + .selectDirectory(getContentPane(), + Messages.getString("PreferenceDialog.SelectFolderForRenameReplace")) .ifPresent(txtFolder::setObject))) - .addComponent("wrap", this.chkRecursive = new JCheckBox(Messages.getString("RenameDialog.RecursiveSearch"))); + .addComponent("wrap", + this.chkRecursive = new JCheckBox(Messages.getString("RenameDialog.RecursiveSearch"))); if (videoType == VideoType.EPISODE) { pnlLibrary = new EpisodeLibraryPanel(settings.episodeLibrarySettings, manager, true, userInteractionHandler) @@ -92,15 +94,17 @@ private void rename(VideoType videoType, Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { if (!hasValidSettings()) { - JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", + JOptionPane.ERROR_MESSAGE); return; } setVisible(false); pnlLibrary.savePreferenceSettings(); - TypedRenameWorker renameWorker = new TypedRenameWorker(txtFolder.getObject(), pnlLibrary.getLibrarySettings(), videoType, - this.chkRecursive.isSelected(), manager, userInteractionHandler); + TypedRenameWorker renameWorker = + new TypedRenameWorker(txtFolder.getObject(), pnlLibrary.getLibrarySettings(), videoType, + this.chkRecursive.isSelected(), manager, userInteractionHandler); renameWorker.addPropertyChangeListener(this); - renameWorker.setReleaseFactory(new ReleaseFactory(settings, manager)); + renameWorker.releaseFactory = new ReleaseFactory(settings, manager); progressDialog = new ProgressDialog(renameWorker); progressDialog.setVisible(true); renameWorker.execute(); @@ -127,14 +131,14 @@ private static class TypedRenameWorker extends SwingWorker impleme private final VideoType videoType; private final Set extensions; private final boolean isRecursive; - @Setter - private ReleaseFactory releaseFactory; private final RenameAction renameAction; + @set ReleaseFactory releaseFactory; public TypedRenameWorker(Path dir, LibrarySettings librarySettings, VideoType videoType, boolean isRecursive, Manager manager, UserInteractionHandler userInteractionHandler) { this.userInteractionHandler = userInteractionHandler; - this.extensions = Streams.concat(VideoPatterns.EXTENSIONS.stream(), Stream.of("srt")).collect(Collectors.toUnmodifiableSet()); + this.extensions = Streams.concat(VideoPatterns.EXTENSIONS.stream(), Stream.of("srt")) + .collect(Collectors.toUnmodifiableSet()); this.dir = dir; this.videoType = videoType; this.isRecursive = isRecursive; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java index 71b5c150..538b5cea 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java @@ -4,23 +4,19 @@ import java.awt.*; import java.io.Serial; -import lombok.Getter; -import lombok.Setter; +import manifold.ext.props.rt.api.var; -@Getter -@Setter public class ArrowButton extends JButton { - @Serial - private static final long serialVersionUID = -4630720317499130016L; + @Serial private static final long serialVersionUID = -4630720317499130016L; /** - * The cardinal direction of the arrow(s), - * any of {@link SwingConstants#NORTH}, {@link SwingConstants#SOUTH}, {@link SwingConstants#WEST} or {@link SwingConstants#EAST} + * The cardinal direction of the arrow(s), any of {@link SwingConstants#NORTH}, {@link SwingConstants#SOUTH}, + * {@link SwingConstants#WEST} or {@link SwingConstants#EAST} */ - private int direction; - private int arrowCount; - private int arrowSize; + @var int direction; + @var int arrowCount; + @var int arrowSize; public ArrowButton(int direction, int arrowCount, int arrowSize) { setMargin(new Insets(0, 2, 0, 2)); @@ -37,13 +33,10 @@ public Dimension getPreferredSize() { @Override public Dimension getMinimumSize() { - return new Dimension(arrowSize - * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? arrowCount : 3) - + getBorder().getBorderInsets(this).left + getBorder().getBorderInsets(this).right, - arrowSize - * (direction == SwingConstants.NORTH || direction == SwingConstants.SOUTH ? arrowCount : 3) - + getBorder().getBorderInsets(this).top - + getBorder().getBorderInsets(this).bottom); + return new Dimension(arrowSize * (direction == EAST || direction == WEST ? arrowCount : 3) + + getBorder().getBorderInsets(this).left + getBorder().getBorderInsets(this).right, + arrowSize * (direction == NORTH || direction == SOUTH ? arrowCount : 3) + + getBorder().getBorderInsets(this).top + getBorder().getBorderInsets(this).bottom); } @Override @@ -63,18 +56,10 @@ protected void paintComponent(Graphics g) { int w = getSize().width; int h = getSize().height; for (int i = 0; i < arrowCount; i++) { - paintArrow(g, - (w - arrowSize - * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? arrowCount : 1)) - / 2 - + arrowSize - * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? i : 0), - (h - arrowSize - * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? 1 : arrowCount)) - / 2 - + arrowSize - * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? 0 : i), - g.getColor()); + paintArrow(g, (w - arrowSize * (direction == EAST || direction == WEST ? arrowCount : 1)) / 2 + + arrowSize * (direction == EAST || direction == WEST ? i : 0), + (h - arrowSize * (direction == EAST || direction == WEST ? 1 : arrowCount)) / 2 + + arrowSize * (direction == EAST || direction == WEST ? 0 : i), g.getColor()); } g.setColor(oldColor); @@ -84,7 +69,7 @@ private void paintArrow(Graphics g, int x, int y, Color highlight) { int mid, i, j; Color oldColor = g.getColor(); - boolean isEnabled = isEnabled(); + boolean enabled = isEnabled(); j = 0; arrowSize = Math.max(arrowSize, 2); @@ -97,13 +82,13 @@ private void paintArrow(Graphics g, int x, int y, Color highlight) { for (i = 0; i < arrowSize; i++) { g.drawLine(mid - i, i, mid + i, i); } - if (!isEnabled) { + if (!enabled) { g.setColor(highlight); g.drawLine(mid - i + 2, i, mid + i, i); } } case SOUTH -> { - if (!isEnabled) { + if (!enabled) { g.translate(1, 1); g.setColor(highlight); for (i = arrowSize - 1; i >= 0; i--) { @@ -123,13 +108,13 @@ private void paintArrow(Graphics g, int x, int y, Color highlight) { for (i = 0; i < arrowSize; i++) { g.drawLine(i, mid - i, i, mid + i); } - if (!isEnabled) { + if (!enabled) { g.setColor(highlight); g.drawLine(i, mid - i + 2, i, mid + i); } } case EAST -> { - if (!isEnabled) { + if (!enabled) { g.translate(1, 1); g.setColor(highlight); for (i = arrowSize - 1; i >= 0; i--) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java index 30e7c4e7..e08fa1f8 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java @@ -13,26 +13,23 @@ public class ImageListCellRenderer extends JLabel implements ListCellRendererSource: - *

- * Return a component that has been configured to display the specified value. - * That component's paint method is then called to "render" the cell. - * If it is necessary to compute the dimensions of a list because the list cells do not have a fixed size, - * this method is called to generate a component on which getPreferredSize can be invoked. - *

- * jlist - the jlist we're painting - * value - the value returned by list.getModel().getElementAt(index). - * cellIndex - the cell index - * isSelected - true if the specified cell is currently selected - * cellHasFocus - true if the cell has focus - */ - @Override - public Component getListCellRendererComponent(JList jlist, Object value, int cellIndex, - boolean isSelected, boolean cellHasFocus) { + /** + * Source: + *

+ * Return a component that has been configured to display the specified value. That component's paint method is then + * called to "render" the cell. If it is necessary to compute the dimensions of a list because the list cells do not + * have a fixed size, this method is called to generate a component on which getPreferredSize can be invoked. + *

+ * jlist - the jlist we're painting value - the value returned by list.getModel().getElementAt(index). cellIndex - + * the cell index selected - true if the specified cell is currently selected cellHasFocus - true if the cell has + * focus + */ + @Override + public Component getListCellRendererComponent(JList jlist, Object value, int cellIndex, + boolean selected, boolean cellHasFocus) { if (value instanceof JPanel) { Component component = (Component) value; - if (isSelected) { + if (selected) { component.setBackground(jlist.getSelectionBackground()); component.setForeground(jlist.getSelectionForeground()); } else { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java index c575038d..c23cfc62 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java @@ -10,9 +10,9 @@ import java.util.stream.Stream; import com.google.common.base.Objects; -import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.val; public class JListWithImages extends JList> { @@ -58,7 +58,8 @@ public void addItems(Image image, Collection values) { public void addItem(Image image, T value) { if (!distinctValues || !contains(value)) { - ((DefaultListModel>) getModel()).addElement(new LabelPanel<>(image, value, toStringMapper, SwingConstants.LEFT)); + ((DefaultListModel>) getModel()).addElement( + new LabelPanel<>(image, value, toStringMapper, SwingConstants.LEFT)); } } @@ -90,11 +91,10 @@ private Optional> getLabelPanel(int index) { return Optional.ofNullable(getModel().getElementAt(index)); } - @Getter public static class LabelPanel extends JPanel { private static final long serialVersionUID = 1L; - private final Label label; + @val Label label; LabelPanel(Image image, T object, Function toStringMapper, int horizontalAlignment) { this.label = new Label<>(image, object, toStringMapper, horizontalAlignment); @@ -103,19 +103,18 @@ public static class LabelPanel extends JPanel { } public T getObject() { - return label.getObject(); + return label.object; } public Image getImage() { - return label.getImage(); + return label.image; } } - @Getter private static class Label extends JLabel { private static final long serialVersionUID = 1L; - private final T object; - private final Image image; + @val T object; + @val Image image; Label(Image image, T object, Function toStringMapper, int horizontalAlignment) { super(toStringMapper.apply(object), getImageIcon(image), horizontalAlignment); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java index 5194e27e..5a482a8b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java @@ -6,10 +6,10 @@ import java.awt.event.ContainerListener; import java.io.Serial; -import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.val; import net.miginfocom.swing.MigLayout; public class PanelCheckBox extends JPanel { @@ -17,10 +17,10 @@ public class PanelCheckBox extends JPanel { private static final long serialVersionUID = 1L; private final JCheckBox checkbox; - @Getter - private final JPanel panel; + @val JPanel panel; - private PanelCheckBox(JCheckBox checkbox, boolean panelOnNewLine, LayoutManager panelLayout, boolean addVerticalSeparator, int leftGap) { + private PanelCheckBox(JCheckBox checkbox, boolean panelOnNewLine, LayoutManager panelLayout, + boolean addVerticalSeparator, int leftGap) { super(new MigLayout("insets 0, novisualpadding, fillx")); this.checkbox = checkbox; this.panel = new JPanel(panelLayout) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java index 651823ef..9ddd22ee 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java @@ -4,19 +4,19 @@ import java.awt.*; import java.io.Serial; -import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.var; import net.miginfocom.swing.MigLayout; public class TitlePanel extends JPanel { @Serial private static final long serialVersionUID = 1L; - @Getter - private final JPanel panel; + @var JPanel panel; - private TitlePanel(String title, LayoutManager panelLayout, int marginTop, int marginLeft, int marginBottom, int marginRight) { + private TitlePanel(String title, LayoutManager panelLayout, int marginTop, int marginLeft, int marginBottom, + int marginRight) { super(new MigLayout("fillx, nogrid, insets %s %s %s %s".formatted(getPadding(marginTop), getPadding(marginLeft), getPadding(marginBottom), getPadding(marginRight)))); super.add(new JLabel(title)); @@ -138,13 +138,15 @@ public JPanel addTo(Container component) { public JPanel addTo(Container component, Object constraints) { if (panelLayout == null) { panelLayout = new MigLayout( - (fillContents ? "fill," : "") + (useGrid ? "" : "nogrid,") + "insets %s %s %s %s".formatted(getPadding(paddingTop), + (fillContents ? "fill," : "") + (useGrid ? "" : "nogrid,") + + "insets %s %s %s %s".formatted(getPadding(paddingTop), getPadding(paddingLeft), getPadding(paddingBottom), getPadding(paddingRight)), panelColumnConstraints); } - TitlePanel titlePanel = new TitlePanel(title, panelLayout, marginTop, marginLeft, marginBottom, marginRight); + TitlePanel titlePanel = + new TitlePanel(title, panelLayout, marginTop, marginLeft, marginBottom, marginRight); component.add(titlePanel, constraints); - return titlePanel.getPanel(); + return titlePanel.panel; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomColumnName.java index 160cce7b..08e657df 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomColumnName.java @@ -1,10 +1,10 @@ package org.lodder.subtools.multisubdownloader.gui.extra.table; -public interface CustomColumnName { - - String getColumnName(); +import manifold.ext.props.rt.api.val; - boolean isEditable(); +public interface CustomColumnName { - Class getC(); + @val String columnName; + @val boolean editable; + @val Class clazz; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java index 2ea6019a..1c942e04 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java @@ -6,11 +6,10 @@ import java.util.function.Function; import java.util.stream.Collectors; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.Messages; -@RequiredArgsConstructor public enum SearchColumnName implements CustomColumnName { RELEASE("App.Release", String.class, false), @@ -26,17 +25,17 @@ public enum SearchColumnName implements CustomColumnName { SCORE("SearchColumnName.Score", Integer.class, false); private static final Map MAP = - Arrays.stream(SearchColumnName.values()).collect(Collectors.toMap(SearchColumnName::getColumnName, Function.identity())); + Arrays.stream(SearchColumnName.values()) + .collect(Collectors.toMap(SearchColumnName::getColumnName, Function.identity())); - private final String columnNameCode; - @Getter - private final Class c; - @Getter - private final boolean editable; + @val @override String columnName; + @val @override Class c; + @val @override boolean editable; - @Override - public String getColumnName() { - return Messages.getString(columnNameCode); + SearchColumnName(String columnNameCode, Class c, boolean editable) { + this.columnName = Messages.getString(columnNameCode); + this.c = c; + this.editable = editable; } public static Optional getForColumnName(String columnName) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java index c76a40d5..fdc3eabe 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java @@ -3,37 +3,46 @@ import java.util.Arrays; import java.util.function.Function; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.sublibrary.model.Subtitle; -@RequiredArgsConstructor public enum SubtitleTableColumnName implements CustomColumnName { - SELECT("App.Select", Boolean.class, true, subtitle -> false), + SELECT("App.Select", Boolean.class, true, _ -> false), SCORE("SubtitleTableColumnName.Score", Integer.class, false, Subtitle::getScore), FILENAME("SubtitleTableColumnName.Filename", String.class, false, Subtitle::getFileName), SOURCE("SubtitleTableColumnName.Source", String.class, false, Subtitle::getSubtitleSource), UPLOADER("SubtitleTableColumnName.Uploader", String.class, false, Subtitle::getUploader), - HEARINGIMPAIRED("SubtitleTableColumnName.hearingimpaired", Boolean.class, false, Subtitle::isHearingImpaired), + HEARING_IMPAIRED("SubtitleTableColumnName.hearingimpaired", Boolean.class, false, Subtitle::isHearingImpaired), QUALITY("SubtitleTableColumnName.Quality", String.class, false, Subtitle::getQuality), RELEASEGROUP("SubtitleTableColumnName.Releasegroup", String.class, false, Subtitle::getReleaseGroup); - private final String columnNameCode; - @Getter - private final Class c; - @Getter - private final boolean editable; - @Getter + + @val + @override + String columnName; + @val + @override + Class clazz; + @val + @override + boolean editable; private final Function valueFunction; - @Override - public String getColumnName() { - return Messages.getString(columnNameCode); + SubtitleTableColumnName(String columnNameCode, Class clazz, boolean editable, + Function valueFunction) { + this.columnName = Messages.getString(columnNameCode); + this.clazz = clazz; + this.editable = editable; + this.valueFunction = valueFunction; } public static SubtitleTableColumnName forColumnName(String columnName) { - return Arrays.stream(SubtitleTableColumnName.values()).filter(stcn -> stcn.getColumnName().equals(columnName)).findAny().orElseThrow(); + return Arrays.stream(SubtitleTableColumnName.values()) + .filter(stcn -> stcn.columnName.equals(columnName)) + .findAny() + .orElseThrow(); } public Object getValue(Subtitle subtitle) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java index 1bb3b30e..871528ce 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java @@ -16,30 +16,35 @@ public class SubtitleTableModel extends DefaultTableModel { private static final long serialVersionUID = 4205143311042280620L; private static final SubtitleTableColumnName[] COLUMNS = - Stream.of(SELECT, SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARINGIMPAIRED).toArray(SubtitleTableColumnName[]::new); + Stream.of(SELECT, SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARING_IMPAIRED) + .toArray(SubtitleTableColumnName[]::new); public SubtitleTableModel(Object[][] data, String[] columnNames) { super(data, columnNames); } public static SubtitleTableModel getDefaultSubtitleTableModel() { - String[] columnNames = Arrays.stream(COLUMNS).map(SubtitleTableColumnName::getColumnName).toArray(String[]::new); + String[] columnNames = + Arrays.stream(COLUMNS).map(SubtitleTableColumnName::getColumnName).toArray(String[]::new); return new SubtitleTableModel(new Object[][]{}, columnNames); } public void addRow(Subtitle subtitle) { - Object[] row = IntStream.range(0, getColumnCount()).mapToObj(this::getColumnName).map(SubtitleTableColumnName::forColumnName) - .map(stcn -> stcn.getValue(subtitle)).toArray(Object[]::new); + Object[] row = IntStream.range(0, getColumnCount()) + .mapToObj(this::getColumnName) + .map(SubtitleTableColumnName::forColumnName) + .map(stcn -> stcn.getValue(subtitle)) + .toArray(Object[]::new); this.addRow(row); } @Override public Class getColumnClass(int columnIndex) { - return COLUMNS[columnIndex].getC(); + return COLUMNS[columnIndex].clazz; } @Override public boolean isCellEditable(int row, int column) { - return COLUMNS[column].isEditable(); + return COLUMNS[column].editable; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java index 1293714f..394b6b5f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.extra.table; +import static org.lodder.subtools.multisubdownloader.gui.extra.table.SearchColumnName.*; + import javax.swing.table.*; import java.io.Serial; import java.util.ArrayList; @@ -13,8 +15,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -import lombok.Getter; -import lombok.Setter; +import manifold.ext.props.rt.api.get; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.sublibrary.model.MovieRelease; import org.lodder.subtools.sublibrary.model.Release; @@ -23,32 +24,29 @@ public class VideoTableModel extends DefaultTableModel { - @Serial - private static final long serialVersionUID = 4205143311042280620L; + @Serial private static final long serialVersionUID = 4205143311042280620L; private static final List SHOW_COLUMNS = - List.of(SearchColumnName.TYPE, SearchColumnName.RELEASE, SearchColumnName.FILENAME, SearchColumnName.TITLE, SearchColumnName.SEASON, - SearchColumnName.EPISODE, SearchColumnName.FOUND, SearchColumnName.SELECT, SearchColumnName.OBJECT); + List.of(TYPE, RELEASE, FILENAME, TITLE, SEASON, EPISODE, FOUND, SELECT, OBJECT); - private static final List SUBTITLE_COLUMNS = - List.of(SearchColumnName.FILENAME, SearchColumnName.SOURCE, SearchColumnName.SCORE, SearchColumnName.SELECT, SearchColumnName.OBJECT); + private static final List SUBTITLE_COLUMNS = List.of(FILENAME, SOURCE, SCORE, SELECT, OBJECT); private static final Map SHOW_COLUMNS_INDEX = IntStream.range(0, SHOW_COLUMNS.size()) - .collect(() -> new EnumMap<>(SearchColumnName.class), (map, i) -> map.put(SHOW_COLUMNS.get(i), i), (l, r) -> { - throw new IllegalArgumentException("Duplicate keys [%s] and [%s]".formatted(l, r)); - }); + .collect(() -> new EnumMap<>(SearchColumnName.class), (map, i) -> map.put(SHOW_COLUMNS.get(i), i), + (l, r) -> { + throw new IllegalArgumentException("Duplicate keys [$l] and [$r]"); + }); private final Class[] columnTypes; private final Boolean[] columnEditables; private final Map rowMap = new LinkedHashMap<>(); private boolean showOnlyFound = false; - @Setter - private UserInteractionHandler userInteractionHandler; + @get UserInteractionHandler userInteractionHandler; private VideoTableModel(List searchColumnNames) { super(new Object[][]{}, searchColumnNames.stream().map(SearchColumnName::getColumnName).toArray(String[]::new)); - this.columnTypes = searchColumnNames.stream().map(SearchColumnName::getC).toArray(Class[]::new); + this.columnTypes = searchColumnNames.stream().map(SearchColumnName::getClazz).toArray(Class[]::new); this.columnEditables = searchColumnNames.stream().map(SearchColumnName::isEditable).toArray(Boolean[]::new); } @@ -78,7 +76,7 @@ public void addRow(Release release) { if (!showOnlyFound || release.getMatchingSubCount() != 0) { Row row = createRow(release); rowMap.put(release, row); - this.addRow(row.getRowObject()); + this.addRow(row.rowObject); } } } @@ -90,22 +88,16 @@ private Row createRow(Release release) { private static class Row { private final Release release; private final UserInteractionHandler userInteractionHandler; - @Getter - public final Vector rowObject; + @get Vector rowObject; public Row(Release release, UserInteractionHandler userInteractionHandler) { this.release = release; this.userInteractionHandler = userInteractionHandler; this.rowObject = SHOW_COLUMNS.stream().map(searchColumn -> switch (searchColumn) { - case RELEASE -> { - if (release instanceof TvRelease tvRelease) { - yield tvRelease.originalName; - } else if (release instanceof MovieRelease movieRelease) { - yield movieRelease.name; - } else { - throw new IllegalArgumentException("Unexpected release type: " + release.getClass()); - } - } + case RELEASE -> switch (release) { + case TvRelease tvRelease -> tvRelease.originalName; + case MovieRelease movieRelease -> movieRelease.name; + }; case FILENAME -> release.fileName; case FOUND -> calculateSubsFound(); case SELECT -> false; @@ -119,9 +111,9 @@ public Row(Release release, UserInteractionHandler userInteractionHandler) { } private int calculateSubsFound() { - return userInteractionHandler != null - ? userInteractionHandler.getAutomaticSelection(release.getMatchingSubs()).size() - : release.getMatchingSubCount(); + return userInteractionHandler != null ? + userInteractionHandler.getAutomaticSelection(release.getMatchingSubs()).size() : + release.getMatchingSubCount(); } public int updateSubsFound() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java index 4f9e6df7..890288aa 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java @@ -10,7 +10,7 @@ import java.util.function.Consumer; import java.util.function.Predicate; -import lombok.Getter; +import manifold.ext.props.rt.api.var; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.util.BooleanConsumer; @@ -79,8 +79,7 @@ public MyPasswordField withValidityChangedCallback(BooleanConsumer... validityCh } private static class ObjectWrapper { - @Getter - private S value; + @var S value; public boolean setValue(S value) { boolean changed = this.value != value; @@ -119,7 +118,8 @@ public MyPasswordField build() { completeValueVerifier = t -> true; } - if (valueVerifier != null || requireValue || valueChangedCalbackListener != null || validityChangedCalbackListeners != null) { + if (valueVerifier != null || requireValue || valueChangedCalbackListener != null || + validityChangedCalbackListeners != null) { checkValidity(getRawText()); getDocument().addDocumentListener(new DocumentListener() { @@ -178,8 +178,8 @@ public Optional getOptionalObject() { @Override public void setText(String password) { super.setText(password); - valueWrapper.setValue(password); - validWrapper.setValue(completeValueVerifier.test(password)); + valueWrapper.value = password; + validWrapper.value = completeValueVerifier.test(password); } public boolean hasValidValue() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java index 3cbdcc66..9b895af8 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchPanel.java @@ -3,17 +3,16 @@ import javax.swing.*; import java.io.Serial; -import lombok.Getter; +import manifold.ext.props.rt.api.val; import net.miginfocom.swing.MigLayout; -@Getter public class SearchPanel extends JPanel { @Serial private static final long serialVersionUID = -7602822323779710089L; - private final ResultPanel resultPanel; - private final I inputPanel; + @val ResultPanel resultPanel; + @val I inputPanel; public SearchPanel(I inputPanel, ResultPanel resultPanel) { this.inputPanel = inputPanel; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/EpisodeLibraryPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/EpisodeLibraryPanel.java index b5abd356..0e42f6fc 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/EpisodeLibraryPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/EpisodeLibraryPanel.java @@ -7,7 +7,7 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -public class EpisodeLibraryPanel extends VideoLibraryPanel { +public final class EpisodeLibraryPanel extends VideoLibraryPanel { @Serial private static final long serialVersionUID = -9175813173306481849L; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/MovieLibraryPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/MovieLibraryPanel.java index ed27d4a2..5dcef703 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/MovieLibraryPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/MovieLibraryPanel.java @@ -7,7 +7,7 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -public class MovieLibraryPanel extends VideoLibraryPanel { +public final class MovieLibraryPanel extends VideoLibraryPanel { @Serial private static final long serialVersionUID = -9175813173306481849L; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java index 118e4eb7..45a04ea1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java @@ -1,11 +1,12 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import static manifold.ext.props.rt.api.PropOption.*; + import javax.swing.*; import java.awt.event.ActionListener; import java.io.Serial; -import lombok.AccessLevel; -import lombok.Getter; +import manifold.ext.props.rt.api.get; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; @@ -14,14 +15,11 @@ public abstract class StructurePanel> extends JPanel @Serial private static final long serialVersionUID = 7507970016496546514L; - @Getter(value = AccessLevel.PROTECTED) - private final JButton btnBuildStructure; - @Getter(value = AccessLevel.PROTECTED) - private final JCheckBox chkReplaceSpace; - @Getter(value = AccessLevel.PROTECTED) - private final MyComboBox cbxReplaceSpaceChar; + @get(Protected) JButton btnBuildStructure; + @get(Protected) JCheckBox chkReplaceSpace; + @get(Protected) MyComboBox cbxReplaceSpaceChar; - public StructurePanel() { + StructurePanel() { this.btnBuildStructure = new JButton(Messages.getString("StructureBuilderDialog.Structure")); this.cbxReplaceSpaceChar = new MyComboBox<>(new String[]{ "-", ".", "_" }); @@ -37,19 +35,19 @@ public T addBuildStructureAction(ActionListener buildStructureAction) { } public String getReplaceSpaceChar() { - return this.getCbxReplaceSpaceChar().getSelectedItem(); + return this.cbxReplaceSpaceChar.getSelectedItem(); } public void setReplaceSpaceChar(String s) { - this.getCbxReplaceSpaceChar().setSelectedItem(s); + this.cbxReplaceSpaceChar.setSelectedItem(s); } public boolean isReplaceSpaceSelected() { - return this.getChkReplaceSpace().isSelected(); + return this.chkReplaceSpace.isSelected(); } public void setReplaceSpaceSelected(boolean b) { - this.getChkReplaceSpace().setSelected(b); + this.chkReplaceSpace.setSelected(b); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java index 923c53aa..3f3da510 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java @@ -4,8 +4,8 @@ import java.io.Serial; import java.nio.file.Files; -import lombok.Getter; import lombok.experimental.ExtensionMethod; +import manifold.ext.props.rt.api.val; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.PartialDisableComboBox; @@ -19,13 +19,13 @@ import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; @ExtensionMethod({ Files.class }) -public abstract class VideoLibraryPanel extends JPanel implements PreferencePanelIntf { +public abstract sealed class VideoLibraryPanel extends JPanel implements PreferencePanelIntf + permits EpisodeLibraryPanel, MovieLibraryPanel { @Serial private static final long serialVersionUID = -9175813173306481849L; - @Getter - private final LibrarySettings librarySettings; + @val LibrarySettings librarySettings; private final MyComboBox cbxLibraryAction; private final JCheckBox chkUseTVDBNaming; private final PartialDisableComboBox cbxLibraryOtherFileAction; @@ -33,7 +33,7 @@ public abstract class VideoLibraryPanel extends JPanel implements PreferencePane protected final StructureFolderPanel pnlStructureFolder; protected final StructureFilePanel pnlStructureFile; - public VideoLibraryPanel(LibrarySettings librarySettings, VideoType videoType, Manager manager, boolean renameMode, + VideoLibraryPanel(LibrarySettings librarySettings, VideoType videoType, Manager manager, boolean renameMode, UserInteractionHandler userInteractionHandler) { super(new MigLayout("fillx, nogrid")); this.librarySettings = librarySettings; @@ -53,13 +53,16 @@ public VideoLibraryPanel(LibrarySettings librarySettings, VideoType videoType, M .withToMessageStringRenderer(LibraryActionType::getMsgCode) .addTo(performActionPanel, "wrap"); - this.pnlStructureFolder = new StructureFolderPanel(librarySettings, videoType, manager, userInteractionHandler) - .addTo(performActionPanel, "hidemode 3, wrap, span, growx"); + this.pnlStructureFolder = + new StructureFolderPanel(librarySettings, videoType, manager, userInteractionHandler) + .addTo(performActionPanel, "hidemode 3, wrap, span, growx"); this.pnlStructureFile = new StructureFilePanel(librarySettings, videoType, manager, userInteractionHandler) .addTo(performActionPanel, "hidemode 3, wrap, span, growx"); - JLabel lblActionForOtherFiles = new JLabel(Messages.getString("PreferenceDialog.ActionForOtherFiles")).addTo(performActionPanel); - this.cbxLibraryOtherFileAction = PartialDisableComboBox.of(LibraryOtherFileActionType.values()).addTo(performActionPanel); + JLabel lblActionForOtherFiles = + new JLabel(Messages.getString("PreferenceDialog.ActionForOtherFiles")).addTo(performActionPanel); + this.cbxLibraryOtherFileAction = + PartialDisableComboBox.of(LibraryOtherFileActionType.values()).addTo(performActionPanel); // this.cbxLibraryAction.withSelectedItemConsumer(action -> { @@ -86,8 +89,10 @@ private void checkPossibleOtherFileActions() { for (int i = 0; i < cbxLibraryOtherFileAction.getModel().getSize(); i++) { LibraryOtherFileActionType ofa = cbxLibraryOtherFileAction.getItemAt(i); boolean enabled = switch (libraryActionType) { - case MOVE -> LibraryOtherFileActionType.MOVEANDRENAME != ofa && LibraryOtherFileActionType.RENAME != ofa; - case RENAME -> LibraryOtherFileActionType.MOVEANDRENAME != ofa && LibraryOtherFileActionType.MOVE != ofa; + case MOVE -> + LibraryOtherFileActionType.MOVEANDRENAME != ofa && LibraryOtherFileActionType.RENAME != ofa; + case RENAME -> + LibraryOtherFileActionType.MOVEANDRENAME != ofa && LibraryOtherFileActionType.MOVE != ofa; case MOVEANDRENAME -> true; case NOTHING -> LibraryOtherFileActionType.NOTHING == ofa; }; @@ -129,7 +134,8 @@ public void savePreferenceSettings() { } librarySettings.setLibraryAction(this.cbxLibraryAction.getSelectedItem()) .setLibraryUseTVDBNaming(this.chkUseTVDBNaming.isSelected()) - .setLibraryOtherFileAction((LibraryOtherFileActionType) this.cbxLibraryOtherFileAction.getSelectedItem()); + .setLibraryOtherFileAction( + (LibraryOtherFileActionType) this.cbxLibraryOtherFileAction.getSelectedItem()); pnlStructureFolder.savePreferenceSettings(); pnlStructureFile.savePreferenceSettings(); @@ -137,7 +143,8 @@ public void savePreferenceSettings() { @Override public boolean hasValidSettings() { - return pnlStructureFolder.hasValidSettings() && pnlStructureFile.hasValidSettings() && (pnlBackup == null || pnlBackup.hasValidSettings()); + return pnlStructureFolder.hasValidSettings() && pnlStructureFile.hasValidSettings() && + (pnlBackup == null || pnlBackup.hasValidSettings()); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java index 8a7e31a2..b05da57b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java @@ -10,7 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ExactNameFilter extends SubtitleFilter { +public final class ExactNameFilter extends SubtitleFilter { private static final Logger LOGGER = LoggerFactory.getLogger(ExactNameFilter.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java index bf84a035..c7469d94 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/KeywordFilter.java @@ -7,7 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class KeywordFilter extends SubtitleFilter { +public final class KeywordFilter extends SubtitleFilter { private static final Logger LOGGER = LoggerFactory.getLogger(KeywordFilter.class); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java index 54024431..ea4cc496 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ReleaseGroupFilter.java @@ -8,14 +8,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ReleaseGroupFilter extends SubtitleFilter { +public final class ReleaseGroupFilter extends SubtitleFilter { private static final Logger LOGGER = LoggerFactory.getLogger(ReleaseGroupFilter.class); @Override public boolean useSubtitle(Release release, Subtitle subtitle) { if (subtitle.releaseGroup.isEmpty()) { - subtitle.releaseGroup = ReleaseParser.extractReleaseGroup(subtitle.fileName, subtitle.fileName.endsWith(".srt")); + subtitle.releaseGroup = + ReleaseParser.extractReleaseGroup(subtitle.fileName, subtitle.fileName.endsWith(".srt")); } if (!StringUtils.containsAnyIgnoreCase(subtitle.releaseGroup, release.releaseGroup, subtitle.releaseGroup)) { return false; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java index 1437c85c..11432104 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java @@ -6,7 +6,7 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; -public abstract class SubtitleFilter { +public abstract sealed class SubtitleFilter permits ExactNameFilter, KeywordFilter, ReleaseGroupFilter { public abstract boolean useSubtitle(Release release, Subtitle subtitle); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java index 180f393b..3680e7c6 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java @@ -7,7 +7,7 @@ import lombok.experimental.Accessors; import manifold.ext.props.rt.api.var; -public class MovieRelease extends Release { +public final class MovieRelease extends Release { @var String name; @var Integer year; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java index 1098c398..82a3100b 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java @@ -9,7 +9,7 @@ import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; -public abstract class Release extends Video { +public abstract sealed class Release extends Video permits MovieRelease, TvRelease { private final Set matchingSubsSet = new HashSet<>(); @val Path filePath; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java index 66c76bf7..b86812bf 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java @@ -12,7 +12,7 @@ import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.sublibrary.data.tvdb.model.TheTvdbEpisode; -public class TvRelease extends Release { +public final class TvRelease extends Release { // parsed from the filename @val String name; @@ -79,7 +79,8 @@ public static TvReleaseBuilderShowName builder() { @Setter @Accessors(chain = true, fluent = true) public static class TvReleaseBuilder - implements TvReleaseBuilderOther, TvReleaseBuilderEpisode, TvReleaseBuilderSeason, TvReleaseBuilderShowName { + implements TvReleaseBuilderOther, TvReleaseBuilderEpisode, TvReleaseBuilderSeason, + TvReleaseBuilderShowName { private String name; private String title; private int season; @@ -106,11 +107,13 @@ public TvReleaseBuilder episodes(List episodes) { @Override public TvRelease build() { - return new TvRelease(file, description, releaseGroup, quality, name, originalName, customName, title, season, episodes, special); + return new TvRelease(file, description, releaseGroup, quality, name, originalName, customName, title, + season, episodes, special); } } - private TvRelease(Path file, String description, String releaseGroup, String quality, String name, String originalName, String customName, + private TvRelease(Path file, String description, String releaseGroup, String quality, String name, + String originalName, String customName, String title, int season, List episodeNumbers, boolean special) { super(VideoType.EPISODE, file, description, releaseGroup, quality); this.name = name; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java index fa24ffa8..7b826411 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java @@ -2,7 +2,7 @@ import manifold.ext.props.rt.api.val; -public abstract class Video { +public abstract sealed class Video permits Release { @val VideoType videoType; From f105ad289a1c979237fcb616d8ca03d3faae95a3 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 14:32:56 +0100 Subject: [PATCH 21/54] changes --- .../UserInteractionHandlerCLI.java | 2 +- .../extra/table/SubtitleTableColumnName.java | 2 +- .../gui/extra/table/SubtitleTableModel.java | 2 +- .../lib/ReleaseFactory.java | 2 +- .../lib/control/MovieReleaseControl.java | 15 +++-- .../lib/control/ReleaseControl.java | 20 ++++--- .../lib/control/TvReleaseControl.java | 4 +- .../control/subtitles/sorting/SortWeight.java | 12 ++-- .../Addic7edServiceProvider.java | 6 -- .../LocalServiceProvider.java | 6 -- .../OpenSubtitlesServiceProvider.java | 6 -- .../PodnapisiServiceProvider.java | 6 -- .../SubsceneServiceProvider.java | 6 -- .../SubtitleServiceProvider.java | 5 -- .../TvSubtitlesServiceProvider.java | 6 -- .../settings/SettingsControl.java | 56 ++++++++++++------- .../settings/model/PathMatchType.java | 5 +- .../settings/model/PathOrRegex.java | 14 ++--- .../settings/model/ScreenSettings.java | 18 +++--- .../settings/model/SettingsExcludeItem.java | 12 ++-- .../settings/model/State.java | 7 +-- .../settings/model/UpdateCheckPeriod.java | 9 ++- .../settings/model/UpdateType.java | 9 ++- .../model/structure/FolderStructureTag.java | 12 ++-- .../model/structure/MovieStructureTag.java | 12 ++-- .../model/structure/SerieStructureTag.java | 8 +-- .../model/structure/StructureTag.java | 7 ++- .../adapters/AbstractAdapter.java | 30 +++++----- .../sublibrary/data/ReleaseDBIntf.java | 4 +- 29 files changed, 142 insertions(+), 161 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java index bbbea3cf..80234496 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java @@ -61,7 +61,7 @@ private ColumnDisplayer createSubtitleDisplayer(SubtitleTableColumnNam private TableDisplayer createTableDisplayer() { return new TableDisplayer<>(Stream.of(SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, - HEARING_IMPAIRED) + HEARINGIMPAIRED) .map(stcn -> createSubtitleDisplayer(stcn, stcn.getValueFunction())).toList()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java index fdc3eabe..873ca754 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java @@ -14,7 +14,7 @@ public enum SubtitleTableColumnName implements CustomColumnName { FILENAME("SubtitleTableColumnName.Filename", String.class, false, Subtitle::getFileName), SOURCE("SubtitleTableColumnName.Source", String.class, false, Subtitle::getSubtitleSource), UPLOADER("SubtitleTableColumnName.Uploader", String.class, false, Subtitle::getUploader), - HEARING_IMPAIRED("SubtitleTableColumnName.hearingimpaired", Boolean.class, false, Subtitle::isHearingImpaired), + HEARINGIMPAIRED("SubtitleTableColumnName.hearingimpaired", Boolean.class, false, Subtitle::isHearingImpaired), QUALITY("SubtitleTableColumnName.Quality", String.class, false, Subtitle::getQuality), RELEASEGROUP("SubtitleTableColumnName.Releasegroup", String.class, false, Subtitle::getReleaseGroup); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java index 871528ce..55cf7a51 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java @@ -16,7 +16,7 @@ public class SubtitleTableModel extends DefaultTableModel { private static final long serialVersionUID = 4205143311042280620L; private static final SubtitleTableColumnName[] COLUMNS = - Stream.of(SELECT, SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARING_IMPAIRED) + Stream.of(SELECT, SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARINGIMPAIRED) .toArray(SubtitleTableColumnName[]::new); public SubtitleTableModel(Object[][] data, String[] columnNames) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java index 52a9650e..a6a8efcb 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java @@ -39,7 +39,7 @@ public Release createRelease(Path file, UserInteractionHandler userInteractionHa case MOVIE -> new MovieReleaseControl((MovieRelease) r, settings, manager, userInteractionHandler); }; releaseControl.process(); - return releaseControl.getVideoFile(); + return releaseControl.videoFile; } catch (ReleaseParseException | ReleaseControlException e) { LOGGER.error("createRelease: " + e.getMessage(), e); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java index 2947bf46..3539b3b2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java @@ -15,14 +15,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class MovieReleaseControl extends ReleaseControl { +public final class MovieReleaseControl extends ReleaseControl { private final ImdbAdapter imdbAdapter; private final OmdbAdapter omdbAdapter; private final MovieRelease movieRelease; private static final Logger LOGGER = LoggerFactory.getLogger(MovieReleaseControl.class); - public MovieReleaseControl(MovieRelease movieRelease, Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { + public MovieReleaseControl(MovieRelease movieRelease, Settings settings, Manager manager, + UserInteractionHandler userInteractionHandler) { super(settings, manager); this.movieRelease = movieRelease; this.imdbAdapter = ImdbAdapter.getInstance(manager, userInteractionHandler); @@ -34,19 +35,21 @@ public void process() throws ReleaseControlException { if (StringUtils.isBlank(movieRelease.name)) { throw new ReleaseControlException("Unable to extract/find title, check file", movieRelease); } else { - int imdbId = imdbAdapter.getImdbId(movieRelease.getName(), movieRelease.getYear()) - .orElseThrow(() -> new ReleaseControlException("Movie not found on IMDB, check file", movieRelease)); + int imdbId = imdbAdapter.getImdbId(movieRelease.name, movieRelease.year) + .orElseThrow( + () -> new ReleaseControlException("Movie not found on IMDB, check file", movieRelease)); movieRelease.setImdbId(imdbId); Optional movieDetails = movieRelease.getImdbId().mapToObj(imdbAdapter::getMovieDetails).orElseGet(Optional::empty); if (movieDetails.isEmpty()) { - movieDetails = movieRelease.getImdbId().mapToObj(omdbAdapter::getMovieDetails).orElseGet(Optional::empty); + movieDetails = + movieRelease.getImdbId().mapToObj(omdbAdapter::getMovieDetails).orElseGet(Optional::empty); } movieDetails.ifPresentOrElse(info -> { movieRelease.year = info.year(); movieRelease.name = info.name; - }, () -> LOGGER.error("Unable to get details from OMDB API, continue with filename info {}", movieRelease)); + }, () -> LOGGER.error("Unable to get details from OMDB API, continue with filename info $movieRelease")); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java index 588a4a06..6c659b4f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java @@ -1,21 +1,25 @@ package org.lodder.subtools.multisubdownloader.lib.control; -import lombok.AccessLevel; +import static manifold.ext.props.rt.api.PropOption.*; + import lombok.AllArgsConstructor; -import lombok.Getter; +import manifold.ext.props.rt.api.get; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.exception.ReleaseControlException; import org.lodder.subtools.sublibrary.model.Release; -@Getter(value = AccessLevel.PROTECTED) @AllArgsConstructor -public abstract class ReleaseControl { +public abstract sealed class ReleaseControl permits MovieReleaseControl, TvReleaseControl { - private final Settings settings; - private final Manager manager; + @get(Protected) Settings settings; + @get(Protected) Manager manager; + @get(Abstract) Release videoFile; - public abstract void process() throws ReleaseControlException; + ReleaseControl(Settings settings, Manager manager) { + this.settings = settings; + this.manager = manager; + } - public abstract Release getVideoFile(); + public abstract void process() throws ReleaseControlException; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index bb3ce9c0..10ae9a02 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -12,7 +12,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class TvReleaseControl extends ReleaseControl { +public final class TvReleaseControl extends ReleaseControl { private static final Logger LOGGER = LoggerFactory.getLogger(TvReleaseControl.class); @@ -57,7 +57,7 @@ private void processSpecial() throws ReleaseControlException { jtvdba.getSerie(tvRelease.name).useIfPresent(tvdbSerie -> { tvRelease.tvdbId = tvdbSerie.id; tvRelease.originalName = tvdbSerie.serieName; - if (getSettings().processEpisodeSource == SettingsProcessEpisodeSource.TVDB) { + if (settings.processEpisodeSource == SettingsProcessEpisodeSource.TVDB) { jtvdba.getEpisode(tvdbSerie.id, tvRelease.season, tvRelease.firstEpisodeNumber) .ifPresent(tvRelease::updateTvdbEpisodeInfo); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeight.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeight.java index fcc2a6ba..e0b9929d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeight.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/SortWeight.java @@ -1,23 +1,25 @@ package org.lodder.subtools.multisubdownloader.lib.control.subtitles.sorting; +import static manifold.ext.props.rt.api.PropOption.*; + import java.util.HashMap; import java.util.List; import java.util.Map; -import lombok.Getter; +import manifold.ext.props.rt.api.get; +import manifold.ext.props.rt.api.set; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.sorting.replacers.GroupReplacer; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.sorting.replacers.KeywordReplacer; import org.lodder.subtools.sublibrary.control.ReleaseParser; import org.lodder.subtools.sublibrary.model.Release; -@Getter public class SortWeight { private static final List KEYWORD_REPLACERS = List.of(new GroupReplacer()); - private Map weights; - protected int maxScore; + @get Map weights = new HashMap<>(); + @get @set(Private) int maxScore; public SortWeight(Release release, Map defaultWeights) { this.setWeights(release, defaultWeights); @@ -25,7 +27,7 @@ public SortWeight(Release release, Map defaultWeights) { protected void setWeights(Release release, Map defaultWeights) { this.maxScore = 0; - this.weights = new HashMap<>(); + this.weights.clear(); /* make a clone, so we can't mess up the defined weights */ defaultWeights = new HashMap<>(defaultWeights); // clone diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java index e1b98eeb..87cabb40 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java @@ -23,12 +23,6 @@ public class Addic7edServiceProvider implements ServiceProvider { /* We define a priority lower than SubtitleServiceProvider */ @val @override int priority = 1; - // @Override - // public int getPriority() { - // /* We define a priority lower than SubtitleServiceProvider */ - // return 1; - // } - @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { this.app = app; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java index 12e8f8c8..02d95932 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/LocalServiceProvider.java @@ -20,12 +20,6 @@ public class LocalServiceProvider implements ServiceProvider { /* We define a priority lower than SubtitleServiceProvider */ @val @override int priority = 1; - // @Override - // public int getPriority() { - // /* We define a priority lower than SubtitleServiceProvider */ - // return 1; - // } - @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { this.app = app; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java index 5f2f594e..1a0cfd2e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/OpenSubtitlesServiceProvider.java @@ -20,12 +20,6 @@ public class OpenSubtitlesServiceProvider implements ServiceProvider { /* We define a priority lower than SubtitleServiceProvider */ @val @override int priority = 1; - // @Override - // public int getPriority() { - // /* We define a priority lower than SubtitleServiceProvider */ - // return 1; - // } - @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { this.app = app; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java index b0b609e7..a7cf74c9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/PodnapisiServiceProvider.java @@ -14,12 +14,6 @@ public class PodnapisiServiceProvider implements ServiceProvider { /* We define a priority lower than SubtitleServiceProvider */ @val @override int priority = 1; - // @Override - // public int getPriority() { - // /* We define a priority lower than SubtitleServiceProvider */ - // return 1; - // } - @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { /* Resolve the SubtitleProviderStore from the IoC Container */ diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubsceneServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubsceneServiceProvider.java index b2b03a6c..43f78d2c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubsceneServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubsceneServiceProvider.java @@ -17,12 +17,6 @@ public class SubsceneServiceProvider implements ServiceProvider { /* We define a priority lower than SubtitleServiceProvider */ @val @override int priority = 1; - // @Override - // public int getPriority() { - // /* We define a priority lower than SubtitleServiceProvider */ - // return 1; - // } - @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { /* Resolve the SubtitleProviderStore from the IoC Container */ diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubtitleServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubtitleServiceProvider.java index 27524b1e..68ae2a7d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubtitleServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/SubtitleServiceProvider.java @@ -12,11 +12,6 @@ public class SubtitleServiceProvider implements ServiceProvider { @val @override int priority = 0; - // @Override - // public int getPriority() { - // return 0; - // } - @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { app.bind("SubtitleProviderStore", new LazySupplier<>(SubtitleProviderStore::new)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/TvSubtitlesServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/TvSubtitlesServiceProvider.java index bac85fd7..bc676af5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/TvSubtitlesServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/TvSubtitlesServiceProvider.java @@ -15,12 +15,6 @@ public class TvSubtitlesServiceProvider implements ServiceProvider { /* We define a priority lower than SubtitleServiceProvider */ @val @override int priority = 1; - // @Override - // public int getPriority() { - // /* We define a priority lower than SubtitleServiceProvider */ - // return 1; - // } - @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { /* Resolve the SubtitleProviderStore from the IoC Container */ diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java index ba5cca28..66a73a72 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java @@ -1,5 +1,6 @@ package org.lodder.subtools.multisubdownloader.settings; +import static manifold.ext.props.rt.api.PropOption.*; import static org.lodder.subtools.multisubdownloader.settings.SettingValue.*; import java.io.BufferedInputStream; @@ -15,8 +16,9 @@ import java.util.prefs.Preferences; import java.util.stream.IntStream; -import lombok.Getter; import lombok.experimental.ExtensionMethod; +import manifold.ext.props.rt.api.get; +import manifold.ext.props.rt.api.set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.lodder.subtools.multisubdownloader.gui.dialog.MappingEpisodeNameDialog.MappingType; @@ -44,10 +46,8 @@ public class SettingsControl { private final Manager manager; private final Preferences preferences; - @Getter - private Settings settings; - @Getter - private State state; + @get @set(Private) Settings settings; + @get @set(Private) State state; public SettingsControl(Manager manager) { if (!backingStoreAvailable()) { @@ -98,7 +98,8 @@ public void exportPreferences(Path file) throws IOException, BackingStoreExcepti } } - public void importPreferences(Path file) throws IOException, BackingStoreException, InvalidPreferencesFormatException { + public void importPreferences(Path file) + throws IOException, BackingStoreException, InvalidPreferencesFormatException { try (InputStream is = new BufferedInputStream(file.newInputStream())) { preferences.clear(); Preferences.importPreferences(is); @@ -153,7 +154,8 @@ private void migrateSettings() { public void migrateSettingsV0ToV1() { preferences.putInt("GeneralDefaultIncomingFolderSize", preferences.getInt("lastDefaultIncomingFolder", 0)); - preferences.putInt("LocalSubtitlesSourcesFoldersSize", preferences.getInt("lastLocalSubtitlesSourcesFolder", 0)); + preferences.putInt("LocalSubtitlesSourcesFoldersSize", + preferences.getInt("lastLocalSubtitlesSourcesFolder", 0)); preferences.putInt("GeneralDefaultIncomingFolderSize", preferences.getInt("lastDefaultIncomingFolder", 0)); preferences.putInt("DefaultSelectionQualitySize", preferences.getInt("lastItemDefaultSelectionQuality", 0)); preferences.putInt("DefaultSelectionQualitySize", preferences.getInt("lastItemDefaultSelectionQuality", 0)); @@ -180,22 +182,26 @@ public void migrateSettingsV0ToV1() { EPISODE_LIBRARY_FOLDER_STRUCTURE.load(this, preferences); settings.episodeLibrarySettings - .setLibraryFolderStructure(migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFolderStructure())); + .setLibraryFolderStructure( + migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFolderStructure())); EPISODE_LIBRARY_FOLDER_STRUCTURE.store(this, preferences); EPISODE_LIBRARY_FILENAME_STRUCTURE.load(this, preferences); settings.episodeLibrarySettings - .setLibraryFilenameStructure(migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFilenameStructure())); + .setLibraryFilenameStructure( + migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFilenameStructure())); EPISODE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); MOVIE_LIBRARY_FOLDER_STRUCTURE.load(this, preferences); settings.episodeLibrarySettings - .setLibraryFolderStructure(migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFolderStructure())); + .setLibraryFolderStructure( + migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFolderStructure())); MOVIE_LIBRARY_FOLDER_STRUCTURE.store(this, preferences); MOVIE_LIBRARY_FILENAME_STRUCTURE.load(this, preferences); settings.episodeLibrarySettings - .setLibraryFilenameStructure(migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFilenameStructure())); + .setLibraryFilenameStructure( + migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFilenameStructure())); MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); try { @@ -215,11 +221,13 @@ public void migrateSettingsV0ToV1() { @SuppressWarnings("deprecation") public void migrateSettingsV1ToV2() { settings.episodeLibrarySettings - .setLibraryOtherFileAction(LibraryOtherFileActionType.fromString(preferences.get(EPISODE_LIBRARY_OTHER_FILE_ACTION.getKey(), ""))); + .setLibraryOtherFileAction(LibraryOtherFileActionType.fromString( + preferences.get(EPISODE_LIBRARY_OTHER_FILE_ACTION.getKey(), ""))); EPISODE_LIBRARY_OTHER_FILE_ACTION.store(this, preferences); settings.movieLibrarySettings - .setLibraryOtherFileAction(LibraryOtherFileActionType.fromString(preferences.get(MOVIE_LIBRARY_OTHER_FILE_ACTION.getKey(), ""))); + .setLibraryOtherFileAction(LibraryOtherFileActionType.fromString( + preferences.get(MOVIE_LIBRARY_OTHER_FILE_ACTION.getKey(), ""))); MOVIE_LIBRARY_OTHER_FILE_ACTION.store(this, preferences); settings.episodeLibrarySettings @@ -288,16 +296,20 @@ public void migrateSettingsV4ToV5() { public void migrateSettingsV5ToV6() { IntStream.range(0, preferences.getInt("ExcludeItemSize", 0)) - .forEach(i -> preferences.put("ExcludeItem" + i, preferences.get("ExcludeItem" + i, "").split("//", 2)[1])); + .forEach(i -> preferences.put("ExcludeItem" + i, + preferences.get("ExcludeItem" + i, "").split("//", 2)[1])); EXCLUDE_ITEM.store(this, preferences); // Conversion from String to enum + remove duplicates int defaultSelectionQualitySize = preferences.getInt("DefaultSelectionQualitySize", 0); if (defaultSelectionQualitySize > 0) { List defaultSelectionQualitySizes = IntStream.range(0, defaultSelectionQualitySize) - .mapToObj(i -> VideoPatterns.Source.fromValue(preferences.get("DefaultSelectionQuality" + i, ""))).distinct().toList(); + .mapToObj(i -> VideoPatterns.Source.fromValue(preferences.get("DefaultSelectionQuality" + i, ""))) + .distinct() + .toList(); IntStream.range(0, defaultSelectionQualitySizes.size()) - .forEach(i -> preferences.put("DefaultSelectionQuality" + i, defaultSelectionQualitySizes.get(i).name())); + .forEach(i -> preferences.put("DefaultSelectionQuality" + i, + defaultSelectionQualitySizes.get(i).name())); if (defaultSelectionQualitySize != defaultSelectionQualitySizes.size()) { preferences.putInt("DefaultSelectionQualitySize", defaultSelectionQualitySizes.size()); IntStream.range(defaultSelectionQualitySize, defaultSelectionQualitySizes.size()) @@ -326,7 +338,8 @@ public void migrateSettingsV6ToV7() { EPISODE_LIBRARY_LANG_CODE_MAPPING.store(this, preferences); MOVIE_LIBRARY_LANG_CODE_MAPPING.store(this, preferences); - if (settings.episodeLibrarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) { + if (settings.episodeLibrarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, + LibraryActionType.MOVEANDRENAME)) { if (StringUtils.isBlank(settings.episodeLibrarySettings.getLibraryFilenameStructure())) { settings.movieLibrarySettings.setLibraryFilenameStructure("%SHOW NAME%%SEPARATOR%%Season %S%"); MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); @@ -338,7 +351,8 @@ public void migrateSettingsV6ToV7() { } } - if (settings.movieLibrarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) { + if (settings.movieLibrarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, + LibraryActionType.MOVEANDRENAME)) { if (StringUtils.isBlank(settings.movieLibrarySettings.getLibraryFilenameStructure())) { settings.movieLibrarySettings.setLibraryFilenameStructure("%MOVIE TITLE% (%YEAR%)"); MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); @@ -351,7 +365,8 @@ public void migrateSettingsV6ToV7() { public void migrateSettingsV7ToV8() { if (settings.loginOpenSubtitlesEnabled - && !OpenSubtitlesApi.isValidCredentials(settings.loginOpenSubtitlesUsername, settings.loginOpenSubtitlesPassword)) { + && !OpenSubtitlesApi.isValidCredentials(settings.loginOpenSubtitlesUsername, + settings.loginOpenSubtitlesPassword)) { settings.loginOpenSubtitlesEnabled = false; LOGIN_OPEN_SUBTITLES_ENABLED.store(this, preferences); } @@ -376,7 +391,8 @@ private static String migrateLibraryStructureV0(String oldStructure) { } private void migrateDatabase() { - int version = manager.valueBuilder().cacheType(CacheType.DISK).key("DATABSE_VERSION").valueSupplier(() -> 0).get(); + int version = + manager.valueBuilder().cacheType(CacheType.DISK).key("DATABSE_VERSION").valueSupplier(() -> 0).get(); if (version == 0) { migrateDatabaseV0ToV1(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathMatchType.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathMatchType.java index 923c5b78..e1d831a8 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathMatchType.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathMatchType.java @@ -2,15 +2,14 @@ import java.awt.*; -import lombok.Getter; +import manifold.ext.props.rt.api.val; -@Getter public enum PathMatchType { FOLDER("/folder.png"), REGEX("/regex.gif"), FILE("/file.jpg"); - private final Image image; + @val Image image; PathMatchType(String imagePath) { this.image = Toolkit.getDefaultToolkit().getImage(getClass().getResource(imagePath)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathOrRegex.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathOrRegex.java index a471209f..ee325985 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathOrRegex.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/PathOrRegex.java @@ -9,17 +9,15 @@ import java.util.function.Predicate; import java.util.regex.Pattern; -import lombok.Getter; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.util.NamedPattern; public class PathOrRegex implements Serializable { private static final long serialVersionUID = 1L; - @Getter - private final String value; - @Getter - private final transient Image image; + @val String value; + @val transient Image image; private final transient Predicate isExcludedPathPredicate; public PathOrRegex(Path path) { @@ -39,7 +37,7 @@ public PathOrRegex(String value) { regex = true; } if (regex) { - this.image = PathMatchType.REGEX.getImage(); + this.image = PathMatchType.REGEX.image; NamedPattern np = NamedPattern.compile(value.replace("*", ".*") + ".*$", Pattern.CASE_INSENSITIVE); this.isExcludedPathPredicate = p -> np.matcher(p.getFileName().toString()).find(); } else { @@ -49,7 +47,7 @@ public PathOrRegex(String value) { } private Image getImage(Path path) { - return Files.isDirectory(path) ? PathMatchType.FOLDER.getImage() : PathMatchType.FILE.getImage(); + return Files.isDirectory(path) ? PathMatchType.FOLDER.image : PathMatchType.FILE.image; } public boolean isExcludedPath(Path path) { @@ -68,6 +66,6 @@ public int hashCode() { @Override public boolean equals(Object obj) { - return obj instanceof PathOrRegex other && Objects.equals(value, other.getValue()); + return obj instanceof PathOrRegex other && Objects.equals(value, other.value); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/ScreenSettings.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/ScreenSettings.java index 336c461d..fbb676f7 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/ScreenSettings.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/ScreenSettings.java @@ -1,16 +1,14 @@ package org.lodder.subtools.multisubdownloader.settings.model; -import lombok.Getter; -import lombok.Setter; -@Getter -@Setter +import manifold.ext.props.rt.api.var; + public class ScreenSettings { - private boolean hideEpisode; - private boolean hideSeason; - private boolean hideTitle; - private boolean hideWIP; - private boolean hideType; - private boolean hideFilename; + @var boolean hideEpisode; + @var boolean hideSeason; + @var boolean hideTitle; + @var boolean hideWIP; + @var boolean hideType; + @var boolean hideFilename; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/SettingsExcludeItem.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/SettingsExcludeItem.java index e52f524a..2f320b5e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/SettingsExcludeItem.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/SettingsExcludeItem.java @@ -4,16 +4,15 @@ import java.util.function.Predicate; import java.util.regex.Pattern; -import lombok.Getter; +import manifold.ext.props.rt.api.get; import org.lodder.subtools.sublibrary.util.NamedPattern; @Deprecated(since = "Settings version 6") -@Getter public class SettingsExcludeItem { - private final String description; - private final PathMatchType type; - private final Predicate isExcludedPredicate; + @get String description; + @get PathMatchType type; + @get Predicate isExcludedPredicate; public SettingsExcludeItem(String description, PathMatchType type) { this.description = description; @@ -21,7 +20,8 @@ public SettingsExcludeItem(String description, PathMatchType type) { this.isExcludedPredicate = switch (type) { case FOLDER, FILE -> Path.of(description)::equals; case REGEX -> { - NamedPattern np = NamedPattern.compile(description.replace("*", ".*") + ".*$", Pattern.CASE_INSENSITIVE); + NamedPattern np = + NamedPattern.compile(description.replace("*", ".*") + ".*$", Pattern.CASE_INSENSITIVE); yield file -> np.matcher(file.getFileName().toString()).find(); } }; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/State.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/State.java index edd95b5d..1cffb265 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/State.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/State.java @@ -2,12 +2,9 @@ import java.time.LocalDate; -import lombok.Getter; -import lombok.Setter; +import manifold.ext.props.rt.api.var; -@Getter -@Setter public class State { - private LocalDate latestUpdateCheck; + @var LocalDate latestUpdateCheck; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/UpdateCheckPeriod.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/UpdateCheckPeriod.java index db2f1d7b..de586eb4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/UpdateCheckPeriod.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/UpdateCheckPeriod.java @@ -1,16 +1,15 @@ package org.lodder.subtools.multisubdownloader.settings.model; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum UpdateCheckPeriod { MANUAL("InputPanel.UpdateInterval.Manual"), DAILY("InputPanel.UpdateInterval.Daily"), WEEKLY("InputPanel.UpdateInterval.Weekly"), MONTHLY("InputPanel.UpdateInterval.Monthly"); - private final String langCode; + @val String langCode; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/UpdateType.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/UpdateType.java index 8a3f0e2e..07959558 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/UpdateType.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/UpdateType.java @@ -1,13 +1,12 @@ package org.lodder.subtools.multisubdownloader.settings.model; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; -@RequiredArgsConstructor -@Getter +@AllArgsConstructor public enum UpdateType { STABLE("InputPanel.UpdateType.Stable"), NIGHTLY("InputPanel.UpdateType.Nightly"); - private final String msgCode; + @val String msgCode; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java index 13673395..e8dc63ae 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java @@ -1,16 +1,16 @@ package org.lodder.subtools.multisubdownloader.settings.model.structure; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.Messages; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum FolderStructureTag implements StructureTag { SEPARATOR("%SEPARATOR%", Messages.getString("StructureBuilderDialog.SystemdependendSeparator")); - private final String label; - private final String description; + @val @override String label; + @val @override String description; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java index f00f0c7c..fe9646e3 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java @@ -1,12 +1,12 @@ package org.lodder.subtools.multisubdownloader.settings.model.structure; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.Messages; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum MovieStructureTag implements StructureTag { MOVIE_TITLE("%MOVIE TITLE%", Messages.getString("StructureBuilderDialog.MovieName")), @@ -14,7 +14,7 @@ public enum MovieStructureTag implements StructureTag { DESCRIPTION("%DESCRIPTION%", Messages.getString("StructureBuilderDialog.MovieDescription")), YEAR("%YEAR%", Messages.getString("StructureBuilderDialog.MovieYear")); - private final String label; - private final String description; + @val @override String label; + @val @override String description; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java index bcc697c9..e4d49d16 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java @@ -1,9 +1,9 @@ package org.lodder.subtools.multisubdownloader.settings.model.structure; -import lombok.Getter; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.Messages; -@Getter public enum SerieStructureTag implements StructureTag { SHOW_NAME("%SHOW NAME%", "StructureBuilderDialog.NameTvShow"), @@ -17,8 +17,8 @@ public enum SerieStructureTag implements StructureTag { QUALITY("%QUALITY%", "StructureBuilderDialog.QualityOfRelease"), DESCRIPTION("%DESCRIPTION%", "StructureBuilderDialog.Description"); - private final String label; - private final String description; + @val @override String label; + @val @override String description; SerieStructureTag(String label, String descriptionMessage) { this.label = label; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/StructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/StructureTag.java index 9a38a334..811aac95 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/StructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/StructureTag.java @@ -1,9 +1,10 @@ package org.lodder.subtools.multisubdownloader.settings.model.structure; -public interface StructureTag { +import manifold.ext.props.rt.api.val; - String getLabel(); +public interface StructureTag { - String getDescription(); + @val String label; + @val String description; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java index 7994953d..e1da357f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java @@ -7,25 +7,25 @@ import java.util.function.Supplier; import com.pivovarit.function.ThrowingSupplier; -import lombok.Getter; +import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.ProviderSerieId; /** - * @param - * type of the subtitle objects returned by the api - * @param - * type of the exception thrown by the api + * @param type of the subtitle objects returned by the api + * @param type of the exception thrown by the api */ -@Getter -@RequiredArgsConstructor -abstract class AbstractAdapter implements Adapter, SubtitleProvider { +@AllArgsConstructor +abstract class AbstractAdapter + implements Adapter, SubtitleProvider { - private final Manager manager; - private final UserInteractionHandler userInteractionHandler; + @val @override Manager manager; + @val @override UserInteractionHandler userInteractionHandler; @RequiredArgsConstructor public static class ExecuteCall> { @@ -35,7 +35,8 @@ public static class ExecuteCall> retryPredicates = new ArrayList<>(); private final List> exceptionHandlers = new ArrayList<>(); - private record HandleException(Predicate predicate, Function exceptionFunction) {} + private record HandleException(Predicate predicate, + Function exceptionFunction) {} public E retryWhenException(Predicate predicate) { retryPredicates.add(predicate); @@ -93,8 +94,11 @@ public T execute() throws X { return execute(); } else { try { - return exceptionHandlers.stream().filter(handleException -> handleException.predicate().test(exception)).findAny() - .map(handleException -> handleException.exceptionFunction().apply(exception)).orElseThrow(() -> e); + return exceptionHandlers.stream() + .filter(handleException -> handleException.predicate().test(exception)) + .findAny() + .map(handleException -> handleException.exceptionFunction().apply(exception)) + .orElseThrow(() -> e); } catch (Exception e1) { throw (X) e1; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ReleaseDBIntf.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ReleaseDBIntf.java index c6abf762..eaa26510 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ReleaseDBIntf.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ReleaseDBIntf.java @@ -1,8 +1,10 @@ package org.lodder.subtools.sublibrary.data; +import manifold.ext.props.rt.api.val; + public interface ReleaseDBIntf { - String getName(); + @val String name; int year(); } From 21d22b8d8e1dc199f1b92e3b85c0cec5a72d2d31 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 14:58:20 +0100 Subject: [PATCH 22/54] changes --- .../subtools/multisubdownloader/App.java | 21 +- .../subtools/multisubdownloader/GUI.java | 199 ++++++++++-------- .../UserInteractionHandlerCLI.java | 4 +- .../extra/table/SubtitleTableColumnName.java | 2 +- .../gui/extra/table/VideoTableModel.java | 3 +- .../subtitleproviders/Local.java | 25 ++- .../subtitleproviders/SubtitleProvider.java | 10 +- .../adapters/AbstractAdapter.java | 32 ++- .../adapters/JAddic7edViaProxyAdapter.java | 40 ++-- .../adapters/JPodnapisiAdapter.java | 29 ++- .../adapters/JSubsceneAdapter.java | 31 +-- .../adapters/JTVsubtitlesAdapter.java | 32 +-- .../addic7ed/JAddic7edApi.java | 16 +- .../addic7ed/LanguageId.java | 14 +- .../opensubtitles/OpenSubtitlesApi.java | 17 +- .../model/OpenSubtitlesMovieDescriptor.java | 21 +- .../OpenSubtitlesSubtitleDescriptor.java | 77 ++++--- .../model/OpensubtitleSerieId.java | 8 +- .../opensubtitles/param/AiTranslatedEnum.java | 12 +- .../param/ForeignPartsOnlyEnum.java | 12 +- .../param/HearingImpairedEnum.java | 12 +- .../param/MachineTranslatedEnum.java | 13 +- .../param/MoviehashMatchEnum.java | 12 +- .../param/OrderDirectionEnum.java | 12 +- .../opensubtitles/param/ParamIntf.java | 4 +- .../param/SearchSubtitlesEnum.java | 9 +- .../param/TrustedSourcesEnum.java | 15 +- .../opensubtitles/param/TypeEnum.java | 12 +- .../podnapisi/JPodnapisiApi.java | 41 ++-- .../model/PodnapisiSubtitleDescriptor.java | 38 ++-- .../subscene/model/SubSceneSerieId.java | 5 +- .../model/TVsubtitlesSubtitleDescriptor.java | 11 +- .../multisubdownloader/util/ExportImport.java | 75 ++++--- .../workers/SearchManager.java | 31 ++- .../workers/SearchWorker.java | 5 +- 35 files changed, 489 insertions(+), 411 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java index 3145246e..246334b6 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java @@ -70,8 +70,8 @@ public static void main(String[] args) throws ReflectiveOperationException, Unsu final Container app = new Container(); final Manager manager = createManager(!line.hasCliOption(CliOption.NO_GUI)); prefCtrl = new SettingsControl(manager); - Messages.language = prefCtrl.getSettings().language; - Bootstrapper bootstrapper = new Bootstrapper(app, prefCtrl.getSettings(), preferences, manager); + Messages.language = prefCtrl.settings.language; + Bootstrapper bootstrapper = new Bootstrapper(app, prefCtrl.settings, preferences, manager); if (line.hasCliOption(CliOption.TRACE)) { setLogLevel(Level.ALL); @@ -80,7 +80,7 @@ public static void main(String[] args) throws ReflectiveOperationException, Unsu } if (line.hasCliOption(CliOption.NO_GUI)) { - bootstrapper.initialize(new UserInteractionHandlerCLI(prefCtrl.getSettings())); + bootstrapper.initialize(new UserInteractionHandlerCLI(prefCtrl.settings)); CLI cmd = new CLI(prefCtrl, app); /* Defined here so there is output on console */ @@ -101,7 +101,7 @@ public static void main(String[] args) throws ReflectiveOperationException, Unsu /* Defined here so there is output in the splash */ importPreferences(line); - bootstrapper.initialize(new UserInteractionHandlerGUI(prefCtrl.getSettings(), null)); + bootstrapper.initialize(new UserInteractionHandlerGUI(prefCtrl.settings, null)); EventQueue.invokeLater(() -> { try { JFrame window = new GUI(prefCtrl, app); @@ -115,9 +115,10 @@ public static void main(String[] args) throws ReflectiveOperationException, Unsu } new Thread(() -> { SubtitleProviderStore subtitleProviderStore = (SubtitleProviderStore) app.make("SubtitleProviderStore"); - List providerNames = subtitleProviderStore.getAllProviders().stream().map(SubtitleProvider::getProviderName) - .map(providerName -> providerName.contains("-") ? providerName.split("-")[0] : providerName) - .map(providerName -> providerName + "-").toList(); + List providerNames = + subtitleProviderStore.getAllProviders().stream().map(SubtitleProvider::getProviderName) + .map(providerName -> providerName.contains("-") ? providerName.split("-")[0] : providerName) + .map(providerName -> providerName + "-").toList(); manager.clearExpiredCacheBuilder() .cacheType(CacheType.DISK) .keyFilter((String key) -> providerNames.stream().noneMatch(key::startsWith)) @@ -127,7 +128,8 @@ public static void main(String[] args) throws ReflectiveOperationException, Unsu } private static void setLogLevel(Level level) { - ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + ch.qos.logback.classic.Logger root = + (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); root.setLevel(level); } @@ -148,7 +150,8 @@ private static void importPreferences(CommandLine line) { public static Options getCLIOptions() { Options options = new Options(); Arrays.stream(CliOption.values()).forEach( - cliOption -> options.addOption(cliOption.getValue(), cliOption.getLongValue(), cliOption.isHasArg(), cliOption.getDescription())); + cliOption -> options.addOption(cliOption.value, cliOption.longValue, cliOption.hasArg, + cliOption.description)); return options; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index cfa2db84..06fd30cf 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -66,8 +66,7 @@ public class GUI extends JFrame implements PropertyChangeListener { - @Serial - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final Container app; private final Manager manager; private final Settings settings; @@ -91,7 +90,7 @@ public GUI(final SettingsControl settingsControl, Container app) { this.app = app; this.manager = (Manager) this.app.make("Manager"); this.settings = (Settings) this.app.make("Settings"); - this.userInteractionHandler = new UserInteractionHandlerGUI(settingsControl.getSettings(), this); + this.userInteractionHandler = new UserInteractionHandlerGUI(settingsControl.settings, this); setTitle(ConfigProperties.getInstance().getProperty("name")); /* * setIconImage(Toolkit.getDefaultToolkit().getImage( @@ -100,8 +99,8 @@ public GUI(final SettingsControl settingsControl, Container app) { this.settingsControl = settingsControl; initialize(); restoreScreenSettings(); - pnlSearchFile.getResultPanel().disableButtons(); - pnlSearchText.getResultPanel().disableButtons(); + pnlSearchFile.resultPanel.disableButtons(); + pnlSearchText.resultPanel.disableButtons(); new Thread(() -> checkUpdate(false)).start(); initPopupMenu(); } @@ -115,20 +114,24 @@ public void redraw() { private void checkUpdate(final boolean forceUpdateCheck) { UpdateAvailableGithub u = new UpdateAvailableGithub(manager, settings); - Optional updateUrl = (forceUpdateCheck && u.isNewVersionAvailable()) - || (!forceUpdateCheck && u.shouldCheckForNewUpdate(settingsControl.getSettings().updateCheckPeriod) - && u.isNewVersionAvailable()) ? u.getLatestDownloadUrl() : Optional.empty(); + Optional updateUrl = (forceUpdateCheck && u.isNewVersionAvailable()) || (!forceUpdateCheck && + u.shouldCheckForNewUpdate( + settingsControl.settings.updateCheckPeriod) && + u.isNewVersionAvailable()) ? + u.getLatestDownloadUrl() : Optional.empty(); if (updateUrl.isPresent()) { final JEditorPane editorPane = new JEditorPane(); editorPane.setPreferredSize(new Dimension(800, 50)); editorPane.setEditable(false); editorPane.setContentType("text/html"); - editorPane.setText("" + Messages.getString("UpdateAppAvailable") + "!:
" + updateUrl.get() + ""); + editorPane.setText( + "" + Messages.getString("UpdateAppAvailable") + "!:
" + + updateUrl.get() + ""); editorPane.addHyperlinkListener(hyperlinkEvent -> { - if (hyperlinkEvent.getEventType() == HyperlinkEvent.EventType.ACTIVATED && Desktop.isDesktopSupported()) { + if (hyperlinkEvent.getEventType() == HyperlinkEvent.EventType.ACTIVATED && + Desktop.isDesktopSupported()) { try { Desktop.getDesktop().browse(hyperlinkEvent.getURL().toURI()); } catch (Exception e) { @@ -136,7 +139,8 @@ private void checkUpdate(final boolean forceUpdateCheck) { } } }); - JOptionPane.showMessageDialog(this, editorPane, ConfigProperties.getInstance().getProperty("name"), JOptionPane.INFORMATION_MESSAGE); + JOptionPane.showMessageDialog(this, editorPane, ConfigProperties.getInstance().getProperty("name"), + JOptionPane.INFORMATION_MESSAGE); } else if (forceUpdateCheck) { JOptionPane.showMessageDialog(this, Messages.getString("MainWindow.NoUpdateAvailable"), ConfigProperties.getInstance().getProperty("name"), JOptionPane.INFORMATION_MESSAGE); @@ -148,7 +152,7 @@ private void checkUpdate(final boolean forceUpdateCheck) { * Initialize the contents of the frame. */ private void initialize() { - MemoryFolderChooser.getInstance().setMemory(settingsControl.getSettings().lastOutputDir); + MemoryFolderChooser.getInstance().setMemory(settingsControl.settings.lastOutputDir); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { @@ -199,32 +203,43 @@ public void windowClosing(WindowEvent e) { } private void createMenu() { - Settings settings = settingsControl.getSettings(); - BiConsumer visibilityFunction = pnlSearchFile.getResultPanel().getTable()::setColumnVisibility; + Settings settings = settingsControl.settings; + BiConsumer visibilityFunction = + pnlSearchFile.getResultPanel().getTable()::setColumnVisibility; BiConsumer showRenameDialog = - (videoType, title) -> new RenameDialog(self(), settings, videoType, title, manager, userInteractionHandler).setVisible(true); + (videoType, title) -> new RenameDialog(self(), settings, videoType, title, manager, + userInteractionHandler).setVisible(true); ExportImport exportImport = new ExportImport(manager, settingsControl, userInteractionHandler, this); - menuBar = new Menu() - .withShowOnlyFound(settings.optionsShowOnlyFound) + menuBar = new Menu().withShowOnlyFound(settings.optionsShowOnlyFound) .withFileQuitAction(this::close) - .withViewFilenameAction(() -> visibilityFunction.accept(SearchColumnName.FILENAME, menuBar.isViewFilenameSelected())) - .withViewTypeAction(() -> visibilityFunction.accept(SearchColumnName.TYPE, menuBar.isViewTypeSelected())) - .withViewTitleAction(() -> visibilityFunction.accept(SearchColumnName.TITLE, menuBar.isViewTitleSelected())) - .withViewSeasonAction(() -> visibilityFunction.accept(SearchColumnName.SEASON, menuBar.isViewSeasonSelected())) - .withViewEpisodeAction(() -> visibilityFunction.accept(SearchColumnName.EPISODE, menuBar.isViewEpisodeSelected())) + .withViewFilenameAction( + () -> visibilityFunction.accept(SearchColumnName.FILENAME, menuBar.isViewFilenameSelected())) + .withViewTypeAction( + () -> visibilityFunction.accept(SearchColumnName.TYPE, menuBar.isViewTypeSelected())) + .withViewTitleAction( + () -> visibilityFunction.accept(SearchColumnName.TITLE, menuBar.isViewTitleSelected())) + .withViewSeasonAction( + () -> visibilityFunction.accept(SearchColumnName.SEASON, menuBar.isViewSeasonSelected())) + .withViewEpisodeAction( + () -> visibilityFunction.accept(SearchColumnName.EPISODE, menuBar.isViewEpisodeSelected())) .withViewShowOnlyFoundAction(() -> { settings.optionsShowOnlyFound = menuBar.isShowOnlyFound(); - ((VideoTableModel) pnlSearchFile.getResultPanel().getTable().getModel()).setShowOnlyFound(menuBar.isShowOnlyFound()); + ((VideoTableModel) pnlSearchFile.getResultPanel().getTable().getModel()).setShowOnlyFound( + menuBar.isShowOnlyFound()); }) .withViewClearLogAction(() -> pnlLogging.setLogText("")) - .withEditRenameTVAction(() -> showRenameDialog.accept(VideoType.EPISODE, Messages.getString("Menu.RenameSerie"))) - .withEditRenameMovieAction(() -> showRenameDialog.accept(VideoType.MOVIE, Messages.getString("Menu.RenameMovie"))) + .withEditRenameTVAction( + () -> showRenameDialog.accept(VideoType.EPISODE, Messages.getString("Menu.RenameSerie"))) + .withEditRenameMovieAction( + () -> showRenameDialog.accept(VideoType.MOVIE, Messages.getString("Menu.RenameMovie"))) .withEditPreferencesAction( - () -> new PreferenceDialog(self(), settingsControl, (Emitter) app.make("EventEmitter"), manager, userInteractionHandler) - .setVisible(true)) + () -> new PreferenceDialog(self(), settingsControl, (Emitter) app.make("EventEmitter"), manager, + userInteractionHandler).setVisible(true)) .withTranslateShowNamesAction(this::showTranslateShowNames) - .withExportTranslationsAction(() -> exportImport.exportSettings(ExportImport.SettingsType.SERIE_MAPPING)) - .withImportTranslationsAction(() -> exportImport.importSettings(ExportImport.SettingsType.SERIE_MAPPING)) + .withExportTranslationsAction( + () -> exportImport.exportSettings(ExportImport.SettingsType.SERIE_MAPPING)) + .withImportTranslationsAction( + () -> exportImport.importSettings(ExportImport.SettingsType.SERIE_MAPPING)) .withExportPreferencesAction(() -> exportImport.exportSettings(ExportImport.SettingsType.PREFERENCES)) .withImportPreferencesAction(() -> exportImport.importSettings(ExportImport.SettingsType.PREFERENCES)) .withCheckUpdateAction(() -> checkUpdate(true)) @@ -232,14 +247,15 @@ private void createMenu() { } private void createTextSearchPanel() { - Settings settings = this.settingsControl.getSettings(); + Settings settings = this.settingsControl.settings; /* resolve the SubtitleProviderStore from the Container */ SubtitleProviderStore subtitleProviderStore = (SubtitleProviderStore) this.app.make("SubtitleProviderStore"); ResultPanel resultPanel = new ResultPanel(); SearchTextInputPanel pnlSearchTextInput = new SearchTextInputPanel(); pnlSearchText = new SearchPanel<>(pnlSearchTextInput, resultPanel); - pnlSearchTextInput.setSelectedLanguage(settings.subtitleLanguage == null ? Language.DUTCH : settings.subtitleLanguage); + pnlSearchTextInput.setSelectedLanguage( + settings.subtitleLanguage == null ? Language.DUTCH : settings.subtitleLanguage); resultPanel.showSelectFoundSubtitlesButton(); resultPanel.setTable(createSubtitleTable()); resultPanel.setDownloadAction(arg -> downloadText()); @@ -264,18 +280,18 @@ private CustomTable createSubtitleTable() { } private void createFileSearchPanel() { - Settings settings = this.settingsControl.getSettings(); + Settings settings = this.settingsControl.settings; ResultPanel resultPanel = new ResultPanel(); pnlSearchFileInput = new SearchFileInputPanel(); pnlSearchFileInput.setRecursiveSelected(settings.optionRecursive); - pnlSearchFileInput.setSelectedLanguage(settings.subtitleLanguage == null ? Language.DUTCH : settings.subtitleLanguage); + pnlSearchFileInput.setSelectedLanguage( + settings.subtitleLanguage == null ? Language.DUTCH : settings.subtitleLanguage); pnlSearchFile = new SearchPanel<>(pnlSearchFileInput, resultPanel); resultPanel.setTable(createVideoTable()); - FileGuiSearchAction searchAction = FileGuiSearchAction - .createWithSettings(settings) + FileGuiSearchAction searchAction = FileGuiSearchAction.createWithSettings(settings) .manager(manager) .subtitleProviderStore((SubtitleProviderStore) this.app.make("SubtitleProviderStore")) .mainWindow(this) @@ -289,9 +305,8 @@ private void createFileSearchPanel() { resultPanel.setDownloadAction(arg -> download()); resultPanel.setMoveAction(arg -> { final int response = - JOptionPane.showConfirmDialog( - self(), - Messages.getString("MainWindow.OnlyMoveToLibraryStructure"), Messages.getString("App.Confirm"), //$NON-NLS-2$ + JOptionPane.showConfirmDialog(self(), Messages.getString("MainWindow.OnlyMoveToLibraryStructure"), + Messages.getString("App.Confirm"), //$NON-NLS-2$ JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (response == JOptionPane.YES_OPTION) { rename(); @@ -303,8 +318,8 @@ private CustomTable createVideoTable() { CustomTable customTable = new CustomTable(); VideoTableModel videoTableModel = VideoTableModel.getDefaultVideoTableModel(); customTable.setModel(videoTableModel); - videoTableModel.setShowOnlyFound(settingsControl.getSettings().optionsShowOnlyFound); - videoTableModel.setUserInteractionHandler(userInteractionHandler); + videoTableModel.setShowOnlyFound(settingsControl.settings.optionsShowOnlyFound); + videoTableModel.userInteractionHandler = userInteractionHandler; final RowSorter sorter = new TableRowSorter<>(customTable.getModel()); customTable.setRowSorter(sorter); customTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); @@ -326,19 +341,22 @@ private CustomTable createVideoTable() { } private void restoreScreenSettings() { - CustomTable customTable = pnlSearchFile.getResultPanel().getTable(); - TriConsumer> visibilityConsumer = (searchColumn, hidden, setVisibleConsumer) -> { - setVisibleConsumer.accept(!hidden); - customTable.setColumnVisibility(searchColumn, !hidden); - }; - - ScreenSettings screenSettings = settingsControl.getSettings().screenSettings; - - visibilityConsumer.accept(SearchColumnName.EPISODE, screenSettings.isHideEpisode(), menuBar::withViewEpisodeSelected); - visibilityConsumer.accept(SearchColumnName.FILENAME, screenSettings.isHideFilename(), menuBar::withViewFileNameSelected); - visibilityConsumer.accept(SearchColumnName.SEASON, screenSettings.isHideSeason(), menuBar::withViewSeasonSelected); - visibilityConsumer.accept(SearchColumnName.TYPE, screenSettings.isHideType(), menuBar::withViewTypeSelected); - visibilityConsumer.accept(SearchColumnName.TITLE, screenSettings.isHideTitle(), menuBar::withViewTitleSelected); + CustomTable customTable = pnlSearchFile.resultPanel.getTable(); + TriConsumer> visibilityConsumer = + (searchColumn, hidden, setVisibleConsumer) -> { + setVisibleConsumer.accept(!hidden); + customTable.setColumnVisibility(searchColumn, !hidden); + }; + + ScreenSettings screenSettings = settingsControl.settings.screenSettings; + + visibilityConsumer.accept(SearchColumnName.EPISODE, screenSettings.hideEpisode, + menuBar::withViewEpisodeSelected); + visibilityConsumer.accept(SearchColumnName.FILENAME, screenSettings.hideFilename, + menuBar::withViewFileNameSelected); + visibilityConsumer.accept(SearchColumnName.SEASON, screenSettings.hideSeason, menuBar::withViewSeasonSelected); + visibilityConsumer.accept(SearchColumnName.TYPE, screenSettings.hideType, menuBar::withViewTypeSelected); + visibilityConsumer.accept(SearchColumnName.TITLE, screenSettings.hideTitle, menuBar::withViewTitleSelected); } private void initPopupMenu() { @@ -362,8 +380,8 @@ private void initPopupMenu() { // add the listener to the jtable MouseListener popupListener = new PopupListener(popupMenu); // add the listener specifically to the header - CustomTable customTable = pnlSearchFile.getResultPanel().getTable(); - CustomTable subtitleTable = pnlSearchText.getResultPanel().getTable(); + CustomTable customTable = pnlSearchFile.resultPanel.getTable(); + CustomTable subtitleTable = pnlSearchText.resultPanel.getTable(); customTable.addMouseListener(popupListener); customTable.getTableHeader().addMouseListener(popupListener); subtitleTable.addMouseListener(popupListener); @@ -371,8 +389,9 @@ private void initPopupMenu() { } protected void showTranslateShowNames() { - final MappingEpisodeNameDialog tDialog = new MappingEpisodeNameDialog(this, settingsControl, (Manager) this.app.make("Manager"), - (SubtitleProviderStore) this.app.make("SubtitleProviderStore"), userInteractionHandler); + final MappingEpisodeNameDialog tDialog = + new MappingEpisodeNameDialog(this, settingsControl, (Manager) this.app.make("Manager"), + (SubtitleProviderStore) this.app.make("SubtitleProviderStore"), userInteractionHandler); tDialog.setVisible(true); } @@ -383,38 +402,43 @@ private void showAbout() { if (version.contains("-SNAPSHOT")) { sb.append(" (%s)".formatted(PropertiesReader.getProperty("build.timestamp"))); } - JOptionPane.showConfirmDialog(this, sb.toString(), ConfigProperties.getInstance().getProperty("name"), JOptionPane.CLOSED_OPTION); + JOptionPane.showConfirmDialog(this, sb.toString(), ConfigProperties.getInstance().getProperty("name"), + JOptionPane.CLOSED_OPTION); } protected void rename() { - CustomTable customTable = pnlSearchFile.getResultPanel().getTable(); + CustomTable customTable = pnlSearchFile.resultPanel.getTable(); RenameWorker renameWorker = - new RenameWorker(customTable, settingsControl.getSettings(), (Manager) this.app.make("Manager"), userInteractionHandler); + new RenameWorker(customTable, settingsControl.settings, (Manager) this.app.make("Manager"), + userInteractionHandler); renameWorker.addPropertyChangeListener(this); - pnlSearchFile.getResultPanel().enableButtons(); + pnlSearchFile.resultPanel.enableButtons(); progressDialog = new ProgressDialog(this, renameWorker); progressDialog.setVisible(true); renameWorker.execute(); } private void download() { - CustomTable customTable = pnlSearchFile.getResultPanel().getTable(); - DownloadWorker downloadWorker = new DownloadWorker(customTable, settingsControl.getSettings(), (Manager) this.app.make("Manager"), this); + CustomTable customTable = pnlSearchFile.resultPanel.getTable(); + DownloadWorker downloadWorker = + new DownloadWorker(customTable, settingsControl.settings, (Manager) this.app.make("Manager"), this); downloadWorker.addPropertyChangeListener(this); - pnlSearchFile.getResultPanel().disableButtons(); + pnlSearchFile.resultPanel.disableButtons(); progressDialog = new ProgressDialog(this, downloadWorker); progressDialog.setVisible(true); downloadWorker.execute(); } private void downloadText() { - MemoryFolderChooser.getInstance().selectDirectory(getContentPane(), Messages.getString("MainWindow.SelectFolder")) + MemoryFolderChooser.getInstance() + .selectDirectory(getContentPane(), Messages.getString("MainWindow.SelectFolder")) .ifPresent(path -> { - CustomTable subtitleTable = pnlSearchText.getResultPanel().getTable(); + CustomTable subtitleTable = pnlSearchText.resultPanel.getTable(); final VideoTableModel model = (VideoTableModel) subtitleTable.getModel(); for (int i = 0; i < model.getRowCount(); i++) { if ((Boolean) model.getValueAt(i, subtitleTable.getColumnIdByName(SearchColumnName.SELECT))) { - final Subtitle subtitle = (Subtitle) model.getValueAt(i, subtitleTable.getColumnIdByName(SearchColumnName.OBJECT)); + final Subtitle subtitle = (Subtitle) model.getValueAt(i, + subtitleTable.getColumnIdByName(SearchColumnName.OBJECT)); String filename = ""; if (!subtitle.fileName.endsWith(".srt")) { filename = subtitle.fileName + ".srt"; @@ -428,14 +452,16 @@ private void downloadText() { subtitle.file.copyToDir(path); } else { Manager manager = (Manager) this.app.make("Manager"); - String url = subtitle.sourceLocation == Subtitle.SourceLocation.URL ? subtitle.url : subtitle.urlSupplier.get(); + String url = subtitle.sourceLocation == Subtitle.SourceLocation.URL ? subtitle.url : + subtitle.urlSupplier.get(); manager.store(url, path.resolve(filename)); } } catch (IOException | ManagerException e) { LOGGER.error("downloadText", e); } catch (SubtitlesProviderException e) { - LOGGER.error("Error while getting url for [%s] for subtitle provider [%s] (%s)".formatted(filename, - e.getSubtitleProvider(), e.getMessage()), e); + LOGGER.error( + "Error while getting url for [%s] for subtitle provider [%s] (%s)".formatted( + filename, e.getSubtitleProvider(), e.getMessage()), e); throw new RuntimeException(e); } } @@ -449,20 +475,23 @@ protected GUI self() { } public void showErrorMessage(String message) { - JOptionPane.showConfirmDialog(this, message, ConfigProperties.getInstance().getProperty("name"), JOptionPane.CLOSED_OPTION, - JOptionPane.ERROR_MESSAGE); + JOptionPane.showConfirmDialog(this, message, ConfigProperties.getInstance().getProperty("name"), + JOptionPane.CLOSED_OPTION, JOptionPane.ERROR_MESSAGE); } private void selectIncomingFolder() { - MemoryFolderChooser.getInstance().selectDirectory(self(), Messages.getString("MainWindow.SelectFolder")) - .map(Path::toAbsolutePath).map(Path::toString).ifPresent(pnlSearchFileInput::setIncomingPath); + MemoryFolderChooser.getInstance() + .selectDirectory(self(), Messages.getString("MainWindow.SelectFolder")) + .map(Path::toAbsolutePath) + .map(Path::toString) + .ifPresent(pnlSearchFileInput::setIncomingPath); } @Override public void propertyChange(PropertyChangeEvent event) { if (event.getSource() instanceof DownloadWorker downloadWorker) { if (downloadWorker.isDone()) { - pnlSearchFile.getResultPanel().enableButtons(); + pnlSearchFile.resultPanel.enableButtons(); progressDialog.setVisible(false); } else { final int progress = downloadWorker.getProgress(); @@ -471,7 +500,7 @@ public void propertyChange(PropertyChangeEvent event) { } } else if (event.getSource() instanceof RenameWorker renameWorker) { if (renameWorker.isDone()) { - pnlSearchFile.getResultPanel().enableButtons(); + pnlSearchFile.resultPanel.enableButtons(); progressDialog.setVisible(false); } else { final int progress = renameWorker.getProgress(); @@ -482,19 +511,19 @@ public void propertyChange(PropertyChangeEvent event) { } private void close() { - settingsControl.getSettings().optionRecursive = pnlSearchFileInput.isRecursiveSelected(); - settingsControl.getSettings().subtitleLanguage = pnlSearchFileInput.getSelectedLanguage(); + settingsControl.settings.optionRecursive = pnlSearchFileInput.isRecursiveSelected(); + settingsControl.settings.subtitleLanguage = pnlSearchFileInput.getSelectedLanguage(); storeScreenSettings(); settingsControl.store(); } private void storeScreenSettings() { - CustomTable customTable = pnlSearchFile.getResultPanel().getTable(); - settingsControl.getSettings().screenSettings.setHideEpisode(customTable.isHideColumn(SearchColumnName.EPISODE)); - settingsControl.getSettings().screenSettings.setHideFilename(customTable.isHideColumn(SearchColumnName.FILENAME)); - settingsControl.getSettings().screenSettings.setHideSeason(customTable.isHideColumn(SearchColumnName.SEASON)); - settingsControl.getSettings().screenSettings.setHideTitle(customTable.isHideColumn(SearchColumnName.TITLE)); - settingsControl.getSettings().screenSettings.setHideType(customTable.isHideColumn(SearchColumnName.TYPE)); + CustomTable customTable = pnlSearchFile.resultPanel.getTable(); + settingsControl.settings.screenSettings.hideEpisode = customTable.isHideColumn(SearchColumnName.EPISODE); + settingsControl.settings.screenSettings.hideFilename = customTable.isHideColumn(SearchColumnName.FILENAME); + settingsControl.settings.screenSettings.hideSeason = customTable.isHideColumn(SearchColumnName.SEASON); + settingsControl.settings.screenSettings.hideTitle = customTable.isHideColumn(SearchColumnName.TITLE); + settingsControl.settings.screenSettings.hideType = customTable.isHideColumn(SearchColumnName.TYPE); } public ProgressDialog setProgressDialog(Cancelable worker) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java index 80234496..33e42a63 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java @@ -56,13 +56,13 @@ public List selectSubtitles(Release release) { private ColumnDisplayer createSubtitleDisplayer(SubtitleTableColumnName column, Function toStringMapper) { - return new ColumnDisplayer<>(column.getColumnName(), (Subtitle s) -> String.valueOf(toStringMapper.apply(s))); + return new ColumnDisplayer<>(column.columnName, subtitle -> String.valueOf(toStringMapper.apply(subtitle))); } private TableDisplayer createTableDisplayer() { return new TableDisplayer<>(Stream.of(SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARINGIMPAIRED) - .map(stcn -> createSubtitleDisplayer(stcn, stcn.getValueFunction())).toList()); + .map(stcn -> createSubtitleDisplayer(stcn, stcn.valueFunction)).toList()); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java index 873ca754..f2f42d63 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java @@ -28,7 +28,7 @@ public enum SubtitleTableColumnName implements CustomColumnName { @val @override boolean editable; - private final Function valueFunction; + @val Function valueFunction; SubtitleTableColumnName(String columnNameCode, Class clazz, boolean editable, Function valueFunction) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java index 394b6b5f..e8396e48 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java @@ -16,6 +16,7 @@ import java.util.stream.IntStream; import manifold.ext.props.rt.api.get; +import manifold.ext.props.rt.api.var; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.sublibrary.model.MovieRelease; import org.lodder.subtools.sublibrary.model.Release; @@ -42,7 +43,7 @@ public class VideoTableModel extends DefaultTableModel { private final Map rowMap = new LinkedHashMap<>(); private boolean showOnlyFound = false; - @get UserInteractionHandler userInteractionHandler; + @var UserInteractionHandler userInteractionHandler; private VideoTableModel(List searchColumnNames) { super(new Object[][]{}, searchColumnNames.stream().map(SearchColumnName::getColumnName).toArray(String[]::new)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index f3b5dc63..b45b8af0 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -8,8 +8,9 @@ import java.util.Optional; import java.util.Set; -import lombok.Getter; import lombok.experimental.ExtensionMethod; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.NotImplementedException; import org.lodder.subtools.multisubdownloader.lib.control.MovieReleaseControl; import org.lodder.subtools.multisubdownloader.lib.control.TvReleaseControl; @@ -39,9 +40,8 @@ public class Local implements SubtitleProvider { private static final Logger LOGGER = LoggerFactory.getLogger(Local.class); private final Settings settings; - @Getter - private final Manager manager; private final UserInteractionHandler userInteractionHandler; + @val @override Manager manager; public Local(Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { this.settings = settings; @@ -79,7 +79,8 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { && (((TvRelease) release).season == tvRelease.season && Utils.containsAll( ((TvRelease) release).episodeNumbers, tvRelease.episodeNumbers))) { - TvReleaseControl epCtrl = new TvReleaseControl((TvRelease) release, settings, manager, userInteractionHandler); + TvReleaseControl epCtrl = + new TvReleaseControl((TvRelease) release, settings, manager, userInteractionHandler); epCtrl.process(); if (((TvRelease) release).tvdbIdOptional.equals(tvRelease.tvdbIdOptional)) { Language detectedLang = DetectLanguage.execute(fileSub); @@ -92,7 +93,9 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { .language(language) .quality(ReleaseParser.getQualityKeyword(fileSub.getFileNameAsString())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleaseGroup(fileSub.getFileNameAsString(), true)) + .releaseGroup( + ReleaseParser.extractReleaseGroup(fileSub.getFileNameAsString(), + true)) .uploader(fileSub.toAbsolutePath().toString()) .hearingImpaired(false)); } @@ -121,7 +124,8 @@ public Set searchSubtitles(MovieRelease movieRelease, Language languag try { Release release = releaseParser.parse(fileSub); if (release.videoType == VideoType.MOVIE) { - MovieReleaseControl movieCtrl = new MovieReleaseControl((MovieRelease) release, settings, manager, userInteractionHandler); + MovieReleaseControl movieCtrl = + new MovieReleaseControl((MovieRelease) release, settings, manager, userInteractionHandler); movieCtrl.process(); if (((MovieRelease) release).getImdbId().equals(movieRelease.getImdbId())) { Language detectedLang = DetectLanguage.execute(fileSub); @@ -134,7 +138,9 @@ public Set searchSubtitles(MovieRelease movieRelease, Language languag .language(language) // TODO previously: language(""). This was not correct? .quality(ReleaseParser.getQualityKeyword(fileSub.getFileNameAsString())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleaseGroup(fileSub.getFileNameAsString(), true)) + .releaseGroup( + ReleaseParser.extractReleaseGroup(fileSub.getFileNameAsString(), + true)) .uploader(fileSub.toAbsolutePath().toString()) .hearingImpaired(false)); } @@ -156,7 +162,10 @@ private List getAllSubtitlesFiles(Path dir, String filter) { try { return dir.list().filter(Files::isRegularFile) .filter(file -> file.hasExtension("srt")) - .filter(file -> file.getFileNameAsString().replaceAll("[^A-Za-z]", "").toLowerCase().contains(filter.toLowerCase())) + .filter(file -> file.getFileNameAsString() + .replaceAll("[^A-Za-z]", "") + .toLowerCase() + .contains(filter.toLowerCase())) .toList(); } catch (IOException e) { LOGGER.error(e.getMessage(), e); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java index 7c8b776f..6c31fb50 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java @@ -3,6 +3,7 @@ import java.util.Optional; import java.util.Set; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.cache.CacheType; @@ -16,6 +17,9 @@ public interface SubtitleProvider { + @val String providerName; + @val Manager manager; + Set searchSubtitles(TvRelease tvRelease, Language language); Set searchSubtitles(MovieRelease movieRelease, Language language); @@ -44,7 +48,8 @@ default Set search(Release release, Language language) { return this.searchSubtitles(tvRelease, language); } } catch (Exception e) { - LoggerFactory.getLogger(SubtitleProvider.class).error("Error in %s API: %s".formatted(getName(), e.getMessage()), e); + LoggerFactory.getLogger(SubtitleProvider.class) + .error("Error in %s API: %s".formatted(getName(), e.getMessage()), e); } return Set.of(); } @@ -56,9 +61,6 @@ default void clearCache() { .clear(); } - String getProviderName(); - - Manager getManager(); Optional getProviderSerieId(TvRelease tvRelease) throws X; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java index e1da357f..c6eeeaf4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java @@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor; import manifold.ext.props.rt.api.override; import manifold.ext.props.rt.api.val; +import manifold.ext.rt.api.Self; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.sublibrary.Manager; @@ -28,7 +29,7 @@ abstract class AbstractAdapter> { + public static class ExecuteCall { private final ThrowingSupplier supplier; private String message; private int retries = 3; @@ -38,39 +39,39 @@ public static class ExecuteCall(Predicate predicate, Function exceptionFunction) {} - public E retryWhenException(Predicate predicate) { + public @Self ExecuteCall retryWhenException(Predicate predicate) { retryPredicates.add(predicate); - return getThis(); + return this; } - public E handleException(Predicate predicate, Function exceptionFunction) { + public @Self ExecuteCall handleException(Predicate predicate, Function exceptionFunction) { exceptionHandlers.add(new HandleException<>(predicate, exceptionFunction)); - return getThis(); + return this; } - public E handleException(Predicate predicate, Supplier supplier) { - return handleException(predicate, e -> supplier.get()); + public @Self ExecuteCall handleException(Predicate predicate, Supplier supplier) { + return handleException(predicate, _ -> supplier.get()); } - public E handleException(Function exceptionFunction) { + public @Self ExecuteCall handleException(Function exceptionFunction) { return handleException(e -> true, exceptionFunction); } - public E handleException(Supplier supplier) { + public @Self ExecuteCall handleException(Supplier supplier) { return handleException(e -> true, e -> supplier.get()); } - public E retries(int retries) { + public @Self ExecuteCall retries(int retries) { if (retries <= 0) { throw new IllegalStateException("Retries should be greater than 0"); } this.retries = retries; - return getThis(); + return this; } - public E message(String message) { + public @Self ExecuteCall message(String message) { this.message = message; - return getThis(); + return this; } @SuppressWarnings("unchecked") @@ -105,10 +106,5 @@ public T execute() throws X { } } } - - @SuppressWarnings("unchecked") - private E getThis() { - return (E) this; - } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index 5c1e87a5..f17c545e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -82,15 +82,20 @@ public Set searchSerieSubtitles(TvRelease tvRelease, Language language .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return new ExecuteCall<>(() -> getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language)) + return new ExecuteCall<>( + () -> getApi().getSubtitles(providerSerieId, tvRelease.season, episode, + language)) .message("getSubtitles: [%s]".formatted( - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode))) + TvRelease.formatName(providerSerieId.getProviderName(), + tvRelease.season, episode))) .retryWhenHttpCode(ReturnCode.REFRESHING) .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .execute().stream(); } catch (ApiException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted( + getSubtitleSource().getName(), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, + episode), e.getMessage()), e); return Stream.empty(); } @@ -100,15 +105,17 @@ public Set searchSerieSubtitles(TvRelease tvRelease, Language language } @Override - public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws ApiException { - List serieIds = tvdbIdOptional.mapToObj(tvdbId -> new ExecuteCall<>(() -> getApi().getProviderSerieName(tvdbId)) - .message("getProviderSerieName: [%s]".formatted(tvdbId)) - .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) - .handleHttpCode(ReturnCode.NOT_FOUND, () -> { - LOGGER.info("API %s - Could not find tvdbId [%s]".formatted(getProviderName(), tvdbId)); - return List.of(); - }) - .execute()).orElseGet(List::of); + public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) + throws ApiException { + List serieIds = + tvdbIdOptional.mapToObj(tvdbId -> new ExecuteCall<>(() -> getApi().getProviderSerieName(tvdbId)) + .message("getProviderSerieName: [%s]".formatted(tvdbId)) + .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) + .handleHttpCode(ReturnCode.NOT_FOUND, () -> { + LOGGER.info("API %s - Could not find tvdbId [%s]".formatted(getProviderName(), tvdbId)); + return List.of(); + }) + .execute()).orElseGet(List::of); if (serieIds.isEmpty()) { serieIds = new ExecuteCall<>(() -> getApi().getProviderSerieName(serieName)) @@ -122,7 +129,8 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona } return serieIds.stream() .sorted(Comparator - .comparing(n -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", "")))) + .comparing(n -> !serieName.replaceAll("[^A-Za-z]", "") + .equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", "")))) .toList(); } @@ -155,7 +163,7 @@ public boolean isSameCode(int code) { } } - public static class ExecuteCall extends AbstractAdapter.ExecuteCall> { + public static class ExecuteCall extends AbstractAdapter.ExecuteCall { public ExecuteCall(ThrowingSupplier supplier) { super(supplier); @@ -175,7 +183,7 @@ public ExecuteCall handleHttpCode(ReturnCode returnCode, Supplier supplier @Override public ExecuteCall handleException(Supplier suppliers) { - return super.handleException(e -> true, suppliers); + return super.handleException(_ -> true, suppliers); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index 05495580..c99e1e70 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -7,7 +7,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.podnapisi.JPodnapisiApi; @@ -27,8 +26,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Getter -public class JPodnapisiAdapter extends AbstractAdapter { +public class JPodnapisiAdapter + extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JPodnapisiAdapter.class); @@ -72,25 +71,31 @@ public List searchMovieSubtitlesWithId(int tvdbId, } @Override - public List searchMovieSubtitlesWithName(String name, int year, Language language) throws PodnapisiException { + public List searchMovieSubtitlesWithName(String name, int year, Language language) + throws PodnapisiException { return getApi().getMovieSubtitles(name, year, 0, 0, language); } @Override - public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, Language language) { + public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, + Language language) { return buildListSubtitles(language, subtitles); } @Override - public Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws PodnapisiException { + public Set searchSerieSubtitles(TvRelease tvRelease, Language language) + throws PodnapisiException { return getProviderSerieId(tvRelease) .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return getApi().getSerieSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); + return getApi().getSerieSubtitles(providerSerieId, tvRelease.season, episode, language) + .stream(); } catch (PodnapisiException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted( + getSubtitleSource().getName(), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, + episode), e.getMessage()), e); return Stream.empty(); } @@ -100,7 +105,8 @@ public Set searchSerieSubtitles(TvRelease tvRelease } @Override - public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, Language language) { + public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, + Language language) { return buildListSubtitles(language, subtitles); } @@ -121,7 +127,8 @@ private Set buildListSubtitles(Language language, Collection getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws PodnapisiException { + public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) + throws PodnapisiException { return getApi().getPodnapisiShowName(serieName).stream().toList(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index 63ab68db..b2c6d9c1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -13,7 +13,6 @@ import java.util.stream.IntStream; import java.util.stream.Stream; -import lombok.Getter; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.subscene.SubsceneApi; @@ -33,7 +32,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Getter public class JSubsceneAdapter extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JSubsceneAdapter.class); @@ -86,21 +84,26 @@ public List searchMovieSubtitlesWithName(String name } @Override - public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, Language language) { + public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, + Language language) { // TODO implement this return Set.of(); } @Override - public Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws SubsceneException { + public Set searchSerieSubtitles(TvRelease tvRelease, Language language) + throws SubsceneException { return getProviderSerieId(tvRelease) .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); + return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language) + .stream(); } catch (SubsceneException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted( + getSubtitleSource().getName(), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, + episode), e.getMessage()), e); return Stream.empty(); } @@ -110,7 +113,8 @@ public Set searchSerieSubtitles(TvRelease tvRelease, } @Override - public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws SubsceneException { + public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) + throws SubsceneException { ToIntFunction providerTypeFunction = value -> switch (value) { case "TV-Serie" -> 1; case "Exact" -> 2; @@ -133,10 +137,12 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona } @Override - public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, Language language) { + public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, + Language language) { return subtitles.stream() .filter(sub -> language == sub.getLanguage()) - .filter(sub -> sub.getName().contains(getSeasonEpisodeString(tvRelease.season, tvRelease.firstEpisodeNumber))) + .filter(sub -> sub.getName() + .contains(getSeasonEpisodeString(tvRelease.season, tvRelease.firstEpisodeNumber))) .map(sub -> Subtitle.downloadSource(sub.getUrlSupplier()) .subtitleSource(getSubtitleSource()) .fileName(sub.getName().removeIllegalFilenameChars()) @@ -162,9 +168,10 @@ public boolean useSeasonForSerieId() { public String providerSerieIdToDisplayString(SubSceneSerieId providerSerieId) { if (providerSerieId.id.endsWith("-season")) { OptionalInt season = IntStream.rangeClosed(1, 100) - .filter(i -> providerSerieId.id.endsWith("-${SubsceneApi.getOrdinalName(i).toLowerCase()}-season")).findAny(); + .filter(i -> providerSerieId.id.endsWith("-${SubsceneApi.getOrdinalName(i).toLowerCase()}-season")) + .findAny(); if (season.isPresent()) { - return "%s %s %s".formatted(providerSerieId.name, Messages.getString("App.Season"), season.getAsInt()); + return "%s %s %s".formatted(providerSerieId.name, Messages.getString("App.Season"), season.getAsInt()); } } return providerSerieId.name; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java index ed3d9140..14b91c61 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java @@ -10,7 +10,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.tvsubtitles.JTVSubtitlesApi; @@ -30,8 +29,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Getter -public class JTVsubtitlesAdapter extends AbstractAdapter { +public class JTVsubtitlesAdapter + extends AbstractAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(JTVsubtitlesAdapter.class); @@ -83,21 +82,26 @@ public List searchMovieSubtitlesWithName(String n } @Override - public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, Language language) { + public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, + Language language) { // TODO implement this return Set.of(); } @Override - public Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws TvSubtitlesException { + public Set searchSerieSubtitles(TvRelease tvRelease, Language language) + throws TvSubtitlesException { return getProviderSerieId(tvRelease) .map(providerSerieId -> tvRelease.episodeNumbers.stream() .flatMap(episode -> { try { - return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); + return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language) + .stream(); } catch (TvSubtitlesException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted( + getSubtitleSource().getName(), + TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, + episode), e.getMessage()), e); return Stream.empty(); } @@ -107,7 +111,8 @@ public Set searchSerieSubtitles(TvRelease tvRelea } @Override - public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, Language language) { + public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, + Language language) { return subtitles.stream() .map(sub -> Subtitle.downloadSource(sub.getUrl()) .subtitleSource(getSubtitleSource()) @@ -115,18 +120,21 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws TvSubtitlesException { + public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) + throws TvSubtitlesException { Pattern yearPatter = Pattern.compile("\\((\\d\\d\\d\\d)-(\\d\\d\\d\\d)\\)"); return getApi().getUrisForSerieName(serieName).stream() .sorted(Comparator.comparing( - (ProviderSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", ""))) + (ProviderSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "") + .equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", ""))) .thenComparing((ProviderSerieId providerSerieId) -> { Matcher matcher = yearPatter.matcher(providerSerieId.name); if (matcher.find()) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java index 874db645..ca7514a8 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java @@ -32,7 +32,7 @@ public class JAddic7edApi extends Html implements SubtitleApi { private static final long RATEDURATION = 1; // seconds - + private static final String DOMAIN = "https://www.addic7ed.com"; private static final Pattern TITLE_PATTERN = Pattern.compile(".*? - [0-9]+x[0-9]+ - (.*)"); private static final Pattern VERSION_PATTERN = Pattern.compile("Version (.+), Duration: ([0-9]+).([0-9])+"); @@ -69,8 +69,10 @@ public List getProviderId(String serieName) throws Addic7edExce } try { List providerSerieIds = getContent(DOMAIN + "/allshows/" + serieName.split(" ")[0]) - .map(doc -> doc.select("table.tabel90 td a").stream() - .map(element -> new ProviderSerieId(element.text(), element.attr("href").split("/")[2])).toList()) + .map(doc -> doc.select("table.tabel90 td a") + .stream() + .map(element -> new ProviderSerieId(element.text(), element.attr("href").split("/")[2])) + .toList()) .orElseGet(List::of); String serieNameFormatted = serieName.replaceAll("[^A-Za-z]", ""); @@ -96,11 +98,13 @@ public List getProviderId(String serieName) throws Addic7edExce // .toList()) // .orElseGet(List::of)); - public List getSubtitles(SerieMapping addic7edSerieMapping, int season, int episode, Language language) + public List getSubtitles(SerieMapping addic7edSerieMapping, int season, int episode, + Language language) throws Addic7edException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), addic7edSerieMapping.getProviderId(), season, episode, + .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), + addic7edSerieMapping.getProviderId(), season, episode, language)) .collectionSupplier(Addic7edSubtitleDescriptor.class, () -> { List languageIds = LanguageId.forLanguage(language); @@ -109,7 +113,7 @@ public List getSubtitles(SerieMapping addic7edSerieM URLEncoder.encode(addic7edSerieMapping.getProviderName().replace(" ", "_"), UTF_8), season, episode, - languageIds.size() == 1 ? languageIds.first.getId() : LanguageId.ALL.getId()); + languageIds.size() == 1 ? languageIds.first.id : LanguageId.ALL.id); Optional doc = getContent(url); if (doc.isEmpty()) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/LanguageId.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/LanguageId.java index 9b829b91..4a1a9e0c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/LanguageId.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/LanguageId.java @@ -2,14 +2,12 @@ import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.Language; -@Getter -@RequiredArgsConstructor +@AllArgsConstructor public enum LanguageId { ALL(null, 0), @@ -79,10 +77,10 @@ public enum LanguageId { VIETNAMESE(Language.VIETNAMESE, 45), WELSH(Language.WELSH, 65); - private final Language language; - private final int id; + @val Language language; + @val int id; public static List forLanguage(Language language) { - return Arrays.stream(LanguageId.values()).filter(langId -> langId.getLanguage() == language).collect(Collectors.toList()); + return Arrays.stream(LanguageId.values()).filter(langId -> langId.language == language).toList(); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java index 2c267d5b..3721d81a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java @@ -4,7 +4,7 @@ import java.nio.charset.StandardCharsets; import java.util.List; -import lombok.Getter; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleApi; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.exception.OpenSubtitlesException; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.model.OpensubtitleSerieId; @@ -22,8 +22,7 @@ public class OpenSubtitlesApi implements SubtitleApi { private static final String APIKEY = "lNNp0yv0ah8gytkmYPbHwuaATJqr4rS9"; private static final ApiClient API_CLIENT; - @Getter - private final Manager manager; + @val Manager manager; static { API_CLIENT = new ApiClient(); @@ -42,7 +41,8 @@ public OpenSubtitlesApi(Manager manager, String userName, String password) throw public void login(String userName, String password) throws OpenSubtitlesException { try { Login200Response loginResponse = - new AuthenticationApi(API_CLIENT).login("application/json", new LoginRequest().username(userName).password(password)); + new AuthenticationApi(API_CLIENT).login("application/json", + new LoginRequest().username(userName).password(password)); API_CLIENT.setBearerToken(loginResponse.getToken()); } catch (ApiException e) { throw new OpenSubtitlesException(e); @@ -51,7 +51,8 @@ public void login(String userName, String password) throws OpenSubtitlesExceptio public static boolean isValidCredentials(String userName, String password) { try { - new AuthenticationApi(API_CLIENT).login("application/json", new LoginRequest().username(userName).password(password)); + new AuthenticationApi(API_CLIENT).login("application/json", + new LoginRequest().username(userName).password(password)); return true; } catch (ApiException e) { return false; @@ -74,12 +75,14 @@ public List getProviderSerieIds(String serieName) throws Op .userAgent("") .cacheType(CacheType.MEMORY) .retries(1) - .retryPredicate(exception -> exception instanceof HttpClientException e && e.getResponseCode() == 429) + .retryPredicate( + exception -> exception instanceof HttpClientException e && e.getResponseCode() == 429) .retryWait(5) .getAsJsonArray() .stream() .filter(show -> "tv".equals(show.getString("kind"))) - .map(show -> new OpensubtitleSerieId(show.getString("name"), show.getInt("id"), show.getString("year"))) + .map(show -> new OpensubtitleSerieId(show.getString("name"), show.getInt("id"), + show.getString("year"))) .toList(); } catch (Exception e) { throw new OpenSubtitlesException(e); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java index db4df717..9e8ce62a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java @@ -2,27 +2,21 @@ import java.util.Objects; -import lombok.Getter; -import lombok.Setter; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; +import manifold.ext.props.rt.api.var; -@Getter -@Setter +@AllArgsConstructor public class OpenSubtitlesMovieDescriptor { - private final int year; - private final int imdbId; - private String name; + @var String name; + @val int year; + @val int imdbId; public OpenSubtitlesMovieDescriptor(String name, int imdbId) { this(name, -1, imdbId); } - public OpenSubtitlesMovieDescriptor(String name, int year, int imdbId) { - this.name = name; - this.year = year; - this.imdbId = imdbId; - } - @Override public boolean equals(Object object) { return object instanceof OpenSubtitlesMovieDescriptor other @@ -39,7 +33,6 @@ public String toString() { if (year < 0) { return name; } - return String.format("%s (%d)", name, year); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesSubtitleDescriptor.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesSubtitleDescriptor.java index 8f083d5c..92597a50 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesSubtitleDescriptor.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesSubtitleDescriptor.java @@ -1,45 +1,42 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.model; -import lombok.Getter; -import lombok.Setter; +import manifold.ext.props.rt.api.var; -@Getter -@Setter public class OpenSubtitlesSubtitleDescriptor { - private String userNickName; - private String subFormat; - private int idSubtitle; - private int idMovie; - private String subBad; - private int userId; - private String zipDownloadLink; - private long subSize; - private String subFileName; - private String subDownloadLink; - private String userRank; - private String subActualCD; - private String movieImdbRating; - private String subAuthorComment; - private String subRating; - private String subtitlesLink; - private String subHearingImpaired; - private String subHash; - private int idSubMovieFile; - private String ISO639; - private int subDownloadsCnt; - private String movieHash; - private int subSumCD; - private String subComments; - private long movieByteSize; - private String languageName; - private int movieYear; - private String subLanguageID; - private String movieReleaseName; - private String movieTimeMS; - private String matchedBy; - private String movieName; - private String subAddDate; - private int idMovieImdb; - private String MovieNameEng; - private int idSubtitleFile; + @var String userNickName; + @var String subFormat; + @var int idSubtitle; + @var int idMovie; + @var String subBad; + @var int userId; + @var String zipDownloadLink; + @var long subSize; + @var String subFileName; + @var String subDownloadLink; + @var String userRank; + @var String subActualCD; + @var String movieImdbRating; + @var String subAuthorComment; + @var String subRating; + @var String subtitlesLink; + @var String subHearingImpaired; + @var String subHash; + @var int idSubMovieFile; + @var String ISO639; + @var int subDownloadsCnt; + @var String movieHash; + @var int subSumCD; + @var String subComments; + @var long movieByteSize; + @var String languageName; + @var int movieYear; + @var String subLanguageID; + @var String movieReleaseName; + @var String movieTimeMS; + @var String matchedBy; + @var String movieName; + @var String subAddDate; + @var int idMovieImdb; + @var String MovieNameEng; + @var int idSubtitleFile; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpensubtitleSerieId.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpensubtitleSerieId.java index 3a5373da..02132a33 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpensubtitleSerieId.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpensubtitleSerieId.java @@ -2,15 +2,13 @@ import java.io.Serial; -import lombok.Getter; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.data.ProviderSerieId; -@Getter public class OpensubtitleSerieId extends ProviderSerieId { - @Serial - private static final long serialVersionUID = 5858875211782260667L; - private final String year; + @Serial private static final long serialVersionUID = 5858875211782260667L; + @val String year; public OpensubtitleSerieId(String name, int id, String year) { super(name, String.valueOf(id)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/AiTranslatedEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/AiTranslatedEnum.java index 3c1f18c9..079e729d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/AiTranslatedEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/AiTranslatedEnum.java @@ -1,18 +1,18 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum AiTranslatedEnum implements ParamIntf { EXCLUDE("exclude"), INCLUDE("include"); - private final String value; + @val @override String value; @Override public String toString() { - return getValue(); + return value; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/ForeignPartsOnlyEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/ForeignPartsOnlyEnum.java index 7a6ba5d0..545b26da 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/ForeignPartsOnlyEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/ForeignPartsOnlyEnum.java @@ -1,18 +1,18 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum ForeignPartsOnlyEnum implements ParamIntf { EXCLUDE("exclude"), INCLUDE("include"), ONLY("only"); - private final String value; + @val @override String value; @Override public String toString() { - return getValue(); + return value; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/HearingImpairedEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/HearingImpairedEnum.java index 8586a61e..44d74b55 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/HearingImpairedEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/HearingImpairedEnum.java @@ -1,18 +1,18 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum HearingImpairedEnum implements ParamIntf { EXCLUDE("exclude"), INCLUDE("include"), ONLY("only"); - private final String value; + @val @override String value; @Override public String toString() { - return getValue(); + return value; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/MachineTranslatedEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/MachineTranslatedEnum.java index 4795d938..ef98bf0d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/MachineTranslatedEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/MachineTranslatedEnum.java @@ -1,19 +1,18 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum MachineTranslatedEnum implements ParamIntf { EXCLUDE("exclude"), INCLUDE("include"); - private final String value; - + @val @override String value; @Override public String toString() { - return getValue(); + return value; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/MoviehashMatchEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/MoviehashMatchEnum.java index 40ad9842..0731a418 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/MoviehashMatchEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/MoviehashMatchEnum.java @@ -1,18 +1,18 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum MoviehashMatchEnum implements ParamIntf { INCLUDE("include"), ONLY("only"); - private final String value; + @val @override String value; @Override public String toString() { - return getValue(); + return value; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/OrderDirectionEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/OrderDirectionEnum.java index 3076c02c..c248164c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/OrderDirectionEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/OrderDirectionEnum.java @@ -1,18 +1,18 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum OrderDirectionEnum implements ParamIntf { ASCENDING("asc"), DESCENDING("desc"); - private final String value; + @val @override String value; @Override public String toString() { - return getValue(); + return value; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/ParamIntf.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/ParamIntf.java index e0ef2281..0282aaa9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/ParamIntf.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/ParamIntf.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; +import manifold.ext.props.rt.api.val; + public interface ParamIntf { - String getValue(); + @val String value; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/SearchSubtitlesEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/SearchSubtitlesEnum.java index 36cd0d61..510e6819 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/SearchSubtitlesEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/SearchSubtitlesEnum.java @@ -1,11 +1,10 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum SearchSubtitlesEnum { // exclude, include (default: exclude) @@ -80,5 +79,5 @@ public enum SearchSubtitlesEnum { // Filter by movie/episode year YEAR("year"); - private final String paramName; + @val String paramName; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/TrustedSourcesEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/TrustedSourcesEnum.java index a2e7bcbb..ed2292d5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/TrustedSourcesEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/TrustedSourcesEnum.java @@ -1,18 +1,19 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum TrustedSourcesEnum implements ParamIntf { - INCLUDE("include"), ONLY("only"); + INCLUDE("include"), + ONLY("only"); - private final String value; + @val @override String value; @Override public String toString() { - return getValue(); + return value; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/TypeEnum.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/TypeEnum.java index 2cdbfb27..38de4c7d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/TypeEnum.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/param/TypeEnum.java @@ -1,18 +1,18 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.param; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum TypeEnum implements ParamIntf { MOVIE("movie"), EPISODE("episode"), ALL("all"); - private final String value; + @val @override String value; @Override public String toString() { - return getValue(); + return value; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java index e3129493..aa341898 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java @@ -12,8 +12,6 @@ import java.util.Optional; import java.util.function.Function; -import lombok.AccessLevel; -import lombok.Getter; import lombok.RequiredArgsConstructor; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -28,7 +26,6 @@ import org.lodder.subtools.sublibrary.settings.model.SerieMapping; import org.lodder.subtools.sublibrary.util.http.HttpClientException; -@Getter(value = AccessLevel.PRIVATE) @RequiredArgsConstructor public class JPodnapisiApi implements SubtitleApi { @@ -44,27 +41,32 @@ public Optional getPodnapisiShowName(String showName) throws Po : Optional.empty(); } - public List getMovieSubtitles(String movieName, int year, int season, int episode, Language language) + public List getMovieSubtitles(String movieName, int year, int season, int episode, + Language language) throws PodnapisiException { return getSubtitles(new SerieMapping(movieName, movieName, movieName, season), year, season, episode, language); } - public List getSerieSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) + public List getSerieSubtitles(SerieMapping providerSerieId, int season, int episode, + Language language) throws PodnapisiException { return getSubtitles(providerSerieId, null, season, episode, language); } - private List getSubtitles(SerieMapping providerSerieId, Integer year, int season, int episode, Language language) + private List getSubtitles(SerieMapping providerSerieId, Integer year, int season, + int episode, Language language) throws PodnapisiException { - return getManager().valueBuilder() + return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.getProviderId(), season, episode, language)) + .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.getProviderId(), + season, episode, language)) .collectionSupplier(PodnapisiSubtitleDescriptor.class, () -> { try { StringBuilder url = new StringBuilder(DOMAIN + "/sl/ppodnapisi/search?sK=") - .append(URLEncoder.encode(providerSerieId.getProviderId().trim().toLowerCase(), StandardCharsets.UTF_8)); + .append(URLEncoder.encode(providerSerieId.getProviderId().trim().toLowerCase(), + StandardCharsets.UTF_8)); if (PODNAPISI_LANGS.containsKey(language)) { url.append("&sJ=").append(PODNAPISI_LANGS.get(language)); } @@ -81,7 +83,10 @@ private List getSubtitles(SerieMapping providerSeri } url.append("&sXML=1"); - return getXml(url.toString()).select("subtitle").stream().map(this::parsePodnapisiSubtitle).toList(); + return getXml(url.toString()).select("subtitle") + .stream() + .map(this::parsePodnapisiSubtitle) + .toList(); } catch (Exception e) { throw new PodnapisiException(e); } @@ -92,8 +97,9 @@ private List getSubtitles(SerieMapping providerSeri protected Document getXml(String url) throws PodnapisiException { try { - return manager.getPageContentBuilder().url(url).userAgent(getUserAgent()).cacheType(CacheType.MEMORY).retries(1) - .retryPredicate(e -> e instanceof HttpClientException httpClientException && httpClientException.getResponseCode() >= 500 + return manager.getPageContentBuilder().url(url).userAgent(userAgent).cacheType(CacheType.MEMORY).retries(1) + .retryPredicate(e -> e instanceof HttpClientException httpClientException && + httpClientException.getResponseCode() >= 500 && httpClientException.getResponseCode() < 600) .retryWait(5).getAsJsoupDocument(); } catch (Exception e) { @@ -104,7 +110,9 @@ protected Document getXml(String url) throws PodnapisiException { private PodnapisiSubtitleDescriptor parsePodnapisiSubtitle(Element elem) { Function getText = e -> e == null ? null : e.text(); return PodnapisiSubtitleDescriptor.builder() - .hearingImpaired(elem.select("new_flags flags").stream().anyMatch(flagElem -> "hearing_impaired".equals(flagElem.text()))) + .hearingImpaired(elem.select("new_flags flags") + .stream() + .anyMatch(flagElem -> "hearing_impaired".equals(flagElem.text()))) .language(languageIdToLanguage(elem.selectFirst("languageId").text())) .releaseString(elem.selectFirst("release").text().length() > 10 ? elem.selectFirst("release").text() : elem.selectFirst("title").text().replace(":", "") + " " + elem.selectFirst("release").text()) @@ -123,7 +131,12 @@ public SubtitleSource getSubtitleSource() { } private Language languageIdToLanguage(String languageId) { - return PODNAPISI_LANGS.entrySet().stream().filter(entry -> entry.getValue().equals(languageId)).map(Entry::getKey).findFirst().orElse(null); + return PODNAPISI_LANGS.entrySet() + .stream() + .filter(entry -> entry.getValue().equals(languageId)) + .map(Entry::getKey) + .findFirst() + .orElse(null); } private static final Map PODNAPISI_LANGS = Collections diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/model/PodnapisiSubtitleDescriptor.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/model/PodnapisiSubtitleDescriptor.java index 625b8350..4431b5a2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/model/PodnapisiSubtitleDescriptor.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/model/PodnapisiSubtitleDescriptor.java @@ -1,33 +1,27 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.podnapisi.model; import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import manifold.ext.props.rt.api.var; import org.lodder.subtools.sublibrary.Language; /** - * Created by IntelliJ IDEA. - * User: lodder - * Date: 20/08/11 - * Time: 13:44 - * To change this template use Path | Settings | Path Templates. + * Created by IntelliJ IDEA. User: lodder Date: 20/08/11 Time: 13:44 To change this template use Path | Settings | Path + * Templates. */ -@Getter -@Setter @Builder public class PodnapisiSubtitleDescriptor { - private String subtitleId; - private Language language; - private String uploaderName; - // private String uploaderUid; - // private String matchRanking; - private String releaseString; - // private String subtitleRating; - private String url; - private boolean hearingImpaired; - private boolean isInexact; - private String year; - private String omdb; - private String imdb; + @var String subtitleId; + @var Language language; + @var String uploaderName; + // @var String uploaderUid; + // @var String matchRanking; + @var String releaseString; + // @var String subtitleRating; + @var String url; + @var boolean hearingImpaired; + @var boolean isInexact; + @var String year; + @var String omdb; + @var String imdb; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java index e2eaadf1..a452dc4d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/model/SubSceneSerieId.java @@ -2,16 +2,15 @@ import java.io.Serial; -import lombok.Getter; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.data.ProviderSerieId; -@Getter public class SubSceneSerieId extends ProviderSerieId { @Serial private static final long serialVersionUID = 5858875211782260667L; - private final int season; + @val int season; public SubSceneSerieId(String name, String id, int season) { super(name, id); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/model/TVsubtitlesSubtitleDescriptor.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/model/TVsubtitlesSubtitleDescriptor.java index 679728e8..2d65efff 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/model/TVsubtitlesSubtitleDescriptor.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/model/TVsubtitlesSubtitleDescriptor.java @@ -4,17 +4,16 @@ import java.io.Serializable; import lombok.Builder; -import lombok.Getter; +import manifold.ext.props.rt.api.val; -@Getter @Builder public class TVsubtitlesSubtitleDescriptor implements Serializable { @Serial private static final long serialVersionUID = 6423513286301479905L; - private final String filename; - private final String url; - private final String rip; - private final String author; + @val String filename; + @val String url; + @val String rip; + @val String author; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java index e35c37c0..b7351a72 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java @@ -16,10 +16,10 @@ import io.gsonfire.GsonFireBuilder; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.experimental.StandardException; import lombok.experimental.UtilityClass; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.gui.dialog.MappingEpisodeNameDialog.MappingType; @@ -40,27 +40,23 @@ public class ExportImport { private final UserInteractionHandler userInteractionHandler; private final Component parent; - @RequiredArgsConstructor - @Getter + @AllArgsConstructor public enum SettingsType { - PREFERENCES(FileType.XML), - SERIE_MAPPING(FileType.JSON); + PREFERENCES(FileType.XML), SERIE_MAPPING(FileType.JSON); - private final FileType fileType; + @val FileType fileType; } - @RequiredArgsConstructor - @Getter + @AllArgsConstructor private enum FileType { - XML(".xml", new XmlFileFilter()), - JSON(".json", new JsonFileFilter()); + XML(".xml", new XmlFileFilter()), JSON(".json", new JsonFileFilter()); - private final String extension; - private final ExtensionFileFilter fileFilter; + @val String extension; + @val ExtensionFileFilter fileFilter; } public void importSettings(SettingsType listType) { - chooseFile(listType.getFileType()).ifPresent(path -> { + chooseFile(listType.fileType).ifPresent(path -> { if (Files.notExists(path)) { userInteractionHandler.showMessage(Messages.getString("ImportExport.FileDoesNotExist"), Messages.getString("ImportExport.ErrorWhileImporting"), MessageSeverity.WARNING); @@ -68,15 +64,15 @@ public void importSettings(SettingsType listType) { } try { switch (listType) { - case PREFERENCES -> ExportImportPreferences.importSettings(path, userInteractionHandler, settingsControl); - case SERIE_MAPPING -> ExportImportSerieMapping.importSettings(path, userInteractionHandler, manager); + case PREFERENCES -> + ExportImportPreferences.importSettings(path, userInteractionHandler, settingsControl); + case SERIE_MAPPING -> + ExportImportSerieMapping.importSettings(path, userInteractionHandler, manager); default -> throw new IllegalArgumentException("Unexpected value: " + listType); } } catch (CorruptSettingsFileException e) { - userInteractionHandler.showMessage( - Messages.getString("ImportExport.ImportCorruptFile"), - Messages.getString("ImportExport.ErrorWhileImporting"), - MessageSeverity.ERROR); + userInteractionHandler.showMessage(Messages.getString("ImportExport.ImportCorruptFile"), + Messages.getString("ImportExport.ErrorWhileImporting"), MessageSeverity.ERROR); } catch (Exception e) { userInteractionHandler.showMessage(Messages.getString("ImportExport.ErrorWhileImporting"), Messages.getString("ImportExport.ErrorWhileImporting"), MessageSeverity.ERROR); @@ -85,9 +81,8 @@ public void importSettings(SettingsType listType) { } public void exportSettings(SettingsType listType) { - chooseFile(listType.getFileType()) - .map(path -> path.toString().endsWith(listType.getFileType().getExtension()) ? path - : path.getParent().resolve(path.getFileName().toString() + listType.getFileType().getExtension())) + chooseFile(listType.fileType).map(path -> path.toString().endsWith(listType.fileType.extension) ? path : + path.getParent().resolve(path.getFileName().toString() + listType.fileType.extension)) .ifPresent(path -> { try { switch (listType) { @@ -109,8 +104,8 @@ public void exportSettings(Path path, SettingsControl settingsControl) throws Ex settingsControl.exportPreferences(path); } - public void importSettings(Path path, UserInteractionHandler userInteractionHandler, SettingsControl settingsControl) - throws CorruptSettingsFileException { + public void importSettings(Path path, UserInteractionHandler userInteractionHandler, + SettingsControl settingsControl) throws CorruptSettingsFileException { try { settingsControl.importPreferences(path); } catch (IOException | BackingStoreException | InvalidPreferencesFormatException e) { @@ -130,16 +125,20 @@ public void exportSettings(Path path, Manager manager) throws IOException { .cacheType(CacheType.DISK) .keyFilter(k -> k.startsWith(selectionForKeyPrefix.keyPrefix())) .returnType(SerieMapping.class) - .getEntries().stream().map(pair -> new SeriemappingWithKey(pair.getKey(), pair.getValue()))) + .getEntries() + .stream() + .map(pair -> new SeriemappingWithKey(pair.getKey(), pair.getValue()))) .toList(); Files.writeString(path, new GsonBuilder().setPrettyPrinting().create().toJson(serieMappingsWithKey)); } - public void importSettings(Path path, UserInteractionHandler userInteractionHandler, Manager manager) throws CorruptSettingsFileException { + public void importSettings(Path path, UserInteractionHandler userInteractionHandler, Manager manager) + throws CorruptSettingsFileException { SeriemappingWithKey[] serieMappings; try { - serieMappings = new GsonFireBuilder().enableHooks(SerieMapping.class).createGson().fromJson(Files.readString(path), - SeriemappingWithKey[].class); + serieMappings = new GsonFireBuilder().enableHooks(SerieMapping.class) + .createGson() + .fromJson(Files.readString(path), SeriemappingWithKey[].class); } catch (IOException e) { throw new CorruptSettingsFileException(e); } @@ -153,11 +152,12 @@ public void importSettings(Path path, UserInteractionHandler userInteractionHand .keyFilter((String k) -> k.startsWith(selectionForKeyPrefix.keyPrefix())) .clear()); } - Arrays.stream(serieMappings).forEach(serieMapping -> manager.valueBuilder() - .cacheType(CacheType.DISK) - .key(serieMapping.key) - .value(serieMapping.serieMapping) - .store()); + Arrays.stream(serieMappings) + .forEach(serieMapping -> manager.valueBuilder() + .cacheType(CacheType.DISK) + .key(serieMapping.key) + .value(serieMapping.serieMapping) + .store()); }); } @@ -174,7 +174,7 @@ private Optional chooseFile(FileType fileType) { JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.FILES_ONLY); fc.setAcceptAllFileFilterUsed(false); - fc.setFileFilter(fileType.getFileFilter()); + fc.setFileFilter(fileType.fileFilter); int returnVal = fc.showOpenDialog(parent); if (returnVal == JFileChooser.APPROVE_OPTION) { return Optional.of(fc.getSelectedFile().toPath()); @@ -185,8 +185,8 @@ private Optional chooseFile(FileType fileType) { private static Optional getImportStyle(UserInteractionHandler userInteractionHandler) { return userInteractionHandler.choice(Arrays.asList(ImportStyle.values()), - Messages.getString("ImportExport.OverwriteOrAdd"), Messages.getString("ImportExport.OverwriteOrAddTitle"), - option -> switch (option) { + Messages.getString("ImportExport.OverwriteOrAdd"), + Messages.getString("ImportExport.OverwriteOrAddTitle"), option -> switch (option) { case OVERWRITE -> Messages.getString("ImportExport.Overwrite"); case APPEND -> Messages.getString("ImportExport.Add"); }); @@ -197,6 +197,5 @@ private enum ImportStyle { } @StandardException - private static class CorruptSettingsFileException extends Exception { - } + private static class CorruptSettingsFileException extends Exception {} } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java index 5ea9174b..9db27803 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchManager.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.workers; +import static manifold.ext.props.rt.api.PropOption.*; + import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; @@ -8,11 +10,12 @@ import java.util.Map.Entry; import java.util.Queue; -import lombok.Getter; import lombok.NonNull; -import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.set; +import manifold.ext.props.rt.api.val; +import manifold.ext.props.rt.api.var; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.gui.dialog.Cancelable; import org.lodder.subtools.multisubdownloader.lib.control.subtitles.sorting.ScoreCalculator; @@ -24,7 +27,6 @@ import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; -@RequiredArgsConstructor public class SearchManager implements Cancelable { public interface SearchManagerLanguage { @@ -46,7 +48,8 @@ public interface SearchManagerOnFound { @Setter @Accessors(fluent = true) public static class SearchManagerBuilder - implements SearchManagerOnFound, SearchManagerUserInteractionHandler, SearchManagerProgressListener, SearchManagerLanguage { + implements SearchManagerOnFound, SearchManagerUserInteractionHandler, SearchManagerProgressListener, + SearchManagerLanguage { private Settings settings; private Language language; private SearchProgressListener progressListener; @@ -62,16 +65,22 @@ public SearchManager onFound(SearchHandler onFound) { private final Map workers = new HashMap<>(); private final Map scoreCalculators = new HashMap<>(); private final Settings settings; - @Getter - private int progress = 0; + @var @set(Private) int progress = 0; private int totalJobs; private final SearchHandler onFound; - @Getter - private final Language language; + @val Language language; private final SearchProgressListener progressListener; - @Getter - private final UserInteractionHandler userInteractionHandler; + @val UserInteractionHandler userInteractionHandler; + + public SearchManager(Settings settings, SearchHandler onFound, Language language, + SearchProgressListener progressListener, UserInteractionHandler userInteractionHandler) { + this.settings = settings; + this.onFound = onFound; + this.language = language; + this.progressListener = progressListener; + this.userInteractionHandler = userInteractionHandler; + } public static SearchManagerLanguage createWithSettings(Settings settings) { return new SearchManagerBuilder().settings(settings); @@ -115,7 +124,7 @@ public void onCompleted(SearchWorker worker) { synchronized (this) { calculateProgress(); /* Tell the progress listener our total progress */ - this.progressListener.progress(this.getProgress()); + this.progressListener.progress(this.progress); } onFound.onFound(release, subtitles); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java index 261b6868..8e333cdd 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/workers/SearchWorker.java @@ -28,7 +28,7 @@ public SearchWorker(SubtitleProvider provider, SearchManager scheduler) { @Override public void run() { - Language language = this.scheduler.getLanguage(); + Language language = this.scheduler.language; this.busy = false; try { while (!this.isInterrupted()) { @@ -48,7 +48,8 @@ public void run() { this.subtitles = Set.copyOf(subtitles); this.busy = false; - LOGGER.debug("[Search] {} found {} subtitles for {} ", this.provider.getName(), subtitles.size(), release); + LOGGER.debug("[Search] {} found {} subtitles for {} ", this.provider.getName(), subtitles.size(), + release); if (!this.isInterrupted()) { this.scheduler.onCompleted(this); From b607834c0a99fbb88906a188daec3318e1aa19ea Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 15:24:29 +0100 Subject: [PATCH 23/54] changes --- .../subtools/multisubdownloader/GUI.java | 2 +- .../UserInteractionHandler.java | 8 +- .../gui/dialog/MappingEpisodeNameDialog.java | 10 +- .../lodder/subtools/sublibrary/Language.java | 20 ++-- .../lodder/subtools/sublibrary/Manager.java | 27 +++--- .../lodder/subtools/sublibrary/OsCheck.java | 18 ++-- .../sublibrary/cache/CacheObject.java | 12 ++- .../subtools/sublibrary/cache/DiskCache.java | 2 +- .../sublibrary/control/VideoPatterns.java | 96 +++++++++++-------- .../data/UserInteractionSettingsIntf.java | 13 +-- .../sublibrary/data/imdb/ImdbAdapter.java | 2 +- .../data/omdb/model/OmdbDetails.java | 1 + .../sublibrary/data/tvdb/TheTvdbAdapter.java | 5 +- .../sublibrary/data/tvdb/TheTvdbApi.java | 27 ++++-- .../SubtitlesProviderInitException.java | 1 + .../sublibrary/model/MovieRelease.java | 5 +- .../sublibrary/model/SubtitleSource.java | 5 +- .../sublibrary/model/VideoSearchType.java | 9 +- .../settings/model/SerieMapping.java | 30 +++--- .../UserInteractionHandler.java | 6 +- .../UserInteractionHandlerCLI.java | 32 +++++-- .../UserInteractionHandlerGUI.java | 40 +++++--- .../sublibrary/util/ArrayExtension.java | 13 --- .../util/filefilter/ExtensionFileFilter.java | 10 +- .../util/filefilter/JsonFileFilter.java | 14 +-- .../util/filefilter/XmlFileFilter.java | 14 +-- .../sublibrary/util/http/HttpClient.java | 20 ++-- 27 files changed, 242 insertions(+), 200 deletions(-) delete mode 100644 SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/ArrayExtension.java diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index 06fd30cf..068419b8 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -443,7 +443,7 @@ private void downloadText() { if (!subtitle.fileName.endsWith(".srt")) { filename = subtitle.fileName + ".srt"; } - if (OsCheck.getOperatingSystemType() == OSType.Windows) { + if (OsCheck.getOperatingSystemType() == OSType.WINDOWS) { filename = filename.removeIllegalWindowsChars(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java index 94c02e85..8f6ca21c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandler.java @@ -8,12 +8,12 @@ public interface UserInteractionHandler extends org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler { default List getAutomaticSelection(List subtitles) { - List shortlist = !getSettings().isOptionsMinAutomaticSelection ? subtitles : + List shortlist = !settings.optionsMinAutomaticSelection ? subtitles : subtitles.stream() - .filter(subtitle -> subtitle.score >= getSettings().optionsMinAutomaticSelectionValue) + .filter(subtitle -> subtitle.score >= settings.optionsMinAutomaticSelectionValue) .toList(); - if (getSettings().isOptionsDefaultSelection) { - List defaultSelectionsFound = getSettings().optionsDefaultSelectionQualityList.stream() + if (settings.optionsDefaultSelection) { + List defaultSelectionsFound = settings.optionsDefaultSelectionQualityList.stream() .flatMap(q -> shortlist.stream().filter(subtitle -> q.isTypeForValue(subtitle.quality))) .distinct().toList(); if (!defaultSelectionsFound.isEmpty()) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index 2d2a75c6..224b818d 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -162,10 +162,10 @@ void setMappingType(MappingType mappingType) { .stream() .map(serieMappingPair -> { SerieMapping serieMapping = serieMappingPair.getValue(); - String name = serieMapping.getName(); + String name = serieMapping.name; String providerId = - serieMapping.getProviderId() == null ? "" : serieMapping.getProviderId(); - String providerName = serieMapping.getProviderName(); + serieMapping.providerId == null ? "" : serieMapping.providerId; + String providerName = serieMapping.providerName; if (providerId.contains("/")) { providerId = providerId.substring(providerId.lastIndexOf("/") + 1); } @@ -174,8 +174,8 @@ void setMappingType(MappingType mappingType) { selectionForKeyPrefix); })) .sorted(Comparator.comparing( - row -> row.serieMapping == null || row.serieMapping.getProviderName() == null ? "zzz" : - row.serieMapping.getName())) + row -> row.serieMapping == null || row.serieMapping.providerName == null ? "zzz" : + row.serieMapping.name)) .forEach(this::addRow); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Language.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Language.java index 76d9c690..d2e5e1cd 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Language.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Language.java @@ -5,11 +5,10 @@ import java.util.Set; import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum Language { ALBANIAN("App.Language.Albanian", "sq", Set.of("alb", "sq", "Albanian")), @@ -74,12 +73,15 @@ public enum Language { VIETNAMESE("App.Language.Vietnamese", "vi", Set.of("vie", "Vietnamese")), WELSH("App.Language.Welsh", "cy", Set.of("wel", "cym", "Welsh")); - private final String msgCode; - private final String langCode; - private final Set langCodesOther; + @val String msgCode; + @val String langCode; + @val Set langCodesOther; public static Language fromValue(String value) { - return Arrays.stream(Language.values()).filter(lang -> lang.name().equalsIgnoreCase(value)).findAny().orElseThrow(); + return Arrays.stream(Language.values()) + .filter(lang -> lang.name().equalsIgnoreCase(value)) + .findAny() + .orElseThrow(); } public static Optional fromValueOptional(String value) { @@ -87,7 +89,7 @@ public static Optional fromValueOptional(String value) { } public static Optional fromIdOptional(String languageId) { - return Arrays.stream(Language.values()).filter(lang -> lang.getLangCode().equalsIgnoreCase(languageId)).findAny(); + return Arrays.stream(Language.values()).filter(lang -> lang.langCode.equalsIgnoreCase(languageId)).findAny(); } public static Language fromId(String languageId) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java index 00e16076..430e065d 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java @@ -18,14 +18,16 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.OptionalLong; -import java.util.function.Function; +import java.util.function.LongUnaryOperator; import java.util.function.Predicate; import com.pivovarit.function.ThrowingSupplier; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.val; import name.falgout.jeffrey.throwing.Nothing; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -43,13 +45,12 @@ import org.lodder.subtools.sublibrary.xml.XMLHelper; import org.w3c.dom.Document; -@Setter -@RequiredArgsConstructor +@AllArgsConstructor public class Manager { - private final HttpClient httpClient; - private final InMemoryCache inMemoryCache; - private final DiskCache diskCache; + @val HttpClient httpClient; + @val InMemoryCache inMemoryCache; + @val DiskCache diskCache; public boolean store(String downloadLink, Path file) throws ManagerException { try { @@ -433,7 +434,7 @@ public interface ValueBuilderGetValueStoreTempValueTtlIntf { ValueBuilderGetValueIntf timeToLive(long seconds); - ValueBuilderGetValueIntf timeToLiveFunction(Function timeToLiveFunction); + ValueBuilderGetValueIntf timeToLiveFunction(LongUnaryOperator timeToLiveFunction); } public interface ValueBuilderGetValueIntf extends ValueBuilderStoreIntf { @@ -449,7 +450,7 @@ public interface ValueBuilderGetOptionalStoreTempValueTtlIntf { ValueBuilderGetOptionalIntf timeToLive(long seconds); - ValueBuilderGetOptionalIntf timeToLiveFunction(Function timeToLiveFunction); + ValueBuilderGetOptionalIntf timeToLiveFunction(LongUnaryOperator timeToLiveFunction); } public interface ValueBuilderGetOptionalIntf extends ValueBuilderStoreIntf { @@ -467,7 +468,7 @@ public interface ValueBuilderGetOptionalIntStoreTempValueTtlIntf { ValueBuilderGetOptionalIntIntf timeToLive(long seconds); - ValueBuilderGetOptionalIntIntf timeToLiveFunction(Function timeToLiveFunction); + ValueBuilderGetOptionalIntIntf timeToLiveFunction(LongUnaryOperator timeToLiveFunction); } public interface ValueBuilderGetOptionalIntIntf extends ValueBuilderStoreIntf { @@ -483,7 +484,7 @@ public interface ValueBuilderGetOptionalIntIntf extends Val // extends ValueBuilderGetCollectionIntf { // ValueBuilderGetCollectionIntf timeToLive(long seconds); // - // ValueBuilderGetCollectionIntf timeToLiveFunction(Function timeToLiveFunction); + // ValueBuilderGetCollectionIntf timeToLiveFunction(LongUnaryOperator timeToLiveFunction); // } public interface ValueBuilderGetCollectionIntf, T, X extends Exception> @@ -530,11 +531,11 @@ public static class ValueBuilder, T, X extends Exception private Predicate keyFilter; @Setter(value = AccessLevel.NONE) private Long timeToLive; @Setter(value = AccessLevel.NONE) private boolean storeTempNullValue; - private Function timeToLiveFunction; + private LongUnaryOperator timeToLiveFunction; // // @Override - // public ValueBuilder timeToLiveFunction(Function timeToLiveFunction) { + // public ValueBuilder timeToLiveFunction(LongUnaryOperator timeToLiveFunction) { // this.timeToLiveFunction = timeToLiveFunction; // return this; // } @@ -932,7 +933,7 @@ private V executeSupplier(ThrowingSupplier supplier) throws X { private long calculateTtl() { return getTemporaryTimeToLive().mapToObj( - v -> timeToLiveFunction != null ? timeToLiveFunction.apply(v) : v * 2) + v -> timeToLiveFunction != null ? timeToLiveFunction.applyAsLong(v) : v * 2) .orElseGet(() -> timeToLive != null ? timeToLive : MILLISECONDS.convert(1, DAYS)); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/OsCheck.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/OsCheck.java index 9dcbaa81..901a2f16 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/OsCheck.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/OsCheck.java @@ -16,7 +16,7 @@ public final class OsCheck { * types of Operating Systems */ public enum OSType { - Windows, MacOS, Linux, Other + WINDOWS, MAC, LINUX, OTHER } // cached result of OS detection @@ -29,15 +29,15 @@ public enum OSType { */ public static OSType getOperatingSystemType() { if (detectedOS == null) { - String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH); - if (OS.contains("mac") || OS.contains("darwin")) { - detectedOS = OSType.MacOS; - } else if (OS.contains("win")) { - detectedOS = OSType.Windows; - } else if (OS.contains("nux")) { - detectedOS = OSType.Linux; + String os = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH); + if (os.contains("mac") || os.contains("darwin")) { + detectedOS = OSType.MAC; + } else if (os.contains("win")) { + detectedOS = OSType.WINDOWS; + } else if (os.contains("nux")) { + detectedOS = OSType.LINUX; } else { - detectedOS = OSType.Other; + detectedOS = OSType.OTHER; } } return detectedOS; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/CacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/CacheObject.java index a3d639b4..cee86234 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/CacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/CacheObject.java @@ -3,11 +3,13 @@ import java.util.Optional; import java.util.function.Function; -public interface CacheObject { +import manifold.ext.props.rt.api.val; - long getCreated(); +public interface CacheObject { - T getValue(); + @val long created; + @val T value; + @val long age; void updateLastAccessed(); @@ -20,12 +22,12 @@ static CacheObject fromString(String string, Function valueToO if (cacheObject.isPresent()) { return cacheObject.get(); } - Optional> temporaryCacheObject = TemporaryCacheObject.fromString(string, valueToObjectMapper); + Optional> temporaryCacheObject = + TemporaryCacheObject.fromString(string, valueToObjectMapper); if (temporaryCacheObject.isPresent()) { return temporaryCacheObject.get(); } throw new IllegalStateException("Could not parse value: " + string); } - long getAge(); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java index 32f10380..7d3f5547 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/DiskCache.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public sealed abstract class DiskCache extends Cache permits SerializableDiskCache, TypedDiskCache { +public abstract sealed class DiskCache extends Cache permits SerializableDiskCache, TypedDiskCache { private static final Logger LOGGER = LoggerFactory.getLogger(DiskCache.class); private static final Object LOCK = new Object(); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java index 6d974e08..b3050ab6 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java @@ -9,9 +9,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; import lombok.experimental.UtilityClass; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.util.NamedPattern; @UtilityClass @@ -20,27 +20,25 @@ public class VideoPatterns { public interface VideoPatternEnumIntf { } - @Getter - @RequiredArgsConstructor + @AllArgsConstructor public enum Quality implements VideoPatternEnumIntf { Q1080P("1080p"), Q1080I("1080i"), Q720P("720p"), Q480P("480p"); - private final String value; + @val String value; public static Stream getValuesStream() { return Arrays.stream(Quality.values()).map(Quality::getValue); } } - @Getter public enum VideoEncoding implements VideoPatternEnumIntf { X264("x264", "h264"), X265("x265", "h265"); - private final String[] values; + @val String[] values; VideoEncoding(String... values) { this.values = values; @@ -51,11 +49,10 @@ public static Stream getValuesStream() { } } - @Getter public enum AudioEncoding implements VideoPatternEnumIntf { DD5_1("dd5.1", "dd5-1"); - private final String[] values; + @val String[] values; AudioEncoding(String... values) { this.values = values; @@ -66,7 +63,6 @@ public static Stream getValuesStream() { } } - @Getter public enum Source implements VideoPatternEnumIntf { HDTV(false, "hdtv"), DVDRIP(false, "dvdrip"), @@ -87,11 +83,12 @@ public enum Source implements VideoPatternEnumIntf { static final Map VALUE_MAP = new HashMap<>(); static { - Arrays.stream(Source.values()).forEach(source -> Arrays.stream(source.getValues()).forEach(value -> VALUE_MAP.put(value, source))); + Arrays.stream(Source.values()) + .forEach(source -> Arrays.stream(source.values).forEach(value -> VALUE_MAP.put(value, source))); } - final boolean manyDifferentSources; - final String[] values; + @val boolean manyDifferentSources; + @val String[] values; Source(boolean manyDifferentSources, String... values) { this.manyDifferentSources = manyDifferentSources; @@ -107,7 +104,7 @@ public static Source fromValue(String value) { } public boolean isTypeForValue(String value) { - return Arrays.stream(getValues()).map(String::toLowerCase).anyMatch(value::equals); + return Arrays.stream(values).map(String::toLowerCase).anyMatch(value::equals); } @Override @@ -116,8 +113,7 @@ public String toString() { } } - @Getter - @RequiredArgsConstructor + @AllArgsConstructor public enum VideoExtensions { MKV("mkv"), MP4("mp4"), @@ -126,7 +122,7 @@ public enum VideoExtensions { TS("ts"), M4V("m4v"); - private final String value; + @val String value; } private static final Set QUALITY_KEYWORDS_SET = Set.of("hdtv", "dvdrip", "bluray", @@ -141,45 +137,64 @@ public enum VideoExtensions { private static final String[] PATTERNS = { // example: // Back.to.the.Future.Part.II.1989.720p.BluRay.X264-AMIABLE.mkv - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[I|V|X]+)[. ](?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[I|V|X]+)[. ]" + + "(?19\\d{2}|20\\d{2})" + "(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[I|V|X]+)[. ](?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[I|V|X]+)[. ]" + + "(?19\\d{2}|20\\d{2})" + "(?['\\w\\s:&()!.,_-]+)", // The.Hunger.Games.Mockingjay.Part.1..2014.720p.BluRay.x264-SPARKS.mkv - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1})[. ](?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1})[. ]" + + "(?19\\d{2}|20\\d{2})" + "(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1})[. ](?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1})[. ]" + + "(?19\\d{2}|20\\d{2})" + "(?['\\w\\s:&()!.,_-]+)", // serie - "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})" + - "(?[XxEe][\\d]{1,2})*[XxEe](?[\\d]{1,2})(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,3})(?['\\w\\s:&()" + + "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}" + + "(?[\\d]{1,2})" + + "(?[XxEe][\\d]{1,2})*[XxEe](?[\\d]{1,2})(?['\\w\\s:&()!.," + + "_-]+)", + "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1," + + "3})(?['\\w\\s:&()" + "!.,_-]+)", // sXeX - Serienaam - Titel ex: S04E02 - White Collar - Most Wanted.mkv - "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})(?[XxEe][\\d]{1,2})*[XxEe]" + - "(?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)", - "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+" + + "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})" + + "(?[XxEe][\\d]{1,2})*[XxEe]" + + "(?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+" + + "(?['\\w\\s:&()!.,_]+)", + "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})\\s?+-?\\s?+" + + "(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+" + "(?['\\w\\s:&()!.,_]+)", // example: hawaii.five-0.2010.410.hdtv-lol.mp4 // example: // Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[I|V|X]+)(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[I|V|X]+)(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1,2})(?['\\w\\s:&()!.,_-]+)", - "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1,2})(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[I|V|X]+)" + + "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[I|V|X]+)" + + "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1,2})" + + "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1,2})" + + "(?['\\w\\s:&()!.,_-]+)", // example hawaii.five-0.2010.410.hdtv-lol.mp4 - "(?['\\w\\s:&()!.,_-]+)[. ](?19\\d{2}|20\\d{2})[. ](?[\\d]{3,4})[. ](?['\\w\\s:&()!.," + + "(?['\\w\\s:&()!.,_-]+)[. ](?19\\d{2}|20\\d{2})[. ](?[\\d]{3,4})[. ]" + + "(?['\\w\\s:&()!.," + "_-]+)", // format movietitle.year - "(?['\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}(?19\\d{2}|20\\d{2})(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}(?19\\d{2}|20\\d{2})(?['\\w\\s:&()" + + "!.,_-]+)", // format episode.0101.title // format episode.101.title // exclude format movietitle.720p - "(?['\\w\\s:&()!.,_-]+)[. ](?[\\d]{3,4})[. ](?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)[. ](?[\\d]{3,4})[. ](?['\\w\\s:&()!.," + + "_-]+)", // format (2-11) Joey and the High School Friend - "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ ]and(?['\\w\\s:&()!" + + "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ " + + "]and(?['\\w\\s:&()!" + ".,_-]+)", - "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ ]And(?['\\w\\s:&()!" + + "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ " + + "]And(?['\\w\\s:&()!" + ".,_-]+)", // take the rest and treat as movie "(?['\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}[720P|1080P](?['\\w\\s:&()!.,_-]+)" @@ -191,11 +206,14 @@ public enum VideoExtensions { public static final List QUALITY_KEYWORDS = List.of(); // Stream.concat(QUALITY_KEYWORDS_SET.stream(), - // new Generex(QUALITY_KEYWORDS_REGEX_SET.stream().collect(Collectors.joining("|"))).getAllMatchedStrings().stream()).toList(); + // new Generex(QUALITY_KEYWORDS_REGEX_SET.stream().collect(Collectors.joining("|"))).getAllMatchedStrings() + // .stream()).toList(); private static final String QUALITY_KEYWORDS_REGEX = - Stream.concat(QUALITY_KEYWORDS_SET.stream(), QUALITY_KEYWORDS_REGEX_SET.stream()).collect(Collectors.joining("|", "(", ")")); + Stream.concat(QUALITY_KEYWORDS_SET.stream(), QUALITY_KEYWORDS_REGEX_SET.stream()) + .collect(Collectors.joining("|", "(", ")")); - public static final Pattern QUALITY_KEYWORDS_REGEX_PATTERN = Pattern.compile(QUALITY_KEYWORDS_REGEX, Pattern.CASE_INSENSITIVE); + public static final Pattern QUALITY_KEYWORDS_REGEX_PATTERN = + Pattern.compile(QUALITY_KEYWORDS_REGEX, Pattern.CASE_INSENSITIVE); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettingsIntf.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettingsIntf.java index b44a1cf3..c2d57d4c 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettingsIntf.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/UserInteractionSettingsIntf.java @@ -2,19 +2,20 @@ import java.util.List; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.control.VideoPatterns.Source; public interface UserInteractionSettingsIntf { - boolean isOptionsAlwaysConfirm(); + @val boolean optionsAlwaysConfirm; - boolean isOptionsMinAutomaticSelection(); + @val boolean optionsMinAutomaticSelection; - int getOptionsMinAutomaticSelectionValue(); + @val int optionsMinAutomaticSelectionValue; - boolean isOptionsDefaultSelection(); + @val boolean optionsDefaultSelection; - List getOptionsDefaultSelectionQualityList(); + @val List optionsDefaultSelectionQualityList; - boolean isOptionsConfirmProviderMapping(); + @val boolean optionsConfirmProviderMapping; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java index 1e7242fc..6b899d7a 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java @@ -105,7 +105,7 @@ private OptionalInt getImdbIdCommon(String title, Integer year, e.getMessage()), e); return OptionalInt.empty(); } - if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping && providerSerieIds.size() == 1) { + if (!userInteractionHandler.getSettings().optionsConfirmProviderMapping && providerSerieIds.size() == 1) { // found single exact match return OptionalInt.of(Integer.parseInt(providerSerieIds.iterator().next().id)); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java index 6122a643..5385f809 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java @@ -11,6 +11,7 @@ public class OmdbDetails implements ReleaseDBIntf, Serializable { @Serial private static final long serialVersionUID = 7701770682134890544L; + @val String title; @val int year; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index 7738e6ff..70a66a21 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -10,8 +10,6 @@ import java.util.OptionalInt; import java.util.concurrent.TimeUnit; -import lombok.AccessLevel; -import lombok.Getter; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.Manager; @@ -28,7 +26,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Getter(value = AccessLevel.PROTECTED) public class TheTvdbAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(TheTvdbAdapter.class); @@ -75,7 +72,7 @@ public Optional getSerie(String serieName) { } if (serieIds.isEmpty()) { tvdbSerie = Optional.empty(); - } else if (!userInteractionHandler.getSettings().isOptionsConfirmProviderMapping && serieIds.size() == 1) { + } else if (!userInteractionHandler.getSettings().optionsConfirmProviderMapping && serieIds.size() == 1) { tvdbSerie = Optional.of(serieIds.first); } else { String formattedSerieName = serieName.replaceAll("[^A-Za-z]", ""); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java index f4372f33..f0e63e49 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java @@ -12,8 +12,6 @@ import com.uwetrottmann.thetvdb.entities.Series; import com.uwetrottmann.thetvdb.entities.SeriesResponse; import com.uwetrottmann.thetvdb.entities.SeriesResultsResponse; -import lombok.AccessLevel; -import lombok.Getter; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.tvdb.exception.TheTvdbException; @@ -23,7 +21,6 @@ public class TheTvdbApi { - @Getter(value = AccessLevel.PRIVATE) private final Manager manager; private final TheTvdb theTvdb; @@ -37,13 +34,18 @@ public List getSeries(String serieName, Language language) throws .memoryCache() .key("TVDB-series-$serieName-$language") .collectionSupplier(TheTvdbSerie.class, () -> { - String encodedSerieName = URLEncoder.encode(serieName.toLowerCase().replace(" ", "-"), StandardCharsets.UTF_8); + String encodedSerieName = + URLEncoder.encode(serieName.toLowerCase().replace(" ", "-"), StandardCharsets.UTF_8); try { Response response = - theTvdb.search().series(encodedSerieName, null, null, null, language == null ? null : language.getLangCode()) + theTvdb.search() + .series(encodedSerieName, null, null, null, + language == null ? null : language.getLangCode()) .execute(); if (response.isSuccessful()) { - return response.body().data.stream().map(series -> seriesToTVDBSerie(series, language)).toList(); + return response.body().data.stream() + .map(series -> seriesToTVDBSerie(series, language)) + .toList(); } return List.of(); } catch (IOException e) { @@ -67,20 +69,25 @@ public Optional getSerie(int tvdbId, Language language) throws The } } - public Optional getEpisode(int tvdbId, int season, int episode, Language language) throws TheTvdbException { + public Optional getEpisode(int tvdbId, int season, int episode, Language language) + throws TheTvdbException { return manager.valueBuilder() .memoryCache() .key("TVDB-episode-$tvdbId-$season-$episode-$language") .optionalSupplier(() -> { try { Response response = - theTvdb.series().episodesQuery(tvdbId, null, season, episode, null, null, null, null, null, - language == null ? null : language.getLangCode()).execute(); + theTvdb.series() + .episodesQuery(tvdbId, null, season, episode, null, null, null, null, null, + language == null ? null : language.getLangCode()) + .execute(); if (response.isSuccessful()) { if (response.body().data == null) { return Optional.empty(); } - return response.body().data.stream().map(serie -> episodeToTVDBEpisode(serie, language)).findFirst(); + return response.body().data.stream() + .map(serie -> episodeToTVDBEpisode(serie, language)) + .findFirst(); } throw new TheTvdbException(response.errorBody().string()); } catch (IOException e) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/SubtitlesProviderInitException.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/SubtitlesProviderInitException.java index 9b138527..d0bfb28f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/SubtitlesProviderInitException.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/SubtitlesProviderInitException.java @@ -8,6 +8,7 @@ public class SubtitlesProviderInitException extends RuntimeException { @Serial private static final long serialVersionUID = -2959483164333075297L; + @val String providerName; public SubtitlesProviderInitException(String providerName, Throwable e) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java index 3680e7c6..45e06e09 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java @@ -5,14 +5,15 @@ import lombok.Setter; import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.set; import manifold.ext.props.rt.api.var; public final class MovieRelease extends Release { @var String name; @var Integer year; - @Setter private int imdbId; - @Setter private int tvdbId; + @set int imdbId; + @set int tvdbId; public interface MovieReleaseBuilderName { MovieReleaseBuilderOther name(String name); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/SubtitleSource.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/SubtitleSource.java index af89b0fc..e59d405a 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/SubtitleSource.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/SubtitleSource.java @@ -1,10 +1,9 @@ package org.lodder.subtools.sublibrary.model; import lombok.AllArgsConstructor; -import lombok.Getter; +import manifold.ext.props.rt.api.val; @AllArgsConstructor -@Getter public enum SubtitleSource { OPENSUBTITLES("OpenSubtitles"), PODNAPISI("Podnapisi"), @@ -13,5 +12,5 @@ public enum SubtitleSource { LOCAL("Local"), SUBSCENE("Subscene"); - private final String name; + @val String name; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/VideoSearchType.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/VideoSearchType.java index cf0c0b71..e5cdca6f 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/VideoSearchType.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/VideoSearchType.java @@ -1,14 +1,13 @@ package org.lodder.subtools.sublibrary.model; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; -@Getter -@RequiredArgsConstructor +@AllArgsConstructor public enum VideoSearchType { EPISODE("App.Episode"), MOVIE("App.Movie"), RELEASE("App.Release"); - private final String msgCode; + @val String msgCode; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/settings/model/SerieMapping.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/settings/model/SerieMapping.java index 4fe8b314..6cd82a52 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/settings/model/SerieMapping.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/settings/model/SerieMapping.java @@ -2,24 +2,24 @@ import java.io.Serial; import java.io.Serializable; -import java.util.function.Function; +import java.util.function.UnaryOperator; import io.gsonfire.annotations.PostDeserialize; -import lombok.Getter; import lombok.ToString; +import manifold.ext.props.rt.api.val; +import manifold.ext.props.rt.api.var; -@Getter @ToString public class SerieMapping implements Serializable { // implements SerieMappingIntf { @Serial private static final long serialVersionUID = 6551798252915028805L; - private static final Function NAME_FORMATTER = name -> name.replaceAll("[^A-Za-z]", ""); - private final String name; - private final String providerId; - private final String providerName; - private final int season; - private transient String formattedName; + private static final UnaryOperator NAME_FORMATTER = n -> n.replaceAll("[^A-Za-z]", ""); + @val String name; + @val String providerId; + @val String providerName; + @val int season; + @var transient String formattedName; public SerieMapping(String name, int providerId, String providerName) { this(name, providerId, providerName, 0); @@ -39,11 +39,7 @@ public SerieMapping(String name, String providerId, String providerName, int sea @PostDeserialize public void postDeserializeLogic() { - formattedName = getName().replaceAll("[^A-Za-z]", ""); - } - - public static Function getNameFormatter() { - return NAME_FORMATTER; + formattedName = name.replaceAll("[^A-Za-z]", ""); } public static String formatName(String name) { @@ -52,11 +48,11 @@ public static String formatName(String name) { public boolean matches(String serieName) { String serieNameFormatted = formatName(serieName); - return getFormattedName().contains(serieNameFormatted) - || (serieNameFormatted.contains(getFormattedName()) && getFormattedName().length() > 3); + return formattedName.contains(serieNameFormatted) + || (serieNameFormatted.contains(formattedName) && formattedName.length() > 3); } public boolean exactMatch(String serieName) { - return getFormattedName().equalsIgnoreCase(formatName(serieName)); + return formattedName.equalsIgnoreCase(formatName(serieName)); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandler.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandler.java index 1b874ac7..7c10bced 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandler.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandler.java @@ -5,17 +5,19 @@ import java.util.function.Function; import java.util.function.Predicate; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.data.UserInteractionSettingsIntf; public interface UserInteractionHandler { - UserInteractionSettingsIntf getSettings(); + @val UserInteractionSettingsIntf settings; boolean confirm(String message, String title); Optional selectFromList(Collection options, String message, String title); - Optional selectFromList(Collection options, String message, String title, Function toStringMapper); + Optional selectFromList(Collection options, String message, String title, + Function toStringMapper); Optional choice(Collection options, String message, String title); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerCLI.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerCLI.java index 066e55fb..b27e9cea 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerCLI.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerCLI.java @@ -5,8 +5,8 @@ import java.util.function.Function; import java.util.function.Predicate; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.codehaus.plexus.components.interactivity.DefaultPrompter; import org.codehaus.plexus.components.interactivity.Prompter; import org.lodder.subtools.sublibrary.data.UserInteractionSettingsIntf; @@ -14,12 +14,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Getter -@RequiredArgsConstructor public class UserInteractionHandlerCLI implements UserInteractionHandler { private static final Logger LOGGER = LoggerFactory.getLogger(UserInteractionHandlerCLI.class); - private final Prompter prompter = new DefaultPrompter(); - private final UserInteractionSettingsIntf settings; + @val Prompter prompter = new DefaultPrompter(); + @val @override UserInteractionSettingsIntf settings; + + public UserInteractionHandlerCLI(UserInteractionSettingsIntf settings) { + this.settings = settings; + } @Override public Optional selectFromList(Collection options, String message, String title) { @@ -27,8 +29,13 @@ public Optional selectFromList(Collection options, String messag } @Override - public Optional selectFromList(Collection options, String message, String title, Function toStringMapper) { - return PrompterUtil.getElementFromList(options).toStringMapper(toStringMapper).message(message).includeNull().prompt(prompter); + public Optional selectFromList(Collection options, String message, String title, + Function toStringMapper) { + return PrompterUtil.getElementFromList(options) + .toStringMapper(toStringMapper) + .message(message) + .includeNull() + .prompt(prompter); } @Override @@ -37,7 +44,8 @@ public Optional choice(Collection options, String message, String titl } @Override - public Optional choice(Collection options, String message, String title, Function toStringMapper) { + public Optional choice(Collection options, String message, String title, + Function toStringMapper) { return selectFromList(options, message, title, toStringMapper); } @@ -48,7 +56,11 @@ public boolean confirm(String message, String title) { @Override public Optional enter(String title, String message, String errorMessage, Predicate validator) { - return PrompterUtil.getString().message(message).errorMessage(errorMessage).objectValidator(validator).prompt(prompter); + return PrompterUtil.getString() + .message(message) + .errorMessage(errorMessage) + .objectValidator(validator) + .prompt(prompter); } @Override diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerGUI.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerGUI.java index 8865fd5e..897f2856 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerGUI.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/userinteraction/UserInteractionHandlerGUI.java @@ -7,18 +7,18 @@ import java.util.function.Function; import java.util.function.Predicate; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.data.UserInteractionSettingsIntf; import org.lodder.subtools.sublibrary.gui.InputPane; import org.lodder.subtools.sublibrary.gui.OptionsPane; -@Getter -@RequiredArgsConstructor +@AllArgsConstructor public class UserInteractionHandlerGUI implements UserInteractionHandler { - private final UserInteractionSettingsIntf settings; - private final JFrame frame; + @val @override UserInteractionSettingsIntf settings; + @val JFrame frame; @Override public Optional selectFromList(Collection options, String message, String title) { @@ -26,11 +26,18 @@ public Optional selectFromList(Collection options, String messag } @Override - public Optional selectFromList(Collection options, String message, String title, Function toStringMapper) { + public Optional selectFromList(Collection options, String message, String title, + Function toStringMapper) { if (options.isEmpty()) { return Optional.empty(); } - return OptionsPane.options(options).toStringMapper(toStringMapper).title(title).message(message).defaultOption().parent(frame).prompt(); + return OptionsPane.options(options) + .toStringMapper(toStringMapper) + .title(title) + .message(message) + .defaultOption() + .parent(frame) + .prompt(); } @Override @@ -39,10 +46,14 @@ public Optional choice(Collection options, String message, String titl } @Override - public Optional choice(Collection options, String message, String title, Function toStringMapper) { - String[] optionsAsStrings = options.stream().map(Objects.requireNonNullElseGet(toStringMapper, () -> String::valueOf)).toArray(String[]::new); + public Optional choice(Collection options, String message, String title, + Function toStringMapper) { + String[] optionsAsStrings = options.stream() + .map(Objects.requireNonNullElseGet(toStringMapper, () -> String::valueOf)) + .toArray(String[]::new); int selection = - JOptionPane.showOptionDialog(frame, message, title, JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, optionsAsStrings, + JOptionPane.showOptionDialog(frame, message, title, JOptionPane.DEFAULT_OPTION, + JOptionPane.QUESTION_MESSAGE, null, optionsAsStrings, optionsAsStrings[0]); return selection == JOptionPane.CLOSED_OPTION ? Optional.empty() : options.stream().skip(selection).findFirst(); } @@ -55,7 +66,12 @@ public boolean confirm(String message, String title) { @Override public Optional enter(String title, String message, String errorMessage, Predicate validator) { - return InputPane.create().title(title).message(message).errorMessage(errorMessage).validator(validator).prompt(); + return InputPane.create() + .title(title) + .message(message) + .errorMessage(errorMessage) + .validator(validator) + .prompt(); } public void message(String message, String title) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/ArrayExtension.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/ArrayExtension.java deleted file mode 100644 index 32db7528..00000000 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/ArrayExtension.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.lodder.subtools.sublibrary.util; - -import java.util.Arrays; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class ArrayExtension { - - public boolean contains(T[] array, T value) { - return Arrays.asList(array).contains(value); - } -} diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/ExtensionFileFilter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/ExtensionFileFilter.java index 118f9652..39994148 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/ExtensionFileFilter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/ExtensionFileFilter.java @@ -3,12 +3,14 @@ import javax.swing.filechooser.*; import java.io.File; -public abstract class ExtensionFileFilter extends FileFilter { +import manifold.ext.props.rt.api.val; + +public abstract sealed class ExtensionFileFilter extends FileFilter permits JsonFileFilter, XmlFileFilter { + + @val abstract String extension; @Override public boolean accept(File f) { - return f.isDirectory() || getExtension().equals(f.toPath().getExtension()); + return f.isDirectory() || extension.equals(f.toPath().getExtension()); } - - public abstract String getExtension(); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/JsonFileFilter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/JsonFileFilter.java index bd72f79a..ed845781 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/JsonFileFilter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/JsonFileFilter.java @@ -1,14 +1,10 @@ package org.lodder.subtools.sublibrary.util.filefilter; -public class JsonFileFilter extends ExtensionFileFilter { +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; - @Override - public String getDescription() { - return "json files"; - } +public final class JsonFileFilter extends ExtensionFileFilter { - @Override - public String getExtension() { - return "json"; - } + @val @override String description = "json files"; + @val @override String extension = "json"; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/XmlFileFilter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/XmlFileFilter.java index 69f51efc..908335b4 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/XmlFileFilter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/filefilter/XmlFileFilter.java @@ -1,14 +1,10 @@ package org.lodder.subtools.sublibrary.util.filefilter; -public class XmlFileFilter extends ExtensionFileFilter { +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; - @Override - public String getDescription() { - return "xml files"; - } +public final class XmlFileFilter extends ExtensionFileFilter { - @Override - public String getExtension() { - return "xml"; - } + @val @override String description = "xml files"; + @val @override String extension = "xml"; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java index 2530ff90..616836ce 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java @@ -44,7 +44,7 @@ public String doGet(URL url, String userAgent) throws IOException, HttpClientExc URLConnection conn = url.openConnection(); cookieManager.setCookies(conn); - if (userAgent != null && userAgent.length() > 0) { + if (userAgent != null && !userAgent.isEmpty()) { conn.setRequestProperty("user-agent", userAgent); } @@ -73,7 +73,8 @@ public String doPost(URL url, String userAgent, Map data) throws conn.setRequestProperty("user-agent", userAgent); } conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); - conn.setRequestProperty("Content-Length", String.valueOf(urlParameters.getBytes(StandardCharsets.UTF_8).length)); + conn.setRequestProperty("Content-Length", + String.valueOf(urlParameters.getBytes(StandardCharsets.UTF_8).length)); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); @@ -107,7 +108,8 @@ public boolean doDownloadFile(URL url, final Path file) { LOGGER.debug("doDownloadFile: URL [{}], file [{}]", url, file); boolean success = true; - try (InputStream in = url.getFile().endsWith(".gz") ? new GZIPInputStream(url.openStream()) : getInputStream(url)) { + try (InputStream in = url.getFile().endsWith(".gz") ? new GZIPInputStream(url.openStream()) : + getInputStream(url)) { byte[] data = in.readAllBytes(); in.close(); @@ -122,7 +124,8 @@ public boolean doDownloadFile(URL url, final Path file) { LOGGER.error("Download problem: Addic7ed Daily Download count exceeded!"); success = false; } else { - Files.write(file, data, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE); + Files.write(file, data, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, + StandardOpenOption.WRITE); } } } catch (Exception e) { @@ -151,7 +154,8 @@ private InputStream getInputStream(URL url) throws Exception { } else { String protocol = url.getProtocol(); String host = conn.getURL().getHost(); - url = new URI("%s://%s/%s".formatted(protocol, host, conn.getHeaderField("Location").trim().replace(" ", "%20"))).toURL(); + url = new URI("%s://%s/%s".formatted(protocol, host, + conn.getHeaderField("Location").trim().replace(" ", "%20"))).toURL(); } return getInputStream(url); } @@ -163,14 +167,16 @@ private InputStream getInputStream(URL url) throws Exception { } public static boolean isUrl(String str) { - Pattern urlPattern = Pattern.compile("((https?|ftp|gopher|telnet|file):((//)|(\\\\\\\\))+[\\\\w\\\\d:#@%/;$()~_?\\\\+-=\\\\\\\\\\\\.&]*)", + Pattern urlPattern = Pattern.compile( + "((https?|ftp|gopher|telnet|file):((//)|(\\\\\\\\))+[\\\\w\\\\d:#@%/;$()~_?\\\\+-=\\\\\\\\\\\\.&]*)", Pattern.CASE_INSENSITIVE); Matcher matcher = urlPattern.matcher(str); return matcher.find(); } public String downloadText(String url) throws IOException { - try (BufferedReader in = new BufferedReader(new InputStreamReader(new URI(url).toURL().openStream(), StandardCharsets.UTF_8))) { + try (BufferedReader in = new BufferedReader( + new InputStreamReader(new URI(url).toURL().openStream(), StandardCharsets.UTF_8))) { return in.lines().collect(Collectors.joining()); } catch (URISyntaxException e) { throw new IOException(e.getMessage(), e); From 4f437e04f15d7cf54e19c00fb11693cba1d46dfd Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 15:53:24 +0100 Subject: [PATCH 24/54] changes --- .../subtools/multisubdownloader/CLI.java | 12 ++- .../subtools/multisubdownloader/GUI.java | 2 - .../actions/FileListAction.java | 4 +- .../actions/SearchAction.java | 2 - .../cli/actions/CliSearchAction.java | 17 +--- .../subtools/multisubdownloader/gui/Menu.java | 4 +- .../multisubdownloader/gui/Splash.java | 4 +- .../actions/search/FileGuiSearchAction.java | 24 ++--- .../gui/actions/search/GuiSearchAction.java | 5 +- .../actions/search/TextGuiSearchAction.java | 36 +++---- .../gui/dialog/MappingEpisodeNameDialog.java | 47 +++++----- .../gui/dialog/PreferenceDialog.java | 44 +++++---- .../gui/dialog/RenameDialog.java | 2 +- .../gui/dialog/StructureBuilderDialog.java | 16 ++-- .../gui/extra/PanelCheckBox.java | 2 +- .../gui/extra/table/CustomTable.java | 2 +- .../gui/extra/table/SearchColumnName.java | 6 +- .../extra/table/SubtitleTableColumnName.java | 12 +-- .../gui/extra/table/VideoTableModel.java | 4 - .../gui/panels/ResultPanel.java | 6 +- .../gui/panels/SearchTextInputPanel.java | 2 +- .../preference/DefaultSelectionPanel.java | 14 ++- .../gui/panels/preference/GeneralPanel.java | 74 +++++++++------ .../gui/panels/preference/OptionsPanel.java | 74 ++++++++------- .../preference/SerieProvidersPanel.java | 94 +++++++++++-------- .../panels/preference/StructureFilePanel.java | 52 ++++++---- .../subtools/multisubdownloader/lib/Info.java | 5 +- .../lib/control/MovieReleaseControl.java | 3 +- .../lib/control/ReleaseControl.java | 2 +- .../subtitles/sorting/ScoreCalculator.java | 10 +- .../lib/library/FilenameLibraryBuilder.java | 20 ++-- .../lib/library/LibraryActionType.java | 13 +-- .../lib/library/LibraryBuilder.java | 11 ++- .../library/LibraryOtherFileActionType.java | 4 +- .../lib/library/PathLibraryBuilder.java | 44 ++++----- .../Addic7edServiceProvider.java | 4 +- 36 files changed, 345 insertions(+), 332 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 232dcd48..97ce2c9d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -91,7 +91,8 @@ public void download(List releases) { try { this.download(release); } catch (Exception e) { - LOGGER.error("Error while downloading subtitle for ${release.releaseDescription} (%${e.getMessage()})", e); + LOGGER.error("Error while downloading subtitle for ${release.releaseDescription} (%${e.getMessage()})", + e); } } } @@ -100,7 +101,6 @@ public void search() { try { CliSearchAction .createWithSettings(settings) - .manager(manager) .subtitleProviderStore((SubtitleProviderStore) app.make("SubtitleProviderStore")) .indexingProgressListener(new CLIFileIndexerProgress().verbose(verboseProgress)) .searchProgressListener(new CLISearchProgress().verbose(verboseProgress)) @@ -138,7 +138,9 @@ private void download(Release release) { try { downloadAction.download(release, release.matchingSubs.get(j), selection.size() == 1 ? null : j + 1); } catch (IOException | ManagerException e) { - LOGGER.error("Error while downloading subtitle for ${release.releaseDescription} (${e.getMessage()})", e); + LOGGER.error( + "Error while downloading subtitle for ${release.releaseDescription} (${e.getMessage()})", + e); } }); } @@ -155,7 +157,9 @@ private List getFolders(CommandLine line) { private Language getLanguage(CommandLine line) throws CliException { if (line.hasCliOption(CliOption.LANGUAGE)) { String languageString = line.getCliOptionValue(CliOption.LANGUAGE); - return Arrays.stream(Language.values()).filter(lang -> lang.name().equalsIgnoreCase(languageString)).findAny() + return Arrays.stream(Language.values()) + .filter(lang -> lang.name().equalsIgnoreCase(languageString)) + .findAny() .orElseThrow(() -> new CliException(Messages.getString("App.NoValidLanguage"))); } else { return Language.ENGLISH; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index 068419b8..a7f37d2c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -261,7 +261,6 @@ private void createTextSearchPanel() { resultPanel.setDownloadAction(arg -> downloadText()); TextGuiSearchAction searchAction = TextGuiSearchAction.createWithSettings(settings) - .manager(manager) .subtitleProviderStore(subtitleProviderStore) .mainWindow(this) .searchPanel(pnlSearchText) @@ -292,7 +291,6 @@ private void createFileSearchPanel() { resultPanel.setTable(createVideoTable()); FileGuiSearchAction searchAction = FileGuiSearchAction.createWithSettings(settings) - .manager(manager) .subtitleProviderStore((SubtitleProviderStore) this.app.make("SubtitleProviderStore")) .mainWindow(this) .searchPanel(pnlSearchFile) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java index 439244bb..da0466d9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/FileListAction.java @@ -131,8 +131,8 @@ public boolean fileHasSubtitles(Path file, Language language) throws IOException String subtitleExtensionWithDot = "." + SUBTITLE_EXTENSION; Set langCodes = new HashSet<>(); - langCodes.add(language.getLangCode()); - langCodes.addAll(language.getLangCodesOther()); + langCodes.add(language.langCode); + langCodes.addAll(language.langCodesOther); String customLangCode = settings.episodeLibrarySettings.getLangCodeMap().get(language); if (!StringUtils.isBlank(customLangCode)) { langCodes.add(customLangCode); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java index 46527c4c..7ee6b6d9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java @@ -20,7 +20,6 @@ import org.lodder.subtools.multisubdownloader.workers.SearchHandler; import org.lodder.subtools.multisubdownloader.workers.SearchManager; import org.lodder.subtools.sublibrary.Language; -import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.Release; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,7 +29,6 @@ public abstract class SearchAction implements Runnable, Cancelable, SearchHandle private static final Logger LOGGER = LoggerFactory.getLogger(SearchAction.class); - @get(Protected) @NonNull Manager manager; @get(Protected) @NonNull Settings settings; @get(Protected) @NonNull SubtitleProviderStore subtitleProviderStore; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java index bfe5dde0..4b708a78 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java @@ -28,7 +28,6 @@ import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; import org.lodder.subtools.sublibrary.Language; -import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; import org.slf4j.Logger; @@ -51,10 +50,6 @@ public class CliSearchAction extends SearchAction { @get(Protected) @override @NonNull IndexingProgressListener indexingProgressListener; @get(Protected) @override @NonNull SearchProgressListener searchProgressListener; - public interface CliSearchActionBuilderManager { - CliSearchActionBuilderSubtitleProviderStore manager(Manager manager); - } - public interface CliSearchActionBuilderSubtitleProviderStore { CliSearchActionBuilderIndexingProgressListener subtitleProviderStore( SubtitleProviderStore subtitleProviderStore); @@ -101,7 +96,7 @@ public interface CliSearchActionBuilderOther { CliSearchAction build() throws SearchSetupException; } - public static CliSearchActionBuilderManager createWithSettings(Settings settings) { + public static CliSearchActionBuilderSubtitleProviderStore createWithSettings(Settings settings) { return new CliSearchActionBuilder(settings); } @@ -112,10 +107,8 @@ public static class CliSearchActionBuilder implements CliSearchActionBuilderSearchProgressListener, CliSearchActionBuilderIndexingProgressListener, CliSearchActionBuilderSubtitleProviderStore, CliSearchActionBuilderCLI, CliSearchActionBuilderFileListAction, CliSearchActionBuilderLanguage, CliSearchActionBuilderReleaseFactory, - CliSearchActionBuilderFiltering, CliSearchActionBuilderFolders, CliSearchActionBuilderOther, - CliSearchActionBuilderManager { + CliSearchActionBuilderFiltering, CliSearchActionBuilderFolders, CliSearchActionBuilderOther { private final Settings settings; - private Manager manager; private SubtitleProviderStore subtitleProviderStore; private IndexingProgressListener indexingProgressListener; private SearchProgressListener searchProgressListener; @@ -130,18 +123,18 @@ public static class CliSearchActionBuilder @Override public CliSearchAction build() throws SearchSetupException { - return new CliSearchAction(manager, settings, subtitleProviderStore, indexingProgressListener, + return new CliSearchAction(settings, subtitleProviderStore, indexingProgressListener, searchProgressListener, cli, fileListAction, language, releaseFactory, filtering, folders, overwriteSubtitles, recursive); } } - private CliSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, + private CliSearchAction(Settings settings, SubtitleProviderStore subtitleProviderStore, IndexingProgressListener indexingProgressListener, SearchProgressListener searchProgressListener, CLI cli, FileListAction fileListAction, Language language, ReleaseFactory releaseFactory, SubtitleFiltering filtering, List folders, boolean overwriteSubtitles, boolean recursive) throws SearchSetupException { - super(manager, settings, subtitleProviderStore); + super(settings, subtitleProviderStore); this.indexingProgressListener = indexingProgressListener; this.searchProgressListener = searchProgressListener; this.cli = cli; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java index 94b44736..2e3d5b2f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java @@ -205,7 +205,7 @@ public Menu withExportTranslationsAction(Runnable exportTranslationsAction) { } public Menu withAboutAction(Runnable aboutAction) { - addActionListener(mntmAbout, arg -> aboutAction.run()); + addActionListener(mntmAbout, _ -> aboutAction.run()); return this; } @@ -250,7 +250,7 @@ public Menu withViewSeasonAction(Runnable viewSeasonAction) { } private void addActionListener(JMenuItem menuItem, Runnable actionListener) { - addActionListener(menuItem, arg -> actionListener.run()); + addActionListener(menuItem, _ -> actionListener.run()); } private void addActionListener(JMenuItem menuItem, ActionListener actionListener) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Splash.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Splash.java index 1be85ac1..4f57000a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Splash.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Splash.java @@ -14,10 +14,10 @@ public class Splash extends JWindow { private JProgressBar progressBar; public Splash() { - initialize_ui(); + initializeUi(); } - public void initialize_ui() { + public void initializeUi() { setBounds(100, 100, 501, 100); getContentPane().setLayout(new MigLayout("", "[][475px,center][]", "[][40px:n]")); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java index fcd97a02..980333ea 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java @@ -19,7 +19,6 @@ import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; import org.lodder.subtools.sublibrary.Language; -import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; @@ -27,10 +26,6 @@ public class FileGuiSearchAction extends GuiSearchAction { private final @NonNull FileListAction filelistAction; - public interface FileGuiSearchActionBuilderManager { - FileGuiSearchActionBuilderSubtitleProviderStore manager(Manager manager); - } - public interface FileGuiSearchActionBuilderSubtitleProviderStore { FileGuiSearchActionBuilderGUI subtitleProviderStore(SubtitleProviderStore subtitleProviderStore); } @@ -51,7 +46,7 @@ public interface FileGuiSearchActionBuilderBuild { FileGuiSearchAction build(); } - public static FileGuiSearchActionBuilderManager createWithSettings(Settings settings) { + public static FileGuiSearchActionBuilderSubtitleProviderStore createWithSettings(Settings settings) { return new FileGuiSearchActionBuilder(settings); } @@ -61,9 +56,8 @@ public static FileGuiSearchActionBuilderManager createWithSettings(Settings sett public static class FileGuiSearchActionBuilder implements FileGuiSearchActionBuilderBuild, FileGuiSearchActionBuilderReleaseFactory, FileGuiSearchActionBuilderSearchPanel, FileGuiSearchActionBuilderGUI, - FileGuiSearchActionBuilderSubtitleProviderStore, FileGuiSearchActionBuilderManager { + FileGuiSearchActionBuilderSubtitleProviderStore { private final Settings settings; - private Manager manager; private SubtitleProviderStore subtitleProviderStore; private GUI mainWindow; private SearchPanel searchPanel; @@ -71,15 +65,13 @@ public static class FileGuiSearchActionBuilder @Override public FileGuiSearchAction build() { - return new FileGuiSearchAction(manager, settings, subtitleProviderStore, mainWindow, searchPanel, - releaseFactory); + return new FileGuiSearchAction(settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); } } - private FileGuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, - GUI mainWindow, + private FileGuiSearchAction(Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow, SearchPanel searchPanel, ReleaseFactory releaseFactory) { - super(manager, settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); + super(settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); this.filelistAction = new FileListAction(settings); } @@ -95,10 +87,8 @@ protected void validate() throws SearchSetupException { public void onFound(Release release, List subtitles) { VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); - List filteredSubtitles = - filtering != null ? - subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).toList() : - subtitles; + List filteredSubtitles = filtering != null ? + subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).toList() : subtitles; filteredSubtitles.forEach(release::addMatchingSub); model.addRow(release); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java index 60de0559..2ef37d45 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java @@ -20,7 +20,6 @@ import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; import org.lodder.subtools.sublibrary.Language; -import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; @@ -34,9 +33,9 @@ public abstract class GuiSearchAction

extends SearchAction @get(Protected) @override SearchProgressListener searchProgressListener; @get(Protected) @override UserInteractionHandlerGUI userInteractionHandler; - GuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, + GuiSearchAction(Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow, SearchPanel

searchPanel, ReleaseFactory releaseFactory) { - super(manager, settings, subtitleProviderStore); + super(settings, subtitleProviderStore); this.mainWindow = mainWindow; this.searchPanel = searchPanel; this.filtering = new SubtitleFiltering(settings); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java index bed6fa61..23dc9cc7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java @@ -15,7 +15,6 @@ import org.lodder.subtools.multisubdownloader.lib.ReleaseFactory; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore; -import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.MovieRelease; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; @@ -24,10 +23,6 @@ public class TextGuiSearchAction extends GuiSearchAction { - public interface FileGuiSearchActionBuilderManager { - TextGuiSearchActionBuilderSubtitleProviderStore manager(Manager manager); - } - public interface TextGuiSearchActionBuilderSubtitleProviderStore { TextGuiSearchActionBuilderGUI subtitleProviderStore(SubtitleProviderStore subtitleProviderStore); } @@ -48,7 +43,7 @@ public interface TextGuiSearchActionBuilderBuild { TextGuiSearchAction build(); } - public static FileGuiSearchActionBuilderManager createWithSettings(Settings settings) { + public static TextGuiSearchActionBuilderSubtitleProviderStore createWithSettings(Settings settings) { return new TextGuiSearchActionBuilder(settings); } @@ -57,11 +52,9 @@ public static FileGuiSearchActionBuilderManager createWithSettings(Settings sett @Accessors(chain = true, fluent = true) public static class TextGuiSearchActionBuilder implements TextGuiSearchActionBuilderBuild, TextGuiSearchActionBuilderReleaseFactory, - TextGuiSearchActionBuilderSearchPanel, - TextGuiSearchActionBuilderGUI, TextGuiSearchActionBuilderSubtitleProviderStore, - FileGuiSearchActionBuilderManager { + TextGuiSearchActionBuilderSearchPanel, TextGuiSearchActionBuilderGUI, + TextGuiSearchActionBuilderSubtitleProviderStore { private final Settings settings; - private Manager manager; private SubtitleProviderStore subtitleProviderStore; private GUI mainWindow; private SearchPanel searchPanel; @@ -69,15 +62,13 @@ public static class TextGuiSearchActionBuilder @Override public TextGuiSearchAction build() { - return new TextGuiSearchAction(manager, settings, subtitleProviderStore, mainWindow, searchPanel, - releaseFactory); + return new TextGuiSearchAction(settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); } } - private TextGuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, - GUI mainWindow, + private TextGuiSearchAction(Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow, SearchPanel searchPanel, ReleaseFactory releaseFactory) { - super(manager, settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); + super(settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory); } @Override @@ -92,7 +83,7 @@ protected List createReleases() { String name = getInputPanel().getReleaseName(); VideoSearchType type = getInputPanel().getType(); - VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.resultPanel.getTable().getModel(); model.clearTable(); // TODO: Redefine what a "release" is. @@ -103,10 +94,7 @@ protected List createReleases() { .episode(getInputPanel().getEpisode()) .quality(getInputPanel().getQuality()) .build(); - case MOVIE -> MovieRelease.builder() - .name(name) - .quality(getInputPanel().getQuality()) - .build(); + case MOVIE -> MovieRelease.builder().name(name).quality(getInputPanel().getQuality()).build(); default -> releaseFactory.createRelease(Path.of(name), userInteractionHandler); }; return release != null ? List.of(release) : List.of(); @@ -114,12 +102,10 @@ protected List createReleases() { @Override public void onFound(Release release, List subtitles) { - VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.resultPanel.getTable().getModel(); - List subtitlesFiltered = - filtering != null ? - subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).toList() : - subtitles; + List subtitlesFiltered = filtering != null ? + subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).toList() : subtitles; subtitlesFiltered.forEach(release::addMatchingSub); // use automatic selection to reduce the selection for the user diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index 224b818d..557587a5 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -63,7 +63,7 @@ private void selectMappingType(MappingType mappingType) { this.selectedMappingType = mappingType; this.selectedSubtitleProvider = subtitleProviderStore.getAllProviders() .stream() - .filter(subtitleProvider -> subtitleProvider.getProviderName().equals(mappingType.getProviderName())) + .filter(subtitleProvider -> subtitleProvider.providerName.equals(mappingType.getProviderName())) .findAny(); btnAddCustomMapping.setEnabled(selectedSubtitleProvider.isPresent()); mappingTableModel.setMappingType(mappingType); @@ -163,8 +163,7 @@ void setMappingType(MappingType mappingType) { .map(serieMappingPair -> { SerieMapping serieMapping = serieMappingPair.getValue(); String name = serieMapping.name; - String providerId = - serieMapping.providerId == null ? "" : serieMapping.providerId; + String providerId = serieMapping.providerId == null ? "" : serieMapping.providerId; String providerName = serieMapping.providerName; if (providerId.contains("/")) { providerId = providerId.substring(providerId.lastIndexOf("/") + 1); @@ -191,12 +190,12 @@ private void initialize() { getContentPane().setLayout(new BorderLayout()); contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); - GridBagLayout gbl_contentPanel = new GridBagLayout(); - gbl_contentPanel.columnWidths = new int[]{ 0, 0 }; - gbl_contentPanel.rowHeights = new int[]{ 0, 40, 0 }; - gbl_contentPanel.columnWeights = new double[]{ 1.0, Double.MIN_VALUE }; - gbl_contentPanel.rowWeights = new double[]{ 0.0, 1.0, Double.MIN_VALUE }; - contentPanel.setLayout(gbl_contentPanel); + GridBagLayout gblContentPanel = new GridBagLayout(); + gblContentPanel.columnWidths = new int[]{ 0, 0 }; + gblContentPanel.rowHeights = new int[]{ 0, 40, 0 }; + gblContentPanel.columnWeights = new double[]{ 1.0, Double.MIN_VALUE }; + gblContentPanel.rowWeights = new double[]{ 0.0, 1.0, Double.MIN_VALUE }; + contentPanel.setLayout(gblContentPanel); { JPanel selectionPane = new JPanel(); contentPanel.add(selectionPane); @@ -212,20 +211,20 @@ private void initialize() { } { JPanel pnlButtons = new JPanel(); - GridBagConstraints gbc_pnlButtons = new GridBagConstraints(); - gbc_pnlButtons.insets = new Insets(0, 0, 5, 0); - gbc_pnlButtons.fill = GridBagConstraints.BOTH; - gbc_pnlButtons.gridx = 0; - gbc_pnlButtons.gridy = 0; - contentPanel.add(pnlButtons, gbc_pnlButtons); + GridBagConstraints gbcPnlButtons = new GridBagConstraints(); + gbcPnlButtons.insets = new Insets(0, 0, 5, 0); + gbcPnlButtons.fill = GridBagConstraints.BOTH; + gbcPnlButtons.gridx = 0; + gbcPnlButtons.gridy = 0; + contentPanel.add(pnlButtons, gbcPnlButtons); } { JScrollPane scrollPane = new JScrollPane(); - GridBagConstraints gbc_scrollPane = new GridBagConstraints(); - gbc_scrollPane.fill = GridBagConstraints.BOTH; - gbc_scrollPane.gridx = 0; - gbc_scrollPane.gridy = 1; - contentPanel.add(scrollPane, gbc_scrollPane); + GridBagConstraints gbcScrollPane = new GridBagConstraints(); + gbcScrollPane.fill = GridBagConstraints.BOTH; + gbcScrollPane.gridx = 0; + gbcScrollPane.gridy = 1; + contentPanel.add(scrollPane, gbcScrollPane); { table = new JTable(); @@ -266,14 +265,14 @@ private void initialize() { MappingTableModel model = (MappingTableModel) table.getModel(); Row row = (Row) model.getDataVector().get(rowNbr); - String currentName = row.serieMapping.getName(); + String currentName = row.serieMapping.name; String message = Messages.getString("MappingEpisodeNameDialog.enterNewNameForSerie", currentName); selectedSubtitleProvider.ifPresent( provider -> userInteractionHandler.enter(message, message).ifPresent(newName -> { TvRelease tvRelease = TvRelease.builder() .name(currentName) - .season(row.serieMapping.getSeason()) + .season(row.serieMapping.season) .episode(1) .originalName(currentName) .customName(newName) @@ -281,8 +280,8 @@ private void initialize() { try { provider.getProviderSerieId(tvRelease).ifPresentOrElse(providerSerieId -> { SerieMapping newSerieMapping = - new SerieMapping(currentName, providerSerieId.getProviderId(), - providerSerieId.getProviderName(), providerSerieId.getSeason()); + new SerieMapping(currentName, providerSerieId.providerId, + providerSerieId.providerName, providerSerieId.season); row.serieMapping = newSerieMapping; List sortKeys = table.getRowSorter().getSortKeys(); selectMappingType(selectedMappingType); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java index 92e3228f..50b87328 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java @@ -22,8 +22,7 @@ public class PreferenceDialog extends MultiSubDialog { - @Serial - private static final long serialVersionUID = -4910124272966075979L; + @Serial private static final long serialVersionUID = -4910124272966075979L; private final SettingsControl settingsCtrl; private final Emitter eventEmitter; @@ -33,8 +32,8 @@ public class PreferenceDialog extends MultiSubDialog { private final OptionsPanel pnlOptions; private final SerieProvidersPanel pnlSerieSources; - public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eventEmitter, - Manager manager, UserInteractionHandler userInteractionHandler) { + public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eventEmitter, Manager manager, + UserInteractionHandler userInteractionHandler) { super(gui, Messages.getString("PreferenceDialog.Title"), true); this.settingsCtrl = settingsCtrl; this.eventEmitter = eventEmitter; @@ -53,10 +52,12 @@ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eve tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); tabbedPane.addChangeListener(l -> { if (tabbedPane.getSelectedIndex() != selectedIndex.get()) { - PreferencePanelIntf sourcePanel = (PreferencePanelIntf) tabbedPane.getComponentAt(selectedIndex.get()); + PreferencePanelIntf sourcePanel = + (PreferencePanelIntf) tabbedPane.getComponentAt(selectedIndex.get()); if (!sourcePanel.hasValidSettings()) { tabbedPane.setSelectedIndex(selectedIndex.get()); - JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), + "Error", JOptionPane.ERROR_MESSAGE); } else { selectedIndex.set(tabbedPane.getSelectedIndex()); } @@ -68,11 +69,12 @@ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eve tabbedPane.addTab(Messages.getString("PreferenceDialog.TabGeneral"), null, pnlGeneral, null); this.pnlEpisodeLibrary = - new EpisodeLibraryPanel(settingsCtrl.getSettings().episodeLibrarySettings, manager, false, userInteractionHandler); + new EpisodeLibraryPanel(settingsCtrl.settings.episodeLibrarySettings, manager, false, + userInteractionHandler); tabbedPane.addTab(Messages.getString("PreferenceDialog.SerieLibrary"), null, pnlEpisodeLibrary, null); - this.pnlMovieLibrary = - new MovieLibraryPanel(settingsCtrl.getSettings().movieLibrarySettings, manager, false, userInteractionHandler); + this.pnlMovieLibrary = new MovieLibraryPanel(settingsCtrl.settings.movieLibrarySettings, manager, false, + userInteractionHandler); tabbedPane.addTab(Messages.getString("PreferenceDialog.MovieLibrary"), null, pnlMovieLibrary, null); this.pnlOptions = new OptionsPanel(settingsCtrl); @@ -83,25 +85,20 @@ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eve } { - new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)).addTo(getContentPane(), BorderLayout.SOUTH) + new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)) + .addTo(getContentPane(), BorderLayout.SOUTH) + .addComponent(new JButton(Messages.getString("App.OK")).defaultButtonFor(getRootPane()) + .withActionListener(this::testAndSaveValues) + .actionCommand(Messages.getString("App.OK"))) .addComponent( - new JButton(Messages.getString("App.OK")) - .defaultButtonFor(getRootPane()) - .withActionListener(this::testAndSaveValues) - .actionCommand(Messages.getString("App.OK"))) - .addComponent( - new JButton(Messages.getString("App.Cancel")) - .withActionListener(() -> setVisible(false)) + new JButton(Messages.getString("App.Cancel")).withActionListener(() -> setVisible(false)) .actionCommand("Cancel")); } } private void testAndSaveValues() { - if (pnlGeneral.hasValidSettings() && - pnlEpisodeLibrary.hasValidSettings() && - pnlMovieLibrary.hasValidSettings() && - pnlOptions.hasValidSettings() && - pnlSerieSources.hasValidSettings()) { + if (pnlGeneral.hasValidSettings() && pnlEpisodeLibrary.hasValidSettings() && + pnlMovieLibrary.hasValidSettings() && pnlOptions.hasValidSettings() && pnlSerieSources.hasValidSettings()) { pnlGeneral.savePreferenceSettings(); pnlEpisodeLibrary.savePreferenceSettings(); pnlMovieLibrary.savePreferenceSettings(); @@ -111,7 +108,8 @@ private void testAndSaveValues() { settingsCtrl.store(); this.eventEmitter.fire(new Event("providers.settings.change")); } else { - JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", + JOptionPane.ERROR_MESSAGE); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index b6392301..8ee62dce 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -101,7 +101,7 @@ private void rename(VideoType videoType, Settings settings, Manager manager, setVisible(false); pnlLibrary.savePreferenceSettings(); TypedRenameWorker renameWorker = - new TypedRenameWorker(txtFolder.getObject(), pnlLibrary.getLibrarySettings(), videoType, + new TypedRenameWorker(txtFolder.getObject(), pnlLibrary.librarySettings, videoType, this.chkRecursive.isSelected(), manager, userInteractionHandler); renameWorker.addPropertyChangeListener(this); renameWorker.releaseFactory = new ReleaseFactory(settings, manager); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index c68ee53d..5c92678e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -94,13 +94,14 @@ private void initializeUi() { .addComponent( new JButton(Messages.getString("App.OK")) .defaultButtonFor(getRootPane()) - .withActionListener(e -> { + .withActionListener(_ -> { setVisible(false); - dispose(); // this is needed to dispose the dialog and return the control to the window + dispose(); // this is needed to dispose the dialog and return the control to the + // window }) .withActionCommand("OK")) .addComponent(new JButton(Messages.getString("App.Cancel")) - .withActionListener(e -> { + .withActionListener(_ -> { setVisible(false); txtStructure.setText(oldStructure); dispose(); // this is needed to dispose the dialog and return the control to the window @@ -115,8 +116,9 @@ private void generateVideoFiles() { Path.of("Terra.Nova.S01E01E02.Genesis.720p.HDTV.x264-ORENJI.mkv"), userInteractionHandler); } else if (videoType == VideoType.MOVIE) { - movieRelease = (MovieRelease) releaseFactory.createRelease(Path.of("Final.Destination.5.720p.Bluray.x264-TWiZTED"), - userInteractionHandler); + movieRelease = + (MovieRelease) releaseFactory.createRelease(Path.of("Final.Destination.5.720p.Bluray.x264-TWiZTED"), + userInteractionHandler); } } @@ -125,8 +127,8 @@ private void buildLabelTable(StructureTag[] structureTags) { } private void addTag(StructureTag structureTag) { - new JLabel(structureTag.getLabel()) - .withToolTipText(structureTag.getDescription()) + new JLabel(structureTag.label) + .withToolTipText(structureTag.description) .addTo(tagPanel) .withMouseListener(new InsertTag()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java index 5a482a8b..63ec8b32 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java @@ -131,7 +131,7 @@ public JPanel addTo(JComponent component) { public JPanel addTo(JComponent component, Object constraints) { PanelCheckBox panelCheckBox = build(); component.add(panelCheckBox, constraints); - return panelCheckBox.getPanel(); + return panelCheckBox.panel; } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java index 22fa8850..48f92656 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java @@ -18,7 +18,7 @@ public class CustomTable extends ZebraJTable { public int getColumnIdByName(CustomColumnName customColumnName) { return IntStream.range(0, this.getColumnCount()) - .filter(i -> this.getColumnName(i).equals(customColumnName.getColumnName())).findFirst() + .filter(i -> this.getColumnName(i).equals(customColumnName.columnName)).findFirst() .orElse(-1); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java index 1c942e04..e3076f1f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java @@ -29,12 +29,12 @@ public enum SearchColumnName implements CustomColumnName { .collect(Collectors.toMap(SearchColumnName::getColumnName, Function.identity())); @val @override String columnName; - @val @override Class c; + @val @override Class clazz; @val @override boolean editable; - SearchColumnName(String columnNameCode, Class c, boolean editable) { + SearchColumnName(String columnNameCode, Class clazz, boolean editable) { this.columnName = Messages.getString(columnNameCode); - this.c = c; + this.clazz = clazz; this.editable = editable; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java index f2f42d63..292f83fb 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java @@ -19,15 +19,9 @@ public enum SubtitleTableColumnName implements CustomColumnName { RELEASEGROUP("SubtitleTableColumnName.Releasegroup", String.class, false, Subtitle::getReleaseGroup); - @val - @override - String columnName; - @val - @override - Class clazz; - @val - @override - boolean editable; + @val @override String columnName; + @val @override Class clazz; + @val @override boolean editable; @val Function valueFunction; SubtitleTableColumnName(String columnNameCode, Class clazz, boolean editable, diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java index e8396e48..ab5bb654 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java @@ -201,10 +201,6 @@ public void setShowOnlyFound(boolean showOnlyFound) { updateTable(); } - public boolean isShowOnlyFound() { - return this.showOnlyFound; - } - public void executedSynchronized(Runnable runnable) { synchronized (this) { runnable.run(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java index 68df243e..04ba5143 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java @@ -97,9 +97,9 @@ public void setMoveAction(ActionListener moveAction) { } private void setupListeners() { - btnSelectNone.addActionListener(e -> deselectAllRows()); - btnSelectFound.addActionListener(e -> selectRowsWithFoundSubtitles()); - btnSelectAll.addActionListener(e -> selectAllRows()); + btnSelectNone.addActionListener(_ -> deselectAllRows()); + btnSelectFound.addActionListener(_ -> selectRowsWithFoundSubtitles()); + btnSelectAll.addActionListener(_ -> selectAllRows()); } private void createComponents() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java index 29f9dad0..55975a56 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java @@ -43,7 +43,7 @@ private void addComponentsToPanel() { } private void setupListeners() { - cbxVideoType.addItemListener(arg0 -> videoTypeChanged()); + cbxVideoType.addItemListener(_ -> videoTypeChanged()); } private void createComponents() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java index 2bf5ae64..d8916ea4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java @@ -28,9 +28,13 @@ public DefaultSelectionPanel(SettingsControl settingsCtrl) { super(new MigLayout("fill, bottom, insets 0", "[grow][][grow][]", "[grow, bottom][grow, top]")); this.settingsCtrl = settingsCtrl; - unusedPatternsTable = ScrollTable.create(Messages.getString("PreferenceDialog.DefaultSelectionUnused"), Source.class).add(this, "spany 2"); + unusedPatternsTable = + ScrollTable.create(Messages.getString("PreferenceDialog.DefaultSelectionUnused"), Source.class) + .add(this, "spany 2"); new ArrowButton(SwingConstants.EAST, 1, 10).withActionListener(this::addPattern).addTo(this); - usedPatternsTable = ScrollTable.create(Messages.getString("PreferenceDialog.DefaultSelectionUsed"), Source.class).add(this, "spany 2"); + usedPatternsTable = + ScrollTable.create(Messages.getString("PreferenceDialog.DefaultSelectionUsed"), Source.class) + .add(this, "spany 2"); new ArrowButton(SwingConstants.NORTH, 1, 10).withActionListener(this::moveRuleRowUp).addTo(this, "wrap"); new ArrowButton(SwingConstants.WEST, 1, 10).withActionListener(this::removePattern).addTo(this, "skip"); @@ -175,13 +179,13 @@ protected void moveRuleRowUp() { } public void loadPreferenceSettings() { - Source.values().stream().filter(not(settingsCtrl.getSettings().optionsDefaultSelectionQualityList::contains)) + Source.values().stream().filter(not(settingsCtrl.settings.optionsDefaultSelectionQualityList::contains)) .forEach(unusedPatternsTable::addItem); - settingsCtrl.getSettings().optionsDefaultSelectionQualityList.forEach(usedPatternsTable::addItem); + settingsCtrl.settings.optionsDefaultSelectionQualityList.forEach(usedPatternsTable::addItem); } public void savePreferenceSettings() { - settingsCtrl.getSettings().optionsDefaultSelectionQualityList = usedPatternsTable.getItems(); + settingsCtrl.settings.optionsDefaultSelectionQualityList = usedPatternsTable.getItems(); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index d5a68edd..13795d1f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -59,18 +59,23 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { } { - new JLabel(Messages.getString("PreferenceDialog.DefaultIncomingFolder")).addTo(settingsPanel, "aligny center, span 1 2"); + new JLabel(Messages.getString("PreferenceDialog.DefaultIncomingFolder")).addTo(settingsPanel, + "aligny center, span 1 2"); new JScrollPane().addTo(settingsPanel, "growx, span, wrap") - .setViewportView(this.defaultIncomingFoldersList = JListWithImages.createForType(Path.class).distinctValues().build()); + .setViewportView(this.defaultIncomingFoldersList = + JListWithImages.createForType(Path.class).distinctValues().build()); new JButton(Messages.getString("PreferenceDialog.AddFolder")) .withActionListener( () -> MemoryFolderChooser.getInstance() - .selectDirectory(settingsPanel, Messages.getString("PreferenceDialog.SelectFolder")) + .selectDirectory(settingsPanel, + Messages.getString("PreferenceDialog.SelectFolder")) .map(Path::toAbsolutePath) .filter(path -> !defaultIncomingFoldersList.contains(path)) - .ifPresent(path -> defaultIncomingFoldersList.addItem(PathMatchType.FOLDER.getImage(), path))) + .ifPresent( + path -> defaultIncomingFoldersList.addItem(PathMatchType.FOLDER.image, + path))) .addTo(settingsPanel, "span, split 2"); new JButton(Messages.getString("PreferenceDialog.DeleteFolder")) @@ -78,20 +83,25 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { .addTo(settingsPanel, "wrap, gapbottom 10px"); } { - new JLabel(Messages.getString("PreferenceDialog.ExcludeList")).addTo(settingsPanel, "aligny center, span 1 2"); + new JLabel(Messages.getString("PreferenceDialog.ExcludeList")).addTo(settingsPanel, + "aligny center, span 1 2"); new JScrollPane().addTo(settingsPanel, "growx, span, wrap") - .withViewPort(this.excludeList = JListWithImages.createForType(PathOrRegex.class).distinctValues().build()); + .withViewPort(this.excludeList = + JListWithImages.createForType(PathOrRegex.class).distinctValues().build()); Consumer addExcludeItemConsumer = type -> { if (type == PathMatchType.FOLDER) { - MemoryFolderChooser.getInstance().selectDirectory(settingsPanel, Messages.getString("PreferenceDialog.SelectExcludeFolder")) - .map(Path::toAbsolutePath).map(PathOrRegex::new) - .ifPresent(pathOrRegex -> excludeList.addItem(pathOrRegex.getImage(), pathOrRegex)); + MemoryFolderChooser.getInstance() + .selectDirectory(settingsPanel, + Messages.getString("PreferenceDialog.SelectExcludeFolder")) + .map(Path::toAbsolutePath) + .map(PathOrRegex::new) + .ifPresent(pathOrRegex -> excludeList.addItem(pathOrRegex.image, pathOrRegex)); } else if (type == PathMatchType.REGEX) { String regex = JOptionPane.showInputDialog(Messages.getString("PreferenceDialog.EnterRegex")); if (StringUtils.isNotBlank(regex)) { - excludeList.addItem(PathMatchType.REGEX.getImage(), new PathOrRegex(regex)); + excludeList.addItem(PathMatchType.REGEX.image, new PathOrRegex(regex)); } } }; @@ -130,26 +140,29 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { JPanel proxyPanel = TitlePanel.title(Messages.getString("PreferenceDialog.ConfigureProxy")) .padding(0).paddingLeft(20).fillContents(false).addTo(this, "span, grow"); - PanelCheckBox.checkbox(this.chkUseProxy = new JCheckBox(Messages.getString("PreferenceDialog.UseProxyServer"))) + PanelCheckBox.checkbox( + this.chkUseProxy = new JCheckBox(Messages.getString("PreferenceDialog.UseProxyServer"))) .panelOnSameLine().panelLayout(new MigLayout("insets 0, fill")).leftGap(0).addTo(proxyPanel) .addComponent(new JLabel(Messages.getString("PreferenceDialog.Hostname"))) - .addComponent("wrap", this.txtProxyHost = MyTextFieldString.builder().requireValue().build().withColumns(30)) + .addComponent("wrap", + this.txtProxyHost = MyTextFieldString.builder().requireValue().build().withColumns(30)) .addComponent(new JLabel(Messages.getString("PreferenceDialog.Port"))) - .addComponent(this.txtProxyPort = MyTextFieldInteger.builder().requireValue().build().withColumns(5)); + .addComponent( + this.txtProxyPort = MyTextFieldInteger.builder().requireValue().build().withColumns(5)); } loadPreferenceSettings(); } public void loadPreferenceSettings() { - cbxLanguage.setSelectedItem(settingsCtrl.getSettings().language); - defaultIncomingFoldersList.addItems(PathMatchType.FOLDER.getImage(), settingsCtrl.getSettings().defaultIncomingFolders); - settingsCtrl.getSettings().excludeList.forEach(pathOrRegex -> excludeList.addItem(pathOrRegex.getImage(), pathOrRegex)); - cbxUpdateCheckPeriod.setSelectedItem(settingsCtrl.getSettings().updateCheckPeriod); - cbxUpdateType.setSelectedItem(settingsCtrl.getSettings().updateType); - chkUseProxy.setSelected(settingsCtrl.getSettings().generalProxyEnabled); - txtProxyHost.setText(settingsCtrl.getSettings().generalProxyHost); - txtProxyPort.setObject(settingsCtrl.getSettings().generalProxyPort); + cbxLanguage.setSelectedItem(settingsCtrl.settings.language); + defaultIncomingFoldersList.addItems(PathMatchType.FOLDER.image, settingsCtrl.settings.defaultIncomingFolders); + settingsCtrl.settings.excludeList.forEach(pathOrRegex -> excludeList.addItem(pathOrRegex.image, pathOrRegex)); + cbxUpdateCheckPeriod.setSelectedItem(settingsCtrl.settings.updateCheckPeriod); + cbxUpdateType.setSelectedItem(settingsCtrl.settings.updateType); + chkUseProxy.setSelected(settingsCtrl.settings.generalProxyEnabled); + txtProxyHost.setText(settingsCtrl.settings.generalProxyHost); + txtProxyPort.setObject(settingsCtrl.settings.generalProxyPort); } public void savePreferenceSettings() { @@ -158,15 +171,16 @@ public void savePreferenceSettings() { gui.redraw(); } List defaultIncomingFolders = defaultIncomingFoldersList.stream().map(LabelPanel::getObject).toList(); - List exclList = excludeList.stream().map(labelPanel -> new PathOrRegex(labelPanel.getObject().getValue())).toList(); - settingsCtrl.getSettings().language = cbxLanguage.getSelectedItem(); - settingsCtrl.getSettings().defaultIncomingFolders = defaultIncomingFolders; - settingsCtrl.getSettings().replaceExcludeList(exclList); - settingsCtrl.getSettings().updateCheckPeriod = cbxUpdateCheckPeriod.getSelectedItem(); - settingsCtrl.getSettings().updateType = cbxUpdateType.getSelectedItem(); - settingsCtrl.getSettings().generalProxyEnabled = chkUseProxy.isSelected(); - settingsCtrl.getSettings().generalProxyHost = txtProxyHost.getText(); - settingsCtrl.getSettings().generalProxyPort = txtProxyPort.getOptionalObject().orElse(80); + List exclList = + excludeList.stream().map(labelPanel -> new PathOrRegex(labelPanel.getObject().value)).toList(); + settingsCtrl.settings.language = cbxLanguage.getSelectedItem(); + settingsCtrl.settings.defaultIncomingFolders = defaultIncomingFolders; + settingsCtrl.settings.replaceExcludeList(exclList); + settingsCtrl.settings.updateCheckPeriod = cbxUpdateCheckPeriod.getSelectedItem(); + settingsCtrl.settings.updateType = cbxUpdateType.getSelectedItem(); + settingsCtrl.settings.generalProxyEnabled = chkUseProxy.isSelected(); + settingsCtrl.settings.generalProxyHost = txtProxyHost.getText(); + settingsCtrl.settings.generalProxyPort = txtProxyPort.getOptionalObject().orElse(80); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index f0a36533..e395c85d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -36,21 +36,28 @@ public OptionsPanel(SettingsControl settingsCtrl) { TitlePanel.title(Messages.getString("PreferenceDialog.DownloadOptions")) .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow, wrap") - .addComponent(this.chkAlwaysConfirm = new JCheckBox(Messages.getString("PreferenceDialog.CheckBeforeDownloading")), "wrap") + .addComponent(this.chkAlwaysConfirm = + new JCheckBox(Messages.getString("PreferenceDialog.CheckBeforeDownloading")), "wrap") .addComponent("wrap, grow", PanelCheckBox - .checkbox(this.chkMinScoreSelection = new JCheckBox(Messages.getString("PreferenceDialog.MinAutomaticScoreSelection"))) + .checkbox(this.chkMinScoreSelection = + new JCheckBox(Messages.getString("PreferenceDialog.MinAutomaticScoreSelection"))) .panelOnSameLine().build() - .addComponent(this.sldMinScoreSelection = new JSlider().withMinimum(0).withMaximum(100), "wrap")) + .addComponent(this.sldMinScoreSelection = new JSlider().withMinimum(0).withMaximum(100), + "wrap")) .addComponent("wrap, grow", PanelCheckBox - .checkbox(this.chkDefaultSelection = new JCheckBox(Messages.getString("PreferenceDialog.DefaultSelection"), null, true)) + .checkbox(this.chkDefaultSelection = + new JCheckBox(Messages.getString("PreferenceDialog.DefaultSelection"), null, true)) .panelOnNewLine().build() .addComponent(this.pnlDefaultSelection = new DefaultSelectionPanel(settingsCtrl))); TitlePanel.title(Messages.getString("PreferenceDialog.SearchFilter")) .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow, wrap") - .addComponent(this.chkSubtitleExactMethod = new JCheckBox(Messages.getString("PreferenceDialog.SearchFilterExact")), "wrap") - .addComponent(this.chkSubtitleKeywordMethod = new JCheckBox(Messages.getString("PreferenceDialog.SearchFilterKeyword")), "wrap") - .addComponent(this.chkExcludeHearingImpaired = new JCheckBox(Messages.getString("PreferenceDialog.ExcludeHearingImpaired"))); + .addComponent(this.chkSubtitleExactMethod = + new JCheckBox(Messages.getString("PreferenceDialog.SearchFilterExact")), "wrap") + .addComponent(this.chkSubtitleKeywordMethod = + new JCheckBox(Messages.getString("PreferenceDialog.SearchFilterKeyword")), "wrap") + .addComponent(this.chkExcludeHearingImpaired = + new JCheckBox(Messages.getString("PreferenceDialog.ExcludeHearingImpaired"))); TitlePanel.title(Messages.getString("PreferenceDialog.TableOptions")) .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow, wrap") @@ -58,42 +65,45 @@ public OptionsPanel(SettingsControl settingsCtrl) { TitlePanel.title(Messages.getString("PreferenceDialog.ErrorHandlingOption")) .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow, wrap") - .addComponent(this.chkStopOnSearchError = new JCheckBox(Messages.getString("PreferenceDialog.StopAfterError"))); + .addComponent(this.chkStopOnSearchError = + new JCheckBox(Messages.getString("PreferenceDialog.StopAfterError"))); TitlePanel.title(Messages.getString("PreferenceDialog.SerieDatabaseSource")) .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow") - .addComponent(this.cbxEpisodeProcessSource = MyComboBox.ofValues(SettingsProcessEpisodeSource.values()), "wrap") - .addComponent(this.chkConfirmProviderMapping = new JCheckBox(Messages.getString("PreferenceDialog.ConfirmProviderMapping"))); + .addComponent(this.cbxEpisodeProcessSource = MyComboBox.ofValues(SettingsProcessEpisodeSource.values()), + "wrap") + .addComponent(this.chkConfirmProviderMapping = + new JCheckBox(Messages.getString("PreferenceDialog.ConfirmProviderMapping"))); loadPreferenceSettings(); } public void loadPreferenceSettings() { - chkAlwaysConfirm.setSelected(settingsCtrl.getSettings().optionsAlwaysConfirm); - chkMinScoreSelection.setSelected(settingsCtrl.getSettings().isOptionsMinAutomaticSelection); - sldMinScoreSelection.setValue(settingsCtrl.getSettings().optionsMinAutomaticSelectionValue); - chkDefaultSelection.setSelected(settingsCtrl.getSettings().isOptionsDefaultSelection); - chkSubtitleExactMethod.setSelected(settingsCtrl.getSettings().optionSubtitleExactMatch); - chkSubtitleKeywordMethod.setSelected(settingsCtrl.getSettings().optionSubtitleKeywordMatch); - chkExcludeHearingImpaired.setSelected(settingsCtrl.getSettings().optionSubtitleExcludeHearingImpaired); - chkOnlyFound.setSelected(settingsCtrl.getSettings().optionsShowOnlyFound); - chkStopOnSearchError.setSelected(settingsCtrl.getSettings().optionsStopOnSearchError); - cbxEpisodeProcessSource.setSelectedItem(settingsCtrl.getSettings().processEpisodeSource); - chkConfirmProviderMapping.setSelected(settingsCtrl.getSettings().isOptionsConfirmProviderMapping); + chkAlwaysConfirm.setSelected(settingsCtrl.settings.optionsAlwaysConfirm); + chkMinScoreSelection.setSelected(settingsCtrl.settings.optionsMinAutomaticSelection); + sldMinScoreSelection.setValue(settingsCtrl.settings.optionsMinAutomaticSelectionValue); + chkDefaultSelection.setSelected(settingsCtrl.settings.optionsDefaultSelection); + chkSubtitleExactMethod.setSelected(settingsCtrl.settings.optionSubtitleExactMatch); + chkSubtitleKeywordMethod.setSelected(settingsCtrl.settings.optionSubtitleKeywordMatch); + chkExcludeHearingImpaired.setSelected(settingsCtrl.settings.optionSubtitleExcludeHearingImpaired); + chkOnlyFound.setSelected(settingsCtrl.settings.optionsShowOnlyFound); + chkStopOnSearchError.setSelected(settingsCtrl.settings.optionsStopOnSearchError); + cbxEpisodeProcessSource.setSelectedItem(settingsCtrl.settings.processEpisodeSource); + chkConfirmProviderMapping.setSelected(settingsCtrl.settings.optionsConfirmProviderMapping); } public void savePreferenceSettings() { - settingsCtrl.getSettings().optionsAlwaysConfirm = chkAlwaysConfirm.isSelected(); - settingsCtrl.getSettings().optionsMinAutomaticSelection = chkMinScoreSelection.isSelected(); - settingsCtrl.getSettings().optionsMinAutomaticSelectionValue = sldMinScoreSelection.getValue(); - settingsCtrl.getSettings().optionsDefaultSelection = chkDefaultSelection.isSelected(); - settingsCtrl.getSettings().optionSubtitleExactMatch = chkSubtitleExactMethod.isSelected(); - settingsCtrl.getSettings().optionSubtitleKeywordMatch = chkSubtitleKeywordMethod.isSelected(); - settingsCtrl.getSettings().optionSubtitleExcludeHearingImpaired = chkExcludeHearingImpaired.isSelected(); - settingsCtrl.getSettings().optionsShowOnlyFound = chkOnlyFound.isSelected(); - settingsCtrl.getSettings().optionsStopOnSearchError = chkStopOnSearchError.isSelected(); - settingsCtrl.getSettings().processEpisodeSource = cbxEpisodeProcessSource.getSelectedItem(); - settingsCtrl.getSettings().optionsConfirmProviderMapping = chkConfirmProviderMapping.isSelected(); + settingsCtrl.settings.optionsAlwaysConfirm = chkAlwaysConfirm.isSelected(); + settingsCtrl.settings.optionsMinAutomaticSelection = chkMinScoreSelection.isSelected(); + settingsCtrl.settings.optionsMinAutomaticSelectionValue = sldMinScoreSelection.getValue(); + settingsCtrl.settings.optionsDefaultSelection = chkDefaultSelection.isSelected(); + settingsCtrl.settings.optionSubtitleExactMatch = chkSubtitleExactMethod.isSelected(); + settingsCtrl.settings.optionSubtitleKeywordMatch = chkSubtitleKeywordMethod.isSelected(); + settingsCtrl.settings.optionSubtitleExcludeHearingImpaired = chkExcludeHearingImpaired.isSelected(); + settingsCtrl.settings.optionsShowOnlyFound = chkOnlyFound.isSelected(); + settingsCtrl.settings.optionsStopOnSearchError = chkStopOnSearchError.isSelected(); + settingsCtrl.settings.processEpisodeSource = cbxEpisodeProcessSource.getSelectedItem(); + settingsCtrl.settings.optionsConfirmProviderMapping = chkConfirmProviderMapping.isSelected(); pnlDefaultSelection.savePreferenceSettings(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index 47c71ddf..856e8038 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -44,7 +44,8 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { super(new MigLayout("insets 0, fill, nogrid")); this.settingsCtrl = settingsCtrl; - JPanel titelPanel = TitlePanel.title(Messages.getString("PreferenceDialog.SelectPreferredSources")).addTo(this, "span, grow"); + JPanel titelPanel = TitlePanel.title(Messages.getString("PreferenceDialog.SelectPreferredSources")) + .addTo(this, "span, grow"); { // ADDIC7ED @@ -57,9 +58,11 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { .addComponent(PanelCheckBox.checkbox(chkUserAddic7edLogin).panelOnNewLine() .panelLayout(new MigLayout("insets 0, novisualpadding")).build() .addComponent(new JLabel(Messages.getString("PreferenceDialog.Username"))) - .addComponent("wrap", this.txtAddic7edUsername = MyTextFieldString.builder().requireValue().build().withColumns(20)) + .addComponent("wrap", this.txtAddic7edUsername = + MyTextFieldString.builder().requireValue().build().withColumns(20)) .addComponent(new JLabel(Messages.getString("PreferenceDialog.Password"))) - .addComponent(this.txtAddic7edPassword = MyPasswordField.builder().requireValue().build().withColumns(20))); + .addComponent(this.txtAddic7edPassword = + MyPasswordField.builder().requireValue().build().withColumns(20))); // TV SUBTITLES this.chkSourceTvSubtitles = new JCheckBox("Tv Subtitles").addTo(titelPanel, "wrap"); @@ -69,14 +72,17 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { // OPENSUBTITLES this.chkSourceOpenSubtitles = new JCheckBox("OpenSubtitles"); - this.chkUserOpenSubtitlesLogin = new JCheckBox(Messages.getString("PreferenceDialog.UseOpenSubtitlesLogin")); + this.chkUserOpenSubtitlesLogin = + new JCheckBox(Messages.getString("PreferenceDialog.UseOpenSubtitlesLogin")); PanelCheckBox.checkbox(chkSourceOpenSubtitles).panelOnNewLine().addTo(titelPanel, "wrap") .addComponent(PanelCheckBox.checkbox(chkUserOpenSubtitlesLogin).panelOnNewLine() .panelLayout(new MigLayout("insets 0, novisualpadding")).build() .addComponent(new JLabel(Messages.getString("PreferenceDialog.Username"))) - .addComponent("wrap", txtOpenSubtitlesUsername = MyTextFieldString.builder().requireValue().build().withColumns(20)) + .addComponent("wrap", txtOpenSubtitlesUsername = + MyTextFieldString.builder().requireValue().build().withColumns(20)) .addComponent(new JLabel(Messages.getString("PreferenceDialog.Password"))) - .addComponent(txtOpenSubtitlesPassword = MyPasswordField.builder().requireValue().build().withColumns(20))); + .addComponent(txtOpenSubtitlesPassword = + MyPasswordField.builder().requireValue().build().withColumns(20))); // SUBSCENE this.chkSourceSubscene = new JCheckBox("Subscene").addTo(titelPanel, "wrap"); @@ -84,7 +90,8 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { // LOCAL this.chkSourceLocal = new JCheckBox(Messages.getString("PreferenceDialog.Local")); JScrollPane scrLocalSources = - new JScrollPane().withViewPort(this.localSourcesFoldersList = JListWithImages.createForType(Path.class).distinctValues().build()); + new JScrollPane().withViewPort(this.localSourcesFoldersList = + JListWithImages.createForType(Path.class).distinctValues().build()); JButton btnBrowseLocalSources = new JButton(Messages.getString("PreferenceDialog.AddFolder")) .withActionListener(() -> MemoryFolderChooser.getInstance() .selectDirectory(this, Messages.getString("PreferenceDialog.SelectFolder")) @@ -94,8 +101,10 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { .withActionListener(localSourcesFoldersList::removeSelectedItem); PanelCheckBox.checkbox(chkSourceLocal).panelOnNewLine().addTo(titelPanel) - .addComponent("aligny top, gapy 5px", new JLabel(Messages.getString("PreferenceDialog.LocalFolderWithSubtitles"))) - .addComponent("wrap", new JPanel(new MigLayout("insets 0", "[grow, nogrid]")).addComponent("split", btnBrowseLocalSources) + .addComponent("aligny top, gapy 5px", + new JLabel(Messages.getString("PreferenceDialog.LocalFolderWithSubtitles"))) + .addComponent("wrap", new JPanel(new MigLayout("insets 0", "[grow, nogrid]")).addComponent("split", + btnBrowseLocalSources) .addComponent("wrap", btnRemoveLocalSources).addComponent("wrap", scrLocalSources)); } @@ -103,39 +112,41 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { } public void loadPreferenceSettings() { - chkSourceAddic7ed.setSelected(settingsCtrl.getSettings().serieSourceAddic7ed); - chkUserAddic7edLogin.setSelected(settingsCtrl.getSettings().loginAddic7edEnabled); - chkSourceAddic7edProxy.setSelected(settingsCtrl.getSettings().serieSourceAddic7edProxy); - // chkSourceAddic7edProxy.setEnabled(settingsCtrl.getSettings().serieSourceAddic7ed); - txtAddic7edUsername.setText(settingsCtrl.getSettings().loginAddic7edUsername); - txtAddic7edPassword.setText(settingsCtrl.getSettings().loginAddic7edPassword); - - chkSourceTvSubtitles.setSelected(settingsCtrl.getSettings().serieSourceTvSubtitles); - chkSourcePodnapisi.setSelected(settingsCtrl.getSettings().serieSourcePodnapisi); - chkSourceOpenSubtitles.setSelected(settingsCtrl.getSettings().serieSourceOpensubtitles); - chkUserOpenSubtitlesLogin.setSelected(settingsCtrl.getSettings().loginOpenSubtitlesEnabled); - txtOpenSubtitlesUsername.setText(settingsCtrl.getSettings().loginOpenSubtitlesUsername); - txtOpenSubtitlesPassword.setText(settingsCtrl.getSettings().loginOpenSubtitlesPassword); - chkSourceSubscene.setSelected(settingsCtrl.getSettings().serieSourceSubscene); - chkSourceLocal.setSelected(settingsCtrl.getSettings().serieSourceLocal); - settingsCtrl.getSettings().localSourcesFolders.forEach(path -> localSourcesFoldersList.addItem(PathMatchType.FOLDER.getImage(), path)); + chkSourceAddic7ed.setSelected(settingsCtrl.settings.serieSourceAddic7ed); + chkUserAddic7edLogin.setSelected(settingsCtrl.settings.loginAddic7edEnabled); + chkSourceAddic7edProxy.setSelected(settingsCtrl.settings.serieSourceAddic7edProxy); + // chkSourceAddic7edProxy.setEnabled(settingsCtrl.settings.serieSourceAddic7ed); + txtAddic7edUsername.setText(settingsCtrl.settings.loginAddic7edUsername); + txtAddic7edPassword.setText(settingsCtrl.settings.loginAddic7edPassword); + + chkSourceTvSubtitles.setSelected(settingsCtrl.settings.serieSourceTvSubtitles); + chkSourcePodnapisi.setSelected(settingsCtrl.settings.serieSourcePodnapisi); + chkSourceOpenSubtitles.setSelected(settingsCtrl.settings.serieSourceOpensubtitles); + chkUserOpenSubtitlesLogin.setSelected(settingsCtrl.settings.loginOpenSubtitlesEnabled); + txtOpenSubtitlesUsername.setText(settingsCtrl.settings.loginOpenSubtitlesUsername); + txtOpenSubtitlesPassword.setText(settingsCtrl.settings.loginOpenSubtitlesPassword); + chkSourceSubscene.setSelected(settingsCtrl.settings.serieSourceSubscene); + chkSourceLocal.setSelected(settingsCtrl.settings.serieSourceLocal); + settingsCtrl.settings.localSourcesFolders.forEach( + path -> localSourcesFoldersList.addItem(PathMatchType.FOLDER.image, path)); } public void savePreferenceSettings() { - settingsCtrl.getSettings().serieSourceAddic7ed = chkSourceAddic7ed.isSelected(); - settingsCtrl.getSettings().loginAddic7edEnabled = chkUserAddic7edLogin.isSelected(); - settingsCtrl.getSettings().serieSourceAddic7edProxy = chkSourceAddic7edProxy.isSelected(); - settingsCtrl.getSettings().loginAddic7edUsername = txtAddic7edUsername.getText(); - settingsCtrl.getSettings().loginAddic7edPassword = new String(txtAddic7edPassword.getPassword()); - settingsCtrl.getSettings().serieSourceTvSubtitles = chkSourceTvSubtitles.isSelected(); - settingsCtrl.getSettings().serieSourcePodnapisi = chkSourcePodnapisi.isSelected(); - settingsCtrl.getSettings().serieSourceOpensubtitles = chkSourceOpenSubtitles.isSelected(); - settingsCtrl.getSettings().loginOpenSubtitlesEnabled = chkUserOpenSubtitlesLogin.isSelected(); - settingsCtrl.getSettings().loginOpenSubtitlesUsername = txtOpenSubtitlesUsername.getText(); - settingsCtrl.getSettings().loginOpenSubtitlesPassword = new String(txtOpenSubtitlesPassword.getPassword()); - settingsCtrl.getSettings().serieSourceSubscene = chkSourceSubscene.isSelected(); - settingsCtrl.getSettings().serieSourceLocal = chkSourceLocal.isSelected(); - settingsCtrl.getSettings().localSourcesFolders = localSourcesFoldersList.stream().map(LabelPanel::getObject).toList(); + settingsCtrl.settings.serieSourceAddic7ed = chkSourceAddic7ed.isSelected(); + settingsCtrl.settings.loginAddic7edEnabled = chkUserAddic7edLogin.isSelected(); + settingsCtrl.settings.serieSourceAddic7edProxy = chkSourceAddic7edProxy.isSelected(); + settingsCtrl.settings.loginAddic7edUsername = txtAddic7edUsername.getText(); + settingsCtrl.settings.loginAddic7edPassword = new String(txtAddic7edPassword.getPassword()); + settingsCtrl.settings.serieSourceTvSubtitles = chkSourceTvSubtitles.isSelected(); + settingsCtrl.settings.serieSourcePodnapisi = chkSourcePodnapisi.isSelected(); + settingsCtrl.settings.serieSourceOpensubtitles = chkSourceOpenSubtitles.isSelected(); + settingsCtrl.settings.loginOpenSubtitlesEnabled = chkUserOpenSubtitlesLogin.isSelected(); + settingsCtrl.settings.loginOpenSubtitlesUsername = txtOpenSubtitlesUsername.getText(); + settingsCtrl.settings.loginOpenSubtitlesPassword = new String(txtOpenSubtitlesPassword.getPassword()); + settingsCtrl.settings.serieSourceSubscene = chkSourceSubscene.isSelected(); + settingsCtrl.settings.serieSourceLocal = chkSourceLocal.isSelected(); + settingsCtrl.settings.localSourcesFolders = + localSourcesFoldersList.stream().map(LabelPanel::getObject).toList(); } private boolean hasValidSettingsAddic7ed() { @@ -146,8 +157,9 @@ private boolean hasValidSettingsOpenSubtitles() { if (!txtOpenSubtitlesUsername.hasValidValue() || !txtOpenSubtitlesPassword.hasValidValue()) { return false; } - if (chkUserOpenSubtitlesLogin.isSelected() && !OpenSubtitlesApi.isValidCredentials(txtOpenSubtitlesUsername.getText(), - new String(txtOpenSubtitlesPassword.getPassword()))) { + if (chkUserOpenSubtitlesLogin.isSelected() && + !OpenSubtitlesApi.isValidCredentials(txtOpenSubtitlesUsername.getText(), + new String(txtOpenSubtitlesPassword.getPassword()))) { txtOpenSubtitlesUsername.setErrorBorder(); txtOpenSubtitlesPassword.setErrorBorder(); return false; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index 82986527..0eb8f224 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -46,39 +46,45 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, super(new MigLayout("insets 0, fill, nogrid")); this.librarySettings = librarySettings; - JPanel titelPanel = TitlePanel.title(Messages.getString("PreferenceDialog.RenameFiles")) + JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.RenameFiles")) .margin(0).padding(0).marginLeft(20).paddingLeft(20).addTo(this, "span, grow"); { - new JLabel(Messages.getString("PreferenceDialog.Structure")).addTo(titelPanel, "shrink"); - this.txtFileStructure = MyTextFieldString.builder().requireValue().build().withColumns(20).addTo(titelPanel, "grow"); + new JLabel(Messages.getString("PreferenceDialog.Structure")).addTo(titlePanel, "shrink"); + this.txtFileStructure = + MyTextFieldString.builder().requireValue().build().withColumns(20).addTo(titlePanel, "grow"); new JButton(Messages.getString("StructureBuilderDialog.Structure")) .withActionListener(() -> { StructureBuilderDialog sDialog = - new StructureBuilderDialog(null, Messages.getString("PreferenceDialog.StructureBuilderTitle"), true, videoType, - StructureBuilderDialog.StructureType.FILE, manager, userInteractionHandler, getLibraryStructureBuilder()); + new StructureBuilderDialog(null, + Messages.getString("PreferenceDialog.StructureBuilderTitle"), true, videoType, + StructureBuilderDialog.StructureType.FILE, manager, userInteractionHandler, + getLibraryStructureBuilder()); String value = sDialog.showDialog(txtFileStructure.getText()); if (!value.isEmpty()) { txtFileStructure.setText(value); } }) - .addTo(titelPanel, "shrink, wrap"); + .addTo(titlePanel, "shrink, wrap"); this.chkReplaceSpace = new JCheckBox(Messages.getString("PreferenceDialog.ReplaceSpaceWith")); - PanelCheckBox.checkbox(chkReplaceSpace).panelOnSameLine().addTo(titelPanel, "wrap") - .addComponent("width pref+10px, wrap", this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); + PanelCheckBox.checkbox(chkReplaceSpace).panelOnSameLine().addTo(titlePanel, "wrap") + .addComponent("width pref+10px, wrap", + this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); - this.chkIncludeLanguageCode = new JCheckBox(Messages.getString("PreferenceDialog.IncludeLanguageInFileName")) - .withSelectedListener(languageMapping::refreshState).addTo(titelPanel, "wrap"); + this.chkIncludeLanguageCode = + new JCheckBox(Messages.getString("PreferenceDialog.IncludeLanguageInFileName")) + .withSelectedListener(languageMapping::refreshState).addTo(titlePanel, "wrap"); JPanel languagePanelRoot = PanelCheckBox.checkbox(chkIncludeLanguageCode) .panelOnNewLine().panelLayout(new MigLayout("insets 0, novisualpadding", "[][][]")) - .addTo(titelPanel, "span, growx"); + .addTo(titlePanel, "span, growx"); { JPanel languagePanel = new JPanel(new MigLayout("insets 0, novisualpadding", "[][][][20px]")); - JScrollPane languageScrollPane = new JScrollPane(languagePanel).addTo(languagePanelRoot, "span, growx, wrap, hidemode 3"); + JScrollPane languageScrollPane = + new JScrollPane(languagePanel).addTo(languagePanelRoot, "span, growx, wrap, hidemode 3"); languageScrollPane.setBorder(new EmptyBorder(0, 0, 0, 0)); languageScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); languageScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); @@ -88,8 +94,10 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, addLanguageSupplier = () -> { int id = langId.getAndIncrement(); MyComboBox cmbLanguage = - new MyComboBox<>(Language.values()).withToMessageStringRenderer(Language::getMsgCode).addTo(languagePanel); - MyTextFieldString txtLanguage = MyTextFieldString.builder().build().withColumns(20).addTo(languagePanel); + new MyComboBox<>(Language.values()).withToMessageStringRenderer(Language::getMsgCode) + .addTo(languagePanel); + MyTextFieldString txtLanguage = + MyTextFieldString.builder().build().withColumns(20).addTo(languagePanel); JButton btnDelete = new JButton(Messages.getString("StructureFilePanel.Delete")) .withActionListenerSelf(delBtn -> { languagePanel.remove(cmbLanguage); @@ -117,7 +125,8 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, loadPreferenceSettings(); } - private record LanguageComponents(MyComboBox cmbLanguage, MyTextFieldString txtLanguage, JButton btnDelete) { + private record LanguageComponents(MyComboBox cmbLanguage, MyTextFieldString txtLanguage, + JButton btnDelete) { public void setValue(Language language, String langCode) { cmbLanguage.setSelectedItem(language); @@ -206,8 +215,9 @@ private void updateBorder(Language lang) { public boolean hasValidSettings() { return languageComponentsMap.values().stream().allMatch(LanguageComponents::hasValidValue) - && languageComponentsMap.values().stream().map(LanguageComponents::getLanguage).distinct().count() == languageComponentsMap - .size(); + && languageComponentsMap.values().stream().map(LanguageComponents::getLanguage).distinct().count() == + languageComponentsMap + .size(); } private Stream getLanguageComponentsForLanguageStream(Language language) { @@ -220,13 +230,17 @@ public Optional getLanguageComponentsForLanguage(Language la public Map toSettingsMap() { return languageComponentsMap.values().stream().collect(Collectors.toMap( - langComps -> langComps.cmbLanguage().getSelectedItem(), langComps -> langComps.txtLanguage().getText(), + langComps -> langComps.cmbLanguage().getSelectedItem(), + langComps -> langComps.txtLanguage().getText(), (v1, v2) -> v1, LinkedHashMap::new)); } public void refreshState(boolean enabled) { if (enabled) { - languageComponentsMap.values().stream().map(langComp -> langComp.cmbLanguage.getSelectedItem()).distinct() + languageComponentsMap.values() + .stream() + .map(langComp -> langComp.cmbLanguage.getSelectedItem()) + .distinct() .forEach(this::updateBorder); } else { languageComponentsMap.values() diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/Info.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/Info.java index 02eb739a..2c5d5ee5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/Info.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/Info.java @@ -1,10 +1,12 @@ package org.lodder.subtools.multisubdownloader.lib; +import lombok.experimental.UtilityClass; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@UtilityClass public class Info { private static final Logger LOGGER = LoggerFactory.getLogger(Info.class); @@ -42,7 +44,8 @@ public static void subtitleFiltering(Settings settings, boolean isCli) { System.out.println("----- Subtitle Filtering ------"); System.out.println(" - OptionSubtitleExactMatch : " + settings.optionSubtitleExactMatch); System.out.println(" - OptionSubtitleKeywordMatch : " + settings.optionSubtitleKeywordMatch); - System.out.println(" - OptionSubtitleExcludeHearingImpaired : " + settings.optionSubtitleExcludeHearingImpaired); + System.out.println( + " - OptionSubtitleExcludeHearingImpaired : " + settings.optionSubtitleExcludeHearingImpaired); System.out.println("-------------------------------"); } else { LOGGER.info("----- Subtitle Filtering ------"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java index 3539b3b2..675ffdb5 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java @@ -35,10 +35,9 @@ public void process() throws ReleaseControlException { if (StringUtils.isBlank(movieRelease.name)) { throw new ReleaseControlException("Unable to extract/find title, check file", movieRelease); } else { - int imdbId = imdbAdapter.getImdbId(movieRelease.name, movieRelease.year) + movieRelease.imdbId = imdbAdapter.getImdbId(movieRelease.name, movieRelease.year) .orElseThrow( () -> new ReleaseControlException("Movie not found on IMDB, check file", movieRelease)); - movieRelease.setImdbId(imdbId); Optional movieDetails = movieRelease.getImdbId().mapToObj(imdbAdapter::getMovieDetails).orElseGet(Optional::empty); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java index 6c659b4f..394df25e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/ReleaseControl.java @@ -14,7 +14,7 @@ public abstract sealed class ReleaseControl permits MovieReleaseControl, TvRelea @get(Protected) Settings settings; @get(Protected) Manager manager; - @get(Abstract) Release videoFile; + @get abstract Release videoFile; ReleaseControl(Settings settings, Manager manager) { this.settings = settings; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java index b165baea..9eb701c9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/sorting/ScoreCalculator.java @@ -11,11 +11,13 @@ public ScoreCalculator(SortWeight weights) { } public int calculate(Subtitle subtitle) { - if (weights.getMaxScore() <= 0) { + if (weights.maxScore <= 0) { return 0; } - String subtitleInfo = "%s %s %s".formatted(subtitle.fileName, subtitle.quality, subtitle.releaseGroup).trim().toLowerCase(); - int score = weights.getWeights().keySet().stream().filter(subtitleInfo::contains).mapToInt(weights.getWeights()::get).sum(); - return (int) Math.ceil((float) score / weights.getMaxScore() * 100); + String subtitleInfo = + "%s %s %s".formatted(subtitle.fileName, subtitle.quality, subtitle.releaseGroup).trim().toLowerCase(); + int score = + weights.weights.keySet().stream().filter(subtitleInfo::contains).mapToInt(weights.weights::get).sum(); + return (int) Math.ceil((float) score / weights.maxScore * 100); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index 566384ab..b35fadc8 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -25,7 +25,8 @@ public class FilenameLibraryBuilder extends LibraryBuilder { private final Map languageTags; private final boolean rename; - private FilenameLibraryBuilder(String structure, boolean replaceSpace, char replacingSpaceChar, boolean includeLanguageCode, + private FilenameLibraryBuilder(String structure, boolean replaceSpace, char replacingSpaceChar, + boolean includeLanguageCode, Map languageTags, boolean useTvdb, TheTvdbAdapter tvdbAdapter, boolean rename) { super(useTvdb, tvdbAdapter); this.structure = structure; @@ -117,7 +118,8 @@ public static class FilenameLibraryBuilderBuilder implements @Override public FilenameLibraryBuilder build() { - return new FilenameLibraryBuilder(structure, replaceSpace, replacingSpaceChar, includeLanguageCode, languageTags, useTvdbName, + return new FilenameLibraryBuilder(structure, replaceSpace, replacingSpaceChar, includeLanguageCode, + languageTags, useTvdbName, tvdbAdapter, rename); } } @@ -130,12 +132,16 @@ public Path build(Release release) { filename = structure; // order is important! filename = replace(filename, SerieStructureTag.SHOW_NAME, getShowName(tvRelease.name)); - filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_LONG, tvRelease.episodeNumbers, true); - filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_SHORT, tvRelease.episodeNumbers, false); + filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_LONG, + tvRelease.episodeNumbers, true); + filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_SHORT, + tvRelease.episodeNumbers, false); filename = replace(filename, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.season, true)); filename = replace(filename, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.season, false)); - filename = replace(filename, SerieStructureTag.EPISODE_LONG, formattedNumber(tvRelease.firstEpisodeNumber, true)); - filename = replace(filename, SerieStructureTag.EPISODE_SHORT, formattedNumber(tvRelease.firstEpisodeNumber, false)); + filename = replace(filename, SerieStructureTag.EPISODE_LONG, + formattedNumber(tvRelease.firstEpisodeNumber, true)); + filename = replace(filename, SerieStructureTag.EPISODE_SHORT, + formattedNumber(tvRelease.firstEpisodeNumber, false)); filename = replace(filename, SerieStructureTag.TITLE, tvRelease.title); filename = replace(filename, SerieStructureTag.QUALITY, release.quality); filename = replace(filename, SerieStructureTag.DESCRIPTION, release.description); @@ -164,7 +170,7 @@ public String buildSubtitle(Release release, String filename, Language language, filename = filename.substring(0, filename.indexOf(extension)) + "-v$version.${release.extension}"; } if (includeLanguageCode) { - String langCode = language == null ? "" : languageTags.getOrDefault(language, language.getLangCode()); + String langCode = language == null ? "" : languageTags.getOrDefault(language, language.langCode); filename = changeExtension(filename, !"".equals(langCode) ? ".$langCode.srt" : ".srt"); } else { filename = changeExtension(filename, ".srt"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryActionType.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryActionType.java index 2d7bff39..22e877ef 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryActionType.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryActionType.java @@ -1,24 +1,21 @@ package org.lodder.subtools.multisubdownloader.lib.library; -import java.util.Arrays; - import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.val; -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public enum LibraryActionType { NOTHING("PreferenceDialog.Action.Nothing"), RENAME("PreferenceDialog.Action.Rename"), MOVE("PreferenceDialog.Action.Move"), MOVEANDRENAME("PreferenceDialog.Action.MoveAndRename"); - @Getter - private final String msgCode; + @val String msgCode; @Deprecated(since = "Settings version 2") public static LibraryActionType fromString(String description) { - return Arrays.stream(LibraryActionType.values()) + return LibraryActionType.values().stream() .filter(v -> description.equalsIgnoreCase(v.toString())).findAny() .orElse(LibraryActionType.NOTHING); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java index 7d2fb5ba..6105d83c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryBuilder.java @@ -24,12 +24,13 @@ protected String getShowName(String name) { } protected String replace(String structure, StructureTag tag, String value) { - return structure.replace(tag.getLabel(), value); + return structure.replace(tag.label, value); } - protected String replaceFormattedEpisodeNumber(String structure, StructureTag tag, List episodeNumbers, boolean leadingZero) { - if (structure.contains(tag.getLabel())) { - String afterLabel = StringUtils.substringAfter(structure, tag.getLabel()); + protected String replaceFormattedEpisodeNumber(String structure, StructureTag tag, List episodeNumbers, + boolean leadingZero) { + if (structure.contains(tag.label)) { + String afterLabel = StringUtils.substringAfter(structure, tag.label); String separator = StringUtils.isNotEmpty(afterLabel) ? afterLabel.substring(0, 1) : ""; if ("%".equals(separator)) { separator = ""; @@ -37,7 +38,7 @@ protected String replaceFormattedEpisodeNumber(String structure, StructureTag ta String formattedEpisodeNumber = episodeNumbers.stream() .map(episode -> formattedNumber(episode, leadingZero)) .collect(Collectors.joining(separator)); - return structure.replace(tag.getLabel(), formattedEpisodeNumber); + return structure.replace(tag.label, formattedEpisodeNumber); } return structure; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java index 235ffcad..51b53c6f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java @@ -1,7 +1,5 @@ package org.lodder.subtools.multisubdownloader.lib.library; -import java.util.Arrays; - import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import org.lodder.subtools.multisubdownloader.Messages; @@ -24,7 +22,7 @@ public String toString() { @Deprecated(since = "Settings version 2") public static LibraryOtherFileActionType fromString(String description) { - return Arrays.stream(LibraryOtherFileActionType.values()) + return LibraryOtherFileActionType.values().stream() .filter(v -> description.equalsIgnoreCase(v.toString())).findAny() .orElse(LibraryOtherFileActionType.NOTHING); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java index 58ca81fc..78187882 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java @@ -24,8 +24,8 @@ public class PathLibraryBuilder extends LibraryBuilder { private final Path libraryFolder; private final boolean move; - private PathLibraryBuilder(String structure, boolean replaceSpace, char replacingSpaceChar, boolean useTvdb, TheTvdbAdapter tvdbAdapter, - Path libraryFolder, boolean move) { + private PathLibraryBuilder(String structure, boolean replaceSpace, char replacingSpaceChar, boolean useTvdb, + TheTvdbAdapter tvdbAdapter, Path libraryFolder, boolean move) { super(useTvdb, tvdbAdapter); this.structure = structure; this.replaceSpace = replaceSpace; @@ -34,7 +34,8 @@ private PathLibraryBuilder(String structure, boolean replaceSpace, char replacin this.move = move; } - public static PathLibraryBuilder fromSettings(LibrarySettings librarySettings, Manager manager, UserInteractionHandler userInteractionHandler) { + public static PathLibraryBuilder fromSettings(LibrarySettings librarySettings, Manager manager, + UserInteractionHandler userInteractionHandler) { return PathLibraryBuilder.builder() .structure(librarySettings.getLibraryFolderStructure()) .replaceSpace(librarySettings.isLibraryFolderReplaceSpace()) @@ -84,14 +85,10 @@ public interface PathLibraryBuilderBuildIntf { @Setter @Accessors(chain = true, fluent = true) - public static class PathLibraryBuilderBuilder implements - PathLibraryBuilderStructureIntf, - PathLibraryBuilderReplaceSpaceIntf, - PathLibraryBuilderReplaceSpaceCharIntf, - PathLibraryBuilderUseTvdbNameIntf, - PathLibraryBuilderTvdbAdapterIntf, - PathLibraryBuilderLibraryFolderIntf, - PathLibraryBuilderMoveIntf, + public static class PathLibraryBuilderBuilder + implements PathLibraryBuilderStructureIntf, PathLibraryBuilderReplaceSpaceIntf, + PathLibraryBuilderReplaceSpaceCharIntf, PathLibraryBuilderUseTvdbNameIntf, + PathLibraryBuilderTvdbAdapterIntf, PathLibraryBuilderLibraryFolderIntf, PathLibraryBuilderMoveIntf, PathLibraryBuilderBuildIntf { private String structure; @@ -107,21 +104,18 @@ public static class PathLibraryBuilderBuilder implements @Override public PathLibraryBuilder build() { - return new PathLibraryBuilder(structure, replaceSpace, replacingSpaceChar, useTvdbName, tvdbAdapter, libraryFolder, move); + return new PathLibraryBuilder(structure, replaceSpace, replacingSpaceChar, useTvdbName, tvdbAdapter, + libraryFolder, move); } } @Override public Path build(Release release) { if (move) { - Path subpath; - if (release instanceof TvRelease tvRelease) { - subpath = buildEpisode(tvRelease); - } else if (release instanceof MovieRelease movieRelease) { - subpath = buildMovie(movieRelease); - } else { - subpath = Path.of(""); - } + Path subpath = switch (release) { + case TvRelease tvRelease -> buildEpisode(tvRelease); + case MovieRelease movieRelease -> buildMovie(movieRelease); + }; return libraryFolder.resolve(subpath); } else { return release.getPath(); @@ -131,10 +125,12 @@ public Path build(Release release) { private Path buildEpisode(TvRelease tvRelease) { String folder = structure; - folder = folder.replace(SerieStructureTag.SHOW_NAME.getLabel(), getShowName(tvRelease.name)).removeIllegalWindowsChars(); + folder = folder.replace(SerieStructureTag.SHOW_NAME.label, getShowName(tvRelease.name)) + .removeIllegalWindowsChars(); // order is important! folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_LONG, tvRelease.episodeNumbers, true); - folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_SHORT, tvRelease.episodeNumbers, false); + folder = replaceFormattedEpisodeNumber(folder, SerieStructureTag.EPISODES_SHORT, tvRelease.episodeNumbers, + false); folder = replace(folder, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.season, true)); folder = replace(folder, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.season, false)); folder = replace(folder, SerieStructureTag.EPISODE_LONG, formattedNumber(tvRelease.firstEpisodeNumber, true)); @@ -146,7 +142,7 @@ private Path buildEpisode(TvRelease tvRelease) { folder = folder.replace(' ', replacingSpaceChar); } folder = folder.trim(); - return Paths.get("", folder.split(FolderStructureTag.SEPARATOR.getLabel())); + return Paths.get("", folder.split(FolderStructureTag.SEPARATOR.label)); } private Path buildMovie(MovieRelease movieRelease) { @@ -159,6 +155,6 @@ private Path buildMovie(MovieRelease movieRelease) { folder = folder.replace(' ', replacingSpaceChar); } folder = folder.trim(); - return Paths.get("", folder.split(FolderStructureTag.SEPARATOR.getLabel())); + return Paths.get("", folder.split(FolderStructureTag.SEPARATOR.label)); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java index 87cabb40..790508c8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java @@ -48,14 +48,14 @@ private SubtitleProvider createProvider(UserInteractionHandler userInteractionHa boolean loginEnabled = false; String username = ""; String password = ""; - if (settings.isLoginAddic7edEnabled()) { + if (settings.loginAddic7edEnabled) { username = StringUtils.trim(settings.loginAddic7edUsername); password = StringUtils.trim(settings.loginAddic7edPassword); /* Protect against empty login */ loginEnabled = !username.isEmpty() && !password.isEmpty(); } - if (settings.isSerieSourceAddic7edProxy()) { + if (settings.serieSourceAddic7edProxy) { return new JAddic7edViaProxyAdapter(manager, userInteractionHandler); } else { return new JAddic7edAdapter(loginEnabled, username, password, preferences.getBoolean("speedy", false), From 84005c8cf04600400778fe15769f1c10b179902c Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 16:29:56 +0100 Subject: [PATCH 25/54] changes --- .../gui/extra/PartialDisableComboBox.java | 7 +- .../panels/preference/StructureFilePanel.java | 20 +- .../preference/StructureFolderPanel.java | 23 +- .../preference/SubtitleBackupPanel.java | 35 +- .../panels/preference/VideoLibraryPanel.java | 55 ++- .../subtitles/filters/ExactNameFilter.java | 2 +- .../lib/library/FilenameLibraryBuilder.java | 12 +- .../lib/library/PathLibraryBuilder.java | 10 +- .../settings/SettingsControl.java | 81 ++-- .../settings/model/LibrarySettings.java | 39 +- .../settings/model/Settings.java | 12 +- .../subtitleproviders/SubtitleProvider.java | 6 +- .../adapters/AbstractAdapter.java | 4 +- .../subtitleproviders/adapters/Adapter.java | 39 +- .../adapters/JAddic7edAdapter.java | 46 ++- .../adapters/JAddic7edViaProxyAdapter.java | 60 ++- .../adapters/JOpenSubAdapter.java | 104 +++-- .../adapters/JPodnapisiAdapter.java | 45 +-- .../adapters/JSubsceneAdapter.java | 38 +- .../adapters/JTVsubtitlesAdapter.java | 48 +-- .../addic7ed/JAddic7edApi.java | 4 +- .../addic7ed/exception/Addic7edException.java | 2 +- .../gestdown/JAddic7edProxyGestdownApi.java | 21 +- .../opensubtitles/SearchSubtitles.java | 21 +- .../exception/OpenSubtitlesException.java | 2 +- .../podnapisi/JPodnapisiApi.java | 4 +- .../exception/PodnapisiException.java | 2 +- .../subscene/SubsceneApi.java | 362 ++++++++---------- .../subscene/exception/SubsceneException.java | 2 +- .../tvsubtitles/JTVSubtitlesApi.java | 4 +- .../exception/TvSubtitlesException.java | 2 +- .../subtools/multisubdownloader/Messages.java | 5 +- .../sublibrary/data/tvdb/TheTvdbApi.java | 6 +- 33 files changed, 528 insertions(+), 595 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java index 8257d92e..81bd7b4e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java @@ -26,7 +26,8 @@ public PartialDisableComboBox(T[] items) { private static final long serialVersionUID = -2774241371293899669L; @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, + boolean cellHasFocus) { Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); boolean disabled = index >= 0 && index < itemsState.size() && !itemsState.get(index); c.setEnabled(!disabled); @@ -101,4 +102,8 @@ private int requireValidIndex(int index) { } return index; } + + public T getSelectedItem() { + return (T) super.getSelectedItem(); + } } \ No newline at end of file diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index 0eb8f224..bd796ef6 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -168,20 +168,18 @@ public void setEnabled(boolean enabled) { } public void loadPreferenceSettings() { - txtFileStructure.setText(librarySettings.getLibraryFilenameStructure()); - chkReplaceSpace.setSelected(librarySettings.isLibraryFilenameReplaceSpace()); - cbxReplaceSpaceChar.setSelectedItem(librarySettings.getLibraryFilenameReplacingSpaceChar()); - chkIncludeLanguageCode.setSelected(librarySettings.isLibraryIncludeLanguageCode()); - librarySettings.getLangCodeMap().forEach(this::addLanguage); + txtFileStructure.setText(librarySettings.libraryFilenameStructure); + chkReplaceSpace.setSelected(librarySettings.libraryFilenameReplaceSpace); + cbxReplaceSpaceChar.setSelectedItem(librarySettings.libraryFilenameReplacingSpaceChar); + chkIncludeLanguageCode.setSelected(librarySettings.libraryIncludeLanguageCode); + librarySettings.langCodeMap.forEach(this::addLanguage); } public void savePreferenceSettings() { - librarySettings - .setLibraryFilenameStructure(txtFileStructure.getText()) - .setLibraryFilenameReplaceSpace(chkReplaceSpace.isSelected()) - .setLibraryFilenameReplacingSpaceChar(cbxReplaceSpaceChar.getSelectedItem()) - .setLibraryIncludeLanguageCode(chkIncludeLanguageCode.isSelected()) - .setLangCodeMap(languageMapping.toSettingsMap()); + librarySettings.libraryFilenameStructure = txtFileStructure.getText(); + librarySettings.libraryFilenameReplaceSpace = chkReplaceSpace.isSelected(); + librarySettings.libraryFilenameReplacingSpaceChar = cbxReplaceSpaceChar.getSelectedItem(); + librarySettings.langCodeMap = languageMapping.toSettingsMap(); } private static class LanguageMapping { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index 91b13731..6fab0843 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -107,22 +107,19 @@ public void setEnabled(boolean enabled) { } public void loadPreferenceSettings() { - txtLibraryFolder.setObject(librarySettings.getLibraryFolder()); - txtFolderStructure.setText(librarySettings.getLibraryFolderStructure()); - chkRemoveEmptyFolder.setSelected(librarySettings.isLibraryRemoveEmptyFolders()); - chkReplaceSpace.setSelected(librarySettings.isLibraryFolderReplaceSpace()); - cbxReplaceSpaceChar.setSelectedItem(librarySettings.getLibraryFolderReplacingSpaceChar()); + txtLibraryFolder.setObject(librarySettings.libraryFolder); + txtFolderStructure.setText(librarySettings.libraryFolderStructure); + chkRemoveEmptyFolder.setSelected(librarySettings.libraryRemoveEmptyFolders); + chkReplaceSpace.setSelected(librarySettings.libraryFolderReplaceSpace); + cbxReplaceSpaceChar.setSelectedItem(librarySettings.libraryFolderReplacingSpaceChar; } public void savePreferenceSettings() { - librarySettings - .setLibraryFolder(txtLibraryFolder.getObject()) - .setLibraryFolderStructure(txtFolderStructure.getText()) - .setLibraryRemoveEmptyFolders(chkRemoveEmptyFolder.isSelected()) - .setLibraryFolderReplaceSpace(chkReplaceSpace.isSelected()) - // if (pnlStructureFolder.isReplaceSpaceSelected()) { - .setLibraryFolderReplacingSpaceChar(cbxReplaceSpaceChar.getSelectedItem()); - // } + librarySettings.libraryFolder = txtLibraryFolder.getObject(); + librarySettings.libraryFolderStructure = txtFolderStructure.getText(); + librarySettings.libraryRemoveEmptyFolders = chkRemoveEmptyFolder.isSelected(); + librarySettings.libraryFolderReplaceSpace = chkReplaceSpace.isSelected(); + librarySettings.libraryFolderReplacingSpaceChar = cbxReplaceSpaceChar.getSelectedItem(); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java index eaf85052..5670f2d4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java @@ -13,8 +13,7 @@ public class SubtitleBackupPanel extends JPanel implements PreferencePanelIntf { - @Serial - private static final long serialVersionUID = -1498846730946617177L; + @Serial private static final long serialVersionUID = -1498846730946617177L; private final LibrarySettings librarySettings; private final JCheckBox chkBackupSubtitle; @@ -26,37 +25,43 @@ public SubtitleBackupPanel(LibrarySettings librarySettings) { this.librarySettings = librarySettings; JPanel titelPanel = TitlePanel.title(Messages.getString("PreferenceDialog.SubtitlesBackup")) - .margin(0).padding(0).paddingLeft(20).addTo(this, "span, growx"); + .margin(0) + .padding(0) + .paddingLeft(20) + .addTo(this, "span, growx"); { this.txtBackupSubtitlePath = MyTextFieldPath.builder().requireValue().build().withColumns(20); - PanelCheckBox.checkbox(this.chkBackupSubtitle = new JCheckBox(Messages.getString("PreferenceDialog.BackupSubtitles"))) - .panelOnNewLine().addTo(titelPanel, "span, wrap, growx") + PanelCheckBox.checkbox( + this.chkBackupSubtitle = new JCheckBox(Messages.getString("PreferenceDialog" + + ".BackupSubtitles"))) + .panelOnNewLine() + .addTo(titelPanel, "span, wrap, growx") .addComponent("split 3, shrink", new JLabel(Messages.getString("PreferenceDialog.Location"))) .addComponent("growx", txtBackupSubtitlePath) - .addComponent("shrink", new JButton(Messages.getString("App.Browse")) - .withActionListener(l -> MemoryFolderChooser.getInstance() + .addComponent("shrink", new JButton(Messages.getString("App.Browse")).withActionListener( + l -> MemoryFolderChooser.getInstance() .selectDirectory(this, Messages.getString("PreferenceDialog.SubtitleBackupFolder")) .ifPresent(txtBackupSubtitlePath::setObject))); - chkBackupUseSourceFileName = new JCheckBox(Messages.getString("PreferenceDialog.IncludeSourceInFileName")).addTo(titelPanel); + chkBackupUseSourceFileName = + new JCheckBox(Messages.getString("PreferenceDialog.IncludeSourceInFileName")).addTo(titelPanel); } loadPreferenceSettings(); } public void loadPreferenceSettings() { - chkBackupSubtitle.setSelected(librarySettings.isLibraryBackupSubtitle()); - txtBackupSubtitlePath.setObject(librarySettings.getLibraryBackupSubtitlePath()); - chkBackupUseSourceFileName.setSelected(librarySettings.isLibraryBackupUseWebsiteFileName()); + chkBackupSubtitle.setSelected(librarySettings.libraryBackupSubtitle); + txtBackupSubtitlePath.setObject(librarySettings.libraryBackupSubtitlePath); + chkBackupUseSourceFileName.setSelected(librarySettings.libraryBackupUseWebsiteFileName); } public void savePreferenceSettings() { - librarySettings - .setLibraryBackupSubtitle(chkBackupSubtitle.isSelected()) - .setLibraryBackupSubtitlePath(txtBackupSubtitlePath.getObject()) - .setLibraryBackupUseWebsiteFileName(chkBackupUseSourceFileName.isSelected()); + librarySettings.libraryBackupSubtitle = chkBackupSubtitle.isSelected(); + librarySettings.libraryBackupSubtitlePath = txtBackupSubtitlePath.getObject(); + librarySettings.libraryBackupUseWebsiteFileName = chkBackupUseSourceFileName.isSelected(); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java index 3f3da510..e93fd01d 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java @@ -22,8 +22,7 @@ public abstract sealed class VideoLibraryPanel extends JPanel implements PreferencePanelIntf permits EpisodeLibraryPanel, MovieLibraryPanel { - @Serial - private static final long serialVersionUID = -9175813173306481849L; + @Serial private static final long serialVersionUID = -9175813173306481849L; @val LibrarySettings librarySettings; private final MyComboBox cbxLibraryAction; @@ -41,23 +40,25 @@ public abstract sealed class VideoLibraryPanel extends JPanel implements Prefere this.pnlBackup = renameMode ? null : new SubtitleBackupPanel(librarySettings).addTo(this, "wrap, span, growx"); JPanel performActionPanel = TitlePanel.title(Messages.getString("PreferenceDialog.PerformActions")) - .margin(0).padding(0).paddingLeft(20).addTo(this, "span, growx"); + .margin(0) + .padding(0) + .paddingLeft(20) + .addTo(this, "span, growx"); { - this.chkUseTVDBNaming = new JCheckBox(Messages.getString("PreferenceDialog.UseTvdbName")) - .visible(VideoType.EPISODE == videoType) - .addTo(performActionPanel, "hidemode 3, wrap"); + this.chkUseTVDBNaming = new JCheckBox(Messages.getString("PreferenceDialog.UseTvdbName")).visible( + VideoType.EPISODE == videoType).addTo(performActionPanel, "hidemode 3, wrap"); new JLabel(Messages.getString("PreferenceDialog.ActionForShowFiles")).addTo(performActionPanel); - this.cbxLibraryAction = new MyComboBox<>(LibraryActionType.values()) - .withToMessageStringRenderer(LibraryActionType::getMsgCode) - .addTo(performActionPanel, "wrap"); + this.cbxLibraryAction = new MyComboBox<>(LibraryActionType.values()).withToMessageStringRenderer( + LibraryActionType::getMsgCode).addTo(performActionPanel, "wrap"); this.pnlStructureFolder = - new StructureFolderPanel(librarySettings, videoType, manager, userInteractionHandler) - .addTo(performActionPanel, "hidemode 3, wrap, span, growx"); - this.pnlStructureFile = new StructureFilePanel(librarySettings, videoType, manager, userInteractionHandler) - .addTo(performActionPanel, "hidemode 3, wrap, span, growx"); + new StructureFolderPanel(librarySettings, videoType, manager, userInteractionHandler).addTo( + performActionPanel, "hidemode 3, wrap, span, growx"); + this.pnlStructureFile = + new StructureFilePanel(librarySettings, videoType, manager, userInteractionHandler).addTo( + performActionPanel, "hidemode 3, wrap, span, growx"); JLabel lblActionForOtherFiles = new JLabel(Messages.getString("PreferenceDialog.ActionForOtherFiles")).addTo(performActionPanel); @@ -72,14 +73,13 @@ public abstract sealed class VideoLibraryPanel extends JPanel implements Prefere }); } - this.cbxLibraryAction - .withItemListener(() -> { - checkEnableStatusPanel(); - checkPossibleOtherFileActions(); - if (!cbxLibraryOtherFileAction.isItemEnabled(cbxLibraryOtherFileAction.getSelectedIndex())) { - cbxLibraryOtherFileAction.setSelectedIndex(0); - } - }); + this.cbxLibraryAction.withItemListener(() -> { + checkEnableStatusPanel(); + checkPossibleOtherFileActions(); + if (!cbxLibraryOtherFileAction.isItemEnabled(cbxLibraryOtherFileAction.getSelectedIndex())) { + cbxLibraryOtherFileAction.setSelectedIndex(0); + } + }); loadPreferenceSettings(); } @@ -120,9 +120,9 @@ private void checkEnableStatus(JPanel panel, boolean status) { } public void loadPreferenceSettings() { - cbxLibraryAction.setSelectedItem(librarySettings.getLibraryAction()); - chkUseTVDBNaming.setSelected(librarySettings.isLibraryUseTVDBNaming()); - cbxLibraryOtherFileAction.setSelectedItem(librarySettings.getLibraryOtherFileAction()); + cbxLibraryAction.setSelectedItem(librarySettings.libraryAction); + chkUseTVDBNaming.setSelected(librarySettings.libraryUseTVDBNaming); + cbxLibraryOtherFileAction.setSelectedItem(librarySettings.libraryOtherFileAction); checkEnableStatusPanel(); checkPossibleOtherFileActions(); @@ -132,10 +132,9 @@ public void savePreferenceSettings() { if (pnlBackup != null) { pnlBackup.savePreferenceSettings(); } - librarySettings.setLibraryAction(this.cbxLibraryAction.getSelectedItem()) - .setLibraryUseTVDBNaming(this.chkUseTVDBNaming.isSelected()) - .setLibraryOtherFileAction( - (LibraryOtherFileActionType) this.cbxLibraryOtherFileAction.getSelectedItem()); + librarySettings.libraryAction = this.cbxLibraryAction.getSelectedItem(); + librarySettings.libraryUseTVDBNaming = this.chkUseTVDBNaming.isSelected(); + librarySettings.libraryOtherFileAction = this.cbxLibraryOtherFileAction.getSelectedItem(); pnlStructureFolder.savePreferenceSettings(); pnlStructureFile.savePreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java index b05da57b..1bb408fe 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/ExactNameFilter.java @@ -18,7 +18,7 @@ public final class ExactNameFilter extends SubtitleFilter { @Override public boolean useSubtitle(Release release, Subtitle subtitle) { - Pattern p = patterns.computeIfAbsent(getReleaseName(release), k -> + Pattern p = patterns.computeIfAbsent(getReleaseName(release), _ -> Pattern.compile(getReleaseName(release).replace(" ", "[. ]"), Pattern.CASE_INSENSITIVE)); if (p.matcher(subtitle.fileName.toLowerCase().replace(".srt", "")).matches()) { LOGGER.debug("getSubtitlesFiltered: found EXACT match [{}] ", subtitle.fileName); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index b35fadc8..32c8170e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -40,12 +40,12 @@ private FilenameLibraryBuilder(String structure, boolean replaceSpace, char repl public static FilenameLibraryBuilder fromSettings(LibrarySettings librarySettings, Manager manager, UserInteractionHandler userInteractionHandler) { return FilenameLibraryBuilder.builder() - .structure(librarySettings.getLibraryFolderStructure()) - .replaceSpace(librarySettings.isLibraryFolderReplaceSpace()) - .replacingSpaceChar(librarySettings.getLibraryFolderReplacingSpaceChar()) - .includeLanguageCode(librarySettings.isLibraryIncludeLanguageCode()) - .languageTags(librarySettings.getLangCodeMap()) - .useTvdbName(librarySettings.isLibraryUseTVDBNaming()) + .structure(librarySettings.libraryFolderStructure) + .replaceSpace(librarySettings.libraryFolderReplaceSpace) + .replacingSpaceChar(librarySettings.libraryFolderReplacingSpaceChar) + .includeLanguageCode(librarySettings.libraryIncludeLanguageCode) + .languageTags(librarySettings.langCodeMap) + .useTvdbName(librarySettings.libraryUseTVDBNaming) .tvdbAdapter(TheTvdbAdapter.getInstance(manager, userInteractionHandler)) .rename(librarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) .build(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java index 78187882..f8f264ff 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/PathLibraryBuilder.java @@ -37,12 +37,12 @@ private PathLibraryBuilder(String structure, boolean replaceSpace, char replacin public static PathLibraryBuilder fromSettings(LibrarySettings librarySettings, Manager manager, UserInteractionHandler userInteractionHandler) { return PathLibraryBuilder.builder() - .structure(librarySettings.getLibraryFolderStructure()) - .replaceSpace(librarySettings.isLibraryFolderReplaceSpace()) - .replacingSpaceChar(librarySettings.getLibraryFolderReplacingSpaceChar()) - .useTvdbName(librarySettings.isLibraryUseTVDBNaming()) + .structure(librarySettings.libraryFolderStructure) + .replaceSpace(librarySettings.libraryFolderReplaceSpace) + .replacingSpaceChar(librarySettings.libraryFolderReplacingSpaceChar) + .useTvdbName(librarySettings.libraryUseTVDBNaming) .tvdbAdapter(TheTvdbAdapter.getInstance(manager, userInteractionHandler)) - .libraryFolder(librarySettings.getLibraryFolder()) + .libraryFolder(librarySettings.libraryFolder) .move(librarySettings.hasAnyLibraryAction(LibraryActionType.MOVE, LibraryActionType.MOVEANDRENAME)) .build(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java index 66a73a72..567fdf28 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java @@ -181,27 +181,23 @@ public void migrateSettingsV0ToV1() { // } EPISODE_LIBRARY_FOLDER_STRUCTURE.load(this, preferences); - settings.episodeLibrarySettings - .setLibraryFolderStructure( - migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFolderStructure())); + settings.episodeLibrarySettings.libraryFolderStructure = + migrateLibraryStructureV0(settings.episodeLibrarySettings.libraryFolderStructure); EPISODE_LIBRARY_FOLDER_STRUCTURE.store(this, preferences); EPISODE_LIBRARY_FILENAME_STRUCTURE.load(this, preferences); - settings.episodeLibrarySettings - .setLibraryFilenameStructure( - migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFilenameStructure())); + settings.episodeLibrarySettings.libraryFilenameStructure = + migrateLibraryStructureV0(settings.episodeLibrarySettings.libraryFilenameStructure); EPISODE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); MOVIE_LIBRARY_FOLDER_STRUCTURE.load(this, preferences); - settings.episodeLibrarySettings - .setLibraryFolderStructure( - migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFolderStructure())); + settings.episodeLibrarySettings.libraryFolderStructure = + migrateLibraryStructureV0(settings.episodeLibrarySettings.libraryFolderStructure); MOVIE_LIBRARY_FOLDER_STRUCTURE.store(this, preferences); MOVIE_LIBRARY_FILENAME_STRUCTURE.load(this, preferences); - settings.episodeLibrarySettings - .setLibraryFilenameStructure( - migrateLibraryStructureV0(settings.episodeLibrarySettings.getLibraryFilenameStructure())); + settings.episodeLibrarySettings.libraryFilenameStructure = + migrateLibraryStructureV0(settings.episodeLibrarySettings.libraryFilenameStructure); MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); try { @@ -220,22 +216,20 @@ public void migrateSettingsV0ToV1() { @SuppressWarnings("deprecation") public void migrateSettingsV1ToV2() { - settings.episodeLibrarySettings - .setLibraryOtherFileAction(LibraryOtherFileActionType.fromString( - preferences.get(EPISODE_LIBRARY_OTHER_FILE_ACTION.getKey(), ""))); + settings.episodeLibrarySettings.libraryOtherFileAction = + LibraryOtherFileActionType.fromString(preferences.get(EPISODE_LIBRARY_OTHER_FILE_ACTION.getKey(), "")); EPISODE_LIBRARY_OTHER_FILE_ACTION.store(this, preferences); - settings.movieLibrarySettings - .setLibraryOtherFileAction(LibraryOtherFileActionType.fromString( - preferences.get(MOVIE_LIBRARY_OTHER_FILE_ACTION.getKey(), ""))); + settings.movieLibrarySettings.libraryOtherFileAction = + LibraryOtherFileActionType.fromString(preferences.get(MOVIE_LIBRARY_OTHER_FILE_ACTION.getKey(), "")); MOVIE_LIBRARY_OTHER_FILE_ACTION.store(this, preferences); - settings.episodeLibrarySettings - .setLibraryAction(LibraryActionType.fromString(preferences.get(EPISODE_LIBRARY_ACTION.getKey(), ""))); + settings.episodeLibrarySettings.libraryAction = + LibraryActionType.fromString(preferences.get(EPISODE_LIBRARY_ACTION.getKey(), "")); EPISODE_LIBRARY_ACTION.store(this, preferences); - settings.movieLibrarySettings - .setLibraryAction(LibraryActionType.fromString(preferences.get(MOVIE_LIBRARY_ACTION.getKey(), ""))); + settings.movieLibrarySettings.libraryAction = + LibraryActionType.fromString(preferences.get(MOVIE_LIBRARY_ACTION.getKey(), "")); MOVIE_LIBRARY_ACTION.store(this, preferences); settings.settingsVersion = 2; @@ -284,12 +278,10 @@ public void migrateSettingsV3ToV4() { public void migrateSettingsV4ToV5() { Arrays.stream(MappingType.ADDIC7ED_PROXY.getSelectionForKeyPrefixList()) .forEach(selectionForKeyPrefix -> MappingType.MAPPING_SUPPLIER.apply(manager, selectionForKeyPrefix) - .forEach(serieMappingPair -> { - manager.valueBuilder() - .cacheType(CacheType.DISK) - .key(serieMappingPair.getKey()) - .remove(); - })); + .forEach(serieMappingPair -> manager.valueBuilder() + .cacheType(CacheType.DISK) + .key(serieMappingPair.getKey()) + .remove())); settings.settingsVersion = 5; SETTINGS_VERSION.store(this, preferences); } @@ -327,7 +319,7 @@ public void migrateSettingsV6ToV7() { String value = preferences.get(label, null); preferences.remove(label); if (StringUtils.isNotBlank(value)) { - librarySettings.getLangCodeMap().put(language, value.trim()); + librarySettings.langCodeMap.put(language, value.trim()); } }; consumer.accept("EpisodeLibraryDefaultNlText", Language.DUTCH, settings.episodeLibrarySettings); @@ -340,21 +332,21 @@ public void migrateSettingsV6ToV7() { if (settings.episodeLibrarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) { - if (StringUtils.isBlank(settings.episodeLibrarySettings.getLibraryFilenameStructure())) { - settings.movieLibrarySettings.setLibraryFilenameStructure("%SHOW NAME%%SEPARATOR%%Season %S%"); + if (StringUtils.isBlank(settings.episodeLibrarySettings.libraryFilenameStructure)) { + settings.movieLibrarySettings.libraryFilenameStructure = "%SHOW NAME%%SEPARATOR%%Season %S%"; MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); EPISODE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); } - if (StringUtils.isBlank(settings.episodeLibrarySettings.getLibraryFolderStructure())) { - settings.movieLibrarySettings.setLibraryFolderStructure("%SHOW NAME%.S%SS%E%EE%.%TITLE%"); + if (StringUtils.isBlank(settings.episodeLibrarySettings.libraryFolderStructure)) { + settings.movieLibrarySettings.libraryFolderStructure = "%SHOW NAME%.S%SS%E%EE%.%TITLE%"; EPISODE_LIBRARY_FOLDER_STRUCTURE.store(this, preferences); } } if (settings.movieLibrarySettings.hasAnyLibraryAction(LibraryActionType.RENAME, LibraryActionType.MOVEANDRENAME)) { - if (StringUtils.isBlank(settings.movieLibrarySettings.getLibraryFilenameStructure())) { - settings.movieLibrarySettings.setLibraryFilenameStructure("%MOVIE TITLE% (%YEAR%)"); + if (StringUtils.isBlank(settings.movieLibrarySettings.libraryFilenameStructure)) { + settings.movieLibrarySettings.libraryFilenameStructure = "%MOVIE TITLE% (%YEAR%)"; MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); } } @@ -364,9 +356,9 @@ public void migrateSettingsV6ToV7() { } public void migrateSettingsV7ToV8() { - if (settings.loginOpenSubtitlesEnabled - && !OpenSubtitlesApi.isValidCredentials(settings.loginOpenSubtitlesUsername, - settings.loginOpenSubtitlesPassword)) { + if (settings.loginOpenSubtitlesEnabled && + !OpenSubtitlesApi.isValidCredentials(settings.loginOpenSubtitlesUsername, + settings.loginOpenSubtitlesPassword)) { settings.loginOpenSubtitlesEnabled = false; LOGIN_OPEN_SUBTITLES_ENABLED.store(this, preferences); } @@ -408,8 +400,11 @@ private void migrateDatabaseV0ToV1() { } private void migrateDatabaseV1ToV2() { - List> entries = manager.valueBuilder().cacheType(CacheType.DISK) - .keyFilter(k -> k.startsWith("SUBSCENE-serieName-")).returnType(SerieMapping.class).getEntries(); + List> entries = manager.valueBuilder() + .cacheType(CacheType.DISK) + .keyFilter(k -> k.startsWith("SUBSCENE-serieName-")) + .returnType(SerieMapping.class) + .getEntries(); List> editedEntries = entries.stream().map(pair -> { int lastIndexOfDash = pair.getKey().lastIndexOf("-"); int season; @@ -418,9 +413,9 @@ private void migrateDatabaseV1ToV2() { } catch (NumberFormatException e) { season = -1; } - String name = pair.getValue().getName(); - String providerId = pair.getValue().getProviderId(); - String providerName = pair.getValue().getProviderName(); + String name = pair.getValue().name; + String providerId = pair.getValue().providerId; + String providerName = pair.getValue().providerName; SerieMapping serieMapping = new SerieMapping(name, providerId, providerName, season); System.out.println(serieMapping); return Pair.of(pair.getKey(), serieMapping); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java index 8b617c7b..15fbe979 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java @@ -5,34 +5,29 @@ import java.util.LinkedHashMap; import java.util.Map; -import lombok.Getter; -import lombok.Setter; -import lombok.experimental.Accessors; +import manifold.ext.props.rt.api.var; import org.lodder.subtools.multisubdownloader.lib.library.LibraryActionType; import org.lodder.subtools.multisubdownloader.lib.library.LibraryOtherFileActionType; import org.lodder.subtools.sublibrary.Language; -@Getter -@Setter -@Accessors(chain = true) public class LibrarySettings { - private String libraryFilenameStructure = ""; - private String libraryFolderStructure = ""; - private Path libraryFolder; - private boolean libraryFilenameReplaceSpace; - private boolean libraryFolderReplaceSpace; - private boolean libraryIncludeLanguageCode; - private boolean libraryRemoveEmptyFolders; - private boolean libraryUseTVDBNaming; - private LibraryActionType libraryAction = LibraryActionType.NOTHING; - private LibraryOtherFileActionType libraryOtherFileAction = LibraryOtherFileActionType.NOTHING; - private Character libraryFilenameReplacingSpaceChar; - private Character libraryFolderReplacingSpaceChar; - private boolean libraryBackupSubtitle; - private boolean libraryBackupUseWebsiteFileName; - private Path libraryBackupSubtitlePath; - private Map langCodeMap = new LinkedHashMap<>(); + @var String libraryFilenameStructure = ""; + @var String libraryFolderStructure = ""; + @var Path libraryFolder; + @var boolean libraryFilenameReplaceSpace; + @var boolean libraryFolderReplaceSpace; + @var boolean libraryIncludeLanguageCode; + @var boolean libraryRemoveEmptyFolders; + @var boolean libraryUseTVDBNaming; + @var LibraryActionType libraryAction = LibraryActionType.NOTHING; + @var LibraryOtherFileActionType libraryOtherFileAction = LibraryOtherFileActionType.NOTHING; + @var Character libraryFilenameReplacingSpaceChar; + @var Character libraryFolderReplacingSpaceChar; + @var boolean libraryBackupSubtitle; + @var boolean libraryBackupUseWebsiteFileName; + @var Path libraryBackupSubtitlePath; + @var Map langCodeMap = new LinkedHashMap<>(); public boolean hasLibraryAction(LibraryActionType libraryAction) { return this.libraryAction == libraryAction; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java index 5935b97e..f03d1b17 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/Settings.java @@ -68,10 +68,10 @@ public Settings() { Map sortWeightsTemp = new HashMap<>(); sortWeightsTemp.put("%GROUP%", 5); VideoPatterns.Source.values().stream() - .forEach(source -> source.getValues().stream() - .forEach(keyword -> sortWeightsTemp.put(keyword, source.isManyDifferentSources() ? 1 : 2))); + .forEach(source -> source.values.stream() + .forEach(keyword -> sortWeightsTemp.put(keyword, source.manyDifferentSources ? 1 : 2))); VideoPatterns.AudioEncoding.values().stream() - .forEach(encoding -> encoding.getValues().stream().forEach(keyword -> sortWeightsTemp.put(keyword, 2))); + .forEach(encoding -> encoding.values.stream().forEach(keyword -> sortWeightsTemp.put(keyword, 2))); this.sortWeights = Collections.unmodifiableMap(sortWeightsTemp); } @@ -83,12 +83,12 @@ public boolean hasDefaultFolders() { return !defaultIncomingFolders.isEmpty(); } - public boolean isSerieSource(SubtitleSource sbtitleSource) { + public boolean isSerieSource(SubtitleSource subtitleSource) { // TODO: dynamically inject SubtitleProvider to settings - return switch (sbtitleSource) { + return switch (subtitleSource) { case ADDIC7ED -> serieSourceAddic7ed; case OPENSUBTITLES -> serieSourceOpensubtitles; - case PODNAPISI ->serieSourcePodnapisi; + case PODNAPISI -> serieSourcePodnapisi; case TVSUBTITLES -> serieSourceTvSubtitles; case LOCAL -> serieSourceLocal; case SUBSCENE -> serieSourceSubscene; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java index 6c31fb50..54fd8470 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java @@ -30,7 +30,7 @@ public interface SubtitleProvider { * @return The name of the SubtitleProvider */ default String getName() { - return getSubtitleSource().getName(); + return getSubtitleSource().name; } /** @@ -55,9 +55,9 @@ default Set search(Release release, Language language) { } default void clearCache() { - getManager().clearExpiredCacheBuilder() + manager.clearExpiredCacheBuilder() .cacheType(CacheType.DISK) - .keyFilter((String k) -> k.startsWith(getProviderName() + "-")) + .keyFilter((String k) -> k.startsWith(providerName + "-")) .clear(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java index c6eeeaf4..70c562cf 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/AbstractAdapter.java @@ -54,11 +54,11 @@ private record HandleException(Predicate predicate, } public @Self ExecuteCall handleException(Function exceptionFunction) { - return handleException(e -> true, exceptionFunction); + return handleException(_ -> true, exceptionFunction); } public @Self ExecuteCall handleException(Supplier supplier) { - return handleException(e -> true, e -> supplier.get()); + return handleException(_ -> true, _ -> supplier.get()); } public @Self ExecuteCall retries(int retries) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 60b16c7f..1b07b1e0 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -42,7 +42,7 @@ public interface Adapter exte Logger LOGGER = LoggerFactory.getLogger(Adapter.class); default UserInteractionSettingsIntf getUserInteractionSettings() { - return getUserInteractionHandler().getSettings(); + return getUserInteractionHandler().settings; } UserInteractionHandler getUserInteractionHandler(); @@ -59,7 +59,7 @@ default Set searchSubtitles(MovieRelease movieRelease, Language langua LOGGER.error("Error calculating file hash", e); } catch (Exception e) { LOGGER.error("API %s searchSubtitles using file hash for movie [%s] (%s)".formatted( - getSubtitleSource().getName(), movieRelease.name, e.getMessage()), e); + getSubtitleSource().name, movieRelease.name, e.getMessage()), e); } } } @@ -68,15 +68,16 @@ default Set searchSubtitles(MovieRelease movieRelease, Language langua subtitles.addAll(searchMovieSubtitlesWithId(imdbId, language)); } catch (Exception e) { LOGGER.error("API %s searchSubtitles using imdbid [%s] for movie [%s] (%s)".formatted( - getSubtitleSource().getName(), imdbId, movieRelease.name, e.getMessage()), e); + getSubtitleSource().name, imdbId, movieRelease.name, e.getMessage()), e); } }); if (subtitles.isEmpty()) { try { subtitles.addAll(searchMovieSubtitlesWithName(movieRelease.name, movieRelease.year, language)); } catch (Exception e) { - LOGGER.error("API %s searchSubtitles using title for movie [%s] (%s)".formatted( - getSubtitleSource().getName(), movieRelease.name, e.getMessage()), e); + LOGGER.error( + "API %s searchSubtitles using title for movie [%s] (%s)".formatted(getSubtitleSource().name, + movieRelease.name, e.getMessage()), e); } } return convertToSubtitles(movieRelease, subtitles, language); @@ -96,7 +97,7 @@ default Set searchSubtitles(TvRelease tvRelease, Language language) { return convertToSubtitles(tvRelease, searchSerieSubtitles(tvRelease, language), language); } catch (Exception e) { String displayName = StringUtils.defaultIfBlank(tvRelease.originalName, tvRelease.name); - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, TvRelease.formatName(displayName, tvRelease.season, tvRelease.firstEpisodeNumber), e.getMessage()), e); @@ -139,8 +140,9 @@ default Optional getProviderSerieId(String serieName, String displ default Optional getProviderSerieId(String serieName, String serieNameToSearchFor, String displayName, int season, OptionalInt tvdbIdOptional) throws X { Supplier> tvdbIdValueBuilder = () -> tvdbIdOptional.mapToObj( - tvdbId -> getManager().valueBuilder().cacheType(CacheType.DISK) - .key("%s-serieName-tvdbId:%s-%s".formatted(getProviderName(), tvdbId, + tvdbId -> manager.valueBuilder() + .cacheType(CacheType.DISK) + .key("%s-serieName-tvdbId:%s-%s".formatted(providerName, tvdbId, useSeasonForSerieId() ? season : -1))).orElseThrow(); if (tvdbIdOptional.isPresent() && tvdbIdValueBuilder.get().isPresent()) { // if value using the tvdbId is present, return it @@ -150,9 +152,9 @@ default Optional getProviderSerieId(String serieName, String serie return Optional.empty(); } int seasonToUse = useSeasonForSerieId() ? season : 0; - ValueBuilderIsPresentIntf serieNameValueBuilder = getManager().valueBuilder() + ValueBuilderIsPresentIntf serieNameValueBuilder = manager.valueBuilder() .cacheType(CacheType.DISK) - .key("%s-serieName-name:%s-%s".formatted(getProviderName(), serieName.toLowerCase(), seasonToUse)); + .key("%s-serieName-name:%s-%s".formatted(providerName, serieName.toLowerCase(), seasonToUse)); if (StringUtils.equals(serieNameToSearchFor, serieName) && serieNameValueBuilder.isPresent()) { if (serieNameValueBuilder.isTemporaryObject()) { @@ -173,23 +175,23 @@ default Optional getProviderSerieId(String serieName, String serie // if no provider serie id's could be found, store a temporary null value with expiration time of 1 day // (so the provider isn't contacted every time this method is being called) // If a temporary expired value was already found, persist the null value with a doubled expiration time - serieNameValueBuilder - .value(new SerieMapping(serieName, null, null, seasonToUse)) + serieNameValueBuilder.value(new SerieMapping(serieName, null, null, seasonToUse)) .storeTempNullValue() - .timeToLive(serieNameValueBuilder.getTemporaryTimeToLive().map(v -> v * 2) + .timeToLive(serieNameValueBuilder.getTemporaryTimeToLive() + .map(v -> v * 2) .orElseGet(() -> TimeUnit.SECONDS.convert(1, TimeUnit.DAYS))) .storeAsTempValue(); return Optional.empty(); } SerieMapping serieMapping; - if (!getUserInteractionSettings().isOptionsConfirmProviderMapping && providerSerieIds.size() == 1) { + if (!getUserInteractionSettings().optionsConfirmProviderMapping && providerSerieIds.size() == 1) { serieMapping = new SerieMapping(serieName, providerSerieIds.first.id, providerSerieIds.first.name, seasonToUse); } else { - ValueBuilderIsPresentIntf previousResultsValueBuilder = getManager().valueBuilder() + ValueBuilderIsPresentIntf previousResultsValueBuilder = manager.valueBuilder() .cacheType(CacheType.MEMORY) - .key("%s-serieName-prev-results:%s-%s".formatted(getProviderName(), displayName.toLowerCase(), + .key("%s-serieName-prev-results:%s-%s".formatted(providerName, displayName.toLowerCase(), seasonToUse)); boolean previousResultsPresent = previousResultsValueBuilder.isPresent(); @@ -205,7 +207,7 @@ default Optional getProviderSerieId(String serieName, String serie Messages.getString("SelectDialog.SelectSerieNameForNameWithSeason") .formatted(displayName, seasonToUse) : Messages.getString("SelectDialog.SelectSerieNameForName").formatted(displayName), - getProviderName(), this::providerSerieIdToDisplayString); + providerName, this::providerSerieIdToDisplayString); } if (uriForSerie.isEmpty()) { if (serieNameToSearchFor.equals(serieName)) { @@ -213,7 +215,8 @@ default Optional getProviderSerieId(String serieName, String serie // or the doubled previously temporary value (if present) serieNameValueBuilder.value(new SerieMapping(serieNameToSearchFor, null, null, seasonToUse)) .storeTempNullValue() - .timeToLive(serieNameValueBuilder.getTemporaryTimeToLive().map(v -> v * 2) + .timeToLive(serieNameValueBuilder.getTemporaryTimeToLive() + .map(v -> v * 2) .orElseGet(() -> TimeUnit.SECONDS.convert(1, TimeUnit.DAYS))) .storeAsTempValue(); previousResultsValueBuilder.collectionValue(providerSerieIds).store(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java index 34bd760f..d3c625b2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java @@ -41,7 +41,8 @@ public JAddic7edAdapter(boolean isLoginEnabled, String username, String password if (jaapi == null) { jaapi = new LazySupplier<>(() -> { try { - return isLoginEnabled ? new JAddic7edApi(username, password, speedy, manager) : new JAddic7edApi(speedy, manager); + return isLoginEnabled ? new JAddic7edApi(username, password, speedy, manager) : + new JAddic7edApi(speedy, manager); } catch (Exception e) { throw new SubtitlesProviderInitException(getProviderName(), e); } @@ -82,31 +83,31 @@ public List searchMovieSubtitlesWithName(String name } @Override - public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, Language language) { + public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, + Language language) { // TODO implement this return Set.of(); } @Override - public Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws Addic7edException { - return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.episodeNumbers.stream() - .flatMap(episode -> { - try { - return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); - } catch (Addic7edException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), - e.getMessage()), e); - return Stream.empty(); - } - }) - .collect(Collectors.toSet())) - .orElseGet(Set::of); + public Set searchSerieSubtitles(TvRelease tvRelease, Language language) + throws Addic7edException { + return getProviderSerieId(tvRelease).map( + providerSerieId -> tvRelease.episodeNumbers.stream().flatMap(episode -> { + try { + return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); + } catch (Addic7edException e) { + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), + e.getMessage()), e); + return Stream.empty(); + } + }).collect(Collectors.toSet())).orElseGet(Set::of); } @Override - public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, Language language) { + public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, + Language language) { return subtitles.stream() .filter(sub -> language == sub.getLanguage()) .map(sub -> Subtitle.downloadSource(sub.getUrl()) @@ -123,9 +124,12 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws Addic7edException { - return getApi().getProviderId(serieName).stream() - .sorted(Comparator.comparing(n -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", "")))) + public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) + throws Addic7edException { + return getApi().getProviderId(serieName) + .stream() + .sorted(Comparator.comparing(n -> !serieName.replaceAll("[^A-Za-z]", "") + .equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", "")))) .toList(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index f17c545e..04e49d37 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -78,38 +78,31 @@ public Set convertToSubtitles(MovieRelease movieRelease, Set @Override public Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws ApiException { - return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.episodeNumbers.stream() - .flatMap(episode -> { - try { - return new ExecuteCall<>( - () -> getApi().getSubtitles(providerSerieId, tvRelease.season, episode, - language)) - .message("getSubtitles: [%s]".formatted( - TvRelease.formatName(providerSerieId.getProviderName(), - tvRelease.season, episode))) - .retryWhenHttpCode(ReturnCode.REFRESHING) - .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) - .execute().stream(); - } catch (ApiException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted( - getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, - episode), - e.getMessage()), e); - return Stream.empty(); - } - }) - .collect(Collectors.toSet())) - .orElseGet(Set::of); + return getProviderSerieId(tvRelease).map( + providerSerieId -> tvRelease.episodeNumbers.stream().flatMap(episode -> { + try { + return new ExecuteCall<>(() -> getApi().getSubtitles(providerSerieId, tvRelease.season, episode, + language)).message("getSubtitles: [%s]".formatted( + TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode))) + .retryWhenHttpCode(ReturnCode.REFRESHING) + .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) + .execute() + .stream(); + } catch (ApiException e) { + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), + e.getMessage()), e); + return Stream.empty(); + } + }).collect(Collectors.toSet())).orElseGet(Set::of); } @Override public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws ApiException { - List serieIds = - tvdbIdOptional.mapToObj(tvdbId -> new ExecuteCall<>(() -> getApi().getProviderSerieName(tvdbId)) - .message("getProviderSerieName: [%s]".formatted(tvdbId)) + List serieIds = tvdbIdOptional.mapToObj( + tvdbId -> new ExecuteCall<>(() -> getApi().getProviderSerieName(tvdbId)).message( + "getProviderSerieName: [%s]".formatted(tvdbId)) .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .handleHttpCode(ReturnCode.NOT_FOUND, () -> { LOGGER.info("API %s - Could not find tvdbId [%s]".formatted(getProviderName(), tvdbId)); @@ -118,8 +111,8 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona .execute()).orElseGet(List::of); if (serieIds.isEmpty()) { - serieIds = new ExecuteCall<>(() -> getApi().getProviderSerieName(serieName)) - .message("getProviderSerieName: [%s]".formatted(serieName)) + serieIds = new ExecuteCall<>(() -> getApi().getProviderSerieName(serieName)).message( + "getProviderSerieName: [%s]".formatted(serieName)) .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .handleHttpCode(ReturnCode.NOT_FOUND, () -> { LOGGER.info("API %s - Could not find serie name [%s]".formatted(getProviderName(), serieName)); @@ -128,9 +121,8 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona .execute(); } return serieIds.stream() - .sorted(Comparator - .comparing(n -> !serieName.replaceAll("[^A-Za-z]", "") - .equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", "")))) + .sorted(Comparator.comparing(n -> !serieName.replaceAll("[^A-Za-z]", "") + .equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", "")))) .toList(); } @@ -152,9 +144,7 @@ public String providerSerieIdToDisplayString(ProviderSerieId providerSerieId) { @Getter @RequiredArgsConstructor private enum ReturnCode { - NOT_FOUND(404), - RATE_LIMIT_REACHED(429), - REFRESHING(423); + NOT_FOUND(404), RATE_LIMIT_REACHED(429), REFRESHING(423); final int code; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index 81aeabc3..e3cfa9ed 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -71,87 +71,82 @@ public String getProviderName() { } @Override - public List searchMovieSubtitlesWithHash(String hash, Language language) throws OpenSubtitlesException { - return getApi().searchSubtitles() - .movieHash(hash) - .language(language) - .searchSubtitles() - .getData(); + public List searchMovieSubtitlesWithHash(String hash, Language language) + throws OpenSubtitlesException { + return getApi().searchSubtitles().movieHash(hash).language(language).searchSubtitles().getData(); } @Override - public List searchMovieSubtitlesWithId(int tvdbId, Language language) throws OpenSubtitlesException { - return getApi().searchSubtitles() - .imdbId(tvdbId) - .language(language) - .searchSubtitles() - .getData(); + public List searchMovieSubtitlesWithId(int tvdbId, Language language) + throws OpenSubtitlesException { + return getApi().searchSubtitles().imdbId(tvdbId).language(language).searchSubtitles().getData(); } @Override public List searchMovieSubtitlesWithName(String name, int year, Language language) throws OpenSubtitlesException { - return getApi().searchSubtitles() - .query(name) - .language(language) - .searchSubtitles() - .getData(); + return getApi().searchSubtitles().query(name).language(language).searchSubtitles().getData(); } @Override - public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, Language language) { - return subtitles.stream().map(org.opensubtitles.model.Subtitle::getAttributes) + public Set convertToSubtitles(MovieRelease movieRelease, Set subtitles, + Language language) { + return subtitles.stream() + .map(org.opensubtitles.model.Subtitle::getAttributes) .filter(attributes -> movieRelease.year == attributes.getFeatureDetails().getYear().intValue()) .flatMap(attributes -> attributes.getFiles().stream().map(file -> createSubtitle(file, attributes))) .collect(Collectors.toSet()); } @Override - public Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws OpenSubtitlesException { - return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.episodeNumbers.stream() - .flatMap(episode -> { - try { - return getApi().searchSubtitles() - .query(providerSerieId.getName()) - .season(tvRelease.season) - .episode(episode) - .language(language) - .searchSubtitles() - .getData().stream(); - } catch (OpenSubtitlesException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, episode), - e.getMessage()), e); - return Stream.empty(); - } - }) - .collect(Collectors.toSet())) - .orElseGet(Set::of); + public Set searchSerieSubtitles(TvRelease tvRelease, Language language) + throws OpenSubtitlesException { + return getProviderSerieId(tvRelease).map( + providerSerieId -> tvRelease.episodeNumbers.stream().flatMap(episode -> { + try { + return getApi().searchSubtitles() + .query(providerSerieId.name) + .season(tvRelease.season) + .episode(episode) + .language(language) + .searchSubtitles() + .getData() + .stream(); + } catch (OpenSubtitlesException e) { + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), + e.getMessage()), e); + return Stream.empty(); + } + }).collect(Collectors.toSet())).orElseGet(Set::of); } @Override - public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, Language language) { + public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, + Language language) { String name = StringUtils.lowerCase(RegExUtils.replaceAll(tvRelease.name, "[^A-Za-z]", "")); String originalName = StringUtils.lowerCase(RegExUtils.replaceAll(tvRelease.originalName, "[^A-Za-z]", "")); - return subtitles.stream().map(org.opensubtitles.model.Subtitle::getAttributes) - .flatMap(attributes -> attributes.getFiles().stream() - .filter(file -> { - String subFileName = file.getFileName().replaceAll("[^A-Za-z]", "").toLowerCase(); - return subFileName.contains(name) || (StringUtils.isNotBlank(originalName) && subFileName.contains(originalName)); - }) - .map(file -> createSubtitle(file, attributes))) + return subtitles.stream() + .map(org.opensubtitles.model.Subtitle::getAttributes) + .flatMap(attributes -> attributes.getFiles().stream().filter(file -> { + String subFileName = file.getFileName().replaceAll("[^A-Za-z]", "").toLowerCase(); + return subFileName.contains(name) || + (StringUtils.isNotBlank(originalName) && subFileName.contains(originalName)); + }).map(file -> createSubtitle(file, attributes))) .collect(Collectors.toSet()); } - private Subtitle createSubtitle(Latest200ResponseDataInnerAttributesFilesInner file, SubtitleAttributes attributes) { - return Subtitle.downloadSource(() -> getApi().downloadSubtitle().fileId(file.getFileId().intValue()).download().getLink()) + private Subtitle createSubtitle(Latest200ResponseDataInnerAttributesFilesInner file, + SubtitleAttributes attributes) { + return Subtitle.downloadSource( + () -> getApi().downloadSubtitle().fileId(file.getFileId().intValue()).download().getLink()) .subtitleSource(getSubtitleSource()) .fileName(file.getFileName()) .language(Language.fromIdOptional(attributes.getLanguage()).orElse(null)) .quality(ReleaseParser.getQualityKeyword(file.getFileName())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleaseGroup(file.getFileName(), file.getFileName().endsWith(".srt"))) + .releaseGroup( + ReleaseParser.extractReleaseGroup(file.getFileName(), file.getFileName().endsWith(".srt"))) .uploader(attributes.getUploader().getName()) .hearingImpaired(attributes.isHearingImpaired()); } @@ -159,9 +154,10 @@ private Subtitle createSubtitle(Latest200ResponseDataInnerAttributesFilesInner f @Override public List getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws OpenSubtitlesException { - return getApi().getProviderSerieIds(serieName).stream() - .sorted(Comparator.comparing( - (OpensubtitleSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", ""))) + return getApi().getProviderSerieIds(serieName) + .stream() + .sorted(Comparator.comparing((OpensubtitleSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "") + .equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", ""))) .thenComparing(OpensubtitleSerieId::getYear, Comparator.reverseOrder())) .toList(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index c99e1e70..2b32a886 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -85,23 +85,18 @@ public Set convertToSubtitles(MovieRelease movieRelease, Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws PodnapisiException { - return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.episodeNumbers.stream() - .flatMap(episode -> { - try { - return getApi().getSerieSubtitles(providerSerieId, tvRelease.season, episode, language) - .stream(); - } catch (PodnapisiException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted( - getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, - episode), - e.getMessage()), e); - return Stream.empty(); - } - }) - .collect(Collectors.toSet())) - .orElseGet(Set::of); + return getProviderSerieId(tvRelease).map( + providerSerieId -> tvRelease.episodeNumbers.stream().flatMap(episode -> { + try { + return getApi().getSerieSubtitles(providerSerieId, tvRelease.season, episode, language) + .stream(); + } catch (PodnapisiException e) { + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), + e.getMessage()), e); + return Stream.empty(); + } + }).collect(Collectors.toSet())).orElseGet(Set::of); } @Override @@ -112,17 +107,17 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection buildListSubtitles(Language language, Collection lSubtitles) { return lSubtitles.stream() - .filter(ossd -> StringUtils.isNotBlank(ossd.getReleaseString())) - .map(ossd -> Subtitle.downloadSource(ossd.getUrl()) + .filter(ossd -> StringUtils.isNotBlank(ossd.releaseString)) + .map(ossd -> Subtitle.downloadSource(ossd.url) .subtitleSource(getSubtitleSource()) - .fileName(ossd.getReleaseString()) + .fileName(ossd.releaseString) .language(language) - .quality(ReleaseParser.getQualityKeyword(ossd.getReleaseString())) + .quality(ReleaseParser.getQualityKeyword(ossd.releaseString)) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleaseGroup(ossd.getReleaseString(), - StringUtils.endsWith(ossd.getReleaseString(), ".srt"))) - .uploader(ossd.getUploaderName()) - .hearingImpaired(ossd.isHearingImpaired())) + .releaseGroup(ReleaseParser.extractReleaseGroup(ossd.releaseString, + StringUtils.endsWith(ossd.releaseString, ".srt"))) + .uploader(ossd.uploaderName) + .hearingImpaired(ossd.hearingImpaired)) .collect(Collectors.toSet()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index b2c6d9c1..6381300f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -93,23 +93,17 @@ public Set convertToSubtitles(MovieRelease movieRelease, Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws SubsceneException { - return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.episodeNumbers.stream() - .flatMap(episode -> { - try { - return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language) - .stream(); - } catch (SubsceneException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted( - getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, - episode), - e.getMessage()), e); - return Stream.empty(); - } - }) - .collect(Collectors.toSet())) - .orElseGet(Set::of); + return getProviderSerieId(tvRelease).map( + providerSerieId -> tvRelease.episodeNumbers.stream().flatMap(episode -> { + try { + return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); + } catch (SubsceneException e) { + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), + e.getMessage()), e); + return Stream.empty(); + } + }).collect(Collectors.toSet())).orElseGet(Set::of); } @Override @@ -122,11 +116,13 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona default -> 4; }; Pattern yearPattern = Pattern.compile("(\\d\\d\\d\\d)"); - return getApi().getSubSceneSerieNames(serieName).entrySet().stream() + return getApi().getSubSceneSerieNames(serieName) + .entrySet() + .stream() .sorted(Comparator.comparingInt(entry -> providerTypeFunction.applyAsInt(entry.getKey()))) - .map(Entry::getValue).flatMap(List::stream) - .sorted(Comparator - .comparing((SubSceneSerieId serieId) -> serieId.getSeason() == 0) + .map(Entry::getValue) + .flatMap(List::stream) + .sorted(Comparator.comparing((SubSceneSerieId serieId) -> serieId.getSeason() == 0) .thenComparing(serieId -> { Matcher matcher = yearPattern.matcher(serieId.name); return matcher.find() ? Integer.parseInt(matcher.group()) : 0; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java index 14b91c61..572f5607 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java @@ -91,38 +91,32 @@ public Set convertToSubtitles(MovieRelease movieRelease, Set searchSerieSubtitles(TvRelease tvRelease, Language language) throws TvSubtitlesException { - return getProviderSerieId(tvRelease) - .map(providerSerieId -> tvRelease.episodeNumbers.stream() - .flatMap(episode -> { - try { - return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language) - .stream(); - } catch (TvSubtitlesException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted( - getSubtitleSource().getName(), - TvRelease.formatName(providerSerieId.getProviderName(), tvRelease.season, - episode), - e.getMessage()), e); - return Stream.empty(); - } - }) - .collect(Collectors.toSet())) - .orElseGet(Set::of); + return getProviderSerieId(tvRelease).map( + providerSerieId -> tvRelease.episodeNumbers.stream().flatMap(episode -> { + try { + return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); + } catch (TvSubtitlesException e) { + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), + e.getMessage()), e); + return Stream.empty(); + } + }).collect(Collectors.toSet())).orElseGet(Set::of); } @Override public Set convertToSubtitles(TvRelease tvRelease, Collection subtitles, Language language) { return subtitles.stream() - .map(sub -> Subtitle.downloadSource(sub.getUrl()) + .map(sub -> Subtitle.downloadSource(sub.url) .subtitleSource(getSubtitleSource()) - .fileName(sub.getFilename()) + .fileName(sub.filename) .language(language) - .quality(ReleaseParser.getQualityKeyword(sub.getFilename() + " " + sub.getRip())) + .quality(ReleaseParser.getQualityKeyword(sub.filename + " " + sub.rip)) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup(ReleaseParser.extractReleaseGroup(sub.getFilename(), - StringUtils.endsWith(sub.getFilename(), ".srt"))) - .uploader(sub.getAuthor()) + .releaseGroup(ReleaseParser.extractReleaseGroup(sub.filename, + StringUtils.endsWith(sub.filename, ".srt"))) + .uploader(sub.author) .hearingImpaired(false)) .collect(Collectors.toSet()); } @@ -131,10 +125,10 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection getSortedProviderSerieIds(OptionalInt tvdbIdOptional, String serieName, int season) throws TvSubtitlesException { Pattern yearPatter = Pattern.compile("\\((\\d\\d\\d\\d)-(\\d\\d\\d\\d)\\)"); - return getApi().getUrisForSerieName(serieName).stream() - .sorted(Comparator.comparing( - (ProviderSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "") - .equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", ""))) + return getApi().getUrisForSerieName(serieName) + .stream() + .sorted(Comparator.comparing((ProviderSerieId n) -> !serieName.replaceAll("[^A-Za-z]", "") + .equalsIgnoreCase(n.name.replaceAll("[^A-Za-z]", ""))) .thenComparing((ProviderSerieId providerSerieId) -> { Matcher matcher = yearPatter.matcher(providerSerieId.name); if (matcher.find()) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java index ca7514a8..40205734 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java @@ -104,13 +104,13 @@ public List getSubtitles(SerieMapping addic7edSerieM return manager.valueBuilder() .memoryCache() .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), - addic7edSerieMapping.getProviderId(), season, episode, + addic7edSerieMapping.providerId, season, episode, language)) .collectionSupplier(Addic7edSubtitleDescriptor.class, () -> { List languageIds = LanguageId.forLanguage(language); String url = "%s/serie/%s/%s/%s/%s".formatted( DOMAIN, - URLEncoder.encode(addic7edSerieMapping.getProviderName().replace(" ", "_"), UTF_8), + URLEncoder.encode(addic7edSerieMapping.providerName.replace(" ", "_"), UTF_8), season, episode, languageIds.size() == 1 ? languageIds.first.id : LanguageId.ALL.id); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/exception/Addic7edException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/exception/Addic7edException.java index aa3521cb..2f1de388 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/exception/Addic7edException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/exception/Addic7edException.java @@ -14,6 +14,6 @@ public class Addic7edException extends SubtitlesProviderException { @Override public String getSubtitleProvider() { - return SubtitleSource.ADDIC7ED.getName(); + return SubtitleSource.ADDIC7ED.name; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java index 5018139b..a057a2a6 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java @@ -47,16 +47,21 @@ public List getProviderSerieName(int tvdbId) throws ApiExceptio .map(showDto -> new ProviderSerieId(showDto.getName(), showDto.getId().toString())).toList(); } - public Set getSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) throws ApiException { + public Set getSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) + throws ApiException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.getProviderId(), season, episode, language)) + .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.providerId, + season, episode, language)) .collectionSupplier(Subtitle.class, () -> { Set results = new HashSet<>(); - SubtitleSearchResponse response = subtitlesApi.subtitlesGetShowUniqueIdSeasonEpisodeLanguageGet(language.getName(), - UUID.fromString(providerSerieId.getProviderId()), season, episode); - response.getMatchingSubtitles().stream() - .filter(SubtitleDto::isCompleted).map(sub -> mapToSubtitle(sub, response.getEpisode(), language)) + SubtitleSearchResponse response = + subtitlesApi.subtitlesGetShowUniqueIdSeasonEpisodeLanguageGet(language.getName(), + UUID.fromString(providerSerieId.providerId), season, episode); + response.getMatchingSubtitles() + .stream() + .filter(SubtitleDto::isCompleted) + .map(sub -> mapToSubtitle(sub, response.getEpisode(), language)) .forEach(results::add); return results; }).getCollection(); @@ -66,7 +71,9 @@ private Subtitle mapToSubtitle(SubtitleDto sub, EpisodeDto episodedto, Language return Subtitle.downloadSource(getDownloadUrl(sub.getDownloadUri())) .subtitleSource(getSubtitleSource()) .fileName(StringExt - .removeIllegalFilenameChars("%s - %s - %s".formatted(episodedto.getShow(), episodedto.getTitle(), sub.getVersion()))) + .removeIllegalFilenameChars( + "%s - %s - %s".formatted(episodedto.getShow(), episodedto.getTitle(), + sub.getVersion()))) .language(language) .quality(ReleaseParser.getQualityKeyword(episodedto.getTitle() + " " + sub.getVersion())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java index 28f3ea52..9fcedb96 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java @@ -79,17 +79,20 @@ public class SearchSubtitles extends OpenSubtitlesExecuter { public Subtitles200Response searchSubtitles() throws OpenSubtitlesException { return manager.valueBuilder() .cacheType(CacheType.MEMORY) - .key("OpenSubtitles-subtitles-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s" - .formatted(id, imdbId, tmdbId, type, query, language, movieHash, userId, hearingImpaired, - foreignPartsOnly, trustedSources, machineTranslated, aiTranslated, orderBy, orderDirection, - parentFeatureId, parentImdbId, parentTmdbId, season, episode, year, movieHashMatch, page)) + .key("OpenSubtitles-subtitles-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s-%s".formatted( + id, imdbId, tmdbId, type, query, language, movieHash, userId, hearingImpaired, foreignPartsOnly, + trustedSources, machineTranslated, aiTranslated, orderBy, orderDirection, parentFeatureId, + parentImdbId, parentTmdbId, season, episode, year, movieHashMatch, page)) .valueSupplier(() -> { try { - return execute(() -> new SubtitlesApi(apiClient).subtitles(id, imdbId, tmdbId, getValue(type), query, - language != null ? language.getLangCode() : null, movieHash, - userId, getValue(hearingImpaired), getValue(foreignPartsOnly), getValue(trustedSources), getValue(machineTranslated), - getValue(aiTranslated), orderBy == null ? null : orderBy.getParamName(), getValue(orderDirection), parentFeatureId, - parentImdbId, parentTmdbId, season, episode, year, getValue(movieHashMatch), page)); + return execute( + () -> new SubtitlesApi(apiClient).subtitles(id, imdbId, tmdbId, getValue(type), query, + language != null ? language.langCode : null, movieHash, userId, + getValue(hearingImpaired), getValue(foreignPartsOnly), getValue(trustedSources), + getValue(machineTranslated), getValue(aiTranslated), + orderBy == null ? null : orderBy.paramName, getValue(orderDirection), + parentFeatureId, parentImdbId, parentTmdbId, season, episode, year, + getValue(movieHashMatch), page)); } catch (Exception e) { throw new OpenSubtitlesException(e); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/exception/OpenSubtitlesException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/exception/OpenSubtitlesException.java index c330dd15..2044554b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/exception/OpenSubtitlesException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/exception/OpenSubtitlesException.java @@ -14,6 +14,6 @@ public class OpenSubtitlesException extends SubtitlesProviderException { @Override public String getSubtitleProvider() { - return SubtitleSource.OPENSUBTITLES.getName(); + return SubtitleSource.OPENSUBTITLES.name; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java index aa341898..9e2c517f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java @@ -60,12 +60,12 @@ private List getSubtitles(SerieMapping providerSeri throws PodnapisiException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.getProviderId(), + .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.providerId, season, episode, language)) .collectionSupplier(PodnapisiSubtitleDescriptor.class, () -> { try { StringBuilder url = new StringBuilder(DOMAIN + "/sl/ppodnapisi/search?sK=") - .append(URLEncoder.encode(providerSerieId.getProviderId().trim().toLowerCase(), + .append(URLEncoder.encode(providerSerieId.providerId.trim().toLowerCase(), StandardCharsets.UTF_8)); if (PODNAPISI_LANGS.containsKey(language)) { url.append("&sJ=").append(PODNAPISI_LANGS.get(language)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/exception/PodnapisiException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/exception/PodnapisiException.java index bb0fa8ee..578d08bc 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/exception/PodnapisiException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/exception/PodnapisiException.java @@ -14,6 +14,6 @@ public class PodnapisiException extends SubtitlesProviderException { @Override public String getSubtitleProvider() { - return SubtitleSource.PODNAPISI.getName(); + return SubtitleSource.PODNAPISI.name; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java index 6cd84178..5ff5d63c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java @@ -43,10 +43,13 @@ public class SubsceneApi extends Html implements SubtitleApi { private static final String DOMAIN = "https://subscene.com"; private static final Pattern SERIE_NAME_PATTERN = Pattern.compile(".*? - ([A-Z][a-z]*) Season.*"); - private static final Predicate RETRY_PREDICATE = - exception -> (exception instanceof HttpClientException httpClientException - && (httpClientException.getResponseCode() == 409 || httpClientException.getResponseCode() == 429)) - || (exception instanceof ManagerException managerException && managerException.getMessage().contains("409 Conflict")); + private static final Predicate RETRY_PREDICATE = exception -> + switch (exception) { + case HttpClientException httpClientException -> + httpClientException.getResponseCode() == 409 || httpClientException.getResponseCode() == 429; + case ManagerException managerException -> managerException.getMessage().contains("409 Conflict"); + default -> false; + }; private int selectedLanguage; private boolean selectedIncludeHearingImpaired; @@ -68,16 +71,20 @@ public Map> getSubSceneSerieNames(String serieName if (StringUtils.isBlank(serieName)) { return Map.of(); } - String url = DOMAIN + "/subtitles/searchbytitle?query=" + URLEncoder.encode(serieName, StandardCharsets.UTF_8); + String url = + DOMAIN + "/subtitles/searchbytitle?query=" + URLEncoder.encode(serieName, StandardCharsets.UTF_8); Element searchResultElement = getJsoupDocument(url).selectFirst(".search-result"); - return searchResultElement.select("h2").stream() - .map(titleElement -> Pair.of(titleElement.text(), titleElement.nextElementSibling().select("a").stream() - .map(aElem -> { + return searchResultElement.select("h2") + .stream() + .map(titleElement -> Pair.of(titleElement.text(), + titleElement.nextElementSibling().select("a").stream().map(aElem -> { Matcher matcher = SERIE_NAME_PATTERN.matcher(aElem.text()); int season = 0; if (matcher.matches()) { - season = OrdinalNumber.optionalFromValue(matcher.group(1)).mapToInt(OrdinalNumber::getNumber).orElse(-1); + season = OrdinalNumber.optionalFromValue(matcher.group(1)) + .mapToInt(OrdinalNumber::getNumber) + .orElse(-1); } return new SubSceneSerieId(aElem.text(), aElem.attr("href"), season); }).toList())) @@ -87,29 +94,35 @@ public Map> getSubSceneSerieNames(String serieName } } - public List getSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) - throws SubsceneException { - return manager.valueBuilder().memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().getName(), providerSerieId.getProviderId(), season, episode, language)) + public List getSubtitles(SerieMapping providerSerieId, int season, int episode, + Language language) throws SubsceneException { + return manager.valueBuilder() + .memoryCache() + .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name, providerSerieId.providerId, season, + episode, language)) .collectionSupplier(SubsceneSubtitleDescriptor.class, () -> { setLanguageWithCookie(language); try { - return getJsoupDocument(DOMAIN + providerSerieId.getProviderId()) - .select("td.a1").stream().map(Element::parent) - .map(row -> new SubsceneSubtitleDescriptor() - .setLanguage(Language.fromValueOptional(row.select(".a1 span.l").text().trim()).orElse(null)) - .setUrlSupplier(() -> getDownloadUrl(DOMAIN + row.select(".a1 > a").attr("href").trim())) + return getJsoupDocument(DOMAIN + providerSerieId.providerId).select("td.a1") + .stream() + .map(Element::parent) + .map(row -> new SubsceneSubtitleDescriptor().setLanguage( + Language.fromValueOptional(row.select(".a1 span.l").text().trim()).orElse(null)) + .setUrlSupplier(() -> getDownloadUrl( + DOMAIN + row.select(".a1 > a").attr("href").trim())) .setName(row.select(".a1 span:not(.l)").text().trim()) .setHearingImpaired(!row.select(".a41").isEmpty()) .setUploader(row.select(".a5 > a").text().trim()) .setComment(row.select(".a6 > div").text().trim())) - .filter(subDescriptor -> subDescriptor.getSeasonEpisode() != null - && subDescriptor.getSeasonEpisode().episodes.stream().anyMatch(ep -> ep == episode)) + .filter(subDescriptor -> subDescriptor.getSeasonEpisode() != null && + subDescriptor.getSeasonEpisode().episodes.stream() + .anyMatch(ep -> ep == episode)) .toList(); } catch (Exception e) { throw new SubsceneException(e); } - }).getCollection(); + }) + .getCollection(); } private String getDownloadUrl(String seriePageUrl) throws SubsceneException { @@ -124,7 +137,11 @@ private Document getJsoupDocument(String url) throws ManagerException { while (ChronoUnit.SECONDS.between(lastRequest, LocalDateTime.now()) < RATE_DURATION_SHORT) { sleepSeconds(1); } - Document document = super.getHtml(url).retries(1).retryPredicate(RETRY_PREDICATE).retryWait(RATE_DURATION_LONG).getAsJsoupDocument(); + Document document = super.getHtml(url) + .retries(1) + .retryPredicate(RETRY_PREDICATE) + .retryWait(RATE_DURATION_LONG) + .getAsJsoupDocument(); lastRequest = LocalDateTime.now(); return document; } @@ -159,202 +176,135 @@ public SubtitleSource getSubtitleSource() { return SubtitleSource.SUBSCENE; } - private static final Map SUBSCENE_LANGS = Collections.unmodifiableMap(new EnumMap<>(Language.class) { - @Serial - private static final long serialVersionUID = 2950169212654074275L; + private static final Map SUBSCENE_LANGS = + Collections.unmodifiableMap(new EnumMap<>(Language.class) { + @Serial private static final long serialVersionUID = 2950169212654074275L; - { - put(Language.ARABIC, 2); - put(Language.BENGALI, 54); - put(Language.PORTUGUESE, 4); // BRAZILLIAN PORTUGUESE - put(Language.CHINESE_SIMPLIFIED, 7); - put(Language.CZECH, 9); - put(Language.DANISH, 10); - put(Language.DUTCH, 11); - put(Language.ENGLISH, 13); - // put(Language.FARSI / PERSIAN, 46); - put(Language.FINNISH, 17); - put(Language.FRENCH, 18); - put(Language.GERMAN, 19); - put(Language.GREEK, 21); - put(Language.HEBREW, 22); - put(Language.INDONESIAN, 44); - put(Language.ITALIAN, 26); - put(Language.KOREAN, 28); - put(Language.MALAY, 50); - put(Language.NORWEGIAN, 30); - put(Language.POLISH, 31); - put(Language.PORTUGUESE, 32); - put(Language.ROMANIAN, 33); - put(Language.SPANISH, 38); - put(Language.SWEDISH, 39); - put(Language.THAI, 40); - put(Language.TURKISH, 41); - put(Language.VIETNAMESE, 45); - put(Language.ALBANIAN, 1); - put(Language.ARMENIAN, 73); - put(Language.AZERBAIJANI, 55); - // put(Language.BASQUE, 74); - put(Language.BELARUSIAN, 68); - put(Language.CHINESE_SIMPLIFIED, 3); // BIG 5 CODE - put(Language.BOSNIAN, 60); - put(Language.BULGARIAN, 5); - // put(Language.BULGARIAN / ENGLISH, 6); - // put(Language.BURMESE, 61); - // put(Language.CAMBODIAN / KHMER, 79); - put(Language.CATALAN, 49); - put(Language.CROATIAN, 8); - // put(Language.DUTCH / ENGLISH, 12); - // put(Language.ENGLISH / GERMAN, 15); - // put(Language.ESPERANTO, 47); - put(Language.ESTONIAN, 16); - // put(Language.GEORGIAN, 62); - // put(Language.GREENLANDIC, 57); - put(Language.HINDI, 51); - put(Language.HUNGARIAN, 23); - // put(Language.HUNGARIAN / ENGLISH, 24); - put(Language.ICELANDIC, 25); - put(Language.JAPANESE, 27); - put(Language.KANNADA, 78); - // put(Language.KINYARWANDA, 81); - // put(Language.KURDISH, 52); - put(Language.LATVIAN, 29); - put(Language.LITHUANIAN, 43); - put(Language.MACEDONIAN, 48); - put(Language.MALAYALAM, 64); - // put(Language.MANIPURI, 65); - // put(Language.MONGOLIAN, 72); - // put(Language.NEPALI, 80); - // put(Language.PASHTO, 67); - // put(Language.PUNJABI, 66); - put(Language.RUSSIAN, 34); - put(Language.SERBIAN, 35); - put(Language.SINHALA, 58); - put(Language.SLOVAK, 36); - put(Language.SLOVENIAN, 37); - // put(Language.SOMALI, 70); - // put(Language.SUNDANESE, 76); - // put(Language.SWAHILI, 75); - put(Language.TAGALOG, 53); - put(Language.TAMIL, 59); - put(Language.TELUGU, 63); - put(Language.UKRAINIAN, 56); - // put(Language.URDU, 42); - // put(Language.YORUBA, 71); + { + put(Language.ARABIC, 2); + put(Language.BENGALI, 54); + put(Language.PORTUGUESE, 4); // BRAZILLIAN PORTUGUESE + put(Language.CHINESE_SIMPLIFIED, 7); + put(Language.CZECH, 9); + put(Language.DANISH, 10); + put(Language.DUTCH, 11); + put(Language.ENGLISH, 13); + // put(Language.FARSI / PERSIAN, 46); + put(Language.FINNISH, 17); + put(Language.FRENCH, 18); + put(Language.GERMAN, 19); + put(Language.GREEK, 21); + put(Language.HEBREW, 22); + put(Language.INDONESIAN, 44); + put(Language.ITALIAN, 26); + put(Language.KOREAN, 28); + put(Language.MALAY, 50); + put(Language.NORWEGIAN, 30); + put(Language.POLISH, 31); + put(Language.PORTUGUESE, 32); + put(Language.ROMANIAN, 33); + put(Language.SPANISH, 38); + put(Language.SWEDISH, 39); + put(Language.THAI, 40); + put(Language.TURKISH, 41); + put(Language.VIETNAMESE, 45); + put(Language.ALBANIAN, 1); + put(Language.ARMENIAN, 73); + put(Language.AZERBAIJANI, 55); + // put(Language.BASQUE, 74); + put(Language.BELARUSIAN, 68); + put(Language.CHINESE_SIMPLIFIED, 3); // BIG 5 CODE + put(Language.BOSNIAN, 60); + put(Language.BULGARIAN, 5); + // put(Language.BULGARIAN / ENGLISH, 6); + // put(Language.BURMESE, 61); + // put(Language.CAMBODIAN / KHMER, 79); + put(Language.CATALAN, 49); + put(Language.CROATIAN, 8); + // put(Language.DUTCH / ENGLISH, 12); + // put(Language.ENGLISH / GERMAN, 15); + // put(Language.ESPERANTO, 47); + put(Language.ESTONIAN, 16); + // put(Language.GEORGIAN, 62); + // put(Language.GREENLANDIC, 57); + put(Language.HINDI, 51); + put(Language.HUNGARIAN, 23); + // put(Language.HUNGARIAN / ENGLISH, 24); + put(Language.ICELANDIC, 25); + put(Language.JAPANESE, 27); + put(Language.KANNADA, 78); + // put(Language.KINYARWANDA, 81); + // put(Language.KURDISH, 52); + put(Language.LATVIAN, 29); + put(Language.LITHUANIAN, 43); + put(Language.MACEDONIAN, 48); + put(Language.MALAYALAM, 64); + // put(Language.MANIPURI, 65); + // put(Language.MONGOLIAN, 72); + // put(Language.NEPALI, 80); + // put(Language.PASHTO, 67); + // put(Language.PUNJABI, 66); + put(Language.RUSSIAN, 34); + put(Language.SERBIAN, 35); + put(Language.SINHALA, 58); + put(Language.SLOVAK, 36); + put(Language.SLOVENIAN, 37); + // put(Language.SOMALI, 70); + // put(Language.SUNDANESE, 76); + // put(Language.SWAHILI, 75); + put(Language.TAGALOG, 53); + put(Language.TAMIL, 59); + put(Language.TELUGU, 63); + put(Language.UKRAINIAN, 56); + // put(Language.URDU, 42); + // put(Language.YORUBA, 71); - } - }); + } + }); @Getter @RequiredArgsConstructor private enum OrdinalNumber { - ZEROTH(0, "Zeroth"), - FIRST(1, "First"), - SECOND(2, "Second"), - THIRD(3, "Third"), - FOURTH(4, "Fourth"), - FIFTH(5, "Fifth"), - SIXTH(6, "Sixth"), - SEVENTH(7, "Seventh"), - EIGHTH(8, "Eighth"), - NINTH(9, "Ninth"), - TENTH(10, "Tenth"), - ELEVENTH(11, "Eleventh"), - TWELFTH(12, "Twelfth"), - THIRTEENTH(13, "Thirteenth"), - FOURTEENTH(14, "Fourteenth"), - FIFTEENTH(15, "Fifteenth"), - SIXTEENTH(16, "Sixteenth"), - SEVENTEENTH(17, "Seventeenth"), - EIGHTEENTH(18, "Eighteenth"), - NINETEENTH(19, "Nineteenth"), - TWENTIETH(20, "Twentieth"), - TWENTY_FIRST(21, "Twenty-First"), - TWENTY_SECOND(22, "Twenty-Second"), - TWENTY_THIRD(23, "Twenty-Third"), - TWENTY_FOURTH(24, "Twenty-Fourth"), - TWENTY_FIFTH(25, "Twenty-Fifth"), - TWENTY_SIXTH(26, "Twenty-Sixth"), - TWENTY_SEVENTH(27, "Twenty-Seventh"), - TWENTY_EIGHTH(28, "Twenty-Eighth"), - TWENTY_NINTH(29, "Twenty-Ninth"), - THIRTIETH(30, "Thirtieth"), - THIRTHY_FIRST(31, "Thirty-First"), - THIRTHY_SECOND(32, "Thirty-Second"), - THIRTHY_THIRD(33, "Thirty-Third"), - THIRTHY_FOURTH(34, "Thirty-Fourth"), - THIRTHY_FIFTH(35, "Thirty-Fifth"), - THIRTHY_SIXTH(36, "Thirty-Sixth"), - THIRTHY_SEVENTH(37, "Thirty-Seventh"), - THIRTHY_EIGHTH(38, "Thirty-Eighth"), - THIRTHY_NINTH(39, "Thirty-Ninth"), - FORTIETH(40, "Fortieth"), - FORTY_FIRST(41, "Forty-First"), - FORTY_SECOND(42, "Forty-Second"), - FORTY_THIRD(43, "Forty-Third"), - FORTY_FOURTH(44, "Forty-Fourth"), - FORTY_FIFTH(45, "Forty-Fifth"), - FORTY_SIXTH(46, "Forty-Sixth"), - FORTY_SEVENTH(47, "Forty-Seventh"), - FORTY_EIGHTH(48, "Forty-Eighth"), - FORTY_NINTH(49, "Forty-Ninth"), - FIFTIETH(50, "Fiftieth"), - FIFTY_FIRST(51, "Fifty-First"), - FIFTY_SECOND(52, "Fifty-Second"), - FIFTY_THIRD(53, "Fifty-Third"), - FIFTY_FOURTH(54, "Fifty-Fourth"), - FIFTY_FIFTH(55, "Fifty-Fifth"), - FIFTY_SIXTH(56, "Fifty-Sixth"), - FIFTY_SEVENTH(57, "Fifty-Seventh"), - FIFTY_EIGHTH(58, "Fifty-Eighth"), - FIFTY_NINTH(59, "Fifty-Ninth"), - SIXTIETH(60, "Sixtieth"), - SIXTY_FIRST(61, "Sixty-First"), - SIXTY_SECOND(62, "Sixty-Second"), - SIXTY_THIRD(63, "Sixty-Third"), - SIXTY_FOURTH(64, "Sixty-Fourth"), - SIXTY_FIFTH(65, "Sixty-Fifth"), - SIXTY_SIXTH(66, "Sixty-Sixth"), - SIXTY_SEVENTH(67, "Sixty-Seventh"), - SIXTY_EIGHTH(68, "Sixty-Eighth"), - SIXTY_NINTH(69, "Sixty-Ninth"), - SEVENTIETH(70, "Seventieth"), - SEVENTY_FIRST(71, "Seventy-First"), - SEVENTY_SECOND(72, "Seventy-Second"), - SEVENTY_THIRD(73, "Seventy-Third"), - SEVENTY_FOURTH(74, "Seventy-Fourth"), - SEVENTY_FIFTH(75, "Seventy-Fifth"), - SEVENTY_SIXTH(76, "Seventy-Sixth"), - SEVENTY_SEVENTH(77, "Seventy-Seventh"), - SEVENTY_EIGHTH(78, "Seventy-Eighth"), - SEVENTY_NINTH(79, "Seventy-Ninth"), - EIGHTIETH(80, "Eightieth"), - EIGHTY_FIRST(81, "Eighty-First"), - EIGHTY_SECOND(82, "Eighty-Second"), - EIGHTY_THIRD(83, "Eighty-Third"), - EIGHTY_FOURTH(84, "Eighty-Fourth"), - EIGHTY_FIFTH(85, "Eighty-Fifth"), - EIGHTY_SIXTH(86, "Eighty-Sixth"), - EIGHTY_SEVENTH(87, "Eighty-Seventh"), - EIGHTY_EIGHTH(88, "Eighty-Eighth"), - EIGHTY_NINTH(89, "Eighty-Ninth"), - NINETIETH(90, "Ninetieth"), - NINETY_FIRST(91, "Ninety-First"), - NINETY_SECOND(92, "Ninety-Second"), - NINETY_THIRD(93, "Ninety-Third"), - NINETY_FOURTH(94, "Ninety-Fourth"), - NINETY_FIFTH(95, "Ninety-Fifth"), - NINETY_SIXTH(96, "Ninety-Sixth"), - NINETY_SEVENTH(97, "Ninety-Seventh"), - NINETY_EIGHTH(98, "Ninety-Eighth"), - NINETY_NINTH(99, "Ninety-Ninth"), + ZEROTH(0, "Zeroth"), FIRST(1, "First"), SECOND(2, "Second"), THIRD(3, "Third"), FOURTH(4, "Fourth"), + FIFTH(5, "Fifth"), SIXTH(6, "Sixth"), SEVENTH(7, "Seventh"), EIGHTH(8, "Eighth"), NINTH(9, "Ninth"), + TENTH(10, "Tenth"), ELEVENTH(11, "Eleventh"), TWELFTH(12, "Twelfth"), THIRTEENTH(13, "Thirteenth"), + FOURTEENTH(14, "Fourteenth"), FIFTEENTH(15, "Fifteenth"), SIXTEENTH(16, "Sixteenth"), + SEVENTEENTH(17, "Seventeenth"), EIGHTEENTH(18, "Eighteenth"), NINETEENTH(19, "Nineteenth"), + TWENTIETH(20, "Twentieth"), TWENTY_FIRST(21, "Twenty-First"), TWENTY_SECOND(22, "Twenty-Second"), + TWENTY_THIRD(23, "Twenty-Third"), TWENTY_FOURTH(24, "Twenty-Fourth"), TWENTY_FIFTH(25, "Twenty-Fifth"), + TWENTY_SIXTH(26, "Twenty-Sixth"), TWENTY_SEVENTH(27, "Twenty-Seventh"), TWENTY_EIGHTH(28, "Twenty-Eighth"), + TWENTY_NINTH(29, "Twenty-Ninth"), THIRTIETH(30, "Thirtieth"), THIRTHY_FIRST(31, "Thirty-First"), + THIRTHY_SECOND(32, "Thirty-Second"), THIRTHY_THIRD(33, "Thirty-Third"), THIRTHY_FOURTH(34, "Thirty-Fourth"), + THIRTHY_FIFTH(35, "Thirty-Fifth"), THIRTHY_SIXTH(36, "Thirty-Sixth"), THIRTHY_SEVENTH(37, "Thirty-Seventh"), + THIRTHY_EIGHTH(38, "Thirty-Eighth"), THIRTHY_NINTH(39, "Thirty-Ninth"), FORTIETH(40, "Fortieth"), + FORTY_FIRST(41, "Forty-First"), FORTY_SECOND(42, "Forty-Second"), FORTY_THIRD(43, "Forty-Third"), + FORTY_FOURTH(44, "Forty-Fourth"), FORTY_FIFTH(45, "Forty-Fifth"), FORTY_SIXTH(46, "Forty-Sixth"), + FORTY_SEVENTH(47, "Forty-Seventh"), FORTY_EIGHTH(48, "Forty-Eighth"), FORTY_NINTH(49, "Forty-Ninth"), + FIFTIETH(50, "Fiftieth"), FIFTY_FIRST(51, "Fifty-First"), FIFTY_SECOND(52, "Fifty-Second"), + FIFTY_THIRD(53, "Fifty-Third"), FIFTY_FOURTH(54, "Fifty-Fourth"), FIFTY_FIFTH(55, "Fifty-Fifth"), + FIFTY_SIXTH(56, "Fifty-Sixth"), FIFTY_SEVENTH(57, "Fifty-Seventh"), FIFTY_EIGHTH(58, "Fifty-Eighth"), + FIFTY_NINTH(59, "Fifty-Ninth"), SIXTIETH(60, "Sixtieth"), SIXTY_FIRST(61, "Sixty-First"), + SIXTY_SECOND(62, "Sixty-Second"), SIXTY_THIRD(63, "Sixty-Third"), SIXTY_FOURTH(64, "Sixty-Fourth"), + SIXTY_FIFTH(65, "Sixty-Fifth"), SIXTY_SIXTH(66, "Sixty-Sixth"), SIXTY_SEVENTH(67, "Sixty-Seventh"), + SIXTY_EIGHTH(68, "Sixty-Eighth"), SIXTY_NINTH(69, "Sixty-Ninth"), SEVENTIETH(70, "Seventieth"), + SEVENTY_FIRST(71, "Seventy-First"), SEVENTY_SECOND(72, "Seventy-Second"), SEVENTY_THIRD(73, "Seventy-Third"), + SEVENTY_FOURTH(74, "Seventy-Fourth"), SEVENTY_FIFTH(75, "Seventy-Fifth"), SEVENTY_SIXTH(76, "Seventy-Sixth"), + SEVENTY_SEVENTH(77, "Seventy-Seventh"), SEVENTY_EIGHTH(78, "Seventy-Eighth"), + SEVENTY_NINTH(79, "Seventy-Ninth"), EIGHTIETH(80, "Eightieth"), EIGHTY_FIRST(81, "Eighty-First"), + EIGHTY_SECOND(82, "Eighty-Second"), EIGHTY_THIRD(83, "Eighty-Third"), EIGHTY_FOURTH(84, "Eighty-Fourth"), + EIGHTY_FIFTH(85, "Eighty-Fifth"), EIGHTY_SIXTH(86, "Eighty-Sixth"), EIGHTY_SEVENTH(87, "Eighty-Seventh"), + EIGHTY_EIGHTH(88, "Eighty-Eighth"), EIGHTY_NINTH(89, "Eighty-Ninth"), NINETIETH(90, "Ninetieth"), + NINETY_FIRST(91, "Ninety-First"), NINETY_SECOND(92, "Ninety-Second"), NINETY_THIRD(93, "Ninety-Third"), + NINETY_FOURTH(94, "Ninety-Fourth"), NINETY_FIFTH(95, "Ninety-Fifth"), NINETY_SIXTH(96, "Ninety-Sixth"), + NINETY_SEVENTH(97, "Ninety-Seventh"), NINETY_EIGHTH(98, "Ninety-Eighth"), NINETY_NINTH(99, "Ninety-Ninth"), HUNDREDTH(100, "Hundredth"); private final int number; private final String value; public static Optional optionalFromValue(String value) { - return Stream.of(OrdinalNumber.values()).filter(ordinalNumber -> StringUtils.equalsIgnoreCase(value, ordinalNumber.getValue())) + return Stream.of(OrdinalNumber.values()) + .filter(ordinalNumber -> StringUtils.equalsIgnoreCase(value, ordinalNumber.getValue())) .findAny(); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/exception/SubsceneException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/exception/SubsceneException.java index 6f43e96e..ddb91b2c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/exception/SubsceneException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/exception/SubsceneException.java @@ -14,6 +14,6 @@ public class SubsceneException extends SubtitlesProviderException { @Override public String getSubtitleProvider() { - return SubtitleSource.SUBSCENE.getName(); + return SubtitleSource.SUBSCENE.name; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index 3565aea2..06051097 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -51,7 +51,7 @@ public List getUrisForSerieName(String serieName) throws TvSubt public Set getSubtitles(SerieMapping providerSerieId, int season, int episode, Language language) throws TvSubtitlesException { - return getEpisodeUrl(SERIE_URL_PREFIX + providerSerieId.getProviderId(), season, episode).mapThrowing( + return getEpisodeUrl(SERIE_URL_PREFIX + providerSerieId.providerId, season, episode).mapThrowing( (String episodeUrl) -> getSubtitles(episodeUrl, language)).orElseGet(Set::of); } @@ -64,7 +64,7 @@ private Set getSubtitles(String episodeUrl, Langu Set lSubtitles = new HashSet<>(); try { Document searchEpisodeDoc = - this.getHtml(episodeUrl.replace(".html", "-" + language.getLangCode() + ".html")) + this.getHtml(episodeUrl.replace(".html", "-" + language.langCode + ".html")) .cacheType(CacheType.NONE) .getAsJsoupDocument(); Elements searchEpisodes = searchEpisodeDoc.select(".left_articles > a"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/exception/TvSubtitlesException.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/exception/TvSubtitlesException.java index b0d4b2f4..4d0e5cfc 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/exception/TvSubtitlesException.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/exception/TvSubtitlesException.java @@ -14,6 +14,6 @@ public class TvSubtitlesException extends SubtitlesProviderException { @Override public String getSubtitleProvider() { - return SubtitleSource.TVSUBTITLES.getName(); + return SubtitleSource.TVSUBTITLES.name; } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java b/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java index d0f5892a..16a51e9c 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java @@ -11,7 +11,8 @@ public class Messages { private static final String BUNDLE_NAME = "messages"; private static final Language DEFAULT_LANGUAGE = Language.ENGLISH; - private static ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, Locale.forLanguageTag(DEFAULT_LANGUAGE.getLangCode())); + private static ResourceBundle resourceBundle = + ResourceBundle.getBundle(BUNDLE_NAME, Locale.forLanguageTag(DEFAULT_LANGUAGE.langCode)); static @var Language language; private Messages() { @@ -35,7 +36,7 @@ public static String getString(String key, Object... replacements) { public static void setLanguage(Language language) { Messages.language = language; - resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, Locale.forLanguageTag(language.getLangCode())); + resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME, Locale.forLanguageTag(language.langCode)); } public static List getAvailableLanguages() { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java index f0e63e49..c255285f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbApi.java @@ -40,7 +40,7 @@ public List getSeries(String serieName, Language language) throws Response response = theTvdb.search() .series(encodedSerieName, null, null, null, - language == null ? null : language.getLangCode()) + language == null ? null : language.langCode) .execute(); if (response.isSuccessful()) { return response.body().data.stream() @@ -58,7 +58,7 @@ public Optional getSerie(int tvdbId, Language language) throws The try { Response response = theTvdb.series() - .series(tvdbId, language == null ? null : language.getLangCode()) + .series(tvdbId, language == null ? null : language.langCode) .execute(); if (response.isSuccessful()) { return Optional.of(seriesToTVDBSerie(response.body().data, language)); @@ -79,7 +79,7 @@ public Optional getEpisode(int tvdbId, int season, int episode, Response response = theTvdb.series() .episodesQuery(tvdbId, null, season, episode, null, null, null, null, null, - language == null ? null : language.getLangCode()) + language == null ? null : language.langCode) .execute(); if (response.isSuccessful()) { if (response.body().data == null) { From 61965f8aff6ef04627112077bcb46704db02ae5a Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 16:52:38 +0100 Subject: [PATCH 26/54] changes --- .../subtools/multisubdownloader/GUI.java | 60 +++++++++---------- .../UserInteractionHandlerGUI.java | 2 +- .../gui/dialog/MappingEpisodeNameDialog.java | 18 +++--- .../gui/dialog/ProgressDialog.java | 2 +- .../progress/search/SearchProgressDialog.java | 2 +- .../gui/jcomponent/jcombobox/MyComboBox.java | 2 +- .../subtitleproviders/SubtitleProvider.java | 7 +-- .../adapters/JAddic7edAdapter.java | 19 +++--- .../adapters/JAddic7edViaProxyAdapter.java | 18 ++---- .../adapters/JOpenSubAdapter.java | 20 +++---- .../adapters/JPodnapisiAdapter.java | 20 +++---- .../adapters/JSubsceneAdapter.java | 22 +++---- .../adapters/JTVsubtitlesAdapter.java | 20 +++---- .../sublibrary/data/imdb/ImdbAdapter.java | 25 ++++---- .../sublibrary/data/omdb/OmdbAdapter.java | 8 +-- .../sublibrary/data/tvdb/TheTvdbAdapter.java | 15 ++--- 16 files changed, 106 insertions(+), 154 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index a7f37d2c..fc57cd94 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -114,11 +114,9 @@ public void redraw() { private void checkUpdate(final boolean forceUpdateCheck) { UpdateAvailableGithub u = new UpdateAvailableGithub(manager, settings); - Optional updateUrl = (forceUpdateCheck && u.isNewVersionAvailable()) || (!forceUpdateCheck && - u.shouldCheckForNewUpdate( - settingsControl.settings.updateCheckPeriod) && - u.isNewVersionAvailable()) ? - u.getLatestDownloadUrl() : Optional.empty(); + Optional updateUrl = (forceUpdateCheck && u.isNewVersionAvailable()) || + (!forceUpdateCheck && u.shouldCheckForNewUpdate(settingsControl.settings.updateCheckPeriod) && + u.isNewVersionAvailable()) ? u.getLatestDownloadUrl() : Optional.empty(); if (updateUrl.isPresent()) { final JEditorPane editorPane = new JEditorPane(); editorPane.setPreferredSize(new Dimension(800, 50)); @@ -127,11 +125,11 @@ private void checkUpdate(final boolean forceUpdateCheck) { editorPane.setText( "" + Messages.getString("UpdateAppAvailable") + "!:
" + - updateUrl.get() + ""); + updateUrl.get() + ""); editorPane.addHyperlinkListener(hyperlinkEvent -> { if (hyperlinkEvent.getEventType() == HyperlinkEvent.EventType.ACTIVATED && - Desktop.isDesktopSupported()) { + Desktop.isDesktopSupported()) { try { Desktop.getDesktop().browse(hyperlinkEvent.getURL().toURI()); } catch (Exception e) { @@ -169,12 +167,12 @@ public void windowClosing(WindowEvent e) { getContentPane().setLayout(gridBagLayout); JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.TOP); - GridBagConstraints gbc_tabbedPane = new GridBagConstraints(); - gbc_tabbedPane.insets = new Insets(0, 0, 5, 0); - gbc_tabbedPane.fill = GridBagConstraints.BOTH; - gbc_tabbedPane.gridx = 0; - gbc_tabbedPane.gridy = 0; - getContentPane().add(tabbedPane, gbc_tabbedPane); + GridBagConstraints gbcTabbedPane = new GridBagConstraints(); + gbcTabbedPane.insets = new Insets(0, 0, 5, 0); + gbcTabbedPane.fill = GridBagConstraints.BOTH; + gbcTabbedPane.gridx = 0; + gbcTabbedPane.gridy = 0; + getContentPane().add(tabbedPane, gbcTabbedPane); createFileSearchPanel(); tabbedPane.addTab(Messages.getString("MainWindow.SearchOnFile"), null, pnlSearchFile, null); @@ -183,20 +181,20 @@ public void windowClosing(WindowEvent e) { tabbedPane.addTab(Messages.getString("MainWindow.SearchOnName"), null, pnlSearchText, null); pnlLogging = new LoggingPanel(); - final GridBagConstraints gbc_pnlLogging = new GridBagConstraints(); - gbc_pnlLogging.fill = GridBagConstraints.BOTH; - gbc_pnlLogging.insets = new Insets(0, 0, 5, 0); - gbc_pnlLogging.gridx = 0; - gbc_pnlLogging.gridy = 1; - getContentPane().add(pnlLogging, gbc_pnlLogging); + final GridBagConstraints gbcPnlLogging = new GridBagConstraints(); + gbcPnlLogging.fill = GridBagConstraints.BOTH; + gbcPnlLogging.insets = new Insets(0, 0, 5, 0); + gbcPnlLogging.gridx = 0; + gbcPnlLogging.gridy = 1; + getContentPane().add(pnlLogging, gbcPnlLogging); StatusLabel lblStatus = new StatusLabel(""); StatusMessenger.instance.addListener(lblStatus); - final GridBagConstraints gbc_lblStatus = new GridBagConstraints(); - gbc_lblStatus.anchor = GridBagConstraints.SOUTHWEST; - gbc_lblStatus.gridx = 0; - gbc_lblStatus.gridy = 2; - getContentPane().add(lblStatus, gbc_lblStatus); + final GridBagConstraints gbcLblStatus = new GridBagConstraints(); + gbcLblStatus.anchor = GridBagConstraints.SOUTHWEST; + gbcLblStatus.gridx = 0; + gbcLblStatus.gridy = 2; + getContentPane().add(lblStatus, gbcLblStatus); createMenu(); setJMenuBar(menuBar); @@ -205,7 +203,7 @@ public void windowClosing(WindowEvent e) { private void createMenu() { Settings settings = settingsControl.settings; BiConsumer visibilityFunction = - pnlSearchFile.getResultPanel().getTable()::setColumnVisibility; + pnlSearchFile.resultPanel.getTable()::setColumnVisibility; BiConsumer showRenameDialog = (videoType, title) -> new RenameDialog(self(), settings, videoType, title, manager, userInteractionHandler).setVisible(true); @@ -224,7 +222,7 @@ private void createMenu() { () -> visibilityFunction.accept(SearchColumnName.EPISODE, menuBar.isViewEpisodeSelected())) .withViewShowOnlyFoundAction(() -> { settings.optionsShowOnlyFound = menuBar.isShowOnlyFound(); - ((VideoTableModel) pnlSearchFile.getResultPanel().getTable().getModel()).setShowOnlyFound( + ((VideoTableModel) pnlSearchFile.resultPanel.getTable().getModel()).setShowOnlyFound( menuBar.isShowOnlyFound()); }) .withViewClearLogAction(() -> pnlLogging.setLogText("")) @@ -258,7 +256,7 @@ private void createTextSearchPanel() { settings.subtitleLanguage == null ? Language.DUTCH : settings.subtitleLanguage); resultPanel.showSelectFoundSubtitlesButton(); resultPanel.setTable(createSubtitleTable()); - resultPanel.setDownloadAction(arg -> downloadText()); + resultPanel.setDownloadAction(_ -> downloadText()); TextGuiSearchAction searchAction = TextGuiSearchAction.createWithSettings(settings) .subtitleProviderStore(subtitleProviderStore) @@ -297,11 +295,11 @@ private void createFileSearchPanel() { .releaseFactory(new ReleaseFactory(settings, (Manager) app.make("Manager"))) .build(); - pnlSearchFileInput.addSelectFolderAction(arg -> selectIncomingFolder()); + pnlSearchFileInput.addSelectFolderAction(_ -> selectIncomingFolder()); pnlSearchFileInput.addSearchAction(searchAction); - resultPanel.setDownloadAction(arg -> download()); - resultPanel.setMoveAction(arg -> { + resultPanel.setDownloadAction(_ -> download()); + resultPanel.setMoveAction(_ -> { final int response = JOptionPane.showConfirmDialog(self(), Messages.getString("MainWindow.OnlyMoveToLibraryStructure"), Messages.getString("App.Confirm"), //$NON-NLS-2$ @@ -360,7 +358,7 @@ private void restoreScreenSettings() { private void initPopupMenu() { popupMenu = new MyPopupMenu(); JMenuItem menuItem = new JMenuItem(Messages.getString("App.Copy")); - menuItem.addActionListener(arg0 -> { + menuItem.addActionListener(_ -> { final CustomTable t = (CustomTable) popupMenu.getInvoker(); final DefaultTableModel model = (DefaultTableModel) t.getModel(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerGUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerGUI.java index 7f2a8633..21197b26 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerGUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerGUI.java @@ -19,7 +19,7 @@ public UserInteractionHandlerGUI(UserInteractionSettingsIntf settings, JFrame fr @Override public List selectSubtitles(Release release) { - List selection = new SelectDialog(getFrame(), release.getMatchingSubs(), release).getSelection(); + List selection = new SelectDialog(frame, release.getMatchingSubs(), release).getSelection(); return selection.stream().map(i -> release.getMatchingSubs().get(i)).toList(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index 557587a5..69aa7193 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -15,7 +15,6 @@ import java.util.function.Function; import lombok.AllArgsConstructor; -import lombok.Getter; import manifold.ext.props.rt.api.val; import manifold.ext.props.rt.api.var; import net.miginfocom.swing.MigLayout; @@ -63,14 +62,13 @@ private void selectMappingType(MappingType mappingType) { this.selectedMappingType = mappingType; this.selectedSubtitleProvider = subtitleProviderStore.getAllProviders() .stream() - .filter(subtitleProvider -> subtitleProvider.providerName.equals(mappingType.getProviderName())) + .filter(subtitleProvider -> subtitleProvider.providerName.equals(mappingType.providerName)) .findAny(); btnAddCustomMapping.setEnabled(selectedSubtitleProvider.isPresent()); mappingTableModel.setMappingType(mappingType); repaint(); } - @Getter public enum MappingType { TVDB("TVDB", "TVDB", new SelectionForKeyPrefix("", "TVDB-serieId-", k -> k.replace("-serieId-", "-tvdbSerie-"))), @@ -92,12 +90,12 @@ public enum MappingType { public static final BiFunction>> MAPPING_SUPPLIER; - private final String name; - private final String providerName; - private final String nameColumn; - private final String mappingColumn; - private final String providerNameColumn; - private final SelectionForKeyPrefix[] selectionForKeyPrefixList; + @val String name; + @val String providerName; + @val String nameColumn; + @val String mappingColumn; + @val String providerNameColumn; + @val SelectionForKeyPrefix[] selectionForKeyPrefixList; @Override public String toString() { @@ -241,7 +239,7 @@ private void initialize() { { JButton btnDeleteSelectedRow = new JButton(Messages.getString("MappingEpisodeNameDialog.DeleteRow")); - btnDeleteSelectedRow.addActionListener(arg0 -> { + btnDeleteSelectedRow.addActionListener(_ -> { int rowNbr = table.convertRowIndexToModel(table.getSelectedRow()); MappingTableModel model = (MappingTableModel) table.getModel(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java index 7441f777..1c404fd3 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java @@ -54,7 +54,7 @@ public void windowClosing(WindowEvent e) { getContentPane().add(progressBar, "cell 1 1,grow"); JButton btnStop = new JButton("Stop!"); - btnStop.addActionListener(arg0 -> worker.cancel(true)); + btnStop.addActionListener(_ -> worker.cancel(true)); getContentPane().add(btnStop, "cell 1 2 1 2,alignx left"); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java index f270dad8..961af5d5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java @@ -103,7 +103,7 @@ public void windowClosing(WindowEvent e) { getContentPane().add(progressBar, "cell 0 1 2 1,grow"); JButton btnStop = new JButton(Messages.getString("SearchProgressDialog.Stop")); - btnStop.addActionListener(arg0 -> searchAction.cancel(true)); + btnStop.addActionListener(_ -> searchAction.cancel(true)); getContentPane().add(btnStop, "cell 1 2,alignx left"); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java index 2f49d481..9a0bcbb9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java @@ -113,7 +113,7 @@ public static MyComboBox ofValues(E... values) { } public @Self MyComboBox withItemListener(Runnable itemListener) { - return withItemListener(arg -> itemListener.run()); + return withItemListener(_ -> itemListener.run()); } public @Self MyComboBox withSelectedItem(E item) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java index 54fd8470..784f9db8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java @@ -17,20 +17,19 @@ public interface SubtitleProvider { - @val String providerName; @val Manager manager; + @val SubtitleSource subtitleSource; + @val String providerName; Set searchSubtitles(TvRelease tvRelease, Language language); Set searchSubtitles(MovieRelease movieRelease, Language language); - SubtitleSource getSubtitleSource(); - /** * @return The name of the SubtitleProvider */ default String getName() { - return getSubtitleSource().name; + return subtitleSource.name; } /** diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java index d3c625b2..4a56bf97 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edAdapter.java @@ -10,6 +10,8 @@ import extensions.java.lang.String.StringExt; import lombok.Getter; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.addic7ed.JAddic7edApi; import org.lodder.subtools.multisubdownloader.subtitleproviders.addic7ed.exception.Addic7edException; @@ -34,6 +36,8 @@ public class JAddic7edAdapter extends AbstractAdapter jaapi; + @val @override SubtitleSource subtitleSource = SubtitleSource.ADDIC7ED; + @val @override String providerName = subtitleSource.name(); public JAddic7edAdapter(boolean isLoginEnabled, String username, String password, boolean speedy, Manager manager, UserInteractionHandler userInteractionHandler) { @@ -44,7 +48,7 @@ public JAddic7edAdapter(boolean isLoginEnabled, String username, String password return isLoginEnabled ? new JAddic7edApi(username, password, speedy, manager) : new JAddic7edApi(speedy, manager); } catch (Exception e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); } @@ -54,15 +58,6 @@ private JAddic7edApi getApi() { return jaapi.get(); } - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.ADDIC7ED; - } - - @Override - public String getProviderName() { - return getSubtitleSource().name(); - } @Override public List searchMovieSubtitlesWithHash(String hash, Language language) { @@ -97,7 +92,7 @@ public Set searchSerieSubtitles(TvRelease tvRelease, try { return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); } catch (Addic7edException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(subtitleSource.name, TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); @@ -111,7 +106,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection language == sub.getLanguage()) .map(sub -> Subtitle.downloadSource(sub.getUrl()) - .subtitleSource(getSubtitleSource()) + .subtitleSource(subtitleSource) .fileName(StringExt.removeIllegalFilenameChars(sub.getTitle() + " " + sub.getVersion())) .language(sub.getLanguage()) .quality(ReleaseParser.getQualityKeyword(sub.getTitle() + " " + sub.getVersion())) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index 04e49d37..4f1cbeb8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -14,6 +14,8 @@ import com.pivovarit.function.ThrowingSupplier; import lombok.Getter; import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.gestdown.invoker.ApiException; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.addic7ed.proxy.gestdown.JAddic7edProxyGestdownApi; @@ -33,22 +35,14 @@ public class JAddic7edViaProxyAdapter extends AbstractAdapter getSortedProviderSerieIds(OptionalInt tvdbIdOptiona "getProviderSerieName: [%s]".formatted(tvdbId)) .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .handleHttpCode(ReturnCode.NOT_FOUND, () -> { - LOGGER.info("API %s - Could not find tvdbId [%s]".formatted(getProviderName(), tvdbId)); + LOGGER.info("API %s - Could not find tvdbId [%s]".formatted(providerName, tvdbId)); return List.of(); }) .execute()).orElseGet(List::of); @@ -115,7 +109,7 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona "getProviderSerieName: [%s]".formatted(serieName)) .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .handleHttpCode(ReturnCode.NOT_FOUND, () -> { - LOGGER.info("API %s - Could not find serie name [%s]".formatted(getProviderName(), serieName)); + LOGGER.info("API %s - Could not find serie name [%s]".formatted(providerName, serieName)); return List.of(); }) .execute(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index e3cfa9ed..5bfdb96e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -9,6 +9,8 @@ import java.util.stream.Stream; import lombok.Getter; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; @@ -37,6 +39,8 @@ public class JOpenSubAdapter private static final Logger LOGGER = LoggerFactory.getLogger(JOpenSubAdapter.class); private static LazySupplier osApi; + @val @override SubtitleSource subtitleSource = SubtitleSource.OPENSUBTITLES; + @val @override String providerName = subtitleSource.name(); public JOpenSubAdapter(boolean isLoginEnabled, String username, String password, Manager manager, UserInteractionHandler userInteractionHandler) { @@ -50,7 +54,7 @@ public JOpenSubAdapter(boolean isLoginEnabled, String username, String password, return new OpenSubtitlesApi(manager); } } catch (OpenSubtitlesException e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); } @@ -60,16 +64,6 @@ private OpenSubtitlesApi getApi() { return osApi.get(); } - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.OPENSUBTITLES; - } - - @Override - public String getProviderName() { - return getSubtitleSource().name(); - } - @Override public List searchMovieSubtitlesWithHash(String hash, Language language) throws OpenSubtitlesException { @@ -113,7 +107,7 @@ public Set searchSerieSubtitles(TvRelease tvRe .getData() .stream(); } catch (OpenSubtitlesException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(subtitleSource.name, TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); @@ -140,7 +134,7 @@ private Subtitle createSubtitle(Latest200ResponseDataInnerAttributesFilesInner f SubtitleAttributes attributes) { return Subtitle.downloadSource( () -> getApi().downloadSubtitle().fileId(file.getFileId().intValue()).download().getLink()) - .subtitleSource(getSubtitleSource()) + .subtitleSource(subtitleSource) .fileName(file.getFileName()) .language(Language.fromIdOptional(attributes.getLanguage()).orElse(null)) .quality(ReleaseParser.getQualityKeyword(file.getFileName())) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index 2b32a886..43e35e34 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -7,6 +7,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.podnapisi.JPodnapisiApi; @@ -32,6 +34,8 @@ public class JPodnapisiAdapter private static final Logger LOGGER = LoggerFactory.getLogger(JPodnapisiAdapter.class); private static LazySupplier jpapi; + @val @override SubtitleSource subtitleSource = SubtitleSource.PODNAPISI; + @val @override String providerName = subtitleSource.name(); public JPodnapisiAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { super(manager, userInteractionHandler); @@ -40,7 +44,7 @@ public JPodnapisiAdapter(Manager manager, UserInteractionHandler userInteraction try { return new JPodnapisiApi(manager, "JBierSubDownloader"); } catch (Exception e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); } @@ -50,16 +54,6 @@ private JPodnapisiApi getApi() { return jpapi.get(); } - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.PODNAPISI; - } - - @Override - public String getProviderName() { - return getSubtitleSource().name(); - } - @Override public List searchMovieSubtitlesWithHash(String hash, Language language) { return List.of(); @@ -91,7 +85,7 @@ public Set searchSerieSubtitles(TvRelease tvRelease return getApi().getSerieSubtitles(providerSerieId, tvRelease.season, episode, language) .stream(); } catch (PodnapisiException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(subtitleSource.name, TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); @@ -109,7 +103,7 @@ private Set buildListSubtitles(Language language, Collection StringUtils.isNotBlank(ossd.releaseString)) .map(ossd -> Subtitle.downloadSource(ossd.url) - .subtitleSource(getSubtitleSource()) + .subtitleSource(subtitleSource) .fileName(ossd.releaseString) .language(language) .quality(ReleaseParser.getQualityKeyword(ossd.releaseString)) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index 6381300f..90c4d88b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -13,6 +13,8 @@ import java.util.stream.IntStream; import java.util.stream.Stream; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.subscene.SubsceneApi; @@ -37,6 +39,8 @@ public class JSubsceneAdapter extends AbstractAdapter api; + @val @override SubtitleSource subtitleSource = SubtitleSource.SUBSCENE; + @val @override String providerName = subtitleSource.name(); public JSubsceneAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { super(manager, userInteractionHandler); @@ -45,7 +49,7 @@ public JSubsceneAdapter(Manager manager, UserInteractionHandler userInteractionH try { return new SubsceneApi(manager); } catch (Exception e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); } @@ -55,16 +59,6 @@ private SubsceneApi getApi() { return api.get(); } - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.SUBSCENE; - } - - @Override - public String getProviderName() { - return getSubtitleSource().name(); - } - @Override public List searchMovieSubtitlesWithHash(String hash, Language language) { // TODO implement this @@ -98,7 +92,7 @@ public Set searchSerieSubtitles(TvRelease tvRelease, try { return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); } catch (SubsceneException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(subtitleSource.name, TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); @@ -122,7 +116,7 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona .sorted(Comparator.comparingInt(entry -> providerTypeFunction.applyAsInt(entry.getKey()))) .map(Entry::getValue) .flatMap(List::stream) - .sorted(Comparator.comparing((SubSceneSerieId serieId) -> serieId.getSeason() == 0) + .sorted(Comparator.comparing((SubSceneSerieId serieId) -> serieId.season == 0) .thenComparing(serieId -> { Matcher matcher = yearPattern.matcher(serieId.name); return matcher.find() ? Integer.parseInt(matcher.group()) : 0; @@ -140,7 +134,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection sub.getName() .contains(getSeasonEpisodeString(tvRelease.season, tvRelease.firstEpisodeNumber))) .map(sub -> Subtitle.downloadSource(sub.getUrlSupplier()) - .subtitleSource(getSubtitleSource()) + .subtitleSource(subtitleSource) .fileName(sub.getName().removeIllegalFilenameChars()) .language(sub.getLanguage()) .quality(ReleaseParser.getQualityKeyword(sub.getName())) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java index 572f5607..3c8452fb 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JTVsubtitlesAdapter.java @@ -10,6 +10,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.subtitleproviders.tvsubtitles.JTVSubtitlesApi; @@ -35,6 +37,8 @@ public class JTVsubtitlesAdapter private static final Logger LOGGER = LoggerFactory.getLogger(JTVsubtitlesAdapter.class); private static LazySupplier jtvapi; + @val @override SubtitleSource subtitleSource = SubtitleSource.TVSUBTITLES; + @val @override String providerName = subtitleSource.name(); public JTVsubtitlesAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { super(manager, userInteractionHandler); @@ -43,7 +47,7 @@ public JTVsubtitlesAdapter(Manager manager, UserInteractionHandler userInteracti try { return new JTVSubtitlesApi(manager); } catch (Exception e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); } @@ -53,16 +57,6 @@ private JTVSubtitlesApi getApi() { return jtvapi.get(); } - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.TVSUBTITLES; - } - - @Override - public String getProviderName() { - return getSubtitleSource().name(); - } - @Override public List searchMovieSubtitlesWithHash(String hash, Language language) { // TODO implement this @@ -96,7 +90,7 @@ public Set searchSerieSubtitles(TvRelease tvRelea try { return getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); } catch (TvSubtitlesException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(subtitleSource.name, TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); @@ -109,7 +103,7 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection Subtitle.downloadSource(sub.url) - .subtitleSource(getSubtitleSource()) + .subtitleSource(subtitleSource) .fileName(sub.filename) .language(language) .quality(ReleaseParser.getQualityKeyword(sub.filename + " " + sub.rip)) diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java index 6b899d7a..75fb2af2 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java @@ -28,6 +28,7 @@ public class ImdbAdapter { private final UserInteractionHandler userInteractionHandler; private final LazySupplier imdbApi; private final LazySupplier imdbSearchIdApi; + private final String providerName = "IMDB"; private ImdbAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { this.manager = manager; @@ -36,31 +37,27 @@ private ImdbAdapter(Manager manager, UserInteractionHandler userInteractionHandl try { return new ImdbApi(manager); } catch (Exception e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); this.imdbSearchIdApi = new LazySupplier<>(() -> { try { return new ImdbSearchIdApi(manager); } catch (Exception e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); } - public String getProviderName() { - return "IMDB"; - } - public Optional getMovieDetails(int imdbId) { return manager.valueBuilder() .cacheType(CacheType.DISK) - .key("%s-MovieDetails:%s".formatted(getProviderName(), imdbId)) + .key("%s-MovieDetails:%s".formatted(providerName, imdbId)) .optionalSupplier(() -> { try { return imdbApi.get().getMovieDetails(imdbId); } catch (ImdbException e) { - LOGGER.error("API %s getMovieDetails for id [%s] (%s)".formatted(getProviderName(), imdbId, + LOGGER.error("API %s getMovieDetails for id [%s] (%s)".formatted(providerName, imdbId, e.getMessage()), e); return Optional.empty(); } @@ -71,14 +68,14 @@ public OptionalInt getImdbId(String title, Integer year) { try { return manager.valueBuilder() .cacheType(CacheType.DISK) - .key("%s-id-%s-%s".formatted(getProviderName(), title, year)) + .key("%s-id-%s-%s".formatted(providerName, title, year)) .optionalIntSupplier(() -> getImdbIdOnImdb(title, year) .orElseMap(() -> getImdbIdOnGoogle(title, year)) .orElseMap(() -> getImdbIdOnYahoo(title, year)) .orElseMap(() -> promptUserToEnterImdbId(title, year))) .storeTempNullValue().getOptionalInt(); } catch (Exception e) { - LOGGER.error("API %s getImdbId for title [%s] (%s)".formatted(getProviderName(), title, e.getMessage()), e); + LOGGER.error("API %s getImdbId for title [%s] (%s)".formatted(providerName, title, e.getMessage()), e); return OptionalInt.empty(); } } @@ -101,11 +98,11 @@ private OptionalInt getImdbIdCommon(String title, Integer year, try { providerSerieIds = providerSerieIdSupplier.apply(title, year); } catch (ImdbSearchIdException e) { - LOGGER.error("API %s getImdbId for title [%s] and year [%s] (%s)".formatted(getProviderName(), title, year, + LOGGER.error("API %s getImdbId for title [%s] and year [%s] (%s)".formatted(providerName, title, year, e.getMessage()), e); return OptionalInt.empty(); } - if (!userInteractionHandler.getSettings().optionsConfirmProviderMapping && providerSerieIds.size() == 1) { + if (!userInteractionHandler.settings.optionsConfirmProviderMapping && providerSerieIds.size() == 1) { // found single exact match return OptionalInt.of(Integer.parseInt(providerSerieIds.iterator().next().id)); } @@ -119,13 +116,13 @@ private OptionalInt getImdbIdCommon(String title, Integer year, .thenComparing(ProviderSerieId::getName)) .toList(), Messages.getString("Prompter.SelectImdbMatchForSerie").formatted(title), - getProviderName(), + providerName, ProviderSerieId::getName) .mapToInt(providerSerieId -> Integer.parseInt(providerSerieId.id)); } private OptionalInt promptUserToEnterImdbId(String title, int year) { - return userInteractionHandler.enter(getProviderName(), + return userInteractionHandler.enter(providerName, Messages.getString("Prompter.EnterImdbMatchForSerie").formatted(title), Messages.getString("Prompter.ValueIsNotValid"), StringUtils::isNumeric).mapToInt(Integer::parseInt); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java index 5751d695..0ba0b930 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbAdapter.java @@ -2,6 +2,7 @@ import java.util.Optional; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.data.omdb.model.OmdbDetails; @@ -17,6 +18,7 @@ public class OmdbAdapter { private static OmdbAdapter instance; private final Manager manager; private final LazySupplier omdpApi; + @val String providerName = "OMDB"; private OmdbAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { this.manager = manager; @@ -24,15 +26,11 @@ private OmdbAdapter(Manager manager, UserInteractionHandler userInteractionHandl try { return new OmdbApi(manager); } catch (Exception e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); } - public String getProviderName() { - return "OMDB"; - } - private OmdbApi getApi() { return omdpApi.get(); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index 70a66a21..18b12c2a 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -33,6 +33,7 @@ public class TheTvdbAdapter { private final Manager manager; private final UserInteractionHandler userInteractionHandler; private final LazySupplier jtvapi; + private final String providerName = "TVDB"; private TheTvdbAdapter(Manager manager, UserInteractionHandler userInteractionHandler) { this.manager = manager; @@ -41,15 +42,11 @@ private TheTvdbAdapter(Manager manager, UserInteractionHandler userInteractionHa try { return new TheTvdbApi(manager, "A1720D2DDFDCE82D"); } catch (Exception e) { - throw new SubtitlesProviderInitException(getProviderName(), e); + throw new SubtitlesProviderInitException(providerName, e); } }); } - public String getProviderName() { - return "TVDB"; - } - private TheTvdbApi getApi() { return jtvapi.get(); } @@ -72,7 +69,7 @@ public Optional getSerie(String serieName) { } if (serieIds.isEmpty()) { tvdbSerie = Optional.empty(); - } else if (!userInteractionHandler.getSettings().optionsConfirmProviderMapping && serieIds.size() == 1) { + } else if (!userInteractionHandler.settings.optionsConfirmProviderMapping && serieIds.size() == 1) { tvdbSerie = Optional.of(serieIds.first); } else { String formattedSerieName = serieName.replaceAll("[^A-Za-z]", ""); @@ -85,7 +82,7 @@ public Optional getSerie(String serieName) { tvdbSerie = userInteractionHandler .selectFromList(serieIds.stream().sorted(comparator).toList(), Messages.getString("Prompter.SelectTvdbMatchForSerie").formatted(serieName), - getProviderName(), s -> "${s.serieName} (${s.firstAired})"); + providerName, s -> "${s.serieName} (${s.firstAired})"); if (tvdbSerie.isEmpty()) { tvdbSerie = askUserToEnterTvdbId(serieName) .mapToObj(tvdbId -> api.getSerie(tvdbId, null).orElse(null)); @@ -115,7 +112,7 @@ public Optional getSerie(String serieName) { public Optional getEpisode(int tvdbId, int season, int episode) { return manager.valueBuilder() .cacheType(CacheType.DISK) - .key("%s-episode-%s-%s-%s".formatted(getProviderName(), tvdbId, season, episode)) + .key("%s-episode-%s-%s-%s".formatted(providerName, tvdbId, season, episode)) .optionalSupplier(() -> { try { return getApi().getEpisode(tvdbId, season, episode, Language.ENGLISH); @@ -129,7 +126,7 @@ public Optional getEpisode(int tvdbId, int season, int episode) } - public synchronized static TheTvdbAdapter getInstance(Manager manager, + public static synchronized TheTvdbAdapter getInstance(Manager manager, UserInteractionHandler userInteractionHandler) { if (instance == null) { instance = new TheTvdbAdapter(manager, userInteractionHandler); From 86218a63dd7d49b8e1fb674447fdd04ef3222207 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 17:04:18 +0100 Subject: [PATCH 27/54] fix --- .../gui/panels/preference/StructureFolderPanel.java | 2 +- .../org/lodder/subtools/sublibrary/model/MovieRelease.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index 6fab0843..b611efe9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -111,7 +111,7 @@ public void loadPreferenceSettings() { txtFolderStructure.setText(librarySettings.libraryFolderStructure); chkRemoveEmptyFolder.setSelected(librarySettings.libraryRemoveEmptyFolders); chkReplaceSpace.setSelected(librarySettings.libraryFolderReplaceSpace); - cbxReplaceSpaceChar.setSelectedItem(librarySettings.libraryFolderReplacingSpaceChar; + cbxReplaceSpaceChar.setSelectedItem(librarySettings.libraryFolderReplacingSpaceChar); } public void savePreferenceSettings() { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java index 45e06e09..681222d4 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java @@ -5,15 +5,14 @@ import lombok.Setter; import lombok.experimental.Accessors; -import manifold.ext.props.rt.api.set; import manifold.ext.props.rt.api.var; public final class MovieRelease extends Release { @var String name; @var Integer year; - @set int imdbId; - @set int tvdbId; + @var int imdbId; + @var int tvdbId; public interface MovieReleaseBuilderName { MovieReleaseBuilderOther name(String name); From 4047f7b9e5284468c75cee606b600d10663802d8 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 17:21:45 +0100 Subject: [PATCH 28/54] changes --- .../multisubdownloader/actions/SearchAction.java | 13 ++++++++----- .../org/lodder/subtools/sublibrary/cache/Cache.java | 13 +++++++------ .../subtools/sublibrary/cache/CacheObject.java | 2 +- .../sublibrary/cache/ExpiringCacheObject.java | 2 +- .../cache/ExpiringSerializableCacheObject.java | 3 ++- .../sublibrary/cache/TemporaryCacheObject.java | 5 +++-- .../cache/TemporarySerializableCacheObject.java | 3 ++- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java index 7ee6b6d9..b568bb3f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java @@ -4,10 +4,9 @@ import java.util.List; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; import manifold.ext.props.rt.api.get; import manifold.ext.props.rt.api.set; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.UserInteractionHandler; import org.lodder.subtools.multisubdownloader.exceptions.SearchSetupException; @@ -24,13 +23,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@RequiredArgsConstructor public abstract class SearchAction implements Runnable, Cancelable, SearchHandler { private static final Logger LOGGER = LoggerFactory.getLogger(SearchAction.class); - @get(Protected) @NonNull Settings settings; - @get(Protected) @NonNull SubtitleProviderStore subtitleProviderStore; + @val(Protected) Settings settings; + @val(Protected) SubtitleProviderStore subtitleProviderStore; @get(Protected) @set(Private) StatusListener statusListener; @get(Protected) @set(Private) SearchManager searchManager; @@ -40,6 +38,11 @@ public abstract class SearchAction implements Runnable, Cancelable, SearchHandle abstract @get(Protected) UserInteractionHandler userInteractionHandler; abstract @get(Protected) SearchProgressListener searchProgressListener; + protected SearchAction(Settings settings, SubtitleProviderStore subtitleProviderStore) { + this.settings = settings; + this.subtitleProviderStore = subtitleProviderStore; + } + @Override public void run() { LOGGER.trace("SearchAction is being executed"); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java index 022dc885..677deafd 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java @@ -50,7 +50,7 @@ public Optional get(K key) { return Optional.empty(); } else { obj.updateLastAccessed(); - return Optional.ofNullable(obj.value); + return Optional.ofNullable((V) obj.value); } } } @@ -70,9 +70,10 @@ public boolean isTemporaryExpired(K key) { public OptionalLong getTemporaryTimeToLive(K key) { synchronized (cacheMap) { - CacheObject obj = cacheMap.get(key); - return obj instanceof TemporaryCacheObject tempCacheObject ? - OptionalLong.of(tempCacheObject.timeToLive) : OptionalLong.empty(); + return switch (cacheMap.get(key)) { + case TemporaryCacheObject tempCacheObject -> OptionalLong.of(tempCacheObject.timeToLive); + case ExpiringCacheObject _ -> OptionalLong.empty(); + }; } } @@ -96,7 +97,7 @@ public V getOrPut(K key, ThrowingSupplier supplier) return null; } else { obj.updateLastAccessed(); - return obj.value; + return (V) obj.value; } } @@ -119,7 +120,7 @@ public List> getEntries() { public List> getEntries(Predicate keyFilter) { synchronized (cacheMap) { - return getEntryStream(keyFilter).map(entry -> Pair.of(entry.getKey(), entry.getValue().value)).toList(); + return getEntryStream(keyFilter).map(entry -> Pair.of(entry.getKey(), (V) entry.getValue().value)).toList(); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/CacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/CacheObject.java index cee86234..c770e71b 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/CacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/CacheObject.java @@ -5,7 +5,7 @@ import manifold.ext.props.rt.api.val; -public interface CacheObject { +public sealed interface CacheObject permits ExpiringCacheObject, TemporaryCacheObject { @val long created; @val T value; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringCacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringCacheObject.java index 3b54710e..2b471b42 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringCacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringCacheObject.java @@ -16,7 +16,7 @@ @ToString @AllArgsConstructor(access = AccessLevel.PRIVATE) -class ExpiringCacheObject implements CacheObject, Serializable { +sealed class ExpiringCacheObject implements CacheObject, Serializable permits ExpiringSerializableCacheObject { @Serial private static final long serialVersionUID = 3852086993086134232L; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringSerializableCacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringSerializableCacheObject.java index 3e380e56..a5ff85c1 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringSerializableCacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/ExpiringSerializableCacheObject.java @@ -7,7 +7,8 @@ @ToString -class ExpiringSerializableCacheObject extends ExpiringCacheObject implements Serializable { +final class ExpiringSerializableCacheObject extends ExpiringCacheObject + implements Serializable { @Serial private static final long serialVersionUID = 8773462650510864103L; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporaryCacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporaryCacheObject.java index 0e9481f8..e6eee11f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporaryCacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporaryCacheObject.java @@ -15,7 +15,7 @@ @ToString @AllArgsConstructor(access = AccessLevel.PRIVATE) -class TemporaryCacheObject implements CacheObject, Serializable { +sealed class TemporaryCacheObject implements CacheObject, Serializable permits TemporarySerializableCacheObject { @Serial private static final long serialVersionUID = -152474119228350222L; @@ -50,7 +50,8 @@ public String toString(Function valueToStringMapper) { return "created:%s|expire:%s|value:%s".formatted(created, timeToLive, valueToStringMapper.apply(value)); } - public static Optional> fromString(String string, Function valueToObjectMapper) { + public static Optional> fromString(String string, + Function valueToObjectMapper) { Matcher matcher = PATTERN.matcher(string); if (matcher.matches()) { long created = Long.parseLong(matcher.group(1)); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporarySerializableCacheObject.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporarySerializableCacheObject.java index 11a83374..d2db881f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporarySerializableCacheObject.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TemporarySerializableCacheObject.java @@ -6,7 +6,8 @@ import lombok.ToString; @ToString -class TemporarySerializableCacheObject extends TemporaryCacheObject implements Serializable { +final class TemporarySerializableCacheObject extends TemporaryCacheObject + implements Serializable { @Serial private static final long serialVersionUID = 3426939140266268946L; From 83fed074fe302ab2e98e3b67a12595ee52f1ced6 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 17:23:17 +0100 Subject: [PATCH 29/54] update gestdown json --- .../resources/gestdown/gestdown-swagger.json | 230 +++++++++++++----- 1 file changed, 166 insertions(+), 64 deletions(-) diff --git a/MultiSubDownloader/src/main/resources/gestdown/gestdown-swagger.json b/MultiSubDownloader/src/main/resources/gestdown/gestdown-swagger.json index 2cdd8057..bceb0226 100644 --- a/MultiSubDownloader/src/main/resources/gestdown/gestdown-swagger.json +++ b/MultiSubDownloader/src/main/resources/gestdown/gestdown-swagger.json @@ -3,7 +3,7 @@ "info": { "title": "Gestdown: Addicted Proxy", "description": "Provide a full api to search and download subtitles from Addic7ed website.", - "version": "4.14.16" + "version": "4.29.11" }, "servers": [ { @@ -20,7 +20,7 @@ "summary": "Information about the application", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "application/json": { "schema": { @@ -46,7 +46,7 @@ "required": true, "schema": { "maximum": 50, - "minimum": 0, + "minimum": 1, "type": "integer", "format": "int32" } @@ -54,7 +54,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "application/json": { "schema": { @@ -100,7 +100,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "application/json": { "schema": { @@ -109,8 +109,59 @@ } } }, + "429": { + "description": "Too Many Requests", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, "404": { "description": "Not Found" + } + } + } + }, + "/media/{showId}/episodes/{language}": { + "get": { + "tags": [ + "Media" + ], + "summary": "Get the show details with the last season and episodes", + "parameters": [ + { + "name": "showId", + "in": "path", + "description": "", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "language", + "in": "path", + "description": "", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MediaDetailsWithEpisodeAndSubtitlesDto" + } + } + } }, "429": { "description": "Too Many Requests", @@ -121,6 +172,9 @@ } } } + }, + "404": { + "description": "Not Found" } } } @@ -147,7 +201,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -199,13 +253,27 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" }, "400": { - "description": "Bad Request" + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, "404": { - "description": "Not Found" + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } }, "429": { "description": "Too Many Requests", @@ -267,18 +335,18 @@ } } }, - "400": { - "description": "Doesn't follow the right format for the search: Show S00E00", + "404": { + "description": "Couldn't find the show or its season/episode", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WrongFormatResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "404": { - "description": "Couldn't find the show or its season/episode", + "423": { + "description": "Refreshing the show, currently don't have data, try again later", "content": { "application/json": { "schema": { @@ -287,12 +355,12 @@ } } }, - "423": { - "description": "Refreshing the show, currently don't have data, try again later", + "400": { + "description": "Doesn't follow the right format for the search: Show S00E00", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/WrongFormatResponse" } } } @@ -370,18 +438,18 @@ } } }, - "400": { - "description": "Doesn't follow the right format for the search: Show S00E00", + "404": { + "description": "Couldn't find the show or its season/episode", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WrongFormatResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "404": { - "description": "Couldn't find the show or its season/episode", + "423": { + "description": "Refreshing the show, currently don't have data, try again later", "content": { "application/json": { "schema": { @@ -390,12 +458,12 @@ } } }, - "423": { - "description": "Refreshing the show, currently don't have data, try again later", + "400": { + "description": "Doesn't follow the right format for the search: Show S00E00", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/WrongFormatResponse" } } } @@ -476,29 +544,26 @@ } } }, - "400": { - "description": "Doesn't follow the right format for the search: Show S00E00", + "404": { + "description": "Couldn't find the show or its season/episode", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WrongFormatResponse" + "$ref": "#/components/schemas/ErrorResponse" } } } }, - "404": { - "description": "Couldn't find the show or its season/episode", + "400": { + "description": "Doesn't follow the right format for the search: Show S00E00", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ErrorResponse" + "$ref": "#/components/schemas/WrongFormatResponse" } } } }, - "423": { - "description": "Refreshing the show, currently don't have data, try again later" - }, "429": { "description": "Reached the rate limiting of the endpoint", "content": { @@ -508,6 +573,9 @@ } } } + }, + "423": { + "description": "Refreshing the show, currently don't have data, try again later" } } } @@ -541,8 +609,8 @@ } } }, - "404": { - "description": "Not Found", + "429": { + "description": "Reached the rate limiting of the endpoint", "content": { "application/json": { "schema": { @@ -551,8 +619,8 @@ } } }, - "429": { - "description": "Reached the rate limiting of the endpoint", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -593,8 +661,8 @@ } } }, - "404": { - "description": "Not Found", + "429": { + "description": "Reached the rate limiting of the endpoint", "content": { "application/json": { "schema": { @@ -603,8 +671,8 @@ } } }, - "429": { - "description": "Reached the rate limiting of the endpoint", + "404": { + "description": "Not Found", "content": { "application/json": { "schema": { @@ -635,11 +703,11 @@ } ], "responses": { - "204": { - "description": "If the job to sync the show has been scheduled" - }, "404": { "description": "Couldn't find the show" + }, + "204": { + "description": "If the job to sync the show has been scheduled" } } } @@ -682,51 +750,51 @@ } ], "responses": { - "200": { - "description": "Success", + "404": { + "description": "Couldn't find the show" + }, + "429": { + "description": "Reached the rate limiting of the endpoint", "content": { "text/plain": { "schema": { - "$ref": "#/components/schemas/TvShowSubtitleResponse" + "type": "string" } }, "application/json": { "schema": { - "$ref": "#/components/schemas/TvShowSubtitleResponse" + "type": "string" } }, "text/json": { "schema": { - "$ref": "#/components/schemas/TvShowSubtitleResponse" + "type": "string" } } } }, - "400": { - "description": "Unknown language" - }, - "404": { - "description": "Couldn't find the show" - }, - "429": { - "description": "Reached the rate limiting of the endpoint", + "200": { + "description": "OK", "content": { "text/plain": { "schema": { - "type": "string" + "$ref": "#/components/schemas/TvShowSubtitleResponse" } }, "application/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/TvShowSubtitleResponse" } }, "text/json": { "schema": { - "type": "string" + "$ref": "#/components/schemas/TvShowSubtitleResponse" } } } + }, + "400": { + "description": "Unknown language" } } } @@ -824,7 +892,7 @@ "minLength": 1, "type": "string", "description": "English name of the show", - "example": "Bloodhounds" + "example": "Bloodhounds (2024)" } }, "additionalProperties": false @@ -956,6 +1024,33 @@ }, "additionalProperties": false }, + "MediaDetailsWithEpisodeAndSubtitlesDto": { + "required": [ + "details", + "episodeWithSubtitles" + ], + "type": "object", + "properties": { + "details": { + "$ref": "#/components/schemas/MediaDetailsDto" + }, + "episodeWithSubtitles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EpisodeWithSubtitlesDto" + }, + "description": "" + }, + "lastSeasonNumber": { + "type": "integer", + "description": "", + "format": "int32", + "nullable": true + } + }, + "additionalProperties": false, + "description": "Represent a media with its details and episodes with subtitles" + }, "MediaType": { "enum": [ "Show", @@ -988,7 +1083,8 @@ "id", "name", "nbSeasons", - "seasons" + "seasons", + "slug" ], "type": "object", "properties": { @@ -1038,6 +1134,12 @@ "format": "int32", "nullable": true, "example": 80475 + }, + "slug": { + "minLength": 1, + "type": "string", + "description": "Slug to be used in URL for the show\r\nwellington-paranormal", + "readOnly": true } }, "additionalProperties": false, @@ -1191,4 +1293,4 @@ } } } -} +} \ No newline at end of file From 4bd28da3fe248bb74a094c9562090733c8c6b5e9 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 20:04:57 +0100 Subject: [PATCH 30/54] changes --- MultiSubDownloader/pom.xml | 27 ++++++++++++++++--- .../subtools/multisubdownloader/App.java | 7 ++--- .../actions/SearchAction.java | 2 +- .../cli/actions/CliSearchAction.java | 2 +- .../cli/progress/CLIFileIndexerProgress.java | 2 +- .../actions/search/FileGuiSearchAction.java | 4 +-- .../gui/actions/search/GuiSearchAction.java | 12 ++++----- .../adapters/JAddic7edViaProxyAdapter.java | 16 ++++++----- 8 files changed, 48 insertions(+), 24 deletions(-) diff --git a/MultiSubDownloader/pom.xml b/MultiSubDownloader/pom.xml index 5c22c1bc..5606cadd 100644 --- a/MultiSubDownloader/pom.xml +++ b/MultiSubDownloader/pom.xml @@ -121,10 +121,29 @@ src/main/resources true - - - - org.apache.maven.plugins + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.6.0 + + + add-generated-sources + generate-sources + + add-source + + + + ${project.build.directory}/generated-source/openapi/src/main/java + + + + + + + org.apache.maven.plugins maven-compiler-plugin diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java index 246334b6..d9dd4101 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader; +import static java.util.concurrent.TimeUnit.*; + import javax.swing.*; import java.awt.*; import java.io.Serializable; @@ -7,7 +9,6 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.prefs.Preferences; import ch.qos.logback.classic.Level; @@ -161,13 +162,13 @@ private static Manager createManager(boolean useGui) { } DiskCache diskCache = SerializableDiskCache.cacheBuilder().keyType(String.class).valueType(Serializable.class) - .timeToLive(TimeUnit.SECONDS.convert(500, TimeUnit.DAYS)) + .timeToLive(SECONDS.convert(500, DAYS)) .maxItems(2500) .build(); InMemoryCache inMemoryCache = InMemoryCache.builder().keyType(String.class).valueType(Serializable.class) - .timeToLive(TimeUnit.SECONDS.convert(10, TimeUnit.MINUTES)) + .timeToLive(SECONDS.convert(10, MINUTES)) .timerInterval(100L) .maxItems(500) .build(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java index b568bb3f..e6fe003d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java @@ -33,7 +33,7 @@ public abstract class SearchAction implements Runnable, Cancelable, SearchHandle @get(Protected) @set(Private) StatusListener statusListener; @get(Protected) @set(Private) SearchManager searchManager; @get(Protected) @set(Private) List releases; - @get(Protected) Language language; + @get(Protected) abstract Language language; abstract @get(Protected) IndexingProgressListener indexingProgressListener; abstract @get(Protected) UserInteractionHandler userInteractionHandler; abstract @get(Protected) SearchProgressListener searchProgressListener; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java index 4b708a78..798672fe 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java @@ -198,7 +198,7 @@ public void onFound(Release release, List subtitles) { subtitles.stream() .filter(subtitle -> filtering.useSubtitle(subtitle, release)) .forEach(release::addMatchingSub); - if (searchManager.getProgress() < 100) { + if (searchManager.progress < 100) { return; } LOGGER.debug("found files for doDownload [{}]", releases.size()); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java index 7816bc3f..0ee2bb70 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java @@ -66,6 +66,6 @@ protected void printProgress() { System.out.println(); } - this.printProgBar(this.getProgress()); + this.printProgBar(this.progress); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java index 980333ea..2568821c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java @@ -85,7 +85,7 @@ protected void validate() throws SearchSetupException { @Override public void onFound(Release release, List subtitles) { - VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.resultPanel.getTable().getModel(); List filteredSubtitles = filtering != null ? subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).toList() : subtitles; @@ -106,7 +106,7 @@ protected List createReleases() { boolean recursive = inputPanel.isRecursiveSelected(); boolean overwriteExistingSubtitles = inputPanel.isForceOverwrite(); - VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.resultPanel.getTable().getModel(); model.clearTable(); /* get a list of video files */ diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java index 2ef37d45..ab2f6799 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java @@ -52,12 +52,12 @@ public abstract class GuiSearchAction

extends SearchAction } protected P getInputPanel() { - return this.searchPanel.getInputPanel(); + return this.searchPanel.inputPanel; } @Override protected Language getLanguage() { - return this.searchPanel.getInputPanel().getSelectedLanguage(); + return this.searchPanel.inputPanel.getSelectedLanguage(); } @Override @@ -66,15 +66,15 @@ public void onFound(Release release, List subtitles) { return; } - VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel(); + VideoTableModel model = (VideoTableModel) this.searchPanel.resultPanel.getTable().getModel(); if (model.getRowCount() > 0) { - searchPanel.getResultPanel().enableButtons(); + searchPanel.resultPanel.enableButtons(); } - if (this.searchManager.getProgress() == 100) { + if (this.searchManager.progress == 100) { this.searchProgressListener.completed(); - searchPanel.getInputPanel().enableSearchButton(); + searchPanel.inputPanel.enableSearchButton(); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index 4f1cbeb8..5bedfbc9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -96,7 +96,7 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona throws ApiException { List serieIds = tvdbIdOptional.mapToObj( tvdbId -> new ExecuteCall<>(() -> getApi().getProviderSerieName(tvdbId)).message( - "getProviderSerieName: [%s]".formatted(tvdbId)) + "getProviderSerieName: [$tvdbId]") .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .handleHttpCode(ReturnCode.NOT_FOUND, () -> { LOGGER.info("API %s - Could not find tvdbId [%s]".formatted(providerName, tvdbId)); @@ -106,7 +106,7 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona if (serieIds.isEmpty()) { serieIds = new ExecuteCall<>(() -> getApi().getProviderSerieName(serieName)).message( - "getProviderSerieName: [%s]".formatted(serieName)) + "getProviderSerieName: [$serieName]") .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .handleHttpCode(ReturnCode.NOT_FOUND, () -> { LOGGER.info("API %s - Could not find serie name [%s]".formatted(providerName, serieName)); @@ -154,20 +154,24 @@ public ExecuteCall(ThrowingSupplier supplier) { } public ExecuteCall retryWhenHttpCode(ReturnCode returnCode) { - return super.retryWhenException(e -> returnCode.isSameCode(e.getCode())); + super.retryWhenException(e -> returnCode.isSameCode(e.getCode())); + return this; } public ExecuteCall handleHttpCode(ReturnCode returnCode, Function function) { - return super.handleException(e -> returnCode.isSameCode(e.getCode()), function); + super.handleException(e -> returnCode.isSameCode(e.getCode()), function); + return this; } public ExecuteCall handleHttpCode(ReturnCode returnCode, Supplier supplier) { - return super.handleException(e -> returnCode.isSameCode(e.getCode()), supplier); + super.handleException(e -> returnCode.isSameCode(e.getCode()), supplier); + return this; } @Override public ExecuteCall handleException(Supplier suppliers) { - return super.handleException(_ -> true, suppliers); + super.handleException(_ -> true, suppliers); + return this; } } } From a773604b75a6753ad66c9ad74985c2af017a6112 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 20:57:03 +0100 Subject: [PATCH 31/54] changes --- .../java/awt/Component/ComponentExt.java | 49 +++++++++++- .../java/awt/Container/ContainerExt.java | 6 +- .../AbstractButton/AbstractButtonExt.java | 25 +++--- .../javax/swing/JCheckBox/JCheckBoxExt.java | 8 +- .../javax/swing/JComponent/JComponentExt.java | 36 ++++++--- .../swing/JScrollPane/JScrollPaneExt.java | 2 +- .../javax/swing/JSlider/JSliderExt.java | 4 +- .../javax/swing/JTextArea/JTextAreaExt.java | 4 +- .../javax/swing/JTextField/JTextFieldExt.java | 2 +- .../JTextComponent/JTextComponentExt.java | 8 ++ .../gui/actions/search/GuiSearchAction.java | 2 +- .../actions/search/TextGuiSearchAction.java | 8 +- .../gui/dialog/MappingEpisodeNameDialog.java | 6 +- .../gui/dialog/PreferenceDialog.java | 7 +- .../gui/dialog/RenameDialog.java | 45 +++++------ .../gui/dialog/SelectDialog.java | 53 ++++++------ .../gui/dialog/StructureBuilderDialog.java | 46 +++++------ .../progress/search/SearchProgressDialog.java | 4 +- .../gui/extra/table/SearchColumnName.java | 3 +- .../gui/panels/LoggingPanel.java | 5 +- .../gui/panels/SearchFileInputPanel.java | 2 +- .../gui/panels/SearchTextInputPanel.java | 24 +++--- .../preference/DefaultSelectionPanel.java | 10 +-- .../gui/panels/preference/GeneralPanel.java | 16 ++-- .../gui/panels/preference/OptionsPanel.java | 2 +- .../preference/SerieProvidersPanel.java | 18 ++--- .../panels/preference/StructureFilePanel.java | 80 +++++++++---------- .../preference/StructureFolderPanel.java | 12 +-- .../preference/SubtitleBackupPanel.java | 6 +- 29 files changed, 274 insertions(+), 219 deletions(-) diff --git a/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java b/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java index 088c10b8..9d58ce3c 100644 --- a/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java +++ b/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java @@ -10,6 +10,7 @@ import manifold.ext.rt.api.Extension; import manifold.ext.rt.api.Self; import manifold.ext.rt.api.This; +import org.jetbrains.annotations.Nullable; @UtilityClass @Extension @@ -29,8 +30,54 @@ public static void setRecursive(@This Component component, Consumer c } } - public static @Self Component withMouseListener(@This Component component, MouseListener listener) { + public static @Self Component mouseListener(@This Component component, @Nullable MouseListener listener) { component.addMouseListener(listener); return component; } + + public static @Self Component addTo(@This Component child, Container parent) { + parent.addComponent(child); + return child; + } + + public static @Self Component addTo(@This Component child, Container parent, Object constraints) { + parent.addComponent(child, constraints); + return child; + } + + public static @Self Component withSize(@This Component component, Dimension size) { + component.size = size; + component.minimumSize = size; + component.maximumSize = size; + component.preferredSize = size; + return component; + } + + public static @Self Component minSize(@This Component component, Dimension minSize) { + component.minimumSize = minSize; + return component; + } + + public static @Self Component minSize(@This Component component, int minWidth, int minHeight) { + return component.minSize(new Dimension(minWidth, minHeight)); + } + + public static @Self Component maxSize(@This Component component, Dimension maximumSize) { + component.maximumSize = maximumSize; + return component; + } + + public static @Self Component maxSize(@This Component component, int maxWidth, int maxHeight) { + return component.maxSize(new Dimension(maxWidth, maxHeight)); + } + + public static @Self Component font(@This Component component, Font font) { + component.setFont(font); + return component; + } + + public static @Self Component focusable(@This Component component, boolean focusable) { + component.setFocusable(focusable); + return component; + } } diff --git a/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java b/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java index 4d1e6e92..ba02ec56 100644 --- a/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java +++ b/MultiSubDownloader/src/main/java/extensions/java/awt/Container/ContainerExt.java @@ -11,17 +11,17 @@ @Extension public class ContainerExt { - public static @Self Container addComponent(@This Container component, S child) { + public static @Self Container addComponent(@This Container component, Component child) { component.add(child); return component; } - public static @Self Container addComponent(@This Container component, S child, Object constraints) { + public static @Self Container addComponent(@This Container component, Component child, Object constraints) { component.add(child, constraints); return component; } - public static @Self Container addComponent(@This Container component, Object constraints, S child) { + public static @Self Container addComponent(@This Container component, Object constraints, Component child) { component.add(child, constraints); return component; } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java index d1120211..a1c2d9f1 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/AbstractButton/AbstractButtonExt.java @@ -1,6 +1,7 @@ package extensions.javax.swing.AbstractButton; import javax.swing.*; +import java.awt.*; import java.awt.event.ActionListener; import java.util.function.Consumer; @@ -14,25 +15,23 @@ @Extension public class AbstractButtonExt { - public static @Self AbstractButton withActionListener(@This AbstractButton abstractButton, ActionListener listener) { + public static @Self AbstractButton actionListener(@This AbstractButton abstractButton, ActionListener listener) { abstractButton.addActionListener(listener); return abstractButton; } - public static @Self AbstractButton withActionListener(@This AbstractButton abstractButton, Runnable listener) { - withActionListener(abstractButton, _ -> listener.run()); - return abstractButton; + public static @Self AbstractButton actionListener(@This AbstractButton abstractButton, Runnable listener) { + return abstractButton.actionListener(_ -> listener.run()); } - public static @Self AbstractButton withActionListenerSelf(@This AbstractButton abstractButton, - Consumer<@Self AbstractButton> selfConsumerListener) { - withActionListener(abstractButton, _ -> selfConsumerListener.accept(abstractButton)); - return abstractButton; + public static @Self AbstractButton actionListenerSelf(@This AbstractButton abstractButton, + Consumer selfConsumerListener) { + return abstractButton.actionListener(_ -> selfConsumerListener.accept(abstractButton)); } - public static @Self AbstractButton withSelectedListener(@This AbstractButton abstractButton, BooleanConsumer selectedConsumer) { - withActionListener(abstractButton, _ -> selectedConsumer.accept(abstractButton.isSelected())); - return abstractButton; + public static @Self AbstractButton selectedListener(@This AbstractButton abstractButton, + BooleanConsumer selectedConsumer) { + return abstractButton.actionListener(_ -> selectedConsumer.accept(abstractButton.isSelected())); } public static @Self AbstractButton actionCommand(@This AbstractButton abstractButton, String actionCommand) { @@ -40,8 +39,8 @@ public class AbstractButtonExt { return abstractButton; } - public static @Self AbstractButton withActionCommand(@This AbstractButton abstractButton, String actionCommand) { - abstractButton.getModel().setActionCommand(actionCommand); + public static @Self AbstractButton withMargin(@This AbstractButton abstractButton, Insets insets) { + abstractButton.setMargin(insets); return abstractButton; } } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java index e6b8d2d7..5ee05ff9 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java @@ -14,7 +14,8 @@ public class JCheckBoxExt { public static @Self JCheckBox addCheckedChangeListener(@This JCheckBox checkBox, BooleanConsumer... listeners) { - checkBox.addItemListener(e -> Arrays.stream(listeners).forEach(listener -> listener.accept(((JCheckBox) e.getSource()).isSelected()))); + checkBox.addItemListener(e -> Arrays.stream(listeners) + .forEach(listener -> listener.accept(((JCheckBox) e.getSource()).isSelected()))); return checkBox; } @@ -22,4 +23,9 @@ public class JCheckBoxExt { checkBox.setVisible(visible); return checkBox; } + + public static @Self JCheckBox selected(@This JCheckBox checkBox, boolean selected) { + checkBox.setSelected(selected); + return checkBox; + } } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java index 0c9ee756..7b41897c 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComponent/JComponentExt.java @@ -8,34 +8,46 @@ import manifold.ext.rt.api.Extension; import manifold.ext.rt.api.Self; import manifold.ext.rt.api.This; +import org.jetbrains.annotations.Nullable; @UtilityClass @Extension public class JComponentExt { - public static @Self JComponent withEnabled(@This JComponent component, boolean enabled) { + public static @Self JComponent enabled(@This JComponent component, boolean enabled) { component.setEnabled(enabled); return component; } - public static @Self JComponent withEnabled(@This JComponent component) { - withEnabled(component, true); - return component; + public static @Self JComponent enabled(@This JComponent component) { + return component.enabled(true); + } + + public static @Self JComponent disabled(@This JComponent component) { + return component.enabled(false); } - public static @Self JComponent withDisabled(@This JComponent component) { - withEnabled(component, false); + public static @Self JComponent toolTipText(@This JComponent component, String text) { + component.setToolTipText(text); return component; } - public static @Self JComponent addTo(@This JComponent child, S parent) { - parent.add(child); - return child; + public static @Self JComponent hidden(@This JComponent component) { + return component.visible(false); + } + + public static @Self JComponent visible(@This JComponent component) { + return component.visible(true); } - public static @Self JComponent addTo(@This JComponent child, S parent, Object constraints) { - parent.add(child, constraints); - return child; + public static @Self JComponent visible(@This JComponent component, boolean visible) { + component.setVisible(visible); + return component; + } + + public static @Self JComponent background(@This JComponent component, @Nullable Color background) { + component.background = background; + return component; } public static void setEnabledRecursive(@This JComponent component, boolean enabled) { diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java index aa5033f8..2e36b5de 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JScrollPane/JScrollPaneExt.java @@ -12,7 +12,7 @@ @Extension public class JScrollPaneExt { - public static @Self JScrollPane withViewPort(@This JScrollPane scrollPane, S view) { + public static @Self JScrollPane viewportView(@This JScrollPane scrollPane, Component view) { scrollPane.setViewportView(view); return scrollPane; } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JSlider/JSliderExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JSlider/JSliderExt.java index d114ed4c..edb2cf4f 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JSlider/JSliderExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JSlider/JSliderExt.java @@ -11,12 +11,12 @@ @Extension public class JSliderExt { - public static @Self JSlider withMinimum(@This JSlider slider, int minimum) { + public static @Self JSlider minimum(@This JSlider slider, int minimum) { slider.setMinimum(minimum); return slider; } - public static @Self JSlider withMaximum(@This JSlider slider, int maximum) { + public static @Self JSlider maximum(@This JSlider slider, int maximum) { slider.setMaximum(maximum); return slider; } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextArea/JTextAreaExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextArea/JTextAreaExt.java index 81c6c5f6..ddf74549 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextArea/JTextAreaExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextArea/JTextAreaExt.java @@ -11,8 +11,8 @@ @Extension public class JTextAreaExt { - public static @Self JTextArea autoscrolls(@This JTextArea textArea, boolean autoscrolls) { - textArea.setAutoscrolls(autoscrolls); + public static @Self JTextArea autoScrolls(@This JTextArea textArea, boolean autoScrolls) { + textArea.setAutoscrolls(autoScrolls); return textArea; } } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExt.java index 6f0744be..14e22efb 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JTextField/JTextFieldExt.java @@ -11,7 +11,7 @@ @Extension public class JTextFieldExt { - public static @Self JTextField withColumns(@This JTextField textField, int columns) { + public static @Self JTextField columns(@This JTextField textField, int columns) { textField.setColumns(columns); return textField; } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/text/JTextComponent/JTextComponentExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/text/JTextComponent/JTextComponentExt.java index 6053a6d1..7c0fc933 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/text/JTextComponent/JTextComponentExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/text/JTextComponent/JTextComponentExt.java @@ -15,4 +15,12 @@ public class JTextComponentExt { textComponent.setEditable(editable); return textComponent; } + + public static @Self JTextComponent editable(@This JTextComponent textComponent) { + return textComponent.editable(true); + } + + public static @Self JTextComponent notEditable(@This JTextComponent textComponent) { + return textComponent.editable(false); + } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java index ab2f6799..bc75aea9 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java @@ -57,7 +57,7 @@ protected P getInputPanel() { @Override protected Language getLanguage() { - return this.searchPanel.inputPanel.getSelectedLanguage(); + return this.searchPanel.inputPanel.selectedLanguage; } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java index 23dc9cc7..dc11f389 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java @@ -90,11 +90,11 @@ protected List createReleases() { Release release = switch (type) { case EPISODE -> TvRelease.builder() .name(name) - .season(getInputPanel().getSeason()) - .episode(getInputPanel().getEpisode()) - .quality(getInputPanel().getQuality()) + .season(inputPanel.season) + .episode(inputPanel.episode) + .quality(inputPanel.quality) .build(); - case MOVIE -> MovieRelease.builder().name(name).quality(getInputPanel().getQuality()).build(); + case MOVIE -> MovieRelease.builder().name(name).quality(inputPanel.quality).build(); default -> releaseFactory.createRelease(Path.of(name), userInteractionHandler); }; return release != null ? List.of(release) : List.of(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index 69aa7193..3e4735bc 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -258,7 +258,7 @@ private void initialize() { } { - btnAddCustomMapping.withActionListener(() -> { + btnAddCustomMapping.actionListener(() -> { int rowNbr = table.convertRowIndexToModel(table.getSelectedRow()); MappingTableModel model = (MappingTableModel) table.getModel(); @@ -299,8 +299,8 @@ private void initialize() { { new JButton(Messages.getString("App.Close")).defaultButtonFor(getRootPane()) - .withActionListener(() -> setVisible(false)) - .withActionCommand(Messages.getString("App.Close")) + .actionListener(() -> setVisible(false)) + .actionCommand(Messages.getString("App.Close")) .addTo(buttonPane, "skip"); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java index 50b87328..0c85cae2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java @@ -88,17 +88,18 @@ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eve new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)) .addTo(getContentPane(), BorderLayout.SOUTH) .addComponent(new JButton(Messages.getString("App.OK")).defaultButtonFor(getRootPane()) - .withActionListener(this::testAndSaveValues) + .actionListener(this::testAndSaveValues) .actionCommand(Messages.getString("App.OK"))) .addComponent( - new JButton(Messages.getString("App.Cancel")).withActionListener(() -> setVisible(false)) + new JButton(Messages.getString("App.Cancel")).actionListener(() -> setVisible(false)) .actionCommand("Cancel")); } } private void testAndSaveValues() { if (pnlGeneral.hasValidSettings() && pnlEpisodeLibrary.hasValidSettings() && - pnlMovieLibrary.hasValidSettings() && pnlOptions.hasValidSettings() && pnlSerieSources.hasValidSettings()) { + pnlMovieLibrary.hasValidSettings() && pnlOptions.hasValidSettings() && + pnlSerieSources.hasValidSettings()) { pnlGeneral.savePreferenceSettings(); pnlEpisodeLibrary.savePreferenceSettings(); pnlMovieLibrary.savePreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index 8ee62dce..c1cdbe11 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -37,8 +37,7 @@ public class RenameDialog extends MultiSubDialog implements PropertyChangeListener { - @Serial - private static final long serialVersionUID = 1L; + @Serial private static final long serialVersionUID = 1L; private final VideoLibraryPanel pnlLibrary; private final MyTextFieldPath txtFolder; @@ -54,11 +53,14 @@ public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String getContentPane().setLayout(new MigLayout("fill, nogrid", "[]", "[][]20:push[]")); TitlePanel.title(Messages.getString("PreferenceDialog.Settings")) - .padding(0).paddingLeft(20).fillContents(true).addTo(getContentPane(), "span, grow, wrap") + .padding(0) + .paddingLeft(20) + .fillContents(true) + .addTo(getContentPane(), "span, grow, wrap") .addComponent("shrink", new JLabel(Messages.getString("PreferenceDialog.Location"))) - .addComponent("grow", this.txtFolder = MyTextFieldPath.builder().requireValue().build().withColumns(20)) - .addComponent("shrink, wrap", new JButton(Messages.getString("App.Browse")) - .withActionListener(() -> MemoryFolderChooser.getInstance() + .addComponent("grow", this.txtFolder = MyTextFieldPath.builder().requireValue().build().columns(20)) + .addComponent("shrink, wrap", new JButton(Messages.getString("App.Browse")).actionListener( + () -> MemoryFolderChooser.getInstance() .selectDirectory(getContentPane(), Messages.getString("PreferenceDialog.SelectFolderForRenameReplace")) .ifPresent(txtFolder::setObject))) @@ -66,24 +68,21 @@ public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String this.chkRecursive = new JCheckBox(Messages.getString("RenameDialog.RecursiveSearch"))); if (videoType == VideoType.EPISODE) { - pnlLibrary = new EpisodeLibraryPanel(settings.episodeLibrarySettings, manager, true, userInteractionHandler) - .addTo(getContentPane(), "grow"); + pnlLibrary = new EpisodeLibraryPanel(settings.episodeLibrarySettings, manager, true, + userInteractionHandler).addTo(getContentPane(), "grow"); } else { - pnlLibrary = new MovieLibraryPanel(settings.movieLibrarySettings, manager, true, userInteractionHandler) - .addTo(getContentPane(), "grow"); + pnlLibrary = + new MovieLibraryPanel(settings.movieLibrarySettings, manager, true, userInteractionHandler).addTo( + getContentPane(), "grow"); } - new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)).addTo(getContentPane(), BorderLayout.SOUTH) - .addComponent( - new JButton(Messages.getString("RenameDialog.Rename")) - .defaultButtonFor(getRootPane()) - .withActionListener(() -> rename(videoType, settings, manager, userInteractionHandler)) - .withActionCommand("Rename")) - .addComponent( - new JButton(Messages.getString("App.Cancel")) - .withActionListener(() -> setVisible(false)) - .actionCommand("Cancel")); - + new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)) + .addTo(getContentPane(), BorderLayout.SOUTH) + .addComponent(new JButton(Messages.getString("RenameDialog.Rename")).defaultButtonFor(getRootPane()) + .actionListener(() -> rename(videoType, settings, manager, userInteractionHandler)) + .actionCommand("Rename")) + .addComponent(new JButton(Messages.getString("App.Cancel")).actionListener(() -> setVisible(false)) + .actionCommand("Cancel")); } private boolean hasValidSettings() { @@ -134,8 +133,8 @@ private static class TypedRenameWorker extends SwingWorker impleme private final RenameAction renameAction; @set ReleaseFactory releaseFactory; - public TypedRenameWorker(Path dir, LibrarySettings librarySettings, VideoType videoType, - boolean isRecursive, Manager manager, UserInteractionHandler userInteractionHandler) { + public TypedRenameWorker(Path dir, LibrarySettings librarySettings, VideoType videoType, boolean isRecursive, + Manager manager, UserInteractionHandler userInteractionHandler) { this.userInteractionHandler = userInteractionHandler; this.extensions = Streams.concat(VideoPatterns.EXTENSIONS.stream(), Stream.of("srt")) .collect(Collectors.toUnmodifiableSet()); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java index aa8ff5cd..9763ee83 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java @@ -18,8 +18,7 @@ public class SelectDialog extends MultiSubDialog { - @Serial - private static final long serialVersionUID = -4092909537478305235L; + @Serial private static final long serialVersionUID = -4092909537478305235L; private final List subtitles; private final Release release; @@ -32,7 +31,8 @@ public class SelectDialog extends MultiSubDialog { */ public SelectDialog(JFrame frame, List subtitles, Release release) { super(frame, Messages.getString("SelectDialog.SelectCorrectSubtitle"), true); - this.subtitles = subtitles.stream().distinct().sorted(Comparator.comparing(Subtitle::getScore).reversed()).toList(); + this.subtitles = + subtitles.stream().distinct().sorted(Comparator.comparing(Subtitle::getScore).reversed()).toList(); this.release = release; initialize(); pack(); @@ -42,7 +42,8 @@ public SelectDialog(JFrame frame, List subtitles, Release release) { private void initialize() { getContentPane().setLayout(new MigLayout("", "[1000px:n,grow,fill]", "[][::100px,fill][grow]")); - JLabel lblNewLabel = new JLabel(Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease") + release.fileName); + JLabel lblNewLabel = + new JLabel(Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease") + release.fileName); getContentPane().add(lblNewLabel, "cell 0 0"); { JScrollPane scrollPane = new JScrollPane(); @@ -53,30 +54,20 @@ private void initialize() { buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, "cell 0 2,grow"); - new JButton(Messages.getString("App.OK")) - .defaultButtonFor(getRootPane()) - .withActionListener(() -> { - selectedSubtitleIdxs = getSelectedIdxs(); - setVisible(false); - }) - .withActionCommand(Messages.getString("App.OK")) - .addTo(buttonPane); - - new JButton(Messages.getString("SelectDialog.Everything")) - .withActionListener(() -> { - selectedSubtitleIdxs = IntStream.range(0, release.getMatchingSubs().size()).boxed().toList(); - setVisible(false); - }) - .withActionCommand(Messages.getString("App.All")) - .addTo(buttonPane); - - new JButton(Messages.getString("App.Cancel")) - .withActionListener(() -> { - selectedSubtitleIdxs = List.of(); - setVisible(false); - }) - .withActionCommand(Messages.getString("App.Cancel")) - .addTo(buttonPane); + new JButton(Messages.getString("App.OK")).defaultButtonFor(getRootPane()).actionListener(() -> { + selectedSubtitleIdxs = getSelectedIdxs(); + setVisible(false); + }).actionCommand(Messages.getString("App.OK")).addTo(buttonPane); + + new JButton(Messages.getString("SelectDialog.Everything")).actionListener(() -> { + selectedSubtitleIdxs = IntStream.range(0, release.getMatchingSubs().size()).boxed().toList(); + setVisible(false); + }).actionCommand(Messages.getString("App.All")).addTo(buttonPane); + + new JButton(Messages.getString("App.Cancel")).actionListener(() -> { + selectedSubtitleIdxs = List.of(); + setVisible(false); + }).actionCommand(Messages.getString("App.Cancel")).addTo(buttonPane); } } @@ -112,8 +103,10 @@ private CustomTable createCustomTable() { private List getSelectedIdxs() { return IntStream.range(0, customTable.getModel().getRowCount()) - .filter(i -> (boolean) customTable.getModel().getValueAt(i, customTable.getColumnIdByName(SubtitleTableColumnName.SELECT))) - .boxed().toList(); + .filter(i -> (boolean) customTable.getModel() + .getValueAt(i, customTable.getColumnIdByName(SubtitleTableColumnName.SELECT))) + .boxed() + .toList(); } public List getSelection() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index 5c92678e..b557cfe7 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -29,8 +29,7 @@ public class StructureBuilderDialog extends MultiSubDialog implements DocumentListener { - @Serial - private static final long serialVersionUID = -5174968778375028124L; + @Serial private static final long serialVersionUID = -5174968778375028124L; private final VideoType videoType; private final StructureType structureType; @@ -84,7 +83,7 @@ private void initializeUi() { } new JLabel(Messages.getString("StructureBuilderDialog.Structure")).addTo(panel); - this.txtStructure = new JTextField().withColumns(100).addTo(panel, "span, wrap"); + this.txtStructure = new JTextField().columns(100).addTo(panel, "span, wrap"); this.txtStructure.getDocument().addDocumentListener(this); new JLabel(Messages.getString("StructureBuilderDialog.Preview")).addTo(panel); @@ -92,33 +91,25 @@ private void initializeUi() { new JPanel(new FlowLayout(FlowLayout.RIGHT)).addTo(panel, BorderLayout.SOUTH) .addComponent( - new JButton(Messages.getString("App.OK")) - .defaultButtonFor(getRootPane()) - .withActionListener(_ -> { - setVisible(false); - dispose(); // this is needed to dispose the dialog and return the control to the - // window - }) - .withActionCommand("OK")) - .addComponent(new JButton(Messages.getString("App.Cancel")) - .withActionListener(_ -> { + new JButton(Messages.getString("App.OK")).defaultButtonFor(getRootPane()).actionListener(_ -> { setVisible(false); - txtStructure.setText(oldStructure); - dispose(); // this is needed to dispose the dialog and return the control to the window - }) - .withActionCommand("Cancel")); + dispose(); // this is needed to dispose the dialog and return the control to the + // window + }).actionCommand("OK")) + .addComponent(new JButton(Messages.getString("App.Cancel")).actionListener(_ -> { + setVisible(false); + txtStructure.setText(oldStructure); + dispose(); // this is needed to dispose the dialog and return the control to the window + }).actionCommand("Cancel")); } private void generateVideoFiles() { ReleaseFactory releaseFactory = new ReleaseFactory(new Settings(), manager); - if (videoType == VideoType.EPISODE) { - tvRelease = (TvRelease) releaseFactory.createRelease( - Path.of("Terra.Nova.S01E01E02.Genesis.720p.HDTV.x264-ORENJI.mkv"), - userInteractionHandler); - } else if (videoType == VideoType.MOVIE) { - movieRelease = - (MovieRelease) releaseFactory.createRelease(Path.of("Final.Destination.5.720p.Bluray.x264-TWiZTED"), - userInteractionHandler); + switch (videoType) { + case EPISODE -> tvRelease = (TvRelease) releaseFactory.createRelease( + Path.of("Terra.Nova.S01E01E02.Genesis.720p.HDTV.x264-ORENJI.mkv"), userInteractionHandler); + case MOVIE -> movieRelease = (MovieRelease) releaseFactory.createRelease( + Path.of("Final.Destination.5.720p.Bluray.x264-TWiZTED"), userInteractionHandler); } } @@ -127,10 +118,9 @@ private void buildLabelTable(StructureTag[] structureTags) { } private void addTag(StructureTag structureTag) { - new JLabel(structureTag.label) - .withToolTipText(structureTag.description) + new JLabel(structureTag.label).withToolTipText(structureTag.description) .addTo(tagPanel) - .withMouseListener(new InsertTag()); + .mouseListener(new InsertTag()); } public String showDialog(String structure) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java index 961af5d5..78a6b071 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java @@ -31,7 +31,7 @@ public SearchProgressDialog(GUI window, Cancelable searchAction) { this.window = window; this.completed = false; - initialize_ui(); + initializeUi(); setDialogLocation(window); repaint(); } @@ -76,7 +76,7 @@ public void onStatus(String message) { this.window.setStatusMessage(message); } - private void initialize_ui() { + private void initializeUi() { addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java index e3076f1f..b13cde38 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java @@ -1,6 +1,5 @@ package org.lodder.subtools.multisubdownloader.gui.extra.table; -import java.util.Arrays; import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -25,7 +24,7 @@ public enum SearchColumnName implements CustomColumnName { SCORE("SearchColumnName.Score", Integer.class, false); private static final Map MAP = - Arrays.stream(SearchColumnName.values()) + SearchColumnName.values().stream() .collect(Collectors.toMap(SearchColumnName::getColumnName, Function.identity())); @val @override String columnName; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java index cd3b1f28..81580641 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java @@ -16,7 +16,8 @@ public class LoggingPanel extends JPanel { private final JTextArea txtLogging; private final ch.qos.logback.classic.Logger ROOT = - (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); + (ch.qos.logback.classic.Logger) org.slf4j.LoggerFactory.getLogger( + ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); public LoggingPanel() { this.setLayout(new MigLayout("", "[698px,grow][]", "[][70px,grow]")); @@ -32,7 +33,7 @@ public LoggingPanel() { this.add(cbxLogLevel, "cell 1 0,alignx right"); this.add(scrollPane, "cell 0 1 2 1,grow"); - txtLogging = new JTextArea().autoscrolls(true).editable(false); + txtLogging = new JTextArea().autoScrolls(true).editable(false); scrollPane.setViewportView(txtLogging); new LogTextAppender(txtLogging); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java index 63bda2d6..cb3bd3ef 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java @@ -36,7 +36,7 @@ private void addComponentsToPanel() { } private void createComponents() { - txtIncomingPath = new JTextField().withColumns(20); + txtIncomingPath = new JTextField().columns(20); chkRecursive = new JCheckBox(Messages.getString("MainWindow.RecursiveSearch")); chkForceSubtitleOverwrite = new JCheckBox(Messages.getString("MainWindow.ignoreExistingSubtitles")); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java index 55975a56..ec765523 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java @@ -50,30 +50,30 @@ private void createComponents() { cbxVideoType = new MyComboBox<>(VideoSearchType.values()) .withToMessageStringRenderer(VideoSearchType::getMsgCode); - txtInputVideoName = new JTextField().withColumns(10); + txtInputVideoName = new JTextField().columns(10); - txtQualityVersion = new JTextField().withColumns(10); + txtQualityVersion = new JTextField().columns(10); - txtInputSeason = new JTextField().withColumns(10); + txtInputSeason = new JTextField().columns(10); - txtInputEpisode = new JTextField().withColumns(10); + txtInputEpisode = new JTextField().columns(10); } private void videoTypeChanged() { VideoSearchType videoTypeChoice = cbxVideoType.getSelectedItem(); if (VideoSearchType.EPISODE == videoTypeChoice) { - txtInputSeason.editable(true).withEnabled(true); - txtInputEpisode.editable(true).withEnabled(true); + txtInputSeason.editable().enabled(); + txtInputEpisode.editable().enabled(); } else { - txtInputSeason.editable(false).withEnabled(false); - txtInputEpisode.editable(false).withEnabled(false); + txtInputSeason.notEditable().disabled(); + txtInputEpisode.notEditable().disabled(); } if (VideoSearchType.RELEASE == videoTypeChoice) { - txtQualityVersion.editable(false).withEnabled(false); - txtQualityVersion.editable(false).withEnabled(false); + txtQualityVersion.notEditable().disabled(); + txtQualityVersion.notEditable().disabled(); } else { - txtQualityVersion.editable(true).withEnabled(true); - txtQualityVersion.editable(true).withEnabled(true); + txtQualityVersion.editable().enabled(); + txtQualityVersion.editable().enabled(); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java index d8916ea4..c90a1419 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java @@ -31,14 +31,14 @@ public DefaultSelectionPanel(SettingsControl settingsCtrl) { unusedPatternsTable = ScrollTable.create(Messages.getString("PreferenceDialog.DefaultSelectionUnused"), Source.class) .add(this, "spany 2"); - new ArrowButton(SwingConstants.EAST, 1, 10).withActionListener(this::addPattern).addTo(this); + new ArrowButton(SwingConstants.EAST, 1, 10).actionListener(this::addPattern).addTo(this); usedPatternsTable = ScrollTable.create(Messages.getString("PreferenceDialog.DefaultSelectionUsed"), Source.class) .add(this, "spany 2"); - new ArrowButton(SwingConstants.NORTH, 1, 10).withActionListener(this::moveRuleRowUp).addTo(this, "wrap"); + new ArrowButton(SwingConstants.NORTH, 1, 10).actionListener(this::moveRuleRowUp).addTo(this, "wrap"); - new ArrowButton(SwingConstants.WEST, 1, 10).withActionListener(this::removePattern).addTo(this, "skip"); - new ArrowButton(SwingConstants.SOUTH, 1, 10).withActionListener(this::moveRuleRowDown).addTo(this, "skip"); + new ArrowButton(SwingConstants.WEST, 1, 10).actionListener(this::removePattern).addTo(this, "skip"); + new ArrowButton(SwingConstants.SOUTH, 1, 10).actionListener(this::moveRuleRowDown).addTo(this, "skip"); loadPreferenceSettings(); } @@ -65,7 +65,7 @@ public ScrollTable(String header, Collection items) { private ScrollTable(String header, Stream items) { this.table = new JTable(new DefaultTableModel(new String[]{ header }, 1)); - this.scrollPane = new JScrollPane().withViewPort(table); + this.scrollPane = new JScrollPane().viewportView(table); this.model = (DefaultTableModel) table.getModel(); model.removeRow(0); if (items != null) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index 13795d1f..8e2582a1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -67,7 +67,7 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { JListWithImages.createForType(Path.class).distinctValues().build()); new JButton(Messages.getString("PreferenceDialog.AddFolder")) - .withActionListener( + .actionListener( () -> MemoryFolderChooser.getInstance() .selectDirectory(settingsPanel, Messages.getString("PreferenceDialog.SelectFolder")) @@ -79,7 +79,7 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { .addTo(settingsPanel, "span, split 2"); new JButton(Messages.getString("PreferenceDialog.DeleteFolder")) - .withActionListener(defaultIncomingFoldersList::removeSelectedItem) + .actionListener(defaultIncomingFoldersList::removeSelectedItem) .addTo(settingsPanel, "wrap, gapbottom 10px"); } { @@ -87,7 +87,7 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { "aligny center, span 1 2"); new JScrollPane().addTo(settingsPanel, "growx, span, wrap") - .withViewPort(this.excludeList = + .viewportView(this.excludeList = JListWithImages.createForType(PathOrRegex.class).distinctValues().build()); Consumer addExcludeItemConsumer = type -> { @@ -107,15 +107,15 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { }; new JButton(Messages.getString("PreferenceDialog.AddFolder")) - .withActionListener(() -> addExcludeItemConsumer.accept(PathMatchType.FOLDER)) + .actionListener(() -> addExcludeItemConsumer.accept(PathMatchType.FOLDER)) .addTo(settingsPanel, "span, split 3"); new JButton(Messages.getString("PreferenceDialog.DeleteFolder")) - .withActionListener(excludeList::removeSelectedItem) + .actionListener(excludeList::removeSelectedItem) .addTo(settingsPanel); new JButton(Messages.getString("PreferenceDialog.RegexToevoegen")) - .withActionListener(() -> addExcludeItemConsumer.accept(PathMatchType.REGEX)) + .actionListener(() -> addExcludeItemConsumer.accept(PathMatchType.REGEX)) .addTo(settingsPanel); } } @@ -145,10 +145,10 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { .panelOnSameLine().panelLayout(new MigLayout("insets 0, fill")).leftGap(0).addTo(proxyPanel) .addComponent(new JLabel(Messages.getString("PreferenceDialog.Hostname"))) .addComponent("wrap", - this.txtProxyHost = MyTextFieldString.builder().requireValue().build().withColumns(30)) + this.txtProxyHost = MyTextFieldString.builder().requireValue().build().columns(30)) .addComponent(new JLabel(Messages.getString("PreferenceDialog.Port"))) .addComponent( - this.txtProxyPort = MyTextFieldInteger.builder().requireValue().build().withColumns(5)); + this.txtProxyPort = MyTextFieldInteger.builder().requireValue().build().columns(5)); } loadPreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index e395c85d..3b77cc43 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -42,7 +42,7 @@ public OptionsPanel(SettingsControl settingsCtrl) { .checkbox(this.chkMinScoreSelection = new JCheckBox(Messages.getString("PreferenceDialog.MinAutomaticScoreSelection"))) .panelOnSameLine().build() - .addComponent(this.sldMinScoreSelection = new JSlider().withMinimum(0).withMaximum(100), + .addComponent(this.sldMinScoreSelection = new JSlider().minimum(0).maximum(100), "wrap")) .addComponent("wrap, grow", PanelCheckBox .checkbox(this.chkDefaultSelection = diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index 856e8038..6bfcda3a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -59,10 +59,10 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { .panelLayout(new MigLayout("insets 0, novisualpadding")).build() .addComponent(new JLabel(Messages.getString("PreferenceDialog.Username"))) .addComponent("wrap", this.txtAddic7edUsername = - MyTextFieldString.builder().requireValue().build().withColumns(20)) + MyTextFieldString.builder().requireValue().build().columns(20)) .addComponent(new JLabel(Messages.getString("PreferenceDialog.Password"))) .addComponent(this.txtAddic7edPassword = - MyPasswordField.builder().requireValue().build().withColumns(20))); + MyPasswordField.builder().requireValue().build().columns(20))); // TV SUBTITLES this.chkSourceTvSubtitles = new JCheckBox("Tv Subtitles").addTo(titelPanel, "wrap"); @@ -79,10 +79,10 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { .panelLayout(new MigLayout("insets 0, novisualpadding")).build() .addComponent(new JLabel(Messages.getString("PreferenceDialog.Username"))) .addComponent("wrap", txtOpenSubtitlesUsername = - MyTextFieldString.builder().requireValue().build().withColumns(20)) + MyTextFieldString.builder().requireValue().build().columns(20)) .addComponent(new JLabel(Messages.getString("PreferenceDialog.Password"))) .addComponent(txtOpenSubtitlesPassword = - MyPasswordField.builder().requireValue().build().withColumns(20))); + MyPasswordField.builder().requireValue().build().columns(20))); // SUBSCENE this.chkSourceSubscene = new JCheckBox("Subscene").addTo(titelPanel, "wrap"); @@ -90,15 +90,15 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { // LOCAL this.chkSourceLocal = new JCheckBox(Messages.getString("PreferenceDialog.Local")); JScrollPane scrLocalSources = - new JScrollPane().withViewPort(this.localSourcesFoldersList = + new JScrollPane().viewportView(this.localSourcesFoldersList = JListWithImages.createForType(Path.class).distinctValues().build()); JButton btnBrowseLocalSources = new JButton(Messages.getString("PreferenceDialog.AddFolder")) - .withActionListener(() -> MemoryFolderChooser.getInstance() + .actionListener(() -> MemoryFolderChooser.getInstance() .selectDirectory(this, Messages.getString("PreferenceDialog.SelectFolder")) .map(Path::toAbsolutePath).filter(not(localSourcesFoldersList::contains)) .ifPresent(path -> localSourcesFoldersList.addItem(PathMatchType.FOLDER.getImage(), path))); JButton btnRemoveLocalSources = new JButton(Messages.getString("PreferenceDialog.DeleteFolder")) - .withActionListener(localSourcesFoldersList::removeSelectedItem); + .actionListener(localSourcesFoldersList::removeSelectedItem); PanelCheckBox.checkbox(chkSourceLocal).panelOnNewLine().addTo(titelPanel) .addComponent("aligny top, gapy 5px", @@ -158,8 +158,8 @@ private boolean hasValidSettingsOpenSubtitles() { return false; } if (chkUserOpenSubtitlesLogin.isSelected() && - !OpenSubtitlesApi.isValidCredentials(txtOpenSubtitlesUsername.getText(), - new String(txtOpenSubtitlesPassword.getPassword()))) { + !OpenSubtitlesApi.isValidCredentials(txtOpenSubtitlesUsername.getText(), + new String(txtOpenSubtitlesPassword.getPassword()))) { txtOpenSubtitlesUsername.setErrorBorder(); txtOpenSubtitlesPassword.setErrorBorder(); return false; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index bd796ef6..7ae6b69f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -30,8 +30,7 @@ public class StructureFilePanel extends JPanel { - @Serial - private static final long serialVersionUID = -5458593307643063563L; + @Serial private static final long serialVersionUID = -5458593307643063563L; private final LibrarySettings librarySettings; private final MyTextFieldString txtFileStructure; @@ -47,39 +46,43 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, this.librarySettings = librarySettings; JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.RenameFiles")) - .margin(0).padding(0).marginLeft(20).paddingLeft(20).addTo(this, "span, grow"); + .margin(0) + .padding(0) + .marginLeft(20) + .paddingLeft(20) + .addTo(this, "span, grow"); { new JLabel(Messages.getString("PreferenceDialog.Structure")).addTo(titlePanel, "shrink"); this.txtFileStructure = - MyTextFieldString.builder().requireValue().build().withColumns(20).addTo(titlePanel, "grow"); - new JButton(Messages.getString("StructureBuilderDialog.Structure")) - .withActionListener(() -> { - StructureBuilderDialog sDialog = - new StructureBuilderDialog(null, - Messages.getString("PreferenceDialog.StructureBuilderTitle"), true, videoType, - StructureBuilderDialog.StructureType.FILE, manager, userInteractionHandler, - getLibraryStructureBuilder()); - String value = sDialog.showDialog(txtFileStructure.getText()); - if (!value.isEmpty()) { - txtFileStructure.setText(value); - } - - }) - .addTo(titlePanel, "shrink, wrap"); + MyTextFieldString.builder().requireValue().build().columns(20).addTo(titlePanel, "grow"); + new JButton(Messages.getString("StructureBuilderDialog.Structure")).actionListener(() -> { + StructureBuilderDialog sDialog = + new StructureBuilderDialog(null, Messages.getString("PreferenceDialog.StructureBuilderTitle"), + true, videoType, StructureBuilderDialog.StructureType.FILE, manager, + userInteractionHandler, getLibraryStructureBuilder()); + String value = sDialog.showDialog(txtFileStructure.getText()); + if (!value.isEmpty()) { + txtFileStructure.setText(value); + } + + }).addTo(titlePanel, "shrink, wrap"); this.chkReplaceSpace = new JCheckBox(Messages.getString("PreferenceDialog.ReplaceSpaceWith")); - PanelCheckBox.checkbox(chkReplaceSpace).panelOnSameLine().addTo(titlePanel, "wrap") + PanelCheckBox.checkbox(chkReplaceSpace) + .panelOnSameLine() + .addTo(titlePanel, "wrap") .addComponent("width pref+10px, wrap", this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); this.chkIncludeLanguageCode = - new JCheckBox(Messages.getString("PreferenceDialog.IncludeLanguageInFileName")) - .withSelectedListener(languageMapping::refreshState).addTo(titlePanel, "wrap"); + new JCheckBox(Messages.getString("PreferenceDialog.IncludeLanguageInFileName")).selectedListener( + languageMapping::refreshState).addTo(titlePanel, "wrap"); JPanel languagePanelRoot = PanelCheckBox.checkbox(chkIncludeLanguageCode) - .panelOnNewLine().panelLayout(new MigLayout("insets 0, novisualpadding", "[][][]")) + .panelOnNewLine() + .panelLayout(new MigLayout("insets 0, novisualpadding", "[][][]")) .addTo(titlePanel, "span, growx"); { JPanel languagePanel = new JPanel(new MigLayout("insets 0, novisualpadding", "[][][][20px]")); @@ -97,9 +100,9 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, new MyComboBox<>(Language.values()).withToMessageStringRenderer(Language::getMsgCode) .addTo(languagePanel); MyTextFieldString txtLanguage = - MyTextFieldString.builder().build().withColumns(20).addTo(languagePanel); - JButton btnDelete = new JButton(Messages.getString("StructureFilePanel.Delete")) - .withActionListenerSelf(delBtn -> { + MyTextFieldString.builder().build().columns(20).addTo(languagePanel); + JButton btnDelete = + new JButton(Messages.getString("StructureFilePanel.Delete")).actionListenerSelf(delBtn -> { languagePanel.remove(cmbLanguage); languagePanel.remove(txtLanguage); languagePanel.remove(delBtn); @@ -107,8 +110,7 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, languageScrollPane.setVisible(!languageMapping.isEmpty()); languagePanelRoot.repaint(); languagePanelRoot.revalidate(); - }) - .addTo(languagePanel, "wrap"); + }).addTo(languagePanel, "wrap"); LanguageComponents languageComponents = new LanguageComponents(cmbLanguage, txtLanguage, btnDelete); languageMapping.put(id, languageComponents); @@ -117,8 +119,8 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, languagePanelRoot.revalidate(); return languageComponents; }; - new JButton(Messages.getString("StructureFilePanel.AddLanguage")) - .withActionListener(addLanguageSupplier::get).addTo(languagePanelRoot); + new JButton(Messages.getString("StructureFilePanel.AddLanguage")).actionListener( + addLanguageSupplier::get).addTo(languagePanelRoot); } } @@ -212,10 +214,9 @@ private void updateBorder(Language lang) { } public boolean hasValidSettings() { - return languageComponentsMap.values().stream().allMatch(LanguageComponents::hasValidValue) - && languageComponentsMap.values().stream().map(LanguageComponents::getLanguage).distinct().count() == - languageComponentsMap - .size(); + return languageComponentsMap.values().stream().allMatch(LanguageComponents::hasValidValue) && + languageComponentsMap.values().stream().map(LanguageComponents::getLanguage).distinct().count() == + languageComponentsMap.size(); } private Stream getLanguageComponentsForLanguageStream(Language language) { @@ -227,10 +228,10 @@ public Optional getLanguageComponentsForLanguage(Language la } public Map toSettingsMap() { - return languageComponentsMap.values().stream().collect(Collectors.toMap( - langComps -> langComps.cmbLanguage().getSelectedItem(), - langComps -> langComps.txtLanguage().getText(), - (v1, v2) -> v1, LinkedHashMap::new)); + return languageComponentsMap.values() + .stream() + .collect(Collectors.toMap(langComps -> langComps.cmbLanguage().getSelectedItem(), + langComps -> langComps.txtLanguage().getText(), (v1, v2) -> v1, LinkedHashMap::new)); } public void refreshState(boolean enabled) { @@ -256,8 +257,7 @@ public boolean isEmpty() { } public boolean hasValidSettings() { - return !isVisible() - || (txtFileStructure.hasValidValue() - && (!chkIncludeLanguageCode.isSelected() || languageMapping.hasValidSettings())); + return !isVisible() || (txtFileStructure.hasValidValue() && + (!chkIncludeLanguageCode.isSelected() || languageMapping.hasValidSettings())); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index b611efe9..6b0f6a78 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -43,9 +43,9 @@ public StructureFolderPanel(LibrarySettings librarySettings, VideoType videoType { new JLabel(Messages.getString("PreferenceDialog.Location")).addTo(titlePanel, "shrink"); this.txtLibraryFolder = - MyTextFieldPath.builder().requireValue().build().withColumns(20).addTo(titlePanel, "grow"); + MyTextFieldPath.builder().requireValue().build().columns(20).addTo(titlePanel, "grow"); new JButton(Messages.getString("App.Browse")) - .withActionListener(() -> MemoryFolderChooser.getInstance() + .actionListener(() -> MemoryFolderChooser.getInstance() .selectDirectory(getRootPane(), Messages.getString("PreferenceDialog.LibraryFolder")) .ifPresent(txtLibraryFolder::setObject)) .addTo(titlePanel, "shrink, wrap"); @@ -54,11 +54,11 @@ public StructureFolderPanel(LibrarySettings librarySettings, VideoType videoType this.txtFolderStructure = MyTextFieldString.builder() .requireValue() .build() - .withColumns(20) - .withDisabled() + .columns(20) + .disabled() .addTo(titlePanel, "grow"); JButton btnStructure = new JButton(Messages.getString("StructureBuilderDialog.Structure")) - .withActionListener(() -> { + .actionListener(() -> { StructureBuilderDialog sDialog = new StructureBuilderDialog(null, Messages.getString("PreferenceDialog.StructureBuilderTitle"), true, videoType, StructureBuilderDialog.StructureType.FOLDER, manager, @@ -69,7 +69,7 @@ public StructureFolderPanel(LibrarySettings librarySettings, VideoType videoType } }) - .withDisabled() + .disabled() .addTo(titlePanel, "shrink, wrap"); this.chkRemoveEmptyFolder = new JCheckBox(Messages.getString("PreferenceDialog.RemoveEmptyFolders")) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java index 5670f2d4..439ff614 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java @@ -31,16 +31,16 @@ public SubtitleBackupPanel(LibrarySettings librarySettings) { .addTo(this, "span, growx"); { - this.txtBackupSubtitlePath = MyTextFieldPath.builder().requireValue().build().withColumns(20); + this.txtBackupSubtitlePath = MyTextFieldPath.builder().requireValue().build().columns(20); PanelCheckBox.checkbox( this.chkBackupSubtitle = new JCheckBox(Messages.getString("PreferenceDialog" + - ".BackupSubtitles"))) + ".BackupSubtitles"))) .panelOnNewLine() .addTo(titelPanel, "span, wrap, growx") .addComponent("split 3, shrink", new JLabel(Messages.getString("PreferenceDialog.Location"))) .addComponent("growx", txtBackupSubtitlePath) - .addComponent("shrink", new JButton(Messages.getString("App.Browse")).withActionListener( + .addComponent("shrink", new JButton(Messages.getString("App.Browse")).actionListener( l -> MemoryFolderChooser.getInstance() .selectDirectory(this, Messages.getString("PreferenceDialog.SubtitleBackupFolder")) .ifPresent(txtBackupSubtitlePath::setObject))); From 533941adcc976052eee647d3e696aaa95a6010ec Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 21:14:12 +0100 Subject: [PATCH 32/54] changes --- .../subtools/multisubdownloader/GUI.java | 4 +- .../extra/table/SubtitleTableColumnName.java | 2 +- .../jcomponent/jpopupmenu/MyPopupMenu.java | 14 +--- .../gui/panels/preference/GeneralPanel.java | 12 +-- .../gui/panels/preference/OptionsPanel.java | 82 +++++++++++-------- .../preference/SerieProvidersPanel.java | 14 ++-- .../preference/SubtitleBackupPanel.java | 6 +- .../model/structure/FolderStructureTag.java | 2 +- .../model/structure/SerieStructureTag.java | 2 +- .../src/main/resources/messages.properties | 6 +- .../src/main/resources/messages_nl.properties | 16 ++-- 11 files changed, 87 insertions(+), 73 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index fc57cd94..242c381a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -362,8 +362,8 @@ private void initPopupMenu() { final CustomTable t = (CustomTable) popupMenu.getInvoker(); final DefaultTableModel model = (DefaultTableModel) t.getModel(); - int col = t.columnAtPoint(popupMenu.getClickLocation()); - int row = t.rowAtPoint(popupMenu.getClickLocation()); + int col = t.columnAtPoint(popupMenu.clickLocation); + int row = t.rowAtPoint(popupMenu.clickLocation); try { StringSelection selection = new StringSelection((String) model.getValueAt(row, col)); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java index 292f83fb..68e7f26b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java @@ -14,7 +14,7 @@ public enum SubtitleTableColumnName implements CustomColumnName { FILENAME("SubtitleTableColumnName.Filename", String.class, false, Subtitle::getFileName), SOURCE("SubtitleTableColumnName.Source", String.class, false, Subtitle::getSubtitleSource), UPLOADER("SubtitleTableColumnName.Uploader", String.class, false, Subtitle::getUploader), - HEARINGIMPAIRED("SubtitleTableColumnName.hearingimpaired", Boolean.class, false, Subtitle::isHearingImpaired), + HEARINGIMPAIRED("SubtitleTableColumnName.hearingImpaired", Boolean.class, false, Subtitle::isHearingImpaired), QUALITY("SubtitleTableColumnName.Quality", String.class, false, Subtitle::getQuality), RELEASEGROUP("SubtitleTableColumnName.Releasegroup", String.class, false, Subtitle::getReleaseGroup); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jpopupmenu/MyPopupMenu.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jpopupmenu/MyPopupMenu.java index ed5a3f98..84bcbaab 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jpopupmenu/MyPopupMenu.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jpopupmenu/MyPopupMenu.java @@ -4,24 +4,18 @@ import java.awt.*; import java.io.Serial; +import manifold.ext.props.rt.api.var; + public class MyPopupMenu extends JPopupMenu { @Serial private static final long serialVersionUID = 1084650376633196066L; - private Point clickLocation; + @var Point clickLocation; @Override public void show(Component invoker, int x, int y) { super.show(invoker, x, y); - setClickLocation(new Point(x, y)); - } - - public void setClickLocation(Point clickLocation) { - this.clickLocation = clickLocation; - } - - public Point getClickLocation() { - return clickLocation; + clickLocation = new Point(x, y); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index 8e2582a1..7f56c837 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -62,9 +62,10 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { new JLabel(Messages.getString("PreferenceDialog.DefaultIncomingFolder")).addTo(settingsPanel, "aligny center, span 1 2"); - new JScrollPane().addTo(settingsPanel, "growx, span, wrap") - .setViewportView(this.defaultIncomingFoldersList = - JListWithImages.createForType(Path.class).distinctValues().build()); + new JScrollPane() + .viewportView(this.defaultIncomingFoldersList = + JListWithImages.createForType(Path.class).distinctValues().build()) + .addTo(settingsPanel, "growx, span, wrap"); new JButton(Messages.getString("PreferenceDialog.AddFolder")) .actionListener( @@ -86,9 +87,10 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { new JLabel(Messages.getString("PreferenceDialog.ExcludeList")).addTo(settingsPanel, "aligny center, span 1 2"); - new JScrollPane().addTo(settingsPanel, "growx, span, wrap") + new JScrollPane() .viewportView(this.excludeList = - JListWithImages.createForType(PathOrRegex.class).distinctValues().build()); + JListWithImages.createForType(PathOrRegex.class).distinctValues().build()) + .addTo(settingsPanel, "growx, span, wrap"); Consumer addExcludeItemConsumer = type -> { if (type == PathMatchType.FOLDER) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index 3b77cc43..0bcc0248 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.io.Serial; @@ -13,8 +15,7 @@ public class OptionsPanel extends JPanel implements PreferencePanelIntf { - @Serial - private static final long serialVersionUID = -5458593307643063563L; + @Serial private static final long serialVersionUID = -5458593307643063563L; private final SettingsControl settingsCtrl; private final JCheckBox chkAlwaysConfirm; @@ -34,46 +35,63 @@ public OptionsPanel(SettingsControl settingsCtrl) { super(new MigLayout("insets 0, fill, nogrid")); this.settingsCtrl = settingsCtrl; - TitlePanel.title(Messages.getString("PreferenceDialog.DownloadOptions")) - .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow, wrap") + TitlePanel.title(getString("PreferenceDialog.DownloadOptions")) + .marginBottom(0) + .padding(0) + .paddingLeft(20) + .addTo(this, "span, grow, wrap") .addComponent(this.chkAlwaysConfirm = new JCheckBox(Messages.getString("PreferenceDialog.CheckBeforeDownloading")), "wrap") - .addComponent("wrap, grow", PanelCheckBox - .checkbox(this.chkMinScoreSelection = - new JCheckBox(Messages.getString("PreferenceDialog.MinAutomaticScoreSelection"))) - .panelOnSameLine().build() - .addComponent(this.sldMinScoreSelection = new JSlider().minimum(0).maximum(100), - "wrap")) - .addComponent("wrap, grow", PanelCheckBox - .checkbox(this.chkDefaultSelection = - new JCheckBox(Messages.getString("PreferenceDialog.DefaultSelection"), null, true)) - .panelOnNewLine().build() - .addComponent(this.pnlDefaultSelection = new DefaultSelectionPanel(settingsCtrl))); - - TitlePanel.title(Messages.getString("PreferenceDialog.SearchFilter")) - .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow, wrap") - .addComponent(this.chkSubtitleExactMethod = - new JCheckBox(Messages.getString("PreferenceDialog.SearchFilterExact")), "wrap") + .addComponent("wrap, grow", // + PanelCheckBox.checkbox(this.chkMinScoreSelection = + new JCheckBox(getString("PreferenceDialog.MinAutomaticScoreSelection"))) + .panelOnSameLine() + .build() + .addComponent(this.sldMinScoreSelection = new JSlider().minimum(0).maximum(100), + "wrap")) + .addComponent("wrap, grow",// + PanelCheckBox.checkbox(this.chkDefaultSelection = + new JCheckBox(getString("PreferenceDialog.DefaultSelection"), null, true)) + .panelOnNewLine() + .build() + .addComponent(this.pnlDefaultSelection = new DefaultSelectionPanel(settingsCtrl))); + + TitlePanel.title(getString("PreferenceDialog.SearchFilter")) + .marginBottom(0) + .padding(0) + .paddingLeft(20) + .addTo(this, "span, grow, wrap") + .addComponent( + this.chkSubtitleExactMethod = new JCheckBox(getString("PreferenceDialog.SearchFilterExact")), + "wrap") .addComponent(this.chkSubtitleKeywordMethod = - new JCheckBox(Messages.getString("PreferenceDialog.SearchFilterKeyword")), "wrap") + new JCheckBox(getString("PreferenceDialog.SearchFilterKeyword")), "wrap") .addComponent(this.chkExcludeHearingImpaired = - new JCheckBox(Messages.getString("PreferenceDialog.ExcludeHearingImpaired"))); + new JCheckBox(getString("PreferenceDialog.ExcludeHearingImpaired"))); - TitlePanel.title(Messages.getString("PreferenceDialog.TableOptions")) - .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow, wrap") - .addComponent(this.chkOnlyFound = new JCheckBox(Messages.getString("PreferenceDialog.ShowOnlyFound"))); + TitlePanel.title(getString("PreferenceDialog.TableOptions")) + .marginBottom(0) + .padding(0) + .paddingLeft(20) + .addTo(this, "span, grow, wrap") + .addComponent(this.chkOnlyFound = new JCheckBox(getString("PreferenceDialog.ShowOnlyFound"))); - TitlePanel.title(Messages.getString("PreferenceDialog.ErrorHandlingOption")) - .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow, wrap") - .addComponent(this.chkStopOnSearchError = - new JCheckBox(Messages.getString("PreferenceDialog.StopAfterError"))); + TitlePanel.title(getString("PreferenceDialog.ErrorHandlingOption")) + .marginBottom(0) + .padding(0) + .paddingLeft(20) + .addTo(this, "span, grow, wrap") + .addComponent(this.chkStopOnSearchError = new JCheckBox(getString("PreferenceDialog.StopAfterError"))); - TitlePanel.title(Messages.getString("PreferenceDialog.SerieDatabaseSource")) - .marginBottom(0).padding(0).paddingLeft(20).addTo(this, "span, grow") + TitlePanel.title(getString("PreferenceDialog.SerieDatabaseSource")) + .marginBottom(0) + .padding(0) + .paddingLeft(20) + .addTo(this, "span, grow") .addComponent(this.cbxEpisodeProcessSource = MyComboBox.ofValues(SettingsProcessEpisodeSource.values()), "wrap") .addComponent(this.chkConfirmProviderMapping = - new JCheckBox(Messages.getString("PreferenceDialog.ConfirmProviderMapping"))); + new JCheckBox(getString("PreferenceDialog.ConfirmProviderMapping"))); loadPreferenceSettings(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index 6bfcda3a..8ae04aa3 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -44,7 +44,7 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { super(new MigLayout("insets 0, fill, nogrid")); this.settingsCtrl = settingsCtrl; - JPanel titelPanel = TitlePanel.title(Messages.getString("PreferenceDialog.SelectPreferredSources")) + JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.SelectPreferredSources")) .addTo(this, "span, grow"); { @@ -53,7 +53,7 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { this.chkUserAddic7edLogin = new JCheckBox(Messages.getString("PreferenceDialog.UseAddic7edLogin")); this.chkSourceAddic7edProxy = new JCheckBox(Messages.getString("PreferenceDialog.Proxy")); - PanelCheckBox.checkbox(chkSourceAddic7ed).panelOnNewLine().addTo(titelPanel, "wrap") + PanelCheckBox.checkbox(chkSourceAddic7ed).panelOnNewLine().addTo(titlePanel, "wrap") .addComponent("wrap", chkSourceAddic7edProxy) .addComponent(PanelCheckBox.checkbox(chkUserAddic7edLogin).panelOnNewLine() .panelLayout(new MigLayout("insets 0, novisualpadding")).build() @@ -65,16 +65,16 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { MyPasswordField.builder().requireValue().build().columns(20))); // TV SUBTITLES - this.chkSourceTvSubtitles = new JCheckBox("Tv Subtitles").addTo(titelPanel, "wrap"); + this.chkSourceTvSubtitles = new JCheckBox("Tv Subtitles").addTo(titlePanel, "wrap"); // PODNAPISI - this.chkSourcePodnapisi = new JCheckBox("Podnapisi").addTo(titelPanel, "wrap"); + this.chkSourcePodnapisi = new JCheckBox("Podnapisi").addTo(titlePanel, "wrap"); // OPENSUBTITLES this.chkSourceOpenSubtitles = new JCheckBox("OpenSubtitles"); this.chkUserOpenSubtitlesLogin = new JCheckBox(Messages.getString("PreferenceDialog.UseOpenSubtitlesLogin")); - PanelCheckBox.checkbox(chkSourceOpenSubtitles).panelOnNewLine().addTo(titelPanel, "wrap") + PanelCheckBox.checkbox(chkSourceOpenSubtitles).panelOnNewLine().addTo(titlePanel, "wrap") .addComponent(PanelCheckBox.checkbox(chkUserOpenSubtitlesLogin).panelOnNewLine() .panelLayout(new MigLayout("insets 0, novisualpadding")).build() .addComponent(new JLabel(Messages.getString("PreferenceDialog.Username"))) @@ -85,7 +85,7 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { MyPasswordField.builder().requireValue().build().columns(20))); // SUBSCENE - this.chkSourceSubscene = new JCheckBox("Subscene").addTo(titelPanel, "wrap"); + this.chkSourceSubscene = new JCheckBox("Subscene").addTo(titlePanel, "wrap"); // LOCAL this.chkSourceLocal = new JCheckBox(Messages.getString("PreferenceDialog.Local")); @@ -100,7 +100,7 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { JButton btnRemoveLocalSources = new JButton(Messages.getString("PreferenceDialog.DeleteFolder")) .actionListener(localSourcesFoldersList::removeSelectedItem); - PanelCheckBox.checkbox(chkSourceLocal).panelOnNewLine().addTo(titelPanel) + PanelCheckBox.checkbox(chkSourceLocal).panelOnNewLine().addTo(titlePanel) .addComponent("aligny top, gapy 5px", new JLabel(Messages.getString("PreferenceDialog.LocalFolderWithSubtitles"))) .addComponent("wrap", new JPanel(new MigLayout("insets 0", "[grow, nogrid]")).addComponent("split", diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java index 439ff614..954d4493 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java @@ -24,7 +24,7 @@ public SubtitleBackupPanel(LibrarySettings librarySettings) { super(new MigLayout("insets 0, fillx, nogrid")); this.librarySettings = librarySettings; - JPanel titelPanel = TitlePanel.title(Messages.getString("PreferenceDialog.SubtitlesBackup")) + JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.SubtitlesBackup")) .margin(0) .padding(0) .paddingLeft(20) @@ -37,7 +37,7 @@ public SubtitleBackupPanel(LibrarySettings librarySettings) { this.chkBackupSubtitle = new JCheckBox(Messages.getString("PreferenceDialog" + ".BackupSubtitles"))) .panelOnNewLine() - .addTo(titelPanel, "span, wrap, growx") + .addTo(titlePanel, "span, wrap, growx") .addComponent("split 3, shrink", new JLabel(Messages.getString("PreferenceDialog.Location"))) .addComponent("growx", txtBackupSubtitlePath) .addComponent("shrink", new JButton(Messages.getString("App.Browse")).actionListener( @@ -46,7 +46,7 @@ public SubtitleBackupPanel(LibrarySettings librarySettings) { .ifPresent(txtBackupSubtitlePath::setObject))); chkBackupUseSourceFileName = - new JCheckBox(Messages.getString("PreferenceDialog.IncludeSourceInFileName")).addTo(titelPanel); + new JCheckBox(Messages.getString("PreferenceDialog.IncludeSourceInFileName")).addTo(titlePanel); } loadPreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java index e8dc63ae..f633c0f1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java @@ -9,7 +9,7 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum FolderStructureTag implements StructureTag { - SEPARATOR("%SEPARATOR%", Messages.getString("StructureBuilderDialog.SystemdependendSeparator")); + SEPARATOR("%SEPARATOR%", Messages.getString("StructureBuilderDialog.SystemDependentSeparator")); @val @override String label; @val @override String description; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java index e4d49d16..96b341e1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java @@ -9,7 +9,7 @@ public enum SerieStructureTag implements StructureTag { SHOW_NAME("%SHOW NAME%", "StructureBuilderDialog.NameTvShow"), TITLE("%TITLE%", "StructureBuilderDialog.EpisodeTitle"), EPISODE_LONG("%EE%", "StructureBuilderDialog.NumberOfEpisodeLeadingZero"), - EPISODES_LONG("%EEX%", "StructureBuilderDialog.NumberOfEpisodeLeadingZeroForMultipe"), + EPISODES_LONG("%EEX%", "StructureBuilderDialog.NumberOfEpisodeLeadingZeroForMultiple"), EPISODE_SHORT("%E%", "StructureBuilderDialog.NumberOfEpisodeWithoutLeadingZero"), EPISODES_SHORT("%EX%", "StructureBuilderDialog.NumberOfEpisodeLeadingZeroMultiple"), SEASON_LONG("%SS%", "StructureBuilderDialog.NumberOfSeasonLeading"), diff --git a/SubLibrary/src/main/resources/messages.properties b/SubLibrary/src/main/resources/messages.properties index 6aae81c3..b7abeda4 100644 --- a/SubLibrary/src/main/resources/messages.properties +++ b/SubLibrary/src/main/resources/messages.properties @@ -291,7 +291,7 @@ StructureBuilderDialog.MovieName=Movie name StructureBuilderDialog.MovieYear=Movie year StructureBuilderDialog.NameTvShow=Serie StructureBuilderDialog.NumberOfEpisodeLeadingZero=Number of episode (with 0). -StructureBuilderDialog.NumberOfEpisodeLeadingZeroForMultipe=Number of episode (with 0) for multiple episodes +StructureBuilderDialog.NumberOfEpisodeLeadingZeroForMultiple=Number of episode (with 0) for multiple episodes StructureBuilderDialog.NumberOfEpisodeLeadingZeroMultiple=Number of episode (without 0) for multiple episodes StructureBuilderDialog.NumberOfEpisodeWithoutLeadingZero=Number of episode (without 0). StructureBuilderDialog.NumberOfSeasonLeading=Number of season (with 0). @@ -300,11 +300,11 @@ StructureBuilderDialog.Preview=Preview StructureBuilderDialog.QualityOfMovie=Quality of the movie file , eg . HDTV 720p. StructureBuilderDialog.QualityOfRelease=Quality of the movie file , eg . HDTV 720p. StructureBuilderDialog.Structure=Structure -StructureBuilderDialog.SystemdependendSeparator=System independent separation for new directory , eg \\. +StructureBuilderDialog.SystemDependentSeparator=System independent separation for new directory , eg \\. StructureFilePanel.AddLanguage=Add new language StructureFilePanel.Delete=Delete SubtitleTableColumnName.Filename=Filename -SubtitleTableColumnName.hearingimpaired=hearing Impaired +SubtitleTableColumnName.hearingImpaired=hearing Impaired SubtitleTableColumnName.Quality=Quality SubtitleTableColumnName.Releasegroup=Release Group SubtitleTableColumnName.Score=Score % diff --git a/SubLibrary/src/main/resources/messages_nl.properties b/SubLibrary/src/main/resources/messages_nl.properties index 246ac73b..18a5e8a4 100644 --- a/SubLibrary/src/main/resources/messages_nl.properties +++ b/SubLibrary/src/main/resources/messages_nl.properties @@ -79,7 +79,7 @@ App.OptionDryRun=Gebruik maken van dry run om enkel de beschikbare ondertitels w App.OptionHelpMsg=Dit bericht tonen App.OptionNoGuiMsg=uitvoeren in CLI modus App.OptionOptionDebugMsg=Logging beschikbaar maken -App.OptionOptionDownloadAllMsg=Download alle gevonden ondertitels gebruik makend van '-v1' systeem +App.OptionOptionDownloadAllMsg=Download alle gevonden ondertitels gebruikmakend van '-v1' systeem App.OptionOptionFolderMsg=Zoek in map App.OptionOptionForceMsg=Overschrijf reeds bestaande ondertitels App.OptionOptionImportPreferencesMsg=Importeer voorkeuren @@ -164,7 +164,7 @@ Menu.Path=Bestand Menu.Preferences=Voorkeuren Menu.RenameMovie=Films Hernoemen Menu.RenameSerie=Series Hernoemen -Menu.SearchResults=Zoek Resulaten +Menu.SearchResults=Zoek Resultaten Menu.SerieNames=Serie Namen Menu.Title=Titel Menu.Type=Type @@ -196,7 +196,7 @@ PreferenceDialog.IncludeLanguageInFileName=Taal in bestandsnaam van ondertitel p PreferenceDialog.IncludeSourceInFileName=Bron in bestandsnaam van ondertitel plaatsen PreferenceDialog.invalidInput=Ongeldige invoer gedetecteerd. Gelieve dit te verbeteren alvorens verder te gaan. PreferenceDialog.Language=Taal -PreferenceDialog.LibraryFolder=Bibiliotheek map +PreferenceDialog.LibraryFolder=Bibliotheek map PreferenceDialog.Local=Lokaal PreferenceDialog.LocalFolderWithSubtitles=Lokale mappen met ondertitels PreferenceDialog.Location=Locatie @@ -204,7 +204,7 @@ PreferenceDialog.MinAutomaticScoreSelection=Minimale score nodig voor automatisc PreferenceDialog.MoveToLibrary=Verplaats naar bibliotheek PreferenceDialog.MovieLibrary=Film Bibliotheek PreferenceDialog.Name=MultiSubDownloader -PreferenceDialog.NewUpdateCheck=Update contole frequentie +PreferenceDialog.NewUpdateCheck=Update controle frequentie PreferenceDialog.OpenSubtitlesLogin=OpenSubtitles login PreferenceDialog.Options=Opties PreferenceDialog.Password=Wachtwoord @@ -247,7 +247,7 @@ Prompter.EnterImdbIdForSerie=Voer de juiste IMDB id in voor serie [%s] Prompter.SelectAddic7edMatchForSerie=Selecteer de juiste Addic7ed match voor serie [%s] Prompter.SelectImdbMatchForSerie=Selecteer de juiste IMDB match voor serie [%s] Prompter.SelectTvdbMatchForSerie=Selecteer de juiste tvdb match voor serie [%s] -Prompter.SpecialValue.SkipForever=-- Niet meer zoeken -- +Prompter.SpecialValue.SkipForever=-- Niet meer zoeken -- Prompter.SpecialValue.SkipOneWeek=-- Zoeken een week overslaan -- Prompter.SpecialValue.SkipTwoWeek=-- Zoeken twee weken overslaan -- Prompter.ValueIsNotValid=De ingevoerde waarde is niet geldig, probeer opnieuw @@ -291,7 +291,7 @@ StructureBuilderDialog.MovieName=Naam van de film. StructureBuilderDialog.MovieYear=Jaar waarin de film is uitgekomen. StructureBuilderDialog.NameTvShow=Naam van de tv serie. StructureBuilderDialog.NumberOfEpisodeLeadingZero=Nummer van de aflevering (met 0). -StructureBuilderDialog.NumberOfEpisodeLeadingZeroForMultipe=Nummer van de aflevering (met 0) voor multi episode. +StructureBuilderDialog.NumberOfEpisodeLeadingZeroForMultiple=Nummer van de aflevering (met 0) voor multi episode. StructureBuilderDialog.NumberOfEpisodeLeadingZeroMultiple=Nummer van de aflevering (zonder 0) voor multi episode. StructureBuilderDialog.NumberOfEpisodeWithoutLeadingZero=Nummer van de aflevering (zonder 0). StructureBuilderDialog.NumberOfSeasonLeading=Nummer van het seizoen (met 0). @@ -300,11 +300,11 @@ StructureBuilderDialog.Preview=Voorbeeld StructureBuilderDialog.QualityOfMovie=Kwaliteit van het filmbestand, bijv. BluRay 720p. StructureBuilderDialog.QualityOfRelease=Kwaliteit van het filmbestand, bijv. HDTV 720p. StructureBuilderDialog.Structure=Structuur -StructureBuilderDialog.SystemdependendSeparator=Systeemonafhankelijk scheidingsteken voor nieuwe directory, bijv. \\. +StructureBuilderDialog.SystemDependentSeparator=Systeemonafhankelijk scheidingsteken voor nieuwe directory, bijv. \\. StructureFilePanel.AddLanguage=Voeg nieuwe taal toe StructureFilePanel.Delete=Verwijder SubtitleTableColumnName.Filename=Bestandsnaam -SubtitleTableColumnName.hearingimpaired=Slechthorend +SubtitleTableColumnName.hearingImpaired=Slechthorend SubtitleTableColumnName.Quality=Kwaliteit SubtitleTableColumnName.Releasegroup=Release groep SubtitleTableColumnName.Score=Score % From 0323fff989a8f43fdb61c5dd37af732e6a3a4a12 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 21:43:52 +0100 Subject: [PATCH 33/54] changes --- .../subtools/multisubdownloader/App.java | 2 +- .../subtools/multisubdownloader/CLI.java | 4 +- .../subtools/multisubdownloader/GUI.java | 30 +-- .../UpdateAvailableGithub.java | 29 +-- .../UserInteractionHandlerCLI.java | 4 +- .../actions/SearchAction.java | 4 +- .../multisubdownloader/cli/CliOption.java | 2 +- .../cli/actions/CliSearchAction.java | 2 +- .../subtools/multisubdownloader/gui/Menu.java | 54 ++--- .../multisubdownloader/gui/Splash.java | 5 +- .../gui/ToStringListCellRenderer.java | 14 +- .../actions/search/FileGuiSearchAction.java | 2 +- .../actions/search/TextGuiSearchAction.java | 2 +- .../gui/dialog/MappingEpisodeNameDialog.java | 28 +-- .../gui/dialog/PreferenceDialog.java | 22 +-- .../gui/dialog/ProgressDialog.java | 4 +- .../gui/dialog/RenameDialog.java | 20 +- .../gui/dialog/SelectDialog.java | 16 +- .../gui/dialog/StructureBuilderDialog.java | 10 +- .../progress/search/SearchProgressDialog.java | 4 +- .../search/SearchProgressTableModel.java | 6 +- .../gui/extra/table/SearchColumnName.java | 2 +- .../extra/table/SubtitleTableColumnName.java | 2 +- .../gui/panels/InputPanel.java | 2 +- .../gui/panels/LoggingPanel.java | 5 +- .../gui/panels/ResultPanel.java | 15 +- .../gui/panels/SearchFileInputPanel.java | 13 +- .../gui/panels/SearchTextInputPanel.java | 15 +- .../preference/DefaultSelectionPanel.java | 7 +- .../gui/panels/preference/GeneralPanel.java | 184 +++++++++--------- .../gui/panels/preference/OptionsPanel.java | 41 ++-- .../preference/SerieProvidersPanel.java | 38 ++-- .../panels/preference/StructureFilePanel.java | 141 +++++++------- .../preference/StructureFolderPanel.java | 84 ++++---- .../gui/panels/preference/StructurePanel.java | 4 +- .../preference/SubtitleBackupPanel.java | 27 ++- .../panels/preference/VideoLibraryPanel.java | 26 ++- .../gui/workers/DownloadWorker.java | 9 +- .../gui/workers/RenameWorker.java | 27 +-- .../library/LibraryOtherFileActionType.java | 2 +- .../model/structure/FolderStructureTag.java | 2 +- .../model/structure/MovieStructureTag.java | 8 +- .../model/structure/SerieStructureTag.java | 2 +- .../subtitleproviders/adapters/Adapter.java | 4 +- .../adapters/JSubsceneAdapter.java | 2 +- .../multisubdownloader/util/ExportImport.java | 24 +-- .../subtools/multisubdownloader/Messages.java | 4 +- .../sublibrary/data/imdb/ImdbAdapter.java | 6 +- .../sublibrary/data/tvdb/TheTvdbAdapter.java | 2 +- .../subtools/sublibrary/gui/InputPane.java | 11 +- .../util/prompter/PrompterBuilderCommon.java | 21 +- 51 files changed, 497 insertions(+), 497 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java index d9dd4101..5f2e5ee2 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java @@ -158,7 +158,7 @@ public static Options getCLIOptions() { private static Manager createManager(boolean useGui) { if (splash != null) { - splash.setProgressMsg(Messages.getString("App.Starting")); + splash.setProgressMsg(Messages.getText("App.Starting")); } DiskCache diskCache = SerializableDiskCache.cacheBuilder().keyType(String.class).valueType(Serializable.class) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 97ce2c9d..8cba032d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -63,7 +63,7 @@ public CLI(SettingsControl settingControl, Container app) { private void checkUpdate(Manager manager) { UpdateAvailableGithub u = new UpdateAvailableGithub(manager, settings); if (u.shouldCheckForNewUpdate(settings.updateCheckPeriod) && u.isNewVersionAvailable()) { - System.out.println(Messages.getString("UpdateAppAvailable") + ": " + u.getLatestDownloadUrl()); + System.out.println(Messages.getText("UpdateAppAvailable") + ": " + u.getLatestDownloadUrl()); } } @@ -160,7 +160,7 @@ private Language getLanguage(CommandLine line) throws CliException { return Arrays.stream(Language.values()) .filter(lang -> lang.name().equalsIgnoreCase(languageString)) .findAny() - .orElseThrow(() -> new CliException(Messages.getString("App.NoValidLanguage"))); + .orElseThrow(() -> new CliException(Messages.getText("App.NoValidLanguage"))); } else { return Language.ENGLISH; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index 242c381a..5d9b129b 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -124,7 +124,7 @@ private void checkUpdate(final boolean forceUpdateCheck) { editorPane.setContentType("text/html"); editorPane.setText( - "" + Messages.getString("UpdateAppAvailable") + "!:
" + + "" + Messages.getText("UpdateAppAvailable") + "!:
" + updateUrl.get() + ""); editorPane.addHyperlinkListener(hyperlinkEvent -> { @@ -140,7 +140,7 @@ private void checkUpdate(final boolean forceUpdateCheck) { JOptionPane.showMessageDialog(this, editorPane, ConfigProperties.getInstance().getProperty("name"), JOptionPane.INFORMATION_MESSAGE); } else if (forceUpdateCheck) { - JOptionPane.showMessageDialog(this, Messages.getString("MainWindow.NoUpdateAvailable"), + JOptionPane.showMessageDialog(this, Messages.getText("MainWindow.NoUpdateAvailable"), ConfigProperties.getInstance().getProperty("name"), JOptionPane.INFORMATION_MESSAGE); } @@ -175,10 +175,10 @@ public void windowClosing(WindowEvent e) { getContentPane().add(tabbedPane, gbcTabbedPane); createFileSearchPanel(); - tabbedPane.addTab(Messages.getString("MainWindow.SearchOnFile"), null, pnlSearchFile, null); + tabbedPane.addTab(Messages.getText("MainWindow.SearchOnFile"), null, pnlSearchFile, null); createTextSearchPanel(); - tabbedPane.addTab(Messages.getString("MainWindow.SearchOnName"), null, pnlSearchText, null); + tabbedPane.addTab(Messages.getText("MainWindow.SearchOnName"), null, pnlSearchText, null); pnlLogging = new LoggingPanel(); final GridBagConstraints gbcPnlLogging = new GridBagConstraints(); @@ -227,9 +227,9 @@ private void createMenu() { }) .withViewClearLogAction(() -> pnlLogging.setLogText("")) .withEditRenameTVAction( - () -> showRenameDialog.accept(VideoType.EPISODE, Messages.getString("Menu.RenameSerie"))) + () -> showRenameDialog.accept(VideoType.EPISODE, Messages.getText("Menu.RenameSerie"))) .withEditRenameMovieAction( - () -> showRenameDialog.accept(VideoType.MOVIE, Messages.getString("Menu.RenameMovie"))) + () -> showRenameDialog.accept(VideoType.MOVIE, Messages.getText("Menu.RenameMovie"))) .withEditPreferencesAction( () -> new PreferenceDialog(self(), settingsControl, (Emitter) app.make("EventEmitter"), manager, userInteractionHandler).setVisible(true)) @@ -301,8 +301,8 @@ private void createFileSearchPanel() { resultPanel.setDownloadAction(_ -> download()); resultPanel.setMoveAction(_ -> { final int response = - JOptionPane.showConfirmDialog(self(), Messages.getString("MainWindow.OnlyMoveToLibraryStructure"), - Messages.getString("App.Confirm"), //$NON-NLS-2$ + JOptionPane.showConfirmDialog(self(), Messages.getText("MainWindow.OnlyMoveToLibraryStructure"), + Messages.getText("App.Confirm"), //$NON-NLS-2$ JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (response == JOptionPane.YES_OPTION) { rename(); @@ -357,7 +357,7 @@ private void restoreScreenSettings() { private void initPopupMenu() { popupMenu = new MyPopupMenu(); - JMenuItem menuItem = new JMenuItem(Messages.getString("App.Copy")); + JMenuItem menuItem = new JMenuItem(Messages.getText("App.Copy")); menuItem.addActionListener(_ -> { final CustomTable t = (CustomTable) popupMenu.getInvoker(); final DefaultTableModel model = (DefaultTableModel) t.getModel(); @@ -392,9 +392,9 @@ protected void showTranslateShowNames() { } private void showAbout() { - String version = ConfigProperties.getInstance().getProperty(Messages.getString("MainWindow.Version")); + String version = ConfigProperties.getInstance().getProperty(Messages.getText("MainWindow.Version")); StringBuilder sb = new StringBuilder(); - sb.append(Messages.getString("MainWindow.CurrentVersion")).append(": ").append(version); + sb.append(Messages.getText("MainWindow.CurrentVersion")).append(": ").append(version); if (version.contains("-SNAPSHOT")) { sb.append(" (%s)".formatted(PropertiesReader.getProperty("build.timestamp"))); } @@ -427,7 +427,7 @@ private void download() { private void downloadText() { MemoryFolderChooser.getInstance() - .selectDirectory(getContentPane(), Messages.getString("MainWindow.SelectFolder")) + .selectDirectory(getContentPane(), Messages.getText("MainWindow.SelectFolder")) .ifPresent(path -> { CustomTable subtitleTable = pnlSearchText.resultPanel.getTable(); final VideoTableModel model = (VideoTableModel) subtitleTable.getModel(); @@ -477,7 +477,7 @@ public void showErrorMessage(String message) { private void selectIncomingFolder() { MemoryFolderChooser.getInstance() - .selectDirectory(self(), Messages.getString("MainWindow.SelectFolder")) + .selectDirectory(self(), Messages.getText("MainWindow.SelectFolder")) .map(Path::toAbsolutePath) .map(Path::toString) .ifPresent(pnlSearchFileInput::setIncomingPath); @@ -492,7 +492,7 @@ public void propertyChange(PropertyChangeEvent event) { } else { final int progress = downloadWorker.getProgress(); progressDialog.updateProgress(progress); - StatusMessenger.instance.message(Messages.getString("MainWindow.StatusDownload")); + StatusMessenger.instance.message(Messages.getText("MainWindow.StatusDownload")); } } else if (event.getSource() instanceof RenameWorker renameWorker) { if (renameWorker.isDone()) { @@ -501,7 +501,7 @@ public void propertyChange(PropertyChangeEvent event) { } else { final int progress = renameWorker.getProgress(); progressDialog.updateProgress(progress); - StatusMessenger.instance.message(Messages.getString("MainWindow.StatusRename")); + StatusMessenger.instance.message(Messages.getText("MainWindow.StatusRename")); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java index 3842d575..d0f4aaf5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java @@ -75,7 +75,8 @@ private Optional getUrlLatestNewStableGithubRelease() { .userAgent(null) .cacheType(CacheType.NONE) .getAsJsoupDocument() - .selectFirst("#repo-content-turbo-frame .box a[href='" + REPO_URI + "/releases/latest']"); + .selectFirst( + "#repo-content-turbo-frame .box a[href='" + REPO_URI + "/releases/latest']"); Pattern versionPattern = Pattern.compile("[0-9]*\\.[0-9]\\.[0-9]"); String versionText = element.parent().selectFirst("a").text(); Matcher matcher = versionPattern.matcher(versionText); @@ -94,7 +95,7 @@ private Optional getUrlLatestNewStableGithubRelease() { updateLastUpdateCheck(); return Optional.of(url); } catch (Exception e) { - LOGGER.error(Messages.getString("LoggingPanel.UpdateCheckFailed")); + LOGGER.error(Messages.getText("LoggingPanel.UpdateCheckFailed")); return Optional.empty(); } }).getOptional(); @@ -108,23 +109,29 @@ private Optional getUrlLatestNewNightlyGithubRelease() { try { LocalDateTime buildTista = getBuildTista(); - Element rowElement = manager.getPageContentBuilder().url(REPO_URL + "/actions?query=branch%3Amaster") - .userAgent(null) - .cacheType(CacheType.MEMORY) - .getAsJsoupDocument() - .selectFirst("#partial-actions-workflow-runs .Box-row"); + Element rowElement = + manager.getPageContentBuilder().url(REPO_URL + "/actions?query=branch%3Amaster") + .userAgent(null) + .cacheType(CacheType.MEMORY) + .getAsJsoupDocument() + .selectFirst("#partial-actions-workflow-runs .Box-row"); LocalDateTime nightlyBuildTista = - zonedDateTimeStringToLocalDateTime(rowElement.selectFirst(".d-inline relative-time").attr("datetime")); + zonedDateTimeStringToLocalDateTime( + rowElement.selectFirst(".d-inline relative-time").attr("datetime")); if (nightlyBuildTista.isBefore(buildTista)) { return Optional.empty(); } String url = "https://nightly.link" + rowElement.selectFirst(".Link--primary").attr("href"); - String downloadUrl = manager.getPageContentBuilder().url(url).cacheType(CacheType.MEMORY).getAsJsoupDocument() - .selectFirst("table td a").attr("href"); + String downloadUrl = manager.getPageContentBuilder() + .url(url) + .cacheType(CacheType.MEMORY) + .getAsJsoupDocument() + .selectFirst("table td a") + .attr("href"); updateLastUpdateCheck(); return Optional.of(downloadUrl); } catch (Exception e) { - LOGGER.error(Messages.getString("LoggingPanel.UpdateCheckFailed")); + LOGGER.error(Messages.getText("LoggingPanel.UpdateCheckFailed")); return Optional.empty(); } }).getOptional(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java index 33e42a63..12a69101 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UserInteractionHandlerCLI.java @@ -43,12 +43,12 @@ public UserInteractionHandlerCLI(UserInteractionSettingsIntf settings) { @Override public List selectSubtitles(Release release) { - System.out.printf("\n%s : %s%n", Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease"), + System.out.printf("\n%s : %s%n", Messages.getText("SelectDialog.SelectCorrectSubtitleThisRelease"), release.fileName); return PrompterUtil .getElementsFromList(release.getMatchingSubs()) .displayAsTable(createTableDisplayer()) - .message(Messages.getString("SelectDialog.EnterListSelectedSubtitles")) + .message(Messages.getText("SelectDialog.EnterListSelectedSubtitles")) .sort(Comparator.comparing(Subtitle::getScore)) .includeNull() .prompt(prompter); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java index e6fe003d..f46510f1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/SearchAction.java @@ -63,7 +63,7 @@ private void search() throws ActionException { validate(); - setStatusMessage(Messages.getString("SearchAction.StatusIndexing")); + setStatusMessage(Messages.getText("SearchAction.StatusIndexing")); this.releases = createReleases(); @@ -100,7 +100,7 @@ private void search() throws ActionException { /* Tell the manager which releases to search. */ this.releases.forEach(searchManager::addRelease); - setStatusMessage(Messages.getString("SearchAction.StatusSearching")); + setStatusMessage(Messages.getText("SearchAction.StatusSearching")); /* Tell the manager to start searching */ this.searchManager.start(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java index 6f11dd77..897eb139 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/CliOption.java @@ -32,7 +32,7 @@ public enum CliOption { } public String getDescription() { - return Messages.getString(msgCode); + return Messages.getText(msgCode); } } \ No newline at end of file diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java index 798672fe..35df99ff 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/actions/CliSearchAction.java @@ -168,7 +168,7 @@ protected List createReleases() { LOGGER.debug("# Files found to process [{}] ", total); - System.out.println(Messages.getString("CliSearchAction.ParsingFoundFiles")); + System.out.println(Messages.getText("CliSearchAction.ParsingFoundFiles")); this.indexingProgressListener.progress(progress); List releases = new ArrayList<>(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java index 2e3d5b2f..db3b3d7f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Menu.java @@ -1,11 +1,11 @@ package org.lodder.subtools.multisubdownloader.gui; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.awt.event.ActionListener; import java.io.Serial; -import org.lodder.subtools.multisubdownloader.Messages; - public class Menu extends JMenuBar { @Serial @@ -43,31 +43,31 @@ public Menu() { } private void createComponents() { - mnFile = new JMenu(Messages.getString("Menu.Path")); - mntmQuit = new JMenuItem(Messages.getString("App.Close")); - mnView = new JMenu(Messages.getString("Menu.View")); - mnSearchResults = new JMenu(Messages.getString("Menu.SearchResults")); - chckbxmntmFileName = new JCheckBoxMenuItem(Messages.getString("Menu.Filename")); - chckbxmntmType = new JCheckBoxMenuItem(Messages.getString("Menu.Type")); - chckbxmntmTitle = new JCheckBoxMenuItem(Messages.getString("Menu.Title")); - chckbxmntmSeason = new JCheckBoxMenuItem(Messages.getString("App.Season")); - chckbxmntmEpisode = new JCheckBoxMenuItem(Messages.getString("App.Episode")); - chckbxmntmShowOnlyFound = new JCheckBoxMenuItem(Messages.getString("Menu.OnlyShowFound")); - mntmClearLog = new JMenuItem(Messages.getString("Menu.EraseLogging")); - mntmRenameSerieFiles = new JMenuItem(Messages.getString("Menu.RenameSerie")); - mntmRenameMovieFiles = new JMenuItem(Messages.getString("Menu.RenameMovie")); - mntmPreferences = new JMenuItem(Messages.getString("Menu.Preferences")); - mnSerieNames = new JMenu(Messages.getString("Menu.SerieNames")); - mntmTranslateShowNames = new JMenuItem(Messages.getString("Menu.MappingTvdbScene")); - mnImportExport = new JMenu(Messages.getString("Menu.ImportExport")); - mnEdit = new JMenu(Messages.getString("App.Edit")); - mnHelp = new JMenu(Messages.getString("Menu.Help")); - mntmExportTranslate = new JMenuItem(Messages.getString("Menu.ExportMappingTvdbScene")); - mntmImportTranslate = new JMenuItem(Messages.getString("Menu.ImportMappingTvdbScene")); - mntmExportPreferences = new JMenuItem(Messages.getString("Menu.ExportPreferences")); - mntmImportPreferences = new JMenuItem(Messages.getString("Menu.ImportPreferences")); - mntmAbout = new JMenuItem(Messages.getString("Menu.About")); - mntmCheckForUpdate = new JMenuItem(Messages.getString("Menu.CheckForUpdate")); + mnFile = new JMenu(getText("Menu.Path")); + mntmQuit = new JMenuItem(getText("App.Close")); + mnView = new JMenu(getText("Menu.View")); + mnSearchResults = new JMenu(getText("Menu.SearchResults")); + chckbxmntmFileName = new JCheckBoxMenuItem(getText("Menu.Filename")); + chckbxmntmType = new JCheckBoxMenuItem(getText("Menu.Type")); + chckbxmntmTitle = new JCheckBoxMenuItem(getText("Menu.Title")); + chckbxmntmSeason = new JCheckBoxMenuItem(getText("App.Season")); + chckbxmntmEpisode = new JCheckBoxMenuItem(getText("App.Episode")); + chckbxmntmShowOnlyFound = new JCheckBoxMenuItem(getText("Menu.OnlyShowFound")); + mntmClearLog = new JMenuItem(getText("Menu.EraseLogging")); + mntmRenameSerieFiles = new JMenuItem(getText("Menu.RenameSerie")); + mntmRenameMovieFiles = new JMenuItem(getText("Menu.RenameMovie")); + mntmPreferences = new JMenuItem(getText("Menu.Preferences")); + mnSerieNames = new JMenu(getText("Menu.SerieNames")); + mntmTranslateShowNames = new JMenuItem(getText("Menu.MappingTvdbScene")); + mnImportExport = new JMenu(getText("Menu.ImportExport")); + mnEdit = new JMenu(getText("App.Edit")); + mnHelp = new JMenu(getText("Menu.Help")); + mntmExportTranslate = new JMenuItem(getText("Menu.ExportMappingTvdbScene")); + mntmImportTranslate = new JMenuItem(getText("Menu.ImportMappingTvdbScene")); + mntmExportPreferences = new JMenuItem(getText("Menu.ExportPreferences")); + mntmImportPreferences = new JMenuItem(getText("Menu.ImportPreferences")); + mntmAbout = new JMenuItem(getText("Menu.About")); + mntmCheckForUpdate = new JMenuItem(getText("Menu.CheckForUpdate")); } private void addComponentsToMenu() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Splash.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Splash.java index 4f57000a..f8ce1043 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Splash.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/Splash.java @@ -1,11 +1,12 @@ package org.lodder.subtools.multisubdownloader.gui; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.awt.*; import java.io.Serial; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; public class Splash extends JWindow { @@ -21,7 +22,7 @@ public void initializeUi() { setBounds(100, 100, 501, 100); getContentPane().setLayout(new MigLayout("", "[][475px,center][]", "[][40px:n]")); - JLabel label = new JLabel(Messages.getString("Splash.starting")); + JLabel label = new JLabel(getText("Splash.starting")); getContentPane().add(label, "cell 1 0 2 1,alignx left"); progressBar = new JProgressBar(0, 100); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/ToStringListCellRenderer.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/ToStringListCellRenderer.java index 48ac1575..895f47d7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/ToStringListCellRenderer.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/ToStringListCellRenderer.java @@ -14,17 +14,21 @@ public final class ToStringListCellRenderer implements ListCellRenderer { private final ListCellRenderer originalRenderer; private final Function toStringMapper; - public static ToStringListCellRenderer of(ListCellRenderer originalRenderer, Function toStringMapper) { + public static ToStringListCellRenderer of(ListCellRenderer originalRenderer, + Function toStringMapper) { return new ToStringListCellRenderer<>(originalRenderer, toStringMapper); } - public static ToStringListCellRenderer ofMessage(ListCellRenderer originalRenderer, Function toStringMapper) { - return of(originalRenderer, item -> Messages.getString(toStringMapper.apply(item))); + public static ToStringListCellRenderer ofMessage(ListCellRenderer originalRenderer, + Function toStringMapper) { + return of(originalRenderer, item -> Messages.getText(toStringMapper.apply(item))); } @Override - public Component getListCellRendererComponent(JList list, T value, int index, boolean isSelected, boolean cellHasFocus) { - return originalRenderer.getListCellRendererComponent(list, toStringMapper.apply(value), index, isSelected, cellHasFocus); + public Component getListCellRendererComponent(JList list, T value, int index, boolean isSelected, + boolean cellHasFocus) { + return originalRenderer.getListCellRendererComponent(list, toStringMapper.apply(value), index, isSelected, + cellHasFocus); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java index 2568821c..2c9c186c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/FileGuiSearchAction.java @@ -79,7 +79,7 @@ private FileGuiSearchAction(Settings settings, SubtitleProviderStore subtitlePro protected void validate() throws SearchSetupException { String path = getInputPanel().getIncomingPath(); if ("".equals(path) && !this.settings.hasDefaultFolders()) { - throw new SearchSetupException(Messages.getString("App.NoFolderSelected")); + throw new SearchSetupException(Messages.getText("App.NoFolderSelected")); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java index dc11f389..4d2f15c1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java @@ -74,7 +74,7 @@ private TextGuiSearchAction(Settings settings, SubtitleProviderStore subtitlePro @Override protected void validate() throws SearchSetupException { if (getInputPanel().getReleaseName().isEmpty()) { - throw new SearchSetupException(Messages.getString("App.NoReleaseEntered")); + throw new SearchSetupException(Messages.getText("App.NoReleaseEntered")); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index 3e4735bc..88638673 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -49,11 +49,11 @@ public class MappingEpisodeNameDialog extends MultiSubDialog { */ public MappingEpisodeNameDialog(JFrame frame, final SettingsControl prefCtrl, Manager manager, SubtitleProviderStore subtitleProviderStore, UserInteractionHandlerGUI userInteractionHandler) { - super(frame, Messages.getString("MappingEpisodeNameDialog.Title"), true); + super(frame, Messages.getText("MappingEpisodeNameDialog.Title"), true); this.manager = manager; this.subtitleProviderStore = subtitleProviderStore; this.userInteractionHandler = userInteractionHandler; - this.btnAddCustomMapping = new JButton(Messages.getString("MappingEpisodeNameDialog.ChangeMapping")); + this.btnAddCustomMapping = new JButton(Messages.getText("MappingEpisodeNameDialog.ChangeMapping")); this.mappingTableModel = new MappingTableModel(manager); initialize(); } @@ -117,9 +117,9 @@ public String toString() { MappingType(String name, String providerName, SelectionForKeyPrefix... selectionForKeyPrefixList) { this.name = name; this.providerName = providerName; - this.nameColumn = Messages.getString("MappingEpisodeNameDialog.SceneShowName"); - this.mappingColumn = Messages.getString("MappingEpisodeNameDialog.ProviderId"); - this.providerNameColumn = Messages.getString("MappingEpisodeNameDialog.ProviderName"); + this.nameColumn = Messages.getText("MappingEpisodeNameDialog.SceneShowName"); + this.mappingColumn = Messages.getText("MappingEpisodeNameDialog.ProviderId"); + this.providerNameColumn = Messages.getText("MappingEpisodeNameDialog.ProviderName"); this.selectionForKeyPrefixList = selectionForKeyPrefixList; } } @@ -198,7 +198,7 @@ private void initialize() { JPanel selectionPane = new JPanel(); contentPanel.add(selectionPane); - JLabel lblDefaultIncomingFolder = new JLabel(Messages.getString("MappingEpisodeNameDialog.SelectProvider")); + JLabel lblDefaultIncomingFolder = new JLabel(Messages.getText("MappingEpisodeNameDialog.SelectProvider")); selectionPane.add(lblDefaultIncomingFolder); JComboBox mappingTypeList = new JComboBox<>(); @@ -238,7 +238,7 @@ private void initialize() { buttonPane.setLayout(new MigLayout("", "[25px][50px][grow][50px][grow][50px][25px]", "[][25px,grow,fill]")); { - JButton btnDeleteSelectedRow = new JButton(Messages.getString("MappingEpisodeNameDialog.DeleteRow")); + JButton btnDeleteSelectedRow = new JButton(Messages.getText("MappingEpisodeNameDialog.DeleteRow")); btnDeleteSelectedRow.addActionListener(_ -> { int rowNbr = table.convertRowIndexToModel(table.getSelectedRow()); MappingTableModel model = (MappingTableModel) table.getModel(); @@ -265,7 +265,7 @@ private void initialize() { Row row = (Row) model.getDataVector().get(rowNbr); String currentName = row.serieMapping.name; - String message = Messages.getString("MappingEpisodeNameDialog.enterNewNameForSerie", currentName); + String message = Messages.getText("MappingEpisodeNameDialog.enterNewNameForSerie", currentName); selectedSubtitleProvider.ifPresent( provider -> userInteractionHandler.enter(message, message).ifPresent(newName -> { TvRelease tvRelease = TvRelease.builder() @@ -285,12 +285,12 @@ private void initialize() { selectMappingType(selectedMappingType); table.getRowSorter().setSortKeys(sortKeys); }, () -> userInteractionHandler.message( - Messages.getString("MappingEpisodeNameDialog.NoResultsFoundForSerieName", - newName), Messages.getString("App.Info"))); + Messages.getText("MappingEpisodeNameDialog.NoResultsFoundForSerieName", + newName), Messages.getText("App.Info"))); } catch (Exception e) { userInteractionHandler.message( - Messages.getString("App.ErrorOccurred", e.getMessage()), - Messages.getString("App.Error")); + Messages.getText("App.ErrorOccurred", e.getMessage()), + Messages.getText("App.Error")); } })); }); @@ -298,9 +298,9 @@ private void initialize() { } { - new JButton(Messages.getString("App.Close")).defaultButtonFor(getRootPane()) + new JButton(Messages.getText("App.Close")).defaultButtonFor(getRootPane()) .actionListener(() -> setVisible(false)) - .actionCommand(Messages.getString("App.Close")) + .actionCommand(Messages.getText("App.Close")) .addTo(buttonPane, "skip"); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java index 0c85cae2..5aa95821 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java @@ -34,7 +34,7 @@ public class PreferenceDialog extends MultiSubDialog { public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eventEmitter, Manager manager, UserInteractionHandler userInteractionHandler) { - super(gui, Messages.getString("PreferenceDialog.Title"), true); + super(gui, Messages.getText("PreferenceDialog.Title"), true); this.settingsCtrl = settingsCtrl; this.eventEmitter = eventEmitter; @@ -56,7 +56,7 @@ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eve (PreferencePanelIntf) tabbedPane.getComponentAt(selectedIndex.get()); if (!sourcePanel.hasValidSettings()) { tabbedPane.setSelectedIndex(selectedIndex.get()); - JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), + JOptionPane.showMessageDialog(this, Messages.getText("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE); } else { selectedIndex.set(tabbedPane.getSelectedIndex()); @@ -66,32 +66,32 @@ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eve contentPanel.add(tabbedPane); this.pnlGeneral = new GeneralPanel(gui, settingsCtrl); - tabbedPane.addTab(Messages.getString("PreferenceDialog.TabGeneral"), null, pnlGeneral, null); + tabbedPane.addTab(Messages.getText("PreferenceDialog.TabGeneral"), null, pnlGeneral, null); this.pnlEpisodeLibrary = new EpisodeLibraryPanel(settingsCtrl.settings.episodeLibrarySettings, manager, false, userInteractionHandler); - tabbedPane.addTab(Messages.getString("PreferenceDialog.SerieLibrary"), null, pnlEpisodeLibrary, null); + tabbedPane.addTab(Messages.getText("PreferenceDialog.SerieLibrary"), null, pnlEpisodeLibrary, null); this.pnlMovieLibrary = new MovieLibraryPanel(settingsCtrl.settings.movieLibrarySettings, manager, false, userInteractionHandler); - tabbedPane.addTab(Messages.getString("PreferenceDialog.MovieLibrary"), null, pnlMovieLibrary, null); + tabbedPane.addTab(Messages.getText("PreferenceDialog.MovieLibrary"), null, pnlMovieLibrary, null); this.pnlOptions = new OptionsPanel(settingsCtrl); - tabbedPane.addTab(Messages.getString("PreferenceDialog.Options"), null, pnlOptions, null); + tabbedPane.addTab(Messages.getText("PreferenceDialog.Options"), null, pnlOptions, null); this.pnlSerieSources = new SerieProvidersPanel(settingsCtrl); - tabbedPane.addTab(Messages.getString("PreferenceDialog.SerieSources"), null, pnlSerieSources, null); + tabbedPane.addTab(Messages.getText("PreferenceDialog.SerieSources"), null, pnlSerieSources, null); } { new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)) .addTo(getContentPane(), BorderLayout.SOUTH) - .addComponent(new JButton(Messages.getString("App.OK")).defaultButtonFor(getRootPane()) + .addComponent(new JButton(Messages.getText("App.OK")).defaultButtonFor(getRootPane()) .actionListener(this::testAndSaveValues) - .actionCommand(Messages.getString("App.OK"))) + .actionCommand(Messages.getText("App.OK"))) .addComponent( - new JButton(Messages.getString("App.Cancel")).actionListener(() -> setVisible(false)) + new JButton(Messages.getText("App.Cancel")).actionListener(() -> setVisible(false)) .actionCommand("Cancel")); } } @@ -109,7 +109,7 @@ private void testAndSaveValues() { settingsCtrl.store(); this.eventEmitter.fire(new Event("providers.settings.change")); } else { - JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", + JOptionPane.showMessageDialog(this, Messages.getText("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java index 1c404fd3..db82034a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java @@ -20,7 +20,7 @@ public class ProgressDialog extends MultiSubDialog implements Messenger { private JLabel label; public ProgressDialog(JFrame frame, Cancelable sft) { - super(frame, Messages.getString("ProgressDialog.Title"), false); + super(frame, Messages.getText("ProgressDialog.Title"), false); worker = sft; StatusMessenger.instance.addListener(this); initializeUi(); @@ -29,7 +29,7 @@ public ProgressDialog(JFrame frame, Cancelable sft) { } public ProgressDialog(Cancelable sft) { - super(Messages.getString("ProgressDialog.Title"), false); + super(Messages.getText("ProgressDialog.Title"), false); worker = sft; StatusMessenger.instance.addListener(this); initializeUi(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java index c1cdbe11..d2ad1105 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java @@ -52,20 +52,20 @@ public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String setBounds(100, 100, 650, 680); getContentPane().setLayout(new MigLayout("fill, nogrid", "[]", "[][]20:push[]")); - TitlePanel.title(Messages.getString("PreferenceDialog.Settings")) + TitlePanel.title(Messages.getText("PreferenceDialog.Settings")) .padding(0) .paddingLeft(20) .fillContents(true) .addTo(getContentPane(), "span, grow, wrap") - .addComponent("shrink", new JLabel(Messages.getString("PreferenceDialog.Location"))) + .addComponent("shrink", new JLabel(Messages.getText("PreferenceDialog.Location"))) .addComponent("grow", this.txtFolder = MyTextFieldPath.builder().requireValue().build().columns(20)) - .addComponent("shrink, wrap", new JButton(Messages.getString("App.Browse")).actionListener( + .addComponent("shrink, wrap", new JButton(Messages.getText("App.Browse")).actionListener( () -> MemoryFolderChooser.getInstance() .selectDirectory(getContentPane(), - Messages.getString("PreferenceDialog.SelectFolderForRenameReplace")) + Messages.getText("PreferenceDialog.SelectFolderForRenameReplace")) .ifPresent(txtFolder::setObject))) .addComponent("wrap", - this.chkRecursive = new JCheckBox(Messages.getString("RenameDialog.RecursiveSearch"))); + this.chkRecursive = new JCheckBox(Messages.getText("RenameDialog.RecursiveSearch"))); if (videoType == VideoType.EPISODE) { pnlLibrary = new EpisodeLibraryPanel(settings.episodeLibrarySettings, manager, true, @@ -78,10 +78,10 @@ public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)) .addTo(getContentPane(), BorderLayout.SOUTH) - .addComponent(new JButton(Messages.getString("RenameDialog.Rename")).defaultButtonFor(getRootPane()) + .addComponent(new JButton(Messages.getText("RenameDialog.Rename")).defaultButtonFor(getRootPane()) .actionListener(() -> rename(videoType, settings, manager, userInteractionHandler)) .actionCommand("Rename")) - .addComponent(new JButton(Messages.getString("App.Cancel")).actionListener(() -> setVisible(false)) + .addComponent(new JButton(Messages.getText("App.Cancel")).actionListener(() -> setVisible(false)) .actionCommand("Cancel")); } @@ -93,7 +93,7 @@ private void rename(VideoType videoType, Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { if (!hasValidSettings()) { - JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", + JOptionPane.showMessageDialog(this, Messages.getText("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE); return; } @@ -117,7 +117,7 @@ public void propertyChange(PropertyChangeEvent event) { } else { final int progress = renameWorker.getProgress(); progressDialog.updateProgress(progress); - StatusMessenger.instance.message(Messages.getString("RenameDialog.StatusRename")); + StatusMessenger.instance.message(Messages.getText("RenameDialog.StatusRename")); } } } @@ -170,7 +170,7 @@ private void rename(Path dir) throws IOException { @Override protected void process(List data) { - data.forEach(s -> StatusMessenger.instance.message(Messages.getString("MainWindow.RenamingFile", s))); + data.forEach(s -> StatusMessenger.instance.message(Messages.getText("MainWindow.RenamingFile", s))); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java index 9763ee83..a9415f8e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java @@ -30,7 +30,7 @@ public class SelectDialog extends MultiSubDialog { * Create the dialog. */ public SelectDialog(JFrame frame, List subtitles, Release release) { - super(frame, Messages.getString("SelectDialog.SelectCorrectSubtitle"), true); + super(frame, Messages.getText("SelectDialog.SelectCorrectSubtitle"), true); this.subtitles = subtitles.stream().distinct().sorted(Comparator.comparing(Subtitle::getScore).reversed()).toList(); this.release = release; @@ -43,7 +43,7 @@ public SelectDialog(JFrame frame, List subtitles, Release release) { private void initialize() { getContentPane().setLayout(new MigLayout("", "[1000px:n,grow,fill]", "[][::100px,fill][grow]")); JLabel lblNewLabel = - new JLabel(Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease") + release.fileName); + new JLabel(Messages.getText("SelectDialog.SelectCorrectSubtitleThisRelease") + release.fileName); getContentPane().add(lblNewLabel, "cell 0 0"); { JScrollPane scrollPane = new JScrollPane(); @@ -54,20 +54,20 @@ private void initialize() { buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, "cell 0 2,grow"); - new JButton(Messages.getString("App.OK")).defaultButtonFor(getRootPane()).actionListener(() -> { + new JButton(Messages.getText("App.OK")).defaultButtonFor(getRootPane()).actionListener(() -> { selectedSubtitleIdxs = getSelectedIdxs(); setVisible(false); - }).actionCommand(Messages.getString("App.OK")).addTo(buttonPane); + }).actionCommand(Messages.getText("App.OK")).addTo(buttonPane); - new JButton(Messages.getString("SelectDialog.Everything")).actionListener(() -> { + new JButton(Messages.getText("SelectDialog.Everything")).actionListener(() -> { selectedSubtitleIdxs = IntStream.range(0, release.getMatchingSubs().size()).boxed().toList(); setVisible(false); - }).actionCommand(Messages.getString("App.All")).addTo(buttonPane); + }).actionCommand(Messages.getText("App.All")).addTo(buttonPane); - new JButton(Messages.getString("App.Cancel")).actionListener(() -> { + new JButton(Messages.getText("App.Cancel")).actionListener(() -> { selectedSubtitleIdxs = List.of(); setVisible(false); - }).actionCommand(Messages.getString("App.Cancel")).addTo(buttonPane); + }).actionCommand(Messages.getText("App.Cancel")).addTo(buttonPane); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index b557cfe7..a0b27687 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -66,7 +66,7 @@ private void initializeUi() { setMinimumSize(new Dimension(600, 300)); Container panel = getContentPane().layout(new MigLayout("insets 10, nogrid")); - new JLabel(Messages.getString("StructureBuilderDialog.AvailableTagsClickToAdd")).addTo(panel, "wrap"); + new JLabel(Messages.getText("StructureBuilderDialog.AvailableTagsClickToAdd")).addTo(panel, "wrap"); this.tagPanel = new JPanel(new MigLayout("flowy, wrap 5", "[150px][150px][150px]")).addTo(panel, "grow, wrap"); { @@ -82,21 +82,21 @@ private void initializeUi() { } } - new JLabel(Messages.getString("StructureBuilderDialog.Structure")).addTo(panel); + new JLabel(Messages.getText("StructureBuilderDialog.Structure")).addTo(panel); this.txtStructure = new JTextField().columns(100).addTo(panel, "span, wrap"); this.txtStructure.getDocument().addDocumentListener(this); - new JLabel(Messages.getString("StructureBuilderDialog.Preview")).addTo(panel); + new JLabel(Messages.getText("StructureBuilderDialog.Preview")).addTo(panel); this.lblPreview = new JLabel("").addTo(panel); new JPanel(new FlowLayout(FlowLayout.RIGHT)).addTo(panel, BorderLayout.SOUTH) .addComponent( - new JButton(Messages.getString("App.OK")).defaultButtonFor(getRootPane()).actionListener(_ -> { + new JButton(Messages.getText("App.OK")).defaultButtonFor(getRootPane()).actionListener(_ -> { setVisible(false); dispose(); // this is needed to dispose the dialog and return the control to the // window }).actionCommand("OK")) - .addComponent(new JButton(Messages.getString("App.Cancel")).actionListener(_ -> { + .addComponent(new JButton(Messages.getText("App.Cancel")).actionListener(_ -> { setVisible(false); txtStructure.setText(oldStructure); dispose(); // this is needed to dispose the dialog and return the control to the window diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java index 78a6b071..948cc5dd 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java @@ -26,7 +26,7 @@ public class SearchProgressDialog extends MultiSubDialog implements SearchProgre private boolean completed; public SearchProgressDialog(GUI window, Cancelable searchAction) { - super(window, Messages.getString("SearchProgressDialog.Title"), false); + super(window, Messages.getText("SearchProgressDialog.Title"), false); this.searchAction = searchAction; this.window = window; this.completed = false; @@ -102,7 +102,7 @@ public void windowClosing(WindowEvent e) { progressBar.setIndeterminate(true); getContentPane().add(progressBar, "cell 0 1 2 1,grow"); - JButton btnStop = new JButton(Messages.getString("SearchProgressDialog.Stop")); + JButton btnStop = new JButton(Messages.getText("SearchProgressDialog.Stop")); btnStop.addActionListener(_ -> searchAction.cancel(true)); getContentPane().add(btnStop, "cell 1 2,alignx left"); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java index ed69d113..4a241fac 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java @@ -17,9 +17,9 @@ public SearchProgressTableModel() { super(); this.setColumnCount(3); this.setColumnIdentifiers(new String[]{ - Messages.getString("SearchProgressTableModel.Source"), - Messages.getString("SearchProgressTableModel.Queue"), - Messages.getString("SearchProgressTableModel.Release") }); + Messages.getText("SearchProgressTableModel.Source"), + Messages.getText("SearchProgressTableModel.Queue"), + Messages.getText("SearchProgressTableModel.Release") }); } public void update(String source, int queue, String release) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java index b13cde38..3139f1b7 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java @@ -32,7 +32,7 @@ public enum SearchColumnName implements CustomColumnName { @val @override boolean editable; SearchColumnName(String columnNameCode, Class clazz, boolean editable) { - this.columnName = Messages.getString(columnNameCode); + this.columnName = Messages.getText(columnNameCode); this.clazz = clazz; this.editable = editable; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java index 68e7f26b..a3a6463d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java @@ -26,7 +26,7 @@ public enum SubtitleTableColumnName implements CustomColumnName { SubtitleTableColumnName(String columnNameCode, Class clazz, boolean editable, Function valueFunction) { - this.columnName = Messages.getString(columnNameCode); + this.columnName = Messages.getText(columnNameCode); this.clazz = clazz; this.editable = editable; this.valueFunction = valueFunction; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java index 8326d20f..bcc22bb0 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java @@ -53,6 +53,6 @@ private void createComponents() { cbxLanguage = new MyComboBox<>(Language.values()) .withToMessageStringRenderer(Language::getMsgCode); - btnSearch = new JButton(Messages.getString("InputPanel.SearchForSubtitles")); + btnSearch = new JButton(Messages.getText("InputPanel.SearchForSubtitles")); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java index 81580641..7a4f7e8e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java @@ -1,11 +1,12 @@ package org.lodder.subtools.multisubdownloader.gui.panels; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.io.Serial; import ch.qos.logback.classic.Level; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.LogTextAppender; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; @@ -23,7 +24,7 @@ public LoggingPanel() { this.setLayout(new MigLayout("", "[698px,grow][]", "[][70px,grow]")); JScrollPane scrollPane = new JScrollPane(); - this.add(new JLabel(Messages.getString("App.Logging")), "cell 0 0,alignx right,gaptop 5"); + this.add(new JLabel(getText("App.Logging")), "cell 0 0,alignx right,gaptop 5"); this.add(new JSeparator(), "cell 0 0,growx,gaptop 5"); Level[] logLevels = { Level.ALL, Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR }; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java index 04ba5143..a6e17d5b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/ResultPanel.java @@ -1,12 +1,13 @@ package org.lodder.subtools.multisubdownloader.gui.panels; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import javax.swing.table.*; import java.awt.event.ActionListener; import java.io.Serial; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.table.CustomTable; import org.lodder.subtools.multisubdownloader.gui.extra.table.SearchColumnName; import org.lodder.subtools.multisubdownloader.gui.extra.table.VideoTableModel; @@ -38,7 +39,7 @@ private void addComponentsToPanel() { actionButtonsPanel.add(btnDownload, "cell 0 0,alignx right,aligny top"); actionButtonsPanel.add(btnMove, "cell 1 0,alignx left,aligny top"); - add(new JLabel(Messages.getString("ResultPanel.SearchResults")), "cell 0 0 2 1,gapy 5"); + add(new JLabel(getText("ResultPanel.SearchResults")), "cell 0 0 2 1,gapy 5"); add(new JSeparator(), "cell 0 0 2 1,growx,gaptop 5"); add(scrollPane, "cell 0 1 1 4,grow"); add(btnSelectNone, "cell 1 1,aligny bottom"); @@ -104,11 +105,11 @@ private void setupListeners() { private void createComponents() { scrollPane = new JScrollPane(); - btnSelectNone = new JButton(Messages.getString("ResultPanel.SelectNothing")); - btnSelectFound = new JButton(Messages.getString("ResultPanel.SelectFound")); - btnSelectAll = new JButton(Messages.getString("ResultPanel.SelectEverything")); - btnDownload = new JButton(Messages.getString("ResultPanel.DownloadSelected")); - btnMove = new JButton(Messages.getString("ResultPanel.MoveSelected")); + btnSelectNone = new JButton(getText("ResultPanel.SelectNothing")); + btnSelectFound = new JButton(getText("ResultPanel.SelectFound")); + btnSelectAll = new JButton(getText("ResultPanel.SelectEverything")); + btnDownload = new JButton(getText("ResultPanel.DownloadSelected")); + btnMove = new JButton(getText("ResultPanel.MoveSelected")); } private void setEnableButtons(boolean enabled) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java index cb3bd3ef..6ac1b135 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchFileInputPanel.java @@ -1,11 +1,12 @@ package org.lodder.subtools.multisubdownloader.gui.panels; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.awt.event.ActionListener; import java.io.Serial; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; public class SearchFileInputPanel extends InputPanel { @@ -25,23 +26,23 @@ public SearchFileInputPanel() { } private void addComponentsToPanel() { - add(new JLabel(Messages.getString("MainWindow.LocationNewEpisodes")), "cell 1 0,alignx trailing"); + add(new JLabel(getText("MainWindow.LocationNewEpisodes")), "cell 1 0,alignx trailing"); add(txtIncomingPath, "cell 2 0,alignx leading"); add(btnBrowse, "cell 3 0"); add(chkRecursive, "cell 2 1 2 1"); add(chkForceSubtitleOverwrite, "cell 2 3 2 1"); add(getSearchButton(), "cell 0 5 3 1,alignx center"); - add(new JLabel(Messages.getString("MainWindow.SelectSubtitleLanguage")), "cell 2 2"); + add(new JLabel(getText("MainWindow.SelectSubtitleLanguage")), "cell 2 2"); add(getLanguageCbx(), "cell 3 2"); } private void createComponents() { txtIncomingPath = new JTextField().columns(20); - chkRecursive = new JCheckBox(Messages.getString("MainWindow.RecursiveSearch")); - chkForceSubtitleOverwrite = new JCheckBox(Messages.getString("MainWindow.ignoreExistingSubtitles")); + chkRecursive = new JCheckBox(getText("MainWindow.RecursiveSearch")); + chkForceSubtitleOverwrite = new JCheckBox(getText("MainWindow.ignoreExistingSubtitles")); - btnBrowse = new JButton(Messages.getString("App.Browse")); + btnBrowse = new JButton(getText("App.Browse")); } public void setRecursiveSelected(boolean selected) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java index ec765523..bca07b51 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java @@ -1,10 +1,11 @@ package org.lodder.subtools.multisubdownloader.gui.panels; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.io.Serial; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; import org.lodder.subtools.sublibrary.model.VideoSearchType; @@ -31,13 +32,13 @@ public SearchTextInputPanel() { private void addComponentsToPanel() { this.add(cbxVideoType, "cell 1 0,growx"); this.add(txtInputVideoName, "cell 2 0 5 1,growx"); - this.add(new JLabel(Messages.getString("MainWindow.QualityVersion")), "cell 1 1,alignx trailing"); + this.add(new JLabel(getText("MainWindow.QualityVersion")), "cell 1 1,alignx trailing"); this.add(txtQualityVersion, "cell 2 1,growx"); - this.add(new JLabel(Messages.getString("App.Season")), "cell 3 1,alignx trailing"); + this.add(new JLabel(getText("App.Season")), "cell 3 1,alignx trailing"); this.add(txtInputSeason, "cell 4 1,alignx left"); - this.add(new JLabel(Messages.getString("App.Episode")), "cell 5 1,alignx trailing"); + this.add(new JLabel(getText("App.Episode")), "cell 5 1,alignx trailing"); this.add(txtInputEpisode, "cell 6 1,growx"); - this.add(new JLabel(Messages.getString("MainWindow.SelectSubtitleLanguage")), "cell 1 2 3 1,alignx trailing"); + this.add(new JLabel(getText("MainWindow.SelectSubtitleLanguage")), "cell 1 2 3 1,alignx trailing"); this.add(getLanguageCbx(), "cell 4 2 2 1,growx"); this.add(getSearchButton(), "cell 2 4 2 1"); } @@ -49,13 +50,9 @@ private void setupListeners() { private void createComponents() { cbxVideoType = new MyComboBox<>(VideoSearchType.values()) .withToMessageStringRenderer(VideoSearchType::getMsgCode); - txtInputVideoName = new JTextField().columns(10); - txtQualityVersion = new JTextField().columns(10); - txtInputSeason = new JTextField().columns(10); - txtInputEpisode = new JTextField().columns(10); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java index c90a1419..33391d9b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/DefaultSelectionPanel.java @@ -29,12 +29,11 @@ public DefaultSelectionPanel(SettingsControl settingsCtrl) { this.settingsCtrl = settingsCtrl; unusedPatternsTable = - ScrollTable.create(Messages.getString("PreferenceDialog.DefaultSelectionUnused"), Source.class) + ScrollTable.create(Messages.getText("PreferenceDialog.DefaultSelectionUnused"), Source.class) .add(this, "spany 2"); new ArrowButton(SwingConstants.EAST, 1, 10).actionListener(this::addPattern).addTo(this); - usedPatternsTable = - ScrollTable.create(Messages.getString("PreferenceDialog.DefaultSelectionUsed"), Source.class) - .add(this, "spany 2"); + usedPatternsTable = ScrollTable.create(Messages.getText("PreferenceDialog.DefaultSelectionUsed"), Source.class) + .add(this, "spany 2"); new ArrowButton(SwingConstants.NORTH, 1, 10).actionListener(this::moveRuleRowUp).addTo(this, "wrap"); new ArrowButton(SwingConstants.WEST, 1, 10).actionListener(this::removePattern).addTo(this, "skip"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index 7f56c837..2765fccd 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.io.Serial; import java.nio.file.Path; @@ -27,8 +29,7 @@ public class GeneralPanel extends JPanel implements PreferencePanelIntf { - @Serial - private static final long serialVersionUID = -5458593307643063563L; + @Serial private static final long serialVersionUID = -5458593307643063563L; private final GUI gui; private final SettingsControl settingsCtrl; @@ -46,111 +47,116 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { this.gui = gui; this.settingsCtrl = settingsCtrl; - JPanel settingsPanel = TitlePanel.title(Messages.getString("PreferenceDialog.Settings")) - .padding(0).paddingLeft(20).useGrid().fillContents(false).addTo(this, "span, grow, wrap"); + JPanel settingsPanel = TitlePanel.title(getText("PreferenceDialog.Settings")) + .padding(0).paddingLeft(20).useGrid().fillContents(false) + .addTo(this, "span, grow, wrap"); { - { - new JLabel(Messages.getString("PreferenceDialog.Language")).addTo(settingsPanel); - - this.cbxLanguage = new MyComboBox<>(Messages.getAvailableLanguages(), Language.class) - .withToMessageStringRenderer(Language::getMsgCode) - .addTo(settingsPanel, "wrap"); - } - - { - new JLabel(Messages.getString("PreferenceDialog.DefaultIncomingFolder")).addTo(settingsPanel, - "aligny center, span 1 2"); - - new JScrollPane() - .viewportView(this.defaultIncomingFoldersList = - JListWithImages.createForType(Path.class).distinctValues().build()) - .addTo(settingsPanel, "growx, span, wrap"); - - new JButton(Messages.getString("PreferenceDialog.AddFolder")) - .actionListener( - () -> MemoryFolderChooser.getInstance() - .selectDirectory(settingsPanel, - Messages.getString("PreferenceDialog.SelectFolder")) - .map(Path::toAbsolutePath) - .filter(path -> !defaultIncomingFoldersList.contains(path)) - .ifPresent( - path -> defaultIncomingFoldersList.addItem(PathMatchType.FOLDER.image, - path))) - .addTo(settingsPanel, "span, split 2"); - - new JButton(Messages.getString("PreferenceDialog.DeleteFolder")) - .actionListener(defaultIncomingFoldersList::removeSelectedItem) - .addTo(settingsPanel, "wrap, gapbottom 10px"); - } - { - new JLabel(Messages.getString("PreferenceDialog.ExcludeList")).addTo(settingsPanel, - "aligny center, span 1 2"); - - new JScrollPane() - .viewportView(this.excludeList = - JListWithImages.createForType(PathOrRegex.class).distinctValues().build()) - .addTo(settingsPanel, "growx, span, wrap"); - - Consumer addExcludeItemConsumer = type -> { - if (type == PathMatchType.FOLDER) { - MemoryFolderChooser.getInstance() - .selectDirectory(settingsPanel, - Messages.getString("PreferenceDialog.SelectExcludeFolder")) - .map(Path::toAbsolutePath) - .map(PathOrRegex::new) - .ifPresent(pathOrRegex -> excludeList.addItem(pathOrRegex.image, pathOrRegex)); - } else if (type == PathMatchType.REGEX) { - String regex = JOptionPane.showInputDialog(Messages.getString("PreferenceDialog.EnterRegex")); - if (StringUtils.isNotBlank(regex)) { - excludeList.addItem(PathMatchType.REGEX.image, new PathOrRegex(regex)); - } + // Language \\ + + new JLabel(getText("PreferenceDialog.Language")).addTo(settingsPanel); + + this.cbxLanguage = new MyComboBox<>(Messages.getAvailableLanguages(), Language.class) + .withToMessageStringRenderer(Language::getMsgCode) + .addTo(settingsPanel, "wrap"); + + // Default Incoming Folder \\ + + new JLabel(getText("PreferenceDialog.DefaultIncomingFolder")).addTo(settingsPanel, + "aligny center, span 1 2"); + + new JScrollPane() + .viewportView(this.defaultIncomingFoldersList = + JListWithImages.createForType(Path.class).distinctValues().build()) + .addTo(settingsPanel, "growx, span, wrap"); + + new JButton(getText("PreferenceDialog.AddFolder")) + .actionListener(() -> MemoryFolderChooser.getInstance() + .selectDirectory(settingsPanel, getText("PreferenceDialog.SelectFolder")) + .map(Path::toAbsolutePath) + .filter(path -> !defaultIncomingFoldersList.contains(path)) + .ifPresent(p -> defaultIncomingFoldersList.addItem(PathMatchType.FOLDER.image, p))) + .addTo(settingsPanel, "span, split 2"); + + new JButton(getText("PreferenceDialog.DeleteFolder")) + .actionListener(defaultIncomingFoldersList::removeSelectedItem) + .addTo(settingsPanel, "wrap, gapbottom 10px"); + + // Exclude List \\ + + new JLabel(getText("PreferenceDialog.ExcludeList")) + .addTo(settingsPanel, "aligny center, span 1 2"); + + new JScrollPane() + .viewportView(this.excludeList = + JListWithImages.createForType(PathOrRegex.class).distinctValues().build()) + .addTo(settingsPanel, "growx, span, wrap"); + + Consumer addExcludeItemConsumer = type -> { + if (type == PathMatchType.FOLDER) { + MemoryFolderChooser.getInstance() + .selectDirectory(settingsPanel, getText("PreferenceDialog.SelectExcludeFolder")) + .map(Path::toAbsolutePath) + .map(PathOrRegex::new) + .ifPresent(pathOrRegex -> excludeList.addItem(pathOrRegex.image, pathOrRegex)); + } else if (type == PathMatchType.REGEX) { + String regex = JOptionPane.showInputDialog(getText("PreferenceDialog.EnterRegex")); + if (StringUtils.isNotBlank(regex)) { + excludeList.addItem(PathMatchType.REGEX.image, new PathOrRegex(regex)); } - }; + } + }; - new JButton(Messages.getString("PreferenceDialog.AddFolder")) - .actionListener(() -> addExcludeItemConsumer.accept(PathMatchType.FOLDER)) - .addTo(settingsPanel, "span, split 3"); + new JButton(getText("PreferenceDialog.AddFolder")) + .actionListener(() -> addExcludeItemConsumer.accept(PathMatchType.FOLDER)) + .addTo(settingsPanel, "span, split 3"); - new JButton(Messages.getString("PreferenceDialog.DeleteFolder")) - .actionListener(excludeList::removeSelectedItem) - .addTo(settingsPanel); + new JButton(getText("PreferenceDialog.DeleteFolder")) + .actionListener(excludeList::removeSelectedItem) + .addTo(settingsPanel); - new JButton(Messages.getString("PreferenceDialog.RegexToevoegen")) - .actionListener(() -> addExcludeItemConsumer.accept(PathMatchType.REGEX)) - .addTo(settingsPanel); - } + new JButton(getText("PreferenceDialog.RegexToevoegen")) + .actionListener(() -> addExcludeItemConsumer.accept(PathMatchType.REGEX)) + .addTo(settingsPanel); } { - JPanel updatePanel = TitlePanel.title(Messages.getString("PreferenceDialog.Update")) - .padding(0).paddingLeft(20).useGrid().fillContents(false).addTo(this, "span, grow, wrap"); - { - new JLabel(Messages.getString("PreferenceDialog.NewUpdateCheck")).addTo(updatePanel); - this.cbxUpdateCheckPeriod = new MyComboBox<>(UpdateCheckPeriod.values()) - .withToMessageStringRenderer(UpdateCheckPeriod::getLangCode) - .addTo(updatePanel, "wrap"); - new JLabel(Messages.getString("PreferenceDialog.UpdateType")).addTo(updatePanel); - this.cbxUpdateType = new MyComboBox<>(UpdateType.values()) - .withToMessageStringRenderer(UpdateType::getMsgCode).addTo(updatePanel); - } + JPanel updatePanel = TitlePanel.title(getText("PreferenceDialog.Update")) + .padding(0) + .paddingLeft(20) + .useGrid() + .fillContents(false) + .addTo(this, "span, grow, wrap"); + + new JLabel(getText("PreferenceDialog.NewUpdateCheck")).addTo(updatePanel); + this.cbxUpdateCheckPeriod = new MyComboBox<>(UpdateCheckPeriod.values()).withToMessageStringRenderer( + UpdateCheckPeriod::getLangCode).addTo(updatePanel, "wrap"); + new JLabel(getText("PreferenceDialog.UpdateType")).addTo(updatePanel); + this.cbxUpdateType = + new MyComboBox<>(UpdateType.values()).withToMessageStringRenderer(UpdateType::getMsgCode) + .addTo(updatePanel); } { - JPanel proxyPanel = TitlePanel.title(Messages.getString("PreferenceDialog.ConfigureProxy")) - .padding(0).paddingLeft(20).fillContents(false).addTo(this, "span, grow"); + JPanel proxyPanel = TitlePanel.title(getText("PreferenceDialog.ConfigureProxy")) + .padding(0) + .paddingLeft(20) + .fillContents(false) + .addTo(this, "span, grow"); PanelCheckBox.checkbox( - this.chkUseProxy = new JCheckBox(Messages.getString("PreferenceDialog.UseProxyServer"))) - .panelOnSameLine().panelLayout(new MigLayout("insets 0, fill")).leftGap(0).addTo(proxyPanel) - .addComponent(new JLabel(Messages.getString("PreferenceDialog.Hostname"))) + this.chkUseProxy = new JCheckBox(getText("PreferenceDialog.UseProxyServer"))) + .panelOnSameLine() + .panelLayout(new MigLayout("insets 0, fill")) + .leftGap(0) + .addTo(proxyPanel) + .addComponent(new JLabel(getText("PreferenceDialog.Hostname"))) .addComponent("wrap", this.txtProxyHost = MyTextFieldString.builder().requireValue().build().columns(30)) - .addComponent(new JLabel(Messages.getString("PreferenceDialog.Port"))) - .addComponent( - this.txtProxyPort = MyTextFieldInteger.builder().requireValue().build().columns(5)); + .addComponent(new JLabel(getText("PreferenceDialog.Port"))) + .addComponent(this.txtProxyPort = MyTextFieldInteger.builder().requireValue().build().columns(5)); } loadPreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index 0bcc0248..eac8730b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -6,7 +6,6 @@ import java.io.Serial; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; @@ -35,55 +34,53 @@ public OptionsPanel(SettingsControl settingsCtrl) { super(new MigLayout("insets 0, fill, nogrid")); this.settingsCtrl = settingsCtrl; - TitlePanel.title(getString("PreferenceDialog.DownloadOptions")) + TitlePanel.title(getText("PreferenceDialog.DownloadOptions")) .marginBottom(0) .padding(0) .paddingLeft(20) .addTo(this, "span, grow, wrap") .addComponent(this.chkAlwaysConfirm = - new JCheckBox(Messages.getString("PreferenceDialog.CheckBeforeDownloading")), "wrap") - .addComponent("wrap, grow", // - PanelCheckBox.checkbox(this.chkMinScoreSelection = - new JCheckBox(getString("PreferenceDialog.MinAutomaticScoreSelection"))) - .panelOnSameLine() - .build() - .addComponent(this.sldMinScoreSelection = new JSlider().minimum(0).maximum(100), - "wrap")) - .addComponent("wrap, grow",// + new JCheckBox(getText("PreferenceDialog.CheckBeforeDownloading")), "wrap") + .addComponent("wrap, grow", PanelCheckBox.checkbox(this.chkMinScoreSelection = + new JCheckBox(getText("PreferenceDialog.MinAutomaticScoreSelection"))) + .panelOnSameLine() + .build() + .addComponent(this.sldMinScoreSelection = new JSlider().minimum(0).maximum(100), "wrap")) + .addComponent("wrap, grow", PanelCheckBox.checkbox(this.chkDefaultSelection = - new JCheckBox(getString("PreferenceDialog.DefaultSelection"), null, true)) + new JCheckBox(getText("PreferenceDialog.DefaultSelection"), null, true)) .panelOnNewLine() .build() .addComponent(this.pnlDefaultSelection = new DefaultSelectionPanel(settingsCtrl))); - TitlePanel.title(getString("PreferenceDialog.SearchFilter")) + TitlePanel.title(getText("PreferenceDialog.SearchFilter")) .marginBottom(0) .padding(0) .paddingLeft(20) .addTo(this, "span, grow, wrap") .addComponent( - this.chkSubtitleExactMethod = new JCheckBox(getString("PreferenceDialog.SearchFilterExact")), + this.chkSubtitleExactMethod = new JCheckBox(getText("PreferenceDialog.SearchFilterExact")), "wrap") .addComponent(this.chkSubtitleKeywordMethod = - new JCheckBox(getString("PreferenceDialog.SearchFilterKeyword")), "wrap") + new JCheckBox(getText("PreferenceDialog.SearchFilterKeyword")), "wrap") .addComponent(this.chkExcludeHearingImpaired = - new JCheckBox(getString("PreferenceDialog.ExcludeHearingImpaired"))); + new JCheckBox(getText("PreferenceDialog.ExcludeHearingImpaired"))); - TitlePanel.title(getString("PreferenceDialog.TableOptions")) + TitlePanel.title(getText("PreferenceDialog.TableOptions")) .marginBottom(0) .padding(0) .paddingLeft(20) .addTo(this, "span, grow, wrap") - .addComponent(this.chkOnlyFound = new JCheckBox(getString("PreferenceDialog.ShowOnlyFound"))); + .addComponent(this.chkOnlyFound = new JCheckBox(getText("PreferenceDialog.ShowOnlyFound"))); - TitlePanel.title(getString("PreferenceDialog.ErrorHandlingOption")) + TitlePanel.title(getText("PreferenceDialog.ErrorHandlingOption")) .marginBottom(0) .padding(0) .paddingLeft(20) .addTo(this, "span, grow, wrap") - .addComponent(this.chkStopOnSearchError = new JCheckBox(getString("PreferenceDialog.StopAfterError"))); + .addComponent(this.chkStopOnSearchError = new JCheckBox(getText("PreferenceDialog.StopAfterError"))); - TitlePanel.title(getString("PreferenceDialog.SerieDatabaseSource")) + TitlePanel.title(getText("PreferenceDialog.SerieDatabaseSource")) .marginBottom(0) .padding(0) .paddingLeft(20) @@ -91,7 +88,7 @@ public OptionsPanel(SettingsControl settingsCtrl) { .addComponent(this.cbxEpisodeProcessSource = MyComboBox.ofValues(SettingsProcessEpisodeSource.values()), "wrap") .addComponent(this.chkConfirmProviderMapping = - new JCheckBox(getString("PreferenceDialog.ConfirmProviderMapping"))); + new JCheckBox(getText("PreferenceDialog.ConfirmProviderMapping"))); loadPreferenceSettings(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index 8ae04aa3..74ca700b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -1,13 +1,13 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; import static java.util.function.Predicate.*; +import static org.lodder.subtools.multisubdownloader.Messages.*; import javax.swing.*; import java.io.Serial; import java.nio.file.Path; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.JListWithImages; import org.lodder.subtools.multisubdownloader.gui.extra.JListWithImages.LabelPanel; import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; @@ -44,23 +44,23 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { super(new MigLayout("insets 0, fill, nogrid")); this.settingsCtrl = settingsCtrl; - JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.SelectPreferredSources")) + JPanel titlePanel = TitlePanel.title(getText("PreferenceDialog.SelectPreferredSources")) .addTo(this, "span, grow"); { // ADDIC7ED this.chkSourceAddic7ed = new JCheckBox("Addic7ed"); - this.chkUserAddic7edLogin = new JCheckBox(Messages.getString("PreferenceDialog.UseAddic7edLogin")); - this.chkSourceAddic7edProxy = new JCheckBox(Messages.getString("PreferenceDialog.Proxy")); + this.chkUserAddic7edLogin = new JCheckBox(getText("PreferenceDialog.UseAddic7edLogin")); + this.chkSourceAddic7edProxy = new JCheckBox(getText("PreferenceDialog.Proxy")); PanelCheckBox.checkbox(chkSourceAddic7ed).panelOnNewLine().addTo(titlePanel, "wrap") .addComponent("wrap", chkSourceAddic7edProxy) .addComponent(PanelCheckBox.checkbox(chkUserAddic7edLogin).panelOnNewLine() .panelLayout(new MigLayout("insets 0, novisualpadding")).build() - .addComponent(new JLabel(Messages.getString("PreferenceDialog.Username"))) + .addComponent(new JLabel(getText("PreferenceDialog.Username"))) .addComponent("wrap", this.txtAddic7edUsername = MyTextFieldString.builder().requireValue().build().columns(20)) - .addComponent(new JLabel(Messages.getString("PreferenceDialog.Password"))) + .addComponent(new JLabel(getText("PreferenceDialog.Password"))) .addComponent(this.txtAddic7edPassword = MyPasswordField.builder().requireValue().build().columns(20))); @@ -73,14 +73,14 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { // OPENSUBTITLES this.chkSourceOpenSubtitles = new JCheckBox("OpenSubtitles"); this.chkUserOpenSubtitlesLogin = - new JCheckBox(Messages.getString("PreferenceDialog.UseOpenSubtitlesLogin")); + new JCheckBox(getText("PreferenceDialog.UseOpenSubtitlesLogin")); PanelCheckBox.checkbox(chkSourceOpenSubtitles).panelOnNewLine().addTo(titlePanel, "wrap") .addComponent(PanelCheckBox.checkbox(chkUserOpenSubtitlesLogin).panelOnNewLine() .panelLayout(new MigLayout("insets 0, novisualpadding")).build() - .addComponent(new JLabel(Messages.getString("PreferenceDialog.Username"))) + .addComponent(new JLabel(getText("PreferenceDialog.Username"))) .addComponent("wrap", txtOpenSubtitlesUsername = MyTextFieldString.builder().requireValue().build().columns(20)) - .addComponent(new JLabel(Messages.getString("PreferenceDialog.Password"))) + .addComponent(new JLabel(getText("PreferenceDialog.Password"))) .addComponent(txtOpenSubtitlesPassword = MyPasswordField.builder().requireValue().build().columns(20))); @@ -88,24 +88,26 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { this.chkSourceSubscene = new JCheckBox("Subscene").addTo(titlePanel, "wrap"); // LOCAL - this.chkSourceLocal = new JCheckBox(Messages.getString("PreferenceDialog.Local")); + this.chkSourceLocal = new JCheckBox(getText("PreferenceDialog.Local")); JScrollPane scrLocalSources = new JScrollPane().viewportView(this.localSourcesFoldersList = JListWithImages.createForType(Path.class).distinctValues().build()); - JButton btnBrowseLocalSources = new JButton(Messages.getString("PreferenceDialog.AddFolder")) + JButton btnBrowseLocalSources = new JButton(getText("PreferenceDialog.AddFolder")) .actionListener(() -> MemoryFolderChooser.getInstance() - .selectDirectory(this, Messages.getString("PreferenceDialog.SelectFolder")) + .selectDirectory(this, getText("PreferenceDialog.SelectFolder")) .map(Path::toAbsolutePath).filter(not(localSourcesFoldersList::contains)) - .ifPresent(path -> localSourcesFoldersList.addItem(PathMatchType.FOLDER.getImage(), path))); - JButton btnRemoveLocalSources = new JButton(Messages.getString("PreferenceDialog.DeleteFolder")) + .ifPresent(path -> localSourcesFoldersList.addItem(PathMatchType.FOLDER.image, path))); + JButton btnRemoveLocalSources = new JButton(getText("PreferenceDialog.DeleteFolder")) .actionListener(localSourcesFoldersList::removeSelectedItem); PanelCheckBox.checkbox(chkSourceLocal).panelOnNewLine().addTo(titlePanel) .addComponent("aligny top, gapy 5px", - new JLabel(Messages.getString("PreferenceDialog.LocalFolderWithSubtitles"))) - .addComponent("wrap", new JPanel(new MigLayout("insets 0", "[grow, nogrid]")).addComponent("split", - btnBrowseLocalSources) - .addComponent("wrap", btnRemoveLocalSources).addComponent("wrap", scrLocalSources)); + new JLabel(getText("PreferenceDialog.LocalFolderWithSubtitles"))) + .addComponent("wrap", + new JPanel(new MigLayout("insets 0", "[grow, nogrid]")) + .addComponent("split", btnBrowseLocalSources) + .addComponent("wrap", btnRemoveLocalSources) + .addComponent("wrap", scrLocalSources)); } loadPreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index 7ae6b69f..4cc9217d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import javax.swing.border.*; import java.awt.*; @@ -15,7 +17,6 @@ import java.util.stream.Stream; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.dialog.StructureBuilderDialog; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; @@ -45,83 +46,79 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, super(new MigLayout("insets 0, fill, nogrid")); this.librarySettings = librarySettings; - JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.RenameFiles")) + JPanel titlePanel = TitlePanel.title(getText("PreferenceDialog.RenameFiles")) .margin(0) .padding(0) .marginLeft(20) .paddingLeft(20) .addTo(this, "span, grow"); + new JLabel(getText("PreferenceDialog.Structure")).addTo(titlePanel, "shrink"); + this.txtFileStructure = + MyTextFieldString.builder().requireValue().build().columns(20).addTo(titlePanel, "grow"); + new JButton(getText("StructureBuilderDialog.Structure")) + .actionListener(() -> { + StructureBuilderDialog sDialog = + new StructureBuilderDialog(null, getText("PreferenceDialog.StructureBuilderTitle"), + true, videoType, StructureBuilderDialog.StructureType.FILE, manager, + userInteractionHandler, getLibraryStructureBuilder()); + String value = sDialog.showDialog(txtFileStructure.getText()); + if (!value.isEmpty()) { + txtFileStructure.setText(value); + } + + }).addTo(titlePanel, "shrink, wrap"); + + this.chkReplaceSpace = new JCheckBox(getText("PreferenceDialog.ReplaceSpaceWith")); + + PanelCheckBox.checkbox(chkReplaceSpace) + .panelOnSameLine() + .addTo(titlePanel, "wrap") + .addComponent("width pref+10px, wrap", this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); + + this.chkIncludeLanguageCode = + new JCheckBox(getText("PreferenceDialog.IncludeLanguageInFileName")) + .selectedListener(languageMapping::refreshState).addTo(titlePanel, "wrap"); + + JPanel languagePanelRoot = PanelCheckBox.checkbox(chkIncludeLanguageCode) + .panelOnNewLine() + .panelLayout(new MigLayout("insets 0, novisualpadding", "[][][]")) + .addTo(titlePanel, "span, growx"); { - new JLabel(Messages.getString("PreferenceDialog.Structure")).addTo(titlePanel, "shrink"); - this.txtFileStructure = - MyTextFieldString.builder().requireValue().build().columns(20).addTo(titlePanel, "grow"); - new JButton(Messages.getString("StructureBuilderDialog.Structure")).actionListener(() -> { - StructureBuilderDialog sDialog = - new StructureBuilderDialog(null, Messages.getString("PreferenceDialog.StructureBuilderTitle"), - true, videoType, StructureBuilderDialog.StructureType.FILE, manager, - userInteractionHandler, getLibraryStructureBuilder()); - String value = sDialog.showDialog(txtFileStructure.getText()); - if (!value.isEmpty()) { - txtFileStructure.setText(value); - } - - }).addTo(titlePanel, "shrink, wrap"); - - this.chkReplaceSpace = new JCheckBox(Messages.getString("PreferenceDialog.ReplaceSpaceWith")); - - PanelCheckBox.checkbox(chkReplaceSpace) - .panelOnSameLine() - .addTo(titlePanel, "wrap") - .addComponent("width pref+10px, wrap", - this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); - - this.chkIncludeLanguageCode = - new JCheckBox(Messages.getString("PreferenceDialog.IncludeLanguageInFileName")).selectedListener( - languageMapping::refreshState).addTo(titlePanel, "wrap"); - - JPanel languagePanelRoot = PanelCheckBox.checkbox(chkIncludeLanguageCode) - .panelOnNewLine() - .panelLayout(new MigLayout("insets 0, novisualpadding", "[][][]")) - .addTo(titlePanel, "span, growx"); - { - JPanel languagePanel = new JPanel(new MigLayout("insets 0, novisualpadding", "[][][][20px]")); - JScrollPane languageScrollPane = - new JScrollPane(languagePanel).addTo(languagePanelRoot, "span, growx, wrap, hidemode 3"); - languageScrollPane.setBorder(new EmptyBorder(0, 0, 0, 0)); - languageScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - languageScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - languageScrollPane.setVisible(false); - - AtomicInteger langId = new AtomicInteger(); - addLanguageSupplier = () -> { - int id = langId.getAndIncrement(); - MyComboBox cmbLanguage = - new MyComboBox<>(Language.values()).withToMessageStringRenderer(Language::getMsgCode) - .addTo(languagePanel); - MyTextFieldString txtLanguage = - MyTextFieldString.builder().build().columns(20).addTo(languagePanel); - JButton btnDelete = - new JButton(Messages.getString("StructureFilePanel.Delete")).actionListenerSelf(delBtn -> { - languagePanel.remove(cmbLanguage); - languagePanel.remove(txtLanguage); - languagePanel.remove(delBtn); - languageMapping.remove(id); - languageScrollPane.setVisible(!languageMapping.isEmpty()); - languagePanelRoot.repaint(); - languagePanelRoot.revalidate(); - }).addTo(languagePanel, "wrap"); - LanguageComponents languageComponents = new LanguageComponents(cmbLanguage, txtLanguage, btnDelete); - languageMapping.put(id, languageComponents); - - languageScrollPane.setVisible(true); - languagePanelRoot.repaint(); - languagePanelRoot.revalidate(); - return languageComponents; - }; - new JButton(Messages.getString("StructureFilePanel.AddLanguage")).actionListener( - addLanguageSupplier::get).addTo(languagePanelRoot); - } + JPanel languagePanel = new JPanel(new MigLayout("insets 0, novisualpadding", "[][][][20px]")); + JScrollPane languageScrollPane = + new JScrollPane(languagePanel).addTo(languagePanelRoot, "span, growx, wrap, hidemode 3"); + languageScrollPane.setBorder(new EmptyBorder(0, 0, 0, 0)); + languageScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + languageScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + languageScrollPane.setVisible(false); + + AtomicInteger langId = new AtomicInteger(); + addLanguageSupplier = () -> { + int id = langId.getAndIncrement(); + MyComboBox cmbLanguage = new MyComboBox<>(Language.values()) + .withToMessageStringRenderer(Language::getMsgCode).addTo(languagePanel); + MyTextFieldString txtLanguage = MyTextFieldString.builder().build().columns(20).addTo(languagePanel); + JButton btnDelete = new JButton(getText("StructureFilePanel.Delete")) + .actionListenerSelf(delBtn -> { + languagePanel.remove(cmbLanguage); + languagePanel.remove(txtLanguage); + languagePanel.remove(delBtn); + languageMapping.remove(id); + languageScrollPane.setVisible(!languageMapping.isEmpty()); + languagePanelRoot.repaint(); + languagePanelRoot.revalidate(); + }).addTo(languagePanel, "wrap"); + LanguageComponents languageComponents = new LanguageComponents(cmbLanguage, txtLanguage, btnDelete); + languageMapping.put(id, languageComponents); + + languageScrollPane.setVisible(true); + languagePanelRoot.repaint(); + languagePanelRoot.revalidate(); + return languageComponents; + }; + new JButton(getText("StructureFilePanel.AddLanguage")).actionListener( + addLanguageSupplier::get).addTo(languagePanelRoot); } loadPreferenceSettings(); @@ -231,7 +228,7 @@ public Map toSettingsMap() { return languageComponentsMap.values() .stream() .collect(Collectors.toMap(langComps -> langComps.cmbLanguage().getSelectedItem(), - langComps -> langComps.txtLanguage().getText(), (v1, v2) -> v1, LinkedHashMap::new)); + langComps -> langComps.txtLanguage().getText(), (v1, _) -> v1, LinkedHashMap::new)); } public void refreshState(boolean enabled) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index 6b0f6a78..7826a6f2 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -1,11 +1,12 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.io.Serial; import java.util.function.Function; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.dialog.StructureBuilderDialog; import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; @@ -36,53 +37,46 @@ public StructureFolderPanel(LibrarySettings librarySettings, VideoType videoType super(new MigLayout("insets 0, fill, nogrid")); this.librarySettings = librarySettings; - JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.MoveToLibrary")) + JPanel titlePanel = TitlePanel.title(getText("PreferenceDialog.MoveToLibrary")) .margin(0).padding(0).marginLeft(20).paddingLeft(20).useGrid() .panelColumnConstraints("[shrink][grow][shrink]").addTo(this, "span, grow"); - { - new JLabel(Messages.getString("PreferenceDialog.Location")).addTo(titlePanel, "shrink"); - this.txtLibraryFolder = - MyTextFieldPath.builder().requireValue().build().columns(20).addTo(titlePanel, "grow"); - new JButton(Messages.getString("App.Browse")) - .actionListener(() -> MemoryFolderChooser.getInstance() - .selectDirectory(getRootPane(), Messages.getString("PreferenceDialog.LibraryFolder")) - .ifPresent(txtLibraryFolder::setObject)) - .addTo(titlePanel, "shrink, wrap"); - - new JLabel(Messages.getString("StructureBuilderDialog.Structure")).addTo(titlePanel, "shrink"); - this.txtFolderStructure = MyTextFieldString.builder() - .requireValue() - .build() - .columns(20) - .disabled() - .addTo(titlePanel, "grow"); - JButton btnStructure = new JButton(Messages.getString("StructureBuilderDialog.Structure")) - .actionListener(() -> { - StructureBuilderDialog sDialog = new StructureBuilderDialog(null, - Messages.getString("PreferenceDialog.StructureBuilderTitle"), - true, videoType, StructureBuilderDialog.StructureType.FOLDER, manager, - userInteractionHandler, getLibraryStructureBuilder()); - String value = sDialog.showDialog(txtFolderStructure.getText()); - if (!"".equals(value)) { - txtFolderStructure.setText(value); - } - - }) - .disabled() - .addTo(titlePanel, "shrink, wrap"); - - this.chkRemoveEmptyFolder = new JCheckBox(Messages.getString("PreferenceDialog.RemoveEmptyFolders")) - .addTo(titlePanel, "span, wrap"); - - PanelCheckBox.checkbox(this.chkReplaceSpace = - new JCheckBox(Messages.getString("PreferenceDialog.ReplaceSpaceWith"))) - .panelOnSameLine().addTo(titlePanel, "span") - .addComponent(this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); - - // behaviour - txtLibraryFolder.withValidityChangedCallback(txtFolderStructure::setEnabled, btnStructure::setEnabled); - } + new JLabel(getText("PreferenceDialog.Location")).addTo(titlePanel, "shrink"); + this.txtLibraryFolder = + MyTextFieldPath.builder().requireValue().build().columns(20).addTo(titlePanel, "grow"); + new JButton(getText("App.Browse")) + .actionListener(() -> MemoryFolderChooser.getInstance() + .selectDirectory(getRootPane(), getText("PreferenceDialog.LibraryFolder")) + .ifPresent(txtLibraryFolder::setObject)) + .addTo(titlePanel, "shrink, wrap"); + + new JLabel(getText("StructureBuilderDialog.Structure")).addTo(titlePanel, "shrink"); + this.txtFolderStructure = + MyTextFieldString.builder().requireValue().build().columns(20).disabled().addTo(titlePanel, "grow"); + JButton btnStructure = new JButton(getText("StructureBuilderDialog.Structure")) + .actionListener(() -> { + StructureBuilderDialog sDialog = new StructureBuilderDialog(null, + getText("PreferenceDialog.StructureBuilderTitle"), + true, videoType, StructureBuilderDialog.StructureType.FOLDER, manager, + userInteractionHandler, getLibraryStructureBuilder()); + String value = sDialog.showDialog(txtFolderStructure.getText()); + if (!"".equals(value)) { + txtFolderStructure.setText(value); + } + }) + .disabled() + .addTo(titlePanel, "shrink, wrap"); + + this.chkRemoveEmptyFolder = new JCheckBox(getText("PreferenceDialog.RemoveEmptyFolders")) + .addTo(titlePanel, "span, wrap"); + + PanelCheckBox.checkbox(this.chkReplaceSpace = + new JCheckBox(getText("PreferenceDialog.ReplaceSpaceWith"))) + .panelOnSameLine().addTo(titlePanel, "span") + .addComponent(this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); + + // behaviour + txtLibraryFolder.withValidityChangedCallback(txtFolderStructure::setEnabled, btnStructure::setEnabled); loadPreferenceSettings(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java index 45a04ea1..53c56aa7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java @@ -20,11 +20,11 @@ public abstract class StructurePanel> extends JPanel @get(Protected) MyComboBox cbxReplaceSpaceChar; StructurePanel() { - this.btnBuildStructure = new JButton(Messages.getString("StructureBuilderDialog.Structure")); + this.btnBuildStructure = new JButton(Messages.getText("StructureBuilderDialog.Structure")); this.cbxReplaceSpaceChar = new MyComboBox<>(new String[]{ "-", ".", "_" }); - this.chkReplaceSpace = new JCheckBox(Messages.getString("PreferenceDialog.ReplaceSpaceWith")) + this.chkReplaceSpace = new JCheckBox(Messages.getText("PreferenceDialog.ReplaceSpaceWith")) .addCheckedChangeListener(cbxReplaceSpaceChar::setEnabled); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java index 954d4493..27be7c52 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SubtitleBackupPanel.java @@ -1,10 +1,11 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.io.Serial; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; @@ -24,29 +25,25 @@ public SubtitleBackupPanel(LibrarySettings librarySettings) { super(new MigLayout("insets 0, fillx, nogrid")); this.librarySettings = librarySettings; - JPanel titlePanel = TitlePanel.title(Messages.getString("PreferenceDialog.SubtitlesBackup")) - .margin(0) - .padding(0) - .paddingLeft(20) - .addTo(this, "span, growx"); + JPanel titlePanel = TitlePanel.title(getText("PreferenceDialog.SubtitlesBackup")) + .margin(0).padding(0).paddingLeft(20).addTo(this, "span, growx"); { this.txtBackupSubtitlePath = MyTextFieldPath.builder().requireValue().build().columns(20); - PanelCheckBox.checkbox( - this.chkBackupSubtitle = new JCheckBox(Messages.getString("PreferenceDialog" + - ".BackupSubtitles"))) + PanelCheckBox.checkbox(this.chkBackupSubtitle = new JCheckBox(getText("PreferenceDialog.BackupSubtitles"))) .panelOnNewLine() .addTo(titlePanel, "span, wrap, growx") - .addComponent("split 3, shrink", new JLabel(Messages.getString("PreferenceDialog.Location"))) + .addComponent("split 3, shrink", new JLabel(getText("PreferenceDialog.Location"))) .addComponent("growx", txtBackupSubtitlePath) - .addComponent("shrink", new JButton(Messages.getString("App.Browse")).actionListener( - l -> MemoryFolderChooser.getInstance() - .selectDirectory(this, Messages.getString("PreferenceDialog.SubtitleBackupFolder")) - .ifPresent(txtBackupSubtitlePath::setObject))); + .addComponent("shrink", + new JButton(getText("App.Browse")) + .actionListener(_ -> MemoryFolderChooser.getInstance() + .selectDirectory(this, getText("PreferenceDialog.SubtitleBackupFolder")) + .ifPresent(txtBackupSubtitlePath::setObject))); chkBackupUseSourceFileName = - new JCheckBox(Messages.getString("PreferenceDialog.IncludeSourceInFileName")).addTo(titlePanel); + new JCheckBox(getText("PreferenceDialog.IncludeSourceInFileName")).addTo(titlePanel); } loadPreferenceSettings(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java index e93fd01d..ad40cc2c 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.panels.preference; +import static org.lodder.subtools.multisubdownloader.Messages.*; + import javax.swing.*; import java.io.Serial; import java.nio.file.Files; @@ -7,7 +9,6 @@ import lombok.experimental.ExtensionMethod; import manifold.ext.props.rt.api.val; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.gui.extra.PartialDisableComboBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; @@ -39,29 +40,26 @@ public abstract sealed class VideoLibraryPanel extends JPanel implements Prefere this.pnlBackup = renameMode ? null : new SubtitleBackupPanel(librarySettings).addTo(this, "wrap, span, growx"); - JPanel performActionPanel = TitlePanel.title(Messages.getString("PreferenceDialog.PerformActions")) - .margin(0) - .padding(0) - .paddingLeft(20) - .addTo(this, "span, growx"); + JPanel performActionPanel = TitlePanel.title(getText("PreferenceDialog.PerformActions")) + .margin(0).padding(0).paddingLeft(20).addTo(this, "span, growx"); { - this.chkUseTVDBNaming = new JCheckBox(Messages.getString("PreferenceDialog.UseTvdbName")).visible( + this.chkUseTVDBNaming = new JCheckBox(getText("PreferenceDialog.UseTvdbName")).visible( VideoType.EPISODE == videoType).addTo(performActionPanel, "hidemode 3, wrap"); - new JLabel(Messages.getString("PreferenceDialog.ActionForShowFiles")).addTo(performActionPanel); + new JLabel(getText("PreferenceDialog.ActionForShowFiles")).addTo(performActionPanel); this.cbxLibraryAction = new MyComboBox<>(LibraryActionType.values()).withToMessageStringRenderer( LibraryActionType::getMsgCode).addTo(performActionPanel, "wrap"); this.pnlStructureFolder = - new StructureFolderPanel(librarySettings, videoType, manager, userInteractionHandler).addTo( - performActionPanel, "hidemode 3, wrap, span, growx"); + new StructureFolderPanel(librarySettings, videoType, manager, userInteractionHandler) + .addTo(performActionPanel, "hidemode 3, wrap, span, growx"); this.pnlStructureFile = - new StructureFilePanel(librarySettings, videoType, manager, userInteractionHandler).addTo( - performActionPanel, "hidemode 3, wrap, span, growx"); + new StructureFilePanel(librarySettings, videoType, manager, userInteractionHandler) + .addTo(performActionPanel, "hidemode 3, wrap, span, growx"); JLabel lblActionForOtherFiles = - new JLabel(Messages.getString("PreferenceDialog.ActionForOtherFiles")).addTo(performActionPanel); + new JLabel(getText("PreferenceDialog.ActionForOtherFiles")).addTo(performActionPanel); this.cbxLibraryOtherFileAction = PartialDisableComboBox.of(LibraryOtherFileActionType.values()).addTo(performActionPanel); @@ -143,7 +141,7 @@ public void savePreferenceSettings() { @Override public boolean hasValidSettings() { return pnlStructureFolder.hasValidSettings() && pnlStructureFile.hasValidSettings() && - (pnlBackup == null || pnlBackup.hasValidSettings()); + (pnlBackup == null || pnlBackup.hasValidSettings()); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java index b558f09f..33864619 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/DownloadWorker.java @@ -23,8 +23,8 @@ import org.slf4j.LoggerFactory; /** - * Created by IntelliJ IDEA. User: lodder Date: 4/12/11 Time: 8:52 AM To change this template use - * Path | Settings | Path Templates. + * Created by IntelliJ IDEA. User: lodder Date: 4/12/11 Time: 8:52 AM To change this template use Path | Settings | Path + * Templates. */ public class DownloadWorker extends SwingWorker implements Cancelable { @@ -83,11 +83,12 @@ protected Void doInBackground() { @Override protected void process(List data) { - data.forEach(s -> StatusMessenger.instance.message(Messages.getString("MainWindow.DownloadingSubtitle", s))); + data.forEach(s -> StatusMessenger.instance.message(Messages.getText("MainWindow.DownloadingSubtitle", s))); } private void showErrorMessage(String message) { - JOptionPane.showConfirmDialog(null, message, "JBierSubDownloader", JOptionPane.CLOSED_OPTION, JOptionPane.ERROR_MESSAGE); + JOptionPane.showConfirmDialog(null, message, "JBierSubDownloader", JOptionPane.CLOSED_OPTION, + JOptionPane.ERROR_MESSAGE); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java index 2386bbe5..41ffc68d 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/workers/RenameWorker.java @@ -13,20 +13,15 @@ import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.model.Release; -import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** - * Created by IntelliJ IDEA. User: lodder Date: 4/12/11 Time: 8:52 AM To change this template use - * Path | Settings | Path Templates. + * Created by IntelliJ IDEA. User: lodder Date: 4/12/11 Time: 8:52 AM To change this template use Path | Settings | Path + * Templates. */ @RequiredArgsConstructor public class RenameWorker extends SwingWorker implements Cancelable { - private static final Logger LOGGER = LoggerFactory.getLogger(RenameWorker.class); - private final CustomTable table; private final Settings settings; private final Manager manager; @@ -51,17 +46,11 @@ protected Void doInBackground() { } setProgress(progress); - RenameAction renameAction = null; - if (selectedShow.videoType == VideoType.EPISODE) { - LOGGER.debug("Treat as EPISODE"); - renameAction = new RenameAction(settings.episodeLibrarySettings, manager, userInteractionHandler); - } else if (selectedShow.videoType == VideoType.MOVIE) { - LOGGER.debug("Treat as MOVIE"); - renameAction = new RenameAction(settings.movieLibrarySettings, manager, userInteractionHandler); - } - if (renameAction != null) { - renameAction.rename(selectedShow.getPath().resolve(selectedShow.fileName), selectedShow); - } + RenameAction renameAction = switch (selectedShow.videoType) { + case EPISODE -> new RenameAction(settings.episodeLibrarySettings, manager, userInteractionHandler); + case MOVIE -> new RenameAction(settings.movieLibrarySettings, manager, userInteractionHandler); + }; + renameAction.rename(selectedShow.getPath().resolve(selectedShow.fileName), selectedShow); model.removeShow(selectedShow); } }); @@ -70,6 +59,6 @@ protected Void doInBackground() { @Override protected void process(List data) { - data.forEach(s -> StatusMessenger.instance.message(Messages.getString("MainWindow.RenamingFile", s))); + data.forEach(s -> StatusMessenger.instance.message(Messages.getText("MainWindow.RenamingFile", s))); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java index 51b53c6f..9dcbe428 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/LibraryOtherFileActionType.java @@ -17,7 +17,7 @@ public enum LibraryOtherFileActionType { @Override public String toString() { - return Messages.getString(msgCode); + return Messages.getText(msgCode); } @Deprecated(since = "Settings version 2") diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java index f633c0f1..23cc2ff4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/FolderStructureTag.java @@ -9,7 +9,7 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum FolderStructureTag implements StructureTag { - SEPARATOR("%SEPARATOR%", Messages.getString("StructureBuilderDialog.SystemDependentSeparator")); + SEPARATOR("%SEPARATOR%", Messages.getText("StructureBuilderDialog.SystemDependentSeparator")); @val @override String label; @val @override String description; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java index fe9646e3..1edcbdc4 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/MovieStructureTag.java @@ -9,10 +9,10 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum MovieStructureTag implements StructureTag { - MOVIE_TITLE("%MOVIE TITLE%", Messages.getString("StructureBuilderDialog.MovieName")), - QUALITY("%QUALITY%", Messages.getString("StructureBuilderDialog.QualityOfMovie")), - DESCRIPTION("%DESCRIPTION%", Messages.getString("StructureBuilderDialog.MovieDescription")), - YEAR("%YEAR%", Messages.getString("StructureBuilderDialog.MovieYear")); + MOVIE_TITLE("%MOVIE TITLE%", Messages.getText("StructureBuilderDialog.MovieName")), + QUALITY("%QUALITY%", Messages.getText("StructureBuilderDialog.QualityOfMovie")), + DESCRIPTION("%DESCRIPTION%", Messages.getText("StructureBuilderDialog.MovieDescription")), + YEAR("%YEAR%", Messages.getText("StructureBuilderDialog.MovieYear")); @val @override String label; @val @override String description; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java index 96b341e1..b3b60a40 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/structure/SerieStructureTag.java @@ -22,7 +22,7 @@ public enum SerieStructureTag implements StructureTag { SerieStructureTag(String label, String descriptionMessage) { this.label = label; - this.description = Messages.getString(descriptionMessage); + this.description = Messages.getText(descriptionMessage); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index 1b07b1e0..b046ef38 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -204,9 +204,9 @@ default Optional getProviderSerieId(String serieName, String serie } else { // let the user select the correct provider serie id uriForSerie = getUserInteractionHandler().selectFromList(providerSerieIds, useSeasonForSerieId() ? - Messages.getString("SelectDialog.SelectSerieNameForNameWithSeason") + Messages.getText("SelectDialog.SelectSerieNameForNameWithSeason") .formatted(displayName, seasonToUse) : - Messages.getString("SelectDialog.SelectSerieNameForName").formatted(displayName), + Messages.getText("SelectDialog.SelectSerieNameForName").formatted(displayName), providerName, this::providerSerieIdToDisplayString); } if (uriForSerie.isEmpty()) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java index 90c4d88b..7f756595 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JSubsceneAdapter.java @@ -161,7 +161,7 @@ public String providerSerieIdToDisplayString(SubSceneSerieId providerSerieId) { .filter(i -> providerSerieId.id.endsWith("-${SubsceneApi.getOrdinalName(i).toLowerCase()}-season")) .findAny(); if (season.isPresent()) { - return "%s %s %s".formatted(providerSerieId.name, Messages.getString("App.Season"), season.getAsInt()); + return "%s %s %s".formatted(providerSerieId.name, Messages.getText("App.Season"), season.getAsInt()); } } return providerSerieId.name; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java index b7351a72..13e63142 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java @@ -58,8 +58,8 @@ private enum FileType { public void importSettings(SettingsType listType) { chooseFile(listType.fileType).ifPresent(path -> { if (Files.notExists(path)) { - userInteractionHandler.showMessage(Messages.getString("ImportExport.FileDoesNotExist"), - Messages.getString("ImportExport.ErrorWhileImporting"), MessageSeverity.WARNING); + userInteractionHandler.showMessage(Messages.getText("ImportExport.FileDoesNotExist"), + Messages.getText("ImportExport.ErrorWhileImporting"), MessageSeverity.WARNING); return; } try { @@ -71,11 +71,11 @@ public void importSettings(SettingsType listType) { default -> throw new IllegalArgumentException("Unexpected value: " + listType); } } catch (CorruptSettingsFileException e) { - userInteractionHandler.showMessage(Messages.getString("ImportExport.ImportCorruptFile"), - Messages.getString("ImportExport.ErrorWhileImporting"), MessageSeverity.ERROR); + userInteractionHandler.showMessage(Messages.getText("ImportExport.ImportCorruptFile"), + Messages.getText("ImportExport.ErrorWhileImporting"), MessageSeverity.ERROR); } catch (Exception e) { - userInteractionHandler.showMessage(Messages.getString("ImportExport.ErrorWhileImporting"), - Messages.getString("ImportExport.ErrorWhileImporting"), MessageSeverity.ERROR); + userInteractionHandler.showMessage(Messages.getText("ImportExport.ErrorWhileImporting"), + Messages.getText("ImportExport.ErrorWhileImporting"), MessageSeverity.ERROR); } }); } @@ -91,8 +91,8 @@ public void exportSettings(SettingsType listType) { default -> throw new IllegalArgumentException("Unexpected value: " + listType); } } catch (Exception e) { - userInteractionHandler.showMessage(Messages.getString("ImportExport.ErrorWhileExporting"), - Messages.getString("ImportExport.ErrorWhileExporting"), MessageSeverity.ERROR); + userInteractionHandler.showMessage(Messages.getText("ImportExport.ErrorWhileExporting"), + Messages.getText("ImportExport.ErrorWhileExporting"), MessageSeverity.ERROR); } }); } @@ -185,10 +185,10 @@ private Optional chooseFile(FileType fileType) { private static Optional getImportStyle(UserInteractionHandler userInteractionHandler) { return userInteractionHandler.choice(Arrays.asList(ImportStyle.values()), - Messages.getString("ImportExport.OverwriteOrAdd"), - Messages.getString("ImportExport.OverwriteOrAddTitle"), option -> switch (option) { - case OVERWRITE -> Messages.getString("ImportExport.Overwrite"); - case APPEND -> Messages.getString("ImportExport.Add"); + Messages.getText("ImportExport.OverwriteOrAdd"), + Messages.getText("ImportExport.OverwriteOrAddTitle"), option -> switch (option) { + case OVERWRITE -> Messages.getText("ImportExport.Overwrite"); + case APPEND -> Messages.getText("ImportExport.Add"); }); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java b/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java index 16a51e9c..c94c82fb 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/multisubdownloader/Messages.java @@ -18,7 +18,7 @@ public class Messages { private Messages() { } - public static String getString(String key) { + public static String getText(String key) { try { return resourceBundle.getString(key); } catch (MissingResourceException e) { @@ -26,7 +26,7 @@ public static String getString(String key) { } } - public static String getString(String key, Object... replacements) { + public static String getText(String key, Object... replacements) { try { return resourceBundle.getString(key).formatted(replacements); } catch (MissingResourceException e) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java index 75fb2af2..ffebf70a 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbAdapter.java @@ -115,7 +115,7 @@ private OptionalInt getImdbIdCommon(String title, Integer year, .equalsIgnoreCase(formattedTitle), Comparator.reverseOrder()) .thenComparing(ProviderSerieId::getName)) .toList(), - Messages.getString("Prompter.SelectImdbMatchForSerie").formatted(title), + Messages.getText("Prompter.SelectImdbMatchForSerie").formatted(title), providerName, ProviderSerieId::getName) .mapToInt(providerSerieId -> Integer.parseInt(providerSerieId.id)); @@ -123,8 +123,8 @@ private OptionalInt getImdbIdCommon(String title, Integer year, private OptionalInt promptUserToEnterImdbId(String title, int year) { return userInteractionHandler.enter(providerName, - Messages.getString("Prompter.EnterImdbMatchForSerie").formatted(title), - Messages.getString("Prompter.ValueIsNotValid"), StringUtils::isNumeric).mapToInt(Integer::parseInt); + Messages.getText("Prompter.EnterImdbMatchForSerie").formatted(title), + Messages.getText("Prompter.ValueIsNotValid"), StringUtils::isNumeric).mapToInt(Integer::parseInt); } public static synchronized ImdbAdapter getInstance(Manager manager, UserInteractionHandler userInteractionHandler) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java index 18b12c2a..6130adac 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbAdapter.java @@ -81,7 +81,7 @@ public Optional getSerie(String serieName) { try { tvdbSerie = userInteractionHandler .selectFromList(serieIds.stream().sorted(comparator).toList(), - Messages.getString("Prompter.SelectTvdbMatchForSerie").formatted(serieName), + Messages.getText("Prompter.SelectTvdbMatchForSerie").formatted(serieName), providerName, s -> "${s.serieName} (${s.firstAired})"); if (tvdbSerie.isEmpty()) { tvdbSerie = askUserToEnterTvdbId(serieName) diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java index 404acce9..a1bdee72 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/InputPane.java @@ -58,12 +58,13 @@ public interface InputPaneBuilderPromptIntf { @Setter @Accessors(fluent = true) public static class InputPaneBuilder extends JDialog implements ActionListener, PropertyChangeListener, - InputPaneBuilderPromptIntf, InputPaneBuilderErrorMessageIntf, InputPaneBuilderValidatorIntf, InputPaneBuilderMessageIntf, + InputPaneBuilderPromptIntf, InputPaneBuilderErrorMessageIntf, InputPaneBuilderValidatorIntf, + InputPaneBuilderMessageIntf, InputPaneBuilderTitleIntf { @Serial private static final long serialVersionUID = 1L; - private static final String OK = Messages.getString("App.OK"); - private static final String CANCEL = Messages.getString("App.Cancel"); + private static final String OK = Messages.getText("App.OK"); + private static final String CANCEL = Messages.getText("App.Cancel"); private String title; private String message; private String errorMessage; @@ -133,8 +134,8 @@ public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (isVisible() - && e.getSource() == optionPane - && (JOptionPane.VALUE_PROPERTY.equals(prop) + && e.getSource() == optionPane + && (JOptionPane.VALUE_PROPERTY.equals(prop) || JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) { Object value = optionPane.getValue(); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderCommon.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderCommon.java index 91cdde72..a72e3412 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderCommon.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderCommon.java @@ -16,8 +16,10 @@ private PrompterBuilderCommon() { // hide constructor } - protected static Optional prompt(Prompter prompter, Function toObjectMapper, Predicate validator, - Predicate objValidator, T defaultValue, Supplier defaultValueSupplier, String message, String errorMessage) { + protected static Optional prompt(Prompter prompter, Function toObjectMapper, + Predicate validator, + Predicate objValidator, T defaultValue, Supplier defaultValueSupplier, String message, + String errorMessage) { try { String value = prompter.prompt(message + System.lineSeparator()); if (StringUtils.isEmpty(value)) { @@ -26,17 +28,22 @@ protected static Optional prompt(Prompter prompter, Function t } else if (defaultValueSupplier != null) { return Optional.ofNullable(defaultValueSupplier.get()); } else { - return prompt(prompter, toObjectMapper, validator, objValidator, defaultValue, defaultValueSupplier, message, errorMessage); + return prompt(prompter, toObjectMapper, validator, objValidator, defaultValue, defaultValueSupplier, + message, errorMessage); } } else { if (validator != null && !validator.test(value)) { - prompter.showMessage(StringUtils.isNotBlank(errorMessage) ? errorMessage : Messages.getString("Prompter.ValueIsNotValid")); - return prompt(prompter, toObjectMapper, validator, objValidator, defaultValue, defaultValueSupplier, message, errorMessage); + prompter.showMessage(StringUtils.isNotBlank(errorMessage) ? errorMessage : + Messages.getText("Prompter.ValueIsNotValid")); + return prompt(prompter, toObjectMapper, validator, objValidator, defaultValue, defaultValueSupplier, + message, errorMessage); } T object = toObjectMapper.apply(value); if (objValidator != null && !objValidator.test(object)) { - prompter.showMessage(StringUtils.isNotBlank(errorMessage) ? errorMessage : Messages.getString("Prompter.ValueIsNotValid")); - return prompt(prompter, toObjectMapper, validator, objValidator, defaultValue, defaultValueSupplier, message, errorMessage); + prompter.showMessage(StringUtils.isNotBlank(errorMessage) ? errorMessage : + Messages.getText("Prompter.ValueIsNotValid")); + return prompt(prompter, toObjectMapper, validator, objValidator, defaultValue, defaultValueSupplier, + message, errorMessage); } return Optional.ofNullable(object); } From 830aeab36f0fe99df6bc9e0412d78ca94ee05563 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 22:19:53 +0100 Subject: [PATCH 34/54] changes --- .../subtools/multisubdownloader/GUI.java | 78 ++++++++----------- .../gui/dialog/StructureBuilderDialog.java | 7 +- .../lib/ReleaseFactory.java | 8 +- .../lib/control/MovieReleaseControl.java | 4 +- .../lib/control/TvReleaseControl.java | 8 +- .../lib/library/FilenameLibraryBuilder.java | 22 ++---- .../Addic7edServiceProvider.java | 2 +- .../subtitleproviders/Local.java | 40 +++++----- .../subtitleproviders/adapters/Adapter.java | 11 ++- .../sublibrary/model/MovieRelease.java | 14 +++- .../subtools/sublibrary/model/Release.java | 7 +- .../subtools/sublibrary/model/Video.java | 12 --- 12 files changed, 94 insertions(+), 119 deletions(-) delete mode 100755 SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index 5d9b129b..d51c18d3 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -1,5 +1,8 @@ package org.lodder.subtools.multisubdownloader; +import static org.lodder.subtools.multisubdownloader.Messages.*; +import static org.lodder.subtools.multisubdownloader.gui.extra.table.SearchColumnName.*; + import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; @@ -123,9 +126,8 @@ private void checkUpdate(final boolean forceUpdateCheck) { editorPane.setEditable(false); editorPane.setContentType("text/html"); - editorPane.setText( - "" + Messages.getText("UpdateAppAvailable") + "!:
" + - updateUrl.get() + ""); + editorPane.setText("" + getText("UpdateAppAvailable") + "!:
" + + updateUrl.get() + ""); editorPane.addHyperlinkListener(hyperlinkEvent -> { if (hyperlinkEvent.getEventType() == HyperlinkEvent.EventType.ACTIVATED && @@ -140,7 +142,7 @@ private void checkUpdate(final boolean forceUpdateCheck) { JOptionPane.showMessageDialog(this, editorPane, ConfigProperties.getInstance().getProperty("name"), JOptionPane.INFORMATION_MESSAGE); } else if (forceUpdateCheck) { - JOptionPane.showMessageDialog(this, Messages.getText("MainWindow.NoUpdateAvailable"), + JOptionPane.showMessageDialog(this, getText("MainWindow.NoUpdateAvailable"), ConfigProperties.getInstance().getProperty("name"), JOptionPane.INFORMATION_MESSAGE); } @@ -175,10 +177,10 @@ public void windowClosing(WindowEvent e) { getContentPane().add(tabbedPane, gbcTabbedPane); createFileSearchPanel(); - tabbedPane.addTab(Messages.getText("MainWindow.SearchOnFile"), null, pnlSearchFile, null); + tabbedPane.addTab(getText("MainWindow.SearchOnFile"), null, pnlSearchFile, null); createTextSearchPanel(); - tabbedPane.addTab(Messages.getText("MainWindow.SearchOnName"), null, pnlSearchText, null); + tabbedPane.addTab(getText("MainWindow.SearchOnName"), null, pnlSearchText, null); pnlLogging = new LoggingPanel(); final GridBagConstraints gbcPnlLogging = new GridBagConstraints(); @@ -210,26 +212,19 @@ private void createMenu() { ExportImport exportImport = new ExportImport(manager, settingsControl, userInteractionHandler, this); menuBar = new Menu().withShowOnlyFound(settings.optionsShowOnlyFound) .withFileQuitAction(this::close) - .withViewFilenameAction( - () -> visibilityFunction.accept(SearchColumnName.FILENAME, menuBar.isViewFilenameSelected())) - .withViewTypeAction( - () -> visibilityFunction.accept(SearchColumnName.TYPE, menuBar.isViewTypeSelected())) - .withViewTitleAction( - () -> visibilityFunction.accept(SearchColumnName.TITLE, menuBar.isViewTitleSelected())) - .withViewSeasonAction( - () -> visibilityFunction.accept(SearchColumnName.SEASON, menuBar.isViewSeasonSelected())) - .withViewEpisodeAction( - () -> visibilityFunction.accept(SearchColumnName.EPISODE, menuBar.isViewEpisodeSelected())) + .withViewFilenameAction(() -> visibilityFunction.accept(FILENAME, menuBar.isViewFilenameSelected())) + .withViewTypeAction(() -> visibilityFunction.accept(TYPE, menuBar.isViewTypeSelected())) + .withViewTitleAction(() -> visibilityFunction.accept(TITLE, menuBar.isViewTitleSelected())) + .withViewSeasonAction(() -> visibilityFunction.accept(SEASON, menuBar.isViewSeasonSelected())) + .withViewEpisodeAction(() -> visibilityFunction.accept(EPISODE, menuBar.isViewEpisodeSelected())) .withViewShowOnlyFoundAction(() -> { settings.optionsShowOnlyFound = menuBar.isShowOnlyFound(); - ((VideoTableModel) pnlSearchFile.resultPanel.getTable().getModel()).setShowOnlyFound( - menuBar.isShowOnlyFound()); + ((VideoTableModel) pnlSearchFile.resultPanel.getTable().getModel()) + .setShowOnlyFound(menuBar.isShowOnlyFound()); }) .withViewClearLogAction(() -> pnlLogging.setLogText("")) - .withEditRenameTVAction( - () -> showRenameDialog.accept(VideoType.EPISODE, Messages.getText("Menu.RenameSerie"))) - .withEditRenameMovieAction( - () -> showRenameDialog.accept(VideoType.MOVIE, Messages.getText("Menu.RenameMovie"))) + .withEditRenameTVAction(() -> showRenameDialog.accept(VideoType.EPISODE, getText("Menu.RenameSerie"))) + .withEditRenameMovieAction(() -> showRenameDialog.accept(VideoType.MOVIE, getText("Menu.RenameMovie"))) .withEditPreferencesAction( () -> new PreferenceDialog(self(), settingsControl, (Emitter) app.make("EventEmitter"), manager, userInteractionHandler).setVisible(true)) @@ -300,10 +295,9 @@ private void createFileSearchPanel() { resultPanel.setDownloadAction(_ -> download()); resultPanel.setMoveAction(_ -> { - final int response = - JOptionPane.showConfirmDialog(self(), Messages.getText("MainWindow.OnlyMoveToLibraryStructure"), - Messages.getText("App.Confirm"), //$NON-NLS-2$ - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + final int response = JOptionPane.showConfirmDialog(self(), getText("MainWindow.OnlyMoveToLibraryStructure"), + getText("App.Confirm"), //$NON-NLS-2$ + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (response == JOptionPane.YES_OPTION) { rename(); } @@ -348,8 +342,7 @@ private void restoreScreenSettings() { visibilityConsumer.accept(SearchColumnName.EPISODE, screenSettings.hideEpisode, menuBar::withViewEpisodeSelected); - visibilityConsumer.accept(SearchColumnName.FILENAME, screenSettings.hideFilename, - menuBar::withViewFileNameSelected); + visibilityConsumer.accept(FILENAME, screenSettings.hideFilename, menuBar::withViewFileNameSelected); visibilityConsumer.accept(SearchColumnName.SEASON, screenSettings.hideSeason, menuBar::withViewSeasonSelected); visibilityConsumer.accept(SearchColumnName.TYPE, screenSettings.hideType, menuBar::withViewTypeSelected); visibilityConsumer.accept(SearchColumnName.TITLE, screenSettings.hideTitle, menuBar::withViewTitleSelected); @@ -357,7 +350,7 @@ private void restoreScreenSettings() { private void initPopupMenu() { popupMenu = new MyPopupMenu(); - JMenuItem menuItem = new JMenuItem(Messages.getText("App.Copy")); + JMenuItem menuItem = new JMenuItem(getText("App.Copy")); menuItem.addActionListener(_ -> { final CustomTable t = (CustomTable) popupMenu.getInvoker(); final DefaultTableModel model = (DefaultTableModel) t.getModel(); @@ -392,9 +385,9 @@ protected void showTranslateShowNames() { } private void showAbout() { - String version = ConfigProperties.getInstance().getProperty(Messages.getText("MainWindow.Version")); + String version = ConfigProperties.getInstance().getProperty(getText("MainWindow.Version")); StringBuilder sb = new StringBuilder(); - sb.append(Messages.getText("MainWindow.CurrentVersion")).append(": ").append(version); + sb.append(getText("MainWindow.CurrentVersion")).append(": ").append(version); if (version.contains("-SNAPSHOT")) { sb.append(" (%s)".formatted(PropertiesReader.getProperty("build.timestamp"))); } @@ -404,9 +397,8 @@ private void showAbout() { protected void rename() { CustomTable customTable = pnlSearchFile.resultPanel.getTable(); - RenameWorker renameWorker = - new RenameWorker(customTable, settingsControl.settings, (Manager) this.app.make("Manager"), - userInteractionHandler); + RenameWorker renameWorker = new RenameWorker(customTable, settingsControl.settings, + (Manager) this.app.make("Manager"), userInteractionHandler); renameWorker.addPropertyChangeListener(this); pnlSearchFile.resultPanel.enableButtons(); progressDialog = new ProgressDialog(this, renameWorker); @@ -427,7 +419,7 @@ private void download() { private void downloadText() { MemoryFolderChooser.getInstance() - .selectDirectory(getContentPane(), Messages.getText("MainWindow.SelectFolder")) + .selectDirectory(getContentPane(), getText("MainWindow.SelectFolder")) .ifPresent(path -> { CustomTable subtitleTable = pnlSearchText.resultPanel.getTable(); final VideoTableModel model = (VideoTableModel) subtitleTable.getModel(); @@ -447,17 +439,15 @@ private void downloadText() { if (subtitle.sourceLocation == Subtitle.SourceLocation.FILE) { subtitle.file.copyToDir(path); } else { - Manager manager = (Manager) this.app.make("Manager"); String url = subtitle.sourceLocation == Subtitle.SourceLocation.URL ? subtitle.url : subtitle.urlSupplier.get(); - manager.store(url, path.resolve(filename)); + ((Manager) this.app.make("Manager")).store(url, path.resolve(filename)); } } catch (IOException | ManagerException e) { LOGGER.error("downloadText", e); } catch (SubtitlesProviderException e) { - LOGGER.error( - "Error while getting url for [%s] for subtitle provider [%s] (%s)".formatted( - filename, e.getSubtitleProvider(), e.getMessage()), e); + LOGGER.error("Error while getting url for [%s] for subtitle provider [%s] (%s)" + .formatted(filename, e.getSubtitleProvider(), e.getMessage()), e); throw new RuntimeException(e); } } @@ -477,7 +467,7 @@ public void showErrorMessage(String message) { private void selectIncomingFolder() { MemoryFolderChooser.getInstance() - .selectDirectory(self(), Messages.getText("MainWindow.SelectFolder")) + .selectDirectory(self(), getText("MainWindow.SelectFolder")) .map(Path::toAbsolutePath) .map(Path::toString) .ifPresent(pnlSearchFileInput::setIncomingPath); @@ -492,7 +482,7 @@ public void propertyChange(PropertyChangeEvent event) { } else { final int progress = downloadWorker.getProgress(); progressDialog.updateProgress(progress); - StatusMessenger.instance.message(Messages.getText("MainWindow.StatusDownload")); + StatusMessenger.instance.message(getText("MainWindow.StatusDownload")); } } else if (event.getSource() instanceof RenameWorker renameWorker) { if (renameWorker.isDone()) { @@ -501,7 +491,7 @@ public void propertyChange(PropertyChangeEvent event) { } else { final int progress = renameWorker.getProgress(); progressDialog.updateProgress(progress); - StatusMessenger.instance.message(Messages.getText("MainWindow.StatusRename")); + StatusMessenger.instance.message(getText("MainWindow.StatusRename")); } } } @@ -516,7 +506,7 @@ private void close() { private void storeScreenSettings() { CustomTable customTable = pnlSearchFile.resultPanel.getTable(); settingsControl.settings.screenSettings.hideEpisode = customTable.isHideColumn(SearchColumnName.EPISODE); - settingsControl.settings.screenSettings.hideFilename = customTable.isHideColumn(SearchColumnName.FILENAME); + settingsControl.settings.screenSettings.hideFilename = customTable.isHideColumn(FILENAME); settingsControl.settings.screenSettings.hideSeason = customTable.isHideColumn(SearchColumnName.SEASON); settingsControl.settings.screenSettings.hideTitle = customTable.isHideColumn(SearchColumnName.TITLE); settingsControl.settings.screenSettings.hideType = customTable.isHideColumn(SearchColumnName.TYPE); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index a0b27687..d71fe215 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -57,11 +57,11 @@ public StructureBuilderDialog(JFrame frame, String title, boolean modal, VideoTy this.manager = manager; this.userInteractionHandler = userInteractionHandler; this.libraryBuilder = filenameLibraryBuilder; - initializeUi(); + initializeUI(); generateVideoFiles(); } - private void initializeUi() { + private void initializeUI() { setBounds(100, 100, 600, 300); setMinimumSize(new Dimension(600, 300)); Container panel = getContentPane().layout(new MigLayout("insets 10, nogrid")); @@ -93,8 +93,7 @@ private void initializeUi() { .addComponent( new JButton(Messages.getText("App.OK")).defaultButtonFor(getRootPane()).actionListener(_ -> { setVisible(false); - dispose(); // this is needed to dispose the dialog and return the control to the - // window + dispose(); // this is needed to dispose the dialog and return the control to the window }).actionCommand("OK")) .addComponent(new JButton(Messages.getText("App.Cancel")).actionListener(_ -> { setVisible(false); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java index a6a8efcb..c5da1670 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/ReleaseFactory.java @@ -33,10 +33,10 @@ public ReleaseFactory(Settings settings, Manager manager) { public Release createRelease(Path file, UserInteractionHandler userInteractionHandler) { try { - Release r = releaseParser.parse(file); - ReleaseControl releaseControl = switch (r.videoType) { - case EPISODE -> new TvReleaseControl((TvRelease) r, settings, manager, userInteractionHandler); - case MOVIE -> new MovieReleaseControl((MovieRelease) r, settings, manager, userInteractionHandler); + ReleaseControl releaseControl = switch (releaseParser.parse(file)) { + case TvRelease tvRelease -> new TvReleaseControl(tvRelease, settings, manager, userInteractionHandler); + case MovieRelease movieRelease -> new MovieReleaseControl(movieRelease, settings, manager, + userInteractionHandler); }; releaseControl.process(); return releaseControl.videoFile; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java index 675ffdb5..c2346b42 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java @@ -35,9 +35,9 @@ public void process() throws ReleaseControlException { if (StringUtils.isBlank(movieRelease.name)) { throw new ReleaseControlException("Unable to extract/find title, check file", movieRelease); } else { - movieRelease.imdbId = imdbAdapter.getImdbId(movieRelease.name, movieRelease.year) + movieRelease.setImdbId(imdbAdapter.getImdbId(movieRelease.name, movieRelease.year) .orElseThrow( - () -> new ReleaseControlException("Movie not found on IMDB, check file", movieRelease)); + () -> new ReleaseControlException("Movie not found on IMDB, check file", movieRelease))); Optional movieDetails = movieRelease.getImdbId().mapToObj(imdbAdapter::getMovieDetails).orElseGet(Optional::empty); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index 10ae9a02..ca499a9a 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.lib.control; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.multisubdownloader.settings.model.SettingsProcessEpisodeSource; @@ -18,6 +20,7 @@ public final class TvReleaseControl extends ReleaseControl { private final TheTvdbAdapter jtvdba; private final TvRelease tvRelease; + @val @override Release videoFile = tvRelease; public TvReleaseControl(TvRelease tvRelease, Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { @@ -63,9 +66,4 @@ private void processSpecial() throws ReleaseControlException { } }).orElseThrow(() -> new ReleaseControlException("Show not found, check file", tvRelease)); } - - @Override - public Release getVideoFile() { - return tvRelease; - } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index 32c8170e..f939e049 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -26,8 +26,8 @@ public class FilenameLibraryBuilder extends LibraryBuilder { private final boolean rename; private FilenameLibraryBuilder(String structure, boolean replaceSpace, char replacingSpaceChar, - boolean includeLanguageCode, - Map languageTags, boolean useTvdb, TheTvdbAdapter tvdbAdapter, boolean rename) { + boolean includeLanguageCode, Map languageTags, boolean useTvdb, + TheTvdbAdapter tvdbAdapter, boolean rename) { super(useTvdb, tvdbAdapter); this.structure = structure; this.replaceSpace = replaceSpace; @@ -93,16 +93,11 @@ public interface FilenameLibraryBuilderBuildIntf { @Setter @Accessors(chain = true, fluent = true) - public static class FilenameLibraryBuilderBuilder implements - FilenameLibraryBuilderStructureIntf, - FilenameLibraryBuilderReplaceSpaceIntf, - FilenameLibraryBuilderReplaceSpaceCharIntf, - FilenameLibraryBuilderIncludeLanguageCodeIntf, - FilenameLibraryBuilderLanguageTagIntf, - FilenameLibraryBuilderUseTvdbNameIntf, - FilenameLibraryBuilderTvdbAdapterIntf, - FilenameLibraryBuilderRenameIntf, - FilenameLibraryBuilderBuildIntf { + public static class FilenameLibraryBuilderBuilder + implements FilenameLibraryBuilderStructureIntf, FilenameLibraryBuilderReplaceSpaceIntf, + FilenameLibraryBuilderReplaceSpaceCharIntf, FilenameLibraryBuilderIncludeLanguageCodeIntf, + FilenameLibraryBuilderLanguageTagIntf, FilenameLibraryBuilderUseTvdbNameIntf, + FilenameLibraryBuilderTvdbAdapterIntf, FilenameLibraryBuilderRenameIntf, FilenameLibraryBuilderBuildIntf { private String structure; private boolean replaceSpace; @@ -119,8 +114,7 @@ public static class FilenameLibraryBuilderBuilder implements @Override public FilenameLibraryBuilder build() { return new FilenameLibraryBuilder(structure, replaceSpace, replacingSpaceChar, includeLanguageCode, - languageTags, useTvdbName, - tvdbAdapter, rename); + languageTags, useTvdbName, tvdbAdapter, rename); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java index 790508c8..5d48f1a5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/serviceproviders/Addic7edServiceProvider.java @@ -70,7 +70,7 @@ private void registerListener(SubtitleProviderStore subtitleProviderStore, Emitter emitter = (Emitter) app.make("EventEmitter"); /* Listen for settings-change */ - emitter.listen("providers.settings.change", event -> { + emitter.listen("providers.settings.change", _ -> { /* Change occurred, delete outdated provider from store */ subtitleProviderStore.deleteProvider(subtitleProvider); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index b45b8af0..a9eaa555 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -76,7 +76,7 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { try { Release release = vfp.parse(fileSub); if ((release.videoType == VideoType.EPISODE) - && (((TvRelease) release).season == tvRelease.season && Utils.containsAll( + && (((TvRelease) release).season == tvRelease.season && Utils.containsAll( ((TvRelease) release).episodeNumbers, tvRelease.episodeNumbers))) { TvReleaseControl epCtrl = @@ -122,29 +122,27 @@ public Set searchSubtitles(MovieRelease movieRelease, Language languag for (Path fileSub : getPossibleSubtitles(filter)) { try { - Release release = releaseParser.parse(fileSub); - if (release.videoType == VideoType.MOVIE) { - MovieReleaseControl movieCtrl = - new MovieReleaseControl((MovieRelease) release, settings, manager, userInteractionHandler); - movieCtrl.process(); - if (((MovieRelease) release).getImdbId().equals(movieRelease.getImdbId())) { - Language detectedLang = DetectLanguage.execute(fileSub); - if (detectedLang == language) { + switch (releaseParser.parse(fileSub)) { + case MovieRelease release -> { + MovieReleaseControl movieCtrl = + new MovieReleaseControl(release, settings, manager, userInteractionHandler); + movieCtrl.process(); + if (release.getImdbId().equals(movieRelease.getImdbId()) + && DetectLanguage.execute(fileSub) == language) { LOGGER.debug("Local Sub found, adding {}", fileSub); - listFoundSubtitles.add( - Subtitle.downloadSource(fileSub) - .subtitleSource(getSubtitleSource()) - .fileName(fileSub.getFileNameAsString()) - .language(language) // TODO previously: language(""). This was not correct? - .quality(ReleaseParser.getQualityKeyword(fileSub.getFileNameAsString())) - .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup( - ReleaseParser.extractReleaseGroup(fileSub.getFileNameAsString(), - true)) - .uploader(fileSub.toAbsolutePath().toString()) - .hearingImpaired(false)); + listFoundSubtitles.add(Subtitle.downloadSource(fileSub) + .subtitleSource(getSubtitleSource()) + .fileName(fileSub.getFileNameAsString()) + .language(language) // TODO previously: language(""). This was not correct? + .quality(ReleaseParser.getQualityKeyword(fileSub.getFileNameAsString())) + .subtitleMatchType(SubtitleMatchType.EVERYTHING) + .releaseGroup(ReleaseParser.extractReleaseGroup(fileSub.fileNameAsString, true)) + .uploader(fileSub.toAbsolutePath().toString()) + .hearingImpaired(false)); } } + default -> { + } } } catch (ReleaseParseException | ReleaseControlException e) { if (LOGGER.isDebugEnabled() || LOGGER.isTraceEnabled()) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java index b046ef38..2e876ddc 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/Adapter.java @@ -59,7 +59,7 @@ default Set searchSubtitles(MovieRelease movieRelease, Language langua LOGGER.error("Error calculating file hash", e); } catch (Exception e) { LOGGER.error("API %s searchSubtitles using file hash for movie [%s] (%s)".formatted( - getSubtitleSource().name, movieRelease.name, e.getMessage()), e); + subtitleSource.name, movieRelease.name, e.getMessage()), e); } } } @@ -68,16 +68,15 @@ default Set searchSubtitles(MovieRelease movieRelease, Language langua subtitles.addAll(searchMovieSubtitlesWithId(imdbId, language)); } catch (Exception e) { LOGGER.error("API %s searchSubtitles using imdbid [%s] for movie [%s] (%s)".formatted( - getSubtitleSource().name, imdbId, movieRelease.name, e.getMessage()), e); + subtitleSource.name, imdbId, movieRelease.name, e.getMessage()), e); } }); if (subtitles.isEmpty()) { try { subtitles.addAll(searchMovieSubtitlesWithName(movieRelease.name, movieRelease.year, language)); } catch (Exception e) { - LOGGER.error( - "API %s searchSubtitles using title for movie [%s] (%s)".formatted(getSubtitleSource().name, - movieRelease.name, e.getMessage()), e); + LOGGER.error("API %s searchSubtitles using title for movie [%s] (%s)".formatted(subtitleSource.name, + movieRelease.name, e.getMessage()), e); } } return convertToSubtitles(movieRelease, subtitles, language); @@ -97,7 +96,7 @@ default Set searchSubtitles(TvRelease tvRelease, Language language) { return convertToSubtitles(tvRelease, searchSerieSubtitles(tvRelease, language), language); } catch (Exception e) { String displayName = StringUtils.defaultIfBlank(tvRelease.originalName, tvRelease.name); - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(subtitleSource.name, TvRelease.formatName(displayName, tvRelease.season, tvRelease.firstEpisodeNumber), e.getMessage()), e); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java index 681222d4..b622b488 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java @@ -11,8 +11,8 @@ public final class MovieRelease extends Release { @var String name; @var Integer year; - @var int imdbId; - @var int tvdbId; + private int imdbId; + private int tvdbId; public interface MovieReleaseBuilderName { MovieReleaseBuilderOther name(String name); @@ -60,17 +60,25 @@ private MovieRelease(Path file, String description, String releaseGroup, String } public String getImdbIdAsString() { - return "tt" + String.format("%07d", imdbId); + return String.format("tt%07d", imdbId); } public OptionalInt getTvdbId() { return tvdbId == 0 ? OptionalInt.empty() : OptionalInt.of(tvdbId); } + public void setTvdbId(int tvdbId) { + this.tvdbId = tvdbId; + } + public OptionalInt getImdbId() { return imdbId == 0 ? OptionalInt.empty() : OptionalInt.of(imdbId); } + public void setImdbId(int imdbId) { + this.imdbId = imdbId; + } + @Override public String toString() { return "${getClass().getSimpleName()}: $name ${quality} ${releaseGroup}"; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java index 82a3100b..8cd9d43e 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Release.java @@ -9,9 +9,10 @@ import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; -public abstract sealed class Release extends Video permits MovieRelease, TvRelease { +public abstract sealed class Release permits MovieRelease, TvRelease { private final Set matchingSubsSet = new HashSet<>(); + @val VideoType videoType; @val Path filePath; @val String quality; @val String description; @@ -29,8 +30,8 @@ public int getMatchingSubCount() { return matchingSubsSet.size(); } - protected Release(VideoType videoFileType, Path filePath, String description, String releaseGroup, String quality) { - super(videoFileType); + protected Release(VideoType videoType, Path filePath, String description, String releaseGroup, String quality) { + this.videoType = videoType; this.filePath = filePath; this.description = description; this.releaseGroup = releaseGroup; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java deleted file mode 100755 index 7b826411..00000000 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/Video.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.lodder.subtools.sublibrary.model; - -import manifold.ext.props.rt.api.val; - -public abstract sealed class Video permits Release { - - @val VideoType videoType; - - Video(VideoType videoType) { - this.videoType = videoType; - } -} From cb7f315125a72bad6681d972fdcdf1523ad6e2e2 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 22:40:30 +0100 Subject: [PATCH 35/54] changes --- .../gui/dialog/MappingEpisodeNameDialog.java | 12 +++++------- .../panels/preference/SerieProvidersPanel.java | 3 +-- .../subtitleproviders/Local.java | 8 ++------ .../subtitleproviders/SubtitleApi.java | 3 ++- .../adapters/JAddic7edViaProxyAdapter.java | 2 +- .../addic7ed/JAddic7edApi.java | 18 ++++++++---------- .../gestdown/JAddic7edProxyGestdownApi.java | 10 ++++------ .../opensubtitles/OpenSubtitlesApi.java | 11 ++++------- .../podnapisi/JPodnapisiApi.java | 14 ++++++-------- .../subscene/SubsceneApi.java | 14 ++++++-------- .../tvsubtitles/JTVSubtitlesApi.java | 14 ++++++-------- 11 files changed, 45 insertions(+), 64 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java index 88638673..7dfdb0ba 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java @@ -153,22 +153,20 @@ private static class MappingTableModel extends DefaultTableModel { @val Manager manager; void setMappingType(MappingType mappingType) { - setDataVector(null, new String[]{ mappingType.getNameColumn(), mappingType.getMappingColumn(), - mappingType.getProviderNameColumn() }); - Arrays.stream(mappingType.getSelectionForKeyPrefixList()) + setDataVector(null, new String[]{ mappingType.nameColumn, mappingType.mappingColumn, + mappingType.providerNameColumn }); + Arrays.stream(mappingType.selectionForKeyPrefixList) .flatMap(selectionForKeyPrefix -> MappingType.MAPPING_SUPPLIER.apply(manager, selectionForKeyPrefix) .stream() .map(serieMappingPair -> { SerieMapping serieMapping = serieMappingPair.getValue(); - String name = serieMapping.name; String providerId = serieMapping.providerId == null ? "" : serieMapping.providerId; - String providerName = serieMapping.providerName; if (providerId.contains("/")) { providerId = providerId.substring(providerId.lastIndexOf("/") + 1); } providerId = providerId.replace(".html", ""); - return new Row(serieMappingPair.getKey(), name, providerId, providerName, serieMapping, - selectionForKeyPrefix); + return new Row(serieMappingPair.getKey(), serieMapping.name, providerId, + serieMapping.providerName, serieMapping, selectionForKeyPrefix); })) .sorted(Comparator.comparing( row -> row.serieMapping == null || row.serieMapping.providerName == null ? "zzz" : diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java index 74ca700b..5a7f59d7 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/SerieProvidersPanel.java @@ -72,8 +72,7 @@ public SerieProvidersPanel(SettingsControl settingsCtrl) { // OPENSUBTITLES this.chkSourceOpenSubtitles = new JCheckBox("OpenSubtitles"); - this.chkUserOpenSubtitlesLogin = - new JCheckBox(getText("PreferenceDialog.UseOpenSubtitlesLogin")); + this.chkUserOpenSubtitlesLogin = new JCheckBox(getText("PreferenceDialog.UseOpenSubtitlesLogin")); PanelCheckBox.checkbox(chkSourceOpenSubtitles).panelOnNewLine().addTo(titlePanel, "wrap") .addComponent(PanelCheckBox.checkbox(chkUserOpenSubtitlesLogin).panelOnNewLine() .panelLayout(new MigLayout("insets 0, novisualpadding")).build() diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index a9eaa555..3f2d4d27 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -42,6 +42,7 @@ public class Local implements SubtitleProvider { private final Settings settings; private final UserInteractionHandler userInteractionHandler; @val @override Manager manager; + @val @override SubtitleSource subtitleSource = SubtitleSource.LOCAL; public Local(Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { this.settings = settings; @@ -49,11 +50,6 @@ public Local(Settings settings, Manager manager, UserInteractionHandler userInte this.userInteractionHandler = userInteractionHandler; } - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.LOCAL; - } - private List getPossibleSubtitles(String filter) { return settings.localSourcesFolders.stream() .flatMap(local -> getAllSubtitlesFiles(local, filter).stream()) @@ -173,7 +169,7 @@ private List getAllSubtitlesFiles(Path dir, String filter) { @Override public String getProviderName() { - return getSubtitleSource().name(); + return subtitleSource.name(); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleApi.java index 78a2f4e1..d6b75efa 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleApi.java @@ -1,9 +1,10 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.model.SubtitleSource; public interface SubtitleApi { - SubtitleSource getSubtitleSource(); + @val SubtitleSource subtitleSource; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index 5bedfbc9..6346214c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -83,7 +83,7 @@ public Set searchSerieSubtitles(TvRelease tvRelease, Language language .execute() .stream(); } catch (ApiException e) { - LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(getSubtitleSource().name, + LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(subtitleSource.name, TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), e.getMessage()), e); return Stream.empty(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java index 40205734..d97079ad 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java @@ -13,6 +13,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -38,6 +40,7 @@ public class JAddic7edApi extends Html implements SubtitleApi { private static final Pattern VERSION_PATTERN = Pattern.compile("Version (.+), Duration: ([0-9]+).([0-9])+"); private final boolean speedy; private LocalDateTime lastRequest = LocalDateTime.now(); + @val @override SubtitleSource subtitleSource = SubtitleSource.ADDIC7ED; public JAddic7edApi(boolean speedy, Manager manager) { super(manager, "Mozilla/5.25 Netscape/5.0 (Windows; I; Win95)"); @@ -79,7 +82,7 @@ public List getProviderId(String serieName) throws Addic7edExce List providerSerieIdsFormatted = providerSerieIds.stream().filter(providerId -> { String formattedSerieName = providerId.name.replaceAll("[^A-Za-z]", ""); return StringUtils.containsIgnoreCase(serieNameFormatted, formattedSerieName) || - StringUtils.containsIgnoreCase(formattedSerieName, serieNameFormatted); + StringUtils.containsIgnoreCase(formattedSerieName, serieNameFormatted); }).toList(); return !providerSerieIdsFormatted.isEmpty() ? providerSerieIdsFormatted : providerSerieIds; } catch (Exception e) { @@ -103,7 +106,7 @@ public List getSubtitles(SerieMapping addic7edSerieM throws Addic7edException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), + .key("%s-subtitles-%s-%s-%s-%s".formatted(subtitleSource.name(), addic7edSerieMapping.providerId, season, episode, language)) .collectionSupplier(Addic7edSubtitleDescriptor.class, () -> { @@ -165,7 +168,7 @@ public List getSubtitles(SerieMapping addic7edSerieM // incomplete not wanted if ((lang != null && td.toString().toLowerCase().contains("completed")) - && td.html().toLowerCase().contains("% completed")) { + && td.html().toLowerCase().contains("% completed")) { lang = null; } @@ -203,8 +206,8 @@ public List getSubtitles(SerieMapping addic7edSerieM public boolean isDuplicate(List lSubtitles, Addic7edSubtitleDescriptor sub) { return lSubtitles.stream() .anyMatch(s -> s.getLanguage() == sub.getLanguage() - && StringUtils.equals(s.getUrl(), sub.getUrl()) - && StringUtils.equals(s.getVersion(), sub.getVersion())); + && StringUtils.equals(s.getUrl(), sub.getUrl()) + && StringUtils.equals(s.getVersion(), sub.getVersion())); } private Optional getContent(String url) throws Addic7edException { @@ -233,9 +236,4 @@ private Optional getContent(String url, Predicate emptyResultP throw new Addic7edException(e); } } - - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.ADDIC7ED; - } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java index a057a2a6..8fb6626e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java @@ -6,6 +6,8 @@ import java.util.UUID; import extensions.java.lang.String.StringExt; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.gestdown.api.SubtitlesApi; import org.gestdown.api.TvShowsApi; import org.gestdown.invoker.ApiException; @@ -30,6 +32,7 @@ public class JAddic7edProxyGestdownApi extends Html implements SubtitleApi { private final TvShowsApi tvShowsApi; private final SubtitlesApi subtitlesApi; + @val @override SubtitleSource subtitleSource = SubtitleSource.ADDIC7ED; public JAddic7edProxyGestdownApi(Manager manager) { super(manager); @@ -51,7 +54,7 @@ public Set getSubtitles(SerieMapping providerSerieId, int season, int throws ApiException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.providerId, + .key("%s-subtitles-%s-%s-%s-%s".formatted(subtitleSource.name(), providerSerieId.providerId, season, episode, language)) .collectionSupplier(Subtitle.class, () -> { Set results = new HashSet<>(); @@ -85,9 +88,4 @@ private Subtitle mapToSubtitle(SubtitleDto sub, EpisodeDto episodedto, Language public String getDownloadUrl(String subtitleId) { return DOMAIN + subtitleId; } - - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.ADDIC7ED; - } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java index 3721d81a..c3427edc 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java @@ -4,6 +4,7 @@ import java.nio.charset.StandardCharsets; import java.util.List; +import manifold.ext.props.rt.api.override; import manifold.ext.props.rt.api.val; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleApi; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.exception.OpenSubtitlesException; @@ -20,9 +21,10 @@ public class OpenSubtitlesApi implements SubtitleApi { - private static final String APIKEY = "lNNp0yv0ah8gytkmYPbHwuaATJqr4rS9"; + private static final String APIKEY = "3IlyaP0KNv6QmJ1gOBX8IXwzD1P9b8c0";//"lNNp0yv0ah8gytkmYPbHwuaATJqr4rS9"; private static final ApiClient API_CLIENT; @val Manager manager; + @val @override SubtitleSource subtitleSource = SubtitleSource.OPENSUBTITLES; static { API_CLIENT = new ApiClient(); @@ -71,7 +73,7 @@ public List getProviderSerieIds(String serieName) throws Op try { return manager.getPageContentBuilder() .url("https://www.opensubtitles.org/libs/suggest.php?format=json3&MovieName=" - + URLEncoder.encode(serieName.toLowerCase(), StandardCharsets.UTF_8)) + + URLEncoder.encode(serieName.toLowerCase(), StandardCharsets.UTF_8)) .userAgent("") .cacheType(CacheType.MEMORY) .retries(1) @@ -88,9 +90,4 @@ public List getProviderSerieIds(String serieName) throws Op throw new OpenSubtitlesException(e); } } - - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.OPENSUBTITLES; - } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java index 9e2c517f..1354aa52 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java @@ -13,6 +13,8 @@ import java.util.function.Function; import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleApi; @@ -33,6 +35,7 @@ public class JPodnapisiApi implements SubtitleApi { private final Manager manager; private final String userAgent; private LocalDateTime nextCheck; + @val @override SubtitleSource subtitleSource = SubtitleSource.PODNAPISI; public Optional getPodnapisiShowName(String showName) throws PodnapisiException { String url = DOMAIN + "/sl/ppodnapisi/search?sK=" + showName.trim().toLowerCase().urlEncode(); @@ -60,7 +63,7 @@ private List getSubtitles(SerieMapping providerSeri throws PodnapisiException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name(), providerSerieId.providerId, + .key("%s-subtitles-%s-%s-%s-%s".formatted(subtitleSource.name(), providerSerieId.providerId, season, episode, language)) .collectionSupplier(PodnapisiSubtitleDescriptor.class, () -> { try { @@ -99,8 +102,8 @@ protected Document getXml(String url) throws PodnapisiException { try { return manager.getPageContentBuilder().url(url).userAgent(userAgent).cacheType(CacheType.MEMORY).retries(1) .retryPredicate(e -> e instanceof HttpClientException httpClientException && - httpClientException.getResponseCode() >= 500 - && httpClientException.getResponseCode() < 600) + httpClientException.getResponseCode() >= 500 + && httpClientException.getResponseCode() < 600) .retryWait(5).getAsJsoupDocument(); } catch (Exception e) { throw new PodnapisiException(e); @@ -125,11 +128,6 @@ private PodnapisiSubtitleDescriptor parsePodnapisiSubtitle(Element elem) { .build(); } - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.PODNAPISI; - } - private Language languageIdToLanguage(String languageId) { return PODNAPISI_LANGS.entrySet() .stream() diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java index 5ff5d63c..171b7c66 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java @@ -18,6 +18,8 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.jsoup.nodes.Document; @@ -55,6 +57,7 @@ public class SubsceneApi extends Html implements SubtitleApi { private boolean selectedIncludeHearingImpaired; private LocalDateTime lastRequest = LocalDateTime.now(); + @val @override SubtitleSource subtitleSource = SubtitleSource.SUBSCENE; public SubsceneApi(Manager manager) { super(manager, "Mozilla/5.25 Netscape/5.0 (Windows; I; Win95)"); @@ -98,7 +101,7 @@ public List getSubtitles(SerieMapping providerSerieI Language language) throws SubsceneException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(getSubtitleSource().name, providerSerieId.providerId, season, + .key("%s-subtitles-%s-%s-%s-%s".formatted(subtitleSource.name, providerSerieId.providerId, season, episode, language)) .collectionSupplier(SubsceneSubtitleDescriptor.class, () -> { setLanguageWithCookie(language); @@ -115,8 +118,8 @@ public List getSubtitles(SerieMapping providerSerieI .setUploader(row.select(".a5 > a").text().trim()) .setComment(row.select(".a6 > div").text().trim())) .filter(subDescriptor -> subDescriptor.getSeasonEpisode() != null && - subDescriptor.getSeasonEpisode().episodes.stream() - .anyMatch(ep -> ep == episode)) + subDescriptor.getSeasonEpisode().episodes.stream() + .anyMatch(ep -> ep == episode)) .toList(); } catch (Exception e) { throw new SubsceneException(e); @@ -171,11 +174,6 @@ private void addCookie(String cookieName, String cookieValue) { manager.storeCookies("subscene.com", Map.of(cookieName, cookieValue)); } - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.SUBSCENE; - } - private static final Map SUBSCENE_LANGS = Collections.unmodifiableMap(new EnumMap<>(Language.class) { @Serial private static final long serialVersionUID = 2950169212654074275L; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index 06051097..a551e5c5 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -9,6 +9,8 @@ import java.util.function.BiPredicate; import java.util.function.Function; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -28,6 +30,7 @@ public class JTVSubtitlesApi extends Html implements SubtitleApi { private static final String DOMAIN = "https://www.tvsubtitles.net"; private static final String SERIE_URL_PREFIX = DOMAIN + "/"; + @val @override SubtitleSource subtitleSource = SubtitleSource.TVSUBTITLES; public JTVSubtitlesApi(Manager manager) { super(manager); @@ -59,7 +62,7 @@ private Set getSubtitles(String episodeUrl, Langu throws TvSubtitlesException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s".formatted(getSubtitleSource().name(), episodeUrl, language)) + .key("%s-subtitles-%s-%s".formatted(subtitleSource.name(), episodeUrl, language)) .collectionSupplier(TVsubtitlesSubtitleDescriptor.class, () -> { Set lSubtitles = new HashSet<>(); try { @@ -124,7 +127,7 @@ private Set getSubtitles(String episodeUrl, Langu private Optional getEpisodeUrl(String showUrl, int season, int episode) throws TvSubtitlesException { return manager.valueBuilder() .memoryCache() - .key("%s-episodeUrl-%s-%s-%s".formatted(getSubtitleSource().name(), showUrl, season, episode)) + .key("%s-episodeUrl-%s-%s-%s".formatted(subtitleSource.name(), showUrl, season, episode)) .optionalSupplier(() -> { try { String formattedSeasonEpisode = @@ -138,7 +141,7 @@ private Optional getEpisodeUrl(String showUrl, int season, int episode) .map(element -> formattedSeasonEpisode.equals(element.text())) .orElse(false)) .map(element -> DOMAIN + "/" + - element.select("td").get(1).selectFirst("a").attr("href")) + element.select("td").get(1).selectFirst("a").attr("href")) .findAny(); } catch (Exception e) { throw new TvSubtitlesException(e); @@ -146,9 +149,4 @@ private Optional getEpisodeUrl(String showUrl, int season, int episode) }) .getOptional(); } - - @Override - public SubtitleSource getSubtitleSource() { - return SubtitleSource.TVSUBTITLES; - } } From d2625616a7a3a79a78ab4515b194449e5355cdaa Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 23:30:41 +0100 Subject: [PATCH 36/54] opensubtitle api update --- .../adapters/JOpenSubAdapter.java | 7 +- .../opensubtitles/DownloadSubtitle.java | 3 +- .../opensubtitles/OpenSubtitlesApi.java | 5 +- .../opensubtitles/SearchSubtitles.java | 4 +- .../resources/opensubtitles/open-api.json | 7565 ++++++++++++----- 5 files changed, 5681 insertions(+), 1903 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index 5bfdb96e..b2e3a4bf 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -27,8 +27,8 @@ import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.model.TvRelease; import org.lodder.subtools.sublibrary.util.lazy.LazySupplier; -import org.opensubtitles.model.Latest200ResponseDataInnerAttributesFilesInner; import org.opensubtitles.model.SubtitleAttributes; +import org.opensubtitles.model.SubtitleAttributesFilesInner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -125,13 +125,12 @@ public Set convertToSubtitles(TvRelease tvRelease, Collection attributes.getFiles().stream().filter(file -> { String subFileName = file.getFileName().replaceAll("[^A-Za-z]", "").toLowerCase(); return subFileName.contains(name) || - (StringUtils.isNotBlank(originalName) && subFileName.contains(originalName)); + (StringUtils.isNotBlank(originalName) && subFileName.contains(originalName)); }).map(file -> createSubtitle(file, attributes))) .collect(Collectors.toSet()); } - private Subtitle createSubtitle(Latest200ResponseDataInnerAttributesFilesInner file, - SubtitleAttributes attributes) { + private Subtitle createSubtitle(SubtitleAttributesFilesInner file, SubtitleAttributes attributes) { return Subtitle.downloadSource( () -> getApi().downloadSubtitle().fileId(file.getFileId().intValue()).download().getLink()) .subtitleSource(subtitleSource) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/DownloadSubtitle.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/DownloadSubtitle.java index 7c93701d..147273fd 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/DownloadSubtitle.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/DownloadSubtitle.java @@ -19,7 +19,8 @@ public class DownloadSubtitle extends OpenSubtitlesExecuter { public Download200Response download() throws OpenSubtitlesException { try { - return execute(() -> new DownloadApi(apiClient).download(new DownloadRequest().fileId(fileId))); + return execute(() -> new DownloadApi(apiClient).download("SubTools", + new DownloadRequest().fileId(fileId))); } catch (Exception e) { throw new OpenSubtitlesException(e); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java index c3427edc..23bcd784 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java @@ -23,6 +23,7 @@ public class OpenSubtitlesApi implements SubtitleApi { private static final String APIKEY = "3IlyaP0KNv6QmJ1gOBX8IXwzD1P9b8c0";//"lNNp0yv0ah8gytkmYPbHwuaATJqr4rS9"; private static final ApiClient API_CLIENT; + private static final String USER_AGENT = "SubTools"; @val Manager manager; @val @override SubtitleSource subtitleSource = SubtitleSource.OPENSUBTITLES; @@ -43,7 +44,7 @@ public OpenSubtitlesApi(Manager manager, String userName, String password) throw public void login(String userName, String password) throws OpenSubtitlesException { try { Login200Response loginResponse = - new AuthenticationApi(API_CLIENT).login("application/json", + new AuthenticationApi(API_CLIENT).login("application/json", USER_AGENT, new LoginRequest().username(userName).password(password)); API_CLIENT.setBearerToken(loginResponse.getToken()); } catch (ApiException e) { @@ -53,7 +54,7 @@ public void login(String userName, String password) throws OpenSubtitlesExceptio public static boolean isValidCredentials(String userName, String password) { try { - new AuthenticationApi(API_CLIENT).login("application/json", + new AuthenticationApi(API_CLIENT).login("application/json", USER_AGENT, new LoginRequest().username(userName).password(password)); return true; } catch (ApiException e) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java index 9fcedb96..4d9f0095 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java @@ -76,6 +76,8 @@ public class SearchSubtitles extends OpenSubtitlesExecuter { private Integer year; + private String userAgent = "SubTools"; // should be set + public Subtitles200Response searchSubtitles() throws OpenSubtitlesException { return manager.valueBuilder() .cacheType(CacheType.MEMORY) @@ -92,7 +94,7 @@ public Subtitles200Response searchSubtitles() throws OpenSubtitlesException { getValue(machineTranslated), getValue(aiTranslated), orderBy == null ? null : orderBy.paramName, getValue(orderDirection), parentFeatureId, parentImdbId, parentTmdbId, season, episode, year, - getValue(movieHashMatch), page)); + getValue(movieHashMatch), page, userAgent)); } catch (Exception e) { throw new OpenSubtitlesException(e); } diff --git a/MultiSubDownloader/src/main/resources/opensubtitles/open-api.json b/MultiSubDownloader/src/main/resources/opensubtitles/open-api.json index bf7b724f..9e0483ae 100644 --- a/MultiSubDownloader/src/main/resources/opensubtitles/open-api.json +++ b/MultiSubDownloader/src/main/resources/opensubtitles/open-api.json @@ -1,2067 +1,5842 @@ { - "openapi": "3.0.3", - "info": { - "title": "OpenSubtitles API", - "description": "Explore subtitles API here", - "contact": { - "name": "OpenSubtitles API Support", - "url": "http://www.opensubtitles.com/en/contact/", - "email": "support@opensubtitles.org" - }, - "license": { - "name": "MIT", - "url": "https://opensource.org/licenses/MIT" - }, - "version": "1.0.1" + "openapi": "3.0.3", + "info": { + "title": "OpenSubtitles API", + "description": "Explore subtitles API here", + "contact": { + "name": "OpenSubtitles API Support", + "url": "https://www.opensubtitles.com/en/contact/", + "email": "support@opensubtitles.org" }, - "servers": [ - { - "url": "https://api.opensubtitles.com/api/v1" - } - ], - "tags": [ - { - "name": "Infos", - "description": "General API infos" - }, - { - "name": "Authentication", - "description": "Authentification of user" - }, - { - "name": "Discover", - "description": "Discover popular, latest and most downloaded subtitles" - }, - { - "name": "Download", - "description": "Download of subtitles" - }, - { - "name": "Subtitles", - "description": "Subtitles search for a specific release" - }, - { - "name": "Features", - "description": "Search for feature" - }, - { - "name": "Utilities", - "description": "Various utilities" - } - ], - "paths": { - "/login": { - "post": { - "tags": [ - "Authentication" - ], - "summary": "Login", - "description": "Create a token to authenticate a user. If response code is ```401 Unathorized``` stop sending further requests with same credentials.\n\nRequest limit is set 1 request per 1 second.", - "operationId": "login", - "parameters": [ - { - "name": "Content-Type", - "in": "header", - "description": "application/json", - "required": true, - "schema": { - "type": "string", - "default": "application/json" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "required": [ - "password", - "username" - ], - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - } - }, - "description": "" - } - } - }, - "required": false + "license": { + "name": "MIT", + "url": "https://opensource.org/licenses/MIT" + }, + "version": "1.0.1", + "termsOfService": "https://www.opensubtitles.com/en/tos/" + }, + "servers": [ + { + "url": "https://api.opensubtitles.com/api/v1", + "description": "Default server" + }, + { + "url": "https://vip-api.opensubtitles.com/api/v1", + "description": "VIP server" + } + ], + "tags": [ + { + "name": "Infos", + "description": "General API infos" + }, + { + "name": "Authentication", + "description": "Authentification of user" + }, + { + "name": "Discover", + "description": "Discover popular, latest and most downloaded subtitles" + }, + { + "name": "Download", + "description": "Download of subtitles" + }, + { + "name": "Subtitles", + "description": "Subtitles search for a specific release" + }, + { + "name": "Features", + "description": "Search for feature" + }, + { + "name": "Utilities", + "description": "Various utilities" + } + ], + "paths": { + "/login": { + "post": { + "tags": [ + "Authentication" + ], + "summary": "Login", + "description": "Create a token to authenticate a user. If response code is ```401 Unathorized``` stop sending further requests with the same credentials, login is \"expensive\" operation.\n\nRequest rate limit is 1 request per 1 second.\n\nFurther API requests must continue on returned ```base_url``` host, which can have different cache time for search results and different request rate limits. If ```base_url``` equals ```vip-api.opensubtitles.com``` make sure you always send with every request JWT token (if available), otherwise request might fail with 4xx code.", + "operationId": "login", + "parameters": [ + { + "name": "Content-Type", + "in": "header", + "description": "application/json", + "required": true, + "schema": { + "type": "string", + "default": "application/json" + } + }, + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "x-examples": { + "example": { + "username": "", + "password": "" + } }, - "responses": { - "200": { - "description": "Create session and token", - "content": { - "application/json": { - "schema": { - "required": [ - "status", - "token", - "user" - ], - "type": "object", - "properties": { - "user": { - "required": [ - "allowed_downloads", - "ext_installed", - "level", - "user_id", - "vip" - ], - "type": "object", - "properties": { - "allowed_translations": { - "type": "number" - }, - "allowed_downloads": { - "type": "number" - }, - "level": { - "minLength": 1, - "type": "string" - }, - "user_id": { - "type": "number" - }, - "ext_installed": { - "type": "boolean" - }, - "vip": { - "type": "boolean" - } - } - }, - "token": { - "minLength": 1, - "type": "string" - }, - "status": { - "type": "number" - } - }, - "description": "" - } - } - } - } + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + } }, - "deprecated": false, - "security": [ - { - "Api-Key": [] - } + "required": [ + "username", + "password" ] + } } + }, + "required": false }, - "/logout": { - "delete": { - "tags": [ - "Authentication" - ], - "summary": "Logout", - "description": "Destroy a user token to end a session. Bearer token is required for this endpoint.", - "operationId": "logout", - "responses": { - "200": { - "description": "Destroy session and current token", - "content": { - "application/json": { - "schema": { - "type": "object" - } - } + "responses": { + "200": { + "description": "Create session and token", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "user": { + "type": "object", + "required": [ + "allowed_translations", + "allowed_downloads", + "level", + "user_id", + "ext_installed", + "vip" + ], + "properties": { + "allowed_translations": { + "type": "number" + }, + "allowed_downloads": { + "type": "number" + }, + "level": { + "minLength": 1, + "type": "string", + "example": "VIP Member" + }, + "user_id": { + "type": "number" + }, + "ext_installed": { + "type": "boolean" + }, + "vip": { + "type": "boolean" } - } - }, - "deprecated": false, - "security": [ - { - "Bearer": [] + } }, - { - "Api-Key": [] + "base_url": { + "type": "string", + "format": "hostname", + "default": "api.opensubtitles.com", + "example": "api.opensubtitles.com", + "enum": [ + "api.opensubtitles.com", + "vip-api.opensubtitles.com" + ] + }, + "token": { + "minLength": 1, + "type": "string" + }, + "status": { + "type": "number" } - ] + }, + "required": [ + "user", + "base_url", + "token", + "status" + ] + }, + "example": { + "user": { + "allowed_downloads": 100, + "allowed_translations": 5, + "level": "Sub leecher", + "user_id": 66, + "ext_installed": false, + "vip": false + }, + "base_url": "api.opensubtitles.com", + "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJEOU5aaWUyVjhWOU1hTnJVZWVvcEEwWUNoWEt6Wkx3NiIsImV4cCI6MTYwNDM1ODAwMH0.sMibjAFnkcs-HJ4zhdCwBeGrZ_UvzMbgl5NxYV2uALM", + "status": 200 + } + } } + } }, - "/infos/formats": { - "get": { - "tags": [ - "Infos" - ], - "summary": "Subtitle Formats", - "description": "List subtitle formats recognized by the API ", - "operationId": "formats", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "description": "", - "type": "object", - "properties": { - "data": { - "type": "object", - "required": [ - "output_formats" - ], - "properties": { - "output_formats": { - "type": "array", - "items": {} - } - } - } - }, - "required": [ - "data" - ] - } - } - } - } + "deprecated": false, + "security": [ + { + "Api-Key": [] + } + ] + } + }, + "/logout": { + "delete": { + "tags": [ + "Authentication" + ], + "summary": "Logout", + "description": "Destroy a user token to end a session. Bearer token is required for this endpoint.", + "operationId": "logout", + "responses": { + "200": { + "description": "Destroy session and current token", + "content": { + "application/json": { + "schema": { + "type": "object" }, - "deprecated": false, - "security": [ - { - "Api-Key": [] - } - ] + "example": { + "message": "token successfully destroyed", + "status": 200 + } + } } + } }, - "/infos/languages": { - "get": { - "tags": [ - "Infos" - ], - "summary": "Languages", - "description": "Get the languages information", - "operationId": "languages", - "responses": { - "200": { - "description": "Get the languages table containing the codes and names used through the API", - "content": { - "application/json": { - "schema": { - "required": [ - "data" - ], - "type": "object", - "properties": { - "data": { - "minItems": 1, - "uniqueItems": true, - "type": "array", - "items": { - "required": [ - "language_code", - "language_name" - ], - "type": "object", - "properties": { - "language_code": { - "minLength": 1, - "type": "string" - }, - "language_name": { - "minLength": 1, - "type": "string" - } - } - } - } - }, - "description": "" - } - } + "deprecated": false, + "security": [ + { + "Bearer": [] + }, + { + "Api-Key": [] + } + ], + "parameters": [ + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ] + } + }, + "/infos/formats": { + "get": { + "tags": [ + "Infos" + ], + "summary": "Subtitle Formats", + "description": "List subtitle formats recognized by the API ", + "operationId": "formats", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "description": "", + "type": "object", + "x-examples": { + "example-1": { + "data": { + "output_formats": [ + "srt", + "sub", + "mpl", + "webvtt", + "dfxp", + "txt" + ] + } + } + }, + "properties": { + "data": { + "type": "object", + "required": [ + "output_formats" + ], + "properties": { + "output_formats": { + "type": "array", + "items": {} } + } } + }, + "required": [ + "data" + ] }, - "deprecated": false, - "security": [ - { - "Api-Key": [] + "examples": { + "example": { + "value": { + "data": { + "output_formats": [ + "srt", + "sub", + "mpl", + "webvtt", + "dfxp", + "txt" + ] + } } - ] + } + } + }, + "example": { + "example": { + "data": { + "output_formats": [ + "srt", + "sub", + "mpl", + "webvtt", + "dfxp", + "txt" + ] + }, + "value": { + "data": { + "output_formats": [ + "srt", + "sub", + "mpl", + "webvtt", + "dfxp", + "txt" + ] + } + } + } + } } + } }, - "/infos/user": { - "get": { - "tags": [ - "Infos" - ], - "summary": "User Informations", - "description": "Gather informations about the user authenticated by a bearer token. User information are already sent when user is authenticated, and the remaining downloads is returned with each download, but you can also get these information here.", - "operationId": "userinfo", - "responses": { - "200": { - "description": "Get user data", - "content": { - "application/json": { - "schema": { - "required": [ - "data" - ], - "type": "object", - "properties": { - "data": { - "type": "object", - "properties": { - "allowed_downloads": { - "type": "number" - }, - "level": { - "minLength": 1, - "type": "string" - }, - "user_id": { - "type": "number" - }, - "ext_installed": { - "type": "boolean" - }, - "vip": { - "type": "boolean" - }, - "downloads_count": { - "type": "number" - }, - "remaining_downloads": { - "type": "number" - } - } - } - }, - "description": "" - } - } + "deprecated": false, + "security": [ + { + "Api-Key": [] + } + ], + "parameters": [ + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ] + } + }, + "/infos/languages": { + "get": { + "tags": [ + "Infos" + ], + "summary": "Languages", + "description": "Get the languages information", + "operationId": "languages", + "responses": { + "200": { + "description": "Get the languages table containing the codes and names used through the API", + "content": { + "application/json": { + "schema": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "minItems": 1, + "uniqueItems": true, + "type": "array", + "items": { + "required": [ + "language_code", + "language_name" + ], + "type": "object", + "properties": { + "language_code": { + "minLength": 1, + "type": "string" + }, + "language_name": { + "minLength": 1, + "type": "string" + } } + } } + }, + "description": "" }, - "deprecated": false, - "security": [ + "example": { + "data": [ { - "Bearer": [] + "language_code": "af", + "language_name": "Afrikaans" }, { - "Api-Key": [] - } - ] - } - }, - "/discover/popular": { - "get": { - "tags": [ - "Discover" - ], - "summary": "Popular features", - "description": "Discover popular features on opensubtitles.com, according to last 30 days downloads.", - "operationId": "popular", - "parameters": [ - { - "name": "languages", - "in": "query", - "description": "Language code(s), coma separated (en,fr) or \"all\"", - "schema": { - "type": "string" - } + "language_code": "sq", + "language_name": "Albanian" }, { - "name": "type", - "in": "query", - "description": "Type (movie or tvshow)", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Subtitle" - } - } - } - } - }, - "deprecated": false, - "security": [ + "language_code": "ar", + "language_name": "Arabic" + }, { - "Api-Key": [] - } - ] - } - }, - "/discover/latest": { - "get": { - "tags": [ - "Discover" - ], - "summary": "Latest subtitles", - "description": "Lists 60 latest uploaded subtitles", - "operationId": "latest", - "parameters": [ - { - "name": "languages", - "in": "query", - "description": "Language code(s), coma separated (en,fr) or \"all\"", - "schema": { - "type": "string" - } + "language_code": "an", + "language_name": "Aragonese" }, { - "name": "type", - "in": "query", - "description": "Type (movie or tvshow)", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "required": [ - "data", - "page", - "total_count", - "total_pages" - ], - "type": "object", - "properties": { - "total_pages": { - "type": "number" - }, - "total_count": { - "type": "number" - }, - "page": { - "type": "number" - }, - "data": { - "minItems": 1, - "uniqueItems": true, - "type": "array", - "items": { - "required": [ - "id", - "type" - ], - "type": "object", - "properties": { - "id": { - "minLength": 1, - "type": "string" - }, - "type": { - "minLength": 1, - "type": "string" - }, - "attributes": { - "type": "object", - "properties": { - "subtitle_id": { - "minLength": 1, - "type": "string" - }, - "language": { - "minLength": 1, - "type": "string" - }, - "download_count": { - "type": "number" - }, - "new_download_count": { - "type": "number" - }, - "hearing_impaired": { - "type": "boolean" - }, - "hd": { - "type": "boolean" - }, - "format": { - "type": "object" - }, - "fps": { - "type": "number" - }, - "votes": { - "type": "number" - }, - "points": { - "type": "number" - }, - "ratings": { - "type": "number" - }, - "from_trusted": { - "type": "boolean" - }, - "foreign_parts_only": { - "type": "boolean" - }, - "ai_translated": { - "type": "boolean" - }, - "machine_translated": { - "type": "object" - }, - "upload_date": { - "minLength": 1, - "type": "string" - }, - "release": { - "minLength": 1, - "type": "string" - }, - "legacy_subtitle_id": { - "type": "number" - }, - "uploader": { - "required": [ - "name", - "rank", - "uploader_id" - ], - "type": "object", - "properties": { - "uploader_id": { - "type": "number" - }, - "name": { - "minLength": 1, - "type": "string" - }, - "rank": { - "minLength": 1, - "type": "string" - } - } - }, - "feature_details": { - "type": "object", - "properties": { - "feature_id": { - "type": "number" - }, - "feature_type": { - "minLength": 1, - "type": "string" - }, - "year": { - "type": "number" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "movie_name": { - "minLength": 1, - "type": "string" - }, - "imdb_id": { - "type": "number" - }, - "tmdb_id": { - "type": "object" - } - } - }, - "url": { - "minLength": 1, - "type": "string" - }, - "related_links": { - "required": [ - "img_url", - "label", - "url" - ], - "type": "object", - "properties": { - "label": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - }, - "img_url": { - "minLength": 1, - "type": "string" - } - } - }, - "files": { - "minItems": 1, - "uniqueItems": true, - "type": "array", - "items": { - "required": [ - "cd_number", - "file_id", - "file_name" - ], - "type": "object", - "properties": { - "file_id": { - "type": "number" - }, - "cd_number": { - "type": "number" - }, - "file_name": { - "minLength": 1, - "type": "string" - } - } - } - } - } - } - } - } - } - }, - "description": "" - } - } - } - } - }, - "security": [ + "language_code": "hy", + "language_name": "Armenian" + }, { - "Api-Key": [] - } - ] - } - }, - "/discover/most_downloaded": { - "get": { - "tags": [ - "Discover" - ], - "summary": "Most downloaded subtitles", - "description": "Discover popular subtitles, according to last 30 days downloads on opensubtitles.com. This list can be filtered by language code or feature type (movie, episode)", - "operationId": "most_downloaded", - "parameters": [ - { - "name": "languages", - "in": "query", - "description": "Language code(s), coma separated (en,fr), or \"all\"", - "schema": { - "type": "string" - } + "language_code": "at", + "language_name": "Asturian" }, { - "name": "type", - "in": "query", - "description": "Type (movie or tvshow)", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "Lists most downloaded movie subtitles ", - "content": { - "application/json": { - "schema": { - "type": "object", - "description": "", - "properties": { - "total_pages": { - "type": "number" - }, - "total_count": { - "type": "number" - }, - "page": { - "type": "number" - }, - "data": { - "minItems": 1, - "uniqueItems": true, - "type": "array", - "items": { - "$ref": "#/components/schemas/Subtitle" - } - } - }, - "required": [ - "total_pages", - "total_count", - "page", - "data" - ] - } - } - } - } - }, - "deprecated": false, - "security": [ + "language_code": "eu", + "language_name": "Basque" + }, { - "Api-Key": [] - } - ] - } - }, - "/features": { - "get": { - "tags": [ - "Features" - ], - "summary": "Search for features", - "description": "With the \"query\" parameter, search for a Feature from a simple text input. Typically used for a text search or autocomplete.\n\nWith an ID, get basic information and subtitles count for a specific title.\n\n\n\n> ### Watch Out!\n>\n> If you create an autocomplete, don't set a too small refresh limit, remember you must not go over 40 requests per 10 seconds!", - "operationId": "features", - "parameters": [ - { - "name": "query", - "in": "query", - "description": "query to search, release/file name accepted", - "schema": { - "minLength": 3, - "type": "string" - } + "language_code": "be", + "language_name": "Belarusian" }, { - "name": "type", - "in": "query", - "description": "empty to list all or **movie**, **tvshow** or **episode**.", - "schema": { - "type": "string" - } + "language_code": "bn", + "language_name": "Bengali" }, { - "name": "feature_id", - "in": "query", - "description": "opensubtitles **feature_id**", - "schema": { - "type": "integer" - } + "language_code": "bs", + "language_name": "Bosnian" }, { - "name": "imdb_id", - "in": "query", - "description": "IMDB ID, delete leading zeroes", - "schema": { - "type": "string" - } + "language_code": "br", + "language_name": "Breton" }, { - "name": "tmdb_id", - "in": "query", - "description": "TheMovieDB ID - combine with type to avoid errors", - "schema": { - "type": "string" - } + "language_code": "bg", + "language_name": "Bulgarian" }, { - "name": "year", - "in": "query", - "description": "Filter by year. Can only be used in combination with a query", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Search for a feature", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "movie": { - "$ref": "#/components/schemas/Feature-Movie" - }, - "episode": { - "$ref": "#/components/schemas/Feature-Episode" - }, - "tv": { - "$ref": "#/components/schemas/Feature-Tvshow" - } - }, - "description": "" - } - } - } - } - }, - "deprecated": false, - "security": [ + "language_code": "my", + "language_name": "Burmese" + }, { - "Api-Key": [] - } - ] - } - }, - "/subtitles": { - "get": { - "tags": [ - "Subtitles" - ], - "summary": "Search for subtitles", - "description": "Find subtitle for a video file. All parameters can be combined following various logics: searching by a specific external id (imdb, tmdb), a file moviehash, or a simple text query.\n\n\n> Something wrong? Read about [common mistakes and best practices](docs/2-Best-Practices.md)\n\nImplement the logic that best fit your needs, remembering that:\n- if you can get moviehash from file - send it\n- if you know the ID, IMDB or TMDB, send this rather than a query, an ID will always be more precise\n- if you search for TV show episodes, sending the parent ID, episode and season number will give best results\n- send the filename as query parameter together with the moviehash for better results. If your filenames are generally irrelevant, for example a dynamically generated filename from a streaming service, no need to send it.\n- you can combine all together (send everything what you have and we will take of rest)\n\n\n> Avoid http redirection by sending request parameters sorted and without default values, and send all queries in lowercase. Remove leading zeroes in IMDB ID\n\n### Moviehash \nIf a moviehash is sent with a request, a \"moviehash_match\" boolean field will be added to the response.\n\nThe matching subtitles will always come first in the response.\n\n\n### Ordering\nYou can order the results using the *order_by* parameter. Ordering is possible on the following fields:\n_ language, download_count, new_download_count, hearing_impaired, hd, format, fps, votes, points, ratings, from_trusted, foreign_parts_only, ai_translated, machine_translated, upload_date, release, comments _\n\nChange the order direction with *order_direction* (asc/desc)\n\n", - "operationId": "subtitles", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "ID of the movie or episode", - "schema": { - "type": "integer" - } + "language_code": "ca", + "language_name": "Catalan" }, { - "name": "imdb_id", - "in": "query", - "description": "IMDB ID of the movie or episode", - "schema": { - "type": "integer" - } + "language_code": "zh-cn", + "language_name": "Chinese (simplified)" }, { - "name": "tmdb_id", - "in": "query", - "description": "TMDB ID of the movie or episode", - "schema": { - "type": "integer" - } + "language_code": "cs", + "language_name": "Czech" }, { - "name": "type", - "in": "query", - "description": "movie, episode or all, (default: all) ", - "schema": { - "type": "string" - } + "language_code": "da", + "language_name": "Danish" }, { - "name": "query", - "in": "query", - "description": "file name or text search", - "schema": { - "type": "string" - } + "language_code": "nl", + "language_name": "Dutch" }, { - "name": "languages", - "in": "query", - "description": "Language code(s), coma separated (en,fr)", - "schema": { - "type": "string" - } + "language_code": "en", + "language_name": "English" }, { - "name": "moviehash", - "in": "query", - "description": "Moviehash of the movie", - "schema": { - "maxLength": 16, - "minLength": 16, - "pattern": "^[a-f0-9]{16}$", - "type": "string" - } + "language_code": "eo", + "language_name": "Esperanto" }, { - "name": "user_id", - "in": "query", - "description": "To be used alone - for user uploads listing", - "schema": { - "type": "integer" - } + "language_code": "et", + "language_name": "Estonian" }, { - "name": "hearing_impaired", - "in": "query", - "description": "include, exclude, only. (default: include)", - "schema": { - "type": "string" - } + "language_code": "fi", + "language_name": "Finnish" }, { - "name": "foreign_parts_only", - "in": "query", - "description": "exclude, include, only (default: include)", - "schema": { - "type": "string" - } + "language_code": "fr", + "language_name": "French" }, { - "name": "trusted_sources", - "in": "query", - "description": "include, only (default: include)", - "schema": { - "type": "string" - } + "language_code": "ka", + "language_name": "Georgian" }, { - "name": "machine_translated", - "in": "query", - "description": "exclude, include (default: exclude)", - "schema": { - "type": "string" - } + "language_code": "de", + "language_name": "German" }, { - "name": "ai_translated", - "in": "query", - "description": "exclude, include (default: exclude)", - "schema": { - "type": "string" - } + "language_code": "gl", + "language_name": "Galician" }, { - "name": "order_by", - "in": "query", - "description": "Order of the returned results, accept any of above fields", - "schema": { - "type": "string" - } + "language_code": "el", + "language_name": "Greek" }, { - "name": "order_direction", - "in": "query", - "description": "Order direction of the returned results (asc,desc)", - "schema": { - "type": "string" - } + "language_code": "he", + "language_name": "Hebrew" }, { - "name": "parent_feature_id", - "in": "query", - "description": "For Tvshows", - "schema": { - "type": "integer" - } + "language_code": "hi", + "language_name": "Hindi" }, { - "name": "parent_imdb_id", - "in": "query", - "description": "For Tvshows", - "schema": { - "type": "integer" - } + "language_code": "hr", + "language_name": "Croatian" }, { - "name": "parent_tmdb_id", - "in": "query", - "description": "For Tvshows", - "schema": { - "type": "integer" - } + "language_code": "hu", + "language_name": "Hungarian" }, { - "name": "season_number", - "in": "query", - "description": "For Tvshows\n", - "schema": { - "type": "integer" - } + "language_code": "is", + "language_name": "Icelandic" }, { - "name": "episode_number", - "in": "query", - "description": "For Tvshows", - "schema": { - "type": "integer" - } + "language_code": "id", + "language_name": "Indonesian" }, { - "name": "year", - "in": "query", - "description": "Filter by movie/episode year", - "schema": { - "type": "integer" - } + "language_code": "it", + "language_name": "Italian" }, { - "name": "moviehash_match", - "in": "query", - "description": "include, only (default: include)", - "schema": { - "type": "string" - } + "language_code": "ja", + "language_name": "Japanese" }, { - "name": "page", - "in": "query", - "description": "Results page to display", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Find subtitles for a video file ", - "content": { - "application/json": { - "schema": { - "type": "object", - "description": "", - "properties": { - "total_pages": { - "type": "number" - }, - "total_count": { - "type": "number" - }, - "page": { - "type": "number" - }, - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Subtitle" - } - } - }, - "required": [ - "total_pages", - "total_count", - "page", - "data" - ] - } - } - } - } - }, - "deprecated": false, - "security": [ + "language_code": "kk", + "language_name": "Kazakh" + }, { - "Api-Key": [] - } - ] - } - }, - "/download": { - "post": { - "tags": [ - "Download" - ], - "summary": "Download", - "description": "Request a download url for a subtitle. \n\n\n> The download count is calculated on this action, not the file download itself\n\n> IN and OUT FPS must be indicated for subtitle conversions, we want to make sure you know what you are doing, and therefore collected the current FPS from the subtitle search result, or calculated it somehow.\n\n\n\n> The download URL is temporary, and cannot be used more than 3 hours, so do not cache it, but you can download the file more than once if needed.", - "operationId": "download", - "parameters": [], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "description": "", - "properties": { - "file_id": { - "type": "integer", - "description": "file_id from /subtitles search results", - "format": "int32", - "example": 123 - }, - "sub_format": { - "type": "string", - "description": "from /infos/formats" - }, - "file_name": { - "type": "string", - "description": "desired file name" - }, - "in_fps": { - "type": "number", - "description": "used for conversions, in_fps and out_fps must then be indicated" - }, - "out_fps": { - "type": "number", - "description": "used for conversions, in_fps and out_fps must then be indicated" - }, - "timeshift": { - "type": "number", - "description": "" - }, - "force_download": { - "type": "boolean", - "description": "(1/0) set subtitle file headers to \"application/force-download\"" - } - }, - "required": [ - "file_id" - ] - } - } + "language_code": "km", + "language_name": "Khmer" }, - "required": false, - "description": "" - }, - "responses": { - "200": { - "description": "Request a download url for a subtitle. \n", - "content": { - "application/json": { - "schema": { - "description": "", - "type": "object", - "properties": { - "link": { - "type": "string", - "minLength": 1 - }, - "file_name": { - "type": "string", - "minLength": 1 - }, - "requests": { - "type": "number" - }, - "remaining": { - "type": "number" - }, - "message": { - "type": "string", - "minLength": 1 - }, - "reset_time": { - "type": "string", - "minLength": 1 - }, - "reset_time_utc": { - "type": "string", - "minLength": 1 - } - } - } - } - } - } - }, - "deprecated": false, - "security": [ { - "Bearer": [] + "language_code": "ko", + "language_name": "Korean" }, { - "Api-Key": [] - } - ], - "x-codegen-request-body-name": "body" - }, - "parameters": [] - }, - "/utilities/guessit": { - "get": { - "tags": [ - "Utilities" - ], - "summary": "Guessit", - "description": "Extracts as much information as possible from a video filename.\n\nIt has a very powerful matcher that allows to guess properties from a video using its filename only. This matcher works with both movies and tv shows episodes.\n\nThis is a simple implementation of the python guessit library.\nhttps://doc.guessit.io\n\nFind examples of the returned data.\nhttps://doc.guessit.io/properties/", - "operationId": "guessit", - "parameters": [ - { - "name": "filename", - "in": "query", - "description": "File name", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "title": { - "minLength": 1, - "type": "string" - }, - "year": { - "type": "number" - }, - "language": { - "minLength": 1, - "type": "string" - }, - "subtitle_language": { - "minLength": 1, - "type": "string" - }, - "screen_size": { - "minLength": 1, - "type": "string" - }, - "streaming_service": { - "minLength": 1, - "type": "string" - }, - "source": { - "minLength": 1, - "type": "string" - }, - "other": { - "minLength": 1, - "type": "string" - }, - "audio_codec": { - "minLength": 1, - "type": "string" - }, - "audio_channels": { - "minLength": 1, - "type": "string" - }, - "video_codec": { - "minLength": 1, - "type": "string" - }, - "release_group": { - "minLength": 1, - "type": "string" - }, - "type": { - "minLength": 1, - "type": "string" - } - }, - "description": "" - } - } - } - } - }, - "security": [ + "language_code": "lv", + "language_name": "Latvian" + }, { - "Api-Key": [] - } - ] + "language_code": "lt", + "language_name": "Lithuanian" + }, + { + "language_code": "lb", + "language_name": "Luxembourgish" + }, + { + "language_code": "mk", + "language_name": "Macedonian" + }, + { + "language_code": "ml", + "language_name": "Malayalam" + }, + { + "language_code": "ms", + "language_name": "Malay" + }, + { + "language_code": "ma", + "language_name": "Manipuri" + }, + { + "language_code": "mn", + "language_name": "Mongolian" + }, + { + "language_code": "no", + "language_name": "Norwegian" + }, + { + "language_code": "oc", + "language_name": "Occitan" + }, + { + "language_code": "fa", + "language_name": "Persian" + }, + { + "language_code": "pl", + "language_name": "Polish" + }, + { + "language_code": "pt-pt", + "language_name": "Portuguese" + }, + { + "language_code": "ru", + "language_name": "Russian" + }, + { + "language_code": "sr", + "language_name": "Serbian" + }, + { + "language_code": "si", + "language_name": "Sinhalese" + }, + { + "language_code": "sk", + "language_name": "Slovak" + }, + { + "language_code": "sl", + "language_name": "Slovenian" + }, + { + "language_code": "es", + "language_name": "Spanish" + }, + { + "language_code": "sw", + "language_name": "Swahili" + }, + { + "language_code": "sv", + "language_name": "Swedish" + }, + { + "language_code": "sy", + "language_name": "Syriac" + }, + { + "language_code": "ta", + "language_name": "Tamil" + }, + { + "language_code": "te", + "language_name": "Telugu" + }, + { + "language_code": "tl", + "language_name": "Tagalog" + }, + { + "language_code": "th", + "language_name": "Thai" + }, + { + "language_code": "tr", + "language_name": "Turkish" + }, + { + "language_code": "uk", + "language_name": "Ukrainian" + }, + { + "language_code": "ur", + "language_name": "Urdu" + }, + { + "language_code": "uz", + "language_name": "Uzbek" + }, + { + "language_code": "vi", + "language_name": "Vietnamese" + }, + { + "language_code": "ro", + "language_name": "Romanian" + }, + { + "language_code": "pt-br", + "language_name": "Portuguese (Brazilian)" + }, + { + "language_code": "me", + "language_name": "Montenegrin" + }, + { + "language_code": "zh-tw", + "language_name": "Chinese (traditional)" + }, + { + "language_code": "ze", + "language_name": "Chinese bilingual" + } + ] + } + }, + "example": { + "example": { + "data": [ + { + "language_code": "af", + "language_name": "Afrikaans" + }, + { + "language_code": "sq", + "language_name": "Albanian" + }, + { + "language_code": "ar", + "language_name": "Arabic" + }, + { + "language_code": "an", + "language_name": "Aragonese" + }, + { + "language_code": "hy", + "language_name": "Armenian" + }, + { + "language_code": "at", + "language_name": "Asturian" + }, + { + "language_code": "eu", + "language_name": "Basque" + }, + { + "language_code": "be", + "language_name": "Belarusian" + }, + { + "language_code": "bn", + "language_name": "Bengali" + }, + { + "language_code": "bs", + "language_name": "Bosnian" + }, + { + "language_code": "br", + "language_name": "Breton" + }, + { + "language_code": "bg", + "language_name": "Bulgarian" + }, + { + "language_code": "my", + "language_name": "Burmese" + }, + { + "language_code": "ca", + "language_name": "Catalan" + }, + { + "language_code": "zh-cn", + "language_name": "Chinese (simplified)" + }, + { + "language_code": "cs", + "language_name": "Czech" + }, + { + "language_code": "da", + "language_name": "Danish" + }, + { + "language_code": "nl", + "language_name": "Dutch" + }, + { + "language_code": "en", + "language_name": "English" + }, + { + "language_code": "eo", + "language_name": "Esperanto" + }, + { + "language_code": "et", + "language_name": "Estonian" + }, + { + "language_code": "fi", + "language_name": "Finnish" + }, + { + "language_code": "fr", + "language_name": "French" + }, + { + "language_code": "ka", + "language_name": "Georgian" + }, + { + "language_code": "de", + "language_name": "German" + }, + { + "language_code": "gl", + "language_name": "Galician" + }, + { + "language_code": "el", + "language_name": "Greek" + }, + { + "language_code": "he", + "language_name": "Hebrew" + }, + { + "language_code": "hi", + "language_name": "Hindi" + }, + { + "language_code": "hr", + "language_name": "Croatian" + }, + { + "language_code": "hu", + "language_name": "Hungarian" + }, + { + "language_code": "is", + "language_name": "Icelandic" + }, + { + "language_code": "id", + "language_name": "Indonesian" + }, + { + "language_code": "it", + "language_name": "Italian" + }, + { + "language_code": "ja", + "language_name": "Japanese" + }, + { + "language_code": "kk", + "language_name": "Kazakh" + }, + { + "language_code": "km", + "language_name": "Khmer" + }, + { + "language_code": "ko", + "language_name": "Korean" + }, + { + "language_code": "lv", + "language_name": "Latvian" + }, + { + "language_code": "lt", + "language_name": "Lithuanian" + }, + { + "language_code": "lb", + "language_name": "Luxembourgish" + }, + { + "language_code": "mk", + "language_name": "Macedonian" + }, + { + "language_code": "ml", + "language_name": "Malayalam" + }, + { + "language_code": "ms", + "language_name": "Malay" + }, + { + "language_code": "ma", + "language_name": "Manipuri" + }, + { + "language_code": "mn", + "language_name": "Mongolian" + }, + { + "language_code": "no", + "language_name": "Norwegian" + }, + { + "language_code": "oc", + "language_name": "Occitan" + }, + { + "language_code": "fa", + "language_name": "Persian" + }, + { + "language_code": "pl", + "language_name": "Polish" + }, + { + "language_code": "pt-pt", + "language_name": "Portuguese" + }, + { + "language_code": "ru", + "language_name": "Russian" + }, + { + "language_code": "sr", + "language_name": "Serbian" + }, + { + "language_code": "si", + "language_name": "Sinhalese" + }, + { + "language_code": "sk", + "language_name": "Slovak" + }, + { + "language_code": "sl", + "language_name": "Slovenian" + }, + { + "language_code": "es", + "language_name": "Spanish" + }, + { + "language_code": "sw", + "language_name": "Swahili" + }, + { + "language_code": "sv", + "language_name": "Swedish" + }, + { + "language_code": "sy", + "language_name": "Syriac" + }, + { + "language_code": "ta", + "language_name": "Tamil" + }, + { + "language_code": "te", + "language_name": "Telugu" + }, + { + "language_code": "tl", + "language_name": "Tagalog" + }, + { + "language_code": "th", + "language_name": "Thai" + }, + { + "language_code": "tr", + "language_name": "Turkish" + }, + { + "language_code": "uk", + "language_name": "Ukrainian" + }, + { + "language_code": "ur", + "language_name": "Urdu" + }, + { + "language_code": "uz", + "language_name": "Uzbek" + }, + { + "language_code": "vi", + "language_name": "Vietnamese" + }, + { + "language_code": "ro", + "language_name": "Romanian" + }, + { + "language_code": "pt-br", + "language_name": "Portuguese (Brazilian)" + }, + { + "language_code": "me", + "language_name": "Montenegrin" + }, + { + "language_code": "zh-tw", + "language_name": "Chinese (traditional)" + }, + { + "language_code": "ze", + "language_name": "Chinese bilingual" + }, + { + "language_code": "se", + "language_name": "Northern Sami" + } + ] + } + } + } + } + }, + "deprecated": false, + "security": [ + { + "Api-Key": [] + } + ], + "parameters": [ + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ] + } + }, + "/infos/user": { + "get": { + "tags": [ + "Infos" + ], + "summary": "User Informations", + "description": "Gather informations about the user authenticated by a bearer token. User information are already sent when user is authenticated, and the remaining downloads is returned with each download, but you can also get these information here.", + "operationId": "userinfo", + "responses": { + "200": { + "description": "Get user data", + "content": { + "application/json": { + "schema": { + "required": [ + "data" + ], + "type": "object", + "properties": { + "data": { + "required": [ + "allowed_downloads", + "downloads_count", + "ext_installed", + "level", + "remaining_downloads", + "user_id", + "vip" + ], + "type": "object", + "properties": { + "allowed_downloads": { + "type": "number" + }, + "level": { + "minLength": 1, + "type": "string" + }, + "user_id": { + "type": "number" + }, + "ext_installed": { + "type": "boolean" + }, + "vip": { + "type": "boolean" + }, + "downloads_count": { + "type": "number" + }, + "remaining_downloads": { + "type": "number" + } + } + } + }, + "description": "" + }, + "example": { + "data": { + "allowed_downloads": 100, + "level": "Sub leecher", + "user_id": 66, + "ext_installed": false, + "vip": false, + "downloads_count": 1, + "remaining_downloads": 99 + } + } + } } - } + } + }, + "deprecated": false, + "security": [ + { + "Bearer": [] + }, + { + "Api-Key": [] + } + ], + "parameters": [ + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ] + } }, - "components": { - "schemas": { - "Subtitle": { - "title": "", - "type": "object", - "description": "", - "x-tags": [ - "Models" - ], - "properties": { - "id": { - "minLength": 1, - "type": "string" + "/discover/popular": { + "get": { + "tags": [ + "Discover" + ], + "summary": "Popular features", + "description": "Discover popular features on opensubtitles.com, according to last 30 days downloads.", + "operationId": "popular", + "parameters": [ + { + "name": "language", + "in": "query", + "description": "Language code, 1 language per query, or \"all\"", + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Type (movie or tvshow)", + "schema": { + "type": "string" + } + }, + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Subtitle" + } + } + } + } + }, + "deprecated": false, + "security": [ + { + "Api-Key": [] + } + ] + } + }, + "/discover/latest": { + "get": { + "tags": [ + "Discover" + ], + "summary": "Latest subtitles", + "description": "Lists 60 latest uploaded subtitles", + "operationId": "latest", + "parameters": [ + { + "name": "language", + "in": "query", + "description": "Language code, 1 language per query, or \"all\"", + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Type (movie or tvshow)", + "schema": { + "type": "string" + } + }, + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "required": [ + "data", + "page", + "total_count", + "total_pages" + ], + "type": "object", + "properties": { + "total_pages": { + "type": "number" }, - "type": { - "minLength": 1, - "type": "string" + "total_count": { + "type": "number" }, - "attributes": { + "page": { + "type": "number" + }, + "data": { + "minItems": 1, + "uniqueItems": true, + "type": "array", + "items": { + "required": [ + "id", + "type" + ], "type": "object", "properties": { - "subtitle_id": { + "id": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + }, + "attributes": { + "required": [ + "ai_translated", + "comments", + "download_count", + "feature_details", + "files", + "foreign_parts_only", + "fps", + "from_trusted", + "hd", + "hearing_impaired", + "language", + "legacy_subtitle_id", + "new_download_count", + "points", + "ratings", + "related_links", + "release", + "subtitle_id", + "upload_date", + "uploader", + "url", + "votes" + ], + "type": "object", + "properties": { + "subtitle_id": { "minLength": 1, "type": "string" - }, - "language": { + }, + "language": { "minLength": 1, "type": "string" - }, - "download_count": { + }, + "download_count": { "type": "number" - }, - "new_download_count": { + }, + "new_download_count": { "type": "number" - }, - "hearing_impaired": { + }, + "hearing_impaired": { "type": "boolean" - }, - "hd": { + }, + "hd": { "type": "boolean" - }, - "format": { - "type": "string" - }, - "fps": { + }, + "format": { + "type": "object" + }, + "fps": { "type": "number" - }, - "votes": { + }, + "votes": { "type": "number" - }, - "points": { + }, + "points": { "type": "number" - }, - "ratings": { + }, + "ratings": { "type": "number" - }, - "from_trusted": { - "type": "boolean" - }, - "foreign_parts_only": { + }, + "from_trusted": { "type": "boolean" - }, - "ai_translated": { + }, + "foreign_parts_only": { "type": "boolean" - }, - "machine_translated": { + }, + "ai_translated": { "type": "boolean" - }, - "upload_date": { + }, + "machine_translated": { + "type": "object" + }, + "upload_date": { "minLength": 1, "type": "string" - }, - "release": { + }, + "release": { "minLength": 1, "type": "string" - }, - "legacy_subtitle_id": { + }, + "comments": { + "type": "string" + }, + "legacy_subtitle_id": { "type": "number" - }, - "uploader": { - "type": "object", + }, + "uploader": { "required": [ - "name", - "rank" + "name", + "rank", + "uploader_id" ], + "type": "object", "properties": { - "uploader_id": { - "type": "number" - }, - "name": { - "type": "string" - }, - "rank": { - "type": "string" - } + "uploader_id": { + "type": "number" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "rank": { + "minLength": 1, + "type": "string" + } } - }, - "feature_details": { + }, + "feature_details": { + "required": [ + "feature_id", + "feature_type", + "imdb_id", + "movie_name", + "title", + "year" + ], "type": "object", "properties": { - "feature_id": { - "type": "number" - }, - "feature_type": { - "minLength": 1, - "type": "string" - }, - "year": { - "type": "number" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "movie_name": { - "minLength": 1, - "type": "string" - }, - "imdb_id": { - "type": "number" - }, - "tmdb_id": { - "type": "number" - } + "feature_id": { + "type": "number" + }, + "feature_type": { + "minLength": 1, + "type": "string" + }, + "year": { + "type": "number" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "movie_name": { + "minLength": 1, + "type": "string" + }, + "imdb_id": { + "type": "number" + }, + "tmdb_id": { + "type": "object" + } } - }, - "url": { + }, + "url": { "minLength": 1, "type": "string" - }, - "related_links": { - "type": "array", - "items": { - "type": "object" + }, + "related_links": { + "required": [ + "img_url", + "label", + "url" + ], + "type": "object", + "properties": { + "label": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + }, + "img_url": { + "minLength": 1, + "type": "string" + } } - }, - "files": { + }, + "files": { "minItems": 1, "uniqueItems": true, "type": "array", "items": { - "type": "object", - "properties": { - "file_id": { - "type": "number" - }, - "cd_number": { - "type": "number" - }, - "file_name": { - "minLength": 1, - "type": "string" - } + "required": [ + "cd_number", + "file_id", + "file_name" + ], + "type": "object", + "properties": { + "file_id": { + "type": "number" + }, + "cd_number": { + "type": "number" }, - "required": [ - "file_id", - "cd_number", - "file_name" - ] + "file_name": { + "minLength": 1, + "type": "string" + } + } } + } } + } } + } } + }, + "description": "" }, - "required": [ - "id", - "type", - "attributes" - ] - }, - "Feature-Tvshow": { - "required": [ - "attributes", - "id", - "type" - ], - "type": "object", - "properties": { - "id": { - "minLength": 1, - "type": "string" - }, - "type": { - "minLength": 1, - "type": "string" - }, - "attributes": { - "type": "object", - "properties": { - "title": { - "minLength": 1, - "type": "string" - }, - "original_title": { - "minLength": 1, - "type": "string" - }, - "year": { - "minLength": 1, - "type": "string" - }, - "imdb_id": { - "type": "number" - }, - "tmdb_id": { - "type": "number" - }, - "title_aka": { - "type": "array", - "items": { - "type": "object", - "properties": {} - } - }, - "feature_id": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - }, - "img_url": { - "minLength": 1, - "type": "string" + "examples": { + "example": { + "value": { + "total_pages": 1, + "total_count": 10, + "page": 1, + "data": [ + { + "id": "string", + "type": "string", + "attributes": { + "subtitle_id": "string", + "language": "string", + "download_count": 0, + "new_download_count": 0, + "hearing_impaired": true, + "hd": true, + "format": {}, + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": true, + "foreign_parts_only": true, + "ai_translated": true, + "machine_translated": {}, + "upload_date": "string", + "release": "string", + "comments": "string", + "legacy_subtitle_id": 0, + "uploader": { + "uploader_id": 0, + "name": "string", + "rank": "string" }, - "subtitles_counts": { - "type": "object", - "properties": { - "pl": { - "type": "number" - }, - "en": { - "type": "number" - }, - "pt-BR": { - "type": "number" - }, - "ro": { - "type": "number" - }, - "nl": { - "type": "number" - }, - "pt-PT": { - "type": "number" - }, - "es": { - "type": "number" - }, - "he": { - "type": "number" - }, - "hu": { - "type": "number" - }, - "el": { - "type": "number" - }, - "fr": { - "type": "number" - }, - "tr": { - "type": "number" - }, - "cs": { - "type": "number" - }, - "fi": { - "type": "number" - }, - "ar": { - "type": "number" - }, - "hr": { - "type": "number" - }, - "sl": { - "type": "number" - }, - "bg": { - "type": "number" - }, - "sr": { - "type": "number" - }, - "sv": { - "type": "number" - }, - "de": { - "type": "number" - }, - "et": { - "type": "number" - }, - "da": { - "type": "number" - }, - "bs": { - "type": "number" - }, - "it": { - "type": "number" - }, - "mk": { - "type": "number" - }, - "ru": { - "type": "number" - }, - "no": { - "type": "number" - }, - "th": { - "type": "number" - }, - "vi": { - "type": "number" - }, - "ja": { - "type": "number" - }, - "fa": { - "type": "number" - }, - "zh-CN": { - "type": "number" - }, - "ca": { - "type": "number" - }, - "id": { - "type": "number" - }, - "sk": { - "type": "number" - }, - "ko": { - "type": "number" - }, - "zh-TW": { - "type": "number" - } - } + "feature_details": { + "feature_id": 0, + "feature_type": "string", + "year": 0, + "title": "string", + "movie_name": "string", + "imdb_id": 0, + "tmdb_id": {} }, - "subtitles_count": { - "type": "number" + "url": "string", + "related_links": { + "label": "string", + "url": "string", + "img_url": "string" }, - "seasons": { - "minItems": 1, - "uniqueItems": true, - "type": "array", - "items": { - "required": [ - "season_number" - ], - "type": "object", - "properties": { - "season_number": { - "type": "number" - }, - "episodes": { - "minItems": 1, - "uniqueItems": true, - "type": "array", - "items": { - "type": "object", - "properties": { - "episode_number": { - "type": "number" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "feature_id": { - "type": "number" - }, - "feature_imdb_id": { - "type": "number" - } - } - } - } - } - } + "files": [ + { + "file_id": 0, + "cd_number": 0, + "file_name": "string" + } + ] + } + } + ] + } + } + } + }, + "example": { + "example": { + "total_pages": 1, + "total_count": 60, + "page": 1, + "data": [ + { + "id": "6150116", + "type": "subtitle", + "attributes": { + "subtitle_id": "6150116", + "language": "sv", + "download_count": 0, + "new_download_count": 0, + "hearing_impaired": false, + "hd": true, + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": true, + "foreign_parts_only": false, + "ai_translated": false, + "upload_date": "2021-11-10T13:48:58.000Z", + "release": "No.Sudden.Move.2021.1080p.WEB.H264-TIMECUT", + "comments": "", + "legacy_subtitle_id": 8871896, + "uploader": { + "uploader_id": 83676, + "name": "Nemo_", + "rank": "Trusted member" + }, + "feature_details": { + "feature_id": 1226096, + "feature_type": "Movie", + "year": 2021, + "title": "No Sudden Move", + "movie_name": "2021 - No Sudden Move", + "imdb_id": 11525644, + "tmdb_id": 649409 + }, + "url": "https://www.opensubtitles.com/sv/subtitles/legacy/8871896", + "related_links": { + "label": "All subtitles for No Sudden Move", + "url": "https://www.opensubtitles.com/sv/movies/2021-no-sudden-move", + "img_url": "https://s9.osdb.link/features/6/9/0/1226096.jpg" + }, + "files": [ + { + "file_id": 7086008, + "cd_number": 1, + "file_name": "No.Sudden.Move.2021.1080p.WEB.H264-TIMECUT.srt" + } + ] + } + }, + { + "id": "6150127", + "type": "subtitle", + "attributes": { + "subtitle_id": "6150127", + "language": "zh-CN", + "download_count": 12, + "new_download_count": 2, + "hearing_impaired": false, + "hd": true, + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "upload_date": "2021-11-10T13:45:35.000Z", + "release": "Shang.Chi.and.the.Legend.of.the.Ten.Rings.2021.COMPLETE.UHD.BLURAY-SURCODE", + "comments": "", + "legacy_subtitle_id": 8871895, + "uploader": { + "uploader_id": 0, + "name": "Anonymous", + "rank": "anonymous" + }, + "feature_details": { + "feature_id": 1218697, + "feature_type": "Movie", + "year": 2021, + "title": "Shang-Chi and the Legend of the Ten Rings", + "movie_name": "2021 - Shang-Chi and the Legend of the Ten Rings", + "imdb_id": 9376612, + "tmdb_id": 566525 + }, + "url": "https://www.opensubtitles.com/zh-CN/subtitles/legacy/8871895", + "related_links": { + "label": "All subtitles for Shang-Chi and the Legend of the Ten Rings", + "url": "https://www.opensubtitles.com/zh-CN/movies/2021-shang-chi-and-the-legend-of-the-ten-rings", + "img_url": "https://s9.osdb.link/features/7/9/6/1218697.jpg" + }, + "files": [ + { + "file_id": 7086014, + "cd_number": 1, + "file_name": "Shang.Chi.and.the.Legend.of.the.Ten.Rings.2021.COMPLETE.UHD.BLURAY-SURCODE.ass" + } + ] + } + } + ], + "value": { + "total_pages": 1, + "total_count": 60, + "page": 1, + "data": [ + { + "id": "6150116", + "type": "subtitle", + "attributes": { + "subtitle_id": "6150116", + "language": "sv", + "download_count": 0, + "new_download_count": 0, + "hearing_impaired": false, + "hd": true, + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": true, + "foreign_parts_only": false, + "ai_translated": false, + "upload_date": "2021-11-10T13:48:58.000Z", + "release": "No.Sudden.Move.2021.1080p.WEB.H264-TIMECUT", + "comments": "", + "legacy_subtitle_id": 8871896, + "uploader": { + "uploader_id": 83676, + "name": "Nemo_", + "rank": "Trusted member" + }, + "feature_details": { + "feature_id": 1226096, + "feature_type": "Movie", + "year": 2021, + "title": "No Sudden Move", + "movie_name": "2021 - No Sudden Move", + "imdb_id": 11525644, + "tmdb_id": 649409 + }, + "url": "https://www.opensubtitles.com/sv/subtitles/legacy/8871896", + "related_links": { + "label": "All subtitles for No Sudden Move", + "url": "https://www.opensubtitles.com/sv/movies/2021-no-sudden-move", + "img_url": "https://s9.osdb.link/features/6/9/0/1226096.jpg" + }, + "files": [ + { + "file_id": 7086008, + "cd_number": 1, + "file_name": "No.Sudden.Move.2021.1080p.WEB.H264-TIMECUT.srt" + } + ] + } + }, + { + "id": "6150127", + "type": "subtitle", + "attributes": { + "subtitle_id": "6150127", + "language": "zh-CN", + "download_count": 12, + "new_download_count": 2, + "hearing_impaired": false, + "hd": true, + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "upload_date": "2021-11-10T13:45:35.000Z", + "release": "Shang.Chi.and.the.Legend.of.the.Ten.Rings.2021.COMPLETE.UHD.BLURAY-SURCODE", + "comments": "", + "legacy_subtitle_id": 8871895, + "uploader": { + "name": "Anonymous", + "rank": "anonymous" + }, + "feature_details": { + "feature_id": 1218697, + "feature_type": "Movie", + "year": 2021, + "title": "Shang-Chi and the Legend of the Ten Rings", + "movie_name": "2021 - Shang-Chi and the Legend of the Ten Rings", + "imdb_id": 9376612, + "tmdb_id": 566525 + }, + "url": "https://www.opensubtitles.com/zh-CN/subtitles/legacy/8871895", + "related_links": { + "label": "All subtitles for Shang-Chi and the Legend of the Ten Rings", + "url": "https://www.opensubtitles.com/zh-CN/movies/2021-shang-chi-and-the-legend-of-the-ten-rings", + "img_url": "https://s9.osdb.link/features/7/9/6/1218697.jpg" + }, + "files": [ + { + "file_id": 7086014, + "cd_number": 1, + "file_name": "Shang.Chi.and.the.Legend.of.the.Ten.Rings.2021.COMPLETE.UHD.BLURAY-SURCODE.ass" } + ] } + } + ] + } + } + } + } + } + }, + "security": [ + { + "Api-Key": [] + } + ] + } + }, + "/discover/most_downloaded": { + "get": { + "tags": [ + "Discover" + ], + "summary": "Most downloaded subtitles", + "description": "Discover popular subtitles, according to last 30 days downloads on opensubtitles.com. This list can be filtered by language code or feature type (movie, episode)", + "operationId": "most_downloaded", + "parameters": [ + { + "name": "language", + "in": "query", + "description": "Language code, 1 language per query, or \"all\"", + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "Type (movie or tvshow)", + "schema": { + "type": "string" + } + }, + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ], + "responses": { + "200": { + "description": "Lists most downloaded movie subtitles ", + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "", + "properties": { + "total_pages": { + "type": "number" + }, + "total_count": { + "type": "number" + }, + "page": { + "type": "number" + }, + "data": { + "minItems": 1, + "uniqueItems": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/Subtitle" + } + } + }, + "required": [ + "total_pages", + "total_count", + "page", + "data" + ] + }, + "example": { + "total_pages": 1, + "total_count": 46, + "page": 1, + "data": [ + { + "id": "493023", + "type": "subtitle", + "attributes": { + "subtitle_id": "493023", + "language": "nl", + "download_count": 3889, + "new_download_count": 11, + "hearing_impaired": false, + "hd": false, + "format": "srt", + "fps": 29.97, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2010-11-15T14:55:39.000Z", + "release": "Major League WS DVDRip", + "comments": "", + "legacy_subtitle_id": 3956266, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 518105, + "feature_type": "Movie", + "year": 1989, + "title": "Major League", + "movie_name": "1989 - Major League", + "imdb_id": 97815, + "tmdb_id": 9942 + }, + "url": "https://www.opensubtitles.com/nl/subtitles/legacy/3956266", + "related_links": [ + { + "label": "All subtitles for Major League", + "url": "https://www.opensubtitles.com/nl/movies/1989-major-league", + "img_url": "https://s9.osdb.link/features/5/0/1/518105.jpg" + } + ], + "files": [ + { + "file_id": 544077, + "cd_number": 1, + "file_name": "Major League WS DVDRip.srt" + } + ] + } + }, + { + "id": "496423", + "type": "subtitle", + "attributes": { + "subtitle_id": "496423", + "language": "es", + "download_count": 674, + "new_download_count": 5, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 29.97, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2008-03-23T21:04:04.000Z", + "release": "Le mépris", + "comments": "", + "legacy_subtitle_id": 3264195, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 518020, + "feature_type": "Movie", + "year": 1963, + "title": "Contempt", + "movie_name": "1963 - Contempt", + "imdb_id": 57345, + "tmdb_id": 266 + }, + "url": "https://www.opensubtitles.com/es/subtitles/legacy/3264195", + "related_links": [ + { + "label": "All subtitles for Contempt", + "url": "https://www.opensubtitles.com/es/movies/1963-contempt", + "img_url": "https://s9.osdb.link/features/0/2/0/518020.jpg" + } + ], + "files": [ + { + "file_id": 6028018, + "cd_number": 1, + "file_name": "Le mepris-es.srt" + } + ] + } + }, + { + "id": "495449", + "type": "subtitle", + "attributes": { + "subtitle_id": "495449", + "language": "pt-BR", + "download_count": 189, + "new_download_count": 1, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 23.976, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2012-07-14T19:47:18.000Z", + "release": "Gnger Snaps", + "comments": "", + "legacy_subtitle_id": 4617243, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 518342, + "feature_type": "Movie", + "year": 2000, + "title": "Ginger Snaps", + "movie_name": "2000 - Ginger Snaps", + "imdb_id": 210070, + "tmdb_id": 9871 + }, + "url": "https://www.opensubtitles.com/pt-BR/subtitles/legacy/4617243", + "related_links": [ + { + "label": "All subtitles for Ginger Snaps", + "url": "https://www.opensubtitles.com/pt-BR/movies/2000-ginger-snaps", + "img_url": "https://s9.osdb.link/features/2/4/3/518342.jpg" + } + ], + "files": [ + { + "file_id": 546827, + "cd_number": 1, + "file_name": "Ginger Snaps [2000] DvDrip [Eng] Bugz.srt" + } + ] + } + }, + { + "id": "496964", + "type": "subtitle", + "attributes": { + "subtitle_id": "496964", + "language": "es", + "download_count": 1190, + "new_download_count": 7, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 23.976, + "votes": 1, + "points": 10, + "ratings": 10, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2012-05-18T00:13:46.000Z", + "release": "1963.El desprecio (subt)", + "comments": "", + "legacy_subtitle_id": 4552383, + "uploader": { + "uploader_id": 63170, + "name": "robot2xl", + "rank": "read only" + }, + "feature_details": { + "feature_id": 518020, + "feature_type": "Movie", + "year": 1963, + "title": "Contempt", + "movie_name": "1963 - Contempt", + "imdb_id": 57345, + "tmdb_id": 266 + }, + "url": "https://www.opensubtitles.com/es/subtitles/legacy/4552383", + "related_links": [ + { + "label": "All subtitles for Contempt", + "url": "https://www.opensubtitles.com/es/movies/1963-contempt", + "img_url": "https://s9.osdb.link/features/0/2/0/518020.jpg" + } + ], + "files": [ + { + "file_id": 548446, + "cd_number": 1, + "file_name": "1963.El desprecio (subt).srt" + } + ] + } + }, + { + "id": "492641", + "type": "subtitle", + "attributes": { + "subtitle_id": "492641", + "language": "es", + "download_count": 1477, + "new_download_count": 2, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2005-08-19T22:00:00.000Z", + "release": "Philadelphia Story, The (1940)", + "comments": "", + "legacy_subtitle_id": 101000, + "uploader": { + "uploader_id": 14715, + "name": "marlowe62 (a)", + "rank": "bronze member" + }, + "feature_details": { + "feature_id": 518136, + "feature_type": "Movie", + "year": 1940, + "title": "The Philadelphia Story", + "movie_name": "1940 - The Philadelphia Story", + "imdb_id": 32904, + "tmdb_id": 981 + }, + "url": "https://www.opensubtitles.com/es/subtitles/legacy/101000", + "related_links": [ + { + "label": "All subtitles for The Philadelphia Story", + "url": "https://www.opensubtitles.com/es/movies/1940-the-philadelphia-story", + "img_url": "https://s9.osdb.link/features/6/3/1/518136.jpg" + } + ], + "files": [ + { + "file_id": 6026506, + "cd_number": 1, + "file_name": "George Cukor - Historias de Filadelfia (1940) DvdRip XviD Mp3 Dual Divxclasico.Esp.srt" + } + ] + } + }, + { + "id": "493247", + "type": "subtitle", + "attributes": { + "subtitle_id": "493247", + "language": "el", + "download_count": 1052, + "new_download_count": 16, + "hearing_impaired": false, + "hd": true, + "format": "", + "fps": 23.976, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2011-05-17T07:28:54.000Z", + "release": "Superman.1978.720.BluRay.x264-VarK", + "comments": "", + "legacy_subtitle_id": 4179141, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 517956, + "feature_type": "Movie", + "year": 1978, + "title": "Superman", + "movie_name": "1978 - Superman", + "imdb_id": 78346, + "tmdb_id": 1924 + }, + "url": "https://www.opensubtitles.com/el/subtitles/legacy/4179141", + "related_links": [ + { + "label": "All subtitles for Superman", + "url": "https://www.opensubtitles.com/el/movies/1978-superman", + "img_url": "https://s9.osdb.link/features/6/5/9/517956.jpg" + } + ], + "files": [ + { + "file_id": 544327, + "cd_number": 1, + "file_name": "Superman.1978.720.BluRay.x264-VarK.srt" + } + ] + } + }, + { + "id": "496017", + "type": "subtitle", + "attributes": { + "subtitle_id": "496017", + "language": "en", + "download_count": 24642, + "new_download_count": 8, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 23.98, + "votes": 13, + "points": 81, + "ratings": 6.2, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2002-10-10T22:00:00.000Z", + "release": "Jingle All the Way (1996)", + "comments": "none", + "legacy_subtitle_id": 32268, + "uploader": { + "uploader_id": 6872, + "name": "alxmota (a)", + "rank": "bronze member" + }, + "feature_details": { + "feature_id": 518213, + "feature_type": "Movie", + "year": 1996, + "title": "Jingle All the Way", + "movie_name": "1996 - Jingle All the Way", + "imdb_id": 116705, + "tmdb_id": 9279 + }, + "url": "https://www.opensubtitles.com/en/subtitles/legacy/32268", + "related_links": [ + { + "label": "All subtitles for Jingle All the Way", + "url": "https://www.opensubtitles.com/en/movies/1996-jingle-all-the-way", + "img_url": "https://s9.osdb.link/features/3/1/2/518213.jpg" + } + ], + "files": [ + { + "file_id": 547446, + "cd_number": 1, + "file_name": "ingles.srt" + } + ] + } + }, + { + "id": "496396", + "type": "subtitle", + "attributes": { + "subtitle_id": "496396", + "language": "nl", + "download_count": 1993, + "new_download_count": 16, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 25, + "votes": 1, + "points": 7, + "ratings": 7, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2013-10-10T22:54:26.000Z", + "release": "Come and See (Idi i smotri) (1985)", + "comments": "", + "legacy_subtitle_id": 5217608, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 518417, + "feature_type": "Movie", + "year": 1985, + "title": "Come and See", + "movie_name": "1985 - Come and See", + "imdb_id": 91251, + "tmdb_id": 25237 + }, + "url": "https://www.opensubtitles.com/nl/subtitles/legacy/5217608", + "related_links": [ + { + "label": "All subtitles for Come and See", + "url": "https://www.opensubtitles.com/nl/movies/1985-come-and-see", + "img_url": "https://s9.osdb.link/features/7/1/4/518417.jpg" + } + ], + "files": [ + { + "file_id": 547857, + "cd_number": 1, + "file_name": "Come and See (Idi i smotri) (1985)-dut(1).srt" + } + ] + } + }, + { + "id": "492427", + "type": "subtitle", + "attributes": { + "subtitle_id": "492427", + "language": "pt-BR", + "download_count": 358, + "new_download_count": 3, + "hearing_impaired": false, + "hd": true, + "format": "", + "fps": 23.98, + "votes": 1, + "points": 1, + "ratings": 1, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2015-12-26T15:19:56.000Z", + "release": "Rambo.First.Blood.II.1985.Ultimate.Uncut.Remastered.Edition.1080p.BluRay.x264.AAC-ETRG", + "comments": "PT-BR subtitle uploaded by saidleugim", + "legacy_subtitle_id": 6437707, + "uploader": { + "uploader_id": 71162, + "name": "saidleugim", + "rank": "bronze member" + }, + "feature_details": { + "feature_id": 517867, + "feature_type": "Movie", + "year": 1985, + "title": "Rambo: First Blood Part II", + "movie_name": "1985 - Rambo: First Blood Part II", + "imdb_id": 89880, + "tmdb_id": 1369 + }, + "url": "https://www.opensubtitles.com/pt-BR/subtitles/legacy/6437707", + "related_links": [ + { + "label": "All subtitles for Rambo: First Blood Part II", + "url": "https://www.opensubtitles.com/pt-BR/movies/1985-rambo-first-blood-part-ii", + "img_url": "https://s9.osdb.link/features/7/6/8/517867.jpg" + } + ], + "files": [ + { + "file_id": 6026410, + "cd_number": 1, + "file_name": "Rambo.First.Blood.II.1985.Ultimate.Uncut.Remastered.Edition.1080p.BluRay.x264.AAC-ETRG.srt" + } + ] + } + }, + { + "id": "493721", + "type": "subtitle", + "attributes": { + "subtitle_id": "493721", + "language": "en", + "download_count": 16956, + "new_download_count": 4, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 25, + "votes": 7, + "points": 67, + "ratings": 9.6, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2007-05-16T09:07:38.000Z", + "release": "Hannibal", + "comments": "", + "legacy_subtitle_id": 3123830, + "uploader": { + "uploader_id": 34153, + "name": "arkymedes", + "rank": "bronze member" + }, + "feature_details": { + "feature_id": 517991, + "feature_type": "Movie", + "year": 2001, + "title": "Hannibal", + "movie_name": "2001 - Hannibal", + "imdb_id": 212985, + "tmdb_id": 9740 + }, + "url": "https://www.opensubtitles.com/en/subtitles/legacy/3123830", + "related_links": [ + { + "label": "All subtitles for Hannibal", + "url": "https://www.opensubtitles.com/en/movies/2001-hannibal", + "img_url": "https://s9.osdb.link/features/1/9/9/517991.jpg" + } + ], + "files": [ + { + "file_id": 544852, + "cd_number": 1, + "file_name": "Hannibal.en.srt" + } + ] + } + }, + { + "id": "496722", + "type": "subtitle", + "attributes": { + "subtitle_id": "496722", + "language": "es", + "download_count": 544, + "new_download_count": 21, + "hearing_impaired": false, + "hd": true, + "format": "", + "fps": 25, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": true, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2011-05-28T08:48:56.000Z", + "release": "Le Mepris (1963) HDRip Dual XviD Ac3 by FitoCorleone", + "comments": "El.Desprecio.(Le.Mepris).(1963).HDRip.Dual.(Spa.Fr.).(Xvid+2Ac3).(proteinicos.es)...FitoCorleone.avi [1.47 Gb]/ Corregidos por el GTC de DivXClasico para Proteinicos y DXC", + "legacy_subtitle_id": 4184944, + "uploader": { + "uploader_id": 32127, + "name": "marlowe62", + "rank": "trusted" + }, + "feature_details": { + "feature_id": 518020, + "feature_type": "Movie", + "year": 1963, + "title": "Contempt", + "movie_name": "1963 - Contempt", + "imdb_id": 57345, + "tmdb_id": 266 + }, + "url": "https://www.opensubtitles.com/es/subtitles/legacy/4184944", + "related_links": [ + { + "label": "All subtitles for Contempt", + "url": "https://www.opensubtitles.com/es/movies/1963-contempt", + "img_url": "https://s9.osdb.link/features/0/2/0/518020.jpg" + } + ], + "files": [ + { + "file_id": 548202, + "cd_number": 1, + "file_name": "Le Mepris (1963) HDRip Dual XviD Ac3 by FitoCorleone.Esp.srt" + } + ] + } + }, + { + "id": "492688", + "type": "subtitle", + "attributes": { + "subtitle_id": "492688", + "language": "en", + "download_count": 72506, + "new_download_count": 62, + "hearing_impaired": true, + "hd": false, + "format": "", + "fps": 25, + "votes": 2, + "points": 20, + "ratings": 10, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2008-07-09T13:19:22.000Z", + "release": "Rocky.I[1976]DvDrip-aXXo", + "comments": "Rocky-The.Complete.Saga[2007]DvDrip-aXXo", + "legacy_subtitle_id": 3302711, + "uploader": { + "uploader_id": 119465, + "name": "os_robot", + "rank": "bronze member" + }, + "feature_details": { + "feature_id": 517932, + "feature_type": "Movie", + "year": 1976, + "title": "Rocky", + "movie_name": "1976 - Rocky", + "imdb_id": 75148, + "tmdb_id": 1366 + }, + "url": "https://www.opensubtitles.com/en/subtitles/legacy/3302711", + "related_links": [ + { + "label": "All subtitles for Rocky", + "url": "https://www.opensubtitles.com/en/movies/1976-rocky", + "img_url": "https://s9.osdb.link/features/2/3/9/517932.jpg" + } + ], + "files": [ + { + "file_id": 543715, + "cd_number": 1, + "file_name": "Rocky.I[1976]DvDrip-aXXo.srt" + } + ] + } + }, + { + "id": "490625", + "type": "subtitle", + "attributes": { + "subtitle_id": "490625", + "language": "en", + "download_count": 7989, + "new_download_count": 20, + "hearing_impaired": false, + "hd": true, + "format": "", + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2013-07-06T11:07:28.000Z", + "release": "9.Songs.2004.720p.BluRay.x264.anoXmous", + "comments": "", + "legacy_subtitle_id": 5075303, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 518052, + "feature_type": "Movie", + "year": 2004, + "title": "9 Songs", + "movie_name": "2004 - 9 Songs", + "imdb_id": 411705, + "tmdb_id": 27 + }, + "url": "https://www.opensubtitles.com/en/subtitles/legacy/5075303", + "related_links": [ + { + "label": "All subtitles for 9 Songs", + "url": "https://www.opensubtitles.com/en/movies/2004-9-songs", + "img_url": "https://s9.osdb.link/features/2/5/0/518052.jpg" + } + ], + "files": [ + { + "file_id": 541296, + "cd_number": 1, + "file_name": "9.Songs.2004.720p.BluRay.x264.anoXmous_eng.srt" + } + ] + } + }, + { + "id": "494835", + "type": "subtitle", + "attributes": { + "subtitle_id": "494835", + "language": "pt-BR", + "download_count": 2028, + "new_download_count": 10, + "hearing_impaired": false, + "hd": true, + "format": "", + "fps": 24, + "votes": 2, + "points": 20, + "ratings": 10, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2014-09-07T13:57:21.000Z", + "release": "Red Sonja.1985.BDRip.720p.MultiLang.MultiSub-Pitt", + "comments": "", + "legacy_subtitle_id": 5815278, + "uploader": { + "uploader_id": 62530, + "name": "fjones1979", + "rank": "trusted" + }, + "feature_details": { + "feature_id": 518067, + "feature_type": "Movie", + "year": 1985, + "title": "Red Sonja", + "movie_name": "1985 - Red Sonja", + "imdb_id": 89893, + "tmdb_id": 9626 + }, + "url": "https://www.opensubtitles.com/pt-BR/subtitles/legacy/5815278", + "related_links": [ + { + "label": "All subtitles for Red Sonja", + "url": "https://www.opensubtitles.com/pt-BR/movies/1985-red-sonja", + "img_url": "https://s9.osdb.link/features/7/6/0/518067.jpg" + } + ], + "files": [ + { + "file_id": 546129, + "cd_number": 1, + "file_name": "Red Sonja.1985.BDRip.720p.MultiLang.MultiSub-Pitt.por.srt" + } + ] + } + }, + { + "id": "492618", + "type": "subtitle", + "attributes": { + "subtitle_id": "492618", + "language": "pl", + "download_count": 147, + "new_download_count": 4, + "hearing_impaired": false, + "hd": true, + "format": "", + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2015-07-08T20:47:42.000Z", + "release": "Presumed.Innocent.1990.720p.BRRip.XviD.AC3-RARBG", + "comments": "", + "legacy_subtitle_id": 6228423, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 517957, + "feature_type": "Movie", + "year": 1990, + "title": "Presumed Innocent", + "movie_name": "1990 - Presumed Innocent", + "imdb_id": 100404, + "tmdb_id": 11092 + }, + "url": "https://www.opensubtitles.com/pl/subtitles/legacy/6228423", + "related_links": [ + { + "label": "All subtitles for Presumed Innocent", + "url": "https://www.opensubtitles.com/pl/movies/1990-presumed-innocent", + "img_url": "https://s9.osdb.link/features/7/5/9/517957.jpg" + } + ], + "files": [ + { + "file_id": 6026497, + "cd_number": 1, + "file_name": "Presumed.Innocent.1990.720p.BRRip.XviD.AC3-RARBG.txt" + } + ] + } + }, + { + "id": "496727", + "type": "subtitle", + "attributes": { + "subtitle_id": "496727", + "language": "en", + "download_count": 1912, + "new_download_count": 63, + "hearing_impaired": false, + "hd": true, + "format": "", + "fps": 23.976, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2016-08-12T06:53:45.000Z", + "release": "Idi.i.smotri.AKA.Come.and.See.1985.IVC.1080p.BluRay.Remux.AVC.FLAC.2.0-oddset", + "comments": "", + "legacy_subtitle_id": 6708061, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 518417, + "feature_type": "Movie", + "year": 1985, + "title": "Come and See", + "movie_name": "1985 - Come and See", + "imdb_id": 91251, + "tmdb_id": 25237 + }, + "url": "https://www.opensubtitles.com/en/subtitles/legacy/6708061", + "related_links": [ + { + "label": "All subtitles for Come and See", + "url": "https://www.opensubtitles.com/en/movies/1985-come-and-see", + "img_url": "https://s9.osdb.link/features/7/1/4/518417.jpg" + } + ], + "files": [ + { + "file_id": 6028156, + "cd_number": 1, + "file_name": "Idi.i.smotri.AKA.Come.and.See.1985.IVC.1080p.BluRay.Remux.AVC.FLAC.2.0-oddset.srt" + } + ] + } + }, + { + "id": "493563", + "type": "subtitle", + "attributes": { + "subtitle_id": "493563", + "language": "en", + "download_count": 14796, + "new_download_count": 12, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 23.976, + "votes": 1, + "points": 10, + "ratings": 10, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2001-12-04T23:00:00.000Z", + "release": "The Secret Garden", + "comments": "", + "legacy_subtitle_id": 106540, + "uploader": { + "uploader_id": 4143, + "name": "Panayot (a)", + "rank": "bronze member" + }, + "feature_details": { + "feature_id": 518028, + "feature_type": "Movie", + "year": 1993, + "title": "The Secret Garden", + "movie_name": "1993 - The Secret Garden", + "imdb_id": 108071, + "tmdb_id": 11236 + }, + "url": "https://www.opensubtitles.com/en/subtitles/legacy/106540", + "related_links": [ + { + "label": "All subtitles for The Secret Garden", + "url": "https://www.opensubtitles.com/en/movies/1993-the-secret-garden", + "img_url": "https://s9.osdb.link/features/8/2/0/518028.jpg" + } + ], + "files": [ + { + "file_id": 544691, + "cd_number": 1, + "file_name": "TheSecretGarden_EN.sub" + } + ] + } + }, + { + "id": "492466", + "type": "subtitle", + "attributes": { + "subtitle_id": "492466", + "language": "he", + "download_count": 128, + "new_download_count": 1, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2008-02-08T02:00:42.000Z", + "release": "Rocky.1976.DVDRip.XviD.AC3.iNTERNAL-QiM", + "comments": "", + "legacy_subtitle_id": 3246129, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 517932, + "feature_type": "Movie", + "year": 1976, + "title": "Rocky", + "movie_name": "1976 - Rocky", + "imdb_id": 75148, + "tmdb_id": 1366 + }, + "url": "https://www.opensubtitles.com/he/subtitles/legacy/3246129", + "related_links": [ + { + "label": "All subtitles for Rocky", + "url": "https://www.opensubtitles.com/he/movies/1976-rocky", + "img_url": "https://s9.osdb.link/features/2/3/9/517932.jpg" + } + ], + "files": [ + { + "file_id": 6026439, + "cd_number": 2, + "file_name": "qim-rockyb.srt" + }, + { + "file_id": 6026437, + "cd_number": 1, + "file_name": "qim-rockya.srt" + } + ] + } + }, + { + "id": "492560", + "type": "subtitle", + "attributes": { + "subtitle_id": "492560", + "language": "pt-BR", + "download_count": 64, + "new_download_count": 2, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 0, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2017-07-29T22:49:40.000Z", + "release": "jornada", + "comments": "", + "legacy_subtitle_id": 7052825, + "uploader": { + "uploader_id": 3282, + "name": "COF7CJpS", + "rank": "app developer" + }, + "feature_details": { + "feature_id": 517867, + "feature_type": "Movie", + "year": 1985, + "title": "Rambo: First Blood Part II", + "movie_name": "1985 - Rambo: First Blood Part II", + "imdb_id": 89880, + "tmdb_id": 1369 + }, + "url": "https://www.opensubtitles.com/pt-BR/subtitles/legacy/7052825", + "related_links": [ + { + "label": "All subtitles for Rambo: First Blood Part II", + "url": "https://www.opensubtitles.com/pt-BR/movies/1985-rambo-first-blood-part-ii", + "img_url": "https://s9.osdb.link/features/7/6/8/517867.jpg" + } + ], + "files": [ + { + "file_id": 6026472, + "cd_number": 1, + "file_name": "jornada.srt" + } + ] + } + }, + { + "id": "496159", + "type": "subtitle", + "attributes": { + "subtitle_id": "496159", + "language": "de", + "download_count": 226, + "new_download_count": 7, + "hearing_impaired": false, + "hd": false, + "format": "", + "fps": 25, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": true, + "foreign_parts_only": false, + "ai_translated": false, + "machine_translated": false, + "upload_date": "2012-07-21T17:11:45.000Z", + "release": "Komm.und.sieh.1985.German.DVDRip.Retail", + "comments": "RUSCICO / Russian Cinema Council", + "legacy_subtitle_id": 4622375, + "uploader": { + "uploader_id": 41812, + "name": "Ralle1", + "rank": "administrator" + }, + "feature_details": { + "feature_id": 518417, + "feature_type": "Movie", + "year": 1985, + "title": "Come and See", + "movie_name": "1985 - Come and See", + "imdb_id": 91251, + "tmdb_id": 25237 + }, + "url": "https://www.opensubtitles.com/de/subtitles/legacy/4622375", + "related_links": [ + { + "label": "All subtitles for Come and See", + "url": "https://www.opensubtitles.com/de/movies/1985-come-and-see", + "img_url": "https://s9.osdb.link/features/7/1/4/518417.jpg" + } + ], + "files": [ + { + "file_id": 6027938, + "cd_number": 2, + "file_name": "Komm.und.sieh.1985.German.DVDRip.CD2.Retail.srt" + }, + { + "file_id": 6027936, + "cd_number": 1, + "file_name": "Komm.und.sieh.1985.German.DVDRip.CD1.Retail.srt" + } + ] + } + } + ] + } + }, + "example": { + "example": { + "total_pages": 1, + "total_count": 60, + "page": 1, + "data": [ + { + "id": "766099", + "type": "subtitle", + "attributes": { + "subtitle_id": "766099", + "language": "ko", + "download_count": 2836, + "new_download_count": 190, + "hearing_impaired": false, + "hd": true, + "fps": 23.976, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "upload_date": "2016-08-24T17:25:17.000Z", + "release": "The.Twilight.Saga.Breaking.Dawn.Part 1.2011.720p.BrRip.x264.YIFY", + "comments": "", + "legacy_subtitle_id": 6717006, + "uploader": { + "uploader_id": 3282, + "name": "os-auto", + "rank": "Application Developers" + }, + "feature_details": { + "feature_id": 568028, + "feature_type": "Movie", + "year": 2011, + "title": "The Twilight Saga: Breaking Dawn - Part 1", + "movie_name": "2011 - The Twilight Saga: Breaking Dawn - Part 1", + "imdb_id": 1324999, + "tmdb_id": 50619 + }, + "url": "https://www.opensubtitles.com/ko/subtitles/legacy/6717006", + "related_links": { + "label": "All subtitles for The Twilight Saga: Breaking Dawn - Part 1", + "url": "https://www.opensubtitles.com/ko/movies/2011-the-twilight-saga-breaking-dawn-part-1", + "img_url": "https://s9.osdb.link/features/8/2/0/568028.jpg" + }, + "files": [ + { + "file_id": 841356, + "cd_number": 1, + "file_name": "The.Twilight.Saga.Breaking.Dawn.Part 1.2011.720p.BrRip.x264.YIFY.smi" + } + ] + } + }, + { + "id": "4885905", + "type": "subtitle", + "attributes": { + "subtitle_id": "4885905", + "language": "ko", + "download_count": 3838, + "new_download_count": 78, + "hearing_impaired": false, + "hd": true, + "fps": 23.976, + "votes": 0, + "points": 0, + "ratings": 0, + "from_trusted": false, + "foreign_parts_only": false, + "ai_translated": false, + "upload_date": "2019-07-28T19:18:09.000Z", + "release": "The.Wolf.of.Wall.Street.2013.1080p.BluRay.x264-AMIABLE", + "comments": "ksub", + "legacy_subtitle_id": 7845982, + "uploader": { + "uploader_id": 82010, + "name": "ksubscene", + "rank": "Gold member" + }, + "feature_details": { + "feature_id": 586864, + "feature_type": "Movie", + "year": 2013, + "title": "The Wolf of Wall Street", + "movie_name": "2013 - The Wolf of Wall Street", + "imdb_id": 993846, + "tmdb_id": 106646 + }, + "url": "https://www.opensubtitles.com/ko/subtitles/legacy/7845982", + "related_links": { + "label": "All subtitles for The Wolf of Wall Street", + "url": "https://www.opensubtitles.com/ko/movies/2013-the-wolf-of-wall-street", + "img_url": "https://s9.osdb.link/features/4/6/8/586864.jpg" + }, + "files": [ + { + "file_id": 5009225, + "cd_number": 1, + "file_name": "The.Wolf.of.Wall.Street.2013.1080p.BluRay.x264-AMIABLE.smi" + } + ] + } + } + ] + } + } + } + } + }, + "deprecated": false, + "security": [ + { + "Api-Key": [] + } + ] + } + }, + "/features": { + "get": { + "tags": [ + "Features" + ], + "summary": "Search for features", + "description": "With the \"query\" parameter, search for a Feature from a simple text input. Typically used for a text search or autocomplete.\n\nWith an ID, get basic information and subtitles count for a specific title.\n\nWith the \"query_match\" you can define the matched applied to the query: \n - \"start\" is the default behavior, it will query on the first letter entered to offer suggestions\n - \"word\" will return the match on the word, but not always matching the fulll title, for example searching \"roma\" will return \"holiday in roma\"\n - \"exact\" will exactly match the title, so here searching for \"roma\" will only return the movie(s) named \"roma\" \n\nWith the \"full_search\" you can extend the search to the translations of the title, so \"roma\" will also return \"rome\" \n\n\n\n> ### Watch Out!\n>\n> If you create an autocomplete, don't set a too small refresh limit, remember you must not go over 40 requests per 10 seconds!", + "operationId": "features", + "parameters": [ + { + "name": "query", + "in": "query", + "description": "query to search, release/file name accepted", + "schema": { + "minLength": 3, + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "description": "empty to list all or **movie**, **tvshow** or **episode**.", + "schema": { + "type": "string" + } + }, + { + "name": "feature_id", + "in": "query", + "description": "opensubtitles **feature_id**", + "schema": { + "type": "integer" + } + }, + { + "name": "imdb_id", + "in": "query", + "description": "IMDB ID, delete leading zeroes", + "schema": { + "type": "string" + } + }, + { + "name": "tmdb_id", + "in": "query", + "description": "TheMovieDB ID - combine with type to avoid errors", + "schema": { + "type": "string" + } + }, + { + "name": "year", + "in": "query", + "description": "Filter by year. Can only be used in combination with a query", + "schema": { + "type": "integer" + } + }, + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + }, + { + "schema": { + "type": "string" + }, + "in": "query", + "name": "query_match", + "description": "Type of matching applied to the query: **start** (default), **word**, **exact** " + }, + { + "schema": { + "type": "boolean" + }, + "in": "query", + "name": "full_search", + "description": "Search on original title and title aka (translations) (default false)" + } + ], + "responses": { + "200": { + "description": "Search for a feature", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "movie": { + "$ref": "#/components/schemas/Feature-Movie" + }, + "episode": { + "$ref": "#/components/schemas/Feature-Episode" + }, + "tv": { + "$ref": "#/components/schemas/Feature-Tvshow" + } + }, + "description": "" + }, + "example": { + "data": [ + { + "id": "9803", + "type": "feature", + "attributes": { + "title": "Waking the Dead", + "original_title": "", + "year": "2000", + "subtitles_counts": { + "en": 68, + "es": 41, + "nl": 40, + "ro": 40, + "ru": 30, + "sr": 21, + "pl": 7, + "pt-BR": 4, + "hr": 3, + "pt-PT": 3, + "bg": 2, + "el": 2, + "he": 2, + "fa": 2, + "sl": 2, + "tr": 2, + "ar": 1, + "bs": 1, + "cs": 1, + "et": 1, + "fi": 1, + "fr": 1, + "hu": 1, + "id": 1, + "ja": 1, + "sk": 1, + "th": 1, + "vi": 1 + }, + "subtitles_count": 11, + "seasons_count": 9, + "parent_title": "", + "season_number": 0, + "episode_number": "", + "imdb_id": 259733, + "tmdb_id": 4860, + "parent_imdb_id": "", + "feature_id": "9803", + "title_aka": [ + "Waking the Dead", + " Waking the Dead – Im Auftrag der Toten" + ], + "feature_type": "Tvshow", + "url": "https://www.opensubtitles.com/en/tvshows/2000-waking-the-dead", + "img_url": "https://s9.osdb.link/features/3/0/8/9803.jpg", + "seasons": [ + { + "season_number": 1, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" Pilot: Part 1", + "feature_id": 126854, + "feature_imdb_id": 743365 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" Pilot: Part 2", + "feature_id": 126863, + "feature_imdb_id": 936019 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" Burn Out: Part 1", + "feature_id": 126861, + "feature_imdb_id": 743355 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" Burn Out: Part 2", + "feature_id": 126858, + "feature_imdb_id": 936016 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" Blind Beggar: Part 1", + "feature_id": 126862, + "feature_imdb_id": 743353 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" Blind Beggar: Part 2", + "feature_id": 126859, + "feature_imdb_id": 936017 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" A Simple Sacrifice: Part 1", + "feature_id": 126860, + "feature_imdb_id": 743350 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" A Simple Sacrifice: Part 2", + "feature_id": 126864, + "feature_imdb_id": 936015 + }, + { + "episode_number": 9, + "title": "\"Waking the Dead\" Every Breath You Take: Part 1", + "feature_id": 126865, + "feature_imdb_id": 743358 + }, + { + "episode_number": 10, + "title": "\"Waking the Dead\" Every Breath You Take: Part 2", + "feature_id": 126869, + "feature_imdb_id": 936018 + } + ] + }, + { + "season_number": 2, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" Life Sentence: Part 1", + "feature_id": 126868, + "feature_imdb_id": 743363 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" Life Sentence: Part 2", + "feature_id": 126871, + "feature_imdb_id": 1108804 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" Deathwatch: Part 1", + "feature_id": 126867, + "feature_imdb_id": 743357 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" Deathwatch: Part 2", + "feature_id": 126870, + "feature_imdb_id": 1108805 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" Special Relationship: Part 1", + "feature_id": 126872, + "feature_imdb_id": 743367 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" Special Relationship: Part 2", + "feature_id": 126878, + "feature_imdb_id": 1091606 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" Thin Air: Part 1", + "feature_id": 126875, + "feature_imdb_id": 743371 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" Thin Air: Part 2", + "feature_id": 126877, + "feature_imdb_id": 1167299 + } + ] + }, + { + "season_number": 3, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" Multistorey: Part 1", + "feature_id": 126876, + "feature_imdb_id": 743364 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" Multistorey: Part 2", + "feature_id": 126883, + "feature_imdb_id": 1167294 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" Walking on Water: Part 1", + "feature_id": 126884, + "feature_imdb_id": 743374 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" Walking on Water: Part 2", + "feature_id": 126879, + "feature_imdb_id": 1167302 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" Breaking Glass: Part 1", + "feature_id": 126885, + "feature_imdb_id": 743354 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" Breaking Glass: Part 2", + "feature_id": 126881, + "feature_imdb_id": 1167289 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" Final Cut: Part 1", + "feature_id": 126887, + "feature_imdb_id": 743360 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" Final Cut: Part 2", + "feature_id": 126882, + "feature_imdb_id": 1167292 + } + ] + }, + { + "season_number": 4, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" In Sight of the Lord: Part 1", + "feature_id": 126888, + "feature_imdb_id": 743362 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" In Sight of the Lord: Part 2", + "feature_id": 126866, + "feature_imdb_id": 1103924 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" False Flag: Part 1", + "feature_id": 126852, + "feature_imdb_id": 743359 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" False Flag: Part 2", + "feature_id": 126857, + "feature_imdb_id": 1167291 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" Fugue States: Part 1", + "feature_id": 126880, + "feature_imdb_id": 743361 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" Fugue States: Part 2", + "feature_id": 126886, + "feature_imdb_id": 1167293 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" Anger Management: Part 1", + "feature_id": 126889, + "feature_imdb_id": 743351 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" Anger Management: Part 2", + "feature_id": 126874, + "feature_imdb_id": 1167287 + }, + { + "episode_number": 9, + "title": "\"Waking the Dead\" The Hardest Word: Part 1", + "feature_id": 126891, + "feature_imdb_id": 743370 + }, + { + "episode_number": 10, + "title": "\"Waking the Dead\" The Hardest Word: Part 2", + "feature_id": 126890, + "feature_imdb_id": 1167298 + }, + { + "episode_number": 11, + "title": "\"Waking the Dead\" Shadowplay: Part 1", + "feature_id": 126893, + "feature_imdb_id": 743366 + }, + { + "episode_number": 12, + "title": "\"Waking the Dead\" Shadowplay: Part 2", + "feature_id": 126892, + "feature_imdb_id": 1167295 + } + ] + }, + { + "season_number": 5, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" Towers of Silence: Part 1", + "feature_id": 126810, + "feature_imdb_id": 743372 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" Towers of Silence: Part 2", + "feature_id": 126811, + "feature_imdb_id": 1167300 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" Black Run: Part 1", + "feature_id": 126814, + "feature_imdb_id": 743352 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" Black Run: Part 2", + "feature_id": 126808, + "feature_imdb_id": 1167288 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" Subterraneans: Part 1", + "feature_id": 126816, + "feature_imdb_id": 743369 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" Subterraneans: Part 2", + "feature_id": 126818, + "feature_imdb_id": 1167297 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" Straw Dog: Part 1", + "feature_id": 126820, + "feature_imdb_id": 743368 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" Straw Dog: Part 2", + "feature_id": 126822, + "feature_imdb_id": 1167296 + }, + { + "episode_number": 9, + "title": "\"Waking the Dead\" Undertow: Part 1", + "feature_id": 126819, + "feature_imdb_id": 743373 + }, + { + "episode_number": 10, + "title": "\"Waking the Dead\" Undertow: Part 2", + "feature_id": 126821, + "feature_imdb_id": 1167301 + }, + { + "episode_number": 11, + "title": "\"Waking the Dead\" Cold Fusion: Part 1", + "feature_id": 126823, + "feature_imdb_id": 743356 + }, + { + "episode_number": 12, + "title": "\"Waking the Dead\" Cold Fusion: Part 2", + "feature_id": 126817, + "feature_imdb_id": 1167290 + } + ] + }, + { + "season_number": 6, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" Wren Boys: Part 1", + "feature_id": 126895, + "feature_imdb_id": 930851 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" Wren Boys: Part 2", + "feature_id": 126855, + "feature_imdb_id": 932475 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" Deus Ex Machina: Part 1", + "feature_id": 126894, + "feature_imdb_id": 932472 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" Deus Ex Machina: Part 2", + "feature_id": 126896, + "feature_imdb_id": 932473 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" The Fall: Part 1", + "feature_id": 126898, + "feature_imdb_id": 875569 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" The Fall: Part 2", + "feature_id": 126873, + "feature_imdb_id": 938259 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" Mask of Sanity: Part 1", + "feature_id": 126899, + "feature_imdb_id": 952542 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" Mask of Sanity: Part 2", + "feature_id": 126902, + "feature_imdb_id": 952543 + }, + { + "episode_number": 9, + "title": "\"Waking the Dead\" Double Bind: Part 1", + "feature_id": 126897, + "feature_imdb_id": 952540 + }, + { + "episode_number": 10, + "title": "\"Waking the Dead\" Double Bind: Part 2", + "feature_id": 126903, + "feature_imdb_id": 952541 + }, + { + "episode_number": 11, + "title": "\"Waking the Dead\" Yahrzeit: Part 1", + "feature_id": 126901, + "feature_imdb_id": 892727 + }, + { + "episode_number": 12, + "title": "\"Waking the Dead\" Yahrzeit: Part 2", + "feature_id": 126900, + "feature_imdb_id": 942279 + } + ] + }, + { + "season_number": 7, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" Missing Persons: Part 1", + "feature_id": 126825, + "feature_imdb_id": 1215441 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" Missing Persons: Part 2", + "feature_id": 126824, + "feature_imdb_id": 1215442 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" Sins: Part 1", + "feature_id": 126815, + "feature_imdb_id": 1218284 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" Sins: Part 2", + "feature_id": 126826, + "feature_imdb_id": 1218285 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" Duty and Honour: Part 1", + "feature_id": 126828, + "feature_imdb_id": 1221781 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" Duty and Honour: Part 2", + "feature_id": 126830, + "feature_imdb_id": 1221782 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" Skin: Part 1", + "feature_id": 126829, + "feature_imdb_id": 1225236 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" Skin: Part 2", + "feature_id": 126831, + "feature_imdb_id": 1225237 + }, + { + "episode_number": 9, + "title": "\"Waking the Dead\" Wounds: Part 1", + "feature_id": 126827, + "feature_imdb_id": 1227115 + }, + { + "episode_number": 10, + "title": "\"Waking the Dead\" Wounds: Part 2", + "feature_id": 126834, + "feature_imdb_id": 1227116 + }, + { + "episode_number": 11, + "title": "\"Waking the Dead\" Pieta: Part 1", + "feature_id": 126833, + "feature_imdb_id": 1231221 + }, + { + "episode_number": 12, + "title": "\"Waking the Dead\" Pietà: Part 2", + "feature_id": 126832, + "feature_imdb_id": 1231222 + } + ] + }, + { + "season_number": 8, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" Magdalene 26: Part 1", + "feature_id": 126836, + "feature_imdb_id": 1506431 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" Magdalene 26: Part 2", + "feature_id": 126839, + "feature_imdb_id": 1506432 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" End of the Night: Part 1", + "feature_id": 126837, + "feature_imdb_id": 1509622 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" End of the Night: Part 2", + "feature_id": 126838, + "feature_imdb_id": 1509623 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" Substitute: Part 1", + "feature_id": 126840, + "feature_imdb_id": 1513669 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" Substitute: Part 2", + "feature_id": 126842, + "feature_imdb_id": 1514406 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" End Game: Part 1", + "feature_id": 126846, + "feature_imdb_id": 1519231 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" End Game: Part 2", + "feature_id": 126843, + "feature_imdb_id": 1519232 + } + ] + }, + { + "season_number": 9, + "episodes": [ + { + "episode_number": 1, + "title": "\"Waking the Dead\" Harbinger: Part 1", + "feature_id": 126856, + "feature_imdb_id": 1862440 + }, + { + "episode_number": 2, + "title": "\"Waking the Dead\" Harbinger: Part 2", + "feature_id": 126853, + "feature_imdb_id": 1862441 + }, + { + "episode_number": 3, + "title": "\"Waking the Dead\" Care: Part 1", + "feature_id": 126844, + "feature_imdb_id": 1865234 + }, + { + "episode_number": 4, + "title": "\"Waking the Dead\" Care: Part 2", + "feature_id": 126845, + "feature_imdb_id": 1865235 + }, + { + "episode_number": 5, + "title": "\"Waking the Dead\" Solidarity: Part 1", + "feature_id": 126849, + "feature_imdb_id": 1869183 + }, + { + "episode_number": 6, + "title": "\"Waking the Dead\" Solidarity: Part 2", + "feature_id": 126851, + "feature_imdb_id": 1869184 + }, + { + "episode_number": 7, + "title": "\"Waking the Dead\" Conviction: Part 1", + "feature_id": 126848, + "feature_imdb_id": 1877523 + }, + { + "episode_number": 8, + "title": "\"Waking the Dead\" Conviction: Part 2", + "feature_id": 126841, + "feature_imdb_id": 1877524 + }, + { + "episode_number": 9, + "title": "\"Waking the Dead\" Waterloo, Part 1", + "feature_id": 126850, + "feature_imdb_id": 1886367 + }, + { + "episode_number": 10, + "title": "\"Waking the Dead\" Waterloo, Part 2", + "feature_id": 126847, + "feature_imdb_id": 1886368 + } + ] + } + ] + } + }, + { + "id": "126842", + "type": "feature", + "attributes": { + "title": "\"Waking the Dead\" Substitute: Part 2", + "original_title": "", + "year": "2009", + "subtitles_counts": { + "nl": 1, + "en": 1, + "sr": 1, + "es": 1 + }, + "subtitles_count": 4, + "seasons_count": 0, + "parent_title": "Waking the Dead", + "season_number": 8, + "episode_number": 6, + "imdb_id": 1514406, + "tmdb_id": "", + "parent_imdb_id": 259733, + "feature_id": "126842", + "title_aka": [ + "\"Waking the Dead\" Substitute: Part 2" + ], + "feature_type": "Episode", + "url": "https://www.opensubtitles.com/en/tvshows/2000-waking-the-dead/seasons/8/episodes/6-waking-the-dead-substitute-part-2", + "img_url": "https://s9.osdb.link/features/2/4/8/126842.jpg", + "seasons": [] + } + }, + { + "id": "126810", + "type": "feature", + "attributes": { + "title": "\"Waking the Dead\" Towers of Silence: Part 1", + "original_title": "", + "year": "2005", + "subtitles_counts": { + "es": 10, + "en": 4, + "pl": 3, + "pt-PT": 3, + "bg": 2, + "he": 2, + "fa": 2, + "ru": 2, + "sr": 2, + "tr": 2, + "ro": 2, + "pt-BR": 2, + "ar": 1, + "bs": 1, + "cs": 1, + "nl": 1, + "et": 1, + "fi": 1, + "fr": 1, + "el": 1, + "hr": 1, + "hu": 1, + "id": 1, + "ja": 1, + "sk": 1, + "sl": 1, + "th": 1, + "vi": 1 + }, + "subtitles_count": 52, + "seasons_count": 0, + "parent_title": "Waking the Dead", + "season_number": 5, + "episode_number": 1, + "imdb_id": 743372, + "tmdb_id": "", + "parent_imdb_id": 259733, + "feature_id": "126810", + "title_aka": [ + "\"Waking the Dead\" Towers of Silence: Part 1" + ], + "feature_type": "Episode", + "url": "https://www.opensubtitles.com/en/tvshows/2000-waking-the-dead/seasons/5/episodes/1-waking-the-dead-towers-of-silence-part-1", + "img_url": "https://s9.osdb.link/features/0/1/8/126810.jpg", + "seasons": [] + } + }, + { + "id": "646786", + "type": "feature", + "attributes": { + "title": "Waking the Dead", + "original_title": "Waking the Dead", + "year": "2000", + "subtitles_counts": { + "en": 68, + "es": 41, + "nl": 40, + "ro": 40, + "ru": 30, + "sr": 21, + "pl": 7, + "pt-BR": 4, + "hr": 3, + "pt-PT": 3, + "bg": 2, + "el": 2, + "he": 2, + "fa": 2, + "sl": 2, + "tr": 2, + "ar": 1, + "bs": 1, + "cs": 1, + "et": 1, + "fi": 1, + "fr": 1, + "hu": 1, + "id": 1, + "ja": 1, + "sk": 1, + "th": 1, + "vi": 1 + }, + "subtitles_count": 25, + "seasons_count": 0, + "parent_title": "", + "season_number": 0, + "episode_number": "", + "imdb_id": 127349, + "tmdb_id": 37722, + "parent_imdb_id": "", + "feature_id": "646786", + "title_aka": [ + "Waking the Dead", + " Resucitar un amor", + " Le Fantôme de Sarah Williams", + " Szerelmem szelleme", + " Amor Maior que a Vida", + " Пробуждая мертвецов", + " 死亡中惊醒" + ], + "feature_type": "Movie", + "url": "https://www.opensubtitles.com/en/movies/2000-waking-the-dead-5559", + "img_url": "https://s9.osdb.link/features/6/8/7/646786.jpg", + "seasons": [] + } + }, + { + "id": "126847", + "type": "feature", + "attributes": { + "title": "\"Waking the Dead\" Waterloo, Part 2", + "original_title": "", + "year": "2011", + "subtitles_counts": { + "nl": 1, + "en": 1, + "sr": 1, + "ro": 1 + }, + "subtitles_count": 4, + "seasons_count": 0, + "parent_title": "Waking the Dead", + "season_number": 9, + "episode_number": 10, + "imdb_id": 1886368, + "tmdb_id": "", + "parent_imdb_id": 259733, + "feature_id": "126847", + "title_aka": [ + "\"Waking the Dead\" Waterloo", + " Part 2" + ], + "feature_type": "Episode", + "url": "https://www.opensubtitles.com/en/tvshows/2000-waking-the-dead/seasons/9/episodes/10-waking-the-dead-waterloo-part-2", + "img_url": "", + "seasons": [] + } + }, + { + "id": "126857", + "type": "feature", + "attributes": { + "title": "\"Waking the Dead\" False Flag: Part 2", + "original_title": "", + "year": "2004", + "subtitles_counts": { + "ru": 2, + "ro": 2, + "en": 1 + }, + "subtitles_count": 5, + "seasons_count": 0, + "parent_title": "Waking the Dead", + "season_number": 4, + "episode_number": 4, + "imdb_id": 1167291, + "tmdb_id": "", + "parent_imdb_id": 259733, + "feature_id": "126857", + "title_aka": [ + "\"Waking the Dead\" False Flag: Part 2" + ], + "feature_type": "Episode", + "url": "https://www.opensubtitles.com/en/tvshows/2000-waking-the-dead/seasons/4/episodes/4-waking-the-dead-false-flag-part-2", + "img_url": "https://s9.osdb.link/features/7/5/8/126857.jpg", + "seasons": [] + } + }, + { + "id": "62212", + "type": "feature", + "attributes": { + "title": "\"Point Pleasant\" Waking the Dead", + "original_title": "", + "year": "2005", + "subtitles_counts": { + "pl": 3, + "en": 2, + "hu": 2, + "cs": 1, + "nl": 1, + "et": 1, + "fi": 1, + "fr": 1, + "el": 1, + "pt-PT": 1, + "ro": 1, + "pt-BR": 1 + }, + "subtitles_count": 16, + "seasons_count": 0, + "parent_title": "Point Pleasant", + "season_number": 1, + "episode_number": 9, + "imdb_id": 676101, + "tmdb_id": "", + "parent_imdb_id": 435576, + "feature_id": "62212", + "title_aka": [ + "\"Point Pleasant\" Waking the Dead" + ], + "feature_type": "Episode", + "url": "https://www.opensubtitles.com/en/tvshows/2005-point-pleasant/seasons/1/episodes/9-point-pleasant-waking-the-dead", + "img_url": "https://s9.osdb.link/features/2/1/2/62212.jpg", + "seasons": [] + } + }, + { + "id": "126869", + "type": "feature", + "attributes": { + "title": "\"Waking the Dead\" Every Breath You Take: Part 2", + "original_title": "", + "year": "2001", + "subtitles_counts": { + "en": 1, + "es": 1, + "ro": 1 + }, + "subtitles_count": 3, + "seasons_count": 0, + "parent_title": "Waking the Dead", + "season_number": 1, + "episode_number": 10, + "imdb_id": 936018, + "tmdb_id": "", + "parent_imdb_id": 259733, + "feature_id": "126869", + "title_aka": [ + "\"Waking the Dead\" Every Breath You Take: Part 2" + ], + "feature_type": "Episode", + "url": "https://www.opensubtitles.com/en/tvshows/2000-waking-the-dead/seasons/1/episodes/10-waking-the-dead-every-breath-you-take-part-2", + "img_url": "", + "seasons": [] + } + }, + { + "id": "126826", + "type": "feature", + "attributes": { + "title": "\"Waking the Dead\" Sins: Part 2", + "original_title": "", + "year": "2008", + "subtitles_counts": { + "ru": 2, + "nl": 1, + "en": 1 + }, + "subtitles_count": 4, + "seasons_count": 0, + "parent_title": "Waking the Dead", + "season_number": 7, + "episode_number": 4, + "imdb_id": 1218285, + "tmdb_id": "", + "parent_imdb_id": 259733, + "feature_id": "126826", + "title_aka": [ + "\"Waking the Dead\" Sins: Part 2" + ], + "feature_type": "Episode", + "url": "https://www.opensubtitles.com/en/tvshows/2000-waking-the-dead/seasons/7/episodes/4-waking-the-dead-sins-part-2", + "img_url": "", + "seasons": [] + } + }, + { + "id": "126837", + "type": "feature", + "attributes": { + "title": "\"Waking the Dead\" End of the Night: Part 1", + "original_title": "", + "year": "2009", + "subtitles_counts": { + "nl": 2, + "en": 1, + "sr": 1, + "es": 1 + }, + "subtitles_count": 5, + "seasons_count": 0, + "parent_title": "Waking the Dead", + "season_number": 8, + "episode_number": 3, + "imdb_id": 1509622, + "tmdb_id": "", + "parent_imdb_id": 259733, + "feature_id": "126837", + "title_aka": [ + "\"Waking the Dead\" End of the Night: Part 1" + ], + "feature_type": "Episode", + "url": "https://www.opensubtitles.com/en/tvshows/2000-waking-the-dead/seasons/8/episodes/3-waking-the-dead-end-of-the-night-part-1", + "img_url": "https://s9.osdb.link/features/7/3/8/126837.jpg", + "seasons": [] + } + } + ], + "value": "this is test how it is rendered" + } + }, + "example": { + "example": { + "value": { + "data": [ + { + "id": "646193", + "type": "feature", + "attributes": { + "title": "The Matrix", + "original_title": "The Matrix", + "year": "1999", + "subtitles_counts": { + "pl": 151, + "en": 120, + "tr": 68, + "ro": 57, + "es": 55, + "cs": 54, + "pt-BR": 49, + "sl": 41, + "pt-PT": 39, + "sr": 39, + "el": 38, + "he": 31, + "bg": 30, + "nl": 24, + "fr": 20, + "fi": 19, + "hu": 17, + "ar": 16, + "ru": 15, + "hr": 14, + "da": 13, + "et": 11, + "sv": 11, + "sq": 10, + "de": 8, + "bs": 7, + "it": 7, + "ko": 7, + "no": 7, + "fa": 7, + "sk": 7, + "zh-CN": 6, + "mk": 6, + "ms": 4, + "zh-TW": 4, + "bn": 3, + "id": 3, + "lt": 3, + "is": 2, + "ja": 2, + "th": 2, + "my": 1, + "ca": 1, + "hi": 1, + "ml": 1, + "mn": 1, + "uk": 1, + "vi": 1 + }, + "subtitles_count": 1034, + "seasons_count": 0, + "parent_title": "", + "season_number": 0, + "imdb_id": 133093, + "tmdb_id": 603, + "feature_id": "646193", + "title_aka": [ + "Матрицата", + " The Matrix", + " Matrix", + " ماتریکس", + " מטריקס", + " Mátrix", + " マトリックス", + " 매트릭스", + " Matrica", + " 黑客帝国", + " Матрица", + " Матрикс", + " เดอะ เมทริกซ์ : เพาะพันธุ์มนุษย์เหนือโลก 2199", + " Матриця" + ], + "feature_type": "Movie", + "url": "https://www.opensubtitles.com/en/movies/1999-the-matrix", + "img_url": "https://m.media-amazon.com/images/M/MV5BNzQzOTk3OTAtNDQ0Zi00ZTVkLWI0MTEtMDllZjNkYzNjNTc4L2ltYWdlXkEyXkFqcGdeQXVyNjU0OTQ0OTY@._V1_UX182_CR0,0,182,268_AL_.jpg", + "seasons": [] + } + }, + { + "id": "646060", + "type": "feature", + "attributes": { + "title": "The Matrix Revolutions", + "original_title": "The Matrix Revolutions", + "year": "2003", + "subtitles_counts": { + "tr": 29, + "es": 26, + "en": 22, + "sr": 22, + "ro": 20, + "pt-BR": 16, + "bg": 15, + "cs": 14, + "pt-PT": 12, + "sl": 11, + "pl": 10, + "fi": 9, + "fr": 8, + "ar": 7, + "et": 7, + "nl": 6, + "he": 6, + "el": 5, + "hu": 5, + "da": 4, + "mk": 4, + "hr": 3, + "id": 3, + "sk": 3, + "sq": 1, + "zh-CN": 1, + "de": 1, + "is": 1, + "it": 1, + "lt": 1, + "no": 1, + "ru": 1, + "sv": 1 + }, + "subtitles_count": 818, + "seasons_count": 0, + "parent_title": "", + "season_number": 0, + "imdb_id": 242653, + "tmdb_id": 605, + "feature_id": "646060", + "title_aka": [ + "Матрицата: Революции", + " Matrix Revolutions", + " The Matrix: Revolutions", + " The Matrix Revolutions", + " Matrix revolutions", + " انقلاب‌های ماتریکس", + " מטריקס רבולושנס", + " Mátrix - Forradalmak", + " 매트릭스 3: 레볼루션", + " Matrix - Revoluții", + " Матрица: Революция", + " ปฎิวัติมนุษย์เหนือโลก", + " Матриця: Революція", + " 黑客帝国3:矩阵革命" + ], + "feature_type": "Movie", + "url": "https://www.opensubtitles.com/en/movies/2003-the-matrix-revolutions", + "img_url": "https://m.media-amazon.com/images/M/MV5BNzNlZTZjMDctZjYwNi00NzljLWIwN2QtZWZmYmJiYzQ0MTk2XkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_UX182_CR0,0,182,268_AL_.jpg", + "seasons": [] + } + } + ] + } + } + } + } + } + }, + "deprecated": false, + "security": [ + { + "Api-Key": [] + } + ] + } + }, + "/subtitles": { + "get": { + "tags": [ + "Subtitles" + ], + "summary": "Search for subtitles", + "description": "Find subtitle for a video file. All parameters can be combined following various logics: searching by a specific external id (imdb, tmdb), a file moviehash, or a simple text query.\n\n\n> Something wrong? Read about [common mistakes and best practices](docs/2-Best-Practices.md). \n\n> Getting no results? Follow HTTP redirects! ```curl --location``` and use verbose mode\n\n> Use ```imdb_id for``` movie or episode. Use ```parent_imdb_id``` for TV Shows\n\n\n\nImplement the logic that best fits your needs, keeping in mind the following guidelines:\n\n- If you can obtain the moviehash from the file, please send it along.\n- If you possess the ID, whether it's IMDB or TMDB, send it instead of a query, as an ID provides more precision.\n- When searching for TV show episodes, it is recommended to send the parent ID, along with the episode and season number for optimal results. If you have the unique ID of an episode, only send this ID, excluding the episode or season number.\n- Include the filename as a query parameter along with the moviehash for improved results. If your filenames are generally irrelevant, such as dynamically generated filenames from a streaming service, there's no need to include them.\n- Consider treating parameters as filters rather than additional criteria. If you have a specific ID and send a query with conflicting data, like a wrong year, it could result in fewer matches.\n- Explore querying the /features endpoint to gather the exact list of available episodes.\n- Keep in mind that this is a collaborative project where subtitles are submitted by users, filtered by admins, and movie/show results are processed through various APIs. Occasionally, errors may occur, and we depend on user feedback to address and rectify them.\n\n\n> Avoid http redirection by sending request parameters sorted and without default values, and send all queries in lowercase. Remove leading zeroes in ID parameters (IMDB ID, TMDB ID...)\n\n### Moviehash \nIf a ```moviehash``` is sent with a request, a ```moviehash_match``` boolean field will be added to the response.\n\nThe matching subtitles will always come first in the response.\n\n\n### Ordering\n\n\n> If possible, don't order results, because sorting on server is \"expensive, time consuming operation\" and also you have much higher chance to get cached result when not using this function.\n\nYou can order the results using the ```order_by``` parameter. Ordering is possible on the following fields:\n```language```, ```download_count```, ```new_download_count```, ```hearing_impaired```, ```hd```, ```fps```, ```votes```, ```points```, ```ratings```, ```from_trusted```, ```foreign_parts_only```, ```ai_translated```, ```machine_translated```, ```upload_date```, ```release```, ```comments```\n\nChange the order direction with *order_direction* (asc/desc)\n\n### Final notes\n```ai_translated``` (default include in search results) subtitles should be much better quality than ```machine_translated``` subtitles (excluded in search results).", + "operationId": "subtitles", + "parameters": [ + { + "name": "id", + "in": "query", + "description": "ID of the movie or episode", + "schema": { + "type": "integer" + } + }, + { + "name": "imdb_id", + "in": "query", + "description": "IMDB ID of the movie or episode", + "schema": { + "type": "integer" + } + }, + { + "name": "tmdb_id", + "in": "query", + "description": "TMDB ID of the movie or episode", + "schema": { + "type": "integer" + } + }, + { + "name": "type", + "in": "query", + "description": "movie, episode or all, (default: all) ", + "schema": { + "type": "string" + } + }, + { + "name": "query", + "in": "query", + "description": "file name or text search", + "schema": { + "type": "string" + } + }, + { + "name": "languages", + "in": "query", + "description": "Language code(s), comma separated, sorted in alphabetical order (en,fr)", + "schema": { + "type": "string" + } + }, + { + "name": "moviehash", + "in": "query", + "description": "Moviehash of the moviefile", + "schema": { + "maxLength": 16, + "minLength": 16, + "pattern": "^[a-f0-9]{16}$", + "type": "string" + } + }, + { + "name": "uploader_id", + "in": "query", + "description": "To be used alone - for user uploads listing", + "schema": { + "type": "integer" + } + }, + { + "name": "hearing_impaired", + "in": "query", + "description": "include, exclude, only. (default: include)", + "schema": { + "type": "string" + } + }, + { + "name": "foreign_parts_only", + "in": "query", + "description": "exclude, include, only (default: include)", + "schema": { + "type": "string" + } + }, + { + "name": "trusted_sources", + "in": "query", + "description": "include, only (default: include)", + "schema": { + "type": "string" + } + }, + { + "name": "machine_translated", + "in": "query", + "description": "exclude, include (default: exclude)", + "schema": { + "type": "string" + } + }, + { + "name": "ai_translated", + "in": "query", + "description": "exclude, include (default: include)", + "schema": { + "type": "string" + } + }, + { + "name": "order_by", + "in": "query", + "description": "Order of the returned results, accept any of above fields", + "schema": { + "type": "string" + } + }, + { + "name": "order_direction", + "in": "query", + "description": "Order direction of the returned results (asc,desc)", + "schema": { + "type": "string" + } + }, + { + "name": "parent_feature_id", + "in": "query", + "description": "For Tvshows", + "schema": { + "type": "integer" + } + }, + { + "name": "parent_imdb_id", + "in": "query", + "description": "For Tvshows", + "schema": { + "type": "integer" + } + }, + { + "name": "parent_tmdb_id", + "in": "query", + "description": "For Tvshows", + "schema": { + "type": "integer" + } + }, + { + "name": "season_number", + "in": "query", + "description": "For Tvshows\n", + "schema": { + "type": "integer" + } + }, + { + "name": "episode_number", + "in": "query", + "description": "For Tvshows", + "schema": { + "type": "integer" + } + }, + { + "name": "year", + "in": "query", + "description": "Filter by movie/episode year", + "schema": { + "type": "integer" + } + }, + { + "name": "moviehash_match", + "in": "query", + "description": "include, only (default: include)", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "description": "Results page to display", + "schema": { + "type": "integer" + } + }, + { + "schema": { + "type": "string" + }, + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ], + "responses": { + "200": { + "description": "Find subtitles for a video file ", + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "", + "properties": { + "total_pages": { + "type": "number" + }, + "total_count": { + "type": "number" + }, + "page": { + "type": "number" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Subtitle" + } } - }, - "description": "", - "x-tags": [ - "Models" - ] + }, + "required": [ + "total_pages", + "total_count", + "page", + "data" + ] + } + } + } + } + }, + "deprecated": false, + "security": [ + { + "Api-Key": [] + } + ] + } + }, + "/download": { + "post": { + "tags": [ + "Download" + ], + "summary": "Download", + "description": "Request a download url for a subtitle. Subtitle file in temporary URL will be always in UTF-8 encoding.\n\n\n\n> VERY IMPORTANT: In HTTP request must be both headers: ```Api-Key``` and ```Authorization``` stoplight.io doesn't allow to use in shown example both headers\n\n\n> The download count is calculated on this action, not the file download itself\n\n> IN and OUT FPS must be indicated for subtitle conversions, we want to make sure you know what you are doing, and therefore collected the current FPS from the subtitle search result, or calculated it somehow.\n\n\n\n> The download URL is temporary, and cannot be used more than 3 hours, so do not cache it, but you can download the file more than once if needed.", + "operationId": "download", + "parameters": [ + { + "schema": { + "type": "string" }, - "Feature-Episode": { + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "x-examples": { + "example-1": { + "file_id": "", + "sub_format": "", + "file_name": "", + "in_fps": "", + "out_fps": "", + "timeshift": "", + "force_download": "" + } + }, "required": [ - "attributes", - "id", - "type" + "file_id" ], - "type": "object", "properties": { - "id": { - "minLength": 1, - "type": "string" + "file_id": { + "type": "integer", + "description": "file_id from /subtitles search results", + "format": "int32", + "example": 123 + }, + "sub_format": { + "type": "string", + "description": "from /infos/formats" + }, + "file_name": { + "type": "string", + "description": "desired file name" + }, + "in_fps": { + "type": "number", + "description": "used for conversions, in_fps and out_fps must then be indicated" + }, + "out_fps": { + "type": "number", + "description": "used for conversions, in_fps and out_fps must then be indicated" + }, + "timeshift": { + "type": "number", + "description": "delay to add or remove to the subtitle, + or - value, in seconds, i.e. 2.5s or -1s " + }, + "force_download": { + "type": "boolean", + "description": "(1/0) set subtitle file headers to \"application/force-download\"" + } + } + }, + "examples": { + "example-1": { + "value": { + "file_id": 123 + } + } + } + } + }, + "required": false, + "description": "" + }, + "responses": { + "200": { + "description": "Request a download URL for a subtitle. \n", + "content": { + "application/json": { + "schema": { + "description": "", + "type": "object", + "properties": { + "link": { + "type": "string", + "minLength": 1 }, - "type": { - "minLength": 1, - "type": "string" + "file_name": { + "type": "string", + "minLength": 1 }, - "attributes": { - "type": "object", - "properties": { - "title": { - "minLength": 1, - "type": "string" - }, - "original_title": { - "type": "object" - }, - "year": { - "minLength": 1, - "type": "string" - }, - "parent_imdb_id": { - "type": "object" - }, - "parent_title": { - "minLength": 1, - "type": "string" - }, - "season_number": { - "type": "number" - }, - "episode_number": { - "type": "number" - }, - "imdb_id": { - "type": "number" - }, - "tmdb_id": { - "type": "number" - }, - "title_aka": { - "type": "array", - "items": { - "type": "object", - "properties": {} - } - }, - "feature_id": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - }, - "img_url": { - "minLength": 1, - "type": "string" - }, - "subtitles_counts": { - "type": "object", - "properties": { - "pl": { - "type": "number" - }, - "en": { - "type": "number" - }, - "pt-BR": { - "type": "number" - }, - "es": { - "type": "number" - }, - "ro": { - "type": "number" - }, - "nl": { - "type": "number" - }, - "tr": { - "type": "number" - }, - "he": { - "type": "number" - }, - "pt-PT": { - "type": "number" - }, - "cs": { - "type": "number" - }, - "fi": { - "type": "number" - }, - "hu": { - "type": "number" - }, - "ar": { - "type": "number" - }, - "bg": { - "type": "number" - }, - "fr": { - "type": "number" - }, - "sl": { - "type": "number" - }, - "el": { - "type": "number" - }, - "hr": { - "type": "number" - }, - "sr": { - "type": "number" - }, - "et": { - "type": "number" - }, - "sv": { - "type": "number" - }, - "th": { - "type": "number" - }, - "bs": { - "type": "number" - }, - "da": { - "type": "number" - }, - "de": { - "type": "number" - }, - "mk": { - "type": "number" - }, - "no": { - "type": "number" - }, - "ru": { - "type": "number" - } - } - }, - "subtitles_count": { - "type": "number" - } - } + "requests": { + "type": "number" + }, + "remaining": { + "type": "number" + }, + "message": { + "type": "string", + "minLength": 1 + }, + "reset_time": { + "type": "string", + "minLength": 1 + }, + "reset_time_utc": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "link", + "file_name", + "requests", + "remaining", + "message", + "reset_time", + "reset_time_utc" + ], + "x-examples": { + "example-1": { + "link": "https://www.opensubtitles.com/download/A184A5EA6302F2CA7FD9D49BCEA49A1F36662BBEFB8C9B0ECDC9BB6CAF4BF09A5AA8D7B95C7FBD01615021D1973BAC18D431A8E6A1F627E4617341E8508A6968532088A68B6DDDA996C0116E2CE6F778ED9096A9CAB942B42B59C4EA93F1A7D61FCD6CBBC29C720EBD40CE674A55375862F00981E5D2F315A0982766A2004E0ED0AD9ADABEB506A638F1B829DBC2BE15979F22DA123523967F4D4069BC32098F1086F09AAA776CC365ED744633FD5FA7160B65A2C83539DF30134F5BE6272E46019AF9FD2423AFE12E1DC8642CDB56B8FEB9A4C1F30BF68EF431A3D4ABD3A7E44559E3E572210E5A5A33EC282D3445C537C5DA9DA598300A9900FA1B3B92983FD1504FDDFB34F89E409BF03EC662FC5734F25843C277A64B7C603156926FC6C74AA1D14AABEA6E20/subfile/castle.rock.s01e03.webrip.x264-tbs.ettv.-eng.ro.srt", + "file_name": "castle.rock.s01e03.webrip.x264-tbs.ettv.-eng.ro.srt", + "requests": 3, + "remaining": 97, + "message": "Your quota will be renewed in 07 hours and 40 minutes (2022-04-08 13:03:15 UTC) ", + "reset_time": "07 hours and 40 minutes", + "reset_time_utc": "2022-04-08T13:03:15.000Z" } + } }, - "description": "", - "x-tags": [ - "Models" - ] + "examples": { + "example-1": { + "value": { + "link": "https://www.opensubtitles.com/download/A184A5EA6302F2CA7FD9D49BCEA49A1F36662BBEFB8C9B0ECDC9BB6CAF4BF09A5AA8D7B95C7FBD01615021D1973BAC18D431A8E6A1F627E4617341E8508A6968532088A68B6DDDA996C0116E2CE6F778ED9096A9CAB942B42B59C4EA93F1A7D61FCD6CBBC29C720EBD40CE674A55375862F00981E5D2F315A0982766A2004E0ED0AD9ADABEB506A638F1B829DBC2BE15979F22DA123523967F4D4069BC32098F1086F09AAA776CC365ED744633FD5FA7160B65A2C83539DF30134F5BE6272E46019AF9FD2423AFE12E1DC8642CDB56B8FEB9A4C1F30BF68EF431A3D4ABD3A7E44559E3E572210E5A5A33EC282D3445C537C5DA9DA598300A9900FA1B3B92983FD1504FDDFB34F89E409BF03EC662FC5734F25843C277A64B7C603156926FC6C74AA1D14AABEA6E20/subfile/castle.rock.s01e03.webrip.x264-tbs.ettv.-eng.ro.srt", + "file_name": "castle.rock.s01e03.webrip.x264-tbs.ettv.-eng.ro.srt", + "requests": 3, + "remaining": 97, + "message": "Your quota will be renewed in 07 hours and 30 minutes (2022-04-08 13:03:16 UTC) ", + "reset_time": "07 hours and 30 minutes", + "reset_time_utc": "2022-04-08T13:03:16.000Z" + } + } + } + } + } + } + }, + "deprecated": false, + "security": [ + { + "Bearer": [] + }, + { + "Api-Key": [] + } + ], + "x-codegen-request-body-name": "body" + }, + "parameters": [] + }, + "/utilities/guessit": { + "get": { + "tags": [ + "Utilities" + ], + "summary": "Guessit", + "description": "Extracts as much information as possible from a video filename.\n\nIt has a very powerful matcher that allows to guess properties from a video using its filename only. This matcher works with both movies and tv shows episodes.\n\nThis is a simple implementation of the python guessit library.\nhttps://guessit-io.github.io/guessit/\n\nFind examples of the returned data.\nhttps://guessit-io.github.io/guessit/properties/", + "operationId": "guessit", + "parameters": [ + { + "name": "filename", + "in": "query", + "description": "File name", + "schema": { + "type": "string" + } + }, + { + "schema": { + "type": "string" }, - "Feature-Movie": { + "in": "header", + "name": "User-Agent", + "description": "<<{{APP_NAME}} v{{APP_VERSION}}>>" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "required": [ + "audio_channels", + "audio_codec", + "language", + "other", + "release_group", + "screen_size", + "source", + "streaming_service", + "subtitle_language", + "title", + "type", + "video_codec", + "year" + ], + "type": "object", + "properties": { + "title": { + "minLength": 1, + "type": "string" + }, + "year": { + "type": "number" + }, + "language": { + "minLength": 1, + "type": "string" + }, + "subtitle_language": { + "minLength": 1, + "type": "string" + }, + "screen_size": { + "minLength": 1, + "type": "string" + }, + "streaming_service": { + "minLength": 1, + "type": "string" + }, + "source": { + "minLength": 1, + "type": "string" + }, + "other": { + "minLength": 1, + "type": "string" + }, + "audio_codec": { + "minLength": 1, + "type": "string" + }, + "audio_channels": { + "minLength": 1, + "type": "string" + }, + "video_codec": { + "minLength": 1, + "type": "string" + }, + "release_group": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + } + }, + "description": "" + } + } + } + } + }, + "security": [ + { + "Api-Key": [] + } + ] + } + } + }, + "components": { + "schemas": { + "Subtitle": { + "type": "object", + "x-tags": [ + "Models" + ], + "properties": { + "id": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + }, + "attributes": { + "type": "object", + "required": [ + "subtitle_id", + "language", + "download_count", + "new_download_count", + "from_trusted", + "foreign_parts_only", + "ai_translated", + "machine_translated", + "upload_date", + "feature_details", + "url", + "files" + ], + "properties": { + "subtitle_id": { + "minLength": 1, + "type": "string" + }, + "language": { + "minLength": 1, + "type": "string" + }, + "download_count": { + "type": "number" + }, + "new_download_count": { + "type": "number" + }, + "hearing_impaired": { + "type": "boolean" + }, + "hd": { + "type": "boolean" + }, + "fps": { + "type": "number" + }, + "votes": { + "type": "number" + }, + "points": { + "type": "number" + }, + "ratings": { + "type": "number" + }, + "from_trusted": { + "type": "boolean" + }, + "foreign_parts_only": { + "type": "boolean" + }, + "ai_translated": { + "type": "boolean" + }, + "machine_translated": { + "type": "boolean" + }, + "upload_date": { + "minLength": 1, + "type": "string" + }, + "release": { + "minLength": 1, + "type": "string" + }, + "comments": { + "type": "string" + }, + "legacy_subtitle_id": { + "type": "number" + }, + "uploader": { + "type": "object", + "properties": { + "uploader_id": { + "type": "number" + }, + "name": { + "type": "string" + }, + "rank": { + "type": "string" + } + } + }, + "feature_details": { + "type": "object", "required": [ - "attributes", - "id", - "type" + "feature_id", + "feature_type", + "title", + "movie_name", + "imdb_id" ], - "type": "object", "properties": { - "id": { - "minLength": 1, - "type": "string" + "feature_id": { + "type": "number" + }, + "feature_type": { + "minLength": 1, + "type": "string" + }, + "year": { + "type": "number" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "movie_name": { + "minLength": 1, + "type": "string" + }, + "imdb_id": { + "type": "number" + }, + "tmdb_id": { + "type": "number" + } + } + }, + "url": { + "minLength": 1, + "type": "string" + }, + "related_links": { + "type": "array", + "items": { + "type": "object" + } + }, + "files": { + "minItems": 1, + "uniqueItems": true, + "type": "array", + "items": { + "type": "object", + "properties": { + "file_id": { + "type": "number" }, - "type": { - "minLength": 1, - "type": "string" + "cd_number": { + "type": "number" + }, + "file_name": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "file_id", + "file_name" + ] + } + } + } + } + }, + "required": [ + "id", + "type", + "attributes" + ] + }, + "Feature-Tvshow": { + "required": [ + "attributes", + "id", + "type" + ], + "type": "object", + "properties": { + "id": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + }, + "attributes": { + "required": [ + "feature_id", + "imdb_id", + "img_url", + "original_title", + "seasons", + "subtitles_count", + "subtitles_counts", + "title", + "title_aka", + "tmdb_id", + "url", + "year" + ], + "type": "object", + "properties": { + "title": { + "minLength": 1, + "type": "string" + }, + "original_title": { + "minLength": 1, + "type": "string" + }, + "year": { + "minLength": 1, + "type": "string" + }, + "imdb_id": { + "type": "number" + }, + "tmdb_id": { + "type": "number" + }, + "title_aka": { + "type": "array", + "items": { + "type": "object", + "properties": {} + } + }, + "feature_id": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + }, + "img_url": { + "minLength": 1, + "type": "string" + }, + "subtitles_counts": { + "required": [ + "ar", + "bg", + "bs", + "ca", + "cs", + "da", + "de", + "el", + "en", + "es", + "et", + "fa", + "fi", + "fr", + "he", + "hr", + "hu", + "id", + "it", + "ja", + "ko", + "mk", + "nl", + "no", + "pl", + "pt-BR", + "pt-PT", + "ro", + "ru", + "sk", + "sl", + "sr", + "sv", + "th", + "tr", + "vi", + "zh-CN", + "zh-TW" + ], + "type": "object", + "properties": { + "pl": { + "type": "number" + }, + "en": { + "type": "number" + }, + "pt-BR": { + "type": "number" + }, + "ro": { + "type": "number" + }, + "nl": { + "type": "number" + }, + "pt-PT": { + "type": "number" + }, + "es": { + "type": "number" + }, + "he": { + "type": "number" + }, + "hu": { + "type": "number" + }, + "el": { + "type": "number" + }, + "fr": { + "type": "number" + }, + "tr": { + "type": "number" + }, + "cs": { + "type": "number" + }, + "fi": { + "type": "number" + }, + "ar": { + "type": "number" + }, + "hr": { + "type": "number" + }, + "sl": { + "type": "number" + }, + "bg": { + "type": "number" + }, + "sr": { + "type": "number" + }, + "sv": { + "type": "number" + }, + "de": { + "type": "number" + }, + "et": { + "type": "number" + }, + "da": { + "type": "number" + }, + "bs": { + "type": "number" + }, + "it": { + "type": "number" + }, + "mk": { + "type": "number" + }, + "ru": { + "type": "number" + }, + "no": { + "type": "number" + }, + "th": { + "type": "number" + }, + "vi": { + "type": "number" + }, + "ja": { + "type": "number" + }, + "fa": { + "type": "number" + }, + "zh-CN": { + "type": "number" + }, + "ca": { + "type": "number" + }, + "id": { + "type": "number" + }, + "sk": { + "type": "number" + }, + "ko": { + "type": "number" + }, + "zh-TW": { + "type": "number" + } + } + }, + "subtitles_count": { + "type": "number" + }, + "seasons": { + "minItems": 1, + "uniqueItems": true, + "type": "array", + "items": { + "required": [ + "season_number" + ], + "type": "object", + "properties": { + "season_number": { + "type": "number" }, - "attributes": { + "episodes": { + "minItems": 1, + "uniqueItems": true, + "type": "array", + "items": { + "required": [ + "episode_number", + "feature_id", + "feature_imdb_id", + "title" + ], "type": "object", "properties": { - "title": { - "minLength": 1, - "type": "string" - }, - "original_title": { - "minLength": 1, - "type": "string" - }, - "year": { - "minLength": 1, - "type": "string" - }, - "subtitles_counts": { - "type": "object", - "properties": { - "en": { - "type": "number" - }, - "pt-PT": { - "type": "number" - }, - "fi": { - "type": "number" - }, - "pt-BR": { - "type": "number" - }, - "es": { - "type": "number" - }, - "ar": { - "type": "number" - }, - "pl": { - "type": "number" - }, - "sr": { - "type": "number" - }, - "id": { - "type": "number" - }, - "ro": { - "type": "number" - }, - "zh-CN": { - "type": "number" - }, - "nl": { - "type": "number" - }, - "el": { - "type": "number" - }, - "hu": { - "type": "number" - }, - "fr": { - "type": "number" - }, - "sl": { - "type": "number" - }, - "tr": { - "type": "number" - }, - "et": { - "type": "number" - }, - "bg": { - "type": "number" - }, - "cs": { - "type": "number" - }, - "de": { - "type": "number" - }, - "he": { - "type": "number" - }, - "it": { - "type": "number" - }, - "vi": { - "type": "number" - }, - "hr": { - "type": "number" - }, - "ko": { - "type": "number" - }, - "no": { - "type": "number" - }, - "sv": { - "type": "number" - }, - "ta": { - "type": "number" - }, - "eu": { - "type": "number" - }, - "da": { - "type": "number" - }, - "fa": { - "type": "number" - }, - "sk": { - "type": "number" - }, - "uk": { - "type": "number" - }, - "zh-TW": { - "type": "number" - }, - "bn": { - "type": "number" - }, - "ka": { - "type": "number" - }, - "ja": { - "type": "number" - }, - "lt": { - "type": "number" - }, - "mk": { - "type": "number" - }, - "ml": { - "type": "number" - }, - "ms": { - "type": "number" - }, - "ru": { - "type": "number" - }, - "ze": { - "type": "number" - } - } - }, - "subtitles_count": { - "type": "number" - }, - "seasons_count": { - "type": "number" - }, - "parent_title": { - "type": "string" - }, - "season_number": { - "type": "number" - }, - "episode_number": { - "type": "object" - }, - "imdb_id": { - "type": "number" - }, - "tmdb_id": { - "type": "number" - }, - "parent_imdb_id": { - "type": "object" - }, - "feature_id": { - "minLength": 1, - "type": "string" - }, - "title_aka": { - "type": "array", - "items": { - "type": "object", - "properties": {} - } - }, - "feature_type": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - }, - "img_url": { - "minLength": 1, - "type": "string" - } + "episode_number": { + "type": "number" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "feature_id": { + "type": "number" + }, + "feature_imdb_id": { + "type": "number" + } } + } } - }, - "description": "", - "x-tags": [ - "Models" - ] + } + } + } } + } }, - "securitySchemes": { - "Api-Key": { - "type": "apiKey", - "description": "Application API key obtained in the user profile of app developer on opensubtitles.com to authorise the **application**", - "name": "Api-Key", - "in": "header" - }, - "Bearer": { - "type": "http", - "description": "User token created in the login endpoint to authorise opensubtitles.com **user**", - "scheme": "bearer", - "bearerFormat": "JWT" + "description": "", + "x-tags": [ + "Models" + ] + }, + "Feature-Episode": { + "required": [ + "attributes", + "id", + "type" + ], + "type": "object", + "properties": { + "id": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + }, + "attributes": { + "required": [ + "episode_number", + "feature_id", + "imdb_id", + "img_url", + "parent_title", + "season_number", + "subtitles_count", + "subtitles_counts", + "title", + "title_aka", + "tmdb_id", + "url", + "year" + ], + "type": "object", + "properties": { + "title": { + "minLength": 1, + "type": "string" + }, + "original_title": { + "type": "object" + }, + "year": { + "minLength": 1, + "type": "string" + }, + "parent_imdb_id": { + "type": "object" + }, + "parent_title": { + "minLength": 1, + "type": "string" + }, + "season_number": { + "type": "number" + }, + "episode_number": { + "type": "number" + }, + "imdb_id": { + "type": "number" + }, + "tmdb_id": { + "type": "number" + }, + "title_aka": { + "type": "array", + "items": { + "type": "object", + "properties": {} + } + }, + "feature_id": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + }, + "img_url": { + "minLength": 1, + "type": "string" + }, + "subtitles_counts": { + "required": [ + "ar", + "bg", + "bs", + "cs", + "da", + "de", + "el", + "en", + "es", + "et", + "fi", + "fr", + "he", + "hr", + "hu", + "mk", + "nl", + "no", + "pl", + "pt-BR", + "pt-PT", + "ro", + "ru", + "sl", + "sr", + "sv", + "th", + "tr" + ], + "type": "object", + "properties": { + "pl": { + "type": "number" + }, + "en": { + "type": "number" + }, + "pt-BR": { + "type": "number" + }, + "es": { + "type": "number" + }, + "ro": { + "type": "number" + }, + "nl": { + "type": "number" + }, + "tr": { + "type": "number" + }, + "he": { + "type": "number" + }, + "pt-PT": { + "type": "number" + }, + "cs": { + "type": "number" + }, + "fi": { + "type": "number" + }, + "hu": { + "type": "number" + }, + "ar": { + "type": "number" + }, + "bg": { + "type": "number" + }, + "fr": { + "type": "number" + }, + "sl": { + "type": "number" + }, + "el": { + "type": "number" + }, + "hr": { + "type": "number" + }, + "sr": { + "type": "number" + }, + "et": { + "type": "number" + }, + "sv": { + "type": "number" + }, + "th": { + "type": "number" + }, + "bs": { + "type": "number" + }, + "da": { + "type": "number" + }, + "de": { + "type": "number" + }, + "mk": { + "type": "number" + }, + "no": { + "type": "number" + }, + "ru": { + "type": "number" + } + } + }, + "subtitles_count": { + "type": "number" + } + } + } + }, + "description": "", + "x-tags": [ + "Models" + ] + }, + "Feature-Movie": { + "required": [ + "attributes", + "id", + "type" + ], + "type": "object", + "properties": { + "id": { + "minLength": 1, + "type": "string" + }, + "type": { + "minLength": 1, + "type": "string" + }, + "attributes": { + "required": [ + "feature_id", + "feature_type", + "imdb_id", + "img_url", + "original_title", + "parent_title", + "season_number", + "seasons_count", + "subtitles_count", + "subtitles_counts", + "title", + "title_aka", + "tmdb_id", + "url", + "year" + ], + "type": "object", + "properties": { + "title": { + "minLength": 1, + "type": "string" + }, + "original_title": { + "minLength": 1, + "type": "string" + }, + "year": { + "minLength": 1, + "type": "string" + }, + "subtitles_counts": { + "required": [ + "ar", + "bg", + "bn", + "cs", + "da", + "de", + "el", + "en", + "es", + "et", + "eu", + "fa", + "fi", + "fr", + "he", + "hr", + "hu", + "id", + "it", + "ja", + "ka", + "ko", + "lt", + "mk", + "ml", + "ms", + "nl", + "no", + "pl", + "pt-BR", + "pt-PT", + "ro", + "ru", + "sk", + "sl", + "sr", + "sv", + "ta", + "tr", + "uk", + "vi", + "ze", + "zh-CN", + "zh-TW" + ], + "type": "object", + "properties": { + "en": { + "type": "number" + }, + "pt-PT": { + "type": "number" + }, + "fi": { + "type": "number" + }, + "pt-BR": { + "type": "number" + }, + "es": { + "type": "number" + }, + "ar": { + "type": "number" + }, + "pl": { + "type": "number" + }, + "sr": { + "type": "number" + }, + "id": { + "type": "number" + }, + "ro": { + "type": "number" + }, + "zh-CN": { + "type": "number" + }, + "nl": { + "type": "number" + }, + "el": { + "type": "number" + }, + "hu": { + "type": "number" + }, + "fr": { + "type": "number" + }, + "sl": { + "type": "number" + }, + "tr": { + "type": "number" + }, + "et": { + "type": "number" + }, + "bg": { + "type": "number" + }, + "cs": { + "type": "number" + }, + "de": { + "type": "number" + }, + "he": { + "type": "number" + }, + "it": { + "type": "number" + }, + "vi": { + "type": "number" + }, + "hr": { + "type": "number" + }, + "ko": { + "type": "number" + }, + "no": { + "type": "number" + }, + "sv": { + "type": "number" + }, + "ta": { + "type": "number" + }, + "eu": { + "type": "number" + }, + "da": { + "type": "number" + }, + "fa": { + "type": "number" + }, + "sk": { + "type": "number" + }, + "uk": { + "type": "number" + }, + "zh-TW": { + "type": "number" + }, + "bn": { + "type": "number" + }, + "ka": { + "type": "number" + }, + "ja": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "mk": { + "type": "number" + }, + "ml": { + "type": "number" + }, + "ms": { + "type": "number" + }, + "ru": { + "type": "number" + }, + "ze": { + "type": "number" + } + } + }, + "subtitles_count": { + "type": "number" + }, + "seasons_count": { + "type": "number" + }, + "parent_title": { + "type": "string" + }, + "season_number": { + "type": "number" + }, + "episode_number": { + "type": "object" + }, + "imdb_id": { + "type": "number" + }, + "tmdb_id": { + "type": "number" + }, + "parent_imdb_id": { + "type": "object" + }, + "feature_id": { + "minLength": 1, + "type": "string" + }, + "title_aka": { + "type": "array", + "items": { + "type": "object", + "properties": {} + } + }, + "feature_type": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + }, + "img_url": { + "minLength": 1, + "type": "string" + } } - } + } + }, + "description": "", + "x-tags": [ + "Models" + ] + } }, - "security": [ - { - "Api-Key": [] - } - ] + "securitySchemes": { + "Api-Key": { + "type": "apiKey", + "description": "Application API key obtained in the user profile of app developer on opensubtitles.com to authorise the **application**", + "name": "Api-Key", + "in": "header" + }, + "Bearer": { + "type": "http", + "description": "User token created in the login endpoint to authorise opensubtitles.com **user**", + "scheme": "bearer", + "bearerFormat": "JWT" + } + } + }, + "security": [ + { + "Api-Key": [] + }, + { + "Bearer": [] + } + ] } \ No newline at end of file From c72df65b05fbf2ef89aaeb9e4a19bbc01e8f79f3 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 23:38:38 +0100 Subject: [PATCH 37/54] changes --- .../lib/library/FilenameLibraryBuilder.java | 47 ++++++++++--------- .../subtitleproviders/SubtitleProvider.java | 9 ++-- .../opensubtitles/OpenSubtitlesApi.java | 3 +- .../opensubtitles/SearchSubtitles.java | 2 +- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index f939e049..d2a5ddf7 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -121,29 +121,30 @@ public FilenameLibraryBuilder build() { @Override public Path build(Release release) { if (rename) { - String filename; - if (release instanceof TvRelease tvRelease && StringUtils.isNotBlank(structure)) { - filename = structure; - // order is important! - filename = replace(filename, SerieStructureTag.SHOW_NAME, getShowName(tvRelease.name)); - filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_LONG, - tvRelease.episodeNumbers, true); - filename = replaceFormattedEpisodeNumber(filename, SerieStructureTag.EPISODES_SHORT, - tvRelease.episodeNumbers, false); - filename = replace(filename, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.season, true)); - filename = replace(filename, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.season, false)); - filename = replace(filename, SerieStructureTag.EPISODE_LONG, - formattedNumber(tvRelease.firstEpisodeNumber, true)); - filename = replace(filename, SerieStructureTag.EPISODE_SHORT, - formattedNumber(tvRelease.firstEpisodeNumber, false)); - filename = replace(filename, SerieStructureTag.TITLE, tvRelease.title); - filename = replace(filename, SerieStructureTag.QUALITY, release.quality); - filename = replace(filename, SerieStructureTag.DESCRIPTION, release.description); - - filename += "." + release.extension; - } else { - filename = release.fileName; - } + String filename = switch (release) { + case TvRelease tvRelease when StringUtils.isNotBlank(structure) -> { + String fName = structure; + // order is important! + fName = replace(fName, SerieStructureTag.SHOW_NAME, getShowName(tvRelease.name)); + fName = replaceFormattedEpisodeNumber(fName, SerieStructureTag.EPISODES_LONG, + tvRelease.episodeNumbers, true); + fName = replaceFormattedEpisodeNumber(fName, SerieStructureTag.EPISODES_SHORT, + tvRelease.episodeNumbers, false); + fName = replace(fName, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.season, true)); + fName = replace(fName, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.season, false)); + fName = replace(fName, SerieStructureTag.EPISODE_LONG, + formattedNumber(tvRelease.firstEpisodeNumber, true)); + fName = replace(fName, SerieStructureTag.EPISODE_SHORT, + formattedNumber(tvRelease.firstEpisodeNumber, false)); + fName = replace(fName, SerieStructureTag.TITLE, tvRelease.title); + fName = replace(fName, SerieStructureTag.QUALITY, release.quality); + fName = replace(fName, SerieStructureTag.DESCRIPTION, release.description); + + fName += "." + release.extension; + yield fName; + } + default -> release.fileName; + }; filename = filename.removeIllegalWindowsChars(); if (replaceSpace) { filename = filename.replace(' ', replacingSpaceChar); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java index 784f9db8..5f36a176 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/SubtitleProvider.java @@ -41,11 +41,10 @@ default String getName() { */ default Set search(Release release, Language language) { try { - if (release instanceof MovieRelease movieRelease) { - return this.searchSubtitles(movieRelease, language); - } else if (release instanceof TvRelease tvRelease) { - return this.searchSubtitles(tvRelease, language); - } + return switch (release) { + case MovieRelease movieRelease -> this.searchSubtitles(movieRelease, language); + case TvRelease tvRelease -> this.searchSubtitles(tvRelease, language); + }; } catch (Exception e) { LoggerFactory.getLogger(SubtitleProvider.class) .error("Error in %s API: %s".formatted(getName(), e.getMessage()), e); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java index 23bcd784..10d51097 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesApi.java @@ -78,8 +78,7 @@ public List getProviderSerieIds(String serieName) throws Op .userAgent("") .cacheType(CacheType.MEMORY) .retries(1) - .retryPredicate( - exception -> exception instanceof HttpClientException e && e.getResponseCode() == 429) + .retryPredicate(exc -> exc instanceof HttpClientException e && e.getResponseCode() == 429) .retryWait(5) .getAsJsonArray() .stream() diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java index 4d9f0095..1e2a9ff1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/SearchSubtitles.java @@ -103,6 +103,6 @@ public Subtitles200Response searchSubtitles() throws OpenSubtitlesException { } private String getValue(ParamIntf param) { - return param == null ? null : param.getValue(); + return param == null ? null : param.value; } } From afa8d12283a082df471f5f6946228bd35af6f9df Mon Sep 17 00:00:00 2001 From: EotT123 Date: Fri, 6 Dec 2024 23:50:05 +0100 Subject: [PATCH 38/54] changes --- MultiSubDownloader/pom.xml | 21 +++++-------------- .../gui/panels/SearchTextInputPanel.java | 18 ++++------------ 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/MultiSubDownloader/pom.xml b/MultiSubDownloader/pom.xml index 5606cadd..a034d091 100644 --- a/MultiSubDownloader/pom.xml +++ b/MultiSubDownloader/pom.xml @@ -7,23 +7,12 @@ 4.0.0 - multisubdownloader - MultiSubDownloader + multisubdownloader + MultiSubDownloader - - - - - - - - - - - - - ${maven.build.timestamp} - + + ${maven.build.timestamp} + diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java index bca07b51..5f09cdae 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java @@ -1,6 +1,7 @@ package org.lodder.subtools.multisubdownloader.gui.panels; import static org.lodder.subtools.multisubdownloader.Messages.*; +import static org.lodder.subtools.sublibrary.model.VideoSearchType.*; import javax.swing.*; import java.io.Serial; @@ -58,20 +59,9 @@ private void createComponents() { private void videoTypeChanged() { VideoSearchType videoTypeChoice = cbxVideoType.getSelectedItem(); - if (VideoSearchType.EPISODE == videoTypeChoice) { - txtInputSeason.editable().enabled(); - txtInputEpisode.editable().enabled(); - } else { - txtInputSeason.notEditable().disabled(); - txtInputEpisode.notEditable().disabled(); - } - if (VideoSearchType.RELEASE == videoTypeChoice) { - txtQualityVersion.notEditable().disabled(); - txtQualityVersion.notEditable().disabled(); - } else { - txtQualityVersion.editable().enabled(); - txtQualityVersion.editable().enabled(); - } + txtInputSeason.editable(videoTypeChoice == EPISODE).enabled(videoTypeChoice == EPISODE); + txtInputEpisode.editable(videoTypeChoice == EPISODE).enabled(videoTypeChoice == EPISODE); + txtQualityVersion.editable(videoTypeChoice == RELEASE).enabled(videoTypeChoice == RELEASE); } public VideoSearchType getType() { From 2808769057e1801fc45c4633cda896cba2f11b25 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 7 Dec 2024 11:37:23 +0100 Subject: [PATCH 39/54] Replace MyComboBox with extension --- .../javax/swing/JComboBox/JComboBoxExt.java | 164 +++++++++++++++++ .../gui/extra/PartialDisableComboBox.java | 2 +- .../gui/jcomponent/jcombobox/MyComboBox.java | 171 ------------------ .../gui/panels/InputPanel.java | 10 +- .../gui/panels/LoggingPanel.java | 7 +- .../gui/panels/SearchTextInputPanel.java | 10 +- .../gui/panels/preference/GeneralPanel.java | 33 ++-- .../gui/panels/preference/OptionsPanel.java | 7 +- .../panels/preference/StructureFilePanel.java | 30 +-- .../preference/StructureFolderPanel.java | 9 +- .../gui/panels/preference/StructurePanel.java | 7 +- .../panels/preference/VideoLibraryPanel.java | 20 +- .../org/json/JSONArray/JSONArrayExt.java | 5 +- 13 files changed, 231 insertions(+), 244 deletions(-) create mode 100644 MultiSubDownloader/src/main/java/extensions/javax/swing/JComboBox/JComboBoxExt.java delete mode 100644 MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComboBox/JComboBoxExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComboBox/JComboBoxExt.java new file mode 100644 index 00000000..3f2ea59e --- /dev/null +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComboBox/JComboBoxExt.java @@ -0,0 +1,164 @@ +package extensions.javax.swing.JComboBox; + +import javax.annotation.Nullable; +import javax.swing.*; +import java.util.Collection; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.google.common.collect.Iterables; +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; +import manifold.ext.rt.api.ThisClass; +import net.jodah.typetools.TypeResolver; +import org.lodder.subtools.multisubdownloader.gui.ToStringListCellRenderer; + +@UtilityClass +@Extension +public class JComboBoxExt { + + public static JComboBox create(@ThisClass Class> thisClass, E... values) { + return new JComboBox<>(values); + } + + public static JComboBox create(@ThisClass Class> thisClass, Collection items) { + Class elementType = (Class) TypeResolver.resolveRawArguments(Collection.class, items.getClass())[0]; + return new JComboBox<>(Iterables.toArray(items, elementType)); + } + + // public static E getSelectedObject(@This JComboBox comboBox) { + // return (E) comboBox.getSelectedItem(); + // } + + public static E getSelectedValue(@This JComboBox comboBox) { + return (E) comboBox.getSelectedItem(); + } + // + // public static Optional getSelectedOptionalValue(@This JComboBox comboBox) { + // return Optional.ofNullable((E) comboBox.getSelectedItem()); + // } + // + // public static @Self JComboBox model(@This JComboBox comboBox, ComboBoxModel model) { + // comboBox.setModel(model); + // return comboBox; + // } + + public static @Self JComboBox renderer(@This JComboBox comboBox, ListCellRenderer renderer) { + comboBox.setRenderer(renderer); + return comboBox; + } + + // public static @Self JComboBox renderer(@This JComboBox comboBox, + // Function> rendererFunction) { + // comboBox.setRenderer(rendererFunction.apply(comboBox.getRenderer())); + // return comboBox; + // } + + public static @Self JComboBox toStringRenderer(@This JComboBox comboBox, + Function toStringRenderer) { + return comboBox.renderer(ToStringListCellRenderer.of(comboBox.getRenderer(), toStringRenderer)); + } + + public static @Self JComboBox toMessageStringRenderer(@This JComboBox comboBox, + Function toStringRenderer) { + return comboBox.renderer(ToStringListCellRenderer.ofMessage(comboBox.getRenderer(), toStringRenderer)); + } + + + // public static @Self JComboBox itemListener(@This JComboBox comboBox, ItemListener itemListener) { + // comboBox.addItemListener(itemListener); + // return comboBox; + // } + + public static @Self JComboBox itemListener(@This JComboBox comboBox, Runnable itemListener) { + comboBox.addItemListener(_ -> itemListener.run()); + return comboBox; + } + + + public static @Self JComboBox selectedValue(@This JComboBox comboBox, @Nullable E item) { + comboBox.setSelectedItem(item); + return comboBox; + } + + // + // public static @Self JComboBox selectedIndex(@This JComboBox comboBox, int index) { + // comboBox.setSelectedIndex(index); + // return comboBox; + // } + // + // public static @Self JComboBox actionListener(@This JComboBox comboBox, ActionListener + // actionListener) { + // comboBox.addActionListener(actionListener); + // return comboBox; + // } + // + // public static @Self JComboBox eventConsumer(@This JComboBox comboBox, + // Consumer> actionListener) { + // //noinspection unchecked + // comboBox.addActionListener(event -> actionListener.accept((JComboBox) event.getSource())); + // return comboBox; + // } + // + public static @Self JComboBox selectedItemConsumer(@This JComboBox comboBox, Consumer + actionListener) { + //noinspection unchecked + comboBox.addActionListener( + event -> actionListener.accept(((JComboBox) (event.getSource())).getSelectedValue())); + return comboBox; + } + // + // public static @Self JComboBox border(@This JComboBox comboBox, Border border) { + // comboBox.setBorder(border); + // return comboBox; + // } + // + // public static @Self JComboBox enabled(@This JComboBox comboBox, boolean enabled) { + // comboBox.setEnabled(enabled); + // return comboBox; + // } + // + // public static @Self JComboBox items(@This JComboBox comboBox, E... items) { + // items.stream().forEach(comboBox::addItem); + // return comboBox; + // } + // + // // public static @Self JComboBox items(@This JComboBox comboBox, Iterable items) { + // // items.stream().forEach(comboBox::addItem); + // // return comboBox; + // // } + // // + // // public static @Self JComboBox items(@This JComboBox comboBox, BaseStream> + // items) { + // // items.iterator().stream().forEach(comboBox::addItem); + // // return comboBox; + // // } + // // + // // public static > @Self JComboBox enumItems(@This JComboBox comboBox) { + // // Class enumType = (Class) TypeResolver.resolveRawArguments(JComboBox.class, comboBox + // .getClass())[0]; + // // return comboBox.items(enumType.getEnumConstants()); + // // } + // + // public static @Self JComboBox toStringMapper(@This JComboBox comboBox, + // Function toStringMapper) { + // comboBox.setRenderer(new CustomComboBoxRenderer<>(toStringMapper)); + // return comboBox; + // } + // + // @RequiredArgsConstructor + // private static class CustomComboBoxRenderer extends BasicComboBoxRenderer { + // + // private final Function toStringMapper; + // + // @Override + // public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, + // boolean cellHasFocus) { + // Object newValue = value instanceof Icon || value == null ? value : toStringMapper.apply((T) value); + // super.getListCellRendererComponent(list, newValue, index, isSelected, cellHasFocus); + // return this; + // } + // } +} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java index 81bd7b4e..ab85ff39 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java @@ -104,6 +104,6 @@ private int requireValidIndex(int index) { } public T getSelectedItem() { - return (T) super.getSelectedItem(); + return super.getSelectedValue(); } } \ No newline at end of file diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java deleted file mode 100644 index 9a0bcbb9..00000000 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jcombobox/MyComboBox.java +++ /dev/null @@ -1,171 +0,0 @@ -package org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox; - -import javax.swing.*; -import javax.swing.border.*; -import java.awt.*; -import java.awt.event.ActionListener; -import java.awt.event.ItemListener; -import java.io.Serial; -import java.util.Collection; -import java.util.Vector; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; - -import com.google.common.collect.Iterables; -import manifold.ext.rt.api.Self; -import org.lodder.subtools.multisubdownloader.gui.ToStringListCellRenderer; - -public class MyComboBox extends JComboBox { - - private static final Border ERROR_BORDER = new LineBorder(Color.RED, 1); - private Border defaultBorder; - private Predicate selectedValueVerifier; - - @Serial private static final long serialVersionUID = -8449456978689044914L; - - /** - * Creates a MyComboBox that takes its items from an existing ComboBoxModel. Since the - * ComboBoxModel is provided, a combo box created using this constructor does not create a default - * combo box model and may impact how the insert, remove and add methods behave. - * - * @param aModel the ComboBoxModel that provides the displayed list of items - * @see DefaultComboBoxModel - */ - public MyComboBox(ComboBoxModel aModel) { - super(aModel); - this.defaultBorder = getBorder(); - } - - /** - * Creates a MyComboBox that contains the elements in the specified array. By default, the first item - * in the array (and therefore the data model) becomes selected. - * - * @param items an array of objects to insert into the combo box - * @see DefaultComboBoxModel - */ - public MyComboBox(E[] items) { - super(items); - this.defaultBorder = getBorder(); - } - - /** - * Creates a MyComboBox that contains the elements in the specified collection. By default, the first - * item in the collection (and therefore the data model) becomes selected. - * - * @param items a collection of objects to insert into the combo box - * @param elementType the type of elements in the list - * @see DefaultComboBoxModel - */ - public MyComboBox(Collection items, Class elementType) { - super(Iterables.toArray(items, elementType)); - this.defaultBorder = getBorder(); - } - - /** - * Creates a MyComboBox that contains the elements in the specified Vector. By default, the first item - * in the vector (and therefore the data model) becomes selected. - * - * @param items an array of vectors to insert into the combo box - * @see DefaultComboBoxModel - */ - public MyComboBox(Vector items) { - super(items); - this.defaultBorder = getBorder(); - } - - /** - * Creates a MyComboBox with a default data model. The default data model is an empty list of objects. - * Use addItem to add items. By default, the first item in the data model becomes selected. - * - * @see DefaultComboBoxModel - */ - public MyComboBox() { - super(); - this.defaultBorder = getBorder(); - } - - public static MyComboBox ofValues(E... values) { - return new MyComboBox<>(values); - } - - public @Self MyComboBox withModel(ComboBoxModel model) { - setModel(model); - return this; - } - - public @Self MyComboBox withRenderer(ListCellRenderer renderer) { - setRenderer(renderer); - return this; - } - - public @Self MyComboBox withToStringRenderer(Function toStringRenderer) { - return withRenderer(ToStringListCellRenderer.of(getRenderer(), toStringRenderer)); - } - - public @Self MyComboBox withToMessageStringRenderer(Function toStringRenderer) { - return withRenderer(ToStringListCellRenderer.ofMessage(getRenderer(), toStringRenderer)); - } - - public @Self MyComboBox withItemListener(ItemListener itemListener) { - this.addItemListener(itemListener); - return this; - } - - public @Self MyComboBox withItemListener(Runnable itemListener) { - return withItemListener(_ -> itemListener.run()); - } - - public @Self MyComboBox withSelectedItem(E item) { - setSelectedItem(item); - return this; - } - - public @Self MyComboBox withActionListener(ActionListener actionListener) { - addActionListener(actionListener); - return this; - } - - @SuppressWarnings("unchecked") - public @Self MyComboBox withEventConsumer(Consumer> actionListener) { - addActionListener(event -> actionListener.accept((MyComboBox) (event.getSource()))); - return this; - } - - @SuppressWarnings("unchecked") - public @Self MyComboBox withSelectedItemConsumer(Consumer actionListener) { - addActionListener(event -> actionListener.accept(((MyComboBox) (event.getSource())).getSelectedItem())); - return this; - } - - @SuppressWarnings("unchecked") - @Override - public E getSelectedItem() { - return (E) super.getSelectedItem(); - } - - public @Self MyComboBox withSelectedValueVerifier(Predicate valueVerifier) { - this.selectedValueVerifier = valueVerifier; - return this; - } - - @Override - public void setBorder(Border border) { - super.setBorder(border); - defaultBorder = border; - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - refreshState(); - } - - public void refreshState() { - if (!isEnabled()) { - super.setBorder(defaultBorder); - } else if (selectedValueVerifier != null && !selectedValueVerifier.test(getSelectedItem())) { - super.setBorder(ERROR_BORDER); - } - } -} diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java index bcc22bb0..3968a77a 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/InputPanel.java @@ -5,7 +5,6 @@ import org.lodder.subtools.multisubdownloader.Messages; import org.lodder.subtools.multisubdownloader.actions.SearchAction; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; import org.lodder.subtools.sublibrary.Language; public abstract class InputPanel extends JPanel { @@ -13,14 +12,14 @@ public abstract class InputPanel extends JPanel { @Serial private static final long serialVersionUID = 7753220002440733463L; private JButton btnSearch; - private MyComboBox cbxLanguage; + private JComboBox cbxLanguage; InputPanel() { createComponents(); } public Language getSelectedLanguage() { - return cbxLanguage.getSelectedItem(); + return cbxLanguage.getSelectedValue(); } public void setSelectedLanguage(Language language) { @@ -45,13 +44,12 @@ protected JButton getSearchButton() { return this.btnSearch; } - protected MyComboBox getLanguageCbx() { + protected JComboBox getLanguageCbx() { return this.cbxLanguage; } private void createComponents() { - cbxLanguage = new MyComboBox<>(Language.values()) - .withToMessageStringRenderer(Language::getMsgCode); + cbxLanguage = new JComboBox<>(Language.values()).toMessageStringRenderer(Language::getMsgCode); btnSearch = new JButton(Messages.getText("InputPanel.SearchForSubtitles")); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java index 7a4f7e8e..03dd5e62 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/LoggingPanel.java @@ -8,7 +8,6 @@ import ch.qos.logback.classic.Level; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.gui.extra.LogTextAppender; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; public class LoggingPanel extends JPanel { @@ -28,9 +27,9 @@ public LoggingPanel() { this.add(new JSeparator(), "cell 0 0,growx,gaptop 5"); Level[] logLevels = { Level.ALL, Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR }; - MyComboBox cbxLogLevel = new MyComboBox<>(logLevels) - .withSelectedItem(ROOT.getLevel()) - .withSelectedItemConsumer(ROOT::setLevel); + JComboBox cbxLogLevel = new JComboBox<>(logLevels) + .selectedValue(ROOT.getLevel()) + .selectedItemConsumer(ROOT::setLevel); this.add(cbxLogLevel, "cell 1 0,alignx right"); this.add(scrollPane, "cell 0 1 2 1,grow"); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java index 5f09cdae..e05b5c84 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/SearchTextInputPanel.java @@ -7,7 +7,6 @@ import java.io.Serial; import net.miginfocom.swing.MigLayout; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; import org.lodder.subtools.sublibrary.model.VideoSearchType; public class SearchTextInputPanel extends InputPanel { @@ -15,7 +14,7 @@ public class SearchTextInputPanel extends InputPanel { @Serial private static final long serialVersionUID = 7030171360517948253L; - private MyComboBox cbxVideoType; + private JComboBox cbxVideoType; private JTextField txtInputVideoName; protected JTextField txtInputSeason; protected JTextField txtInputEpisode; @@ -49,8 +48,7 @@ private void setupListeners() { } private void createComponents() { - cbxVideoType = new MyComboBox<>(VideoSearchType.values()) - .withToMessageStringRenderer(VideoSearchType::getMsgCode); + cbxVideoType = new JComboBox<>(values()).toStringRenderer(VideoSearchType::getMsgCode); txtInputVideoName = new JTextField().columns(10); txtQualityVersion = new JTextField().columns(10); txtInputSeason = new JTextField().columns(10); @@ -58,14 +56,14 @@ private void createComponents() { } private void videoTypeChanged() { - VideoSearchType videoTypeChoice = cbxVideoType.getSelectedItem(); + VideoSearchType videoTypeChoice = cbxVideoType.getSelectedValue(); txtInputSeason.editable(videoTypeChoice == EPISODE).enabled(videoTypeChoice == EPISODE); txtInputEpisode.editable(videoTypeChoice == EPISODE).enabled(videoTypeChoice == EPISODE); txtQualityVersion.editable(videoTypeChoice == RELEASE).enabled(videoTypeChoice == RELEASE); } public VideoSearchType getType() { - return cbxVideoType.getSelectedItem(); + return cbxVideoType.getSelectedValue(); } public int getSeason() { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java index 2765fccd..32b08c91 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/GeneralPanel.java @@ -17,7 +17,6 @@ import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldInteger; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; @@ -33,11 +32,11 @@ public class GeneralPanel extends JPanel implements PreferencePanelIntf { private final GUI gui; private final SettingsControl settingsCtrl; - private final MyComboBox cbxLanguage; + private final JComboBox cbxLanguage; private final JListWithImages defaultIncomingFoldersList; private final JListWithImages excludeList; - private final MyComboBox cbxUpdateCheckPeriod; - private final MyComboBox cbxUpdateType; + private final JComboBox cbxUpdateCheckPeriod; + private final JComboBox cbxUpdateType; private final JCheckBox chkUseProxy; private final MyTextFieldString txtProxyHost; private final MyTextFieldInteger txtProxyPort; @@ -55,9 +54,8 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { // Language \\ new JLabel(getText("PreferenceDialog.Language")).addTo(settingsPanel); - - this.cbxLanguage = new MyComboBox<>(Messages.getAvailableLanguages(), Language.class) - .withToMessageStringRenderer(Language::getMsgCode) + this.cbxLanguage = JComboBox.create(Messages.getAvailableLanguages()) + .toMessageStringRenderer(Language::getMsgCode) .addTo(settingsPanel, "wrap"); // Default Incoming Folder \\ @@ -130,12 +128,13 @@ public GeneralPanel(GUI gui, SettingsControl settingsCtrl) { .addTo(this, "span, grow, wrap"); new JLabel(getText("PreferenceDialog.NewUpdateCheck")).addTo(updatePanel); - this.cbxUpdateCheckPeriod = new MyComboBox<>(UpdateCheckPeriod.values()).withToMessageStringRenderer( - UpdateCheckPeriod::getLangCode).addTo(updatePanel, "wrap"); + this.cbxUpdateCheckPeriod = new JComboBox<>(UpdateCheckPeriod.values()) + .toMessageStringRenderer(UpdateCheckPeriod::getLangCode) + .addTo(updatePanel, "wrap"); new JLabel(getText("PreferenceDialog.UpdateType")).addTo(updatePanel); - this.cbxUpdateType = - new MyComboBox<>(UpdateType.values()).withToMessageStringRenderer(UpdateType::getMsgCode) - .addTo(updatePanel); + this.cbxUpdateType = new JComboBox<>(UpdateType.values()) + .toMessageStringRenderer(UpdateType::getMsgCode) + .addTo(updatePanel); } { @@ -174,18 +173,18 @@ public void loadPreferenceSettings() { } public void savePreferenceSettings() { - if (Messages.language != cbxLanguage.getSelectedItem()) { - Messages.language = cbxLanguage.getSelectedItem(); + if (Messages.language != cbxLanguage.getSelectedValue()) { + Messages.language = cbxLanguage.getSelectedValue(); gui.redraw(); } List defaultIncomingFolders = defaultIncomingFoldersList.stream().map(LabelPanel::getObject).toList(); List exclList = excludeList.stream().map(labelPanel -> new PathOrRegex(labelPanel.getObject().value)).toList(); - settingsCtrl.settings.language = cbxLanguage.getSelectedItem(); + settingsCtrl.settings.language = cbxLanguage.getSelectedValue(); settingsCtrl.settings.defaultIncomingFolders = defaultIncomingFolders; settingsCtrl.settings.replaceExcludeList(exclList); - settingsCtrl.settings.updateCheckPeriod = cbxUpdateCheckPeriod.getSelectedItem(); - settingsCtrl.settings.updateType = cbxUpdateType.getSelectedItem(); + settingsCtrl.settings.updateCheckPeriod = cbxUpdateCheckPeriod.getSelectedValue(); + settingsCtrl.settings.updateType = cbxUpdateType.getSelectedValue(); settingsCtrl.settings.generalProxyEnabled = chkUseProxy.isSelected(); settingsCtrl.settings.generalProxyHost = txtProxyHost.getText(); settingsCtrl.settings.generalProxyPort = txtProxyPort.getOptionalObject().orElse(80); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java index eac8730b..776998b3 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/OptionsPanel.java @@ -8,7 +8,6 @@ import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; import org.lodder.subtools.multisubdownloader.settings.SettingsControl; import org.lodder.subtools.multisubdownloader.settings.model.SettingsProcessEpisodeSource; @@ -27,7 +26,7 @@ public class OptionsPanel extends JPanel implements PreferencePanelIntf { private final JCheckBox chkExcludeHearingImpaired; private final JCheckBox chkOnlyFound; private final JCheckBox chkStopOnSearchError; - private final MyComboBox cbxEpisodeProcessSource; + private final JComboBox cbxEpisodeProcessSource; private final JCheckBox chkConfirmProviderMapping; public OptionsPanel(SettingsControl settingsCtrl) { @@ -85,7 +84,7 @@ public OptionsPanel(SettingsControl settingsCtrl) { .padding(0) .paddingLeft(20) .addTo(this, "span, grow") - .addComponent(this.cbxEpisodeProcessSource = MyComboBox.ofValues(SettingsProcessEpisodeSource.values()), + .addComponent(this.cbxEpisodeProcessSource = new JComboBox<>(SettingsProcessEpisodeSource.values()), "wrap") .addComponent(this.chkConfirmProviderMapping = new JCheckBox(getText("PreferenceDialog.ConfirmProviderMapping"))); @@ -117,7 +116,7 @@ public void savePreferenceSettings() { settingsCtrl.settings.optionSubtitleExcludeHearingImpaired = chkExcludeHearingImpaired.isSelected(); settingsCtrl.settings.optionsShowOnlyFound = chkOnlyFound.isSelected(); settingsCtrl.settings.optionsStopOnSearchError = chkStopOnSearchError.isSelected(); - settingsCtrl.settings.processEpisodeSource = cbxEpisodeProcessSource.getSelectedItem(); + settingsCtrl.settings.processEpisodeSource = cbxEpisodeProcessSource.getSelectedValue(); settingsCtrl.settings.optionsConfirmProviderMapping = chkConfirmProviderMapping.isSelected(); pnlDefaultSelection.savePreferenceSettings(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java index 4cc9217d..4b55e41f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFilePanel.java @@ -16,11 +16,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import lombok.extern.slf4j.Slf4j; import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.gui.dialog.StructureBuilderDialog; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; import org.lodder.subtools.multisubdownloader.lib.library.FilenameLibraryBuilder; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; @@ -29,6 +29,7 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; +@Slf4j public class StructureFilePanel extends JPanel { @Serial private static final long serialVersionUID = -5458593307643063563L; @@ -36,7 +37,7 @@ public class StructureFilePanel extends JPanel { private final LibrarySettings librarySettings; private final MyTextFieldString txtFileStructure; private final JCheckBox chkReplaceSpace; - private final MyComboBox cbxReplaceSpaceChar; + private final JComboBox cbxReplaceSpaceChar; private final JCheckBox chkIncludeLanguageCode; private final Supplier addLanguageSupplier; private final LanguageMapping languageMapping = new LanguageMapping(); @@ -74,7 +75,8 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, PanelCheckBox.checkbox(chkReplaceSpace) .panelOnSameLine() .addTo(titlePanel, "wrap") - .addComponent("width pref+10px, wrap", this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); + .addComponent("width pref+10px, wrap", + this.cbxReplaceSpaceChar = JComboBox.create('-', '.', '_')); this.chkIncludeLanguageCode = new JCheckBox(getText("PreferenceDialog.IncludeLanguageInFileName")) @@ -96,8 +98,8 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, AtomicInteger langId = new AtomicInteger(); addLanguageSupplier = () -> { int id = langId.getAndIncrement(); - MyComboBox cmbLanguage = new MyComboBox<>(Language.values()) - .withToMessageStringRenderer(Language::getMsgCode).addTo(languagePanel); + JComboBox cmbLanguage = new JComboBox<>(Language.values()) + .toMessageStringRenderer(Language::getMsgCode).addTo(languagePanel); MyTextFieldString txtLanguage = MyTextFieldString.builder().build().columns(20).addTo(languagePanel); JButton btnDelete = new JButton(getText("StructureFilePanel.Delete")) .actionListenerSelf(delBtn -> { @@ -124,7 +126,7 @@ public StructureFilePanel(LibrarySettings librarySettings, VideoType videoType, loadPreferenceSettings(); } - private record LanguageComponents(MyComboBox cmbLanguage, MyTextFieldString txtLanguage, + private record LanguageComponents(JComboBox cmbLanguage, MyTextFieldString txtLanguage, JButton btnDelete) { public void setValue(Language language, String langCode) { @@ -137,7 +139,7 @@ public boolean hasValidValue() { } Language getLanguage() { - return cmbLanguage.getSelectedItem(); + return cmbLanguage.getSelectedValue(); } } @@ -151,7 +153,7 @@ private Function getLibraryStructureBuilder() { return structure -> FilenameLibraryBuilder.builder() .structure(structure) .replaceSpace(chkReplaceSpace.isSelected()) - .replacingSpaceChar(cbxReplaceSpaceChar.getSelectedItem()) + .replacingSpaceChar(cbxReplaceSpaceChar.getSelectedValue()) .includeLanguageCode(chkIncludeLanguageCode.isSelected()) .languageTags(languageMapping.toSettingsMap()) .useTvdbName(false) @@ -177,7 +179,7 @@ public void loadPreferenceSettings() { public void savePreferenceSettings() { librarySettings.libraryFilenameStructure = txtFileStructure.getText(); librarySettings.libraryFilenameReplaceSpace = chkReplaceSpace.isSelected(); - librarySettings.libraryFilenameReplacingSpaceChar = cbxReplaceSpaceChar.getSelectedItem(); + librarySettings.libraryFilenameReplacingSpaceChar = cbxReplaceSpaceChar.getSelectedValue(); librarySettings.langCodeMap = languageMapping.toSettingsMap(); } @@ -193,11 +195,11 @@ public void remove(int id) { public void put(int id, LanguageComponents languageComponents) { languageComponentsMap.put(id, languageComponents); - MyComboBox cmbLanguage = languageComponents.cmbLanguage(); + JComboBox cmbLanguage = languageComponents.cmbLanguage(); cmbLanguage.putClientProperty(DEFAULT_BORDER_PROPERTY, cmbLanguage.getBorder()); - cmbLanguage.withSelectedItemConsumer(this::updateBorder); + cmbLanguage.selectedItemConsumer(this::updateBorder); cmbLanguage.addItemListener(e -> updateBorder((Language) e.getItem())); - updateBorder(cmbLanguage.getSelectedItem()); + updateBorder(cmbLanguage.getSelectedValue()); } private void updateBorder(Language lang) { @@ -227,7 +229,7 @@ public Optional getLanguageComponentsForLanguage(Language la public Map toSettingsMap() { return languageComponentsMap.values() .stream() - .collect(Collectors.toMap(langComps -> langComps.cmbLanguage().getSelectedItem(), + .collect(Collectors.toMap(langComps -> langComps.cmbLanguage().getSelectedValue(), langComps -> langComps.txtLanguage().getText(), (v1, _) -> v1, LinkedHashMap::new)); } @@ -235,7 +237,7 @@ public void refreshState(boolean enabled) { if (enabled) { languageComponentsMap.values() .stream() - .map(langComp -> langComp.cmbLanguage.getSelectedItem()) + .map(langComp -> langComp.cmbLanguage.getSelectedValue()) .distinct() .forEach(this::updateBorder); } else { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java index 7826a6f2..4be98404 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructureFolderPanel.java @@ -11,7 +11,6 @@ import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser; import org.lodder.subtools.multisubdownloader.gui.extra.PanelCheckBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldPath; import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldString; import org.lodder.subtools.multisubdownloader.lib.library.PathLibraryBuilder; @@ -30,7 +29,7 @@ public class StructureFolderPanel extends JPanel implements PreferencePanelIntf private final MyTextFieldString txtFolderStructure; private final JCheckBox chkRemoveEmptyFolder; private final JCheckBox chkReplaceSpace; - private final MyComboBox cbxReplaceSpaceChar; + private final JComboBox cbxReplaceSpaceChar; public StructureFolderPanel(LibrarySettings librarySettings, VideoType videoType, Manager manager, UserInteractionHandler userInteractionHandler) { @@ -73,7 +72,7 @@ public StructureFolderPanel(LibrarySettings librarySettings, VideoType videoType PanelCheckBox.checkbox(this.chkReplaceSpace = new JCheckBox(getText("PreferenceDialog.ReplaceSpaceWith"))) .panelOnSameLine().addTo(titlePanel, "span") - .addComponent(this.cbxReplaceSpaceChar = MyComboBox.ofValues('-', '.', '_')); + .addComponent(this.cbxReplaceSpaceChar = JComboBox.create('-', '.', '_')); // behaviour txtLibraryFolder.withValidityChangedCallback(txtFolderStructure::setEnabled, btnStructure::setEnabled); @@ -85,7 +84,7 @@ private Function getLibraryStructureBuilder() { return structure -> PathLibraryBuilder.builder() .structure(structure) .replaceSpace(chkReplaceSpace.isSelected()) - .replacingSpaceChar(cbxReplaceSpaceChar.getSelectedItem()) + .replacingSpaceChar(cbxReplaceSpaceChar.getSelectedValue()) .useTvdbName(false) .tvdbAdapter(null) .libraryFolder(txtLibraryFolder.getObject()) @@ -113,7 +112,7 @@ public void savePreferenceSettings() { librarySettings.libraryFolderStructure = txtFolderStructure.getText(); librarySettings.libraryRemoveEmptyFolders = chkRemoveEmptyFolder.isSelected(); librarySettings.libraryFolderReplaceSpace = chkReplaceSpace.isSelected(); - librarySettings.libraryFolderReplacingSpaceChar = cbxReplaceSpaceChar.getSelectedItem(); + librarySettings.libraryFolderReplacingSpaceChar = cbxReplaceSpaceChar.getSelectedValue(); } @Override diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java index 53c56aa7..5da8dedd 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/StructurePanel.java @@ -8,7 +8,6 @@ import manifold.ext.props.rt.api.get; import org.lodder.subtools.multisubdownloader.Messages; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; public abstract class StructurePanel> extends JPanel implements PreferencePanelIntf { @@ -17,12 +16,12 @@ public abstract class StructurePanel> extends JPanel @get(Protected) JButton btnBuildStructure; @get(Protected) JCheckBox chkReplaceSpace; - @get(Protected) MyComboBox cbxReplaceSpaceChar; + @get(Protected) JComboBox cbxReplaceSpaceChar; StructurePanel() { this.btnBuildStructure = new JButton(Messages.getText("StructureBuilderDialog.Structure")); - this.cbxReplaceSpaceChar = new MyComboBox<>(new String[]{ "-", ".", "_" }); + this.cbxReplaceSpaceChar = JComboBox.create("-", ".", "_"); this.chkReplaceSpace = new JCheckBox(Messages.getText("PreferenceDialog.ReplaceSpaceWith")) .addCheckedChangeListener(cbxReplaceSpaceChar::setEnabled); @@ -35,7 +34,7 @@ public T addBuildStructureAction(ActionListener buildStructureAction) { } public String getReplaceSpaceChar() { - return this.cbxReplaceSpaceChar.getSelectedItem(); + return this.cbxReplaceSpaceChar.getSelectedValue(); } public void setReplaceSpaceChar(String s) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java index ad40cc2c..1b4d08d0 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/panels/preference/VideoLibraryPanel.java @@ -11,7 +11,6 @@ import net.miginfocom.swing.MigLayout; import org.lodder.subtools.multisubdownloader.gui.extra.PartialDisableComboBox; import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel; -import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcombobox.MyComboBox; import org.lodder.subtools.multisubdownloader.lib.library.LibraryActionType; import org.lodder.subtools.multisubdownloader.lib.library.LibraryOtherFileActionType; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; @@ -26,7 +25,7 @@ public abstract sealed class VideoLibraryPanel extends JPanel implements Prefere @Serial private static final long serialVersionUID = -9175813173306481849L; @val LibrarySettings librarySettings; - private final MyComboBox cbxLibraryAction; + private final JComboBox cbxLibraryAction; private final JCheckBox chkUseTVDBNaming; private final PartialDisableComboBox cbxLibraryOtherFileAction; private final SubtitleBackupPanel pnlBackup; @@ -48,8 +47,9 @@ public abstract sealed class VideoLibraryPanel extends JPanel implements Prefere VideoType.EPISODE == videoType).addTo(performActionPanel, "hidemode 3, wrap"); new JLabel(getText("PreferenceDialog.ActionForShowFiles")).addTo(performActionPanel); - this.cbxLibraryAction = new MyComboBox<>(LibraryActionType.values()).withToMessageStringRenderer( - LibraryActionType::getMsgCode).addTo(performActionPanel, "wrap"); + this.cbxLibraryAction = new JComboBox<>(LibraryActionType.values()) + .toMessageStringRenderer(LibraryActionType::getMsgCode) + .addTo(performActionPanel, "wrap"); this.pnlStructureFolder = new StructureFolderPanel(librarySettings, videoType, manager, userInteractionHandler) @@ -64,14 +64,14 @@ public abstract sealed class VideoLibraryPanel extends JPanel implements Prefere PartialDisableComboBox.of(LibraryOtherFileActionType.values()).addTo(performActionPanel); // - this.cbxLibraryAction.withSelectedItemConsumer(action -> { + this.cbxLibraryAction.selectedItemConsumer(action -> { boolean enable = action != LibraryActionType.NOTHING; cbxLibraryOtherFileAction.setEnabled(enable); lblActionForOtherFiles.setEnabled(enable); }); } - this.cbxLibraryAction.withItemListener(() -> { + this.cbxLibraryAction.itemListener(() -> { checkEnableStatusPanel(); checkPossibleOtherFileActions(); if (!cbxLibraryOtherFileAction.isItemEnabled(cbxLibraryOtherFileAction.getSelectedIndex())) { @@ -83,7 +83,7 @@ public abstract sealed class VideoLibraryPanel extends JPanel implements Prefere } private void checkPossibleOtherFileActions() { - LibraryActionType libraryActionType = cbxLibraryAction.getSelectedItem(); + LibraryActionType libraryActionType = cbxLibraryAction.getSelectedValue(); for (int i = 0; i < cbxLibraryOtherFileAction.getModel().getSize(); i++) { LibraryOtherFileActionType ofa = cbxLibraryOtherFileAction.getItemAt(i); boolean enabled = switch (libraryActionType) { @@ -99,7 +99,7 @@ private void checkPossibleOtherFileActions() { } private void checkEnableStatusPanel() { - LibraryActionType libraryActionType = cbxLibraryAction.getSelectedItem(); + LibraryActionType libraryActionType = cbxLibraryAction.getSelectedValue(); boolean pnlStructureFileVisible = switch (libraryActionType) { case MOVE, NOTHING -> false; case RENAME, MOVEANDRENAME -> true; @@ -130,9 +130,9 @@ public void savePreferenceSettings() { if (pnlBackup != null) { pnlBackup.savePreferenceSettings(); } - librarySettings.libraryAction = this.cbxLibraryAction.getSelectedItem(); + librarySettings.libraryAction = this.cbxLibraryAction.getSelectedValue(); librarySettings.libraryUseTVDBNaming = this.chkUseTVDBNaming.isSelected(); - librarySettings.libraryOtherFileAction = this.cbxLibraryOtherFileAction.getSelectedItem(); + librarySettings.libraryOtherFileAction = this.cbxLibraryOtherFileAction.getSelectedValue(); pnlStructureFolder.savePreferenceSettings(); pnlStructureFile.savePreferenceSettings(); diff --git a/SubLibrary/src/main/java/extensions/org/json/JSONArray/JSONArrayExt.java b/SubLibrary/src/main/java/extensions/org/json/JSONArray/JSONArrayExt.java index dbbbd4f9..30af1c01 100644 --- a/SubLibrary/src/main/java/extensions/org/json/JSONArray/JSONArrayExt.java +++ b/SubLibrary/src/main/java/extensions/org/json/JSONArray/JSONArrayExt.java @@ -17,7 +17,8 @@ public class JSONArrayExt { public static Stream stream(@This JSONArray jsonArray) { - return StreamSupport - .stream(Spliterators.spliteratorUnknownSize((Iterator) (Iterator) jsonArray.iterator(), Spliterator.ORDERED), false); + return StreamSupport.stream(Spliterators.spliteratorUnknownSize( + (Iterator) (Iterator) jsonArray.iterator(), Spliterator.ORDERED), false); + // return IntStream.range(0, jsonArray.length()).mapToObj(jsonArray::getJSONObject); } } \ No newline at end of file From 98e1074bd9c2189e487ca6afd9fb6213a970d346 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 7 Dec 2024 11:48:57 +0100 Subject: [PATCH 40/54] changes --- .../gui/extra/PartialDisableComboBox.java | 2 +- .../gui/jcomponent/jtextfield/MyTextFieldString.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java index ab85ff39..81bd7b4e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java @@ -104,6 +104,6 @@ private int requireValidIndex(int index) { } public T getSelectedItem() { - return super.getSelectedValue(); + return (T) super.getSelectedItem(); } } \ No newline at end of file diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldString.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldString.java index 96b4b3d7..629eb78c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldString.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldString.java @@ -10,20 +10,20 @@ public class MyTextFieldString extends MyTextFieldCommon TO_STRING_MAPPER = Function.identity(); private static final Function TO_OBJECT_MAPPER = Function.identity(); - public static final Predicate VERIFIER = text -> true; + public static final Predicate VERIFIER = _ -> true; private MyTextFieldString() { } - public static MyTextFieldOthersIntf builder() { + public static MyTextFieldOthersIntf builder() { return new MyTextFieldString() .withToStringMapper(TO_STRING_MAPPER) .withToObjectMapper(TO_OBJECT_MAPPER) .withValueVerifier(VERIFIER); } - public static MyTextFieldOthersIntf create() { + public static MyTextFieldOthersIntf create() { return builder().build(); } } From 54bcc4c6e82d2e02f8a4dff6ce446fbd85765f88 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 7 Dec 2024 11:54:22 +0100 Subject: [PATCH 41/54] changes --- .../gui/dialog/StructureBuilderDialog.java | 2 +- .../opensubtitles/OpenSubtitlesHasher.java | 18 ++++++++++-------- .../model/OpenSubtitlesMovieDescriptor.java | 4 ++-- .../sublibrary/model/MovieRelease.java | 2 +- .../util/prompter/PrompterBuilderBoolean.java | 4 ++-- .../util/prompter/PrompterBuilderInt.java | 4 ++-- .../util/prompter/PrompterBuilderValue.java | 4 ++-- .../prompter/PrompterBuilderValueFromList.java | 2 +- .../PrompterBuilderValuesFromList.java | 2 +- .../sublibrary/util/prompter/PrompterUtil.java | 2 +- 10 files changed, 23 insertions(+), 21 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index d71fe215..df6d64c4 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -176,7 +176,7 @@ public void mouseClicked(MouseEvent e) { beforeCaret = txtStructure.getText(); afterCaret = ""; } - txtStructure.setText(String.format("%s%s%s", beforeCaret, clickedTag, afterCaret)); + txtStructure.setText("%s%s%s".formatted(beforeCaret, clickedTag, afterCaret)); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesHasher.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesHasher.java index 125b247a..f26d8b62 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesHasher.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/OpenSubtitlesHasher.java @@ -13,9 +13,8 @@ import java.nio.file.StandardOpenOption; /** - * Hash code is based on Media Player Classic. In natural language it calculates: size + 64bit - * checksum of the first and last 64k (even if they overlap because the file is smaller than - * 128k). + * Hash code is based on Media Player Classic. In natural language it calculates: size + 64bit checksum of the first and + * last 64k (even if they overlap because the file is smaller than 128k). */ public class OpenSubtitlesHasher { @@ -30,8 +29,9 @@ public static String computeHash(Path path) throws IOException { try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) { long head = computeHashForChunk(fileChannel.map(MapMode.READ_ONLY, 0, chunkSizeForFile)); - long tail = computeHashForChunk(fileChannel.map(MapMode.READ_ONLY, Math.max(size - HASH_CHUNK_SIZE, 0), chunkSizeForFile)); - return String.format("%016x", size + head + tail); + long tail = computeHashForChunk( + fileChannel.map(MapMode.READ_ONLY, Math.max(size - HASH_CHUNK_SIZE, 0), chunkSizeForFile)); + return "%016x".formatted(size + head + tail); } } @@ -39,7 +39,8 @@ public static String computeHash(InputStream stream, long length) throws IOExcep int chunkSizeForFile = (int) Math.min(HASH_CHUNK_SIZE, length); - // buffer that will contain the head and the tail chunk, chunks will overlap if length is smaller than two chunks + // buffer that will contain the head and the tail chunk, chunks will overlap if length is smaller than two + // chunks byte[] chunkBytes = new byte[(int) Math.min(2 * HASH_CHUNK_SIZE, length)]; try (DataInputStream in = new DataInputStream(stream)) { @@ -59,9 +60,10 @@ public static String computeHash(InputStream stream, long length) throws IOExcep in.readFully(chunkBytes, chunkSizeForFile, chunkBytes.length - chunkSizeForFile); long head = computeHashForChunk(ByteBuffer.wrap(chunkBytes, 0, chunkSizeForFile)); - long tail = computeHashForChunk(ByteBuffer.wrap(chunkBytes, chunkBytes.length - chunkSizeForFile, chunkSizeForFile)); + long tail = computeHashForChunk( + ByteBuffer.wrap(chunkBytes, chunkBytes.length - chunkSizeForFile, chunkSizeForFile)); - return String.format("%016x", length + head + tail); + return "%016x".formatted(length + head + tail); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java index 9e8ce62a..06cd0c00 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/opensubtitles/model/OpenSubtitlesMovieDescriptor.java @@ -20,7 +20,7 @@ public OpenSubtitlesMovieDescriptor(String name, int imdbId) { @Override public boolean equals(Object object) { return object instanceof OpenSubtitlesMovieDescriptor other - && imdbId == other.imdbId && year == other.year && name.equals(other.name); + && imdbId == other.imdbId && year == other.year && name.equals(other.name); } @Override @@ -33,6 +33,6 @@ public String toString() { if (year < 0) { return name; } - return String.format("%s (%d)", name, year); + return "$name ($year)"; } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java index b622b488..34da9711 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/MovieRelease.java @@ -60,7 +60,7 @@ private MovieRelease(Path file, String description, String releaseGroup, String } public String getImdbIdAsString() { - return String.format("tt%07d", imdbId); + return "tt%07d".formatted(imdbId); } public OptionalInt getTvdbId() { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderBoolean.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderBoolean.java index e61e91aa..95ef4859 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderBoolean.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderBoolean.java @@ -72,13 +72,13 @@ public ValueBuilder defaultValue(boolean defaultValue) { @Override public ValueBuilder message(String message, Object... replacements) { - this.message = String.format(message, replacements); + this.message = message.formatted(replacements); return this; } @Override public ValueBuilder errorMessage(String errorMessage, Object... replacements) { - this.errorMessage = String.format(errorMessage, replacements); + this.errorMessage = errorMessage.formatted(replacements); return this; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderInt.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderInt.java index aa09ee93..d98b3981 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderInt.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderInt.java @@ -88,13 +88,13 @@ public ValueBuilder defaultValue(int defaultValue) { @Override public ValueBuilder message(String message, Object... replacements) { - this.message = String.format(message, replacements); + this.message = message.formatted(replacements); return this; } @Override public ValueBuilder errorMessage(String errorMessage, Object... replacements) { - this.errorMessage = String.format(errorMessage, replacements); + this.errorMessage = errorMessage.formatted(replacements); return this; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValue.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValue.java index 8a6905cf..fedeef5f 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValue.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValue.java @@ -83,13 +83,13 @@ public ValueBuilderValidatorMapperIntf toObjectMapper(Function @Override public ValueBuilder message(String message, Object... replacements) { - this.message = String.format(message, replacements); + this.message = message.formatted(replacements); return this; } @Override public ValueBuilder errorMessage(String errorMessage, Object... replacements) { - this.errorMessage = String.format(errorMessage, replacements); + this.errorMessage = errorMessage.formatted(replacements); return this; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java index 12327fb3..caf7d97c 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java @@ -83,7 +83,7 @@ public ValueFromListBuilder sort(Comparator comparator) { @Override public ValueFromListBuilder message(String message, Object... replacements) { - this.message = String.format(message, replacements); + this.message = message.formatted(replacements); return this; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java index d86ba0fb..8890fdc7 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java @@ -79,7 +79,7 @@ public ValuesFromListBuilder sort(Comparator comparator) { @Override public ValuesFromListBuilder message(String message, Object... replacements) { - this.message = String.format(message, replacements); + this.message = message.formatted(replacements); return this; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterUtil.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterUtil.java index cb813ef9..b6d9c9a1 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterUtil.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterUtil.java @@ -20,7 +20,7 @@ private PrompterUtil() { public static Prompter showMessage(Prompter prompter, String message, Object... replacements) { try { - prompter.showMessage(String.format(message, replacements)); + prompter.showMessage(message.formatted(replacements)); return prompter; } catch (PrompterException e) { throw new IllegalStateException(e); From 6d51724d8b4ff7c8700b7d7aa7efe333067a31eb Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 7 Dec 2024 13:30:42 +0100 Subject: [PATCH 42/54] changes --- .../subtools/sublibrary/control/ReleaseParserTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java b/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java index 5ef30530..059a08c3 100644 --- a/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java +++ b/SubLibrary/src/test/java/org/lodder/subtools/sublibrary/control/ReleaseParserTest.java @@ -1,7 +1,6 @@ package org.lodder.subtools.sublibrary.control; import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; import java.nio.file.Path; import java.util.List; @@ -88,7 +87,7 @@ void testTV() throws Exception { assertThat(release.videoType).isEqualTo(VideoType.EPISODE); assertThat(release.extension).isEqualTo("mkv"); - assertEquals(release.fileName, "Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv"); + assertThat(release.fileName).isEqualTo("Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv"); assertThat(release.releaseGroup).isEqualTo("DIMENSION"); assertThat(release.quality).isEqualTo("720p hdtv x264"); @@ -176,7 +175,7 @@ void testMovie() throws Exception { assertThat(release.videoType).isEqualTo(VideoType.MOVIE); assertThat(release.extension).isEqualTo("mkv"); - assertEquals(release.getFileName(), "The.Trip.to.Italy.2014.LIMITED.720p.BluRay.x264-GECKOS.mkv"); + assertThat(release.getFileName()).isEqualTo("The.Trip.to.Italy.2014.LIMITED.720p.BluRay.x264-GECKOS.mkv"); assertThat(release.releaseGroup).isEqualTo("GECKOS"); assertThat(release.quality).isEqualTo("720p bluray x264"); From 576826bfaf96f4b701e636896f4a42f0f21042aa Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 14 Dec 2024 20:31:07 +0100 Subject: [PATCH 43/54] dependency update --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 77e16f93..7276d67f 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ UTF-8 - 2024.1.42 + 2024.1.43 1.18.36 23 23 From 4ade476014ecb34f573990aa7801f085f694d612 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sat, 14 Dec 2024 20:36:22 +0100 Subject: [PATCH 44/54] small changes --- .../jtextfield/MyPasswordField.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java index 890288aa..9bb88e66 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java @@ -80,12 +80,6 @@ public MyPasswordField withValidityChangedCallback(BooleanConsumer... validityCh private static class ObjectWrapper { @var S value; - - public boolean setValue(S value) { - boolean changed = this.value != value; - this.value = value; - return changed; - } } @Override @@ -147,15 +141,17 @@ private void checkValidity(String text) { boolean valid = completeValueVerifier.test(text); setSuperBorder(valid ? MyPasswordField.getDefaultBorder(this) : ERROR_BORDER); - boolean changedValidity = validWrapper.setValue(valid); - if (changedValidity && validityChangedCalbackListeners != null) { - Arrays.stream(validityChangedCalbackListeners).forEach(listener -> listener.accept(valid)); + boolean changedValidity = validWrapper.value != valid; + validWrapper.value = valid; + if (changedValidity && validityChangedCallbackListeners != null) { + Arrays.stream(validityChangedCallbackListeners).forEach(listener -> listener.accept(valid)); } - if (valueChangedCalbackListener != null) { - boolean valueChanged = valueWrapper.setValue(text); + if (valueChangedCallbackListener != null) { + boolean valueChanged = !StringUtils.equals(valueWrapper.value, text); + valueWrapper.value = text; if (valueChanged) { - valueChangedCalbackListener.accept(text); + valueChangedCallbackListener.accept(text); } } } @@ -170,11 +166,6 @@ public String getText() { return completeValueVerifier.test(text) ? text : null; } - - public Optional getOptionalObject() { - return Optional.ofNullable(getText()); - } - @Override public void setText(String password) { super.setText(password); From 50ff94e26fc9c599e5d54d4f1485f2ae0f294936 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 15 Dec 2024 12:14:43 +0100 Subject: [PATCH 45/54] changes --- .../java/awt/Component/ComponentExt.java | 3 +- .../javax/swing/JCheckBox/JCheckBoxExt.java | 4 +- .../subtools/multisubdownloader/App.java | 3 +- .../subtools/multisubdownloader/CLI.java | 3 +- .../gui/dialog/StructureBuilderDialog.java | 3 +- .../extra/table/SubtitleTableColumnName.java | 3 +- .../gui/extra/table/SubtitleTableModel.java | 4 +- .../jtextfield/MyPasswordField.java | 26 +++--- .../jtextfield/MyPasswordFieldOthersIntf.java | 4 +- .../jtextfield/MyTextFieldCommon.java | 23 ++--- .../jtextfield/MyTextFieldOthersIntf.java | 4 +- .../subtitles/filters/SubtitleFilter.java | 50 ++++++----- .../settings/SettingValue.java | 17 ++-- .../settings/SettingsControl.java | 11 ++- .../settings/model/LibrarySettings.java | 3 +- .../addic7ed/LanguageId.java | 3 +- .../multisubdownloader/util/ExportImport.java | 15 ++-- .../subtitles/SubtitleFilteringTest.java | 44 ++++++---- .../manifold/rt/api/Array/ArrayExt.java | 35 ++++++++ .../lodder/subtools/sublibrary/Language.java | 7 +- .../subtools/sublibrary/cache/Cache.java | 2 +- .../sublibrary/control/VideoPatterns.java | 85 ++++++++----------- .../subtools/sublibrary/gui/OptionsPane.java | 16 ++-- .../PrompterBuilderValuesFromList.java | 16 ++-- .../util/prompter/TableDisplayer.java | 9 +- 25 files changed, 209 insertions(+), 184 deletions(-) create mode 100644 SubLibrary/src/main/java/extensions/manifold/rt/api/Array/ArrayExt.java diff --git a/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java b/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java index 9d58ce3c..90cbbeb6 100644 --- a/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java +++ b/MultiSubDownloader/src/main/java/extensions/java/awt/Component/ComponentExt.java @@ -2,7 +2,6 @@ import java.awt.*; import java.awt.event.MouseListener; -import java.util.Arrays; import java.util.function.Consumer; import java.util.function.Predicate; @@ -25,7 +24,7 @@ public static void setRecursive(@This Component component, Consumer c if (component != null) { consumer.accept(component); if (component instanceof Container container && condition.test(container)) { - Arrays.stream(container.getComponents()).forEach(child -> setRecursive(child, consumer, condition)); + container.getComponents().forEach(child -> setRecursive(child, consumer, condition)); } } } diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java index 5ee05ff9..bbef78db 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JCheckBox/JCheckBoxExt.java @@ -1,7 +1,6 @@ package extensions.javax.swing.JCheckBox; import javax.swing.*; -import java.util.Arrays; import lombok.experimental.UtilityClass; import manifold.ext.rt.api.Extension; @@ -14,8 +13,7 @@ public class JCheckBoxExt { public static @Self JCheckBox addCheckedChangeListener(@This JCheckBox checkBox, BooleanConsumer... listeners) { - checkBox.addItemListener(e -> Arrays.stream(listeners) - .forEach(listener -> listener.accept(((JCheckBox) e.getSource()).isSelected()))); + checkBox.addItemListener(e -> listeners.forEach(lis -> lis.accept(((JCheckBox) e.getSource()).isSelected()))); return checkBox; } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java index 5f2e5ee2..1547a677 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/App.java @@ -7,7 +7,6 @@ import java.io.Serializable; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; import java.util.List; import java.util.prefs.Preferences; @@ -150,7 +149,7 @@ private static void importPreferences(CommandLine line) { public static Options getCLIOptions() { Options options = new Options(); - Arrays.stream(CliOption.values()).forEach( + CliOption.values().forEach( cliOption -> options.addOption(cliOption.value, cliOption.longValue, cliOption.hasArg, cliOption.description)); return options; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 8cba032d..2315c4e5 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -3,7 +3,6 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.stream.IntStream; @@ -157,7 +156,7 @@ private List getFolders(CommandLine line) { private Language getLanguage(CommandLine line) throws CliException { if (line.hasCliOption(CliOption.LANGUAGE)) { String languageString = line.getCliOptionValue(CliOption.LANGUAGE); - return Arrays.stream(Language.values()) + return Language.values().stream() .filter(lang -> lang.name().equalsIgnoreCase(languageString)) .findAny() .orElseThrow(() -> new CliException(Messages.getText("App.NoValidLanguage"))); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java index df6d64c4..d30f9dcd 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java @@ -8,7 +8,6 @@ import java.awt.event.MouseListener; import java.io.Serial; import java.nio.file.Path; -import java.util.Arrays; import java.util.function.Function; import net.miginfocom.swing.MigLayout; @@ -113,7 +112,7 @@ private void generateVideoFiles() { } private void buildLabelTable(StructureTag[] structureTags) { - Arrays.stream(structureTags).forEach(this::addTag); + structureTags.forEach(this::addTag); } private void addTag(StructureTag structureTag) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java index a3a6463d..00ba4652 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java @@ -1,6 +1,5 @@ package org.lodder.subtools.multisubdownloader.gui.extra.table; -import java.util.Arrays; import java.util.function.Function; import manifold.ext.props.rt.api.override; @@ -33,7 +32,7 @@ public enum SubtitleTableColumnName implements CustomColumnName { } public static SubtitleTableColumnName forColumnName(String columnName) { - return Arrays.stream(SubtitleTableColumnName.values()) + return SubtitleTableColumnName.values().stream() .filter(stcn -> stcn.columnName.equals(columnName)) .findAny() .orElseThrow(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java index 55cf7a51..babe1d33 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java @@ -4,7 +4,6 @@ import javax.swing.table.*; import java.io.Serial; -import java.util.Arrays; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -24,8 +23,7 @@ public SubtitleTableModel(Object[][] data, String[] columnNames) { } public static SubtitleTableModel getDefaultSubtitleTableModel() { - String[] columnNames = - Arrays.stream(COLUMNS).map(SubtitleTableColumnName::getColumnName).toArray(String[]::new); + String[] columnNames = COLUMNS.stream().map(SubtitleTableColumnName::getColumnName).toArray(String[]::new); return new SubtitleTableModel(new Object[][]{}, columnNames); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java index 9bb88e66..f47df983 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordField.java @@ -5,8 +5,6 @@ import javax.swing.event.*; import java.awt.*; import java.io.Serial; -import java.util.Arrays; -import java.util.Optional; import java.util.function.Consumer; import java.util.function.Predicate; @@ -24,8 +22,8 @@ public class MyPasswordField extends JPasswordField implements MyPasswordFieldOt public Predicate valueVerifier = StringUtils::isNotEmpty; private boolean requireValue; - private Consumer valueChangedCalbackListener; - private BooleanConsumer[] validityChangedCalbackListeners; + private Consumer valueChangedCallbackListener; + private BooleanConsumer[] validityChangedCallbackListeners; private final ObjectWrapper valueWrapper = new ObjectWrapper<>(); private final ObjectWrapper validWrapper = new ObjectWrapper<>(); @@ -67,14 +65,14 @@ public MyPasswordField requireValue(boolean requireValue) { } @Override - public MyPasswordField withValueChangedCallback(Consumer valueChangedCalbackListener) { - this.valueChangedCalbackListener = valueChangedCalbackListener; + public MyPasswordField withValueChangedCallback(Consumer valueChangedCallbackListener) { + this.valueChangedCallbackListener = valueChangedCallbackListener; return this; } @Override - public MyPasswordField withValidityChangedCallback(BooleanConsumer... validityChangedCalbackListeners) { - this.validityChangedCalbackListeners = validityChangedCalbackListeners; + public MyPasswordField withValidityChangedCallback(BooleanConsumer... validityChangedCallbackListeners) { + this.validityChangedCallbackListeners = validityChangedCallbackListeners; return this; } @@ -109,11 +107,11 @@ public MyPasswordField build() { } else if (requireValue) { completeValueVerifier = StringUtils::isNotEmpty; } else { - completeValueVerifier = t -> true; + completeValueVerifier = _ -> true; } - if (valueVerifier != null || requireValue || valueChangedCalbackListener != null || - validityChangedCalbackListeners != null) { + if (valueVerifier != null || requireValue || valueChangedCallbackListener != null || + validityChangedCallbackListeners != null) { checkValidity(getRawText()); getDocument().addDocumentListener(new DocumentListener() { @@ -141,14 +139,14 @@ private void checkValidity(String text) { boolean valid = completeValueVerifier.test(text); setSuperBorder(valid ? MyPasswordField.getDefaultBorder(this) : ERROR_BORDER); - boolean changedValidity = validWrapper.value != valid; + boolean changedValidity = validWrapper.value != valid; validWrapper.value = valid; if (changedValidity && validityChangedCallbackListeners != null) { - Arrays.stream(validityChangedCallbackListeners).forEach(listener -> listener.accept(valid)); + validityChangedCallbackListeners.forEach(listener -> listener.accept(valid)); } if (valueChangedCallbackListener != null) { - boolean valueChanged = !StringUtils.equals(valueWrapper.value, text); + boolean valueChanged = !StringUtils.equals(valueWrapper.value, text); valueWrapper.value = text; if (valueChanged) { valueChangedCallbackListener.accept(text); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordFieldOthersIntf.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordFieldOthersIntf.java index 24fcfe22..18f7d0f3 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordFieldOthersIntf.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyPasswordFieldOthersIntf.java @@ -14,9 +14,9 @@ default MyPasswordFieldOthersIntf requireValue() { MyPasswordFieldOthersIntf requireValue(boolean requireValue); - MyPasswordFieldOthersIntf withValueChangedCallback(Consumer valueChangedCalbackListener); + MyPasswordFieldOthersIntf withValueChangedCallback(Consumer valueChangedCallbackListener); - MyPasswordFieldOthersIntf withValidityChangedCallback(BooleanConsumer... validityChangedCalbackListeners); + MyPasswordFieldOthersIntf withValidityChangedCallback(BooleanConsumer... validityChangedCallbackListeners); MyPasswordField build(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldCommon.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldCommon.java index 82fc249d..80893d08 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldCommon.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldCommon.java @@ -28,8 +28,8 @@ public abstract class MyTextFieldCommon> ex private Function toObjectMapper; private Predicate valueVerifier; private boolean requireValue; - private Consumer valueChangedCalbackListener; - private BooleanConsumer[] validityChangedCalbackListeners; + private Consumer valueChangedCallbackListener; + private BooleanConsumer[] validityChangedCallbackListeners; private final ObjectWrapper valueWrapper = new ObjectWrapper<>(); private final ObjectWrapper validWrapper = new ObjectWrapper<>(); @@ -78,14 +78,14 @@ public R requireValue(boolean requireValue) { } @Override - public R withValueChangedCallback(Consumer valueChangedCalbackListener) { - this.valueChangedCalbackListener = valueChangedCalbackListener; + public R withValueChangedCallback(Consumer valueChangedCallbackListener) { + this.valueChangedCallbackListener = valueChangedCallbackListener; return self(); } @Override - public final R withValidityChangedCallback(BooleanConsumer... validityChangedCalbackListeners) { - this.validityChangedCalbackListeners = validityChangedCalbackListeners; + public final R withValidityChangedCallback(BooleanConsumer... validityChangedCallbackListeners) { + this.validityChangedCallbackListeners = validityChangedCallbackListeners; return self(); } @@ -133,7 +133,8 @@ public R build() { completeValueVerifier = t -> true; } - if (valueVerifier != null || requireValue || valueChangedCalbackListener != null || validityChangedCalbackListeners != null) { + if (valueVerifier != null || requireValue || valueChangedCallbackListener != null || + validityChangedCallbackListeners != null) { checkValidity(getText()); getDocument().addDocumentListener(new DocumentListener() { @@ -162,15 +163,15 @@ private void checkValidity(String text) { setSuperBorder(valid ? MyTextFieldCommon.getDefaultBorder(self()) : ERROR_BORDER); boolean changedValidity = validWrapper.setValue(valid); - if (changedValidity && validityChangedCalbackListeners != null) { - Arrays.stream(validityChangedCalbackListeners).forEach(listener -> listener.accept(valid)); + if (changedValidity && validityChangedCallbackListeners != null) { + Arrays.stream(validityChangedCallbackListeners).forEach(listener -> listener.accept(valid)); } - if (valueChangedCalbackListener != null) { + if (valueChangedCallbackListener != null) { T value = toObjectMapper.apply(text); boolean valueChanged = valueWrapper.setValue(toObjectMapper.apply(text)); if (valueChanged) { - valueChangedCalbackListener.accept(value); + valueChangedCallbackListener.accept(value); } } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldOthersIntf.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldOthersIntf.java index 8affd69a..47fdf823 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldOthersIntf.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/jcomponent/jtextfield/MyTextFieldOthersIntf.java @@ -14,9 +14,9 @@ default MyTextFieldOthersIntf requireValue() { MyTextFieldOthersIntf requireValue(boolean requireValue); - MyTextFieldOthersIntf withValueChangedCallback(Consumer valueChangedCalbackListener); + MyTextFieldOthersIntf withValueChangedCallback(Consumer valueChangedCallbackListener); - MyTextFieldOthersIntf withValidityChangedCallback(BooleanConsumer... validityChangedCalbackListeners); + MyTextFieldOthersIntf withValidityChangedCallback(BooleanConsumer... validityChangedCallbackListeners); R build(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java index 11432104..c0a474c2 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/filters/SubtitleFilter.java @@ -1,7 +1,5 @@ package org.lodder.subtools.multisubdownloader.lib.control.subtitles.filters; -import java.util.Arrays; - import org.lodder.subtools.sublibrary.control.ReleaseParser; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; @@ -28,32 +26,32 @@ private boolean keywordCheck(String videoFileName, String subFileName) { String subFileNameLower = subFileName.toLowerCase(); return containsBoth(videoFileNameLower, subFileNameLower, "dl", "720p", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "dl", "1080p", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "1080p", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "dl", "web") - || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "720p") - || containsBoth(videoFileNameLower, subFileNameLower, "1080p", "bluray") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "bluray") - || containsBoth(videoFileNameLower, subFileNameLower, "x264", "bluray") - || containsBoth(videoFileNameLower, subFileNameLower, "x265", "bluray") - || containsBoth(videoFileNameLower, subFileNameLower, "xvid", "dvdrip") - || containsBoth(videoFileNameLower, subFileNameLower, "xvid", "hdtv") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "ts", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "bdrip", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "480p", "brrip", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "x264") - || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "x265") - || containsBoth(videoFileNameLower, subFileNameLower, "dvdscreener", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "r5", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "cam", "xvid") - || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "x264") - || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "x265") - || containsBoth(videoFileNameLower, subFileNameLower, "dvdrip"); + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "web") + || containsBoth(videoFileNameLower, subFileNameLower, "dl", "1080p", "web") + || containsBoth(videoFileNameLower, subFileNameLower, "1080p", "web") + || containsBoth(videoFileNameLower, subFileNameLower, "dl", "web") + || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "720p") + || containsBoth(videoFileNameLower, subFileNameLower, "1080p", "bluray") + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "bluray") + || containsBoth(videoFileNameLower, subFileNameLower, "x264", "bluray") + || containsBoth(videoFileNameLower, subFileNameLower, "x265", "bluray") + || containsBoth(videoFileNameLower, subFileNameLower, "xvid", "dvdrip") + || containsBoth(videoFileNameLower, subFileNameLower, "xvid", "hdtv") + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "ts", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "bdrip", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "480p", "brrip", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "x264") + || containsBoth(videoFileNameLower, subFileNameLower, "720p", "brrip", "x265") + || containsBoth(videoFileNameLower, subFileNameLower, "dvdscreener", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "r5", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "cam", "xvid") + || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "x264") + || containsBoth(videoFileNameLower, subFileNameLower, "hdtv", "x265") + || containsBoth(videoFileNameLower, subFileNameLower, "dvdrip"); } private boolean containsBoth(String string1, String string2, String... values) { - return Arrays.stream(values).allMatch(string1::contains) && Arrays.stream(values).allMatch(string2::contains); + return values.stream().allMatch(string1::contains) && values.stream().allMatch(string2::contains); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java index ad432ad1..41fea947 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java @@ -1,7 +1,6 @@ package org.lodder.subtools.multisubdownloader.settings; import java.nio.file.Path; -import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; @@ -448,7 +447,7 @@ public void load(SettingsControl settingsControl, Preferences preferences) { } public static void loadAll(SettingsControl settingsControl, Preferences preferences) { - Arrays.stream(SettingValue.values()).forEach(sv -> sv.load(settingsControl, preferences)); + SettingValue.values().forEach(sv -> sv.load(settingsControl, preferences)); } @@ -509,7 +508,8 @@ private interface SettingTypedToObjectMapperIntf { } private interface SettingTypedPreferenceGetterIntf { - SettingTypedRootElementFunctionIntf preferencesGetter(TriFunction preferencesGetter); + SettingTypedRootElementFunctionIntf preferencesGetter( + TriFunction preferencesGetter); } private interface SettingTypedRootElementFunctionIntf { @@ -619,13 +619,15 @@ public SettingIntf build(String key) { case SINGLE_VALUE -> { super.storeValueFunction((settingsControl, preferences) -> { T value = valueGetter.apply(getRootElement(settingsControl)); - if (!Objects.equal(value, getDefaultValue()) && !(value instanceof String text && "".equals(text))) { + if (!Objects.equal(value, getDefaultValue()) && + !(value instanceof String text && "".equals(text))) { preferencesSetter.accept(preferences, key, value); } }); - super.loadValueFunction((settingsControl, preferences) -> valueSetter.accept(getRootElement(settingsControl), - preferencesGetter.apply(preferences, key, getDefaultValue()))); + super.loadValueFunction( + (settingsControl, preferences) -> valueSetter.accept(getRootElement(settingsControl), + preferencesGetter.apply(preferences, key, getDefaultValue()))); } case COLLECTION -> { super.storeValueFunction((settingsControl, preferences) -> { @@ -641,7 +643,8 @@ public SettingIntf build(String key) { R rootElement = getRootElement(settingsControl); listCleaner.accept(rootElement); IntStream.range(0, numberOfItems) - .forEach(i -> valueAdder.accept(rootElement, toObjectMapper.apply(preferences.get(key + i, "")))); + .forEach(i -> valueAdder.accept(rootElement, + toObjectMapper.apply(preferences.get(key + i, "")))); }); } default -> throw new IllegalArgumentException("Unexpected value: " + settingType); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java index 567fdf28..2efaa447 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingsControl.java @@ -9,7 +9,6 @@ import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; import java.util.List; import java.util.prefs.BackingStoreException; import java.util.prefs.InvalidPreferencesFormatException; @@ -77,7 +76,7 @@ public void store() { try { // clean up preferences.clear(); - Arrays.stream(SettingValue.values()).forEach(sv -> sv.store(this, preferences)); + SettingValue.values().forEach(sv -> sv.store(this, preferences)); updateProxySettings(); } catch (BackingStoreException e) { LOGGER.error(e.getMessage(), e); @@ -201,7 +200,7 @@ public void migrateSettingsV0ToV1() { MOVIE_LIBRARY_FILENAME_STRUCTURE.store(this, preferences); try { - Arrays.stream(preferences.keys()).forEach(key -> { + preferences.keys().forEach(key -> { String value = preferences.get(key, ""); preferences.remove(key); preferences.put(StringUtils.capitalize(key), value); @@ -276,7 +275,7 @@ public void migrateSettingsV3ToV4() { } public void migrateSettingsV4ToV5() { - Arrays.stream(MappingType.ADDIC7ED_PROXY.getSelectionForKeyPrefixList()) + MappingType.ADDIC7ED_PROXY.selectionForKeyPrefixList .forEach(selectionForKeyPrefix -> MappingType.MAPPING_SUPPLIER.apply(manager, selectionForKeyPrefix) .forEach(serieMappingPair -> manager.valueBuilder() .cacheType(CacheType.DISK) @@ -357,8 +356,8 @@ public void migrateSettingsV6ToV7() { public void migrateSettingsV7ToV8() { if (settings.loginOpenSubtitlesEnabled && - !OpenSubtitlesApi.isValidCredentials(settings.loginOpenSubtitlesUsername, - settings.loginOpenSubtitlesPassword)) { + !OpenSubtitlesApi.isValidCredentials(settings.loginOpenSubtitlesUsername, + settings.loginOpenSubtitlesPassword)) { settings.loginOpenSubtitlesEnabled = false; LOGIN_OPEN_SUBTITLES_ENABLED.store(this, preferences); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java index 15fbe979..796395da 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/model/LibrarySettings.java @@ -1,7 +1,6 @@ package org.lodder.subtools.multisubdownloader.settings.model; import java.nio.file.Path; -import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; @@ -34,7 +33,7 @@ public boolean hasLibraryAction(LibraryActionType libraryAction) { } public boolean hasAnyLibraryAction(LibraryActionType... libraryActions) { - return Arrays.stream(libraryActions).anyMatch(this::hasLibraryAction); + return libraryActions.stream().anyMatch(this::hasLibraryAction); } public boolean hasLibraryOtherFileAction(LibraryOtherFileActionType libraryOtherFileAction) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/LanguageId.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/LanguageId.java index 4a1a9e0c..2440789e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/LanguageId.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/LanguageId.java @@ -1,6 +1,5 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.addic7ed; -import java.util.Arrays; import java.util.List; import lombok.AllArgsConstructor; @@ -81,6 +80,6 @@ public enum LanguageId { @val int id; public static List forLanguage(Language language) { - return Arrays.stream(LanguageId.values()).filter(langId -> langId.language == language).toList(); + return LanguageId.values().stream().filter(langId -> langId.language == language).toList(); } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java index 13e63142..725f3e60 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/util/ExportImport.java @@ -118,7 +118,7 @@ public void importSettings(Path path, UserInteractionHandler userInteractionHand public static class ExportImportSerieMapping { public void exportSettings(Path path, Manager manager) throws IOException { - List serieMappingsWithKey = Arrays.stream(MappingType.values()) + List serieMappingsWithKey = MappingType.values().stream() .map(MappingType::getSelectionForKeyPrefixList) .flatMap(Arrays::stream) .flatMap(selectionForKeyPrefix -> manager.valueBuilder() @@ -144,7 +144,7 @@ public void importSettings(Path path, UserInteractionHandler userInteractionHand } getImportStyle(userInteractionHandler).ifPresent(importStyle -> { if (importStyle == ImportStyle.OVERWRITE) { - Arrays.stream(MappingType.values()) + MappingType.values().stream() .map(MappingType::getSelectionForKeyPrefixList) .flatMap(Arrays::stream) .forEach(selectionForKeyPrefix -> manager.clearExpiredCacheBuilder() @@ -152,12 +152,11 @@ public void importSettings(Path path, UserInteractionHandler userInteractionHand .keyFilter((String k) -> k.startsWith(selectionForKeyPrefix.keyPrefix())) .clear()); } - Arrays.stream(serieMappings) - .forEach(serieMapping -> manager.valueBuilder() - .cacheType(CacheType.DISK) - .key(serieMapping.key) - .value(serieMapping.serieMapping) - .store()); + serieMappings.forEach(serieMapping -> manager.valueBuilder() + .cacheType(CacheType.DISK) + .key(serieMapping.key) + .value(serieMapping.serieMapping) + .store()); }); } diff --git a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java index fd86c497..eedbee80 100644 --- a/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java +++ b/MultiSubDownloader/src/test/java/org/lodder/subtools/multisubdownloader/lib/control/subtitles/SubtitleFilteringTest.java @@ -3,7 +3,6 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.Test; @@ -30,10 +29,14 @@ void testKeywordMatchFilter() { Release release = createRelease("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.mkv", "DIMENSION"); Subtitle subtitle1 = createSubtitle("Criminal.Minds.S10E12.HDTV.XviD-AFG.srt", "AFG", false, ""); Subtitle subtitle2 = createSubtitle("criminal.minds.1012.hdtv-lol.srt", "lol", false, ""); - Subtitle subtitle3 = createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", true, ""); - Subtitle subtitle4 = createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, ""); - Subtitle subtitle5 = createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, "720p HDTV X264"); - Subtitle subtitle6 = createSubtitle("Criminal.Minds.S10E12.Anonymous.1080p.WEB-DL.DD5.1.H.264-CtrlHD", "CtrlHD", false, ""); + Subtitle subtitle3 = + createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", true, ""); + Subtitle subtitle4 = + createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, ""); + Subtitle subtitle5 = createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, + "720p HDTV X264"); + Subtitle subtitle6 = + createSubtitle("Criminal.Minds.S10E12.Anonymous.1080p.WEB-DL.DD5.1.H.264-CtrlHD", "CtrlHD", false, ""); // only keyword assertThatFilter(new SubtitleFiltering(createSettings(true, false, false))) @@ -53,9 +56,12 @@ void testExactMatchFilter() { Release release = createRelease("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.mkv", "DIMENSION"); Subtitle subtitle1 = createSubtitle("Criminal.Minds.S10E12.HDTV.XviD-AFG.srt", "AFG", false, ""); Subtitle subtitle2 = createSubtitle("criminal.minds.1012.hdtv-lol.srt", "lol", false, ""); - Subtitle subtitle3 = createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", true, ""); - Subtitle subtitle4 = createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, ""); - Subtitle subtitle5 = createSubtitle("Criminal.Minds.S10E12.Anonymous.1080p.WEB-DL.DD5.1.H.264-CtrlHD", "CtrlHD", false, ""); + Subtitle subtitle3 = + createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", true, ""); + Subtitle subtitle4 = + createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, ""); + Subtitle subtitle5 = + createSubtitle("Criminal.Minds.S10E12.Anonymous.1080p.WEB-DL.DD5.1.H.264-CtrlHD", "CtrlHD", false, ""); // only exact match assertThatFilter(new SubtitleFiltering(createSettings(false, true, false))) @@ -75,10 +81,14 @@ void testExactMatchAndKeywordMatchFilter() { Release release = createRelease("Criminal.Minds.S10E12.Anonymous.720p.HDTV.X264-DIMENSION.mkv", "DIMENSION"); Subtitle subtitle1 = createSubtitle("Criminal.Minds.S10E12.HDTV.XviD-AFG.srt", "AFG", false, ""); Subtitle subtitle2 = createSubtitle("criminal.minds.1012.hdtv-lol.srt", "lol", false, ""); - Subtitle subtitle3 = createSubtitle("Criminal.Minds.S10E12.Anonymous.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", true, ""); - Subtitle subtitle4 = createSubtitle("Criminal.Minds.S10E12.Anonymous.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, ""); - Subtitle subtitle5 = createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, ""); - Subtitle subtitle6 = createSubtitle("Criminal.Minds.S10E12.Anonymous.1080p.WEB-DL.DD5.1.H.264-CtrlHD", "CtrlHD", false, ""); + Subtitle subtitle3 = + createSubtitle("Criminal.Minds.S10E12.Anonymous.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", true, ""); + Subtitle subtitle4 = + createSubtitle("Criminal.Minds.S10E12.Anonymous.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, ""); + Subtitle subtitle5 = + createSubtitle("Criminal.Minds.S10E12.720p.HDTV.X264-DIMENSION.srt", "DIMENSION", false, ""); + Subtitle subtitle6 = + createSubtitle("Criminal.Minds.S10E12.Anonymous.1080p.WEB-DL.DD5.1.H.264-CtrlHD", "CtrlHD", false, ""); // only exact match assertThatFilter(new SubtitleFiltering(createSettings(true, true, false))) @@ -142,7 +152,8 @@ private interface TestSetupMatchesIntf { void matchesSubtitles(Subtitle... subtitles); } - private static class TestSetupFiltering implements TestSetupSubtitlesIntf, TestSetupReleaseIntf, TestSetupMatchesIntf { + private static class TestSetupFiltering + implements TestSetupSubtitlesIntf, TestSetupReleaseIntf, TestSetupMatchesIntf { private SubtitleFiltering filter; private List subtitles; private Release release; @@ -153,7 +164,7 @@ public TestSetupFiltering assertThatFilter(SubtitleFiltering filter) { } public TestSetupFiltering appliedOnSubtitles(Subtitle... subtitles) { - this.subtitles = Arrays.stream(subtitles).toList(); + this.subtitles = subtitles.stream().toList(); return this; } @@ -163,10 +174,11 @@ public TestSetupFiltering forRelease(Release release) { } public void matchesSubtitles(Subtitle... subtitles) { - List filteredSubtitles = this.subtitles.stream().filter(subtitle -> filter.useSubtitle(subtitle, release)).toList(); + List filteredSubtitles = + this.subtitles.stream().filter(subtitle -> filter.useSubtitle(subtitle, release)).toList(); assertThat(filteredSubtitles) .withFailMessage("Expected the filtered subtitles to contain exactly %s, but found %s".formatted( - Arrays.stream(subtitles).map(Subtitle::getFileName).toList(), + subtitles.stream().map(Subtitle::getFileName).toList(), filteredSubtitles.stream().map(Subtitle::getFileName).toList())) .containsExactlyInAnyOrder(subtitles); } diff --git a/SubLibrary/src/main/java/extensions/manifold/rt/api/Array/ArrayExt.java b/SubLibrary/src/main/java/extensions/manifold/rt/api/Array/ArrayExt.java new file mode 100644 index 00000000..ac5d1a33 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/manifold/rt/api/Array/ArrayExt.java @@ -0,0 +1,35 @@ +package extensions.manifold.rt.api.Array; + +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.function.Consumer; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Self; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class ArrayExt { + + /** + * Performs an action for each element of the array. + * + * @param array the Array + * @param action an action to perform on the elements + */ + public static void forEach(@This Object array, Consumer action) { + primitiveCheck(array); + Arrays.stream((Object[]) array, 0, Array.getLength(array)).forEach(action); + } + + + private static void primitiveCheck(Object array) { + Class componentType = array.getClass().getComponentType(); + if (componentType.isPrimitive()) { + throw new IllegalArgumentException("$array has not a primitive component type: " + + array.getClass().getComponentType().getSimpleName()); + } + } +} \ No newline at end of file diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Language.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Language.java index d2e5e1cd..0c0af954 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Language.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Language.java @@ -1,6 +1,5 @@ package org.lodder.subtools.sublibrary; -import java.util.Arrays; import java.util.Optional; import java.util.Set; @@ -78,18 +77,18 @@ public enum Language { @val Set langCodesOther; public static Language fromValue(String value) { - return Arrays.stream(Language.values()) + return Language.values().stream() .filter(lang -> lang.name().equalsIgnoreCase(value)) .findAny() .orElseThrow(); } public static Optional fromValueOptional(String value) { - return Arrays.stream(Language.values()).filter(lang -> lang.name().equalsIgnoreCase(value)).findAny(); + return Language.values().stream().filter(lang -> lang.name().equalsIgnoreCase(value)).findAny(); } public static Optional fromIdOptional(String languageId) { - return Arrays.stream(Language.values()).filter(lang -> lang.langCode.equalsIgnoreCase(languageId)).findAny(); + return Language.values().stream().filter(lang -> lang.langCode.equalsIgnoreCase(languageId)).findAny(); } public static Language fromId(String languageId) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java index 677deafd..01d02e67 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java @@ -97,7 +97,7 @@ public V getOrPut(K key, ThrowingSupplier supplier) return null; } else { obj.updateLastAccessed(); - return (V) obj.value; + return obj.value; } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java index b3050ab6..99c03bb1 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/VideoPatterns.java @@ -1,6 +1,5 @@ package org.lodder.subtools.sublibrary.control; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,10 +27,6 @@ public enum Quality implements VideoPatternEnumIntf { Q480P("480p"); @val String value; - - public static Stream getValuesStream() { - return Arrays.stream(Quality.values()).map(Quality::getValue); - } } public enum VideoEncoding implements VideoPatternEnumIntf { @@ -43,10 +38,6 @@ public enum VideoEncoding implements VideoPatternEnumIntf { VideoEncoding(String... values) { this.values = values; } - - public static Stream getValuesStream() { - return Arrays.stream(VideoEncoding.values()).map(VideoEncoding::getValues).flatMap(Arrays::stream); - } } public enum AudioEncoding implements VideoPatternEnumIntf { @@ -57,10 +48,6 @@ public enum AudioEncoding implements VideoPatternEnumIntf { AudioEncoding(String... values) { this.values = values; } - - public static Stream getValuesStream() { - return Arrays.stream(AudioEncoding.values()).map(AudioEncoding::getValues).flatMap(Arrays::stream); - } } public enum Source implements VideoPatternEnumIntf { @@ -83,8 +70,7 @@ public enum Source implements VideoPatternEnumIntf { static final Map VALUE_MAP = new HashMap<>(); static { - Arrays.stream(Source.values()) - .forEach(source -> Arrays.stream(source.values).forEach(value -> VALUE_MAP.put(value, source))); + Source.values().forEach(source -> source.values.forEach(value -> VALUE_MAP.put(value, source))); } @val boolean manyDifferentSources; @@ -95,16 +81,12 @@ public enum Source implements VideoPatternEnumIntf { this.values = values; } - public static Stream getValuesStream() { - return Arrays.stream(Source.values()).map(Source::getValues).flatMap(Arrays::stream); - } - public static Source fromValue(String value) { return VALUE_MAP.get(value); } public boolean isTypeForValue(String value) { - return Arrays.stream(values).map(String::toLowerCase).anyMatch(value::equals); + return values.stream().map(String::toLowerCase).anyMatch(value::equals); } @Override @@ -138,71 +120,72 @@ public enum VideoExtensions { // example: // Back.to.the.Future.Part.II.1989.720p.BluRay.X264-AMIABLE.mkv "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[I|V|X]+)[. ]" + - "(?19\\d{2}|20\\d{2})" + - "(?['\\w\\s:&()!.,_-]+)", + "(?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)", "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[I|V|X]+)[. ]" + - "(?19\\d{2}|20\\d{2})" + - "(?['\\w\\s:&()!.,_-]+)", + "(?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)", // The.Hunger.Games.Mockingjay.Part.1..2014.720p.BluRay.x264-SPARKS.mkv "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1})[. ]" + - "(?19\\d{2}|20\\d{2})" + - "(?['\\w\\s:&()!.,_-]+)", + "(?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)", "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1})[. ]" + - "(?19\\d{2}|20\\d{2})" + - "(?['\\w\\s:&()!.,_-]+)", + "(?19\\d{2}|20\\d{2})" + + "(?['\\w\\s:&()!.,_-]+)", // serie "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}" + - "(?[\\d]{1,2})" + - "(?[XxEe][\\d]{1,2})*[XxEe](?[\\d]{1,2})(?['\\w\\s:&()!.," + - "_-]+)", + "(?[\\d]{1,2})" + + "(?[XxEe][\\d]{1,2})*[XxEe](?[\\d]{1,2})" + + "(?['\\w\\s:&()!.," + + "_-]+)", "(?['\\w\\s:&()!.,_-]+)[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1," + - "3})(?['\\w\\s:&()" + - "!.,_-]+)", + "3})(?['\\w\\s:&()" + + "!.,_-]+)", // sXeX - Serienaam - Titel ex: S04E02 - White Collar - Most Wanted.mkv "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})" + - "(?[XxEe][\\d]{1,2})*[XxEe]" + - "(?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+" + - "(?['\\w\\s:&()!.,_]+)", + "(?[XxEe][\\d]{1,2})*[XxEe]" + + "(?[\\d]{1,2})\\s?+-?\\s?+(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+" + + "(?['\\w\\s:&()!.,_]+)", "[Ss. _](?[\\d]{1,2})[XxEe]{1,2}(?[\\d]{1,2})\\s?+-?\\s?+" + - "(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+" + - "(?['\\w\\s:&()!.,_]+)", + "(?['\\w\\s:&()!.,_]+)\\s?+-?\\s?+" + + "(?['\\w\\s:&()!.,_]+)", // example: hawaii.five-0.2010.410.hdtv-lol.mp4 // example: // Spartacus.Gods.of.The.Arena.Pt.I.720p.HDTV.X264-DIMENSION.mkv "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[I|V|X]+)" + - "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)", "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[I|V|X]+)" + - "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)", "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)(?[\\d]{1,2})" + - "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)", "(?['\\w\\s:&()!.,_-]+)(?Pt|Part|pt|part|Ep)[.](?[\\d]{1,2})" + - "(?['\\w\\s:&()!.,_-]+)", + "(?['\\w\\s:&()!.,_-]+)", // example hawaii.five-0.2010.410.hdtv-lol.mp4 "(?['\\w\\s:&()!.,_-]+)[. ](?19\\d{2}|20\\d{2})[. ](?[\\d]{3,4})[. ]" + - "(?['\\w\\s:&()!.," + - "_-]+)", + "(?['\\w\\s:&()!.," + + "_-]+)", // format movietitle.year "(?['\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}(?19\\d{2}|20\\d{2})(?['\\w\\s:&()" + - "!.,_-]+)", + "!.,_-]+)", // format episode.0101.title // format episode.101.title // exclude format movietitle.720p "(?['\\w\\s:&()!.,_-]+)[. ](?[\\d]{3,4})[. ](?['\\w\\s:&()!.," + - "_-]+)", + "_-]+)", // format (2-11) Joey and the High School Friend "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ " + - "]and(?['\\w\\s:&()!" + - ".,_-]+)", + "]and(?['\\w\\s:&()!" + + ".,_-]+)", "[(](?[\\d]{1,2})[-](?[\\d]{1,2})[) ](?['\\w\\s:&()!.,_-]+)[ " + - "]And(?['\\w\\s:&()!" + - ".,_-]+)", + "]And(?['\\w\\s:&()!" + + ".,_-]+)", // take the rest and treat as movie "(?['\\w\\s:&()!.,_-]+)[\\.|\\[|\\(| ]{1}[720P|1080P](?['\\w\\s:&()!.,_-]+)" }; public static final List COMPILED_PATTERNS = - Arrays.stream(PATTERNS).map(p -> NamedPattern.compile(p, Pattern.CASE_INSENSITIVE)).toList(); + PATTERNS.stream().map(p -> NamedPattern.compile(p, Pattern.CASE_INSENSITIVE)).toList(); public static final List QUALITY_KEYWORDS = List.of(); // Stream.concat(QUALITY_KEYWORDS_SET.stream(), diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/OptionsPane.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/OptionsPane.java index b3d7b831..aa0854d4 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/OptionsPane.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/gui/OptionsPane.java @@ -2,7 +2,6 @@ import javax.swing.*; import java.awt.*; -import java.util.Arrays; import java.util.Collection; import java.util.Optional; import java.util.function.Function; @@ -79,7 +78,8 @@ public interface OptionsPaneBuilderPromptIntf { @Setter @Accessors(fluent = true) @RequiredArgsConstructor - private static class OptionsPaneBuilder implements OptionsPaneBuilderPromptIntf, OptionsPaneBuilderMessageTypeIntf, + private static class OptionsPaneBuilder + implements OptionsPaneBuilderPromptIntf, OptionsPaneBuilderMessageTypeIntf, OptionsPaneBuilderMessageIntf, OptionsPaneBuilderTitleIntf, OptionsPaneBuilderToStringMapperIntf { private final T[] optionsArray; private final Collection optionsList; @@ -108,13 +108,17 @@ public Optional prompt() { } else { options = optionsArray; } - return Optional.ofNullable((T) JOptionPane.showInputDialog(parent, message, title, messageType, null, options, "0")); + return Optional.ofNullable( + (T) JOptionPane.showInputDialog(parent, message, title, messageType, null, options, "0")); } else { - Stream optionsStream = optionsList != null ? optionsList.stream() : Arrays.stream(optionsArray); + Stream optionsStream = optionsList != null ? optionsList.stream() : optionsArray.stream(); ElementWrapper[] options = - optionsStream.map(option -> new ElementWrapper<>(option, toStringMapper)).toArray(ElementWrapper[]::new); + optionsStream.map(option -> new ElementWrapper<>(option, toStringMapper)) + .toArray(ElementWrapper[]::new); return Optional - .ofNullable((ElementWrapper) JOptionPane.showInputDialog(parent, message, title, messageType, null, options, "0")) + .ofNullable( + (ElementWrapper) JOptionPane.showInputDialog(parent, message, title, messageType, + null, options, "0")) .map(ElementWrapper::element); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java index 8890fdc7..1b846c87 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValuesFromList.java @@ -104,9 +104,11 @@ public List prompt(Prompter prompter) { value = prompter.prompt(message); } else { String choicesMessage = IntStream.range(0, elements.size()) - .mapToObj(number -> " - " + (number + 1) + ": " + toStringMapper.apply(elements.get(number))) - .collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator(); - value = prompter.prompt(StringUtils.isBlank(message) ? choicesMessage : message + System.lineSeparator() + choicesMessage); + .mapToObj( + number -> " - " + (number + 1) + ": " + toStringMapper.apply(elements.get(number))) + .collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator(); + value = prompter.prompt(StringUtils.isBlank(message) ? choicesMessage : + message + System.lineSeparator() + choicesMessage); } if (StringUtils.isBlank(value) && includeNull) { return new ArrayList<>(); @@ -114,19 +116,21 @@ public List prompt(Prompter prompter) { if (StringUtils.isBlank(value)) { return prompt(PrompterUtil.showMessage(prompter, "Enter a valid value, try again.")); } - List choices = Arrays.stream(value.split(",")).map(Integer::parseInt).map(i -> i - 1).toList(); + List choices = value.split(",").stream().map(Integer::parseInt).map(i -> i - 1).toList(); if (choices.stream().distinct().count() != choices.size()) { return prompt(PrompterUtil.showMessage(prompter, "Choose all distinct options, try again.")); } if (choices.stream().anyMatch(number -> number < 0 || number > elements.size() - 1)) { - PrompterUtil.showMessage(prompter, "The entered number(s) aren't in the range [1, %s], try again.", elements.size()); + PrompterUtil.showMessage(prompter, "The entered number(s) aren't in the range [1, %s], try again.", + elements.size()); return prompt(prompter); } return choices.stream().map(elements::get).collect(Collectors.toList()); } catch (PrompterException e) { throw new IllegalStateException(e); } catch (NumberFormatException e) { - PrompterUtil.showMessage(prompter, "Invalid number(s) encountered. Enter a comma separated list of the choices."); + PrompterUtil.showMessage(prompter, + "Invalid number(s) encountered. Enter a comma separated list of the choices."); return prompt(prompter); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/TableDisplayer.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/TableDisplayer.java index abbfc9a4..013950fb 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/TableDisplayer.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/TableDisplayer.java @@ -1,6 +1,5 @@ package org.lodder.subtools.sublibrary.util.prompter; -import java.util.Arrays; import java.util.List; import dnl.utils.text.table.TextTable; @@ -14,8 +13,9 @@ public class TableDisplayer { @SafeVarargs public final void display(T... tableElements) { String[] columnNames = columnDisplayers.stream().map(ColumnDisplayer::columnName).toArray(String[]::new); - Object[][] dataTable = Arrays.stream(tableElements) - .map(tableElement -> columnDisplayers.stream().map(columnDisplayer -> columnDisplayer.toStringMapper().apply(tableElement)) + Object[][] dataTable = tableElements.stream() + .map(tableElement -> columnDisplayers.stream() + .map(columnDisplayer -> columnDisplayer.toStringMapper().apply(tableElement)) .toArray()) .toArray(Object[][]::new); @@ -29,7 +29,8 @@ public void display(List tableElements) { String[] columnNames = columnDisplayers.stream().map(ColumnDisplayer::columnName).toArray(String[]::new); Object[][] dataTable = tableElements.stream() - .map(tableElement -> columnDisplayers.stream().map(columnDisplayer -> columnDisplayer.toStringMapper().apply(tableElement)) + .map(tableElement -> columnDisplayers.stream() + .map(columnDisplayer -> columnDisplayer.toStringMapper().apply(tableElement)) .toArray()) .toArray(Object[][]::new); From b25020e5560f8c87f7b87cb103c7f2e7e08c4e0f Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 15 Dec 2024 14:51:59 +0100 Subject: [PATCH 46/54] changes --- .../subtools/multisubdownloader/GUI.java | 2 +- .../subtitleproviders/Local.java | 7 ++-- .../adapters/JAddic7edViaProxyAdapter.java | 4 +-- .../adapters/JOpenSubAdapter.java | 6 ++-- .../adapters/JPodnapisiAdapter.java | 3 +- .../java/io/InputStream/InputStreamExt.java | 18 ++++++++++ .../java/lang/String/StringExt.java | 7 ++++ .../subtools/sublibrary/ConfigProperties.java | 12 +++---- .../lodder/subtools/sublibrary/Manager.java | 3 +- .../lodder/subtools/sublibrary/OsCheck.java | 34 ++++++++----------- .../sublibrary/control/ReleaseParser.java | 5 +-- .../subtools/sublibrary/model/TvRelease.java | 4 +-- .../subtools/sublibrary/util/IOUtils.java | 20 ----------- .../sublibrary/util/NamedMatchResult.java | 5 ++- .../sublibrary/util/NamedMatcher.java | 22 +++++------- .../sublibrary/util/NamedPattern.java | 20 +++-------- .../subtools/sublibrary/util/Utils.java | 21 ------------ .../sublibrary/util/http/HttpClient.java | 8 ++--- .../util/prompter/PrompterBuilderCommon.java | 5 ++- .../subtools/sublibrary/xml/XMLHelper.java | 10 +++--- 20 files changed, 87 insertions(+), 129 deletions(-) create mode 100644 SubLibrary/src/main/java/extensions/java/io/InputStream/InputStreamExt.java delete mode 100644 SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/IOUtils.java delete mode 100755 SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/Utils.java diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java index d51c18d3..6617ce59 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/GUI.java @@ -431,7 +431,7 @@ private void downloadText() { if (!subtitle.fileName.endsWith(".srt")) { filename = subtitle.fileName + ".srt"; } - if (OsCheck.getOperatingSystemType() == OSType.WINDOWS) { + if (OsCheck.operatingSystemType == OSType.WINDOWS) { filename = filename.removeIllegalWindowsChars(); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index 3f2d4d27..3ddb7249 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -30,7 +30,6 @@ import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler; -import org.lodder.subtools.sublibrary.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,8 +71,8 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { try { Release release = vfp.parse(fileSub); if ((release.videoType == VideoType.EPISODE) - && (((TvRelease) release).season == tvRelease.season && Utils.containsAll( - ((TvRelease) release).episodeNumbers, tvRelease.episodeNumbers))) { + && (((TvRelease) release).season == tvRelease.season && + new HashSet(((TvRelease) release).episodeNumbers).containsAll(tvRelease.episodeNumbers))) { TvReleaseControl epCtrl = new TvReleaseControl((TvRelease) release, settings, manager, userInteractionHandler); @@ -84,7 +83,7 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { LOGGER.debug("Local Sub found, adding [{}]", fileSub); listFoundSubtitles.add( Subtitle.downloadSource(fileSub) - .subtitleSource(getSubtitleSource()) + .subtitleSource(subtitleSource) .fileName(fileSub.getFileNameAsString()) .language(language) .quality(ReleaseParser.getQualityKeyword(fileSub.getFileNameAsString())) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index 6346214c..52784e61 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -109,7 +109,7 @@ public List getSortedProviderSerieIds(OptionalInt tvdbIdOptiona "getProviderSerieName: [$serieName]") .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) .handleHttpCode(ReturnCode.NOT_FOUND, () -> { - LOGGER.info("API %s - Could not find serie name [%s]".formatted(providerName, serieName)); + LOGGER.info("API $providerName - Could not find serie name [$serieName]"); return List.of(); }) .execute(); @@ -147,7 +147,7 @@ public boolean isSameCode(int code) { } } - public static class ExecuteCall extends AbstractAdapter.ExecuteCall { + private static class ExecuteCall extends AbstractAdapter.ExecuteCall { public ExecuteCall(ThrowingSupplier supplier) { super(supplier); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index b2e3a4bf..a01687e1 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -140,8 +140,8 @@ private Subtitle createSubtitle(SubtitleAttributesFilesInner file, SubtitleAttri .subtitleMatchType(SubtitleMatchType.EVERYTHING) .releaseGroup( ReleaseParser.extractReleaseGroup(file.getFileName(), file.getFileName().endsWith(".srt"))) - .uploader(attributes.getUploader().getName()) - .hearingImpaired(attributes.isHearingImpaired()); + .uploader(attributes.getUploader() != null ? attributes.getUploader().getName() : null) + .hearingImpaired(Boolean.TRUE == attributes.isHearingImpaired()); } @Override @@ -162,6 +162,6 @@ public boolean useSeasonForSerieId() { @Override public String providerSerieIdToDisplayString(OpensubtitleSerieId providerSerieId) { - return "${providerSerieId.name} (${providerSerieId.getYear()})"; + return "${providerSerieId.name} (${providerSerieId.year})"; } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java index 43e35e34..75e23e06 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JPodnapisiAdapter.java @@ -82,8 +82,7 @@ public Set searchSerieSubtitles(TvRelease tvRelease return getProviderSerieId(tvRelease).map( providerSerieId -> tvRelease.episodeNumbers.stream().flatMap(episode -> { try { - return getApi().getSerieSubtitles(providerSerieId, tvRelease.season, episode, language) - .stream(); + return api.getSerieSubtitles(providerSerieId, tvRelease.season, episode, language).stream(); } catch (PodnapisiException e) { LOGGER.error("API %s searchSubtitles for serie [%s] (%s)".formatted(subtitleSource.name, TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode), diff --git a/SubLibrary/src/main/java/extensions/java/io/InputStream/InputStreamExt.java b/SubLibrary/src/main/java/extensions/java/io/InputStream/InputStreamExt.java new file mode 100644 index 00000000..09d754a5 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/java/io/InputStream/InputStreamExt.java @@ -0,0 +1,18 @@ +package extensions.java.io.InputStream; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; + +@UtilityClass +@Extension +public class InputStreamExt { + + public static String asString(@This InputStream inputStream, Charset charset) throws IOException { + return new String(inputStream.readAllBytes(), charset); + } +} diff --git a/SubLibrary/src/main/java/extensions/java/lang/String/StringExt.java b/SubLibrary/src/main/java/extensions/java/lang/String/StringExt.java index 5e479f8c..78e7026d 100644 --- a/SubLibrary/src/main/java/extensions/java/lang/String/StringExt.java +++ b/SubLibrary/src/main/java/extensions/java/lang/String/StringExt.java @@ -1,6 +1,9 @@ package extensions.java.lang.String; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.net.URLEncoder; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import lombok.experimental.UtilityClass; @@ -23,4 +26,8 @@ public static String removeIllegalWindowsChars(@This String text) { public static String urlEncode(@This String text) { return URLEncoder.encode(text, StandardCharsets.UTF_8); } + + public static InputStream toInputStream(@This String text, Charset charset) { + return new ByteArrayInputStream(text.getBytes(charset)); + } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/ConfigProperties.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/ConfigProperties.java index bb3c331a..aa65dbb1 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/ConfigProperties.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/ConfigProperties.java @@ -3,9 +3,12 @@ import java.io.IOException; import java.io.InputStream; +import lombok.Getter; + public final class ConfigProperties { - private static ConfigProperties configProps = null; + @Getter(lazy = true) + private static final ConfigProperties instance = new ConfigProperties(); private final java.util.Properties prop = new java.util.Properties(); private ConfigProperties() { @@ -16,13 +19,6 @@ private ConfigProperties() { } } - public synchronized static ConfigProperties getInstance() { - if (configProps == null) { - configProps = new ConfigProperties(); - } - return configProps; - } - public String getProperty(String key) { return prop.getProperty(key); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java index 430e065d..f27228f0 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java @@ -39,7 +39,6 @@ import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.cache.DiskCache; import org.lodder.subtools.sublibrary.cache.InMemoryCache; -import org.lodder.subtools.sublibrary.util.IOUtils; import org.lodder.subtools.sublibrary.util.http.HttpClient; import org.lodder.subtools.sublibrary.util.http.HttpClientException; import org.lodder.subtools.sublibrary.xml.XMLHelper; @@ -223,7 +222,7 @@ public String get() throws ManagerException { @Override public InputStream getAsInputStream() throws ManagerException { - return IOUtils.toInputStream(get(), StandardCharsets.UTF_8); + return get().toInputStream(StandardCharsets.UTF_8); } @Override diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/OsCheck.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/OsCheck.java index 901a2f16..067f62fa 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/OsCheck.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/OsCheck.java @@ -2,6 +2,8 @@ import java.util.Locale; +import manifold.ext.props.rt.api.val; + /** * helper class to check the operating system this Java VM runs in *

@@ -19,27 +21,19 @@ public enum OSType { WINDOWS, MAC, LINUX, OTHER } - // cached result of OS detection - private static OSType detectedOS; + @val static OSType operatingSystemType = calculatedOsType(); - /** - * detect the operating system from the os.name System property and cache the result - * - * @return the operating system detected - */ - public static OSType getOperatingSystemType() { - if (detectedOS == null) { - String os = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH); - if (os.contains("mac") || os.contains("darwin")) { - detectedOS = OSType.MAC; - } else if (os.contains("win")) { - detectedOS = OSType.WINDOWS; - } else if (os.contains("nux")) { - detectedOS = OSType.LINUX; - } else { - detectedOS = OSType.OTHER; - } + private static OSType calculatedOsType() { + // detect the operating system from the os.name System property + String os = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH); + if (os.contains("mac") || os.contains("darwin")) { + return OSType.MAC; + } else if (os.contains("win")) { + return OSType.WINDOWS; + } else if (os.contains("nux")) { + return OSType.LINUX; + } else { + return OSType.OTHER; } - return detectedOS; } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java index 8d3f8873..44c95fb7 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/control/ReleaseParser.java @@ -39,7 +39,7 @@ public final Release parse(Path file) throws ReleaseParseException { } private Release parsePatternResult(Path file, String fileParseName) throws ReleaseParseException { - List namedGroups = namedMatcher.namedPattern().groupNames(); + List namedGroups = namedMatcher.namedPattern().groupNames; String seriesName = ""; List episodeNumbers = new ArrayList<>(); int seasonNumber = 0; @@ -55,7 +55,8 @@ private Release parsePatternResult(Path file, String fileParseName) throws Relea } else if (namedGroups.contains("partnumber")) { number = namedMatcher.group("partnumber"); } - movieName = cleanUnwantedChars(namedMatcher.group("moviename") + " " + namedMatcher.group("part") + " " + number); + movieName = cleanUnwantedChars( + namedMatcher.group("moviename") + " " + namedMatcher.group("part") + " " + number); } else { movieName = cleanUnwantedChars(namedMatcher.group("moviename")); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java index b86812bf..e1eafb3e 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/model/TvRelease.java @@ -113,8 +113,8 @@ public TvRelease build() { } private TvRelease(Path file, String description, String releaseGroup, String quality, String name, - String originalName, String customName, - String title, int season, List episodeNumbers, boolean special) { + String originalName, String customName, String title, int season, List episodeNumbers, + boolean special) { super(VideoType.EPISODE, file, description, releaseGroup, quality); this.name = name; this.title = title; diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/IOUtils.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/IOUtils.java deleted file mode 100644 index 2c830f31..00000000 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/IOUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.lodder.subtools.sublibrary.util; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class IOUtils { - - public InputStream toInputStream(String text, Charset charset) { - return new ByteArrayInputStream(text.getBytes(charset)); - } - - public String toString(InputStream inputStream, Charset charset) throws IOException { - return new String(inputStream.readAllBytes(), charset); - } -} diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedMatchResult.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedMatchResult.java index 8007e4f9..cad34dc1 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedMatchResult.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedMatchResult.java @@ -3,10 +3,13 @@ import java.util.List; import java.util.Map; import java.util.regex.MatchResult; +import java.util.stream.IntStream; public interface NamedMatchResult extends MatchResult { - List orderedGroups(); + default List orderedGroups() { + return IntStream.rangeClosed(1, groupCount()).sequential().mapToObj(this::group).toList(); + } Map namedGroups(); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedMatcher.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedMatcher.java index ca09809b..273627dc 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedMatcher.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedMatcher.java @@ -1,14 +1,14 @@ package org.lodder.subtools.sublibrary.util; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import java.util.stream.IntStream; +import manifold.ext.rt.api.Self; + public class NamedMatcher implements NamedMatchResult { private Matcher matcher; @@ -24,7 +24,7 @@ public class NamedMatcher implements NamedMatchResult { NamedMatcher(NamedPattern parentPattern, CharSequence input) { this.parentPattern = parentPattern; - this.matcher = parentPattern.pattern().matcher(input); + this.matcher = parentPattern.pattern.matcher(input); } public Pattern standardPattern() { @@ -37,7 +37,7 @@ public NamedPattern namedPattern() { public NamedMatcher usePattern(NamedPattern newPattern) { this.parentPattern = newPattern; - matcher.usePattern(newPattern.pattern()); + matcher.usePattern(newPattern.pattern); return this; } @@ -95,11 +95,6 @@ public int groupCount() { return matcher.groupCount(); } - @Override - public List orderedGroups() { - return IntStream.rangeClosed(1, groupCount()).sequential().mapToObj(this::group).collect(Collectors.toList()); - } - @Override public String group(String groupName) { return group(groupIndex(groupName)); @@ -108,13 +103,11 @@ public String group(String groupName) { @Override public Map namedGroups() { return IntStream.rangeClosed(1, groupCount()).sequential() - .collect(LinkedHashMap::new, - (map, i) -> map.put(parentPattern.groupNames().get(i - 1), i), - Map::putAll); + .collect(LinkedHashMap::new, (map, i) -> map.put(parentPattern.groupNames.get(i - 1), i), Map::putAll); } private int groupIndex(String groupName) { - return parentPattern.groupNames().indexOf(groupName) + 1; + return parentPattern.groupNames.indexOf(groupName) + 1; } @Override @@ -194,7 +187,8 @@ public NamedMatcher useTransparentBounds(boolean b) { return this; } - public boolean equals(Matcher obj) { + @Override + public boolean equals(@Self Object obj) { return matcher.equals(obj); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedPattern.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedPattern.java index c0d89bc7..31e1958d 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedPattern.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/NamedPattern.java @@ -5,13 +5,15 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import manifold.ext.props.rt.api.val; + public class NamedPattern { private static final Pattern NAMED_GROUP_PATTERN = Pattern.compile("\\(\\?<(\\w+)>"); - private final Pattern pattern; - private final String namedPattern; - private final List groupNames; + @val Pattern pattern; + @val String namedPattern; + @val List groupNames; public static NamedPattern compile(String regex) { return new NamedPattern(regex, 0); @@ -35,22 +37,10 @@ public NamedMatcher matcher(CharSequence input) { return new NamedMatcher(this, input); } - Pattern pattern() { - return pattern; - } - public String standardPattern() { return pattern.pattern(); } - public String namedPattern() { - return namedPattern; - } - - public List groupNames() { - return groupNames; - } - public String[] split(CharSequence input, int limit) { return pattern.split(input, limit); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/Utils.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/Utils.java deleted file mode 100755 index 715eefa9..00000000 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/Utils.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.lodder.subtools.sublibrary.util; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class Utils { - - public static boolean containsAll(List listA, List listB) { - Set listAAsSet = new HashSet<>(listA); - - for (Integer integer : listB) { - - if (!listAAsSet.contains(integer)) { - return false; - } - } - return true; - } - -} diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java index 616836ce..413c6048 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/http/HttpClient.java @@ -22,10 +22,10 @@ import java.util.stream.Collectors; import java.util.zip.GZIPInputStream; +import extensions.java.io.InputStream.InputStreamExt; import extensions.java.nio.file.Path.PathExt; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; -import org.lodder.subtools.sublibrary.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,7 +51,7 @@ public String doGet(URL url, String userAgent) throws IOException, HttpClientExc int respCode = ((HttpURLConnection) conn).getResponseCode(); if (respCode == 200) { - String result = IOUtils.toString(conn.getInputStream(), StandardCharsets.UTF_8); + String result = InputStreamExt.asString(conn.getInputStream(), StandardCharsets.UTF_8); ((HttpURLConnection) conn).disconnect(); return result; } @@ -91,7 +91,7 @@ public String doPost(URL url, String userAgent, Map data) throws return doGet(new URI(conn.getHeaderField("Location")).toURL(), userAgent); } - String result = IOUtils.toString(conn.getInputStream(), StandardCharsets.UTF_8); + String result = InputStreamExt.asString(conn.getInputStream(), StandardCharsets.UTF_8); conn.disconnect(); return result; @@ -148,7 +148,7 @@ private InputStream getInputStream(URL url) throws Exception { if (status != HttpURLConnection.HTTP_OK) { if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM - || status == HttpURLConnection.HTTP_SEE_OTHER) { + || status == HttpURLConnection.HTTP_SEE_OTHER) { if (HttpClient.isUrl(conn.getHeaderField("Location"))) { url = new URI(conn.getHeaderField("Location")).toURL(); } else { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderCommon.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderCommon.java index a72e3412..cfbdfaf8 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderCommon.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderCommon.java @@ -17,9 +17,8 @@ private PrompterBuilderCommon() { } protected static Optional prompt(Prompter prompter, Function toObjectMapper, - Predicate validator, - Predicate objValidator, T defaultValue, Supplier defaultValueSupplier, String message, - String errorMessage) { + Predicate validator, Predicate objValidator, T defaultValue, Supplier defaultValueSupplier, + String message, String errorMessage) { try { String value = prompter.prompt(message + System.lineSeparator()); if (StringUtils.isEmpty(value)) { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java index ec848daa..19b0a95a 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java @@ -31,17 +31,17 @@ public class XMLHelper { private static final Logger LOGGER = LoggerFactory.getLogger(HttpClient.class); - private static String XMLCleanup(String text) { + private static String xmlCleanup(String text) { return text.replace("&", "&"); } - private static String HTMLCleanup(String text) { + private static String htmlCleanup(String text) { return StringUtils.unescapeHTML(text); } public static String getStringTagValue(String sTag, Element eElement) { LOGGER.trace("getStringTagValue: sTag [{}]", sTag); - return HTMLCleanup(XMLCleanup(getStringTagRawValue(sTag, eElement))); + return htmlCleanup(xmlCleanup(getStringTagRawValue(sTag, eElement))); } public static String getStringTagRawValue(String sTag, Element eElement) { @@ -58,7 +58,7 @@ public static String getStringTagRawValue(String sTag, Element eElement) { public static String getStringAttributeValue(String sTag, String sAttribute, Element eElement) { LOGGER.trace("getStringAttributeValue: sTag [{}], sAttribute [{}]", sTag, sAttribute); NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); - return XMLCleanup(((Element) nlList).getAttribute(sAttribute)); + return xmlCleanup(((Element) nlList).getAttribute(sAttribute)); } public static int getIntTagValue(String sTag, Element eElement) { @@ -77,7 +77,7 @@ public static boolean getBooleanAttributeValue(String sTag, String sAttribute, E LOGGER.trace("getBooleanAttributeValue: sTag [{}], sAttribute [{}]", sTag, sAttribute); NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); return ((Element) nlList).getAttribute(sAttribute) != null - && Boolean.parseBoolean(((Element) nlList).getAttribute(sAttribute)); + && Boolean.parseBoolean(((Element) nlList).getAttribute(sAttribute)); } public static String cleanBadChars(String string) { From 473f03fdcd314ebd3078afc2660d301254f143a1 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 15 Dec 2024 15:15:53 +0100 Subject: [PATCH 47/54] changes --- .../lib/control/MovieReleaseControl.java | 2 +- .../lodder/subtools/sublibrary/data/ReleaseDBIntf.java | 2 +- .../sublibrary/data/imdb/model/ImdbDetails.java | 10 +++++++++- .../sublibrary/data/omdb/model/OmdbDetails.java | 10 +++------- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java index c2346b42..6929705e 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/MovieReleaseControl.java @@ -46,7 +46,7 @@ public void process() throws ReleaseControlException { movieRelease.getImdbId().mapToObj(omdbAdapter::getMovieDetails).orElseGet(Optional::empty); } movieDetails.ifPresentOrElse(info -> { - movieRelease.year = info.year(); + movieRelease.year = info.year; movieRelease.name = info.name; }, () -> LOGGER.error("Unable to get details from OMDB API, continue with filename info $movieRelease")); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ReleaseDBIntf.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ReleaseDBIntf.java index eaa26510..572c64be 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ReleaseDBIntf.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/ReleaseDBIntf.java @@ -6,5 +6,5 @@ public interface ReleaseDBIntf { @val String name; - int year(); + @val int year; } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/model/ImdbDetails.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/model/ImdbDetails.java index 1ee65a86..4ec6ba9b 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/model/ImdbDetails.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/model/ImdbDetails.java @@ -2,12 +2,20 @@ import java.io.Serializable; +import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; +import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.data.ReleaseDBIntf; -public record ImdbDetails(String title, int year) implements ReleaseDBIntf, Serializable { +@AllArgsConstructor +public class ImdbDetails implements ReleaseDBIntf, Serializable { + + @val String title; + @val @override int year; @Override public String getName() { return title; } } + diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java index 5385f809..e5f6a7f9 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/model/OmdbDetails.java @@ -4,6 +4,7 @@ import java.io.Serializable; import lombok.AllArgsConstructor; +import manifold.ext.props.rt.api.override; import manifold.ext.props.rt.api.val; import org.lodder.subtools.sublibrary.data.ReleaseDBIntf; @@ -11,17 +12,12 @@ public class OmdbDetails implements ReleaseDBIntf, Serializable { @Serial private static final long serialVersionUID = 7701770682134890544L; - + @val String title; - @val int year; + @val @override int year; @Override public String getName() { return title; } - - @Override - public int year() { - return year; - } } From 38069d6ecbfe6f6e39a204dad14d086c339d6fac Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 15 Dec 2024 17:35:34 +0100 Subject: [PATCH 48/54] changes --- .../org/jsoup/nodes/Element/ElementExt.java | 232 ++++++++++++++++++ .../jsoup/nodes/Element/NthElementFinder.java | 38 +++ .../org/jsoup/nodes/Node/NodeExt.java | 119 +++++++++ .../jsoup/select/Elements/ElementsExt.java | 18 ++ .../org/w3c/dom/Document/DocumentExt.java | 29 +++ .../extensions/org/w3c/dom/Node/NodeExt.java | 28 +++ .../{XmlExtension.java => NodeListExt.java} | 7 +- .../lodder/subtools/sublibrary/Manager.java | 21 +- .../sublibrary/data/imdb/ImdbApi.java | 9 +- .../sublibrary/data/imdb/ImdbSearchIdApi.java | 71 ++++-- .../sublibrary/data/omdb/OmdbApi.java | 16 +- .../sublibrary/data/tvdb/TheTvdbMirrors.java | 18 +- .../exception/WebpageException.java | 12 + .../subtools/sublibrary/xml/XMLHelper.java | 12 +- 14 files changed, 565 insertions(+), 65 deletions(-) create mode 100644 SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java create mode 100644 SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/NthElementFinder.java create mode 100644 SubLibrary/src/main/java/extensions/org/jsoup/nodes/Node/NodeExt.java create mode 100644 SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java create mode 100644 SubLibrary/src/main/java/extensions/org/w3c/dom/Document/DocumentExt.java create mode 100644 SubLibrary/src/main/java/extensions/org/w3c/dom/Node/NodeExt.java rename SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/{XmlExtension.java => NodeListExt.java} (55%) create mode 100644 SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/WebpageException.java diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java new file mode 100644 index 00000000..78536390 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java @@ -0,0 +1,232 @@ +package extensions.org.jsoup.nodes.Element; + +import extensions.org.jsoup.nodes.Node.NodeExt; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Jailbreak; +import manifold.ext.rt.api.This; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.jsoup.helper.Validate; +import org.jsoup.nodes.Element; +import org.jsoup.select.Collector; +import org.jsoup.select.Elements; +import org.jsoup.select.Evaluator; +import org.jsoup.select.QueryParser; +import org.lodder.subtools.sublibrary.exception.WebpageException; + +@Extension +public class ElementExt extends NodeExt { + + // --------------- \\ + // Get all Element \\ + // --------------- \\ + + public static @Nullable Elements getAllElementsByClass(@Nullable @This Element element, String className) { + return element == null ? null : element.getElementsByClass(requireNotEmpty(className)); + } + + public static @Nullable Elements getAllElementsByTag(@Nullable @This Element element, String tagName) { + return element == null ? null : element.getElementsByTag(requireNotEmpty(tagName)); + } + + public static @Nullable Elements getAllElementsByAttribute(@Nullable @This Element element, String attribute) { + return element == null ? null : element.getElementsByAttribute(requireNotEmpty(attribute)); + } + + public static @Nullable Elements getAllElementsByCss(@Nullable @This Element element, String cssQuery) { + return element == null ? null : element.getElements(requireNotEmpty(cssQuery)); + } + + public static @Nullable Elements getAllElements(@Nullable @This Element element, Evaluator evaluator) { + return element == null ? null : Collector.collect(evaluator, element); + } + + // ----------------- \\ + // Get First Element \\ + // ----------------- \\ + + public static @Nullable Element getFirstElementByClass(@Nullable @This Element element, String className) { + return element == null ? null : getFirstElement(element, new Evaluator.Class(requireNotEmpty(className))); + } + + public static @Nullable Element getFirstElementByTag(@Nullable @This Element element, String tagName) { + return element == null ? null : getFirstElement(element, new Evaluator.Tag(requireNotEmpty(tagName))); + } + + public static @Nullable Element getFirstElementByAttribute(@Nullable @This Element element, String attribute) { + return element == null ? null : getFirstElement(element, new Evaluator.Attribute(requireNotEmpty(attribute))); + } + + public static @Nullable Element getFirstElementByCss(@Nullable @This Element element, String cssQuery) { + return element == null ? null : getFirstElement(element, QueryParser.parse(requireNotEmpty(cssQuery))); + } + + public static @Nullable Element getFirstElementById(@Nullable @This Element element, String id) { + return element == null ? null : getFirstElement(element, new Evaluator.Id(requireNotEmpty(id))); + } + + public static @Nullable Element getFirstElement(@Nullable @This Element element, Evaluator evaluator) { + return element == null ? null : Collector.findFirst(evaluator, element); + } + + // ---------------- \\ + // Get n-th Element \\ + // ---------------- \\ + + public static @Nullable Element getNthElementByClass(@Nullable @This Element element, String className, int index) { + return element == null ? null : getNthElement(element, new Evaluator.Class(requireNotEmpty(className)), index); + } + + public static @Nullable Element getNthElementByTag(@Nullable @This Element element, String tagName, int index) { + return element == null ? null : getNthElement(element, new Evaluator.Tag(requireNotEmpty(tagName)), index); + } + + public static @Nullable Element getNthElementByAttribute(@Nullable @This Element element, String attribute, + int index) { + return element == null ? null : + getNthElement(element, new Evaluator.Attribute(requireNotEmpty(attribute)), index); + } + + public static @Nullable Element getNthElementByCss(@Nullable @This Element element, String cssQuery, int index) { + return element == null ? null : getNthElement(element, QueryParser.parse(requireNotEmpty(cssQuery)), index); + } + + public static @Nullable Element getNthElement(@Nullable @This Element element, @Jailbreak Evaluator eval, int idx) { + eval.reset(); + return new NthElementFinder(eval).find(element, element, idx); + } + + // ----------------------- \\ + // Get First Element or Throw \\ + // ----------------------- \\ + + public static Element getFirstElementByClassOrThrow(@Nullable @This Element element, String className) + throws WebpageException { + Element n = getFirstElementByClass(element, className); + if (n == null) { + throw new WebpageException("Could not find element with class '%s'".formatted(className)); + } + return n; + } + + public static Element getFirstElementByTagOrThrow(@Nullable @This Element element, String tagName) + throws WebpageException { + Element n = getFirstElementByTag(element, tagName); + if (n == null) { + throw new WebpageException("Could not find element with tag '%s'".formatted(tagName)); + } + return n; + } + + public static Element getFirstElementByAttributeOrThrow(@Nullable @This Element element, String attribute) + throws WebpageException { + Element n = getFirstElementByAttribute(element, attribute); + if (n == null) { + throw new WebpageException("Could not find element with attribute '%s'".formatted(attribute)); + } + return n; + } + + public static Element getFirstElementByCssOrThrow(@Nullable @This Element element, String cssQuery) + throws WebpageException { + Element n = getFirstElementByCss(element, cssQuery); + if (n == null) { + throw new WebpageException("Could not find element with css selector '%s'".formatted(cssQuery)); + } + return n; + } + + public static Element getFirstElementByIdOrThrow(@Nullable @This Element element, String id) + throws WebpageException { + Element n = getFirstElementById(element, id); + if (n == null) { + throw new WebpageException("Could not find element with id '%s'".formatted(id)); + } + return n; + } + + public static Element getFirstElementOrThrow(@Nullable @This Element element, Evaluator evaluator) + throws WebpageException { + Element n = getFirstElement(element, evaluator); + if (n == null) { + throw new WebpageException("Could not find element using selector '%s'".formatted(evaluator)); + } + return n; + } + + // ------------------------- \\ + // Get n-th Element or Throw \\ + // ------------------------- \\ + + public static Element getNthElementByClassOrThrow(@Nullable @This Element element, String className, int index) + throws WebpageException { + Element elem = getNthElementByClass(element, className, index); + if (elem == null) { + throw new WebpageException("Could not find %sth element with class '%s'".formatted(index, className)); + } + return elem; + } + + public static Element getNthElementByTagOrThrow(@Nullable @This Element element, String tagName, int index) + throws WebpageException { + Element elem = getNthElementByTag(element, tagName, index); + if (elem == null) { + throw new WebpageException("Could not find %sth element with tag '%s'".formatted(index, tagName)); + } + return elem; + } + + public static Element getNthElementByAttributeOrThrow(@Nullable @This Element element, String attribute, int index) + throws WebpageException { + Element elem = getNthElementByAttribute(element, attribute, index); + if (elem == null) { + throw new WebpageException("Could not find %sth element with attribute '%s'".formatted(index, attribute)); + } + return elem; + } + + public static Element getNthElementByCssOrThrow(@Nullable @This Element element, String cssQuery, int index) + throws WebpageException { + Element elem = getNthElementByCss(element, cssQuery, index); + if (elem == null) { + throw new WebpageException("Could not find %sth element with css selector '%s'".formatted(index, cssQuery)); + } + return elem; + } + + public static Element getNthElementOrThrow(@Nullable @This Element element, Evaluator eval, int index) + throws WebpageException { + Element elem = getNthElement(element, eval, index); + if (elem == null) { + throw new WebpageException( + "Could not find %sth element using selector '%s'".formatted(index, eval.toString())); + } + return elem; + } + + // ------------ \\ + // Get Elements \\ + // ------------ \\ + + public static Elements getElements(@Nullable @This Element element, String cssQuery) { + return element == null ? new Elements() : element.select(cssQuery); + } + + // ------------ \\ + // Element methods \\ + // ------------ \\ + + + public static String getText(@Nullable @This Element element) { + return element == null ? "" : element.text(); + } + + + // --------------- \\ + // Utility methods \\ + // --------------- \\ + + private static String requireNotEmpty(String value) { + Validate.notEmpty(value); + return value; + } +} diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/NthElementFinder.java b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/NthElementFinder.java new file mode 100644 index 00000000..e690f00a --- /dev/null +++ b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/NthElementFinder.java @@ -0,0 +1,38 @@ +package extensions.org.jsoup.nodes.Element; + +import static org.jsoup.select.NodeFilter.FilterResult.*; + +import lombok.RequiredArgsConstructor; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; +import org.jsoup.select.Evaluator; +import org.jsoup.select.NodeFilter; +import org.jsoup.select.NodeTraversor; + +@RequiredArgsConstructor +class NthElementFinder implements NodeFilter { + private final Evaluator eval; + private Element evalRoot; + private Element match; + private int index; + private int currentIdx; + + @Nullable + Element find(Element root, Element start, int index) { + this.index = index; + this.evalRoot = root; + this.match = null; + NodeTraversor.filter(this, start); + return match; + } + + @Override + public FilterResult head(Node node, int depth) { + if (node instanceof Element el && eval.matches(evalRoot, el) && currentIdx++ == index) { + match = el; + return STOP; + } + return CONTINUE; + } +} \ No newline at end of file diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Node/NodeExt.java b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Node/NodeExt.java new file mode 100644 index 00000000..2b107869 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Node/NodeExt.java @@ -0,0 +1,119 @@ +package extensions.org.jsoup.nodes.Node; + +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import name.falgout.jeffrey.throwing.ThrowingFunction; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.jsoup.nodes.Node; + +@Extension +public class NodeExt { + + // ------------ \\ + // Node methods \\ + // ------------ \\ + + public static @Nullable Node getParent(@Nullable @This Node node) { + return node == null ? null : node.parent(); + } + + public static String getAttr(@Nullable @This Node node, String attr) { + return node == null ? "" : node.attr(attr); + } + + public static T useAttrOrElse(@Nullable @This Node node, String attr, Function mapper, + Supplier supplier) { + return node != null && node.hasAttr(attr) ? mapper.apply(node.attr(attr)) : supplier.get(); + } + + public static @Nullable String getAttrNull(@Nullable @This Node node, String attr) { + return node == null ? null : node.attr(attr); + } + + public static Optional getAttrOptional(@Nullable @This Node node, String attr) { + return node == null ? Optional.empty() : Optional.of(node.attr(attr)); + } + + public static String getAttrOrThrow(@Nullable @This Node node, String attr, + Supplier exceptionSupplier) throws X { + if (node == null) { + throw exceptionSupplier.get(); + } + return node.attr(attr); + } + + // ------------- \\ + // Other methods \\ + // ------------- \\ + + public static @Nullable Node filter(@Nullable @This Node node, Predicate predicate) { + return node != null && predicate.test(node) ? node : null; + } + + public static boolean matches(@Nullable @This Node node, Predicate predicate) { + return node != null && predicate.test(node); + } + + public static <@Nullable T> @Nullable T map(@Nullable @This Node node, Function mapper) { + return node != null ? mapper.apply(node) : null; + } + + public static Optional mapOptional(@Nullable @This Node node, Function mapper) { + return node != null ? Optional.ofNullable(mapper.apply(node)) : Optional.empty(); + } + + public static T mapOrElse(@Nullable @This Node node, Function mapper, T obj) { + return node != null ? mapper.apply(node) : obj; + } + + public static T mapOrElseGet(@Nullable @This Node node, Function mapper, + Supplier elseSupplier) { + return node != null ? mapper.apply(node) : elseSupplier.get(); + } + + public static <@Nullable T, X extends Exception> @Nullable T mapThrowing(@Nullable @This Node node, + ThrowingFunction mapper) + throws X { + return node != null ? mapper.apply(node) : null; + } + + public static Node orElseGet(@Nullable @This Node node, Supplier elementSupplier) { + return node != null ? node : elementSupplier.get(); + } + + public static Node orElseThrow(@Nullable @This Node node, + Supplier exceptionSupplier) throws X { + if (node == null) { + throw exceptionSupplier.get(); + } + return node; + } + + public static void ifPresent(@Nullable @This Node node, Consumer consumer) { + if (node != null) { + consumer.accept(node); + } + } + + public static boolean isFound(@Nullable @This Node node) { + return node != null; + } + + public static boolean isNotNull(@Nullable @This Node node) { + return node != null; + } + + public static boolean isNotFound(@Nullable @This Node node) { + return node == null; + } + + public static boolean isNull(@Nullable @This Node node) { + return node == null; + } +} diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java new file mode 100644 index 00000000..29200dc8 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java @@ -0,0 +1,18 @@ +package extensions.org.jsoup.select.Elements; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import name.falgout.jeffrey.throwing.stream.ThrowingStream; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +@Extension +@UtilityClass +public class ElementsExt { + + public static ThrowingStream throwingStream(@This Elements elements, + Class exceptionType) { + return ThrowingStream.of(elements.stream(), exceptionType); + } +} diff --git a/SubLibrary/src/main/java/extensions/org/w3c/dom/Document/DocumentExt.java b/SubLibrary/src/main/java/extensions/org/w3c/dom/Document/DocumentExt.java new file mode 100644 index 00000000..9ca2e80d --- /dev/null +++ b/SubLibrary/src/main/java/extensions/org/w3c/dom/Document/DocumentExt.java @@ -0,0 +1,29 @@ +package extensions.org.w3c.dom.Document; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.jsoup.helper.Validate; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; + +@Extension +public class DocumentExt { + + // ----------------- \\ + // Get First Element \\ + // ----------------- \\ + + public static @Nullable NodeList getAllElementsByTag(@Nullable @This Document document, String tagName) { + return document == null ? null : document.getElementsByTagName(requireNotEmpty(tagName)); + } + + // --------------- \\ + // Utility methods \\ + // --------------- \\ + + private static String requireNotEmpty(String value) { + Validate.notEmpty(value); + return value; + } +} diff --git a/SubLibrary/src/main/java/extensions/org/w3c/dom/Node/NodeExt.java b/SubLibrary/src/main/java/extensions/org/w3c/dom/Node/NodeExt.java new file mode 100644 index 00000000..811f6a1b --- /dev/null +++ b/SubLibrary/src/main/java/extensions/org/w3c/dom/Node/NodeExt.java @@ -0,0 +1,28 @@ +package extensions.org.w3c.dom.Node; + +import lombok.experimental.UtilityClass; +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import org.jspecify.annotations.Nullable; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + +@UtilityClass +@Extension +public class NodeExt { + + public static @Nullable String getAttribute(@This @Nullable Node node, String attribute) { + if (node == null) { + return null; + } + NamedNodeMap attributes = node.getAttributes(); + if (attributes == null) { + return null; + } + Node attributeNode = attributes.getNamedItem(attribute); + if (attributeNode == null) { + return null; + } + return attributeNode.getNodeValue(); + } +} diff --git a/SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/XmlExtension.java b/SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/NodeListExt.java similarity index 55% rename from SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/XmlExtension.java rename to SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/NodeListExt.java index 831e093f..1eb95c01 100644 --- a/SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/XmlExtension.java +++ b/SubLibrary/src/main/java/extensions/org/w3c/dom/NodeList/NodeListExt.java @@ -6,14 +6,15 @@ import lombok.experimental.UtilityClass; import manifold.ext.rt.api.Extension; import manifold.ext.rt.api.This; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @UtilityClass @Extension -public class XmlExtension { +public class NodeListExt { - public static Stream stream(@This NodeList nodeList) { - return IntStream.range(0, nodeList.getLength()).mapToObj(nodeList::item); + public static Stream stream(@This @Nullable NodeList nodeList) { + return nodeList == null ? null : IntStream.range(0, nodeList.getLength()).mapToObj(nodeList::item); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java index f27228f0..808da725 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java @@ -35,6 +35,7 @@ import org.json.JSONException; import org.json.JSONObject; import org.jsoup.Jsoup; +import org.jspecify.annotations.Nullable; import org.lodder.subtools.sublibrary.cache.Cache; import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.cache.DiskCache; @@ -168,14 +169,18 @@ public interface PageContentBuilderGetIntf { InputStream getAsInputStream() throws ManagerException; - Optional getAsDocument() throws ParserConfigurationException, ManagerException; + @Nullable + Document getAsDocument() throws ParserConfigurationException, ManagerException; - Optional getAsDocument(Predicate emptyResultPredicate) + @Nullable + Document getAsDocument(Predicate emptyResultPredicate) throws ParserConfigurationException, ManagerException; + // @Nullable org.jsoup.nodes.Document getAsJsoupDocument() throws ManagerException; - Optional getAsJsoupDocument(Predicate emptyResultPredicate) + // @Nullable + org.jsoup.nodes.Document getAsJsoupDocument(Predicate emptyResultPredicate) throws ManagerException; JSONObject getAsJsonObject() throws ManagerException; @@ -226,16 +231,16 @@ public InputStream getAsInputStream() throws ManagerException { } @Override - public Optional getAsDocument() throws ParserConfigurationException, ManagerException { + public Document getAsDocument() throws ParserConfigurationException, ManagerException { return XMLHelper.getDocument(get()); } @Override - public Optional getAsDocument(Predicate emptyResultPredicate) + public Document getAsDocument(Predicate emptyResultPredicate) throws ParserConfigurationException, ManagerException { String html = get(); return StringUtils.isBlank(html) || (emptyResultPredicate != null && emptyResultPredicate.test(html)) ? - Optional.empty() : XMLHelper.getDocument(html); + null : XMLHelper.getDocument(html); } @Override @@ -244,11 +249,11 @@ public org.jsoup.nodes.Document getAsJsoupDocument() throws ManagerException { } @Override - public Optional getAsJsoupDocument(Predicate emptyResultPredicate) + public org.jsoup.nodes.Document getAsJsoupDocument(Predicate emptyResultPredicate) throws ManagerException { String html = get(); return StringUtils.isBlank(html) || (emptyResultPredicate != null && emptyResultPredicate.test(html)) ? - Optional.empty() : Optional.of(Jsoup.parse(html)); + null : Jsoup.parse(html); } @Override diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java index 386b2c9a..dc281207 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java @@ -18,17 +18,18 @@ public Optional getMovieDetails(int imdbId) throws ImdbException { .memoryCache() .key("IMDB-moviedetails-$imdbId") .optionalSupplier(() -> { - final String url = "$DOMAIN/title/tt${String.format(\"%07d\", imdbId)}/releaseinfo"; + final String url = "$DOMAIN/title/tt${%07d/releaseinfo".formatted(imdbId); try { org.jsoup.nodes.Element element = manager.getPageContentBuilder() .url(url) .getAsJsoupDocument() .selectFirst(".article .subpage_title_block .subpage_title_block__right-column"); - String imdbName = element.selectFirst("a[itemprop='url']").text(); - int year = Integer.parseInt(element.selectFirst("span.nobr").text().replaceAll("[^0-9]", "")); + String imdbName = element.getFirstElementByCss("a[itemprop='url']").getText(); + int year = Integer.parseInt( + element.getFirstElementByCss("span.nobr").getText().replaceAll("[^0-9]", "")); return Optional.of(new ImdbDetails(imdbName, year)); } catch (Exception e) { - throw new ImdbException("Error IMDBAPI", url, e); + throw new ImdbException("Error IMDB API", url, e); } }).getOptional(); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java index 53bb0e9d..8d7a4762 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java @@ -3,14 +3,15 @@ import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.Objects; +import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; +import java.util.stream.Collector; +import org.apache.commons.lang3.StringUtils; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.lodder.subtools.sublibrary.Manager; @@ -19,14 +20,13 @@ record ImdbSearchIdApi(Manager manager) { - private static final Pattern IMDB_URL_ID_PATTERN = Pattern.compile("/title/tt([0-9]*)"); + private static final Pattern IMDB_URL_ID_PATTERN = Pattern.compile("/title/tt(\\d*)"); public Set getImdbIdOnImdb(String title, Integer year) throws ImdbSearchIdException { return manager.valueBuilder() .memoryCache() .key("IMDB-imdbid-imdb-$title-$year") .collectionSupplier(ProviderSerieId.class, () -> { - StringBuilder sb = new StringBuilder("https://www.imdb.com/find?q="); sb.append(URLEncoder.encode(title, StandardCharsets.UTF_8)); if (year != null) { @@ -38,12 +38,14 @@ public Set getImdbIdOnImdb(String title, Integer year) throws I .url(url) .getAsJsoupDocument() .select("#main .findList .findResult .result_text"); - return getImdbIdCommon(searchResults, title, year, e -> e.selectFirst("a").text() + " " + e.text(), - e -> e.selectFirst("a").attr("href")); + return getImdbIdCommon(searchResults, + e -> e.getFirstElementByTag("a").getText() + " " + e.getText(), + e -> e.selectFirst("a").getAttr("href")); } catch (Exception e) { throw new ImdbSearchIdException("Error getImdbIdOnImdb", url, e); } - }).getCollection(); + }) + .getCollection(); } public Set getImdbIdOnYahoo(String title, Integer year) throws ImdbSearchIdException { @@ -51,7 +53,8 @@ public Set getImdbIdOnYahoo(String title, Integer year) throws .memoryCache() .key("IMDB-imdbid-yahoo-$title-$year") .collectionSupplier(ProviderSerieId.class, () -> { - StringBuilder sb = new StringBuilder("http://search.yahoo.com/search;_ylt=A1f4cfvx9C1I1qQAACVjAQx.?p="); + StringBuilder sb = + new StringBuilder("http://search.yahoo.com/search;_ylt=A1f4cfvx9C1I1qQAACVjAQx.?p="); sb.append(URLEncoder.encode(title, StandardCharsets.UTF_8)); if (year != null) { sb.append("+%28").append(year).append("%29"); @@ -65,14 +68,17 @@ public Set getImdbIdOnYahoo(String title, Integer year) throws .url(url) .getAsJsoupDocument() .select("a[href~='https%3a%2f%2fwww.imdb.com%2ftitle%2ftt']"); - Function toStringMapper = - e -> Optional.ofNullable(e.selectFirst("h3")).map(e2 -> e2.text().replace(" - IMDb", "")).orElse(null); - Function toHrefMapper = e -> URLDecoder.decode(e.attr("href"), StandardCharsets.UTF_8); - return getImdbIdCommon(searchResults, title, year, toStringMapper, toHrefMapper); + Function toStringMapper = e -> Optional.ofNullable(e.selectFirst("h3")) + .map(e2 -> e2.text().replace(" - IMDb", "")) + .orElse(null); + Function toHrefMapper = + e -> URLDecoder.decode(e.attr("href"), StandardCharsets.UTF_8); + return getImdbIdCommon(searchResults, toStringMapper, toHrefMapper); } catch (Exception e) { throw new ImdbSearchIdException("Error getImdbIdOnYahoo", url, e); } - }).getCollection(); + }) + .getCollection(); } @@ -94,25 +100,36 @@ public Set getImdbIdOnGoogle(String title, Integer year) throws .getAsJsoupDocument() .select("a[href*='https://www.imdb.com/title/tt']"); Function toStringMapper = - e -> Optional.ofNullable(e.selectFirst("span")).map(e2 -> e2.text().replace(" - IMDb", "")).orElse(null); - Function toHrefMapper = e -> e.attr("href"); - return getImdbIdCommon(searchResults, title, year, toStringMapper, toHrefMapper); + e -> e.getFirstElementByTag("span").getText().replace(" - IMDb", ""); + Function toHrefMapper = e -> e.getAttr("href"); + return getImdbIdCommon(searchResults, toStringMapper, toHrefMapper); } catch (Exception e) { throw new ImdbSearchIdException("Error getImdbIdOnGoogle", url, e); } - }).getCollection(); + }) + .getCollection(); } - private Set getImdbIdCommon(Elements searchResults, String title, int year, Function toStringMapper, + private Set getImdbIdCommon(Elements searchResults, Function toStringMapper, Function toHrefMapper) { - return searchResults.stream().map(element -> { - String name = toStringMapper.apply(element); - if (name == null) { - return null; - } - String href = toHrefMapper.apply(element); - Matcher matcher = IMDB_URL_ID_PATTERN.matcher(href); - return matcher.find() ? new ProviderSerieId(name, matcher.group().replace("/title/tt", "")) : null; - }).filter(Objects::nonNull).collect(Collectors.toSet()); + if (searchResults == null) { + return Set.of(); + } + return searchResults.stream().collect(Collector.of( + HashSet::new, + (set, element) -> { + String name = toStringMapper.apply(element); + if (StringUtils.isBlank(name)) { + return; + } + String href = toHrefMapper.apply(element); + Matcher matcher = IMDB_URL_ID_PATTERN.matcher(href); + if (matcher.find()) { + set.add(new ProviderSerieId(name, matcher.group().replace("/title/tt", ""))); + } + }, (set1, set2) -> { + set1.addAll(set2); + return set1; + })); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java index 759e7001..1dd3def7 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java @@ -6,11 +6,12 @@ import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.omdb.exception.OmdbException; import org.lodder.subtools.sublibrary.data.omdb.model.OmdbDetails; -import org.w3c.dom.Element; +import org.w3c.dom.Node; @RequiredArgsConstructor class OmdbApi { + private static final String DOMAIN = "http://www.omdbapi.com"; private final Manager manager; public Optional getMovieDetails(int imdbId) throws OmdbException { @@ -18,22 +19,21 @@ public Optional getMovieDetails(int imdbId) throws OmdbException { .memoryCache() .key("OMDB-moviedetails-$imdbId") .optionalSupplier(() -> { - final String url = "http://www.omdbapi.com/?i=tt${String.format(\"%07d\", imdbId)}&plot=short&r=xml"; + final String url = "$DOMAIN/?i=tt$%07d&plot=short&r=xml".formatted(imdbId); try { return manager.getPageContentBuilder() .url(url) .getAsDocument() - .map(doc -> doc.getElementsByTagName("movie")) - .filter(nodeList -> nodeList.getLength() > 0) - .map(nodeList -> parseOMDBDetails((Element) nodeList.item(0))); + .getAllElementsByTag("movie").stream() + .map(this::parseOMDBDetails).findFirst(); } catch (Exception e) { - throw new OmdbException("Error OMDBAPI", url, e); + throw new OmdbException("Error OMDB API", url, e); } }).getOptional(); } - private OmdbDetails parseOMDBDetails(Element item) { - return new OmdbDetails(item.getAttribute("title"), Integer.parseInt(item.getAttribute("year"))); + private OmdbDetails parseOMDBDetails(Node node) { + return new OmdbDetails(node.getAttribute("title"), Integer.parseInt(node.getAttribute("year"))); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java index 24276386..606b539d 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java @@ -35,15 +35,15 @@ public TheTvdbMirrors(String apikey, Manager manager) throws ManagerException, P synchronized (this) { manager.getPageContentBuilder() .url("http://www.thetvdb.com/api/" + apikey + "/mirrors.xml") - .getAsDocument().ifPresent(doc -> - doc.getElementsByTagName("Mirror").stream() - .filter(nMirror -> nMirror.getNodeType() == Node.ELEMENT_NODE) - .map(Element.class::cast) - .forEach(eMirror -> { - String url = XMLHelper.getStringTagValue("mirrorpath", eMirror); - int typeMask = XMLHelper.getIntTagValue("typemask", eMirror); - addMirror(typeMask, url); - })); + .getAsDocument() + .getAllElementsByTag("Mirror").stream() + .filter(nMirror -> nMirror.getNodeType() == Node.ELEMENT_NODE) + .map(Element.class::cast) + .forEach(eMirror -> { + String url = XMLHelper.getStringTagValue("mirrorpath", eMirror); + int typeMask = XMLHelper.getIntTagValue("typemask", eMirror); + addMirror(typeMask, url); + }); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/WebpageException.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/WebpageException.java new file mode 100644 index 00000000..a7b9adbd --- /dev/null +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/exception/WebpageException.java @@ -0,0 +1,12 @@ +package org.lodder.subtools.sublibrary.exception; + +import java.io.IOException; +import java.io.Serial; + +import lombok.experimental.StandardException; + +@StandardException +public class WebpageException extends IOException { + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java index 19b0a95a..81f07071 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java @@ -16,8 +16,8 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Optional; +import org.jspecify.annotations.Nullable; import org.lodder.subtools.sublibrary.util.http.HttpClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -123,23 +123,23 @@ public static String getXMLAsString(Element eElement) throws Exception { return result.getWriter().toString(); } - public static Optional getDocument(String string) throws ParserConfigurationException { + public static @Nullable Document getDocument(String string) throws ParserConfigurationException { try { return getDocument(new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8))); } catch (IOException e) { // should not happen - return Optional.empty(); + return null; } } - public static Optional getDocument(InputStream inputStream) throws ParserConfigurationException, + public static @Nullable Document getDocument(InputStream inputStream) throws ParserConfigurationException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // Use the factory to create a builder DocumentBuilder builder; builder = factory.newDocumentBuilder(); try { - return Optional.of(builder.parse(inputStream)); + return builder.parse(inputStream); } catch (SAXException e) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("getDocument: Not a valid XML document, setting a blank document!"); @@ -147,6 +147,6 @@ public static Optional getDocument(InputStream inputStream) throws Par LOGGER.debug("Not a valid XML document, setting a blank document!"); } } - return Optional.empty(); + return null; } } From 69fd8f42a4c08409a4304c7a7fd8c849fe54bf5e Mon Sep 17 00:00:00 2001 From: EotT123 Date: Sun, 15 Dec 2024 22:09:44 +0100 Subject: [PATCH 49/54] changes --- .../UpdateAvailableGithub.java | 37 +++--- .../subtitleproviders/Local.java | 2 +- .../adapters/JAddic7edViaProxyAdapter.java | 5 +- .../adapters/JOpenSubAdapter.java | 3 +- .../addic7ed/JAddic7edApi.java | 80 +++++------- .../gestdown/JAddic7edProxyGestdownApi.java | 8 +- .../podnapisi/JPodnapisiApi.java | 23 ++-- .../subscene/SubsceneApi.java | 61 +++++---- .../tvsubtitles/JTVSubtitlesApi.java | 95 +++++++------- .../org/jsoup/nodes/Element/ElementExt.java | 122 +++++++++-------- .../jsoup/select/Elements/ElementsExt.java | 31 ++++- .../select/Elements/UnmodifiableElements.java | 123 ++++++++++++++++++ .../org/w3c/dom/Document/DocumentExt.java | 2 +- .../lodder/subtools/sublibrary/Manager.java | 16 +-- .../sublibrary/data/imdb/ImdbApi.java | 6 +- .../sublibrary/data/imdb/ImdbSearchIdApi.java | 22 +--- .../sublibrary/data/omdb/OmdbApi.java | 2 +- .../sublibrary/data/tvdb/TheTvdbMirrors.java | 6 +- .../subtools/sublibrary/xml/XMLHelper.java | 26 +--- SubLibrary/src/main/java/util/Utils.java | 46 +++++++ 20 files changed, 443 insertions(+), 273 deletions(-) create mode 100644 SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/UnmodifiableElements.java create mode 100644 SubLibrary/src/main/java/util/Utils.java diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java index d0f4aaf5..ab3a0449 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/UpdateAvailableGithub.java @@ -75,10 +75,9 @@ private Optional getUrlLatestNewStableGithubRelease() { .userAgent(null) .cacheType(CacheType.NONE) .getAsJsoupDocument() - .selectFirst( - "#repo-content-turbo-frame .box a[href='" + REPO_URI + "/releases/latest']"); - Pattern versionPattern = Pattern.compile("[0-9]*\\.[0-9]\\.[0-9]"); - String versionText = element.parent().selectFirst("a").text(); + .selectFirstByCss("#repo-content-turbo-frame .box a[href='$REPO_URI/releases/latest']"); + Pattern versionPattern = Pattern.compile("\\d*\\.\\d\\.\\d"); + String versionText = element.getParent().selectFirstByCss("a").getText(); Matcher matcher = versionPattern.matcher(versionText); matcher.find(); String version = matcher.group(); @@ -90,12 +89,16 @@ private Optional getUrlLatestNewStableGithubRelease() { .userAgent(null) .cacheType(CacheType.NONE) .getAsJsoupDocument() - .selectFirst(".Box-row a[href$='.jar']"); - String url = DOMAIN + artifactElement.attr("href"); + .selectFirstByCss(".Box-row a[href$='.jar']"); + String url = DOMAIN + artifactElement.getAttr("href"); updateLastUpdateCheck(); return Optional.of(url); } catch (Exception e) { - LOGGER.error(Messages.getText("LoggingPanel.UpdateCheckFailed")); + if (LOGGER.isTraceEnabled) { + LOGGER.trace(Messages.getText("LoggingPanel.UpdateCheckFailed"), e); + } else { + LOGGER.error(Messages.getText("LoggingPanel.UpdateCheckFailed")); + } return Optional.empty(); } }).getOptional(); @@ -114,24 +117,28 @@ private Optional getUrlLatestNewNightlyGithubRelease() { .userAgent(null) .cacheType(CacheType.MEMORY) .getAsJsoupDocument() - .selectFirst("#partial-actions-workflow-runs .Box-row"); - LocalDateTime nightlyBuildTista = - zonedDateTimeStringToLocalDateTime( - rowElement.selectFirst(".d-inline relative-time").attr("datetime")); + .selectFirstByCss("#partial-actions-workflow-runs .Box-row"); + LocalDateTime nightlyBuildTista = zonedDateTimeStringToLocalDateTime( + rowElement.selectFirstByCss(".d-inline relative-time").getAttr("datetime")); if (nightlyBuildTista.isBefore(buildTista)) { return Optional.empty(); } - String url = "https://nightly.link" + rowElement.selectFirst(".Link--primary").attr("href"); + String url = + "https://nightly.link" + rowElement.selectFirstByCss(".Link--primary").getAttr("href"); String downloadUrl = manager.getPageContentBuilder() .url(url) .cacheType(CacheType.MEMORY) .getAsJsoupDocument() - .selectFirst("table td a") - .attr("href"); + .selectFirstByCss("table td a") + .getAttr("href"); updateLastUpdateCheck(); return Optional.of(downloadUrl); } catch (Exception e) { - LOGGER.error(Messages.getText("LoggingPanel.UpdateCheckFailed")); + if (LOGGER.isTraceEnabled) { + LOGGER.trace(Messages.getText("LoggingPanel.UpdateCheckFailed"), e); + } else { + LOGGER.error(Messages.getText("LoggingPanel.UpdateCheckFailed")); + } return Optional.empty(); } }).getOptional(); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index 3ddb7249..05e3594c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -72,7 +72,7 @@ public Set searchSubtitles(TvRelease tvRelease, Language language) { Release release = vfp.parse(fileSub); if ((release.videoType == VideoType.EPISODE) && (((TvRelease) release).season == tvRelease.season && - new HashSet(((TvRelease) release).episodeNumbers).containsAll(tvRelease.episodeNumbers))) { + new HashSet<>(((TvRelease) release).episodeNumbers).containsAll(tvRelease.episodeNumbers))) { TvReleaseControl epCtrl = new TvReleaseControl((TvRelease) release, settings, manager, userInteractionHandler); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java index 52784e61..6ef924a1 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JAddic7edViaProxyAdapter.java @@ -75,8 +75,9 @@ public Set searchSerieSubtitles(TvRelease tvRelease, Language language return getProviderSerieId(tvRelease).map( providerSerieId -> tvRelease.episodeNumbers.stream().flatMap(episode -> { try { - return new ExecuteCall<>(() -> getApi().getSubtitles(providerSerieId, tvRelease.season, episode, - language)).message("getSubtitles: [%s]".formatted( + return new ExecuteCall<>( + () -> getApi().getSubtitles(providerSerieId, tvRelease.season, episode, language)) + .message("getSubtitles: [%s]".formatted( TvRelease.formatName(providerSerieId.providerName, tvRelease.season, episode))) .retryWhenHttpCode(ReturnCode.REFRESHING) .retryWhenHttpCode(ReturnCode.RATE_LIMIT_REACHED) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java index a01687e1..c8043b7f 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/adapters/JOpenSubAdapter.java @@ -138,8 +138,7 @@ private Subtitle createSubtitle(SubtitleAttributesFilesInner file, SubtitleAttri .language(Language.fromIdOptional(attributes.getLanguage()).orElse(null)) .quality(ReleaseParser.getQualityKeyword(file.getFileName())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) - .releaseGroup( - ReleaseParser.extractReleaseGroup(file.getFileName(), file.getFileName().endsWith(".srt"))) + .releaseGroup(ReleaseParser.extractReleaseGroup(file.fileName, file.fileName.endsWith(".srt"))) .uploader(attributes.getUploader() != null ? attributes.getUploader().getName() : null) .hearingImpaired(Boolean.TRUE == attributes.isHearingImpaired()); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java index d97079ad..93790ca9 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/JAddic7edApi.java @@ -7,9 +7,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.concurrent.TimeUnit; -import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -36,8 +34,8 @@ public class JAddic7edApi extends Html implements SubtitleApi { private static final long RATEDURATION = 1; // seconds private static final String DOMAIN = "https://www.addic7ed.com"; - private static final Pattern TITLE_PATTERN = Pattern.compile(".*? - [0-9]+x[0-9]+ - (.*)"); - private static final Pattern VERSION_PATTERN = Pattern.compile("Version (.+), Duration: ([0-9]+).([0-9])+"); + private static final Pattern TITLE_PATTERN = Pattern.compile(".*? - \\d+x\\d+ - (.*)"); + private static final Pattern VERSION_PATTERN = Pattern.compile("Version (.+), Duration: (\\d+).(\\d)+"); private final boolean speedy; private LocalDateTime lastRequest = LocalDateTime.now(); @val @override SubtitleSource subtitleSource = SubtitleSource.ADDIC7ED; @@ -71,12 +69,11 @@ public List getProviderId(String serieName) throws Addic7edExce return List.of(); } try { - List providerSerieIds = getContent(DOMAIN + "/allshows/" + serieName.split(" ")[0]) - .map(doc -> doc.select("table.tabel90 td a") + List providerSerieIds = + getContent("$DOMAIN/allshows/" + serieName.split(" ")[0]).selectAllByCss("table.tabel90 td a") .stream() - .map(element -> new ProviderSerieId(element.text(), element.attr("href").split("/")[2])) - .toList()) - .orElseGet(List::of); + .map(elem -> new ProviderSerieId(elem.text(), elem.attr("href").split("/")[2])) + .toList(); String serieNameFormatted = serieName.replaceAll("[^A-Za-z]", ""); List providerSerieIdsFormatted = providerSerieIds.stream().filter(providerId -> { @@ -102,30 +99,21 @@ public List getProviderId(String serieName) throws Addic7edExce // .orElseGet(List::of)); public List getSubtitles(SerieMapping addic7edSerieMapping, int season, int episode, - Language language) - throws Addic7edException { + Language language) throws Addic7edException { return manager.valueBuilder() .memoryCache() - .key("%s-subtitles-%s-%s-%s-%s".formatted(subtitleSource.name(), - addic7edSerieMapping.providerId, season, episode, - language)) + .key("%s-subtitles-%s-%s-%s-%s".formatted(subtitleSource.name(), addic7edSerieMapping.providerId, + season, episode, language)) .collectionSupplier(Addic7edSubtitleDescriptor.class, () -> { List languageIds = LanguageId.forLanguage(language); - String url = "%s/serie/%s/%s/%s/%s".formatted( - DOMAIN, - URLEncoder.encode(addic7edSerieMapping.providerName.replace(" ", "_"), UTF_8), - season, - episode, - languageIds.size() == 1 ? languageIds.first.id : LanguageId.ALL.id); - - Optional doc = getContent(url); - if (doc.isEmpty()) { - return List.of(); - } + String url = "%s/serie/%s/%s/%s/%s".formatted(DOMAIN, + URLEncoder.encode(addic7edSerieMapping.providerName.replace(" ", "_"), UTF_8), season, + episode, languageIds.size() == 1 ? languageIds.first.id : LanguageId.ALL.id); + Document doc = getContent(url); String title = null; - Elements elTitle = doc.get().getElementsByClass("titulo"); + Elements elTitle = doc.getElementsByClass("titulo"); if (elTitle.size() == 1) { Matcher matcher = TITLE_PATTERN.matcher(elTitle.first.html()); if (matcher.matches()) { @@ -133,17 +121,16 @@ public List getSubtitles(SerieMapping addic7edSerieM } } - String uploader, version, lang, download; - boolean hearingImpaired; - Elements blocks = doc.get().select(".tabel95[width='100%']"); + + Elements blocks = doc.select(".tabel95[width='100%']"); List lSubtitles = new ArrayList<>(); for (Element block : blocks) { - uploader = ""; - version = null; - lang = null; - download = null; - hearingImpaired = false; + String uploader = ""; + String version = null; + String lang = null; + String download = null; + boolean hearingImpaired = false; Elements classesNewsTitle = block.getElementsByClass("NewsTitle"); Elements classesNewsDate = block.getElementsByClass("newsDate").select("td[colspan=3]"); @@ -153,7 +140,7 @@ public List getSubtitles(SerieMapping addic7edSerieM break; } else { version = m.group(1).trim(); - uploader = block.selectFirst("a[href*=user/]").text(); + uploader = block.selectFirst("a[href*=user/]").getText(); hearingImpaired = !block.select("img[title~=Hearing]").isEmpty(); } } @@ -167,8 +154,8 @@ public List getSubtitles(SerieMapping addic7edSerieM } // incomplete not wanted - if ((lang != null && td.toString().toLowerCase().contains("completed")) - && td.html().toLowerCase().contains("% completed")) { + if ((lang != null && td.toString().toLowerCase().contains("completed")) && + td.html().toLowerCase().contains("% completed")) { lang = null; } @@ -183,8 +170,7 @@ public List getSubtitles(SerieMapping addic7edSerieM } if (lang != null && download != null && title != null) { Addic7edSubtitleDescriptor sub = - new Addic7edSubtitleDescriptor() - .setUploader(uploader) + new Addic7edSubtitleDescriptor().setUploader(uploader) .setTitle(title.trim()) .setVersion(version.trim()) .setUrl(download) @@ -200,21 +186,17 @@ public List getSubtitles(SerieMapping addic7edSerieM } } return lSubtitles; - }).getCollection(); + }) + .getCollection(); } public boolean isDuplicate(List lSubtitles, Addic7edSubtitleDescriptor sub) { return lSubtitles.stream() - .anyMatch(s -> s.getLanguage() == sub.getLanguage() - && StringUtils.equals(s.getUrl(), sub.getUrl()) - && StringUtils.equals(s.getVersion(), sub.getVersion())); - } - - private Optional getContent(String url) throws Addic7edException { - return getContent(url, null); + .anyMatch(s -> s.getLanguage() == sub.getLanguage() && StringUtils.equals(s.getUrl(), sub.getUrl()) && + StringUtils.equals(s.getVersion(), sub.getVersion())); } - private Optional getContent(String url, Predicate emptyResultPredicate) throws Addic7edException { + private Document getContent(String url) throws Addic7edException { try { if (!speedy && !manager.valueBuilder().cacheType(CacheType.MEMORY).key(url).isPresent()) { // if (ChronoUnit.SECONDS.between(lastRequest, LocalDateTime.now()) < RATEDURATION) { @@ -231,7 +213,7 @@ private Optional getContent(String url, Predicate emptyResultP } lastRequest = LocalDateTime.now(); } - return this.getHtml(url).cacheType(CacheType.NONE).getAsJsoupDocument(emptyResultPredicate); + return this.getHtml(url).cacheType(CacheType.NONE).getAsJsoupDocument(); } catch (Exception e) { throw new Addic7edException(e); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java index 8fb6626e..f22c136b 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/addic7ed/proxy/gestdown/JAddic7edProxyGestdownApi.java @@ -72,11 +72,9 @@ public Set getSubtitles(SerieMapping providerSerieId, int season, int private Subtitle mapToSubtitle(SubtitleDto sub, EpisodeDto episodedto, Language language) { return Subtitle.downloadSource(getDownloadUrl(sub.getDownloadUri())) - .subtitleSource(getSubtitleSource()) - .fileName(StringExt - .removeIllegalFilenameChars( - "%s - %s - %s".formatted(episodedto.getShow(), episodedto.getTitle(), - sub.getVersion()))) + .subtitleSource(subtitleSource) + .fileName(StringExt.removeIllegalFilenameChars( + "${episodedto.show} - ${episodedto.title} - ${sub.version}")) .language(language) .quality(ReleaseParser.getQualityKeyword(episodedto.getTitle() + " " + sub.getVersion())) .subtitleMatchType(SubtitleMatchType.EVERYTHING) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java index 1354aa52..b27fc8b6 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/podnapisi/JPodnapisiApi.java @@ -17,6 +17,7 @@ import manifold.ext.props.rt.api.val; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import org.jspecify.annotations.Nullable; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleApi; import org.lodder.subtools.multisubdownloader.subtitleproviders.podnapisi.exception.PodnapisiException; import org.lodder.subtools.multisubdownloader.subtitleproviders.podnapisi.model.PodnapisiSubtitleDescriptor; @@ -39,7 +40,7 @@ public class JPodnapisiApi implements SubtitleApi { public Optional getPodnapisiShowName(String showName) throws PodnapisiException { String url = DOMAIN + "/sl/ppodnapisi/search?sK=" + showName.trim().toLowerCase().urlEncode(); - return getXml(url).selectFirst(".subtitle-entry") != null + return getXml(url).selectFirstByClass("subtitle-entry") != null ? Optional.of(new ProviderSerieId(showName, showName)) : Optional.empty(); } @@ -67,7 +68,7 @@ private List getSubtitles(SerieMapping providerSeri season, episode, language)) .collectionSupplier(PodnapisiSubtitleDescriptor.class, () -> { try { - StringBuilder url = new StringBuilder(DOMAIN + "/sl/ppodnapisi/search?sK=") + StringBuilder url = new StringBuilder("$DOMAIN/sl/ppodnapisi/search?sK=") .append(URLEncoder.encode(providerSerieId.providerId.trim().toLowerCase(), StandardCharsets.UTF_8)); if (PODNAPISI_LANGS.containsKey(language)) { @@ -86,7 +87,7 @@ private List getSubtitles(SerieMapping providerSeri } url.append("&sXML=1"); - return getXml(url.toString()).select("subtitle") + return getXml(url.toString()).selectAllByTag("subtitle") .stream() .map(this::parsePodnapisiSubtitle) .toList(); @@ -98,7 +99,7 @@ private List getSubtitles(SerieMapping providerSeri } - protected Document getXml(String url) throws PodnapisiException { + protected @Nullable Document getXml(String url) throws PodnapisiException { try { return manager.getPageContentBuilder().url(url).userAgent(userAgent).cacheType(CacheType.MEMORY).retries(1) .retryPredicate(e -> e instanceof HttpClientException httpClientException && @@ -116,12 +117,14 @@ private PodnapisiSubtitleDescriptor parsePodnapisiSubtitle(Element elem) { .hearingImpaired(elem.select("new_flags flags") .stream() .anyMatch(flagElem -> "hearing_impaired".equals(flagElem.text()))) - .language(languageIdToLanguage(elem.selectFirst("languageId").text())) - .releaseString(elem.selectFirst("release").text().length() > 10 ? elem.selectFirst("release").text() - : elem.selectFirst("title").text().replace(":", "") + " " + elem.selectFirst("release").text()) - .uploaderName(elem.selectFirst("uploaderName").text()) - .url(elem.selectFirst("url").text() + "/download?") - .subtitleId(elem.selectFirst("id").text()) + .language(languageIdToLanguage(elem.selectFirst("languageId").getText())) + .releaseString( + elem.selectFirst("release").getText().length() > 10 ? elem.selectFirst("release").getText() + : elem.selectFirst("title").getText().replace(":", "") + " " + + elem.selectFirst("release").getText()) + .uploaderName(elem.selectFirst("uploaderName").getText()) + .url(elem.selectFirst("url").getText() + "/download?") + .subtitleId(elem.selectFirst("id").getText()) .year(getText.apply(elem.selectFirst("year"))) .imdb(getText.apply(elem.selectFirst("imdb"))) .omdb(getText.apply(elem.selectFirst("omdb"))) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java index 171b7c66..8b5ab732 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/subscene/SubsceneApi.java @@ -1,8 +1,6 @@ package org.lodder.subtools.multisubdownloader.subtitleproviders.subscene; import java.io.Serial; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.Collections; @@ -13,7 +11,6 @@ import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.Getter; @@ -21,7 +18,6 @@ import manifold.ext.props.rt.api.override; import manifold.ext.props.rt.api.val; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleApi; @@ -37,6 +33,7 @@ import org.lodder.subtools.sublibrary.model.SubtitleSource; import org.lodder.subtools.sublibrary.settings.model.SerieMapping; import org.lodder.subtools.sublibrary.util.http.HttpClientException; +import util.Utils; public class SubsceneApi extends Html implements SubtitleApi { @@ -45,13 +42,12 @@ public class SubsceneApi extends Html implements SubtitleApi { private static final String DOMAIN = "https://subscene.com"; private static final Pattern SERIE_NAME_PATTERN = Pattern.compile(".*? - ([A-Z][a-z]*) Season.*"); - private static final Predicate RETRY_PREDICATE = exception -> - switch (exception) { - case HttpClientException httpClientException -> - httpClientException.getResponseCode() == 409 || httpClientException.getResponseCode() == 429; - case ManagerException managerException -> managerException.getMessage().contains("409 Conflict"); - default -> false; - }; + private static final Predicate RETRY_PREDICATE = exception -> switch (exception) { + case HttpClientException httpClientException -> + httpClientException.getResponseCode() == 409 || httpClientException.getResponseCode() == 429; + case ManagerException managerException -> managerException.getMessage().contains("409 Conflict"); + default -> false; + }; private int selectedLanguage; private boolean selectedIncludeHearingImpaired; @@ -74,24 +70,19 @@ public Map> getSubSceneSerieNames(String serieName if (StringUtils.isBlank(serieName)) { return Map.of(); } - String url = - DOMAIN + "/subtitles/searchbytitle?query=" + URLEncoder.encode(serieName, StandardCharsets.UTF_8); - Element searchResultElement = getJsoupDocument(url).selectFirst(".search-result"); - - return searchResultElement.select("h2") + String url = "$DOMAIN/subtitles/searchbytitle?query=" + serieName.urlEncode(); + return getJsoupDocument(url).selectFirstByClass("search-result").selectAllByTag("h2") .stream() - .map(titleElement -> Pair.of(titleElement.text(), - titleElement.nextElementSibling().select("a").stream().map(aElem -> { - Matcher matcher = SERIE_NAME_PATTERN.matcher(aElem.text()); + .collect(Utils.mapCollector((map, titleElement) -> map.put(titleElement.text(), + titleElement.nextElementSibling().selectAllByTag("a").stream().map(elem -> { + Matcher matcher = SERIE_NAME_PATTERN.matcher(elem.text()); int season = 0; if (matcher.matches()) { season = OrdinalNumber.optionalFromValue(matcher.group(1)) - .mapToInt(OrdinalNumber::getNumber) - .orElse(-1); + .mapToInt(OrdinalNumber::getNumber).orElse(-1); } - return new SubSceneSerieId(aElem.text(), aElem.attr("href"), season); - }).toList())) - .collect(Collectors.toMap(Pair::getKey, Pair::getValue)); + return new SubSceneSerieId(elem.text(), elem.attr("href"), season); + }).toList()))); } catch (Exception e) { throw new SubsceneException(e); } @@ -106,17 +97,19 @@ public List getSubtitles(SerieMapping providerSerieI .collectionSupplier(SubsceneSubtitleDescriptor.class, () -> { setLanguageWithCookie(language); try { - return getJsoupDocument(DOMAIN + providerSerieId.providerId).select("td.a1") + return getJsoupDocument(DOMAIN + providerSerieId.providerId) + .selectAllByCss("td.a1") .stream() .map(Element::parent) .map(row -> new SubsceneSubtitleDescriptor().setLanguage( - Language.fromValueOptional(row.select(".a1 span.l").text().trim()).orElse(null)) + Language.fromValueOptional(row.selectAllByCss(".a1 span.l").getText().trim()) + .orElse(null)) .setUrlSupplier(() -> getDownloadUrl( - DOMAIN + row.select(".a1 > a").attr("href").trim())) - .setName(row.select(".a1 span:not(.l)").text().trim()) - .setHearingImpaired(!row.select(".a41").isEmpty()) - .setUploader(row.select(".a5 > a").text().trim()) - .setComment(row.select(".a6 > div").text().trim())) + DOMAIN + row.selectAllByCss(".a1 > a").getAttr("href").trim())) + .setName(row.selectAllByCss(".a1 span:not(.l)").getText().trim()) + .setHearingImpaired(row.selectFirstByCss(".a41") != null) + .setUploader(row.selectFirstByCss(".a5 > a").getText().trim()) + .setComment(row.selectFirstByCss(".a6 > div").getText().trim())) .filter(subDescriptor -> subDescriptor.getSeasonEpisode() != null && subDescriptor.getSeasonEpisode().episodes.stream() .anyMatch(ep -> ep == episode)) @@ -130,7 +123,11 @@ public List getSubtitles(SerieMapping providerSerieI private String getDownloadUrl(String seriePageUrl) throws SubsceneException { try { - return DOMAIN + getJsoupDocument(seriePageUrl).selectFirst("#downloadButton").attr("href"); + String href = getJsoupDocument(seriePageUrl).selectFirstById("downloadButton").getAttr("href"); + if (StringUtils.isBlank(href)) { + throw new SubsceneException("href for $seriePageUrl is blank"); + } + return DOMAIN + href; } catch (ManagerException e) { throw new SubsceneException(e); } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java index a551e5c5..ef9311dc 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/tvsubtitles/JTVSubtitlesApi.java @@ -66,53 +66,57 @@ private Set getSubtitles(String episodeUrl, Langu .collectionSupplier(TVsubtitlesSubtitleDescriptor.class, () -> { Set lSubtitles = new HashSet<>(); try { - Document searchEpisodeDoc = + Elements searchEpisodes = this.getHtml(episodeUrl.replace(".html", "-" + language.langCode + ".html")) .cacheType(CacheType.NONE) - .getAsJsoupDocument(); - Elements searchEpisodes = searchEpisodeDoc.select(".left_articles > a"); - + .getAsJsoupDocument() + .selectAllByCss(".left_articles > a"); BiPredicate isRowWithText = (row, text) -> row.get(1).text().contains(text); Function getRowValue = row -> row.get(2).text(); for (Element ep : searchEpisodes) { String url = ep.attr("href"); - if (url.contains("subtitle-")) { - Document subtitlePageDoc = - this.getHtml(DOMAIN + url).cacheType(CacheType.NONE).getAsJsoupDocument(); - String filename = null, rip = null, title = null, author = null; - Elements subtitlePageTableDoc = subtitlePageDoc.getElementsByClass("subtitle1"); - if (subtitlePageTableDoc.size() == 1) { - for (Element item : subtitlePageTableDoc.first.getElementsByTag("tr")) { - Elements row = item.getElementsByTag("td"); - if (row.size() != 3) { - continue; - } - if (isRowWithText.test(row, "episode title:")) { - title = getRowValue.apply(row); - } else if (isRowWithText.test(row, "filename:")) { - filename = getRowValue.apply(row); - } else if (isRowWithText.test(row, "rip:")) { - rip = getRowValue.apply(row); - } else if (isRowWithText.test(row, "author:")) { - author = getRowValue.apply(row); - } - if (filename != null && rip != null) { - TVsubtitlesSubtitleDescriptor sub = TVsubtitlesSubtitleDescriptor.builder() - .filename(filename) - .url(DOMAIN + "/files/" + URLEncoder.encode( - filename.replace(title + ".", "") - .replace(".srt", ".zip") - .replace(" - ", "_"), StandardCharsets.UTF_8)) - .rip(rip) - .author(author) - .build(); - lSubtitles.add(sub); - rip = null; - filename = null; - title = null; - author = null; - } - } + if (!url.contains("subtitle-")) { + continue; + } + Document subtitlePageDoc = + this.getHtml(DOMAIN + url).cacheType(CacheType.NONE).getAsJsoupDocument(); + String filename = null; + String rip = null; + String title = null; + String author = null; + Elements subtitlePageTableDoc = subtitlePageDoc.selectAllByClass("subtitle1"); + if (subtitlePageTableDoc.getSize() != 1) { + continue; + } + for (Element item : subtitlePageTableDoc.getFirstElement().selectAllByTag("tr")) { + Elements row = item.getElementsByTag("td"); + if (row.size() != 3) { + continue; + } + if (isRowWithText.test(row, "episode title:")) { + title = getRowValue.apply(row); + } else if (isRowWithText.test(row, "filename:")) { + filename = getRowValue.apply(row); + } else if (isRowWithText.test(row, "rip:")) { + rip = getRowValue.apply(row); + } else if (isRowWithText.test(row, "author:")) { + author = getRowValue.apply(row); + } + if (filename != null && rip != null) { + TVsubtitlesSubtitleDescriptor sub = TVsubtitlesSubtitleDescriptor.builder() + .filename(filename) + .url("$DOMAIN/files/" + URLEncoder.encode( + filename.replace(title + ".", "") + .replace(".srt", ".zip") + .replace(" - ", "_"), StandardCharsets.UTF_8)) + .rip(rip) + .author(author) + .build(); + lSubtitles.add(sub); + rip = null; + filename = null; + title = null; + author = null; } } } @@ -132,16 +136,17 @@ private Optional getEpisodeUrl(String showUrl, int season, int episode) try { String formattedSeasonEpisode = season + "x" + (episode < 10 ? "0" + episode : String.valueOf(episode)); - return getHtml(showUrl.replace(".html", "-" + season + ".html")).getAsJsoupDocument() - .getElementById("table5") - .getElementsByTag("tr") + return getHtml(showUrl.replace(".html", "-$season.html")) + .getAsJsoupDocument() + .selectFirstById("table5") + .selectAllByTag("tr") .stream() .skip(1) .filter(row -> Optional.ofNullable(row.selectFirst("td")) .map(element -> formattedSeasonEpisode.equals(element.text())) .orElse(false)) .map(element -> DOMAIN + "/" + - element.select("td").get(1).selectFirst("a").attr("href")) + element.selectNthByTag("td", 2).selectFirstByTag("a").getAttr("href")) .findAny(); } catch (Exception e) { throw new TvSubtitlesException(e); diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java index 78536390..749f7ec7 100644 --- a/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java +++ b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java @@ -1,6 +1,7 @@ package extensions.org.jsoup.nodes.Element; import extensions.org.jsoup.nodes.Node.NodeExt; +import extensions.org.jsoup.select.Elements.UnmodifiableElements; import manifold.ext.rt.api.Extension; import manifold.ext.rt.api.Jailbreak; import manifold.ext.rt.api.This; @@ -20,51 +21,52 @@ public class ElementExt extends NodeExt { // Get all Element \\ // --------------- \\ - public static @Nullable Elements getAllElementsByClass(@Nullable @This Element element, String className) { - return element == null ? null : element.getElementsByClass(requireNotEmpty(className)); + public static Elements selectAllByClass(@Nullable @This Element element, String className) { + return element == null ? UnmodifiableElements.EMPTY : element.getElementsByClass(requireNotEmpty(className)); } - public static @Nullable Elements getAllElementsByTag(@Nullable @This Element element, String tagName) { - return element == null ? null : element.getElementsByTag(requireNotEmpty(tagName)); + public static Elements selectAllByTag(@Nullable @This Element element, String tagName) { + return element == null ? UnmodifiableElements.EMPTY : element.getElementsByTag(requireNotEmpty(tagName)); } - public static @Nullable Elements getAllElementsByAttribute(@Nullable @This Element element, String attribute) { - return element == null ? null : element.getElementsByAttribute(requireNotEmpty(attribute)); + public static Elements selectAllByAttribute(@Nullable @This Element element, String attribute) { + return element == null ? UnmodifiableElements.EMPTY : + element.getElementsByAttribute(requireNotEmpty(attribute)); } - public static @Nullable Elements getAllElementsByCss(@Nullable @This Element element, String cssQuery) { - return element == null ? null : element.getElements(requireNotEmpty(cssQuery)); + public static Elements selectAllByCss(@Nullable @This Element element, String cssQuery) { + return element == null ? UnmodifiableElements.EMPTY : element.getElements(requireNotEmpty(cssQuery)); } - public static @Nullable Elements getAllElements(@Nullable @This Element element, Evaluator evaluator) { - return element == null ? null : Collector.collect(evaluator, element); + public static Elements selectAll(@Nullable @This Element element, Evaluator evaluator) { + return element == null ? UnmodifiableElements.EMPTY : Collector.collect(evaluator, element); } // ----------------- \\ // Get First Element \\ // ----------------- \\ - public static @Nullable Element getFirstElementByClass(@Nullable @This Element element, String className) { - return element == null ? null : getFirstElement(element, new Evaluator.Class(requireNotEmpty(className))); + public static @Nullable Element selectFirstByClass(@Nullable @This Element element, String className) { + return element == null ? null : selectFirst(element, new Evaluator.Class(requireNotEmpty(className))); } - public static @Nullable Element getFirstElementByTag(@Nullable @This Element element, String tagName) { - return element == null ? null : getFirstElement(element, new Evaluator.Tag(requireNotEmpty(tagName))); + public static @Nullable Element selectFirstByTag(@Nullable @This Element element, String tagName) { + return element == null ? null : selectFirst(element, new Evaluator.Tag(requireNotEmpty(tagName))); } - public static @Nullable Element getFirstElementByAttribute(@Nullable @This Element element, String attribute) { - return element == null ? null : getFirstElement(element, new Evaluator.Attribute(requireNotEmpty(attribute))); + public static @Nullable Element selectFirstByAttribute(@Nullable @This Element element, String attribute) { + return element == null ? null : selectFirst(element, new Evaluator.Attribute(requireNotEmpty(attribute))); } - public static @Nullable Element getFirstElementByCss(@Nullable @This Element element, String cssQuery) { - return element == null ? null : getFirstElement(element, QueryParser.parse(requireNotEmpty(cssQuery))); + public static @Nullable Element selectFirstByCss(@Nullable @This Element element, String cssQuery) { + return element == null ? null : selectFirst(element, QueryParser.parse(requireNotEmpty(cssQuery))); } - public static @Nullable Element getFirstElementById(@Nullable @This Element element, String id) { - return element == null ? null : getFirstElement(element, new Evaluator.Id(requireNotEmpty(id))); + public static @Nullable Element selectFirstById(@Nullable @This Element element, String id) { + return element == null ? null : selectFirst(element, new Evaluator.Id(requireNotEmpty(id))); } - public static @Nullable Element getFirstElement(@Nullable @This Element element, Evaluator evaluator) { + public static @Nullable Element selectFirst(@Nullable @This Element element, Evaluator evaluator) { return element == null ? null : Collector.findFirst(evaluator, element); } @@ -72,81 +74,81 @@ public class ElementExt extends NodeExt { // Get n-th Element \\ // ---------------- \\ - public static @Nullable Element getNthElementByClass(@Nullable @This Element element, String className, int index) { - return element == null ? null : getNthElement(element, new Evaluator.Class(requireNotEmpty(className)), index); + public static @Nullable Element selectNthByClass(@Nullable @This Element element, String className, int index) { + return element == null ? null : selectNth(element, new Evaluator.Class(requireNotEmpty(className)), index); } - public static @Nullable Element getNthElementByTag(@Nullable @This Element element, String tagName, int index) { - return element == null ? null : getNthElement(element, new Evaluator.Tag(requireNotEmpty(tagName)), index); + public static @Nullable Element selectNthByTag(@Nullable @This Element element, String tagName, int index) { + return element == null ? null : selectNth(element, new Evaluator.Tag(requireNotEmpty(tagName)), index); } - public static @Nullable Element getNthElementByAttribute(@Nullable @This Element element, String attribute, + public static @Nullable Element selectNthByAttribute(@Nullable @This Element element, String attribute, int index) { return element == null ? null : - getNthElement(element, new Evaluator.Attribute(requireNotEmpty(attribute)), index); + selectNth(element, new Evaluator.Attribute(requireNotEmpty(attribute)), index); } - public static @Nullable Element getNthElementByCss(@Nullable @This Element element, String cssQuery, int index) { - return element == null ? null : getNthElement(element, QueryParser.parse(requireNotEmpty(cssQuery)), index); + public static @Nullable Element selectNthByCss(@Nullable @This Element element, String cssQuery, int index) { + return element == null ? null : selectNth(element, QueryParser.parse(requireNotEmpty(cssQuery)), index); } - public static @Nullable Element getNthElement(@Nullable @This Element element, @Jailbreak Evaluator eval, int idx) { + public static @Nullable Element selectNth(@Nullable @This Element element, @Jailbreak Evaluator eval, int idx) { eval.reset(); return new NthElementFinder(eval).find(element, element, idx); } - // ----------------------- \\ + // -------------------------- \\ // Get First Element or Throw \\ - // ----------------------- \\ + // -------------------------- \\ - public static Element getFirstElementByClassOrThrow(@Nullable @This Element element, String className) + public static Element selectFirstByClassOrThrow(@Nullable @This Element element, String className) throws WebpageException { - Element n = getFirstElementByClass(element, className); + Element n = selectFirstByClass(element, className); if (n == null) { throw new WebpageException("Could not find element with class '%s'".formatted(className)); } return n; } - public static Element getFirstElementByTagOrThrow(@Nullable @This Element element, String tagName) + public static Element selectFirstByTagOrThrow(@Nullable @This Element element, String tagName) throws WebpageException { - Element n = getFirstElementByTag(element, tagName); + Element n = selectFirstByTag(element, tagName); if (n == null) { throw new WebpageException("Could not find element with tag '%s'".formatted(tagName)); } return n; } - public static Element getFirstElementByAttributeOrThrow(@Nullable @This Element element, String attribute) + public static Element selectFirstByAttributeOrThrow(@Nullable @This Element element, String attribute) throws WebpageException { - Element n = getFirstElementByAttribute(element, attribute); + Element n = selectFirstByAttribute(element, attribute); if (n == null) { throw new WebpageException("Could not find element with attribute '%s'".formatted(attribute)); } return n; } - public static Element getFirstElementByCssOrThrow(@Nullable @This Element element, String cssQuery) + public static Element selectFirstByCssOrThrow(@Nullable @This Element element, String cssQuery) throws WebpageException { - Element n = getFirstElementByCss(element, cssQuery); + Element n = selectFirstByCss(element, cssQuery); if (n == null) { throw new WebpageException("Could not find element with css selector '%s'".formatted(cssQuery)); } return n; } - public static Element getFirstElementByIdOrThrow(@Nullable @This Element element, String id) + public static Element selectFirstByIdOrThrow(@Nullable @This Element element, String id) throws WebpageException { - Element n = getFirstElementById(element, id); + Element n = selectFirstById(element, id); if (n == null) { throw new WebpageException("Could not find element with id '%s'".formatted(id)); } return n; } - public static Element getFirstElementOrThrow(@Nullable @This Element element, Evaluator evaluator) + public static Element selectOrThrow(@Nullable @This Element element, Evaluator evaluator) throws WebpageException { - Element n = getFirstElement(element, evaluator); + Element n = selectFirst(element, evaluator); if (n == null) { throw new WebpageException("Could not find element using selector '%s'".formatted(evaluator)); } @@ -157,45 +159,45 @@ public static Element getFirstElementOrThrow(@Nullable @This Element element, Ev // Get n-th Element or Throw \\ // ------------------------- \\ - public static Element getNthElementByClassOrThrow(@Nullable @This Element element, String className, int index) + public static Element selectNthByClassOrThrow(@Nullable @This Element element, String className, int index) throws WebpageException { - Element elem = getNthElementByClass(element, className, index); + Element elem = selectNthByClass(element, className, index); if (elem == null) { throw new WebpageException("Could not find %sth element with class '%s'".formatted(index, className)); } return elem; } - public static Element getNthElementByTagOrThrow(@Nullable @This Element element, String tagName, int index) + public static Element selectNthByTagOrThrow(@Nullable @This Element element, String tagName, int index) throws WebpageException { - Element elem = getNthElementByTag(element, tagName, index); + Element elem = selectNthByTag(element, tagName, index); if (elem == null) { throw new WebpageException("Could not find %sth element with tag '%s'".formatted(index, tagName)); } return elem; } - public static Element getNthElementByAttributeOrThrow(@Nullable @This Element element, String attribute, int index) + public static Element selectNthByAttributeOrThrow(@Nullable @This Element element, String attribute, int index) throws WebpageException { - Element elem = getNthElementByAttribute(element, attribute, index); + Element elem = selectNthByAttribute(element, attribute, index); if (elem == null) { throw new WebpageException("Could not find %sth element with attribute '%s'".formatted(index, attribute)); } return elem; } - public static Element getNthElementByCssOrThrow(@Nullable @This Element element, String cssQuery, int index) + public static Element selectNthByCssOrThrow(@Nullable @This Element element, String cssQuery, int index) throws WebpageException { - Element elem = getNthElementByCss(element, cssQuery, index); + Element elem = selectNthByCss(element, cssQuery, index); if (elem == null) { throw new WebpageException("Could not find %sth element with css selector '%s'".formatted(index, cssQuery)); } return elem; } - public static Element getNthElementOrThrow(@Nullable @This Element element, Evaluator eval, int index) + public static Element selectNthOrThrow(@Nullable @This Element element, Evaluator eval, int index) throws WebpageException { - Element elem = getNthElement(element, eval, index); + Element elem = selectNth(element, eval, index); if (elem == null) { throw new WebpageException( "Could not find %sth element using selector '%s'".formatted(index, eval.toString())); @@ -211,15 +213,23 @@ public static Elements getElements(@Nullable @This Element element, String cssQu return element == null ? new Elements() : element.select(cssQuery); } - // ------------ \\ + // --------------- \\ // Element methods \\ - // ------------ \\ + // --------------- \\ public static String getText(@Nullable @This Element element) { return element == null ? "" : element.text(); } + public static @Nullable Element getParent(@Nullable @This Element element) { + return element == null ? null : element.parent(); + } + + // public static T map(@This @Nullable Element element, Function function) { + // return element == null ? null : function.apply(element); + // } + // --------------- \\ // Utility methods \\ diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java index 29200dc8..393d8409 100644 --- a/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java +++ b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java @@ -1,18 +1,41 @@ package extensions.org.jsoup.select.Elements; +import java.util.stream.Stream; + import lombok.experimental.UtilityClass; import manifold.ext.rt.api.Extension; import manifold.ext.rt.api.This; -import name.falgout.jeffrey.throwing.stream.ThrowingStream; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; +import org.jspecify.annotations.Nullable; @Extension @UtilityClass public class ElementsExt { - public static ThrowingStream throwingStream(@This Elements elements, - Class exceptionType) { - return ThrowingStream.of(elements.stream(), exceptionType); + + public static String getText(@This @Nullable Elements elements) { + return elements == null ? "" : elements.text(); + } + + public static String getAttr(@This @Nullable Elements elements, String attribute) { + return elements == null ? "" : + elements.stream() + .filter(elem -> elem.hasAttr(attribute)) + .map(elem -> elem.attr(attribute)) + .findFirst() + .orElse(""); + } + + public static @Nullable Element getFirstElement(@This @Nullable Elements elements) { + return elements == null ? null : elements.first(); + } + + public static Stream stream(@This Elements elements) { + return elements == null ? Stream.of() : elements.stream(); + } + + public static int getSize(@This Elements elements) { + return elements == null ? 0 : elements.size(); } } diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/UnmodifiableElements.java b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/UnmodifiableElements.java new file mode 100644 index 00000000..7b86b424 --- /dev/null +++ b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/UnmodifiableElements.java @@ -0,0 +1,123 @@ +package extensions.org.jsoup.select.Elements; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.function.Predicate; +import java.util.function.UnaryOperator; + +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +public class UnmodifiableElements extends Elements { + + public static UnmodifiableElements EMPTY = new UnmodifiableElements(); + + public UnmodifiableElements() { + } + + public UnmodifiableElements(int initialCapacity) { + super(initialCapacity); + } + + public UnmodifiableElements(Collection elements) { + super(elements); + } + + public UnmodifiableElements(List elements) { + super(elements); + } + + public UnmodifiableElements(Element... elements) { + super(Arrays.asList(elements)); + } + + public Elements removeAttr(String attributeKey) { + return this; + } + + public Elements addClass(String className) { + return this; + } + + public Elements removeClass(String className) { + return this; + } + + public Elements toggleClass(String className) { + return this; + } + + + public Elements prepend(String html) { + return this; + } + + public Elements append(String html) { + return this; + } + + public Elements before(String html) { + return this; + } + + public Elements after(String html) { + return this; + } + + public Elements wrap(String html) { + return this; + } + + public Elements unwrap() { + return this; + } + + public Elements empty() { + return this; + } + + public Elements remove() { + return this; + } + + // filters + + @Override + public Element set(int index, Element element) { + throw new IllegalStateException(); + } + + @Override + public Element remove(int index) { + throw new IllegalStateException(); + } + + @Override + public boolean remove(Object o) { + return false; + } + + @Override + public void clear() { + } + + @Override + public boolean removeAll(Collection c) { + return false; + } + + @Override + public boolean retainAll(Collection c) { + return false; + } + + @Override + public boolean removeIf(Predicate filter) { + return false; + } + + @Override + public void replaceAll(UnaryOperator operator) { + } +} diff --git a/SubLibrary/src/main/java/extensions/org/w3c/dom/Document/DocumentExt.java b/SubLibrary/src/main/java/extensions/org/w3c/dom/Document/DocumentExt.java index 9ca2e80d..0f1b0f69 100644 --- a/SubLibrary/src/main/java/extensions/org/w3c/dom/Document/DocumentExt.java +++ b/SubLibrary/src/main/java/extensions/org/w3c/dom/Document/DocumentExt.java @@ -14,7 +14,7 @@ public class DocumentExt { // Get First Element \\ // ----------------- \\ - public static @Nullable NodeList getAllElementsByTag(@Nullable @This Document document, String tagName) { + public static @Nullable NodeList selectAllByTag(@Nullable @This Document document, String tagName) { return document == null ? null : document.getElementsByTagName(requireNotEmpty(tagName)); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java index 808da725..c57d6cc5 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/Manager.java @@ -35,7 +35,6 @@ import org.json.JSONException; import org.json.JSONObject; import org.jsoup.Jsoup; -import org.jspecify.annotations.Nullable; import org.lodder.subtools.sublibrary.cache.Cache; import org.lodder.subtools.sublibrary.cache.CacheType; import org.lodder.subtools.sublibrary.cache.DiskCache; @@ -169,19 +168,14 @@ public interface PageContentBuilderGetIntf { InputStream getAsInputStream() throws ManagerException; - @Nullable - Document getAsDocument() throws ParserConfigurationException, ManagerException; + Document getAsDocument() throws ParserConfigurationException, ManagerException, IOException; - @Nullable Document getAsDocument(Predicate emptyResultPredicate) - throws ParserConfigurationException, ManagerException; + throws ParserConfigurationException, ManagerException, IOException; - // @Nullable org.jsoup.nodes.Document getAsJsoupDocument() throws ManagerException; - // @Nullable - org.jsoup.nodes.Document getAsJsoupDocument(Predicate emptyResultPredicate) - throws ManagerException; + org.jsoup.nodes.Document getAsJsoupDocument(Predicate emptyResultPredicate) throws ManagerException; JSONObject getAsJsonObject() throws ManagerException; @@ -231,13 +225,13 @@ public InputStream getAsInputStream() throws ManagerException { } @Override - public Document getAsDocument() throws ParserConfigurationException, ManagerException { + public Document getAsDocument() throws ParserConfigurationException, ManagerException, IOException { return XMLHelper.getDocument(get()); } @Override public Document getAsDocument(Predicate emptyResultPredicate) - throws ParserConfigurationException, ManagerException { + throws ParserConfigurationException, ManagerException, IOException { String html = get(); return StringUtils.isBlank(html) || (emptyResultPredicate != null && emptyResultPredicate.test(html)) ? null : XMLHelper.getDocument(html); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java index dc281207..700dbf40 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbApi.java @@ -23,10 +23,10 @@ public Optional getMovieDetails(int imdbId) throws ImdbException { org.jsoup.nodes.Element element = manager.getPageContentBuilder() .url(url) .getAsJsoupDocument() - .selectFirst(".article .subpage_title_block .subpage_title_block__right-column"); - String imdbName = element.getFirstElementByCss("a[itemprop='url']").getText(); + .selectFirstByCss(".article .subpage_title_block .subpage_title_block__right-column"); + String imdbName = element.selectFirstByCss("a[itemprop='url']").getText(); int year = Integer.parseInt( - element.getFirstElementByCss("span.nobr").getText().replaceAll("[^0-9]", "")); + element.selectFirstByCss("span.nobr").getText().replaceAll("[^0-9]", "")); return Optional.of(new ImdbDetails(imdbName, year)); } catch (Exception e) { throw new ImdbException("Error IMDB API", url, e); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java index 8d7a4762..e0f2683d 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/imdb/ImdbSearchIdApi.java @@ -3,13 +3,11 @@ import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collector; import org.apache.commons.lang3.StringUtils; import org.jsoup.nodes.Element; @@ -17,6 +15,7 @@ import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.ProviderSerieId; import org.lodder.subtools.sublibrary.data.imdb.exception.ImdbSearchIdException; +import util.Utils; record ImdbSearchIdApi(Manager manager) { @@ -37,9 +36,9 @@ public Set getImdbIdOnImdb(String title, Integer year) throws I Elements searchResults = manager.getPageContentBuilder() .url(url) .getAsJsoupDocument() - .select("#main .findList .findResult .result_text"); + .selectAllByCss("#main .findList .findResult .result_text"); return getImdbIdCommon(searchResults, - e -> e.getFirstElementByTag("a").getText() + " " + e.getText(), + e -> e.selectFirstByTag("a").getText() + " " + e.getText(), e -> e.selectFirst("a").getAttr("href")); } catch (Exception e) { throw new ImdbSearchIdException("Error getImdbIdOnImdb", url, e); @@ -67,7 +66,7 @@ public Set getImdbIdOnYahoo(String title, Integer year) throws Elements searchResults = manager.getPageContentBuilder() .url(url) .getAsJsoupDocument() - .select("a[href~='https%3a%2f%2fwww.imdb.com%2ftitle%2ftt']"); + .selectAllByCss("a[href~='https%3a%2f%2fwww.imdb.com%2ftitle%2ftt']"); Function toStringMapper = e -> Optional.ofNullable(e.selectFirst("h3")) .map(e2 -> e2.text().replace(" - IMDb", "")) .orElse(null); @@ -98,9 +97,9 @@ public Set getImdbIdOnGoogle(String title, Integer year) throws Elements searchResults = manager.getPageContentBuilder() .url(url) .getAsJsoupDocument() - .select("a[href*='https://www.imdb.com/title/tt']"); + .selectAllByCss("a[href*='https://www.imdb.com/title/tt']"); Function toStringMapper = - e -> e.getFirstElementByTag("span").getText().replace(" - IMDb", ""); + e -> e.selectFirstByTag("span").getText().replace(" - IMDb", ""); Function toHrefMapper = e -> e.getAttr("href"); return getImdbIdCommon(searchResults, toStringMapper, toHrefMapper); } catch (Exception e) { @@ -112,11 +111,7 @@ public Set getImdbIdOnGoogle(String title, Integer year) throws private Set getImdbIdCommon(Elements searchResults, Function toStringMapper, Function toHrefMapper) { - if (searchResults == null) { - return Set.of(); - } - return searchResults.stream().collect(Collector.of( - HashSet::new, + return searchResults.stream().collect(Utils.setCollector( (set, element) -> { String name = toStringMapper.apply(element); if (StringUtils.isBlank(name)) { @@ -127,9 +122,6 @@ private Set getImdbIdCommon(Elements searchResults, Function { - set1.addAll(set2); - return set1; })); } } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java index 1dd3def7..9c20c8a2 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/omdb/OmdbApi.java @@ -24,7 +24,7 @@ public Optional getMovieDetails(int imdbId) throws OmdbException { return manager.getPageContentBuilder() .url(url) .getAsDocument() - .getAllElementsByTag("movie").stream() + .selectAllByTag("movie").stream() .map(this::parseOMDBDetails).findFirst(); } catch (Exception e) { throw new OmdbException("Error OMDB API", url, e); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java index 606b539d..02341355 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/data/tvdb/TheTvdbMirrors.java @@ -1,6 +1,7 @@ package org.lodder.subtools.sublibrary.data.tvdb; import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -31,12 +32,13 @@ public class TheTvdbMirrors { private final List bannerList = new ArrayList<>(); private final List zipList = new ArrayList<>(); - public TheTvdbMirrors(String apikey, Manager manager) throws ManagerException, ParserConfigurationException { + public TheTvdbMirrors(String apikey, Manager manager) throws ManagerException, ParserConfigurationException, + IOException { synchronized (this) { manager.getPageContentBuilder() .url("http://www.thetvdb.com/api/" + apikey + "/mirrors.xml") .getAsDocument() - .getAllElementsByTag("Mirror").stream() + .selectAllByTag("Mirror").stream() .filter(nMirror -> nMirror.getNodeType() == Node.ELEMENT_NODE) .map(Element.class::cast) .forEach(eMirror -> { diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java index 81f07071..ead88f9e 100755 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/xml/XMLHelper.java @@ -17,7 +17,6 @@ import java.nio.file.Files; import java.nio.file.Path; -import org.jspecify.annotations.Nullable; import org.lodder.subtools.sublibrary.util.http.HttpClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,8 +75,8 @@ public static boolean getBooleanTagValue(String sTag, Element eElement) { public static boolean getBooleanAttributeValue(String sTag, String sAttribute, Element eElement) { LOGGER.trace("getBooleanAttributeValue: sTag [{}], sAttribute [{}]", sTag, sAttribute); NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); - return ((Element) nlList).getAttribute(sAttribute) != null - && Boolean.parseBoolean(((Element) nlList).getAttribute(sAttribute)); + return ((Element) nlList).getAttribute(sAttribute) != null && + Boolean.parseBoolean(((Element) nlList).getAttribute(sAttribute)); } public static String cleanBadChars(String string) { @@ -123,30 +122,19 @@ public static String getXMLAsString(Element eElement) throws Exception { return result.getWriter().toString(); } - public static @Nullable Document getDocument(String string) throws ParserConfigurationException { - try { - return getDocument(new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8))); - } catch (IOException e) { - // should not happen - return null; - } + public static Document getDocument(String string) throws ParserConfigurationException, IOException { + return getDocument(new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8))); } - public static @Nullable Document getDocument(InputStream inputStream) throws ParserConfigurationException, - IOException { + public static Document getDocument(InputStream inputStream) throws ParserConfigurationException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // Use the factory to create a builder DocumentBuilder builder; builder = factory.newDocumentBuilder(); try { return builder.parse(inputStream); - } catch (SAXException e) { - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("getDocument: Not a valid XML document, setting a blank document!"); - } else { - LOGGER.debug("Not a valid XML document, setting a blank document!"); - } + } catch (SAXException | IOException e) { + throw new IOException("XML input could not be converted to a document"); } - return null; } } diff --git a/SubLibrary/src/main/java/util/Utils.java b/SubLibrary/src/main/java/util/Utils.java new file mode 100644 index 00000000..89a84cf7 --- /dev/null +++ b/SubLibrary/src/main/java/util/Utils.java @@ -0,0 +1,46 @@ +package util; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Supplier; +import java.util.stream.Collector; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class Utils { + + public static Collector, Map> mapCollector( + BiConsumer, T> accumulator) { + return mapCollector(HashMap::new, accumulator); + } + + public static , K, V> Collector mapCollector(Supplier supplier, + BiConsumer accumulator) { + return Collector.of( + supplier, + accumulator, + (R m1, R m2) -> { + m1.putAll(m2); + return m1; + }); + } + + public static Collector, Set> setCollector(BiConsumer, T> accumulator) { + return setCollector(HashSet::new, accumulator); + } + + public static , K> Collector setCollector(Supplier supplier, + BiConsumer accumulator) { + return Collector.of( + supplier, + accumulator, + (R m1, R m2) -> { + m1.addAll(m2); + return m1; + }); + } +} From 2595d6d265a301de2ed399b8a40d6ec24223ba4a Mon Sep 17 00:00:00 2001 From: EotT123 Date: Wed, 18 Dec 2024 19:37:12 +0100 Subject: [PATCH 50/54] changes --- .../lodder/subtools/multisubdownloader/CLI.java | 5 ++--- .../multisubdownloader/actions/CleanAction.java | 10 ++++++---- .../gui/extra/ImageListCellRenderer.java | 3 +-- .../multisubdownloader/settings/SettingValue.java | 10 +++++----- .../subtitleproviders/Local.java | 2 +- .../org/jsoup/nodes/Element/ElementExt.java | 14 +++++++------- .../lodder/subtools/sublibrary/cache/Cache.java | 4 ++-- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java index 2315c4e5..cfa4f34e 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/CLI.java @@ -37,7 +37,6 @@ public class CLI { private final Container app; private final Settings settings; - private final Manager manager; private boolean recursive = false; private Language language; private boolean force = false; @@ -52,11 +51,11 @@ public class CLI { public CLI(SettingsControl settingControl, Container app) { this.app = app; this.settings = settingControl.getSettings(); - this.manager = (Manager) this.app.make("Manager"); + Manager manager = (Manager) this.app.make("Manager"); checkUpdate(manager); UserInteractionHandlerCLI userInteractionHandler = new UserInteractionHandlerCLI(settings); userInteractionHandlerAction = new UserInteractionHandlerAction(settings, userInteractionHandler); - downloadAction = new DownloadAction(settings, (Manager) this.app.make("Manager"), userInteractionHandler); + downloadAction = new DownloadAction(settings, manager, userInteractionHandler); } private void checkUpdate(Manager manager) { diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java index 4cfcbe32..739da2fa 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/actions/CleanAction.java @@ -32,9 +32,9 @@ public void cleanUpFiles(Release release, Path destination, String videoFileName release.getPath().list().asThrowingStream(IOException.class) .filter(p -> (p.isDirectory() && p.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME)) - || (p.isRegularFile() && FILE_FILTERS.contains(p.getExtension()))) + || (p.isRegularFile() && FILE_FILTERS.contains(p.getExtension()))) .forEach(p -> { - switch (librarySettings.getLibraryOtherFileAction()) { + switch (librarySettings.libraryOtherFileAction) { case MOVE -> move(p, destination); case MOVEANDRENAME -> moveAndRename(p, destination, videoFileName); case REMOVE -> delete(p); @@ -48,7 +48,8 @@ public void cleanUpFiles(Release release, Path destination, String videoFileName private void rename(Path path, Path destinationFolder, String videoFileName) throws IOException { if (path.isRegularFile()) { String fileName = - path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : StringUtils.substringBeforeLast(videoFileName, "."); + path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : + StringUtils.substringBeforeLast(videoFileName, "."); String extension = path.getExtension(); if (!extension.isBlank()) { extension = "." + extension; @@ -66,7 +67,8 @@ private void delete(Path path) throws IOException { private void moveAndRename(Path path, Path destinationFolder, String videoFileName) throws IOException { if (path.isRegularFile()) { String fileName = - path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : StringUtils.substringBeforeLast(videoFileName, "."); + path.fileNameContainsIgnoreCase(SAMPLE_DIR_NAME) ? SAMPLE_DIR_NAME : + StringUtils.substringBeforeLast(videoFileName, "."); String extension = path.getExtension(); if (!extension.isBlank()) { extension = "." + extension; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java index e08fa1f8..81d8b515 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java @@ -27,8 +27,7 @@ public class ImageListCellRenderer extends JLabel implements ListCellRenderer jlist, Object value, int cellIndex, boolean selected, boolean cellHasFocus) { - if (value instanceof JPanel) { - Component component = (Component) value; + if (value instanceof JPanel component) { if (selected) { component.setBackground(jlist.getSelectionBackground()); component.setForeground(jlist.getSelectionForeground()); diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java index 41fea947..acefe126 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/settings/SettingValue.java @@ -759,11 +759,11 @@ public SettingIntf build(String key) { }; this.loadValueFunction = (settingsControl, preferences) -> { int numberOfItems = preferences.getInt(key + "Size", 0); - IntStream.range(0, numberOfItems).forEach(idx -> { - valueAdder.accept(getRootElement(settingsControl), - toObjectMapperKey.apply(preferences.get(getKeyString(key, idx), "")), - toObjectMapperValue.apply(preferences.get(getValueString(key, idx), ""))); - }); + IntStream.range(0, numberOfItems).forEach(idx -> + valueAdder.accept(getRootElement(settingsControl), + toObjectMapperKey.apply(preferences.get(getKeyString(key, idx), "")), + toObjectMapperValue.apply(preferences.get(getValueString(key, idx), ""))) + ); }; return this; diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java index 05e3594c..f6915b3c 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/subtitleproviders/Local.java @@ -126,7 +126,7 @@ public Set searchSubtitles(MovieRelease movieRelease, Language languag && DetectLanguage.execute(fileSub) == language) { LOGGER.debug("Local Sub found, adding {}", fileSub); listFoundSubtitles.add(Subtitle.downloadSource(fileSub) - .subtitleSource(getSubtitleSource()) + .subtitleSource(subtitleSource) .fileName(fileSub.getFileNameAsString()) .language(language) // TODO previously: language(""). This was not correct? .quality(ReleaseParser.getQualityKeyword(fileSub.getFileNameAsString())) diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java index 749f7ec7..0e60f408 100644 --- a/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java +++ b/SubLibrary/src/main/java/extensions/org/jsoup/nodes/Element/ElementExt.java @@ -47,26 +47,26 @@ public static Elements selectAll(@Nullable @This Element element, Evaluator eval // ----------------- \\ public static @Nullable Element selectFirstByClass(@Nullable @This Element element, String className) { - return element == null ? null : selectFirst(element, new Evaluator.Class(requireNotEmpty(className))); + return element == null ? null : element.selectFirst(new Evaluator.Class(requireNotEmpty(className))); } public static @Nullable Element selectFirstByTag(@Nullable @This Element element, String tagName) { - return element == null ? null : selectFirst(element, new Evaluator.Tag(requireNotEmpty(tagName))); + return element == null ? null : element.selectFirst(new Evaluator.Tag(requireNotEmpty(tagName))); } public static @Nullable Element selectFirstByAttribute(@Nullable @This Element element, String attribute) { - return element == null ? null : selectFirst(element, new Evaluator.Attribute(requireNotEmpty(attribute))); + return element == null ? null : element.selectFirst(new Evaluator.Attribute(requireNotEmpty(attribute))); } public static @Nullable Element selectFirstByCss(@Nullable @This Element element, String cssQuery) { - return element == null ? null : selectFirst(element, QueryParser.parse(requireNotEmpty(cssQuery))); + return element == null ? null : element.selectFirst(QueryParser.parse(requireNotEmpty(cssQuery))); } public static @Nullable Element selectFirstById(@Nullable @This Element element, String id) { - return element == null ? null : selectFirst(element, new Evaluator.Id(requireNotEmpty(id))); + return element == null ? null : element.selectFirst(new Evaluator.Id(requireNotEmpty(id))); } - public static @Nullable Element selectFirst(@Nullable @This Element element, Evaluator evaluator) { + public static @Nullable Element selectFirstBy(@Nullable @This Element element, Evaluator evaluator) { return element == null ? null : Collector.findFirst(evaluator, element); } @@ -148,7 +148,7 @@ public static Element selectFirstByIdOrThrow(@Nullable @This Element element, St public static Element selectOrThrow(@Nullable @This Element element, Evaluator evaluator) throws WebpageException { - Element n = selectFirst(element, evaluator); + Element n = selectFirstBy(element, evaluator); if (n == null) { throw new WebpageException("Could not find element using selector '%s'".formatted(evaluator)); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java index 01d02e67..52dc406a 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java @@ -50,7 +50,7 @@ public Optional get(K key) { return Optional.empty(); } else { obj.updateLastAccessed(); - return Optional.ofNullable((V) obj.value); + return Optional.ofNullable(obj.value); } } } @@ -120,7 +120,7 @@ public List> getEntries() { public List> getEntries(Predicate keyFilter) { synchronized (cacheMap) { - return getEntryStream(keyFilter).map(entry -> Pair.of(entry.getKey(), (V) entry.getValue().value)).toList(); + return getEntryStream(keyFilter).map(entry -> Pair.of(entry.getKey(), entry.getValue().value)).toList(); } } From ada06d09b983aa1a49d825c6353699d2dbcf7bc2 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Wed, 18 Dec 2024 19:43:16 +0100 Subject: [PATCH 51/54] fix --- .../cli/progress/CLIFileIndexerProgress.java | 6 ++++++ .../multisubdownloader/cli/progress/CLISearchProgress.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java index 0ee2bb70..9b462aa8 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLIFileIndexerProgress.java @@ -68,4 +68,10 @@ protected void printProgress() { this.printProgBar(this.progress); } + + // TODO: remove this when https://github.com/manifold-systems/manifold/issues/642 is fixed + public CLIFileIndexerProgress verbose(boolean verbose) { + super.verbose(verbose); + return this; + } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java index 1a41e808..2e30165f 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/cli/progress/CLISearchProgress.java @@ -73,4 +73,10 @@ protected void printProgress() { /* print progressbar */ this.printProgBar(this.progress); } + + // TODO: remove this when https://github.com/manifold-systems/manifold/issues/642 is fixed + public CLISearchProgress verbose(boolean verbose) { + super.verbose(verbose); + return this; + } } From 9d4aea71562338afbb63a50bea58c863250afb5c Mon Sep 17 00:00:00 2001 From: EotT123 Date: Wed, 18 Dec 2024 19:43:21 +0100 Subject: [PATCH 52/54] fix --- .../multisubdownloader/lib/control/TvReleaseControl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java index ca499a9a..830f38e9 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/control/TvReleaseControl.java @@ -20,12 +20,13 @@ public final class TvReleaseControl extends ReleaseControl { private final TheTvdbAdapter jtvdba; private final TvRelease tvRelease; - @val @override Release videoFile = tvRelease; + @val @override Release videoFile; public TvReleaseControl(TvRelease tvRelease, Settings settings, Manager manager, UserInteractionHandler userInteractionHandler) { super(settings, manager); this.tvRelease = tvRelease; + this.videoFile = tvRelease; this.jtvdba = TheTvdbAdapter.getInstance(manager, userInteractionHandler); } From 4bc2baff4b55fa3b23353580fd13ba46282061f3 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Wed, 18 Dec 2024 19:47:47 +0100 Subject: [PATCH 53/54] fix --- .../extensions/org/jsoup/select/Elements/ElementsExt.java | 8 +++----- .../java/org/lodder/subtools/sublibrary/cache/Cache.java | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java index 393d8409..f1f43c65 100644 --- a/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java +++ b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java @@ -1,7 +1,5 @@ package extensions.org.jsoup.select.Elements; -import java.util.stream.Stream; - import lombok.experimental.UtilityClass; import manifold.ext.rt.api.Extension; import manifold.ext.rt.api.This; @@ -31,9 +29,9 @@ public static String getAttr(@This @Nullable Elements elements, String attribute return elements == null ? null : elements.first(); } - public static Stream stream(@This Elements elements) { - return elements == null ? Stream.of() : elements.stream(); - } + // public static Stream stream(@This Elements elements) { + // return elements == null ? Stream.of() : elements.stream(); + // } public static int getSize(@This Elements elements) { return elements == null ? 0 : elements.size(); diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java index 52dc406a..aeb66b64 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/Cache.java @@ -73,6 +73,7 @@ public OptionalLong getTemporaryTimeToLive(K key) { return switch (cacheMap.get(key)) { case TemporaryCacheObject tempCacheObject -> OptionalLong.of(tempCacheObject.timeToLive); case ExpiringCacheObject _ -> OptionalLong.empty(); + case null -> OptionalLong.empty(); }; } } From 944aa2c0329c136e525fbf91af37f90de5b0c711 Mon Sep 17 00:00:00 2001 From: EotT123 Date: Wed, 18 Dec 2024 20:24:24 +0100 Subject: [PATCH 54/54] cleanup --- .../javax/swing/JComboBox/JComboBoxExt.java | 99 +--------- .../providers/EventServiceProvider.java | 5 - .../lib/library/FilenameLibraryBuilder.java | 27 ++- .../java/util/Optional/OptionalExt.java | 173 ------------------ .../java/util/OptionalInt/OptionalIntExt.java | 75 -------- .../util/OptionalLong/OptionalLongExt.java | 32 ---- .../jsoup/select/Elements/ElementsExt.java | 4 - .../sublibrary/cache/TypedDiskCache.java | 11 -- .../PrompterBuilderValueFromList.java | 7 +- 9 files changed, 17 insertions(+), 416 deletions(-) diff --git a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComboBox/JComboBoxExt.java b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComboBox/JComboBoxExt.java index 3f2ea59e..c333c1c5 100644 --- a/MultiSubDownloader/src/main/java/extensions/javax/swing/JComboBox/JComboBoxExt.java +++ b/MultiSubDownloader/src/main/java/extensions/javax/swing/JComboBox/JComboBoxExt.java @@ -28,34 +28,15 @@ public static JComboBox create(@ThisClass Class> thisClass, return new JComboBox<>(Iterables.toArray(items, elementType)); } - // public static E getSelectedObject(@This JComboBox comboBox) { - // return (E) comboBox.getSelectedItem(); - // } - public static E getSelectedValue(@This JComboBox comboBox) { return (E) comboBox.getSelectedItem(); } - // - // public static Optional getSelectedOptionalValue(@This JComboBox comboBox) { - // return Optional.ofNullable((E) comboBox.getSelectedItem()); - // } - // - // public static @Self JComboBox model(@This JComboBox comboBox, ComboBoxModel model) { - // comboBox.setModel(model); - // return comboBox; - // } public static @Self JComboBox renderer(@This JComboBox comboBox, ListCellRenderer renderer) { comboBox.setRenderer(renderer); return comboBox; } - // public static @Self JComboBox renderer(@This JComboBox comboBox, - // Function> rendererFunction) { - // comboBox.setRenderer(rendererFunction.apply(comboBox.getRenderer())); - // return comboBox; - // } - public static @Self JComboBox toStringRenderer(@This JComboBox comboBox, Function toStringRenderer) { return comboBox.renderer(ToStringListCellRenderer.of(comboBox.getRenderer(), toStringRenderer)); @@ -66,12 +47,6 @@ public static E getSelectedValue(@This JComboBox comboBox) { return comboBox.renderer(ToStringListCellRenderer.ofMessage(comboBox.getRenderer(), toStringRenderer)); } - - // public static @Self JComboBox itemListener(@This JComboBox comboBox, ItemListener itemListener) { - // comboBox.addItemListener(itemListener); - // return comboBox; - // } - public static @Self JComboBox itemListener(@This JComboBox comboBox, Runnable itemListener) { comboBox.addItemListener(_ -> itemListener.run()); return comboBox; @@ -83,82 +58,10 @@ public static E getSelectedValue(@This JComboBox comboBox) { return comboBox; } - // - // public static @Self JComboBox selectedIndex(@This JComboBox comboBox, int index) { - // comboBox.setSelectedIndex(index); - // return comboBox; - // } - // - // public static @Self JComboBox actionListener(@This JComboBox comboBox, ActionListener - // actionListener) { - // comboBox.addActionListener(actionListener); - // return comboBox; - // } - // - // public static @Self JComboBox eventConsumer(@This JComboBox comboBox, - // Consumer> actionListener) { - // //noinspection unchecked - // comboBox.addActionListener(event -> actionListener.accept((JComboBox) event.getSource())); - // return comboBox; - // } - // public static @Self JComboBox selectedItemConsumer(@This JComboBox comboBox, Consumer actionListener) { //noinspection unchecked - comboBox.addActionListener( - event -> actionListener.accept(((JComboBox) (event.getSource())).getSelectedValue())); + comboBox.addActionListener(ae -> actionListener.accept(((JComboBox) (ae.getSource())).getSelectedValue())); return comboBox; } - // - // public static @Self JComboBox border(@This JComboBox comboBox, Border border) { - // comboBox.setBorder(border); - // return comboBox; - // } - // - // public static @Self JComboBox enabled(@This JComboBox comboBox, boolean enabled) { - // comboBox.setEnabled(enabled); - // return comboBox; - // } - // - // public static @Self JComboBox items(@This JComboBox comboBox, E... items) { - // items.stream().forEach(comboBox::addItem); - // return comboBox; - // } - // - // // public static @Self JComboBox items(@This JComboBox comboBox, Iterable items) { - // // items.stream().forEach(comboBox::addItem); - // // return comboBox; - // // } - // // - // // public static @Self JComboBox items(@This JComboBox comboBox, BaseStream> - // items) { - // // items.iterator().stream().forEach(comboBox::addItem); - // // return comboBox; - // // } - // // - // // public static > @Self JComboBox enumItems(@This JComboBox comboBox) { - // // Class enumType = (Class) TypeResolver.resolveRawArguments(JComboBox.class, comboBox - // .getClass())[0]; - // // return comboBox.items(enumType.getEnumConstants()); - // // } - // - // public static @Self JComboBox toStringMapper(@This JComboBox comboBox, - // Function toStringMapper) { - // comboBox.setRenderer(new CustomComboBoxRenderer<>(toStringMapper)); - // return comboBox; - // } - // - // @RequiredArgsConstructor - // private static class CustomComboBoxRenderer extends BasicComboBoxRenderer { - // - // private final Function toStringMapper; - // - // @Override - // public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, - // boolean cellHasFocus) { - // Object newValue = value instanceof Icon || value == null ? value : toStringMapper.apply((T) value); - // super.getListCellRendererComponent(list, newValue, index, isSelected, cellHasFocus); - // return this; - // } - // } } diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/EventServiceProvider.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/EventServiceProvider.java index 73087d85..77445b9d 100644 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/EventServiceProvider.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/framework/service/providers/EventServiceProvider.java @@ -11,11 +11,6 @@ public class EventServiceProvider implements ServiceProvider { @val @override int priority = 0; - // @Override - // public int getPriority() { - // return 0; - // } - @Override public void register(Container app, UserInteractionHandler userInteractionHandler) { // Add EventEmitter to container diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java index d2a5ddf7..27f54212 100755 --- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java +++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/lib/library/FilenameLibraryBuilder.java @@ -1,5 +1,7 @@ package org.lodder.subtools.multisubdownloader.lib.library; +import static org.lodder.subtools.multisubdownloader.settings.model.structure.SerieStructureTag.*; + import java.nio.file.Path; import java.util.Map; @@ -7,7 +9,6 @@ import lombok.experimental.Accessors; import org.apache.commons.lang3.StringUtils; import org.lodder.subtools.multisubdownloader.settings.model.LibrarySettings; -import org.lodder.subtools.multisubdownloader.settings.model.structure.SerieStructureTag; import org.lodder.subtools.sublibrary.Language; import org.lodder.subtools.sublibrary.Manager; import org.lodder.subtools.sublibrary.data.tvdb.TheTvdbAdapter; @@ -125,20 +126,16 @@ public Path build(Release release) { case TvRelease tvRelease when StringUtils.isNotBlank(structure) -> { String fName = structure; // order is important! - fName = replace(fName, SerieStructureTag.SHOW_NAME, getShowName(tvRelease.name)); - fName = replaceFormattedEpisodeNumber(fName, SerieStructureTag.EPISODES_LONG, - tvRelease.episodeNumbers, true); - fName = replaceFormattedEpisodeNumber(fName, SerieStructureTag.EPISODES_SHORT, - tvRelease.episodeNumbers, false); - fName = replace(fName, SerieStructureTag.SEASON_LONG, formattedNumber(tvRelease.season, true)); - fName = replace(fName, SerieStructureTag.SEASON_SHORT, formattedNumber(tvRelease.season, false)); - fName = replace(fName, SerieStructureTag.EPISODE_LONG, - formattedNumber(tvRelease.firstEpisodeNumber, true)); - fName = replace(fName, SerieStructureTag.EPISODE_SHORT, - formattedNumber(tvRelease.firstEpisodeNumber, false)); - fName = replace(fName, SerieStructureTag.TITLE, tvRelease.title); - fName = replace(fName, SerieStructureTag.QUALITY, release.quality); - fName = replace(fName, SerieStructureTag.DESCRIPTION, release.description); + fName = replace(fName, SHOW_NAME, getShowName(tvRelease.name)); + fName = replaceFormattedEpisodeNumber(fName, EPISODES_LONG, tvRelease.episodeNumbers, true); + fName = replaceFormattedEpisodeNumber(fName, EPISODES_SHORT, tvRelease.episodeNumbers, false); + fName = replace(fName, SEASON_LONG, formattedNumber(tvRelease.season, true)); + fName = replace(fName, SEASON_SHORT, formattedNumber(tvRelease.season, false)); + fName = replace(fName, EPISODE_LONG, formattedNumber(tvRelease.firstEpisodeNumber, true)); + fName = replace(fName, EPISODE_SHORT, formattedNumber(tvRelease.firstEpisodeNumber, false)); + fName = replace(fName, TITLE, tvRelease.title); + fName = replace(fName, QUALITY, release.quality); + fName = replace(fName, DESCRIPTION, release.description); fName += "." + release.extension; yield fName; diff --git a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExt.java b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExt.java index 87625224..2893a56b 100644 --- a/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExt.java +++ b/SubLibrary/src/main/java/extensions/java/util/Optional/OptionalExt.java @@ -31,179 +31,6 @@ public static Optional mapThrowing(@This Optional ThrowingFunction function) throws X { return optional.isPresent() ? Optional.ofNullable(function.apply(optional.get())) : Optional.empty(); } - // - // /** - // * If a value is present, returns the result of applying the given {@code Optional}-bearing mapping - // function to the - // * value, otherwise returns an empty {@code Optional}. - // * - // *

- // * This method is similar to {@link Optional#map(Function)}, but the mapping function is one whose result - // is already - // * an {@code Optional}, and if invoked, {@code flatMap} does not wrap it within an additional {@code - // Optional}. - // * - // * @param optional input object of the extension method - // * @param The type of value of the input {@code Optional} - // * @param The type of exception that can be thrown by the {@code ThrowingFunction} - // * @param mapper the mapping function to apply to a value, if present - // * @return the result of applying an {@code Optional}-bearing mapping function to the value of this - // * {@code Optional}, if a value is present, otherwise an empty {@code Optional} - // * @throws X exception type of the throwing Function - // * @throws NullPointerException if the mapping function is {@code null} or returns a {@code null} result - // */ - // public static Optional flatMapThrowing(@This Optional optional, - // ThrowingFunction, X> mapper) throws X { - // if (optional.isEmpty()) { - // return Optional.empty(); - // } else { - // return Objects.requireNonNull(mapper.apply(optional.get())); - // } - // } - // - // /** - // * If a value is present, returns the value, otherwise returns the result produced by the supplying function. - // * - // * @param The type of value of the input {@code Optional} - // * @param The type of exception that can be thrown by the {@code ThrowingSupplier} - // * @param optional input object of the extension method - // * @param supplier the supplying function that produces a value to be returned - // * @return the value, if present, otherwise the result produced by the supplying function - // * @throws X exception type of the throwing Supplier - // * @throws NullPointerException if no value is present and the supplying function is {@code null} - // */ - // - // public static T orElseGetThrowing(@This Optional optional, - // ThrowingSupplier supplier) throws X { - // return optional.isPresent() ? optional.get() : supplier.get(); - // } - // - // /** - // * If a value is present, applies the given function on the value. Otherwise, get the value from the provided - // * supplier. - // * - // * @param The type of value of the input {@code Optional} - // * @param The type of value of the return value - // * @param optional input object of the extension method - // * @param ifPresentConsumer the function to be applied on the value, if present - // * @param emptyValue the value to return when no value is present - // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is - // * present and the given empty-based action is {@code null}. - // */ - // public static S applyOrElse(@This Optional optional, Function ifPresentConsumer, S - // emptyValue) { - // if (optional.isPresent()) { - // return ifPresentConsumer.apply(optional.get()); - // } else { - // return emptyValue; - // } - // } - // - // /** - // * If a value is present, applies the given function on the value. Otherwise, get the value from the provided - // * supplier. - // * - // * @param The type of value of the input {@code Optional} - // * @param The type of value of the return value - // * @param The type of exception that can be thrown by the {@code ThrowingConsumer} - // * @param optional input object of the extension method - // * @param ifPresentConsumer the function to be applied on the value, if present - // * @param emptyValue the value to return when no value is present - // * @throws X exception type of the throwing Consumer - // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is - // * present and the given empty-based action is {@code null}. - // */ - // public static S applyOrElseThrowing(@This Optional optional, - // ThrowingFunction ifPresentConsumer, S emptyValue) throws X { - // if (optional.isPresent()) { - // return ifPresentConsumer.apply(optional.get()); - // } else { - // return emptyValue; - // } - // } - // - // /** - // * If a value is present, applies the given function on the value. Otherwise, get the value from the provided - // * supplier. - // * - // * @param The type of value of the input {@code Optional} - // * @param The type of value of the return value - // * @param optional input object of the extension method - // * @param ifPresentConsumer the function to be applied on the value, if present - // * @param ifAbsentSupplier the supplier to create a value when no value is present - // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is - // * present and the given empty-based action is {@code null}. - // */ - // public static S applyOrElseGet(@This Optional optional, Function ifPresentConsumer, - // Supplier ifAbsentSupplier) { - // if (optional.isPresent()) { - // return ifPresentConsumer.apply(optional.get()); - // } else { - // return ifAbsentSupplier.get(); - // } - // } - // - // /** - // * If a value is present, applies the given function on the value. Otherwise, get the value from the provided - // * supplier. - // * - // * @param The type of value of the input {@code Optional} - // * @param The type of value of the return value - // * @param The type of exception that can be thrown by the {@code ThrowingConsumer} - // * @param optional input object of the extension method - // * @param ifPresentConsumer the function to be applied on the value, if present - // * @param ifAbsentSupplier the supplier to create a value when no value is present - // * @throws X exception type of the throwing Consumer - // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is - // * present and the given empty-based action is {@code null}. - // */ - // public static S applyElseGetThrowing(@This Optional optional, - // ThrowingFunction ifPresentConsumer, ThrowingSupplier ifAbsentSupplier) throws X { - // if (optional.isPresent()) { - // return ifPresentConsumer.apply(optional.get()); - // } else { - // return ifAbsentSupplier.get(); - // } - // } - // - // /** - // * If a value is present, performs the given action with the value, otherwise does nothing. - // * - // * @param The type of value of the input {@code Optional} - // * @param The type of exception that can be thrown by the {@code ThrowingConsumer} - // * @param optional input object of the extension method - // * @param consumer the action to be performed, if a value is present - // * @throws X exception type of the throwing Consumer - // * @throws NullPointerException if value is present and the given action is {@code null} - // */ - // public static void ifPresentThrowing(@This Optional optional, - // ThrowingConsumer consumer) throws X { - // if (optional.isPresent()) { - // consumer.accept(optional.get()); - // } - // } - // - // /** - // * If a value is present, performs the given action with the value, otherwise performs the given empty-based - // * action. - // * - // * @param The type of value of the input {@code Optional} - // * @param The type of exception that can be thrown by the {@code ThrowingConsumer} - // * @param optional input object of the extension method - // * @param ifPresentConsumer the action to be performed, if a value is present - // * @param ifAbsentRunnable the empty-based action to be performed, if no value is present - // * @throws X exception type of the throwing Consumer - // * @throws NullPointerException if a value is present and the given action is {@code null}, or no value is - // * present and the given empty-based action is {@code null}. - // */ - // public static void ifPresentOrElseThrowing(@This Optional optional, - // ThrowingConsumer ifPresentConsumer, ThrowingRunnable ifAbsentRunnable) throws X { - // if (optional.isPresent()) { - // ifPresentConsumer.accept(optional.get()); - // } else { - // ifAbsentRunnable.run(); - // } - // } public static OptionalInt mapToInt(@This Optional optional, ThrowingToIntFunction mapper) throws X { diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExt.java b/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExt.java index 8220c2b5..a44edfcf 100644 --- a/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExt.java +++ b/SubLibrary/src/main/java/extensions/java/util/OptionalInt/OptionalIntExt.java @@ -32,60 +32,12 @@ public static OptionalInt map(@This OptionalInt optional, return optional.isPresent() ? OptionalInt.of(function.applyAsInt(optional.getAsInt())) : OptionalInt .empty(); } - // - // /** - // * If the value is present, apply the {@link ThrowingUnaryOperator} and return the value wrapped in an @{link - // * Optional}. Otherwise, return an empty {@code Optional} - // * - // * @param optional input object of the extension method - // * @param function the function to apply to the value if present - // * @param type of the result value wrapped in the @{link Optional} - // * @param type of the exception that can be thrown - // * @return the result of the function wrapped in an @{link Optional} if the value is present, otherwise an - // empty - // * {@code Optional} - // * @throws X exception type of the throwing Function - // */ - // public static Optional mapToObj(@This OptionalInt optional, - // ThrowingFunction function) throws X { - // return optional.isPresent() ? Optional.ofNullable(function.apply(optional.getAsInt())) : Optional.empty(); - // } - - - // public static OptionalInt ifPresentDo(@This OptionalInt optional, - // ThrowingIntConsumer consumer) throws X { - // if (optional.isPresent()) { - // consumer.accept(optional.getAsInt()); - // } - // return optional; - // } - // - // //// - // - // public static void orElseDo(@This OptionalInt optional, ThrowingRunnable consumer) - // throws X { - // if (optional.isEmpty()) { - // consumer.run(); - // } - // } - // - // // - // public static OptionalInt orElseMap(@This OptionalInt optionalInt, ThrowingSupplier intSupplier) throws X { return optionalInt.isPresent() ? optionalInt : intSupplier.get(); } - // - - // public static T mapOrElseGet(@This OptionalInt optionalInt, - // ThrowingIntFunction ifPresentFunction, ThrowingSupplier absentSupplier) throws X { - // return optionalInt.isPresent() ? ifPresentFunction.apply(optionalInt.getAsInt()) : absentSupplier.get(); - // } - - // - public static Optional mapToObj(@This OptionalInt optionalInt, ThrowingIntFunction mapper) throws X { return optionalInt.isPresent() ? Optional.ofNullable(mapper.apply(optionalInt.getAsInt())) : Optional @@ -95,31 +47,4 @@ public static Optional mapToObj(@This OptionalInt op public static Integer orElseNull(@This OptionalInt optionalInt) { return optionalInt.isPresent() ? optionalInt.getAsInt() : null; } - // - // public static Optional mapToOptionalObj(@This OptionalInt optionalInt, - // ThrowingIntFunction, X> mapper) - // throws X { - // return optionalInt.isPresent() ? mapper.apply(optionalInt.getAsInt()) : Optional.empty(); - // } - // - // // - // - // public static OptionalInt filter(@This OptionalInt optionalInt, - // ThrowingIntPredicate predicate) - // throws X { - // return optionalInt.isPresent() && predicate.test(optionalInt.getAsInt()) ? optionalInt : OptionalInt - // .empty(); - // } - // - // // - // - // public static void ifPresentOrThrow(@This OptionalInt optionalInt, - // ThrowingIntConsumer consumer, - // Supplier exceptionSupplier) throws X { - // if (optionalInt.isPresent()) { - // consumer.accept(optionalInt.getAsInt()); - // } else { - // throw exceptionSupplier.get(); - // } - // } } diff --git a/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExt.java b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExt.java index 9fab3cc9..613e9fea 100644 --- a/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExt.java +++ b/SubLibrary/src/main/java/extensions/java/util/OptionalLong/OptionalLongExt.java @@ -47,36 +47,4 @@ public static Optional mapToObj(@This OptionalLong o ThrowingFunction function) throws X { return optional.isPresent() ? Optional.ofNullable(function.apply(optional.getAsLong())) : Optional.empty(); } - - // public static OptionalLong ifPresentDo(@This OptionalLong optional, - // ThrowingLongConsumer consumer) throws X { - // if (optional.isPresent()) { - // consumer.accept(optional.getAsLong()); - // } - // return optional; - // } - // - // //// - // - // public static void orElseDo(@This OptionalLong optional, ThrowingRunnable - // consumer) throws X { - // if (optional.isEmpty()) { - // consumer.run(); - // } - // } - // - // // - // - // public static Optional mapToObj(@This OptionalLong optionalLong, - // ThrowingLongFunction mapper) throws X { - // return optionalLong.isPresent() ? Optional.ofNullable(mapper.apply(optionalLong.getAsLong())) : - // Optional.empty(); - // } - // - // // - // - // public static OptionalLong map(@This OptionalLong optionalLong, - // ThrowingLongFunction mapper) throws X { - // return optionalLong.isPresent() ? OptionalLong.of(mapper.apply(optionalLong.getAsLong())) : optionalLong; - // } } diff --git a/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java index f1f43c65..fda5d617 100644 --- a/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java +++ b/SubLibrary/src/main/java/extensions/org/jsoup/select/Elements/ElementsExt.java @@ -29,10 +29,6 @@ public static String getAttr(@This @Nullable Elements elements, String attribute return elements == null ? null : elements.first(); } - // public static Stream stream(@This Elements elements) { - // return elements == null ? Stream.of() : elements.stream(); - // } - public static int getSize(@This Elements elements) { return elements == null ? 0 : elements.size(); } diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java index 7e6b127d..db8e6ca2 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/cache/TypedDiskCache.java @@ -13,17 +13,6 @@ public final class TypedDiskCache extends DiskCache { private final Function toObjectMapperKey; private final Function toStringMapperValue; private final Function toObjectMapperValue; - // @SuppressWarnings("unchecked") - // private final LazySupplier> keyType = - // new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this - // .getClass())[0]); - // @override @val(Protected) Class dbKeyType = keyType.get(); - // @SuppressWarnings("unchecked") - // private final LazySupplier> valueType = - // new LazySupplier<>(() -> (Class) TypeResolver.resolveRawArguments(TypedDiskCache.class, this - // .getClass())[1]); - // - // @override @val(Protected) Class dbValueType = valueType.get(); @Getter(lazy = true) @SuppressWarnings("unchecked") private final Class dbKeyType = diff --git a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java index caf7d97c..c4d66411 100644 --- a/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java +++ b/SubLibrary/src/main/java/org/lodder/subtools/sublibrary/util/prompter/PrompterBuilderValueFromList.java @@ -115,8 +115,8 @@ public Optional prompt(Prompter prompter) { value = prompter.prompt(message); } else { String choicesMessage = IntStream.range(0, elements.size()) - .mapToObj(number -> " - " + (number + 1) + ": " + toStringMapper.apply(elements.get(number))) - .collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator(); + .mapToObj(nbr -> " - " + (nbr + 1) + ": " + toStringMapper.apply(elements.get(nbr))) + .collect(Collectors.joining(System.lineSeparator())) + System.lineSeparator(); value = prompter.prompt(StringUtils.isBlank(message) ? choicesMessage : message + System.lineSeparator() + choicesMessage); } @@ -125,7 +125,8 @@ public Optional prompt(Prompter prompter) { } int number = Integer.parseInt(value); if (number < 1 || number > elements.size()) { - PrompterUtil.showMessage(prompter, "The entered value isn't in the range [1, %s], try again.", elements.size()); + PrompterUtil.showMessage(prompter, "The entered value isn't in the range [1, %s], try again.", + elements.size()); return prompt(prompter); } return Optional.ofNullable(elements.get(number - 1));