diff --git a/CHANGELOG.md b/CHANGELOG.md index b791eb9b..51b8e6a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +1.12.2 +======================== +* Fix: Player not starting when path contains spaces +* Added setting to toggle "Player Starting" message +* Added possibility to add models by their URL + 1.12.1 ======================== * Fixed downloads in client / server mode diff --git a/client/src/main/java/ctbrec/ui/RecordedModelsTab.java b/client/src/main/java/ctbrec/ui/RecordedModelsTab.java index 86a3c35b..523ef502 100644 --- a/client/src/main/java/ctbrec/ui/RecordedModelsTab.java +++ b/client/src/main/java/ctbrec/ui/RecordedModelsTab.java @@ -155,8 +155,8 @@ public class RecordedModelsTab extends Tab implements TabSelectionListener { ObservableList suggestions = FXCollections.observableArrayList(); sites.forEach(site -> suggestions.add(site.getName())); model = new AutoFillTextField(suggestions); - model.setPrefWidth(300); - model.setPromptText("e.g. MyFreeCams:ModelName"); + model.setPrefWidth(600); + model.setPromptText("e.g. MyFreeCams:ModelName or an URL like https://chaturbate.com/modelname/"); model.onActionHandler(e -> addModel(e)); model.setTooltip(new Tooltip("To add a model enter SiteName:ModelName\n" + "press ENTER to confirm a suggested site name")); @@ -174,6 +174,43 @@ public class RecordedModelsTab extends Tab implements TabSelectionListener { } private void addModel(ActionEvent e) { + String input = model.getText(); + if(StringUtil.isBlank(input)) { + return; + } + + if(input.startsWith("http")) { + addModelByUrl(input); + } else { + addModelByName(input); + } + }; + + private void addModelByUrl(String url) { + for (Site site : sites) { + Model model = site.createModelFromUrl(url); + if(model != null) { + try { + recorder.startRecording(model); + } catch (IOException | InvalidKeyException | NoSuchAlgorithmException | IllegalStateException e1) { + Alert alert = new AutosizeAlert(Alert.AlertType.ERROR); + alert.setTitle("Error"); + alert.setHeaderText("Couldn't add model"); + alert.setContentText("The model " + model.getName() + " could not be added: " + e1.getLocalizedMessage()); + alert.showAndWait(); + } + return; + } + } + + Alert alert = new AutosizeAlert(Alert.AlertType.ERROR); + alert.setTitle("Unknown URL format"); + alert.setHeaderText("Couldn't add model"); + alert.setContentText("The URL you entered has an unknown format or the function does not support this site, yet"); + alert.showAndWait(); + } + + private void addModelByName(String siteModelCombo) { String[] parts = model.getText().trim().split(":"); if (parts.length != 2) { Alert alert = new AutosizeAlert(Alert.AlertType.ERROR); @@ -207,8 +244,7 @@ public class RecordedModelsTab extends Tab implements TabSelectionListener { alert.setHeaderText("Couldn't add model"); alert.setContentText("The site you entered is unknown"); alert.showAndWait(); - }; - + } void initializeUpdateService() { updateService = createUpdateService(); diff --git a/common/src/main/java/ctbrec/sites/AbstractSite.java b/common/src/main/java/ctbrec/sites/AbstractSite.java index 96d67005..4ecd6465 100644 --- a/common/src/main/java/ctbrec/sites/AbstractSite.java +++ b/common/src/main/java/ctbrec/sites/AbstractSite.java @@ -46,4 +46,9 @@ public abstract class AbstractSite implements Site { public boolean searchRequiresLogin() { return false; } + + @Override + public Model createModelFromUrl(String url) { + return null; + } } diff --git a/common/src/main/java/ctbrec/sites/Site.java b/common/src/main/java/ctbrec/sites/Site.java index cf6f3119..9225b52c 100644 --- a/common/src/main/java/ctbrec/sites/Site.java +++ b/common/src/main/java/ctbrec/sites/Site.java @@ -29,4 +29,5 @@ public interface Site { public boolean isEnabled(); public List search(String q) throws IOException, InterruptedException; public boolean searchRequiresLogin(); + public Model createModelFromUrl(String url); } diff --git a/common/src/main/java/ctbrec/sites/bonga/BongaCams.java b/common/src/main/java/ctbrec/sites/bonga/BongaCams.java index 6b2670d8..d74288e0 100644 --- a/common/src/main/java/ctbrec/sites/bonga/BongaCams.java +++ b/common/src/main/java/ctbrec/sites/bonga/BongaCams.java @@ -5,6 +5,8 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.json.JSONArray; import org.json.JSONObject; @@ -184,4 +186,14 @@ public class BongaCams extends AbstractSite { return username != null && !username.trim().isEmpty(); } + @Override + public Model createModelFromUrl(String url) { + Matcher m = Pattern.compile("https?://.*?bongacams.com(?:/profile)?/([^/]*?)/?").matcher(url); + if(m.matches()) { + String modelName = m.group(1); + return createModel(modelName); + } else { + return super.createModelFromUrl(url); + } + } } diff --git a/common/src/main/java/ctbrec/sites/cam4/Cam4.java b/common/src/main/java/ctbrec/sites/cam4/Cam4.java index 04b032f4..8c3907a0 100644 --- a/common/src/main/java/ctbrec/sites/cam4/Cam4.java +++ b/common/src/main/java/ctbrec/sites/cam4/Cam4.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.json.JSONArray; import org.json.JSONObject; @@ -154,4 +156,15 @@ public class Cam4 extends AbstractSite { String username = Config.getInstance().getSettings().cam4Username; return username != null && !username.trim().isEmpty(); } + + @Override + public Model createModelFromUrl(String url) { + Matcher m = Pattern.compile("https?://(?:www\\.)?cam4(?:.*?).com/([^/]*?)/?").matcher(url); + if(m.matches()) { + String modelName = m.group(1); + return createModel(modelName); + } else { + return super.createModelFromUrl(url); + } + } } diff --git a/common/src/main/java/ctbrec/sites/camsoda/Camsoda.java b/common/src/main/java/ctbrec/sites/camsoda/Camsoda.java index e79688fa..346c9315 100644 --- a/common/src/main/java/ctbrec/sites/camsoda/Camsoda.java +++ b/common/src/main/java/ctbrec/sites/camsoda/Camsoda.java @@ -5,6 +5,8 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.json.JSONArray; import org.json.JSONObject; @@ -161,4 +163,15 @@ public class Camsoda extends AbstractSite { String username = Config.getInstance().getSettings().camsodaUsername; return username != null && !username.trim().isEmpty(); } + + @Override + public Model createModelFromUrl(String url) { + Matcher m = Pattern.compile("https?://(?:www\\.)?camsoda.com/([^/]*?)/?").matcher(url); + if(m.matches()) { + String modelName = m.group(1); + return createModel(modelName); + } else { + return super.createModelFromUrl(url); + } + } } diff --git a/common/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java b/common/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java index 0c1af470..251e3187 100644 --- a/common/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java +++ b/common/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java @@ -10,6 +10,8 @@ import java.util.List; import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -340,4 +342,15 @@ public class Chaturbate extends AbstractSite { String username = Config.getInstance().getSettings().username; return username != null && !username.trim().isEmpty(); } + + @Override + public Model createModelFromUrl(String url) { + Matcher m = Pattern.compile("https?://.*?chaturbate.com(?:/p)?/([^/]*?)/?").matcher(url); + if(m.matches()) { + String modelName = m.group(1); + return createModel(modelName); + } else { + return super.createModelFromUrl(url); + } + } } diff --git a/common/src/main/java/ctbrec/sites/mfc/MyFreeCams.java b/common/src/main/java/ctbrec/sites/mfc/MyFreeCams.java index 146c834a..a72191e2 100644 --- a/common/src/main/java/ctbrec/sites/mfc/MyFreeCams.java +++ b/common/src/main/java/ctbrec/sites/mfc/MyFreeCams.java @@ -2,6 +2,8 @@ package ctbrec.sites.mfc; import java.io.IOException; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.jsoup.select.Elements; @@ -122,4 +124,20 @@ public class MyFreeCams extends AbstractSite { String username = Config.getInstance().getSettings().mfcUsername; return username != null && !username.trim().isEmpty(); } + + @Override + public Model createModelFromUrl(String url) { + String[] patterns = new String[] { + "https?://profiles.myfreecams.com/([^/]*?)", + "https?://(?:www.)?myfreecams.com/#(.*)" + }; + for (String pattern : patterns) { + Matcher m = Pattern.compile(pattern).matcher(url); + if(m.matches()) { + String modelName = m.group(1); + return createModel(modelName); + } + } + return super.createModelFromUrl(url); + } }