Add optional tabs

This commit is contained in:
jafea7 2025-04-10 15:17:55 +10:00
parent 06bf0f98cd
commit 0a8230f2b2
25 changed files with 144 additions and 60 deletions

View File

@ -66,7 +66,8 @@ public class DesktopIntegration {
var externalHelpers = new String[]{"kde-open5", "kde-open", "gnome-open", "xdg-open"};
for (String helper : externalHelpers) {
try {
rt.exec(helper + " " + uri);
ProcessBuilder pb = new ProcessBuilder(helper, uri);
pb.start();
return;
} catch (IOException e) {
LOG.debug("Couldn't open URL with {} {}", helper, uri);
@ -116,10 +117,10 @@ public class DesktopIntegration {
// try external helpers
var externalHelpers = new String[]{"kde-open5", "kde-open", "gnome-open", "xdg-open"};
var rt = Runtime.getRuntime();
for (String helper : externalHelpers) {
try {
rt.exec(helper + " " + f.getAbsolutePath());
ProcessBuilder pb = new ProcessBuilder(helper, f.getAbsolutePath());
pb.start();
return;
} catch (IOException e) {
LOG.debug("Couldn't open file with {} {}", helper, f);

View File

@ -90,7 +90,7 @@ public class BongaCamsConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getBongaTabs();
List<String> tabs = getEnabledTabs();
GridPane checkboxGrid = new GridPane();
checkboxGrid.setHgap(10);
@ -99,32 +99,32 @@ public class BongaCamsConfigUI extends AbstractConfigUI {
CheckBox female = new CheckBox("Female");
female.setSelected(tabs.contains("female"));
female.setOnAction(e -> toggleTabs("female", female.isSelected()));
female.setOnAction(e -> toggleTab("female", female.isSelected()));
checkboxGrid.add(female, 0, 0);
CheckBox male = new CheckBox("Male");
male.setSelected(tabs.contains("male"));
male.setOnAction(e -> toggleTabs("male", male.isSelected()));
male.setOnAction(e -> toggleTab("male", male.isSelected()));
checkboxGrid.add(male, 1, 0);
CheckBox couples = new CheckBox("Couples");
couples.setSelected(tabs.contains("couples"));
couples.setOnAction(e -> toggleTabs("couples", couples.isSelected()));
couples.setOnAction(e -> toggleTab("couples", couples.isSelected()));
checkboxGrid.add(couples, 2, 0);
CheckBox trans = new CheckBox("Trans");
trans.setSelected(tabs.contains("trans"));
trans.setOnAction(e -> toggleTabs("trans", trans.isSelected()));
trans.setOnAction(e -> toggleTab("trans", trans.isSelected()));
checkboxGrid.add(trans, 0, 1);
CheckBox newModels = new CheckBox("New");
newModels.setSelected(tabs.contains("new"));
newModels.setOnAction(e -> toggleTabs("new", newModels.isSelected()));
newModels.setOnAction(e -> toggleTab("new", newModels.isSelected()));
checkboxGrid.add(newModels, 1, 1);
CheckBox mobile = new CheckBox("Mobile");
mobile.setSelected(tabs.contains("mobile"));
mobile.setOnAction(e -> toggleTabs("mobile", mobile.isSelected()));
mobile.setOnAction(e -> toggleTab("mobile", mobile.isSelected()));
checkboxGrid.add(mobile, 2, 1);
layout.add(checkboxGrid, 1, row, 3, 2);
@ -148,7 +148,7 @@ public class BongaCamsConfigUI extends AbstractConfigUI {
return layout;
}
private void toggleTabs(String tab, boolean selected) {
private void toggleTab(String tab, boolean selected) {
var settings = Config.getInstance().getSettings();
if (selected) {
settings.bongaTabs.add(tab);
@ -158,7 +158,7 @@ public class BongaCamsConfigUI extends AbstractConfigUI {
save();
}
private List<String> getBongaTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().bongaTabs);
}
}

View File

@ -34,7 +34,7 @@ public class BongaCamsTabProvider extends AbstractTabProvider {
tabMap.put("male", "Male");
tabMap.put("couple", "Couple");
tabMap.put("trans", "Trans");
List<String> enabledTabs = getBongaTabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
switch (tab) {
case "female":
@ -77,7 +77,7 @@ public class BongaCamsTabProvider extends AbstractTabProvider {
return tab;
}
private List<String> getBongaTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().bongaTabs);
}

View File

@ -78,7 +78,7 @@ public class Cam4ConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getCam4Tabs();
List<String> tabs = getEnabledTabs();
GridPane checkboxGrid = new GridPane();
checkboxGrid.setHgap(10);
@ -145,7 +145,7 @@ public class Cam4ConfigUI extends AbstractConfigUI {
save();
}
private List<String> getCam4Tabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().cam4Tabs);
}

View File

@ -31,7 +31,7 @@ public class Cam4TabProvider extends AbstractTabProvider {
tabMap.put("couples", "Couples");
tabMap.put("hd", "HD");
tabMap.put("mobile", "Mobile");
List<String> enabledTabs = getCam4Tabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
String title = tabMap.getOrDefault(tab, tab);
switch (tab) {
@ -75,7 +75,7 @@ public class Cam4TabProvider extends AbstractTabProvider {
return tab;
}
private List<String> getCam4Tabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().cam4Tabs);
}

View File

@ -78,7 +78,7 @@ public class CamsodaConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getCamsodaTabs();
List<String> tabs = getEnabledTabs();
GridPane checkboxGrid = new GridPane();
checkboxGrid.setHgap(10);
@ -145,7 +145,7 @@ public class CamsodaConfigUI extends AbstractConfigUI {
save();
}
private List<String> getCamsodaTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().camsodaTabs);
}

View File

@ -42,7 +42,7 @@ public class CamsodaTabProvider extends AbstractTabProvider {
tabMap.put("t", "Trans");
tabMap.put("isNew", "New");
tabMap.put("isVoyeur", "Voyeur");
List<String> enabledTabs = getCamsodaTabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
String title = tabMap.getOrDefault(tab, tab);
switch (tab) {
@ -81,7 +81,7 @@ public class CamsodaTabProvider extends AbstractTabProvider {
return tab;
}
private List<String> getCamsodaTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().camsodaTabs);
}

View File

@ -106,7 +106,7 @@ public class ChaturbateConfigUi extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getChaturbateTabs();
List<String> tabs = getEnabledTabs();
GridPane checkboxGrid = new GridPane();
checkboxGrid.setHgap(10);
@ -227,7 +227,7 @@ public class ChaturbateConfigUi extends AbstractConfigUI {
save();
}
private List<String> getChaturbateTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().chaturbateTabs);
}
}

