From c80230cee70e8954076dbfd34ae41f01fe91f6f5 Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Mon, 20 Jul 2020 18:44:25 +0200 Subject: [PATCH] Add support for xHamsterLive --- CHANGELOG.md | 6 ++++ .../ui/sites/stripchat/StripchatConfigUI.java | 23 +++++++++++++ .../StripchatElectronLoginDialog.java | 8 ++--- .../StripchatFollowedUpdateService.java | 6 ++-- common/src/main/java/ctbrec/Settings.java | 1 + .../ctbrec/sites/stripchat/Stripchat.java | 33 +++++++++++-------- .../sites/stripchat/StripchatHttpClient.java | 32 ++++++++++-------- .../sites/stripchat/StripchatModel.java | 14 ++++---- 8 files changed, 83 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42a9b471..c497b3fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +3.8.4 +======================== +* Added support for xHamsterLive (go to Settings -> Sites -> Stripchat, + switch to xHamsterLive, enter your credentials and restart) +* Fixed follow / unfollow for Stripchat + 3.8.3 ======================== * Fixed Streamate 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 1a0f745e..e860f2f8 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatConfigUI.java @@ -12,8 +12,11 @@ import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.PasswordField; +import javafx.scene.control.RadioButton; import javafx.scene.control.TextField; +import javafx.scene.control.ToggleGroup; import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; public class StripchatConfigUI extends AbstractConfigUI { @@ -44,6 +47,26 @@ public class StripchatConfigUI extends AbstractConfigUI { GridPane.setMargin(enabled, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); layout.add(enabled, 1, row++); + l = new Label("Site"); + layout.add(l, 0, row); + ToggleGroup toggleGroup = new ToggleGroup(); + RadioButton optionA = new RadioButton("Stripchat"); + optionA.setSelected(!Config.getInstance().getSettings().stripchatUseXhamster); + optionA.setToggleGroup(toggleGroup); + RadioButton optionB = new RadioButton("xHamsterLive"); + optionB.setSelected(!optionA.isSelected()); + optionB.setToggleGroup(toggleGroup); + optionA.selectedProperty().addListener((obs, oldV, newV) -> { + Config.getInstance().getSettings().stripchatUseXhamster = !newV; + save(); + }); + HBox hbox = new HBox(); + hbox.getChildren().addAll(optionA, optionB); + HBox.setMargin(optionA, new Insets(5)); + HBox.setMargin(optionB, new Insets(5)); + GridPane.setMargin(hbox, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); + layout.add(hbox, 1, row++); + layout.add(new Label("Stripchat User"), 0, row); TextField username = new TextField(Config.getInstance().getSettings().stripchatUsername); username.textProperty().addListener((ob, o, n) -> { diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatElectronLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatElectronLoginDialog.java index 12c410d2..c326c85c 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatElectronLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatElectronLoginDialog.java @@ -20,8 +20,8 @@ import okhttp3.HttpUrl; public class StripchatElectronLoginDialog { private static final transient Logger LOG = LoggerFactory.getLogger(StripchatElectronLoginDialog.class); - public static final String DOMAIN = "stripchat.com"; - public static final String URL = Stripchat.BASE_URI; + public String DOMAIN = Stripchat.domain; + public String URL = Stripchat.baseUri; private CookieJar cookieJar; private ExternalBrowser browser; @@ -85,8 +85,8 @@ public class StripchatElectronLoginDialog { Cookie c = createCookie(domain, cookie); cookieJar.saveFromResponse(HttpUrl.parse(url), Collections.singletonList(c)); c = createCookie(DOMAIN, cookie); - cookieJar.saveFromResponse(HttpUrl.parse(Stripchat.BASE_URI), Collections.singletonList(c)); - if (c.name().equals("stripchat_com_sessionId")) { + cookieJar.saveFromResponse(HttpUrl.parse(Stripchat.baseUri), Collections.singletonList(c)); + if (c.name().contains("_com_sessionId")) { sessionCookieFound = true; } } diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedUpdateService.java index 938be470..901c4053 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatFollowedUpdateService.java @@ -51,7 +51,7 @@ public class StripchatFollowedUpdateService extends PaginatedScheduledService { .url(urlBuilder.build()) .header(ACCEPT, "*/*") .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(REFERER, Stripchat.BASE_URI + "/favorites") + .header(REFERER, Stripchat.baseUri + "/favorites") .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .build(); try (Response response = stripchat.getHttpClient().execute(request)) { @@ -86,8 +86,8 @@ public class StripchatFollowedUpdateService extends PaginatedScheduledService { .url(url) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(ORIGIN, Stripchat.BASE_URI) - .header(REFERER, Stripchat.BASE_URI + "/favorites") + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri + "/favorites") .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .build(); try (Response response = stripchat.getHttpClient().execute(request)) { diff --git a/common/src/main/java/ctbrec/Settings.java b/common/src/main/java/ctbrec/Settings.java index e62e54d6..9094117b 100644 --- a/common/src/main/java/ctbrec/Settings.java +++ b/common/src/main/java/ctbrec/Settings.java @@ -122,6 +122,7 @@ public class Settings { public String streamateUsername = ""; public String stripchatUsername = ""; public String stripchatPassword = ""; + public boolean stripchatUseXhamster = false; public boolean transportLayerSecurity = true; public int thumbWidth = 180; public boolean updateThumbnails = true; diff --git a/common/src/main/java/ctbrec/sites/stripchat/Stripchat.java b/common/src/main/java/ctbrec/sites/stripchat/Stripchat.java index 7919ef23..31942434 100644 --- a/common/src/main/java/ctbrec/sites/stripchat/Stripchat.java +++ b/common/src/main/java/ctbrec/sites/stripchat/Stripchat.java @@ -23,9 +23,19 @@ import okhttp3.Response; public class Stripchat extends AbstractSite { - public static final String BASE_URI = "https://stripchat.com"; + public static String domain = "stripchat.com"; + public static String baseUri = "https://stripchat.com"; private HttpClient httpClient; + @Override + public void init() throws IOException { + boolean hamster = Config.getInstance().getSettings().stripchatUseXhamster; + if (hamster) { + domain = "xhamsterlive.com"; + baseUri = "https://" + domain; + } + } + @Override public String getName() { return "Stripchat"; @@ -33,7 +43,7 @@ public class Stripchat extends AbstractSite { @Override public String getBaseUrl() { - return BASE_URI; + return baseUri; } @Override @@ -62,14 +72,14 @@ public class Stripchat extends AbstractSite { } String username = Config.getInstance().getSettings().camsodaUsername; - String url = BASE_URI + "/api/v1/user/" + username; + String url = baseUri + "/api/v1/user/" + username; Request request = new Request.Builder().url(url).build(); - try(Response response = getHttpClient().execute(request)) { - if(response.isSuccessful()) { + try (Response response = getHttpClient().execute(request)) { + if (response.isSuccessful()) { JSONObject json = new JSONObject(response.body().string()); - if(json.has("user")) { + if (json.has("user")) { JSONObject user = json.getJSONObject("user"); - if(user.has("tokens")) { + if (user.has("tokens")) { return (double) user.getInt("tokens"); } } @@ -93,11 +103,6 @@ public class Stripchat extends AbstractSite { return httpClient; } - @Override - public void init() throws IOException { - // noop - } - @Override public void shutdown() { if (httpClient != null) { @@ -122,7 +127,7 @@ public class Stripchat extends AbstractSite { @Override public List search(String q) throws IOException, InterruptedException { - String url = BASE_URI + "/api/front/v2/models/search?limit=20&query=" + URLEncoder.encode(q, "utf-8"); + String url = baseUri + "/api/front/v2/models/search?limit=20&query=" + URLEncoder.encode(q, "utf-8"); Request req = new Request.Builder() .url(url) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) @@ -162,7 +167,7 @@ public class Stripchat extends AbstractSite { @Override public Model createModelFromUrl(String url) { - Matcher m = Pattern.compile("https?://(?:.*?\\.)?stripchat.com/([^/]*?)/?").matcher(url); + Matcher m = Pattern.compile("https?://(?:.*?\\.)?(?:stripchat.com|xhamsterlive.com)/([^/]*?)/?").matcher(url); if (m.matches()) { String modelName = m.group(1); return createModel(modelName); diff --git a/common/src/main/java/ctbrec/sites/stripchat/StripchatHttpClient.java b/common/src/main/java/ctbrec/sites/stripchat/StripchatHttpClient.java index 94beb70f..5702459b 100644 --- a/common/src/main/java/ctbrec/sites/stripchat/StripchatHttpClient.java +++ b/common/src/main/java/ctbrec/sites/stripchat/StripchatHttpClient.java @@ -32,7 +32,10 @@ public class StripchatHttpClient extends HttpClient { @Override public boolean login() throws IOException { - if(loggedIn) { + if (loggedIn) { + if (csrfToken == null) { + loadCsrfToken(); + } return true; } @@ -40,6 +43,9 @@ public class StripchatHttpClient extends HttpClient { if (checkLoginSuccess()) { loggedIn = true; LOG.debug("Logged in with cookies"); + if (csrfToken == null) { + loadCsrfToken(); + } return true; } @@ -47,7 +53,7 @@ public class StripchatHttpClient extends HttpClient { loadCsrfToken(); } - String url = Stripchat.BASE_URI + "/api/front/auth/login"; + String url = Stripchat.baseUri + "/api/front/auth/login"; JSONObject requestParams = new JSONObject(); requestParams.put("loginOrEmail", Config.getInstance().getSettings().stripchatUsername); requestParams.put("password", Config.getInstance().getSettings().stripchatPassword); @@ -60,8 +66,8 @@ public class StripchatHttpClient extends HttpClient { .url(url) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(ORIGIN, Stripchat.BASE_URI) - .header(REFERER, Stripchat.BASE_URI) + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .post(body) .build(); @@ -83,13 +89,13 @@ public class StripchatHttpClient extends HttpClient { } private void loadCsrfToken() throws IOException { - String url = Stripchat.BASE_URI + "/api/front/v2/config/data?requestPath=%2F&timezoneOffset=0"; + String url = Stripchat.baseUri + "/api/front/v2/config/data?requestPath=%2F&timezoneOffset=0"; Request request = new Request.Builder() .url(url) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(ORIGIN, Stripchat.BASE_URI) - .header(REFERER, Stripchat.BASE_URI) + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .build(); try (Response response = execute(request)) { @@ -111,13 +117,13 @@ public class StripchatHttpClient extends HttpClient { */ public boolean checkLoginSuccess() throws IOException { long userId = getUserId(); - String url = Stripchat.BASE_URI + "/api/front/users/" + userId + "/favorites"; + String url = Stripchat.baseUri + "/api/front/users/" + userId + "/favorites"; Request request = new Request.Builder() .url(url) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(ORIGIN, Stripchat.BASE_URI) - .header(REFERER, Stripchat.BASE_URI + "/favorites") + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri + "/favorites") .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .build(); try (Response response = execute(request)) { @@ -132,13 +138,13 @@ public class StripchatHttpClient extends HttpClient { public long getUserId() throws JSONException, IOException { if (userId == 0) { - String url = Stripchat.BASE_URI + "/api/front/users/username/" + Config.getInstance().getSettings().stripchatUsername; + String url = Stripchat.baseUri + "/api/front/users/username/" + Config.getInstance().getSettings().stripchatUsername; Request request = new Request.Builder() .url(url) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(ORIGIN, Stripchat.BASE_URI) - .header(REFERER, Stripchat.BASE_URI) + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .build(); try (Response response = execute(request)) { diff --git a/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java b/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java index 174fa7ed..72b9d30c 100644 --- a/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java +++ b/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java @@ -145,12 +145,13 @@ public class StripchatModel extends AbstractModel { @Override public boolean follow() throws IOException { + getSite().getHttpClient().login(); JSONObject modelInfo = loadModelInfo(); JSONObject user = modelInfo.getJSONObject("user"); long modelId = user.optLong("id"); StripchatHttpClient client = (StripchatHttpClient) getSite().getHttpClient(); - String url = Stripchat.BASE_URI + "/api/front/users/" + client.getUserId() + "/favorites/" + modelId; + String url = Stripchat.baseUri + "/api/front/users/" + client.getUserId() + "/favorites/" + modelId; JSONObject requestParams = new JSONObject(); requestParams.put("csrfToken", client.getCsrfToken()); requestParams.put("csrfTimestamp", client.getCsrfTimestamp()); @@ -160,8 +161,8 @@ public class StripchatModel extends AbstractModel { .url(url) .header(ACCEPT, "*/*") .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(ORIGIN, Stripchat.BASE_URI) - .header(REFERER, Stripchat.BASE_URI + '/' + getName()) + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri + '/' + getName()) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .put(body) .build(); @@ -176,6 +177,7 @@ public class StripchatModel extends AbstractModel { @Override public boolean unfollow() throws IOException { + getSite().getHttpClient().login(); JSONObject modelInfo = loadModelInfo(); JSONObject user = modelInfo.getJSONObject("user"); long modelId = user.optLong("id"); @@ -183,7 +185,7 @@ public class StripchatModel extends AbstractModel { favoriteIds.put(modelId); StripchatHttpClient client = (StripchatHttpClient) getSite().getHttpClient(); - String url = Stripchat.BASE_URI + "/api/front/users/" + client.getUserId() + "/favorites"; + String url = Stripchat.baseUri + "/api/front/users/" + client.getUserId() + "/favorites"; JSONObject requestParams = new JSONObject(); requestParams.put("favoriteIds", favoriteIds); requestParams.put("csrfToken", client.getCsrfToken()); @@ -194,8 +196,8 @@ public class StripchatModel extends AbstractModel { .url(url) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - .header(ORIGIN, Stripchat.BASE_URI) - .header(REFERER, Stripchat.BASE_URI) + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .delete(body) .build();