forked from j62/ctbrec
1
0
Fork 0

Add support for xHamsterLive

This commit is contained in:
0xb00bface 2020-07-20 18:44:25 +02:00
parent bc872b1ed5
commit c80230cee7
8 changed files with 83 additions and 40 deletions

View File

@ -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 3.8.3
======================== ========================
* Fixed Streamate * Fixed Streamate

View File

@ -12,8 +12,11 @@ import javafx.scene.control.Button;
import javafx.scene.control.CheckBox; import javafx.scene.control.CheckBox;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.PasswordField; import javafx.scene.control.PasswordField;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority; import javafx.scene.layout.Priority;
public class StripchatConfigUI extends AbstractConfigUI { 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)); GridPane.setMargin(enabled, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN));
layout.add(enabled, 1, row++); 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); layout.add(new Label("Stripchat User"), 0, row);
TextField username = new TextField(Config.getInstance().getSettings().stripchatUsername); TextField username = new TextField(Config.getInstance().getSettings().stripchatUsername);
username.textProperty().addListener((ob, o, n) -> { username.textProperty().addListener((ob, o, n) -> {

View File

@ -20,8 +20,8 @@ import okhttp3.HttpUrl;
public class StripchatElectronLoginDialog { public class StripchatElectronLoginDialog {
private static final transient Logger LOG = LoggerFactory.getLogger(StripchatElectronLoginDialog.class); private static final transient Logger LOG = LoggerFactory.getLogger(StripchatElectronLoginDialog.class);
public static final String DOMAIN = "stripchat.com"; public String DOMAIN = Stripchat.domain;
public static final String URL = Stripchat.BASE_URI; public String URL = Stripchat.baseUri;
private CookieJar cookieJar; private CookieJar cookieJar;
private ExternalBrowser browser; private ExternalBrowser browser;
@ -85,8 +85,8 @@ public class StripchatElectronLoginDialog {
Cookie c = createCookie(domain, cookie); Cookie c = createCookie(domain, cookie);
cookieJar.saveFromResponse(HttpUrl.parse(url), Collections.singletonList(c)); cookieJar.saveFromResponse(HttpUrl.parse(url), Collections.singletonList(c));
c = createCookie(DOMAIN, cookie); c = createCookie(DOMAIN, cookie);
cookieJar.saveFromResponse(HttpUrl.parse(Stripchat.BASE_URI), Collections.singletonList(c)); cookieJar.saveFromResponse(HttpUrl.parse(Stripchat.baseUri), Collections.singletonList(c));
if (c.name().equals("stripchat_com_sessionId")) { if (c.name().contains("_com_sessionId")) {
sessionCookieFound = true; sessionCookieFound = true;
} }
} }

View File

@ -51,7 +51,7 @@ public class StripchatFollowedUpdateService extends PaginatedScheduledService {
.url(urlBuilder.build()) .url(urlBuilder.build())
.header(ACCEPT, "*/*") .header(ACCEPT, "*/*")
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
.header(REFERER, Stripchat.BASE_URI + "/favorites") .header(REFERER, Stripchat.baseUri + "/favorites")
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
.build(); .build();
try (Response response = stripchat.getHttpClient().execute(request)) { try (Response response = stripchat.getHttpClient().execute(request)) {
@ -86,8 +86,8 @@ public class StripchatFollowedUpdateService extends PaginatedScheduledService {
.url(url) .url(url)
.header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(ACCEPT, MIMETYPE_APPLICATION_JSON)
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
.header(ORIGIN, Stripchat.BASE_URI) .header(ORIGIN, Stripchat.baseUri)
.header(REFERER, Stripchat.BASE_URI + "/favorites") .header(REFERER, Stripchat.baseUri + "/favorites")
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
.build(); .build();
try (Response response = stripchat.getHttpClient().execute(request)) { try (Response response = stripchat.getHttpClient().execute(request)) {

View File

@ -122,6 +122,7 @@ public class Settings {
public String streamateUsername = ""; public String streamateUsername = "";
public String stripchatUsername = ""; public String stripchatUsername = "";
public String stripchatPassword = ""; public String stripchatPassword = "";
public boolean stripchatUseXhamster = false;
public boolean transportLayerSecurity = true; public boolean transportLayerSecurity = true;
public int thumbWidth = 180; public int thumbWidth = 180;
public boolean updateThumbnails = true; public boolean updateThumbnails = true;

View File

@ -23,9 +23,19 @@ import okhttp3.Response;
public class Stripchat extends AbstractSite { 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; private HttpClient httpClient;
@Override
public void init() throws IOException {
boolean hamster = Config.getInstance().getSettings().stripchatUseXhamster;
if (hamster) {
domain = "xhamsterlive.com";
baseUri = "https://" + domain;
}
}
@Override @Override
public String getName() { public String getName() {
return "Stripchat"; return "Stripchat";
@ -33,7 +43,7 @@ public class Stripchat extends AbstractSite {
@Override @Override
public String getBaseUrl() { public String getBaseUrl() {
return BASE_URI; return baseUri;
} }
@Override @Override
@ -62,14 +72,14 @@ public class Stripchat extends AbstractSite {
} }
String username = Config.getInstance().getSettings().camsodaUsername; 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(); Request request = new Request.Builder().url(url).build();
try(Response response = getHttpClient().execute(request)) { try (Response response = getHttpClient().execute(request)) {
if(response.isSuccessful()) { if (response.isSuccessful()) {
JSONObject json = new JSONObject(response.body().string()); JSONObject json = new JSONObject(response.body().string());
if(json.has("user")) { if (json.has("user")) {
JSONObject user = json.getJSONObject("user"); JSONObject user = json.getJSONObject("user");
if(user.has("tokens")) { if (user.has("tokens")) {
return (double) user.getInt("tokens"); return (double) user.getInt("tokens");
} }
} }
@ -93,11 +103,6 @@ public class Stripchat extends AbstractSite {
return httpClient; return httpClient;
} }
@Override
public void init() throws IOException {
// noop
}
@Override @Override
public void shutdown() { public void shutdown() {
if (httpClient != null) { if (httpClient != null) {
@ -122,7 +127,7 @@ public class Stripchat extends AbstractSite {
@Override @Override
public List<Model> search(String q) throws IOException, InterruptedException { public List<Model> 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() Request req = new Request.Builder()
.url(url) .url(url)
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
@ -162,7 +167,7 @@ public class Stripchat extends AbstractSite {
@Override @Override
public Model createModelFromUrl(String url) { 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()) { if (m.matches()) {
String modelName = m.group(1); String modelName = m.group(1);
return createModel(modelName); return createModel(modelName);

View File

@ -32,7 +32,10 @@ public class StripchatHttpClient extends HttpClient {
@Override @Override
public boolean login() throws IOException { public boolean login() throws IOException {
if(loggedIn) { if (loggedIn) {
if (csrfToken == null) {
loadCsrfToken();
}
return true; return true;
} }
@ -40,6 +43,9 @@ public class StripchatHttpClient extends HttpClient {
if (checkLoginSuccess()) { if (checkLoginSuccess()) {
loggedIn = true; loggedIn = true;
LOG.debug("Logged in with cookies"); LOG.debug("Logged in with cookies");
if (csrfToken == null) {
loadCsrfToken();
}
return true; return true;
} }
@ -47,7 +53,7 @@ public class StripchatHttpClient extends HttpClient {
loadCsrfToken(); loadCsrfToken();
} }
String url = Stripchat.BASE_URI + "/api/front/auth/login"; String url = Stripchat.baseUri + "/api/front/auth/login";
JSONObject requestParams = new JSONObject(); JSONObject requestParams = new JSONObject();
requestParams.put("loginOrEmail", Config.getInstance().getSettings().stripchatUsername); requestParams.put("loginOrEmail", Config.getInstance().getSettings().stripchatUsername);
requestParams.put("password", Config.getInstance().getSettings().stripchatPassword); requestParams.put("password", Config.getInstance().getSettings().stripchatPassword);
@ -60,8 +66,8 @@ public class StripchatHttpClient extends HttpClient {
.url(url) .url(url)
.header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(ACCEPT, MIMETYPE_APPLICATION_JSON)
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
.header(ORIGIN, Stripchat.BASE_URI) .header(ORIGIN, Stripchat.baseUri)
.header(REFERER, Stripchat.BASE_URI) .header(REFERER, Stripchat.baseUri)
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
.post(body) .post(body)
.build(); .build();
@ -83,13 +89,13 @@ public class StripchatHttpClient extends HttpClient {
} }
private void loadCsrfToken() throws IOException { 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() Request request = new Request.Builder()
.url(url) .url(url)
.header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(ACCEPT, MIMETYPE_APPLICATION_JSON)
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
.header(ORIGIN, Stripchat.BASE_URI) .header(ORIGIN, Stripchat.baseUri)
.header(REFERER, Stripchat.BASE_URI) .header(REFERER, Stripchat.baseUri)
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
.build(); .build();
try (Response response = execute(request)) { try (Response response = execute(request)) {
@ -111,13 +117,13 @@ public class StripchatHttpClient extends HttpClient {
*/ */
public boolean checkLoginSuccess() throws IOException { public boolean checkLoginSuccess() throws IOException {
long userId = getUserId(); 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() Request request = new Request.Builder()
.url(url) .url(url)
.header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(ACCEPT, MIMETYPE_APPLICATION_JSON)
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
.header(ORIGIN, Stripchat.BASE_URI) .header(ORIGIN, Stripchat.baseUri)
.header(REFERER, Stripchat.BASE_URI + "/favorites") .header(REFERER, Stripchat.baseUri + "/favorites")
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
.build(); .build();
try (Response response = execute(request)) { try (Response response = execute(request)) {
@ -132,13 +138,13 @@ public class StripchatHttpClient extends HttpClient {
public long getUserId() throws JSONException, IOException { public long getUserId() throws JSONException, IOException {
if (userId == 0) { 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() Request request = new Request.Builder()
.url(url) .url(url)
.header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(ACCEPT, MIMETYPE_APPLICATION_JSON)
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
.header(ORIGIN, Stripchat.BASE_URI) .header(ORIGIN, Stripchat.baseUri)
.header(REFERER, Stripchat.BASE_URI) .header(REFERER, Stripchat.baseUri)
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
.build(); .build();
try (Response response = execute(request)) { try (Response response = execute(request)) {

View File

@ -145,12 +145,13 @@ public class StripchatModel extends AbstractModel {
@Override @Override
public boolean follow() throws IOException { public boolean follow() throws IOException {
getSite().getHttpClient().login();
JSONObject modelInfo = loadModelInfo(); JSONObject modelInfo = loadModelInfo();
JSONObject user = modelInfo.getJSONObject("user"); JSONObject user = modelInfo.getJSONObject("user");
long modelId = user.optLong("id"); long modelId = user.optLong("id");
StripchatHttpClient client = (StripchatHttpClient) getSite().getHttpClient(); 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(); JSONObject requestParams = new JSONObject();
requestParams.put("csrfToken", client.getCsrfToken()); requestParams.put("csrfToken", client.getCsrfToken());
requestParams.put("csrfTimestamp", client.getCsrfTimestamp()); requestParams.put("csrfTimestamp", client.getCsrfTimestamp());
@ -160,8 +161,8 @@ public class StripchatModel extends AbstractModel {
.url(url) .url(url)
.header(ACCEPT, "*/*") .header(ACCEPT, "*/*")
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
.header(ORIGIN, Stripchat.BASE_URI) .header(ORIGIN, Stripchat.baseUri)
.header(REFERER, Stripchat.BASE_URI + '/' + getName()) .header(REFERER, Stripchat.baseUri + '/' + getName())
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
.put(body) .put(body)
.build(); .build();
@ -176,6 +177,7 @@ public class StripchatModel extends AbstractModel {
@Override @Override
public boolean unfollow() throws IOException { public boolean unfollow() throws IOException {
getSite().getHttpClient().login();
JSONObject modelInfo = loadModelInfo(); JSONObject modelInfo = loadModelInfo();
JSONObject user = modelInfo.getJSONObject("user"); JSONObject user = modelInfo.getJSONObject("user");
long modelId = user.optLong("id"); long modelId = user.optLong("id");
@ -183,7 +185,7 @@ public class StripchatModel extends AbstractModel {
favoriteIds.put(modelId); favoriteIds.put(modelId);
StripchatHttpClient client = (StripchatHttpClient) getSite().getHttpClient(); 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(); JSONObject requestParams = new JSONObject();
requestParams.put("favoriteIds", favoriteIds); requestParams.put("favoriteIds", favoriteIds);
requestParams.put("csrfToken", client.getCsrfToken()); requestParams.put("csrfToken", client.getCsrfToken());
@ -194,8 +196,8 @@ public class StripchatModel extends AbstractModel {
.url(url) .url(url)
.header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(ACCEPT, MIMETYPE_APPLICATION_JSON)
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
.header(ORIGIN, Stripchat.BASE_URI) .header(ORIGIN, Stripchat.baseUri)
.header(REFERER, Stripchat.BASE_URI) .header(REFERER, Stripchat.baseUri)
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
.delete(body) .delete(body)
.build(); .build();