View File

@ -29,7 +29,7 @@ public class ChaturbateTabProvider extends AbstractTabProvider {
protected List<Tab> getSiteTabs(Scene scene) {
List<Tab> tabs = new ArrayList<>();
for (String tab : getChaturbateTabs()) {
for (String tab : getEnabledTabs()) {
switch (tab) {
case "ft":
tabs.add(createTab("Featured", apiUrl + "/roomlist/room-list/?enable_recommendations=false"));
@ -120,7 +120,7 @@ public class ChaturbateTabProvider extends AbstractTabProvider {
return createTab(title, updateService);
}
private List<String> getChaturbateTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().chaturbateTabs);
}
}

View File

@ -59,7 +59,7 @@ public class DreamcamConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getDreamcamTabs();
List<String> tabs = getEnabledTabs();
HBox checkboxContainer = new HBox(10);
@ -106,7 +106,7 @@ public class DreamcamConfigUI extends AbstractConfigUI {
save();
}
private List<String> getDreamcamTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().dreamcamTabs);
}

View File

@ -30,16 +30,12 @@ public class DreamcamTabProvider extends AbstractTabProvider {
tabMap.put("men", "Boys");
tabMap.put("couples", "Couples");
tabMap.put("trans", "Trans");
List<String> enabledTabs = getDreamcamTabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
String title = tabMap.getOrDefault(tab, tab);
tabs.add(createTab(title, API_URL + "&tag-categories=" + tab));
}
// 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"));
return tabs;
}
@ -51,7 +47,7 @@ public class DreamcamTabProvider extends AbstractTabProvider {
return tab;
}
private List<String> getDreamcamTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().dreamcamTabs);
}

View File

