From d88e5ab960be237b1fe49c28335ff26fd4d4126f Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sat, 5 Dec 2020 22:39:03 +0100 Subject: [PATCH] Add GUI for setting splitRecordingsBiggerThanBytes --- CHANGELOG.md | 7 ++ .../ui/settings/CtbrecPreferencesStorage.java | 4 + .../java/ctbrec/ui/settings/SettingsTab.java | 117 ++++++++++++++++-- .../java/ctbrec/ui/settings/api/Setting.java | 11 ++ 4 files changed, 131 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bae03aa..c9802796 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +3.10.7 +======================== +* Fixed credentials related bugs for Streamate and Stripchat + They used the user name from Chaturbate for some requests. Whoopsie! +* Renamed settings for Chaturbate's user name and password +* Add setting to split recordings by size + 3.10.6 ======================== * Fixed Cam4 downloads diff --git a/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java b/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java index b3bb8180..246559e7 100644 --- a/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java +++ b/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java @@ -28,6 +28,7 @@ import javafx.beans.property.ListProperty; import javafx.beans.property.LongProperty; import javafx.beans.property.Property; import javafx.beans.property.StringProperty; +import javafx.beans.value.ChangeListener; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.CheckBox; @@ -267,6 +268,9 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { } config.save(); })); + if(setting.getChangeListener() != null) { + comboBox.valueProperty().addListener((ChangeListener) setting.getChangeListener()); + } return comboBox; } diff --git a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java index 4d2c2e51..c01ed574 100644 --- a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java +++ b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java @@ -2,6 +2,7 @@ package ctbrec.ui.settings; import static ctbrec.Settings.DirectoryStructure.*; import static ctbrec.Settings.ProxyType.*; +import static ctbrec.Settings.SplitStrategy.*; import static java.util.Optional.*; import java.io.IOException; @@ -57,6 +58,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { private static final Logger LOG = LoggerFactory.getLogger(SettingsTab.class); public static final int CHECKBOX_MARGIN = 6; + private static final long MiB = 1024 * 1024L; + private static final long GiB = 1024 * MiB; private List sites; private Recorder recorder; @@ -85,6 +88,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { private SimpleDirectoryProperty recordingsDir; private SimpleListProperty directoryStructure; private SimpleListProperty splitAfter; + private SimpleListProperty splitBiggerThan; private SimpleRangeProperty resolutionRange; private List labels = Arrays.asList(0, 240, 360, 480, 600, 720, 960, 1080, 1440, 2160, 4320, 8640); private List values = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); @@ -104,8 +108,6 @@ public class SettingsTab extends Tab implements TabSelectionListener { private ExclusiveSelectionProperty recordLocal; private SimpleIntegerProperty postProcessingThreads; private IgnoreList ignoreList; - private PostProcessingStepPanel postProcessingStepPanel; - private Button variablesHelpButton; public SettingsTab(List sites, Recorder recorder) { this.sites = sites; @@ -137,7 +139,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { proxyPassword = new SimpleStringProperty(null, "proxyPassword", settings.proxyPassword); recordingsDir = new SimpleDirectoryProperty(null, "recordingsDir", settings.recordingsDir); directoryStructure = new SimpleListProperty<>(null, "recordingsDirStructure", FXCollections.observableList(List.of(FLAT, ONE_PER_MODEL, ONE_PER_RECORDING))); - splitAfter = new SimpleListProperty<>(null, "splitRecordings", FXCollections.observableList(getSplitOptions())); + splitAfter = new SimpleListProperty<>(null, "splitRecordingsAfterSecs", FXCollections.observableList(getSplitAfterSecsOptions())); + splitBiggerThan = new SimpleListProperty<>(null, "splitRecordingsBiggerThanBytes", FXCollections.observableList(getSplitBiggerThanOptions())); resolutionRange = new SimpleRangeProperty<>(rangeValues, "minimumResolution", "maximumResolution", settings.minimumResolution, settings.maximumResolution); concurrentRecordings = new SimpleIntegerProperty(null, "concurrentRecordings", settings.concurrentRecordings); onlineCheckIntervalInSecs = new SimpleIntegerProperty(null, "onlineCheckIntervalInSecs", settings.onlineCheckIntervalInSecs); @@ -157,8 +160,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { } private void createGui() { - postProcessingStepPanel = new PostProcessingStepPanel(config); - variablesHelpButton = createHelpButton("Variables", "http://localhost:5689/docs/PostProcessing.md#variables"); + PostProcessingStepPanel postProcessingStepPanel = new PostProcessingStepPanel(config); + Button variablesHelpButton = createHelpButton("Variables", "http://localhost:5689/docs/PostProcessing.md#variables"); ignoreList = new IgnoreList(sites); List siteCategories = new ArrayList<>(); for (Site site : sites) { @@ -191,7 +194,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { Group.of("Settings", Setting.of("Recordings Directory", recordingsDir), Setting.of("Directory Structure", directoryStructure), - Setting.of("Split recordings after (minutes)", splitAfter).converter(SplitAfterOption.converter()), + Setting.of("Split recordings after", splitAfter).converter(SplitAfterOption.converter()).onChange(this::splitValuesChanged), + Setting.of("Split recordings bigger than", splitBiggerThan).converter(SplitBiggerThanOption.converter()).onChange(this::splitValuesChanged), Setting.of("Restrict Resolution", resolutionRange, "Only record streams with resolution within the given range"), Setting.of("Concurrent Recordings (0 = unlimited)", concurrentRecordings), Setting.of("Leave space on device (GiB)", leaveSpaceOnDevice, "Stop recording, if the free space on the device gets below this threshold").converter(new GigabytesConverter()), @@ -251,7 +255,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { prefs.getSetting("requireAuthentication").ifPresent(s -> bindEnabledProperty(s, recordLocal)); prefs.getSetting("transportLayerSecurity").ifPresent(s -> bindEnabledProperty(s, recordLocal)); prefs.getSetting("recordingsDir").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); - prefs.getSetting("splitRecordings").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); + prefs.getSetting("splitRecordingsAfterSecs").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); + prefs.getSetting("splitRecordingsBiggerThanBytes").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); prefs.getSetting("minimumResolution").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); prefs.getSetting("recordingsDirStructure").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); prefs.getSetting("onlineCheckIntervalInSecs").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); @@ -266,6 +271,23 @@ public class SettingsTab extends Tab implements TabSelectionListener { prefs.getSetting("downloadFilename").ifPresent(s -> bindEnabledProperty(s, recordLocal)); postProcessingStepPanel.disableProperty().bind(recordLocal.not()); variablesHelpButton.disableProperty().bind(recordLocal); + + + } + + private void splitValuesChanged(ObservableValue value, Object oldV, Object newV) { + boolean splitAfterSet = settings.splitRecordingsAfterSecs > 0; + boolean splitBiggerThanSet = settings.splitRecordingsBiggerThanBytes > 0; + if (splitAfterSet && splitBiggerThanSet) { + settings.splitStrategy = TIME_OR_SIZE; + } else if (splitAfterSet) { + settings.splitStrategy = TIME; + } else if (splitBiggerThanSet) { + settings.splitStrategy = SIZE; + } else { + settings.splitStrategy = DONT; + } + saveConfig(); } private Button createHelpButton(String text, String url) { @@ -288,7 +310,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { .collect(Collectors.toList()); } - private List getSplitOptions() { + private List getSplitAfterSecsOptions() { List splitOptions = new ArrayList<>(); splitOptions.add(new SplitAfterOption("disabled", 0)); if (Config.isDevMode()) { @@ -304,6 +326,29 @@ public class SettingsTab extends Tab implements TabSelectionListener { return splitOptions; } + private List getSplitBiggerThanOptions() { + List splitOptions = new ArrayList<>(); + splitOptions.add(new SplitBiggerThanOption("disabled", 0)); + if (Config.isDevMode()) { + splitOptions.add(new SplitBiggerThanOption("10 MiB", 10 * MiB)); + splitOptions.add(new SplitBiggerThanOption("20 MiB", 20 * MiB)); + } + splitOptions.add(new SplitBiggerThanOption("100 MiB", 100 * MiB)); + splitOptions.add(new SplitBiggerThanOption("250 MiB", 250 * MiB)); + splitOptions.add(new SplitBiggerThanOption("500 MiB", 500 * MiB)); + splitOptions.add(new SplitBiggerThanOption("1 GiB", 1 * GiB)); + splitOptions.add(new SplitBiggerThanOption("2 GiB", 2 * GiB)); + splitOptions.add(new SplitBiggerThanOption("3 GiB", 3 * GiB)); + splitOptions.add(new SplitBiggerThanOption("4 GiB", 4 * GiB)); + splitOptions.add(new SplitBiggerThanOption("5 GiB", 5 * GiB)); + splitOptions.add(new SplitBiggerThanOption("6 GiB", 6 * GiB)); + splitOptions.add(new SplitBiggerThanOption("7 GiB", 7 * GiB)); + splitOptions.add(new SplitBiggerThanOption("8 GiB", 8 * GiB)); + splitOptions.add(new SplitBiggerThanOption("9 GiB", 9 * GiB)); + splitOptions.add(new SplitBiggerThanOption("10 GiB", 10 * GiB)); + return splitOptions; + } + private void requireAuthenticationChanged(ObservableValue obs, Boolean oldV, Boolean newV) { // NOSONAR boolean requiresAuthentication = newV; Config.getInstance().getSettings().requireAuthentication = requiresAuthentication; @@ -415,4 +460,60 @@ public class SettingsTab extends Tab implements TabSelectionListener { }; } } + + public static class SplitBiggerThanOption { + private String label; + private long value; + + public SplitBiggerThanOption(String label, long value) { + super(); + this.label = label; + this.value = value; + } + + public long getValue() { + return value; + } + + @Override + public String toString() { + return label; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (value ^ (value >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SplitBiggerThanOption other = (SplitBiggerThanOption) obj; + if (value != other.value) + return false; + return true; + } + + public static ValueConverter converter() { + return new ValueConverter() { + @Override + public Long convertFrom(Object splitBiggerThanOption) { + return ((SplitBiggerThanOption) splitBiggerThanOption).getValue(); + } + + @Override + public SplitBiggerThanOption convertTo(Object value) { + return new SplitBiggerThanOption(value.toString(), (Long) value); + } + }; + } + } } diff --git a/client/src/main/java/ctbrec/ui/settings/api/Setting.java b/client/src/main/java/ctbrec/ui/settings/api/Setting.java index 98acb0a6..d89e9de3 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/Setting.java +++ b/client/src/main/java/ctbrec/ui/settings/api/Setting.java @@ -4,6 +4,7 @@ import static java.util.Optional.*; import ctbrec.StringUtil; import javafx.beans.property.Property; +import javafx.beans.value.ChangeListener; import javafx.scene.Node; import javafx.scene.control.Control; import javafx.scene.control.Tooltip; @@ -17,6 +18,7 @@ public class Setting { private PreferencesStorage preferencesStorage; private boolean needsRestart = false; private ValueConverter converter; + private ChangeListener changeListener; protected Setting(String name, Property property) { this.name = name; @@ -107,4 +109,13 @@ public class Setting { public ValueConverter getConverter() { return converter; } + + public Setting onChange(ChangeListener changeListener) { + this.changeListener = changeListener; + return this; + } + + public ChangeListener getChangeListener() { + return changeListener; + } }