diff --git a/src/main/java/ctbrec/Config.java b/src/main/java/ctbrec/Config.java index 8502cbc4..4ecf0f10 100644 --- a/src/main/java/ctbrec/Config.java +++ b/src/main/java/ctbrec/Config.java @@ -53,6 +53,9 @@ public class Config { BufferedSource source = buffer.readFrom(fin); settings = adapter.fromJson(source); settings.httpTimeout = Math.max(settings.httpTimeout, 10_000); + for (Site site : sites) { + site.setEnabled(!settings.disabledSites.contains(site.getName())); + } } } else { LOG.error("Config file does not exist. Falling back to default values."); diff --git a/src/main/java/ctbrec/Settings.java b/src/main/java/ctbrec/Settings.java index ef63a14c..97b8bcd4 100644 --- a/src/main/java/ctbrec/Settings.java +++ b/src/main/java/ctbrec/Settings.java @@ -43,4 +43,5 @@ public class Settings { public int windowX; public int windowY; public int splitRecordings = 0; + public List disabledSites = new ArrayList<>(); } diff --git a/src/main/java/ctbrec/sites/AbstractSite.java b/src/main/java/ctbrec/sites/AbstractSite.java new file mode 100644 index 00000000..05f98d69 --- /dev/null +++ b/src/main/java/ctbrec/sites/AbstractSite.java @@ -0,0 +1,16 @@ +package ctbrec.sites; + +public abstract class AbstractSite implements Site { + + private boolean enabled; + + @Override + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + @Override + public boolean isEnabled() { + return enabled; + } +} diff --git a/src/main/java/ctbrec/sites/Site.java b/src/main/java/ctbrec/sites/Site.java index 329e200a..411be906 100644 --- a/src/main/java/ctbrec/sites/Site.java +++ b/src/main/java/ctbrec/sites/Site.java @@ -26,4 +26,6 @@ public interface Site { public boolean isSiteForModel(Model m); public Node getConfigurationGui(); public boolean credentialsAvailable(); + public void setEnabled(boolean enabled); + public boolean isEnabled(); } diff --git a/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java b/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java index fb836226..2aa1fb7c 100644 --- a/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java +++ b/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java @@ -29,7 +29,7 @@ import ctbrec.Model; import ctbrec.Settings; import ctbrec.io.HttpClient; import ctbrec.recorder.Recorder; -import ctbrec.sites.Site; +import ctbrec.sites.AbstractSite; import ctbrec.ui.DesktopIntergation; import ctbrec.ui.HtmlParser; import ctbrec.ui.SettingsTab; @@ -47,7 +47,7 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -public class Chaturbate implements Site { +public class Chaturbate extends AbstractSite { private static final transient Logger LOG = LoggerFactory.getLogger(Chaturbate.class); public static final String BASE_URI = "https://chaturbate.com"; diff --git a/src/main/java/ctbrec/sites/mfc/MyFreeCams.java b/src/main/java/ctbrec/sites/mfc/MyFreeCams.java index 71feba57..c8544740 100644 --- a/src/main/java/ctbrec/sites/mfc/MyFreeCams.java +++ b/src/main/java/ctbrec/sites/mfc/MyFreeCams.java @@ -7,7 +7,7 @@ import org.jsoup.select.Elements; import ctbrec.Config; import ctbrec.Model; import ctbrec.recorder.Recorder; -import ctbrec.sites.Site; +import ctbrec.sites.AbstractSite; import ctbrec.ui.DesktopIntergation; import ctbrec.ui.HtmlParser; import ctbrec.ui.SettingsTab; @@ -23,7 +23,7 @@ import javafx.scene.layout.Priority; import okhttp3.Request; import okhttp3.Response; -public class MyFreeCams implements Site { +public class MyFreeCams extends AbstractSite { public static final String BASE_URI = "https://www.myfreecams.com"; @@ -158,7 +158,6 @@ public class MyFreeCams implements Site { return layout; } - @Override public boolean credentialsAvailable() { String username = Config.getInstance().getSettings().mfcUsername; diff --git a/src/main/java/ctbrec/ui/CamrecApplication.java b/src/main/java/ctbrec/ui/CamrecApplication.java index 8771fdd9..3e1f258f 100644 --- a/src/main/java/ctbrec/ui/CamrecApplication.java +++ b/src/main/java/ctbrec/ui/CamrecApplication.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.concurrent.Executors; @@ -65,14 +66,16 @@ public class CamrecApplication extends Application { hostServices = getHostServices(); createRecorder(); for (Site site : sites) { - try { - site.setRecorder(recorder); - site.init(); - if (!Objects.equals(System.getenv("CTBREC_DEV"), "1")) { - site.login(); + if(site.isEnabled()) { + try { + site.setRecorder(recorder); + site.init(); + if (!Objects.equals(System.getenv("CTBREC_DEV"), "1")) { + site.login(); + } + } catch(Exception e) { + LOG.error("Error while initializing site {}", site.getName(), e); } - } catch(Exception e) { - LOG.error("Error while initializing site {}", site.getName(), e); } } createGui(primaryStage); @@ -90,11 +93,16 @@ public class CamrecApplication extends Application { rootPane = new TabPane(); Scene scene = new Scene(rootPane, windowWidth, windowHeight); primaryStage.setScene(scene); - for (Site site : sites) { - SiteTab siteTab = new SiteTab(site, scene); - rootPane.getTabs().add(siteTab); + for (Iterator iterator = sites.iterator(); iterator.hasNext();) { + Site site = iterator.next(); + if(site.isEnabled()) { + SiteTab siteTab = new SiteTab(site, scene); + rootPane.getTabs().add(siteTab); + } } - ((SiteTab)rootPane.getTabs().get(0)).selected(); + try { + ((SiteTab)rootPane.getTabs().get(0)).selected(); + } catch(ClassCastException | IndexOutOfBoundsException e) {} RecordedModelsTab modelsTab = new RecordedModelsTab("Recording", recorder, sites); rootPane.getTabs().add(modelsTab); @@ -129,7 +137,9 @@ public class CamrecApplication extends Application { settingsTab.saveConfig(); recorder.shutdown(); for (Site site : sites) { - site.shutdown(); + if(site.isEnabled()) { + site.shutdown(); + } } try { Config.getInstance().save(); diff --git a/src/main/java/ctbrec/ui/ProxySettingsPane.java b/src/main/java/ctbrec/ui/ProxySettingsPane.java index 0f592599..f1015cf5 100644 --- a/src/main/java/ctbrec/ui/ProxySettingsPane.java +++ b/src/main/java/ctbrec/ui/ProxySettingsPane.java @@ -24,8 +24,10 @@ public class ProxySettingsPane extends TitledPane implements EventHandler splitAfter; private List sites; + private Label restartLabel; public SettingsTab(List sites) { this.sites = sites; @@ -74,6 +77,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { } private void createGui() { + // set up main layout, 2 columns with VBoxes 50/50 GridPane mainLayout = createGridLayout(); mainLayout.setHgap(15); mainLayout.setVgap(15); @@ -82,22 +86,33 @@ public class SettingsTab extends Tab implements TabSelectionListener { cc.setPercentWidth(50); mainLayout.getColumnConstraints().setAll(cc, cc); setContent(mainLayout); - VBox leftSide = new VBox(15); VBox rightSide = new VBox(15); GridPane.setHgrow(leftSide, Priority.ALWAYS); GridPane.setHgrow(rightSide, Priority.ALWAYS); GridPane.setFillWidth(leftSide, true); GridPane.setFillWidth(rightSide, true); - mainLayout.add(leftSide, 0, 0); - mainLayout.add(rightSide, 1, 0); + mainLayout.add(leftSide, 0, 1); + mainLayout.add(rightSide, 1, 1); + // restart info label + restartLabel = new Label("A restart is required to apply changes you made!"); + restartLabel.setVisible(false); + restartLabel.setFont(Font.font(24)); + restartLabel.setTextFill(Color.RED); + mainLayout.add(restartLabel, 0, 0); + GridPane.setColumnSpan(restartLabel, 2); + GridPane.setHalignment(restartLabel, HPos.CENTER); + + // left side leftSide.getChildren().add(createGeneralPanel()); leftSide.getChildren().add(createLocationsPanel()); leftSide.getChildren().add(createRecordLocationPanel()); - proxySettingsPane = new ProxySettingsPane(); + proxySettingsPane = new ProxySettingsPane(this); leftSide.getChildren().add(proxySettingsPane); + //right side + rightSide.getChildren().add(createSiteSelectionPanel()); for (Site site : sites) { Node siteConfig = site.getConfigurationGui(); if(siteConfig != null) { @@ -108,6 +123,34 @@ public class SettingsTab extends Tab implements TabSelectionListener { } } + private Node createSiteSelectionPanel() { + Settings settings = Config.getInstance().getSettings(); + GridPane layout = createGridLayout(); + + int row = 0; + for (Site site : sites) { + Label l = new Label(site.getName()); + layout.add(l, 0, row); + CheckBox enabled = new CheckBox(); + enabled.setSelected(!settings.disabledSites.contains(site.getName())); + enabled.setOnAction((e) -> { + if(enabled.isSelected()) { + settings.disabledSites.remove(site.getName()); + } else { + settings.disabledSites.add(site.getName()); + } + showRestartRequired(); + }); + GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, 0, 0)); + GridPane.setMargin(enabled, new Insets(CHECKBOX_MARGIN, 0, 0, CHECKBOX_MARGIN)); + layout.add(enabled, 1, row++); + } + + TitledPane siteSelection = new TitledPane("Enabled Sites", layout); + siteSelection.setCollapsible(false); + return siteSelection; + } + private Node createRecordLocationPanel() { GridPane layout = createGridLayout(); Label l = new Label("Record Location"); @@ -284,12 +327,8 @@ public class SettingsTab extends Tab implements TabSelectionListener { } } - static void showRestartRequired() { - Alert restart = new AutosizeAlert(AlertType.INFORMATION); - restart.setTitle("Restart required"); - restart.setHeaderText("Restart required"); - restart.setContentText("Changes get applied after a restart of the application"); - restart.show(); + void showRestartRequired() { + restartLabel.setVisible(true); } public static GridPane createGridLayout() {