@ -1,5 +1,8 @@
package ctbrec.ui.sites.flirt4free;
import java.util.ArrayList;
import java.util.List;
import ctbrec.Config;
import ctbrec.sites.flirt4free.Flirt4Free;
import ctbrec.ui.DesktopIntegration;
@ -72,6 +75,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<String> tabs = getEnabledTabs();
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 -> toggleTab("female", female.isSelected()));
checkboxGrid.add(female, 0, 0);
CheckBox newModels = new CheckBox("Girls New");
newModels.setSelected(tabs.contains("hd"));
newModels.setOnAction(e -> toggleTab("hd", newModels.isSelected()));
checkboxGrid.add(newModels, 1, 0);
CheckBox male = new CheckBox("Male");
male.setSelected(tabs.contains("male"));
male.setOnAction(e -> toggleTab("male", male.isSelected()));
checkboxGrid.add(male, 2, 0);
CheckBox couples = new CheckBox("Couples");
couples.setSelected(tabs.contains("couples"));
couples.setOnAction(e -> toggleTab("couples", couples.isSelected()));
checkboxGrid.add(couples, 0, 1);
CheckBox trans = new CheckBox("Trans");
trans.setSelected(tabs.contains("trans"));
trans.setOnAction(e -> toggleTab("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++);
@ -89,4 +129,18 @@ public class Flirt4FreeConfigUI extends AbstractConfigUI {
return layout;
}
private void toggleTab(String tab, boolean selected) {
var settings = Config.getInstance().getSettings();
if (selected) {
settings.cam4Tabs.add(tab);
} else {
settings.cam4Tabs.remove(tab);
}
save();
}
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().cam4Tabs);
}
}

View File

@ -1,5 +1,6 @@
package ctbrec.ui.sites.flirt4free;
import ctbrec.Config;
import ctbrec.sites.flirt4free.Flirt4Free;
import ctbrec.sites.flirt4free.Flirt4FreeModel;
import ctbrec.ui.sites.AbstractTabProvider;
@ -9,7 +10,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 +28,36 @@ public class Flirt4FreeTabProvider extends AbstractTabProvider {
@Override
protected List<Tab> getSiteTabs(Scene scene) {
List<Tab> 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<String, String> tabMap = new HashMap<>();
tabMap.put("female", "Girls");
tabMap.put("new", "New Girls");
tabMap.put("male", "Male");
tabMap.put("couples", "Couples");
tabMap.put("trans", "Trans");
List<String> enabledTabs = getEnabledTabs();
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;
}
@ -46,4 +74,9 @@ public class Flirt4FreeTabProvider extends AbstractTabProvider {
s.setPeriod(Duration.seconds(60));
return tab;
}
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().flirt4freeTabs);
}
}

View File

@ -78,7 +78,7 @@ public class ShowupConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getShowupTabs();
List<String> tabs = getEnabledTabs();
HBox checkboxContainer = new HBox(10);
@ -128,7 +128,7 @@ public class ShowupConfigUI extends AbstractConfigUI {
save();
}
private List<String> getShowupTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().showupTabs);
}

View File

@ -27,7 +27,7 @@ public class ShowupTabProvider extends AbstractTabProvider {
tabMap.put("female", "Women");
tabMap.put("male", "Men");
tabMap.put("all", "All");
List<String> enabledTabs = getShowupTabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
String title = tabMap.getOrDefault(tab, tab);
tabs.add(createTab(title, tab));
@ -50,7 +50,7 @@ public class ShowupTabProvider extends AbstractTabProvider {
tab.setRecorder(site.getRecorder());
return tab;
}
private List<String> getShowupTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().showupTabs);
}

View File

@ -78,7 +78,7 @@ public class StreamateConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getStreamateTabs();
List<String> tabs = getEnabledTabs();
GridPane checkboxGrid = new GridPane();
checkboxGrid.setHgap(10);
@ -145,7 +145,7 @@ public class StreamateConfigUI extends AbstractConfigUI {
save();
}
private List<String> getStreamateTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().streamateTabs);
}

View File

@ -31,7 +31,7 @@ public class StreamateTabProvider extends AbstractTabProvider {
tabMap.put("tm2f,tf2m", "Trans");
tabMap.put("fn", "Girls New");
tabMap.put("new", "New");
List<String> enabledTabs = getStreamateTabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
String title = tabMap.getOrDefault(tab, tab);
switch (tab) {
@ -71,7 +71,7 @@ public class StreamateTabProvider extends AbstractTabProvider {
return tab;
}
private List<String> getStreamateTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().streamateTabs);
}

