diff --git a/client/src/main/java/ctbrec/ui/settings/Sites.java b/client/src/main/java/ctbrec/ui/settings/Sites.java new file mode 100644 index 00000000..25a7a1cf --- /dev/null +++ b/client/src/main/java/ctbrec/ui/settings/Sites.java @@ -0,0 +1,15 @@ +package ctbrec.ui.settings; + +public enum Sites { + BONGACAMS, + CAM4, + CAMSODA, + CHATURBATE, + DREAMCAM, + FLIRT4FREE, + SHOWUP, + STREAMATE, + STREAMRAY, + STRIPCHAT, + XLOVECAM +} diff --git a/client/src/main/java/ctbrec/ui/settings/TabUtils.java b/client/src/main/java/ctbrec/ui/settings/TabUtils.java new file mode 100644 index 00000000..362f6634 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/settings/TabUtils.java @@ -0,0 +1,58 @@ +package ctbrec.ui.settings; + +import ctbrec.Config; +import ctbrec.Settings; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.ArrayList; + +import java.io.IOException; + +@Slf4j +public class TabUtils { + public static void toggleTab(Sites site, String tab, boolean selected) { + var settings = Config.getInstance().getSettings(); + List siteTabs = getTabsForSite(settings, site); + + if (selected) { + if (!siteTabs.contains(tab)) { + siteTabs.add(tab); + } + } else { + siteTabs.remove(tab); + } + save(); + } + + public static List getEnabledTabs(Sites site) { + var settings = Config.getInstance().getSettings(); + return new ArrayList<>(getTabsForSite(settings, site)); + } + + // Helper to dynamically get the correct tab list from settings + private static List getTabsForSite(Settings settings, Sites site) { + return switch (site) { + case BONGACAMS -> settings.bongaTabs; + case CAM4 -> settings.cam4Tabs; + case CAMSODA -> settings.camsodaTabs; + case CHATURBATE -> settings.chaturbateTabs; + case DREAMCAM -> settings.dreamcamTabs; + case FLIRT4FREE -> settings.flirt4freeTabs; + case SHOWUP -> settings.showupTabs; + case STREAMATE -> settings.streamateTabs; + case STREAMRAY -> settings.streamrayTabs; + case STRIPCHAT -> settings.stripchatTabs; + case XLOVECAM -> settings.xlovecamTabs; + default -> throw new IllegalArgumentException("Unknown site: " + site); + }; + } + + private static void save() { + try { + Config.getInstance().save(); + } catch (IOException e) { + log.error("Couldn't save config", e); + } + } +} diff --git a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java index 9f51d380..618fb062 100644 --- a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java @@ -14,6 +14,9 @@ import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; +import java.util.List; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; public class BongaCamsConfigUI extends AbstractConfigUI { private BongaCams bongaCams; @@ -85,6 +88,48 @@ public class BongaCamsConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(baseUrl, 2); layout.add(baseUrl, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.BONGACAMS); + + GridPane checkboxGrid = new GridPane(); + checkboxGrid.setHgap(10); + checkboxGrid.setVgap(5); + checkboxGrid.setPadding(new Insets(0, 0, 0, 7)); + + CheckBox female = new CheckBox("Female"); + female.setSelected(tabs.contains("female")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.BONGACAMS, "female", female.isSelected())); + checkboxGrid.add(female, 0, 0); + + CheckBox male = new CheckBox("Male"); + male.setSelected(tabs.contains("male")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.BONGACAMS, "male", male.isSelected())); + checkboxGrid.add(male, 1, 0); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("couples")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.BONGACAMS, "couples", couples.isSelected())); + checkboxGrid.add(couples, 2, 0); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("trans")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.BONGACAMS, "trans", trans.isSelected())); + checkboxGrid.add(trans, 0, 1); + + CheckBox newModels = new CheckBox("New"); + newModels.setSelected(tabs.contains("new")); + newModels.setOnAction(e -> TabUtils.toggleTab(Sites.BONGACAMS, "new", newModels.isSelected())); + checkboxGrid.add(newModels, 1, 1); + + CheckBox mobile = new CheckBox("Mobile"); + mobile.setSelected(tabs.contains("mobile")); + mobile.setOnAction(e -> TabUtils.toggleTab(Sites.BONGACAMS, "mobile", mobile.isSelected())); + checkboxGrid.add(mobile, 2, 1); + + layout.add(checkboxGrid, 1, row, 3, 2); + row += 2; + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(bongaCams.getAffiliateLink())); layout.add(createAccount, 1, row++); @@ -102,5 +147,4 @@ public class BongaCamsConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java index 7f14aee9..c0d3a9fc 100644 --- a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java @@ -8,10 +8,16 @@ import javafx.scene.Scene; import javafx.scene.control.Tab; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; public class BongaCamsTabProvider extends AbstractTabProvider { + private String url; + private PaginatedScheduledService updateService; private BongaCamsFriendsTab friendsTab; public BongaCamsTabProvider(BongaCams bongaCams) { @@ -22,35 +28,34 @@ public class BongaCamsTabProvider extends AbstractTabProvider { protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - // female - String url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=female&online_only=true&is_mobile=true&limit=72&offset="; - var updateService = new BongaCamsUpdateService((BongaCams) site, url); - tabs.add(createTab("Female", updateService)); - - // male - url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=male&online_only=true&is_mobile=true&limit=72&offset="; - updateService = new BongaCamsUpdateService((BongaCams) site, url); - tabs.add(createTab("Male", updateService)); - - // couples - url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=couples&online_only=true&is_mobile=true&limit=72&offset="; - updateService = new BongaCamsUpdateService((BongaCams) site, url); - tabs.add(createTab("Couples", updateService)); - - // trans - url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=transsexual&online_only=true&is_mobile=true&limit=72&offset="; - updateService = new BongaCamsUpdateService((BongaCams) site, url); - tabs.add(createTab("Transsexual", updateService)); - - // mobile - url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=all&online_only=true&tag=mobile-live&limit=72&offset="; - updateService = new BongaCamsUpdateService((BongaCams) site, url); - tabs.add(createTab("Mobile", updateService)); - - // new - url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=new&online_only=true&is_mobile=true&limit=72&offset="; - updateService = new BongaCamsUpdateService((BongaCams) site, url); - tabs.add(createTab("New", updateService)); + Map tabMap = new HashMap<>(); + tabMap.put("mobile", "Mobile"); + tabMap.put("new", "New"); + tabMap.put("female", "Female"); + tabMap.put("male", "Male"); + tabMap.put("couples", "Couples"); + tabMap.put("trans", "Trans"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.BONGACAMS); + for (String tab : enabledTabs) { + switch (tab) { + case "female": + case "male": + case "couples": + case "trans": + url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=" + tab + "&online_only=true&is_mobile=true&limit=72&offset="; + break; + case "new": + url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=new&online_only=true&is_mobile=true&limit=72&offset="; + break; + case "mobile": + url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=all&online_only=true&tag=mobile-live&limit=72&offset="; + break; + default: + } + updateService = new BongaCamsUpdateService((BongaCams) site, url); + String title = tabMap.getOrDefault(tab, tab); + tabs.add(createTab(title, updateService)); + } // friends url = site.getBaseUrl() + "/tools/listing_v3.php?livetab=friends&online_only=true&limit=72&offset="; diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java index 02dfed60..7d32a76f 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java @@ -1,9 +1,13 @@ package ctbrec.ui.sites.cam4; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.cam4.Cam4; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; @@ -72,6 +76,53 @@ public class Cam4ConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.CAM4); + + GridPane checkboxGrid = new GridPane(); + checkboxGrid.setHgap(10); + checkboxGrid.setVgap(5); + checkboxGrid.setPadding(new Insets(0, 0, 0, 7)); + + CheckBox female = new CheckBox("Female"); + female.setSelected(tabs.contains("female")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.CAM4, "female", female.isSelected())); + checkboxGrid.add(female, 0, 0); + + CheckBox male = new CheckBox("Male"); + male.setSelected(tabs.contains("male")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.CAM4, "male", male.isSelected())); + checkboxGrid.add(male, 1, 0); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("couples")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.CAM4, "couples", couples.isSelected())); + checkboxGrid.add(couples, 2, 0); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("shemale")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.CAM4, "shemale", trans.isSelected())); + checkboxGrid.add(trans, 3, 0); + + CheckBox newModels = new CheckBox("New"); + newModels.setSelected(tabs.contains("new")); + newModels.setOnAction(e -> TabUtils.toggleTab(Sites.CAM4, "new", newModels.isSelected())); + checkboxGrid.add(newModels, 0, 1); + + CheckBox hdModels = new CheckBox("HD"); + hdModels.setSelected(tabs.contains("hd")); + hdModels.setOnAction(e -> TabUtils.toggleTab(Sites.CAM4, "hd", hdModels.isSelected())); + checkboxGrid.add(hdModels, 1, 1); + + CheckBox mobile = new CheckBox("Mobile"); + mobile.setSelected(tabs.contains("mobile")); + mobile.setOnAction(e -> TabUtils.toggleTab(Sites.CAM4, "mobile", mobile.isSelected())); + checkboxGrid.add(mobile, 2, 1); + + layout.add(checkboxGrid, 1, row, 4, 2); + row += 2; + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(Cam4.AFFILIATE_LINK)); layout.add(createAccount, 1, row++); @@ -88,5 +139,4 @@ public class Cam4ConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java index 11119733..891b3dbd 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java @@ -1,13 +1,17 @@ package ctbrec.ui.sites.cam4; import ctbrec.sites.cam4.Cam4; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class Cam4TabProvider extends AbstractTabProvider { @@ -21,13 +25,36 @@ public class Cam4TabProvider extends AbstractTabProvider { protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Female", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&gender=female")); - tabs.add(createTab("Male", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&gender=male")); - tabs.add(createTab("Trans", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&gender=shemale")); - tabs.add(createTab("Couples", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&broadcastType=male_group&broadcastType=female_group&broadcastType=male_female_group")); - tabs.add(createTab("HD", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=VIDEO_QUALITY&gender=female&broadcastType=female_group&broadcastType=solo&broadcastType=male_female_group&hd=true")); - tabs.add(createTab("Mobile", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&gender=female&broadcastType=female_group&broadcastType=solo&broadcastType=male_female_group&source=mobile")); - tabs.add(createTab("New", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&gender=female&broadcastType=female_group&broadcastType=solo&broadcastType=male_female_group&newPerformer=true")); + Map tabMap = new HashMap<>(); + tabMap.put("male", "Male"); + tabMap.put("female", "Female"); + tabMap.put("shemale", "Trans"); + tabMap.put("couples", "Couples"); + tabMap.put("hd", "HD"); + tabMap.put("mobile", "Mobile"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.CAM4); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + switch (tab) { + case "female": + case "male": + case "shemale": + tabs.add(createTab(title, site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&gender=" + tab)); + break; + case "couples": + tabs.add(createTab("Couples", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&broadcastType=male_group&broadcastType=female_group&broadcastType=male_female_group")); + break; + case "hd": + tabs.add(createTab("HD", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=VIDEO_QUALITY&gender=female&broadcastType=female_group&broadcastType=solo&broadcastType=male_female_group&hd=true")); + break; + case "mobile": + tabs.add(createTab("Mobile", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&gender=female&broadcastType=female_group&broadcastType=solo&broadcastType=male_female_group&source=mobile")); + break; + case "new": + tabs.add(createTab("New", site.getBaseUrl() + "/directoryCams?directoryJson=true&online=true&url=true&orderBy=MOST_VIEWERS&gender=female&broadcastType=female_group&broadcastType=solo&broadcastType=male_female_group&newPerformer=true")); + default: + } + } followed = new Cam4FollowedTab((Cam4) site); followed.setRecorder(recorder); @@ -48,5 +75,4 @@ public class Cam4TabProvider extends AbstractTabProvider { tab.setRecorder(recorder); return tab; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java index eea13b4d..56a67a39 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java @@ -1,9 +1,13 @@ package ctbrec.ui.sites.camsoda; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.camsoda.Camsoda; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; @@ -72,6 +76,53 @@ public class CamsodaConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.CAMSODA); + + GridPane checkboxGrid = new GridPane(); + checkboxGrid.setHgap(10); + checkboxGrid.setVgap(5); + checkboxGrid.setPadding(new Insets(0, 0, 0, 7)); + + CheckBox female = new CheckBox("Girls"); + female.setSelected(tabs.contains("f")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.CAMSODA, "f", female.isSelected())); + checkboxGrid.add(female, 0, 0); + + CheckBox male = new CheckBox("Guys"); + male.setSelected(tabs.contains("m")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.CAMSODA, "m", male.isSelected())); + checkboxGrid.add(male, 1, 0); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("t")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.CAMSODA, "t", trans.isSelected())); + checkboxGrid.add(trans, 2, 0); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("c")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.CAMSODA, "c", couples.isSelected())); + checkboxGrid.add(couples, 3, 0); + + CheckBox isNew = new CheckBox("New"); + isNew.setSelected(tabs.contains("isNew")); + isNew.setOnAction(e -> TabUtils.toggleTab(Sites.CAMSODA, "isNew", isNew.isSelected())); + checkboxGrid.add(isNew, 0, 1); + + CheckBox voyeur = new CheckBox("Voyeur"); + voyeur.setSelected(tabs.contains("isVoyeur")); + voyeur.setOnAction(e -> TabUtils.toggleTab(Sites.CAMSODA, "isVoyeur", voyeur.isSelected())); + checkboxGrid.add(voyeur, 1, 1); + + CheckBox all = new CheckBox("All"); + all.setSelected(tabs.contains("all")); + all.setOnAction(e -> TabUtils.toggleTab(Sites.CAMSODA, "all", all.isSelected())); + checkboxGrid.add(all, 2, 1); + + layout.add(checkboxGrid, 1, row, 4, 2); + row += 2; + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(camsoda.getAffiliateLink())); layout.add(createAccount, 1, row++); @@ -88,5 +139,4 @@ public class CamsodaConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java index 3fad516b..2735c105 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java @@ -2,13 +2,17 @@ package ctbrec.ui.sites.camsoda; import ctbrec.sites.camsoda.Camsoda; import ctbrec.sites.camsoda.CamsodaModel; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.function.Predicate; @@ -27,13 +31,39 @@ public class CamsodaTabProvider extends AbstractTabProvider { @Override protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("All", API_URL, m -> true)); - tabs.add(createTab("New", API_URL, CamsodaModel::isNew)); - tabs.add(createTab("Female", API_URL, m -> Objects.equals("f", m.getGender()))); - tabs.add(createTab("Male", API_URL, m -> Objects.equals("m", m.getGender()))); - tabs.add(createTab("Couples", API_URL, m -> Objects.equals("c", m.getGender()))); - tabs.add(createTab("Trans", API_URL, m -> Objects.equals("t", m.getGender()))); - tabs.add(createTab("Voyeur", API_URL, CamsodaModel::isVoyeur)); + Map> methodMap = new HashMap<>(); + methodMap.put("isNew", CamsodaModel::isNew); + methodMap.put("isVoyeur", CamsodaModel::isVoyeur); + + Map tabMap = new HashMap<>(); + tabMap.put("all", "All"); + tabMap.put("m", "Guys"); + tabMap.put("f", "Girls"); + tabMap.put("c", "Couples"); + tabMap.put("t", "Trans"); + tabMap.put("isNew", "New"); + tabMap.put("isVoyeur", "Voyeur"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.CAMSODA); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + switch (tab) { + case "all": + tabs.add(createTab("All", API_URL, m -> true)); + break; + case "m": + case "f": + case "c": + case "t": + tabs.add(createTab(title, API_URL, m -> Objects.equals(tab, m.getGender()))); + break; + default: + if (tab.contains("is")) { + tabs.add(createTab(title, API_URL, methodMap.get(tab))); + } + break; + } + } + followedTab.setRecorder(recorder); followedTab.setScene(scene); tabs.add(followedTab); @@ -51,5 +81,4 @@ public class CamsodaTabProvider extends AbstractTabProvider { tab.setRecorder(recorder); return tab; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java index 98257394..129bb75e 100644 --- a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java @@ -1,23 +1,18 @@ package ctbrec.ui.sites.chaturbate; -import java.util.ArrayList; -import java.util.List; - import ctbrec.Config; import ctbrec.sites.chaturbate.Chaturbate; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; -import javafx.scene.control.Button; -import javafx.scene.control.CheckBox; -import javafx.scene.control.Label; -import javafx.scene.control.PasswordField; -import javafx.scene.control.TextField; +import javafx.scene.control.*; import javafx.scene.layout.GridPane; -import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; +import java.util.List; public class ChaturbateConfigUi extends AbstractConfigUI { private Chaturbate chaturbate; @@ -108,35 +103,97 @@ public class ChaturbateConfigUi extends AbstractConfigUI { GridPane.setColumnSpan(requestThrottle, 2); layout.add(requestThrottle, 1, row++); - Label regionsLabel = new Label("Region Tabs"); - layout.add(regionsLabel, 0, row); - List regions = getChaturbateRegions(); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.CHATURBATE); - HBox checkboxContainer = new HBox(10); + GridPane checkboxGrid = new GridPane(); + checkboxGrid.setHgap(10); + checkboxGrid.setVgap(5); + checkboxGrid.setPadding(new Insets(0, 0, 0, 7)); + + CheckBox female = new CheckBox("Female"); + female.setSelected(tabs.contains("f")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "f", female.isSelected())); + checkboxGrid.add(female, 0, 0); + + CheckBox newFemale = new CheckBox("New Female"); + newFemale.setSelected(tabs.contains("nf")); + newFemale.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "nf", newFemale.isSelected())); + checkboxGrid.add(newFemale, 1, 0); + + CheckBox male = new CheckBox("Male"); + male.setSelected(tabs.contains("m")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "m", male.isSelected())); + checkboxGrid.add(male, 2, 0); + + CheckBox newMale = new CheckBox("New Male"); + newMale.setSelected(tabs.contains("nm")); + newMale.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "nm", newMale.isSelected())); + checkboxGrid.add(newMale, 3, 0); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("c")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "c", couples.isSelected())); + checkboxGrid.add(couples, 0, 1); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("t")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "t", trans.isSelected())); + checkboxGrid.add(trans, 1, 1); + + CheckBox pvt = new CheckBox("Private"); + pvt.setSelected(tabs.contains("xp")); + pvt.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "xp", pvt.isSelected())); + checkboxGrid.add(pvt, 2, 1); + + CheckBox hidden = new CheckBox("Hidden"); + hidden.setSelected(tabs.contains("xh")); + hidden.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "xh", hidden.isSelected())); + checkboxGrid.add(hidden, 3, 1); + + CheckBox gaming = new CheckBox("Gaming"); + gaming.setSelected(tabs.contains("xg")); + gaming.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "xg", gaming.isSelected())); + checkboxGrid.add(gaming, 0, 2); + + CheckBox feat = new CheckBox("Featured"); + feat.setSelected(tabs.contains("ft")); + feat.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "ft", feat.isSelected())); + checkboxGrid.add(feat, 1, 2); + + CheckBox top = new CheckBox("Top Rated"); + top.setSelected(tabs.contains("ar")); + top.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "ar", top.isSelected())); + checkboxGrid.add(top, 2, 2); + + CheckBox trend = new CheckBox("Trending"); + trend.setSelected(tabs.contains("at")); + trend.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "at", trend.isSelected())); + checkboxGrid.add(trend, 3, 2); CheckBox asiaOther = new CheckBox("Asia/Oth"); - asiaOther.setSelected(regions.contains("AS,O")); - asiaOther.setOnAction(e -> toggleRegion("AS,O", asiaOther.isSelected())); - HBox.setMargin(asiaOther, new Insets(0, 0, 0, 7)); - checkboxContainer.getChildren().add(asiaOther); + asiaOther.setSelected(tabs.contains("AS,O")); + asiaOther.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "AS,O", asiaOther.isSelected())); + checkboxGrid.add(asiaOther, 0, 3); CheckBox euRu = new CheckBox("Eu/Ru"); - euRu.setSelected(regions.contains("ER")); - euRu.setOnAction(e -> toggleRegion("ER", euRu.isSelected())); - checkboxContainer.getChildren().add(euRu); + euRu.setSelected(tabs.contains("ER")); + euRu.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "ER", euRu.isSelected())); + checkboxGrid.add(euRu, 1, 3); CheckBox nthAm = new CheckBox("Nth Am"); - nthAm.setSelected(regions.contains("NA")); - nthAm.setOnAction(e -> toggleRegion("NA", nthAm.isSelected())); - checkboxContainer.getChildren().add(nthAm); + nthAm.setSelected(tabs.contains("NA")); + nthAm.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "NA", nthAm.isSelected())); + checkboxGrid.add(nthAm, 2, 3); CheckBox sthAm = new CheckBox("Sth Am"); - sthAm.setSelected(regions.contains("SA")); - sthAm.setOnAction(e -> toggleRegion("SA", sthAm.isSelected())); - checkboxContainer.getChildren().add(sthAm); + sthAm.setSelected(tabs.contains("SA")); + sthAm.setOnAction(e -> TabUtils.toggleTab(Sites.CHATURBATE, "SA", sthAm.isSelected())); + checkboxGrid.add(sthAm, 3, 3); - layout.add(checkboxContainer, 1, row, 4, 1); - row++; + layout.add(checkboxGrid, 1, row, 4, 4); + row += 4; var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(Chaturbate.REGISTRATION_LINK)); @@ -159,17 +216,4 @@ public class ChaturbateConfigUi extends AbstractConfigUI { return layout; } - private void toggleRegion(String region, boolean selected) { - var settings = Config.getInstance().getSettings(); - if (selected) { - settings.chaturbateRegions.add(region); - } else { - settings.chaturbateRegions.remove(region); - } - save(); - } - - private List getChaturbateRegions() { - return new ArrayList<>(Config.getInstance().getSettings().chaturbateRegions); - } } diff --git a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java index 8fb217f2..3792e575 100644 --- a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java @@ -1,7 +1,9 @@ package ctbrec.ui.sites.chaturbate; -import ctbrec.Config; +// import ctbrec.Config; import ctbrec.sites.chaturbate.Chaturbate; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.PaginatedScheduledService; import ctbrec.ui.tabs.ThumbOverviewTab; @@ -12,6 +14,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; public class ChaturbateTabProvider extends AbstractTabProvider { @@ -27,35 +30,93 @@ public class ChaturbateTabProvider extends AbstractTabProvider { @Override protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Featured", apiUrl + "/roomlist/room-list/?enable_recommendations=false")); - tabs.add(createTab("Female", apiUrl + "/roomlist/room-list/?enable_recommendations=false&genders=f")); - tabs.add(createTab("New Female", apiUrl + "/roomlist/room-list/?enable_recommendations=false&genders=f&new_cams=true")); - tabs.add(createTab("Male", apiUrl + "/roomlist/room-list/?enable_recommendations=false&genders=m")); - tabs.add(createTab("New Male", apiUrl + "/roomlist/room-list/?enable_recommendations=false&genders=m&new_cams=true")); - tabs.add(createTab("Couples", apiUrl + "/roomlist/room-list/?enable_recommendations=false&genders=c")); - tabs.add(createTab("Trans", apiUrl + "/roomlist/room-list/?enable_recommendations=false&genders=t")); - tabs.add(createTab("Private", apiUrl + "/roomlist/room-list/?enable_recommendations=false&private=true")); - tabs.add(createTab("Hidden", apiUrl + "/roomlist/room-list/?enable_recommendations=false&hidden=true")); - // tabs.add(createTab("Gaming", apiUrl + "/roomlist/room-list/?enable_recommendations=false&gaming=true")); - Map regionMap = new HashMap<>(); - regionMap.put("AS,O", "Asia/Oth"); - regionMap.put("ER", "Eu/Ru"); - regionMap.put("NA", "Nth Amer"); - regionMap.put("SA", "Sth Amer"); - List enabledRegions = getChaturbateRegions(); - for (String region : enabledRegions) { - String url = apiUrl + "/roomlist/room-list/?regions=" + region; - String title = regionMap.getOrDefault(region, region); - tabs.add(createTab(title, url)); + + Map tabMap = new HashMap<>(); + tabMap.put("f", "Female"); + tabMap.put("nf", "New Female"); + tabMap.put("m", "Male"); + tabMap.put("nm", "New Male"); + tabMap.put("c", "Couples"); + tabMap.put("t", "Trans"); + tabMap.put("ft", "Featured"); + tabMap.put("xp", "Private"); + tabMap.put("xh", "Hidden"); + tabMap.put("xg", "Gaming"); + tabMap.put("ar", "Top Rated"); + tabMap.put("at", "Trending"); + + for (String tab : TabUtils.getEnabledTabs(Sites.CHATURBATE)) { + String title = tabMap.getOrDefault(tab, tab); + switch (tab) { + case "ft": + tabs.add(createTab(title, apiUrl + "/roomlist/room-list/?enable_recommendations=false")); + break; + case "f": + case "m": + case "c": + case "t": + tabs.add(createTab(title, apiUrl + "/roomlist/room-list/?enable_recommendations=false&genders=" + tab)); + break; + case "nf": + addNewCamsTab(tabs, title, "f"); + break; + case "nm": + addNewCamsTab(tabs, title, "m"); + break; + case "xp": + tabs.add(createTab(title, apiUrl + "/roomlist/room-list/?enable_recommendations=false&private=true")); + break; + case "xh": + tabs.add(createTab(title, apiUrl + "/roomlist/room-list/?enable_recommendations=false&hidden=true")); + break; + case "xg": + tabs.add(createTab(title, apiUrl + "/roomlist/room-list/?enable_recommendations=false&gaming=true")); + break; + case "ar": + tabs.add(createApiTab(title, apiUrl + "/discover/carousels/top-rated/")); + break; + case "at": + tabs.add(createApiTab(title, apiUrl + "/discover/carousels/trending/")); + break; + default: + if (Pattern.matches("^[A-Z].+", tab)) { + addRegionBasedTab(tabs, tab); + } + break; + } } followedTab.setScene(scene); followedTab.setRecorder(recorder); followedTab.setImageAspectRatio(9.0 / 16.0); tabs.add(followedTab); - // tabs.add(createApiTab("Top Rated", apiUrl + "/discover/carousels/top-rated/")); - // tabs.add(createApiTab("Trending", apiUrl + "/discover/carousels/trending/")); return tabs; } + + private void addNewCamsTab(List tabs, String title, String gender) { + tabs.add(createTab(title, apiUrl + "/roomlist/room-list/?enable_recommendations=false&genders=" + gender + "&new_cams=true")); + } + + private void addRegionBasedTab(List tabs, String regionCode) { + String regions = getRegionTitle(regionCode); + if (regions != null) { + tabs.add(createTab(regions, apiUrl + "/roomlist/room-list/?enable_recommendations=false®ions=" + regionCode)); + } + } + + private String getRegionTitle(String regionCode) { + switch (regionCode) { + case "AS,O": + return "Asia/Oth"; + case "ER": + return "Eu/Ru"; + case "NA": + return "Nth Amer"; + case "SA": + return "Sth Amer"; + default: + return null; + } + } @Override public Tab getFollowedTab() { @@ -74,12 +135,8 @@ public class ChaturbateTabProvider extends AbstractTabProvider { return tab; } - // private Tab createApiTab(String title, String apiUrl) { - // var updateService = new ChaturbateApiUpdateService(apiUrl, (Chaturbate) site); - // return createTab(title, updateService); - // } - - private List getChaturbateRegions() { - return new ArrayList<>(Config.getInstance().getSettings().chaturbateRegions); + private Tab createApiTab(String title, String apiUrl) { + var updateService = new ChaturbateApiUpdateService(apiUrl, (Chaturbate) site); + return createTab(title, updateService); } } diff --git a/client/src/main/java/ctbrec/ui/sites/dreamcam/DreamcamConfigUI.java b/client/src/main/java/ctbrec/ui/sites/dreamcam/DreamcamConfigUI.java index 44fcf407..e2092c2f 100644 --- a/client/src/main/java/ctbrec/ui/sites/dreamcam/DreamcamConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/dreamcam/DreamcamConfigUI.java @@ -1,15 +1,17 @@ package ctbrec.ui.sites.dreamcam; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.dreamcam.Dreamcam; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; -import javafx.scene.control.ToggleGroup; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; -import javafx.scene.control.RadioButton; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; @@ -54,6 +56,36 @@ public class DreamcamConfigUI extends AbstractConfigUI { GridPane.setMargin(vr, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); layout.add(vr, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.DREAMCAM); + + HBox checkboxContainer = new HBox(10); + + CheckBox female = new CheckBox("Girls"); + female.setSelected(tabs.contains("girls")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.DREAMCAM, "girls", female.isSelected())); + HBox.setMargin(female, new Insets(0, 0, 0, 7)); + checkboxContainer.getChildren().add(female); + + CheckBox male = new CheckBox("Men"); + male.setSelected(tabs.contains("men")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.DREAMCAM, "men", male.isSelected())); + checkboxContainer.getChildren().add(male); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("couples")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.DREAMCAM, "couples", couples.isSelected())); + checkboxContainer.getChildren().add(couples); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("trans")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.DREAMCAM, "trans", trans.isSelected())); + checkboxContainer.getChildren().add(trans); + + layout.add(checkboxContainer, 1, row, 4, 1); + row++; + var deleteCookies = new Button("Delete Cookies"); deleteCookies.setOnAction(e -> site.getHttpClient().clearCookies()); layout.add(deleteCookies, 1, row); @@ -62,5 +94,4 @@ public class DreamcamConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/dreamcam/DreamcamTabProvider.java b/client/src/main/java/ctbrec/ui/sites/dreamcam/DreamcamTabProvider.java index 17226cc0..6fc47764 100644 --- a/client/src/main/java/ctbrec/ui/sites/dreamcam/DreamcamTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/dreamcam/DreamcamTabProvider.java @@ -1,11 +1,15 @@ package ctbrec.ui.sites.dreamcam; import ctbrec.sites.dreamcam.Dreamcam; -import ctbrec.sites.dreamcam.DreamcamModel; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; + import javafx.scene.Scene; import javafx.scene.control.Tab; @@ -19,10 +23,18 @@ public class DreamcamTabProvider extends AbstractTabProvider { @Override protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Girls", API_URL + "&tag-categories=girls")); - tabs.add(createTab("Boys", API_URL + "&tag-categories=men")); - tabs.add(createTab("Couples", API_URL + "&tag-categories=couples")); - tabs.add(createTab("Trans", API_URL + "&tag-categories=trans")); + + Map tabMap = new HashMap<>(); + tabMap.put("girls", "Girls"); + tabMap.put("men", "Men"); + tabMap.put("couples", "Couples"); + tabMap.put("trans", "Trans"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.DREAMCAM); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + tabs.add(createTab(title, API_URL + "&tag-categories=" + tab)); + } + return tabs; } @@ -33,5 +45,4 @@ public class DreamcamTabProvider extends AbstractTabProvider { tab.setRecorder(recorder); return tab; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeConfigUI.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeConfigUI.java index 3d146668..8fd76b6a 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeConfigUI.java @@ -1,9 +1,13 @@ package ctbrec.ui.sites.flirt4free; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.flirt4free.Flirt4Free; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; @@ -72,6 +76,43 @@ public class Flirt4FreeConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.FLIRT4FREE); + + GridPane checkboxGrid = new GridPane(); + checkboxGrid.setHgap(10); + checkboxGrid.setVgap(5); + checkboxGrid.setPadding(new Insets(0, 0, 0, 7)); + + CheckBox female = new CheckBox("Female"); + female.setSelected(tabs.contains("female")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.FLIRT4FREE, "female", female.isSelected())); + checkboxGrid.add(female, 0, 0); + + CheckBox newModels = new CheckBox("Girls New"); + newModels.setSelected(tabs.contains("hd")); + newModels.setOnAction(e -> TabUtils.toggleTab(Sites.FLIRT4FREE, "hd", newModels.isSelected())); + checkboxGrid.add(newModels, 1, 0); + + CheckBox male = new CheckBox("Male"); + male.setSelected(tabs.contains("male")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.FLIRT4FREE, "male", male.isSelected())); + checkboxGrid.add(male, 2, 0); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("couples")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.FLIRT4FREE, "couples", couples.isSelected())); + checkboxGrid.add(couples, 0, 1); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("trans")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.FLIRT4FREE, "trans", trans.isSelected())); + checkboxGrid.add(trans, 1, 1); + + layout.add(checkboxGrid, 1, row, 3, 2); + row += 2; + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(flirt4free.getAffiliateLink())); layout.add(createAccount, 1, row++); @@ -88,5 +129,4 @@ public class Flirt4FreeConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java index 56b2536b..1fbdbad6 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java @@ -2,6 +2,8 @@ package ctbrec.ui.sites.flirt4free; import ctbrec.sites.flirt4free.Flirt4Free; import ctbrec.sites.flirt4free.Flirt4FreeModel; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; @@ -9,7 +11,9 @@ import javafx.scene.control.Tab; import javafx.util.Duration; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.function.Predicate; public class Flirt4FreeTabProvider extends AbstractTabProvider { @@ -25,11 +29,36 @@ public class Flirt4FreeTabProvider extends AbstractTabProvider { @Override protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Girls", site.getBaseUrl() + "/live/girls/?tpl=index2&model=json", m -> true)); - tabs.add(createTab("New Girls", site.getBaseUrl() + "/live/girls/?tpl=index2&model=json", Flirt4FreeModel::isNew)); - tabs.add(createTab("Boys", site.getBaseUrl() + "/live/guys/?tpl=index2&model=json", m -> true)); - tabs.add(createTab("Couples", site.getBaseUrl() + "/live/couples/?tpl=index2&model=json", m -> m.getCategories().contains("2"))); - tabs.add(createTab("Trans", site.getBaseUrl() + "/live/trans/?tpl=index2&model=json", m -> true)); + + Map tabMap = new HashMap<>(); + tabMap.put("female", "Girls"); + tabMap.put("new", "New Girls"); + tabMap.put("male", "Guys"); + tabMap.put("couples", "Couples"); + tabMap.put("trans", "Trans"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.FLIRT4FREE); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + switch (tab) { + case "female": + tabs.add(createTab(title, site.getBaseUrl() + "/live/girls/?tpl=index2&model=json", m -> true)); + break; + case "new": + tabs.add(createTab(title, site.getBaseUrl() + "/live/girls/?tpl=index2&model=json", Flirt4FreeModel::isNew)); + break; + case "male": + tabs.add(createTab(title, site.getBaseUrl() + "/live/guys/?tpl=index2&model=json", m -> true)); + break; + case "couples": + tabs.add(createTab(title, site.getBaseUrl() + "/live/couples/?tpl=index2&model=json", m -> m.getCategories().contains("2"))); + break; + case "trans": + tabs.add(createTab(title, site.getBaseUrl() + "/live/trans/?tpl=index2&model=json", m -> true)); + break; + default: + } + } + tabs.add(followedTab); return tabs; } diff --git a/client/src/main/java/ctbrec/ui/sites/showup/ShowupConfigUI.java b/client/src/main/java/ctbrec/ui/sites/showup/ShowupConfigUI.java index 905568eb..9679ae99 100644 --- a/client/src/main/java/ctbrec/ui/sites/showup/ShowupConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/showup/ShowupConfigUI.java @@ -1,9 +1,13 @@ package ctbrec.ui.sites.showup; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.showup.Showup; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; @@ -13,6 +17,7 @@ import javafx.scene.control.Label; import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; public class ShowupConfigUI extends AbstractConfigUI { @@ -72,6 +77,31 @@ public class ShowupConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.SHOWUP); + + HBox checkboxContainer = new HBox(10); + + CheckBox female = new CheckBox("Female"); + female.setSelected(tabs.contains("female")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.SHOWUP, "female", female.isSelected())); + HBox.setMargin(female, new Insets(0, 0, 0, 8)); + checkboxContainer.getChildren().add(female); + + CheckBox male = new CheckBox("Male"); + male.setSelected(tabs.contains("male")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.SHOWUP, "male", male.isSelected())); + checkboxContainer.getChildren().add(male); + + CheckBox all = new CheckBox("All"); + all.setSelected(tabs.contains("all")); + all.setOnAction(e -> TabUtils.toggleTab(Sites.SHOWUP, "all", all.isSelected())); + checkboxContainer.getChildren().add(all); + + layout.add(checkboxContainer, 1, row, 3, 1); + row++; + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(site.getAffiliateLink())); layout.add(createAccount, 1, row++); @@ -88,5 +118,4 @@ public class ShowupConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/showup/ShowupTabProvider.java b/client/src/main/java/ctbrec/ui/sites/showup/ShowupTabProvider.java index 241bb25b..4ff94a4e 100644 --- a/client/src/main/java/ctbrec/ui/sites/showup/ShowupTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/showup/ShowupTabProvider.java @@ -1,13 +1,17 @@ package ctbrec.ui.sites.showup; import ctbrec.sites.showup.Showup; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class ShowupTabProvider extends AbstractTabProvider { @@ -18,9 +22,17 @@ public class ShowupTabProvider extends AbstractTabProvider { @Override protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Women", "female")); - tabs.add(createTab("Men", "male")); - tabs.add(createTab("All", "all")); + + Map tabMap = new HashMap<>(); + tabMap.put("female", "Women"); + tabMap.put("male", "Men"); + tabMap.put("all", "All"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.SHOWUP); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + tabs.add(createTab(title, tab)); + } + var showupFollowedTab = new ShowupFollowedTab("Favorites", (Showup) site); showupFollowedTab.setRecorder(site.getRecorder()); tabs.add(showupFollowedTab); diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateConfigUI.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateConfigUI.java index 5de1c327..f70991d7 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateConfigUI.java @@ -1,9 +1,13 @@ package ctbrec.ui.sites.streamate; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.streamate.Streamate; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; @@ -72,6 +76,48 @@ public class StreamateConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.STREAMATE); + + GridPane checkboxGrid = new GridPane(); + checkboxGrid.setHgap(10); + checkboxGrid.setVgap(5); + checkboxGrid.setPadding(new Insets(0, 0, 0, 7)); + + CheckBox female = new CheckBox("Girls"); + female.setSelected(tabs.contains("f,ff")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMATE, "f,ff", female.isSelected())); + checkboxGrid.add(female, 0, 0); + + CheckBox male = new CheckBox("Guys"); + male.setSelected(tabs.contains("m")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMATE, "m", male.isSelected())); + checkboxGrid.add(male, 1, 0); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("mf,mm")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMATE, "mf,mm", couples.isSelected())); + checkboxGrid.add(couples, 2, 0); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("tm2f,tf2m")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMATE, "tm2f,tf2m", trans.isSelected())); + checkboxGrid.add(trans, 0, 1); + + CheckBox newGirls = new CheckBox("Girls New"); + newGirls.setSelected(tabs.contains("fn")); + newGirls.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMATE, "fn", newGirls.isSelected())); + checkboxGrid.add(newGirls, 1, 1); + + CheckBox newModels = new CheckBox("New"); + newModels.setSelected(tabs.contains("new")); + newModels.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMATE, "new", newModels.isSelected())); + checkboxGrid.add(newModels, 2, 1); + + layout.add(checkboxGrid, 1, row, 3, 2); + row += 2; + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(streamate.getAffiliateLink())); layout.add(createAccount, 1, row++); @@ -88,5 +134,4 @@ public class StreamateConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateTabProvider.java b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateTabProvider.java index d48348d6..51f0b17e 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamate/StreamateTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/streamate/StreamateTabProvider.java @@ -1,13 +1,17 @@ package ctbrec.ui.sites.streamate; import ctbrec.sites.streamate.Streamate; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class StreamateTabProvider extends AbstractTabProvider { private ThumbOverviewTab followedTab; @@ -19,12 +23,35 @@ public class StreamateTabProvider extends AbstractTabProvider { @Override protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Girls", Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=gender:f,ff%3Bonline:true")); - tabs.add(createTab("Girls New", Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=gender:f,ff%3Bnew:true%3Bonline:true")); - tabs.add(createTab("Guys", Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=gender:m%3Bonline:true")); - tabs.add(createTab("Couples", Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=gender:mf,mm,g%3Bonline:true")); - tabs.add(createTab("Trans", Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=gender:tm2f,tf2m%3Bonline:true")); - tabs.add(createTab("New", Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=new:true%3Bonline:true")); + + + Map tabMap = new HashMap<>(); + tabMap.put("f,ff", "Girls"); + tabMap.put("m", "Guys"); + tabMap.put("mf,mm", "Couples"); + tabMap.put("tm2f,tf2m", "Trans"); + tabMap.put("fn", "Girls New"); + tabMap.put("new", "New"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.STREAMATE); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + switch (tab) { + case "f,ff": + case "m": + case "mf,mm": + case "tm2f,tf2m": + tabs.add(createTab(title, Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=gender:" + tab + "%3Bonline:true")); + break; + case "fn": + tabs.add(createTab("Girls New", Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=gender:f,ff%3Bonline:true%3Bnew:true")); + break; + case "new": + tabs.add(createTab("New", Streamate.NAIAD_URL + "/performers?domain=streamate.com&loggedInRec=1&boostedFilters=&country=US&language=en&index=default&filters=new:true%3Bonline:true")); + break; + default: + } + + } followedTab = new StreamateFollowedTab((Streamate) site); followedTab.setRecorder(recorder); diff --git a/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayConfigUI.java b/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayConfigUI.java index 3cc33e35..1e89dcb9 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayConfigUI.java @@ -1,15 +1,17 @@ package ctbrec.ui.sites.streamray; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.streamray.Streamray; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; -import javafx.scene.control.ToggleGroup; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; -import javafx.scene.control.RadioButton; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; @@ -55,6 +57,31 @@ public class StreamrayConfigUI extends AbstractConfigUI { layout.add(cb, 1, row++); row++; + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.STREAMRAY); + + HBox checkboxContainer = new HBox(10); + + CheckBox female = new CheckBox("Female"); + female.setSelected(tabs.contains("F")); + female.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMRAY, "F", female.isSelected())); + HBox.setMargin(female, new Insets(0, 0, 0, 7)); + checkboxContainer.getChildren().add(female); + + CheckBox male = new CheckBox("Male"); + male.setSelected(tabs.contains("M")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMRAY, "M", male.isSelected())); + checkboxContainer.getChildren().add(male); + + CheckBox all = new CheckBox("Trans"); + all.setSelected(tabs.contains("TS")); + all.setOnAction(e -> TabUtils.toggleTab(Sites.STREAMRAY, "TS", all.isSelected())); + checkboxContainer.getChildren().add(all); + + layout.add(checkboxContainer, 1, row, 4, 1); + row++; + var deleteCookies = new Button("Delete Cookies"); deleteCookies.setOnAction(e -> site.getHttpClient().clearCookies()); layout.add(deleteCookies, 1, row); @@ -63,5 +90,4 @@ public class StreamrayConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayTabProvider.java b/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayTabProvider.java index 8e1d41ce..de99d900 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayTabProvider.java @@ -2,13 +2,17 @@ package ctbrec.ui.sites.streamray; import ctbrec.sites.streamray.Streamray; import ctbrec.sites.streamray.StreamrayModel; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; import javafx.scene.control.Tab; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.function.Predicate; @@ -24,9 +28,17 @@ public class StreamrayTabProvider extends AbstractTabProvider { @Override protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Girls", m -> Objects.equals("F", m.getGender()))); - tabs.add(createTab("Boys", m -> Objects.equals("M", m.getGender()))); - tabs.add(createTab("Trans", m -> Objects.equals("TS", m.getGender()))); + + Map tabMap = new HashMap<>(); + tabMap.put("F", "Female"); + tabMap.put("M", "Male"); + tabMap.put("TS", "Trans"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.STREAMRAY); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + tabs.add(createTab(title, m -> Objects.equals(tab, m.getGender()))); + } + tabs.add(createTab("New", StreamrayModel::isNew)); tabs.add(followedTab); return tabs; diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java index 6e76c01c..44018ee7 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java @@ -1,9 +1,13 @@ package ctbrec.ui.sites.stripchat; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.stripchat.Stripchat; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; @@ -14,6 +18,7 @@ import javafx.scene.layout.Priority; public class StripchatConfigUI extends AbstractConfigUI { private final Stripchat stripchat; + private CheckBox vr; public StripchatConfigUI(Stripchat stripchat) { this.stripchat = stripchat; @@ -75,6 +80,7 @@ public class StripchatConfigUI extends AbstractConfigUI { Config.getInstance().getSettings().stripchatUseSuperchat = true; save(); }); + var hbox = new HBox(); hbox.getChildren().addAll(optionA, optionB, optionC); HBox.setMargin(optionA, new Insets(5)); @@ -112,6 +118,80 @@ public class StripchatConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.STRIPCHAT); + + GridPane checkboxGrid = new GridPane(); + checkboxGrid.setHgap(10); + checkboxGrid.setVgap(5); + checkboxGrid.setPadding(new Insets(0, 0, 0, 7)); + + CheckBox girls = new CheckBox("Girls"); + girls.setSelected(tabs.contains("girls")); + girls.setOnAction(e -> TabUtils.toggleTab(Sites.STRIPCHAT, "girls", girls.isSelected())); + checkboxGrid.add(girls, 0, 0); + + CheckBox girlsNew = new CheckBox("Girls New"); + girlsNew.setSelected(tabs.contains("autoTagNew")); + girlsNew.setOnAction(e -> TabUtils.toggleTab(Sites.STRIPCHAT, "autoTagNew", girlsNew.isSelected())); + checkboxGrid.add(girlsNew, 1, 0); + + CheckBox girlsHD = new CheckBox("Girls HD"); + girlsHD.setSelected(tabs.contains("autoTagHd")); + girlsHD.setOnAction(e -> TabUtils.toggleTab(Sites.STRIPCHAT, "autoTagHd", girlsHD.isSelected())); + checkboxGrid.add(girlsHD, 2, 0); + + CheckBox girlsVR = new CheckBox("Girls VR"); + girlsVR.setSelected(tabs.contains("autoTagVr")); + girlsVR.setOnAction(e -> { + TabUtils.toggleTab(Sites.STRIPCHAT, "autoTagVr", girlsVR.isSelected()); + settings.stripchatVR = girlsVR.isSelected(); + vr.setSelected(girlsVR.isSelected()); + save(); + }); + checkboxGrid.add(girlsVR, 3, 0); + + CheckBox mobile = new CheckBox("Mobile"); + mobile.setSelected(tabs.contains("mobile")); + mobile.setOnAction(e -> TabUtils.toggleTab(Sites.STRIPCHAT, "mobile", mobile.isSelected())); + checkboxGrid.add(mobile, 4, 0); + + CheckBox pvt = new CheckBox("Private"); + pvt.setSelected(tabs.contains("autoTagSpy")); + pvt.setOnAction(e -> TabUtils.toggleTab(Sites.STRIPCHAT, "autoTagSpy", pvt.isSelected())); + checkboxGrid.add(pvt, 0, 1); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("couples")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.STRIPCHAT, "couples", couples.isSelected())); + checkboxGrid.add(couples, 1, 1); + + CheckBox boys = new CheckBox("Boys"); + boys.setSelected(tabs.contains("men")); + boys.setOnAction(e -> TabUtils.toggleTab(Sites.STRIPCHAT, "men", boys.isSelected())); + checkboxGrid.add(boys, 2, 1); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("trans")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.STRIPCHAT, "trans", trans.isSelected())); + checkboxGrid.add(trans, 3, 1); + + layout.add(checkboxGrid, 1, row, 5, 2); + row += 2; + + l = new Label("Get VR stream if available"); + layout.add(l, 0, row); + vr = new CheckBox(); + vr.setSelected(settings.stripchatVR); + vr.setOnAction(e -> { + settings.stripchatVR = vr.isSelected(); + save(); + }); + GridPane.setMargin(vr, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); + layout.add(vr, 1, row); + row++; + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(stripchat.getAffiliateLink())); layout.add(createAccount, 1, row++); @@ -122,23 +202,10 @@ public class StripchatConfigUI extends AbstractConfigUI { layout.add(deleteCookies, 1, row++); GridPane.setColumnSpan(deleteCookies, 2); - row++; - l = new Label("Get VR stream if available"); - layout.add(l, 0, row); - var vr = new CheckBox(); - vr.setSelected(settings.stripchatVR); - vr.setOnAction(e -> { - settings.stripchatVR = vr.isSelected(); - save(); - }); - GridPane.setMargin(vr, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); - layout.add(vr, 1, row); - GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(createAccount, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java index 694e5e50..768b6af1 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java @@ -1,6 +1,8 @@ package ctbrec.ui.sites.stripchat; import ctbrec.sites.stripchat.Stripchat; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; @@ -8,7 +10,9 @@ import javafx.scene.control.Tab; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class StripchatTabProvider extends AbstractTabProvider { @@ -26,15 +30,29 @@ public class StripchatTabProvider extends AbstractTabProvider { @Override protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Girls", MessageFormat.format(urlTemplate, "girls"))); - tabs.add(createTab("Girls New", MessageFormat.format(urlFilterTemplate, "autoTagNew"))); - tabs.add(createTab("Girls HD", MessageFormat.format(urlFilterTemplate, "autoTagHd"))); - tabs.add(createTab("Girls VR", MessageFormat.format(urlFilterTemplate, "autoTagVr"))); - tabs.add(createTab("Mobile", MessageFormat.format(urlFilterTemplate, "mobile"))); - tabs.add(createTab("Private", MessageFormat.format(urlFilterTemplate, "autoTagSpy"))); - tabs.add(createTab("Couples", MessageFormat.format(urlTemplate, "couples"))); - tabs.add(createTab("Boys", MessageFormat.format(urlTemplate, "men"))); - tabs.add(createTab("Trans", MessageFormat.format(urlTemplate, "trans"))); + + Map tabMap = new HashMap<>(); + tabMap.put("girls", "Girls"); + tabMap.put("autoTagNew", "Girls New"); + tabMap.put("autoTagHd", "Girls HD"); + tabMap.put("autoTagVr", "Girls VR"); + tabMap.put("mobile", "Mobile"); + tabMap.put("autoTagSpy", "Private"); + tabMap.put("couples", "Couples"); + tabMap.put("men", "Boys"); + tabMap.put("trans", "Trans"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.STRIPCHAT); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + if (tab.contains("auto") || (tab.contains("mobile"))) { + tabs.add(createTab(title, MessageFormat.format(urlFilterTemplate, tab))); + } else { + tabs.add(createTab(title, MessageFormat.format(urlTemplate, tab))); + } + + } + // tabs.add(createTab("Girls VR", MessageFormat.format(urlFilterTemplate, "autoTagVr"))); + followedTab.setRecorder(recorder); followedTab.setScene(scene); followedTab.setImageAspectRatio(9.0 / 16.0); @@ -54,5 +72,4 @@ public class StripchatTabProvider extends AbstractTabProvider { tab.setImageAspectRatio(9.0 / 16.0); return tab; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/xlovecam/XloveCamConfigUI.java b/client/src/main/java/ctbrec/ui/sites/xlovecam/XloveCamConfigUI.java index b52d460c..f04a039f 100644 --- a/client/src/main/java/ctbrec/ui/sites/xlovecam/XloveCamConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/xlovecam/XloveCamConfigUI.java @@ -1,9 +1,13 @@ package ctbrec.ui.sites.xlovecam; +import java.util.List; + import ctbrec.Config; import ctbrec.sites.xlovecam.XloveCam; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.settings.SettingsTab; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractConfigUI; import javafx.geometry.Insets; import javafx.scene.Parent; @@ -72,6 +76,58 @@ public class XloveCamConfigUI extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); + Label tabsLabel = new Label("Tabs"); + layout.add(tabsLabel, 0, row); + List tabs = TabUtils.getEnabledTabs(Sites.XLOVECAM); + + GridPane checkboxGrid = new GridPane(); + checkboxGrid.setHgap(10); + checkboxGrid.setVgap(5); + checkboxGrid.setPadding(new Insets(0, 0, 0, 7)); + + CheckBox girls = new CheckBox("Young Women"); + girls.setSelected(tabs.contains("1")); + girls.setOnAction(e -> TabUtils.toggleTab(Sites.XLOVECAM, "1", girls.isSelected())); + checkboxGrid.add(girls, 0, 0); + + CheckBox ladies = new CheckBox("Ladies"); + ladies.setSelected(tabs.contains("13")); + ladies.setOnAction(e -> TabUtils.toggleTab(Sites.XLOVECAM, "13", ladies.isSelected())); + checkboxGrid.add(ladies, 1, 0); + + CheckBox mature = new CheckBox("Mature Female"); + mature.setSelected(tabs.contains("6")); + mature.setOnAction(e -> TabUtils.toggleTab(Sites.XLOVECAM, "6", mature.isSelected())); + checkboxGrid.add(mature, 2, 0); + + CheckBox couples = new CheckBox("Couples"); + couples.setSelected(tabs.contains("2")); + couples.setOnAction(e -> TabUtils.toggleTab(Sites.XLOVECAM, "2", couples.isSelected())); + checkboxGrid.add(couples, 3, 0); + + CheckBox lesbian = new CheckBox("Lesbian"); + lesbian.setSelected(tabs.contains("3")); + lesbian.setOnAction(e -> TabUtils.toggleTab(Sites.XLOVECAM, "3", lesbian.isSelected())); + checkboxGrid.add(lesbian, 0, 1); + + CheckBox male = new CheckBox("Male"); + male.setSelected(tabs.contains("7")); + male.setOnAction(e -> TabUtils.toggleTab(Sites.XLOVECAM, "7", male.isSelected())); + checkboxGrid.add(male, 1, 1); + + CheckBox trans = new CheckBox("Trans"); + trans.setSelected(tabs.contains("5")); + trans.setOnAction(e -> TabUtils.toggleTab(Sites.XLOVECAM, "5", trans.isSelected())); + checkboxGrid.add(trans, 2, 1); + + CheckBox all = new CheckBox("All"); + all.setSelected(tabs.contains("all")); + all.setOnAction(e -> TabUtils.toggleTab(Sites.XLOVECAM, "all", all.isSelected())); + checkboxGrid.add(all, 3, 1); + + layout.add(checkboxGrid, 1, row, 4, 2); + row += 2; + var createAccount = new Button("Create new Account"); createAccount.setOnAction(e -> DesktopIntegration.open(site.getAffiliateLink())); layout.add(createAccount, 1, row++); @@ -88,5 +144,4 @@ public class XloveCamConfigUI extends AbstractConfigUI { GridPane.setMargin(deleteCookies, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); return layout; } - } diff --git a/client/src/main/java/ctbrec/ui/sites/xlovecam/XloveCamTabProvider.java b/client/src/main/java/ctbrec/ui/sites/xlovecam/XloveCamTabProvider.java index 7c033303..87dc3a4e 100644 --- a/client/src/main/java/ctbrec/ui/sites/xlovecam/XloveCamTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/xlovecam/XloveCamTabProvider.java @@ -1,6 +1,8 @@ package ctbrec.ui.sites.xlovecam; import ctbrec.sites.xlovecam.XloveCam; +import ctbrec.ui.settings.Sites; +import ctbrec.ui.settings.TabUtils; import ctbrec.ui.sites.AbstractTabProvider; import ctbrec.ui.tabs.PaginatedScheduledService; import ctbrec.ui.tabs.ThumbOverviewTab; @@ -9,6 +11,7 @@ import javafx.scene.control.Tab; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,41 +31,32 @@ public class XloveCamTabProvider extends AbstractTabProvider { protected List getSiteTabs(Scene scene) { List tabs = new ArrayList<>(); - // all - var updateService = new XloveCamUpdateService(xloveCam, Collections.emptyMap()); - tabs.add(createTab("All", updateService)); - - // new - updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM_NEW, "3")); + // New ... it's here so as to declare updateService before use + var updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM_NEW, "3")); tabs.add(createTab("New", updateService)); - // Young Women - updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, "1")); - tabs.add(createTab("Young Women", updateService)); - - // Ladies - updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, "13")); - tabs.add(createTab("Ladies", updateService)); - - // Mature - updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, "6")); - tabs.add(createTab("Mature Female", updateService)); - - // Couples - updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, "2")); - tabs.add(createTab("Couples", updateService)); - - // Lesbian - updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, "3")); - tabs.add(createTab("Lesbian", updateService)); - - // Male - updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, "7")); - tabs.add(createTab("Male", updateService)); - - // Trans - updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, "5")); - tabs.add(createTab("Trans", updateService)); + Map tabMap = new HashMap<>(); + tabMap.put("1", "Young Women"); + tabMap.put("13", "Ladies"); + tabMap.put("6", "Mature Female"); + tabMap.put("2", "Couples"); + tabMap.put("3", "Lesbian"); + tabMap.put("7", "Male"); + tabMap.put("5", "Trans"); + tabMap.put("all", "All"); + List enabledTabs = TabUtils.getEnabledTabs(Sites.XLOVECAM); + for (String tab : enabledTabs) { + String title = tabMap.getOrDefault(tab, tab); + switch (tab) { + case "all": + updateService = new XloveCamUpdateService(xloveCam, Collections.emptyMap()); + break; + default: + updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, tab)); + break; + } + tabs.add(createTab(title, updateService)); + } return tabs; } @@ -72,5 +66,4 @@ public class XloveCamTabProvider extends AbstractTabProvider { tab.setRecorder(recorder); return tab; } - } diff --git a/common/src/main/java/ctbrec/Settings.java b/common/src/main/java/ctbrec/Settings.java index 71e29fe4..74a6f72d 100644 --- a/common/src/main/java/ctbrec/Settings.java +++ b/common/src/main/java/ctbrec/Settings.java @@ -42,19 +42,21 @@ public class Settings { TIME_OR_SIZE } - public String bongacamsBaseUrl = "https://bongacams.com"; public String bongaPassword = ""; public String bongaUsername = ""; + public List bongaTabs = new ArrayList<>(Arrays.asList("female")); public String cam4Password = ""; public String cam4Username = ""; + public List cam4Tabs = new ArrayList<>(Arrays.asList("female")); public String camsodaPassword = ""; public String camsodaUsername = ""; + public List camsodaTabs = new ArrayList<>(Arrays.asList("f")); public String chaturbatePassword = ""; public String chaturbateUsername = ""; public String chaturbateBaseUrl = "https://chaturbate.com"; public int chaturbateMsBetweenRequests = 3000; - public Set chaturbateRegions = new HashSet<>(); + public List chaturbateTabs = new ArrayList<>(Arrays.asList("f")); public boolean chooseStreamQuality = false; public String colorAccent = "#FFFFFF"; public String colorBase = "#FFFFFF"; @@ -65,8 +67,9 @@ public class Settings { public int defaultPriority = 50; public boolean deleteOrphanedRecordingMetadata = true; public boolean determineResolution = false; - public List disabledSites = new ArrayList<>(Arrays.asList("Streamray", "WinkTv")); + public List disabledSites = new ArrayList<>(Arrays.asList("WinkTv")); public String downloadFilename = "$sanitize(${modelName})_$sanitize(${siteName})_$format(${localDateTime}, yyyyMMdd-HHmmss)"; + public List dreamcamTabs = new ArrayList<>(Arrays.asList("girls")); public List eventHandlers = new ArrayList<>(); public boolean eventsSuspended = false; public boolean fastScrollSpeed = true; @@ -76,6 +79,7 @@ public class Settings { public String ffmpegFileSuffix = "ts"; public String flirt4freePassword; public String flirt4freeUsername; + public List flirt4freeTabs = new ArrayList<>(Arrays.asList("female")); public String fontFamily = "Sans-Serif"; public int fontSize = 14; public String hlsdlExecutable = "hlsdl"; @@ -83,8 +87,8 @@ public class Settings { public int httpSecurePort = 8443; public String httpServer = "localhost"; public int httpTimeout = 10000; - public String httpUserAgent = "Mozilla/5.0 (X11; Linux i686; rv:136.0) Gecko/20100101 Firefox/136.0"; - public String httpUserAgentMobile = "Mozilla/5.0 (Android 15; Mobile; rv:136.0) Gecko/136.0 Firefox/136.0"; + public String httpUserAgent = "Mozilla/5.0 (X11; Linux i686; rv:137.0) Gecko/20100101 Firefox/137.0"; + public String httpUserAgentMobile = "Mozilla/5.0 (Android 15; Mobile; rv:137.0) Gecko/137.0 Firefox/137.0"; public byte[] key = null; public List ignoredModels = new ArrayList<>(); public String lastDownloadDir = ""; @@ -122,7 +126,7 @@ public class Settings { public boolean monitorClipboard = false; public int onlineCheckIntervalInSecs = 60; public boolean onlineCheckSkipsPausedModels = true; - public int overviewUpdateIntervalInSecs = 10; + public int overviewUpdateIntervalInSecs = 15; @Deprecated public String password = ""; @Deprecated @@ -170,6 +174,7 @@ public class Settings { public boolean showPlayerStarting = false; public String showupUsername = ""; public String showupPassword = ""; + public List showupTabs = new ArrayList<>(Arrays.asList("female")); public boolean singlePlayer = true; @Deprecated public int splitRecordings = 0; @@ -180,8 +185,11 @@ public class Settings { public boolean startMinimized = false; public String streamatePassword = ""; public String streamateUsername = ""; + public List streamateTabs = new ArrayList<>(Arrays.asList("f,ff")); + public List streamrayTabs = new ArrayList<>(Arrays.asList("F")); public String stripchatUsername = ""; public String stripchatPassword = ""; + public List stripchatTabs = new ArrayList<>(Arrays.asList("girls")); public boolean stripchatUseXhamster = false; public boolean stripchatUseSuperchat = false; public List tabOrder = new ArrayList<>(); @@ -190,7 +198,7 @@ public class Settings { public LocalTime timeoutRecordingEndingAt = LocalTime.of(0, 0); public boolean totalModelCountInTitle = false; public boolean transportLayerSecurity = true; - public int thumbWidth = 180; + public int thumbWidth = 160; public boolean updateThumbnails = true; public boolean useHlsdl = false; @Deprecated @@ -205,6 +213,7 @@ public class Settings { public String webinterfacePassword = "sucks"; public String xlovecamUsername = ""; public String xlovecamPassword = ""; + public List xlovecamTabs = new ArrayList<>(Arrays.asList("1")); public boolean stripchatVR = true; public boolean streamrayRecordGoalShows = false; public int thumbCacheSize = 16;