View File

@ -61,7 +61,7 @@ public class StreamrayConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getStreamrayTabs();
List<String> tabs = getEnabledTabs();
HBox checkboxContainer = new HBox(10);
@ -103,7 +103,7 @@ public class StreamrayConfigUI extends AbstractConfigUI {
save();
}
private List<String> getStreamrayTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().streamrayTabs);
}

View File

@ -32,7 +32,7 @@ public class StreamrayTabProvider extends AbstractTabProvider {
tabMap.put("F", "Female");
tabMap.put("M", "Male");
tabMap.put("TS", "Trans");
List<String> enabledTabs = getStreamrayTabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
String title = tabMap.getOrDefault(tab, tab);
tabs.add(createTab(title, m -> Objects.equals(tab, m.getGender())));
@ -66,7 +66,7 @@ public class StreamrayTabProvider extends AbstractTabProvider {
public Tab getFollowedTab() {
return followedTab;
}
private List<String> getStreamrayTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().streamrayTabs);
}

View File

@ -118,7 +118,7 @@ public class StripchatConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getStripchatTabs();
List<String> tabs = getEnabledTabs();
GridPane checkboxGrid = new GridPane();
checkboxGrid.setHgap(10);
@ -207,7 +207,7 @@ public class StripchatConfigUI extends AbstractConfigUI {
save();
}
private List<String> getStripchatTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().stripchatTabs);
}

View File

@ -41,7 +41,7 @@ public class StripchatTabProvider extends AbstractTabProvider {
tabMap.put("couples", "Couples");
tabMap.put("men", "Boys");
tabMap.put("trans", "Trans");
List<String> enabledTabs = getStripchatTabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
String title = tabMap.getOrDefault(tab, tab);
if (tab.contains("auto")) {
@ -73,7 +73,7 @@ public class StripchatTabProvider extends AbstractTabProvider {
return tab;
}
private List<String> getStripchatTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().stripchatTabs);
}

View File

@ -77,7 +77,7 @@ public class XloveCamConfigUI extends AbstractConfigUI {
Label tabsLabel = new Label("Tabs");
layout.add(tabsLabel, 0, row);
List<String> tabs = getXlovecamTabs();
List<String> tabs = getEnabledTabs();
GridPane checkboxGrid = new GridPane();
checkboxGrid.setHgap(10);
@ -149,7 +149,7 @@ public class XloveCamConfigUI extends AbstractConfigUI {
save();
}
private List<String> getXlovecamTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().xlovecamTabs);
}

View File

@ -47,7 +47,7 @@ public class XloveCamTabProvider extends AbstractTabProvider {
tabMap.put("3", "Lesbian");
tabMap.put("7", "Male");
tabMap.put("5", "Trans");
List<String> enabledTabs = getXlovecamTabs();
List<String> enabledTabs = getEnabledTabs();
for (String tab : enabledTabs) {
String title = tabMap.getOrDefault(tab, tab);
updateService = new XloveCamUpdateService(xloveCam, Map.of(FILTER_PARAM, tab));
@ -63,7 +63,7 @@ public class XloveCamTabProvider extends AbstractTabProvider {
return tab;
}
private List<String> getXlovecamTabs() {
private List<String> getEnabledTabs() {
return new ArrayList<>(Config.getInstance().getSettings().xlovecamTabs);
}

View File

@ -89,6 +89,7 @@ public class Settings {
public String ffmpegFileSuffix = "ts";
public String flirt4freePassword;
public String flirt4freeUsername;
public Set<String> flirt4freeTabs = new HashSet<>(Arrays.asList("female"));
public String fontFamily = "Sans-Serif";
public int fontSize = 14;
public String hlsdlExecutable = "hlsdl";

View File

@ -6,7 +6,6 @@ import com.iheartradio.m3u8.data.MasterPlaylist;
import com.iheartradio.m3u8.data.Playlist;
import com.iheartradio.m3u8.data.PlaylistData;
import ctbrec.AbstractModel;
import ctbrec.Config;
import ctbrec.StringUtil;
import ctbrec.io.HttpException;
import ctbrec.io.json.ObjectMapperFactory;