From 43ef2bdf67e207aa6b6893bf28bc63029cadefa5 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Sun, 20 Jan 2019 13:33:16 +0100 Subject: [PATCH 01/12] Add setting to disable playlist generation on the server Implementing #142. This has feature has the disadvantage, that the recording is always detected as still recording, because the finished state is assumed by the existence of the playlist file. --- common/src/main/java/ctbrec/Settings.java | 1 + common/src/main/java/ctbrec/recorder/LocalRecorder.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/common/src/main/java/ctbrec/Settings.java b/common/src/main/java/ctbrec/Settings.java index c35eb421..9e155327 100644 --- a/common/src/main/java/ctbrec/Settings.java +++ b/common/src/main/java/ctbrec/Settings.java @@ -103,4 +103,5 @@ public class Settings { public String recordingsSortColumn = ""; public String recordingsSortType = ""; public double[] recordingsColumnWidths = new double[0]; + public boolean generatePlaylist = true; } diff --git a/common/src/main/java/ctbrec/recorder/LocalRecorder.java b/common/src/main/java/ctbrec/recorder/LocalRecorder.java index 7c12e4be..52b49b6f 100644 --- a/common/src/main/java/ctbrec/recorder/LocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/LocalRecorder.java @@ -398,6 +398,10 @@ public class LocalRecorder implements Recorder { } private void generatePlaylist(File recDir) { + if(!config.getSettings().generatePlaylist) { + return; + } + PlaylistGenerator playlistGenerator = new PlaylistGenerator(); playlistGenerators.put(recDir, playlistGenerator); try { From 6262d50f74a29f3a6bdb9cfe92d2dd8c0f4fe8c0 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Sun, 20 Jan 2019 17:58:10 +0100 Subject: [PATCH 02/12] Log browser output --- client/src/main/java/ctbrec/ui/ExternalBrowser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/main/java/ctbrec/ui/ExternalBrowser.java b/client/src/main/java/ctbrec/ui/ExternalBrowser.java index 79d84997..f2eb374a 100644 --- a/client/src/main/java/ctbrec/ui/ExternalBrowser.java +++ b/client/src/main/java/ctbrec/ui/ExternalBrowser.java @@ -132,6 +132,7 @@ public class ExternalBrowser implements AutoCloseable { BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line; while( !Thread.interrupted() && (line = br.readLine()) != null ) { + LOG.debug("Browser output: {}", line); if(!line.startsWith("{")) { System.err.println(line); } else { From 9bfd15b35ee2b9edd904e22c1b36f223abf7c0d0 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 16:22:36 +0100 Subject: [PATCH 03/12] Use a different way to retrieve the master playlist @M1h43ly posted URLs in #153, which work without being logged in and even seem to support HD streams much better. --- .../ctbrec/sites/jasmin/LiveJasminModel.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminModel.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminModel.java index 7c09cc58..ed29a6bf 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminModel.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminModel.java @@ -5,6 +5,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Random; import java.util.concurrent.ExecutionException; import org.json.JSONObject; @@ -26,6 +27,7 @@ import com.squareup.moshi.JsonWriter; import ctbrec.AbstractModel; import ctbrec.Config; +import ctbrec.StringUtil; import ctbrec.io.HttpException; import ctbrec.recorder.download.Download; import ctbrec.recorder.download.StreamSource; @@ -48,7 +50,7 @@ public class LiveJasminModel extends AbstractModel { } protected void loadModelInfo() throws IOException { - String url = "https://m.livejasmin.com/en/chat-html5/" + getName(); + String url = "https://m." + LiveJasmin.baseDomain + "/en/chat-html5/" + getName(); Request req = new Request.Builder().url(url).header("User-Agent", "Mozilla/5.0 (iPhone; CPU OS 10_14 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.1 Mobile/14E304 Safari/605.1.15") .header("Accept", "application/json,*/*") @@ -148,23 +150,31 @@ public class LiveJasminModel extends AbstractModel { private String getMasterPlaylistUrl() throws IOException { loadModelInfo(); - String url = site.getBaseUrl() + "/en/stream/hls/free/" + getName(); + //String url = site.getBaseUrl() + "/en/stream/hls/free/" + getName(); + + // generate a fake guest session ID + byte[] sessionIdRandom = new byte[16]; + new Random().nextBytes(sessionIdRandom); + String sessionId = 'g' + StringUtil.toHexString(sessionIdRandom, 32); + + String url = "https://api-gateway.dditsadn.com/v1/stream/performers/" + getName() + + "/streams/free/formats/hls?brandId=jasmin&session=" + sessionId + "&streamName=stream_1280_720_2000"; + LOG.debug("Getting master playlist URL from {}", url); Request request = new Request.Builder() .url(url) - .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) + .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgentMobile) .addHeader("Accept", "application/json, text/javascript, */*") .addHeader("Accept-Language", "en") - .addHeader("Referer", site.getBaseUrl()) + .addHeader("Referer", getUrl()) .addHeader("X-Requested-With", "XMLHttpRequest") .build(); try (Response response = site.getHttpClient().execute(request)) { if (response.isSuccessful()) { String body = response.body().string(); JSONObject json = new JSONObject(body); - if (json.optBoolean("success")) { + if (json.has("data")) { JSONObject data = json.getJSONObject("data"); - JSONObject hlsStream = data.getJSONObject("hls_stream"); - return hlsStream.getString("url"); + return data.getString("url"); } else { throw new IOException("Response was not successful: " + url + "\n" + body); } From a69b0926f0da54c2a050b3e4cba9fc41a559e1fa Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 16:23:07 +0100 Subject: [PATCH 04/12] Remove NotLoggedInException This exception is not used anymore --- .../java/ctbrec/ui/sites/jasmin/NotLoggedInExcetion.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 client/src/main/java/ctbrec/ui/sites/jasmin/NotLoggedInExcetion.java diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/NotLoggedInExcetion.java b/client/src/main/java/ctbrec/ui/sites/jasmin/NotLoggedInExcetion.java deleted file mode 100644 index 57b528b7..00000000 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/NotLoggedInExcetion.java +++ /dev/null @@ -1,5 +0,0 @@ -package ctbrec.ui.sites.jasmin; - -public class NotLoggedInExcetion extends Exception { - -} From 44bc5d02aa68de9bf28cac7a0c51b7d11c5313db Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 16:25:02 +0100 Subject: [PATCH 05/12] Add setting to change the base URL for LiveJasmin This setting is for users, which are blocked for the main domain, like users behind the great chinese wall. --- .../ui/sites/jasmin/LiveJasminConfigUi.java | 26 ++++++----- .../jasmin/LiveJasminElectronLoginDialog.java | 6 +-- .../LiveJasminFollowedUpdateService.java | 2 +- .../ctbrec/ui/sites/jasmin/LiveJasminTab.java | 18 ++------ .../sites/jasmin/LiveJasminTabProvider.java | 8 ++-- .../sites/jasmin/LiveJasminUpdateService.java | 14 +++--- common/src/main/java/ctbrec/Settings.java | 1 + common/src/main/java/ctbrec/StringUtil.java | 27 ++++++++++++ .../java/ctbrec/sites/jasmin/LiveJasmin.java | 43 ++++++++----------- .../jasmin/LiveJasminChunkedHttpDownload.java | 8 ++-- .../sites/jasmin/LiveJasminHttpClient.java | 6 +-- .../jasmin/LiveJasminTippingWebSocket.java | 8 ++-- .../jasmin/LiveJasminWebSocketDownload.java | 12 +++--- 13 files changed, 94 insertions(+), 85 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminConfigUi.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminConfigUi.java index f1c8c8db..8a679a54 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminConfigUi.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminConfigUi.java @@ -73,20 +73,17 @@ public class LiveJasminConfigUi extends AbstractConfigUI { GridPane.setColumnSpan(password, 2); layout.add(password, 1, row++); - // layout.add(new Label("LiveJasmin Session ID"), 0, row); - // TextField sessionId = new TextField(); - // sessionId.setText(Config.getInstance().getSettings().livejasminSession); - // sessionId.textProperty().addListener((ob, o, n) -> { - // if(!n.equals(Config.getInstance().getSettings().livejasminSession)) { - // Config.getInstance().getSettings().livejasminSession = n; - // save(); - // } - // }); - // GridPane.setFillWidth(sessionId, true); - // GridPane.setHgrow(sessionId, Priority.ALWAYS); - // GridPane.setColumnSpan(sessionId, 2); - // GridPane.setMargin(sessionId, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); - // layout.add(sessionId, 1, row++); + layout.add(new Label("LiveJasmin Base URL"), 0, row); + TextField baseUrl = new TextField(); + baseUrl.setText(Config.getInstance().getSettings().livejasminBaseUrl); + baseUrl.textProperty().addListener((ob, o, n) -> { + Config.getInstance().getSettings().livejasminBaseUrl = baseUrl.getText(); + save(); + }); + GridPane.setFillWidth(baseUrl, true); + GridPane.setHgrow(baseUrl, Priority.ALWAYS); + GridPane.setColumnSpan(baseUrl, 2); + layout.add(baseUrl, 1, row++); Button createAccount = new Button("Create new Account"); createAccount.setOnAction((e) -> DesktopIntegration.open(liveJasmin.getAffiliateLink())); @@ -94,6 +91,7 @@ public class LiveJasminConfigUi extends AbstractConfigUI { GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(password, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); + GridPane.setMargin(baseUrl, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); GridPane.setMargin(createAccount, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); username.setPrefWidth(300); diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminElectronLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminElectronLoginDialog.java index 9f260eb0..ebd97ca4 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminElectronLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminElectronLoginDialog.java @@ -20,7 +20,7 @@ import okhttp3.HttpUrl; public class LiveJasminElectronLoginDialog { private static final transient Logger LOG = LoggerFactory.getLogger(LiveJasminElectronLoginDialog.class); - public static final String URL = LiveJasmin.BASE_URL + "/en/auth/login"; + public static final String URL = LiveJasmin.baseUrl + "/en/auth/login"; private CookieJar cookieJar; private ExternalBrowser browser; @@ -77,12 +77,12 @@ public class LiveJasminElectronLoginDialog { JSONObject cookie = _cookies.getJSONObject(i); Builder b = new Cookie.Builder() .path("/") - .domain("livejasmin.com") + .domain(LiveJasmin.baseDomain) .name(cookie.getString("name")) .value(cookie.getString("value")) .expiresAt(0); Cookie c = b.build(); - cookieJar.saveFromResponse(HttpUrl.parse(LiveJasmin.BASE_URL), Collections.singletonList(c)); + cookieJar.saveFromResponse(HttpUrl.parse(LiveJasmin.baseUrl), Collections.singletonList(c)); } } if(url.contains("/member/")) { diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java index a660344c..ecbd0066 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java @@ -40,7 +40,7 @@ public class LiveJasminFollowedUpdateService extends PaginatedScheduledService { public List call() throws IOException { boolean loggedIn = SiteUiFactory.getUi(liveJasmin).login(); if(!loggedIn) { - throw new RuntimeException("Couldn't login on livejasmin.com"); + throw new RuntimeException("Couldn't login to livejasmin"); } //String _url = url + ((page-1) * 36); // TODO find out how to switch pages //LOG.debug("Fetching page {}", url); diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTab.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTab.java index 9e1f996e..e42d321b 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTab.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTab.java @@ -4,7 +4,6 @@ import java.io.IOException; import ctbrec.Config; import ctbrec.sites.Site; -import ctbrec.ui.DesktopIntegration; import ctbrec.ui.PaginatedScheduledService; import ctbrec.ui.ThumbOverviewTab; import javafx.concurrent.WorkerStateEvent; @@ -17,20 +16,16 @@ import javafx.scene.input.KeyEvent; public class LiveJasminTab extends ThumbOverviewTab { protected Label status; protected Button acknowledge = new Button("That's alright"); - private Button createAccount = new Button("Create Account"); private boolean betaAcknowledged = Config.getInstance().getSettings().livejasminBetaAcknowledged; public LiveJasminTab(String title, PaginatedScheduledService updateService, Site site) { super(title, updateService, site); if(!betaAcknowledged) { - status = new Label("LiveJasmin is not fully functional. Live previews do not work.\n" - + "Also make sure, that you have an account and that you have entered your credentials.\n" - + "Otherwise you might get errors."); + status = new Label("LiveJasmin is not fully functional. Live previews do not work."); grid.getChildren().add(status); grid.getChildren().add(acknowledge); - grid.getChildren().add(createAccount); } else { - status = new Label("Logging in..."); + status = new Label("Loading..."); grid.getChildren().add(status); } @@ -41,17 +36,14 @@ public class LiveJasminTab extends ThumbOverviewTab { Config.getInstance().save(); } catch (IOException e1) { } - status.setText("Logging in..."); + status.setText("Loading..."); grid.getChildren().remove(acknowledge); - grid.getChildren().remove(createAccount); if(updateService != null) { updateService.cancel(); updateService.reset(); updateService.restart(); } }); - - createAccount.setOnAction(e -> DesktopIntegration.open(site.getAffiliateLink())); } @Override @@ -64,7 +56,6 @@ public class LiveJasminTab extends ThumbOverviewTab { if(Config.getInstance().getSettings().livejasminBetaAcknowledged) { grid.getChildren().remove(status); grid.getChildren().remove(acknowledge); - grid.getChildren().remove(createAccount); super.onSuccess(); } } @@ -72,9 +63,8 @@ public class LiveJasminTab extends ThumbOverviewTab { @Override protected void onFail(WorkerStateEvent event) { if(Config.getInstance().getSettings().livejasminBetaAcknowledged) { - status.setText("Login failed"); + status.setText("Error"); grid.getChildren().remove(acknowledge); - grid.getChildren().remove(createAccount); super.onFail(event); } } diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java index a1e8e877..94a004d0 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java @@ -23,10 +23,10 @@ public class LiveJasminTabProvider extends TabProvider { public List getTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Girls", liveJasmin.getBaseUrl() + "/en/girls/?listPageOrderType=most_popular")); - tabs.add(createTab("Girls HD", liveJasmin.getBaseUrl() + "/en/girls/hd/?listPageOrderType=most_popular")); - tabs.add(createTab("Boys", liveJasmin.getBaseUrl() + "/en/boys/?listPageOrderType=most_popular")); - tabs.add(createTab("Boys HD", liveJasmin.getBaseUrl() + "/en/boys/hd/?listPageOrderType=most_popular")); + tabs.add(createTab("Girls", liveJasmin.getBaseUrl() + "/en/girl/?listPageOrderType=most_popular")); + tabs.add(createTab("Girls HD", liveJasmin.getBaseUrl() + "/en/girl/hd/?listPageOrderType=most_popular")); + tabs.add(createTab("Boys", liveJasmin.getBaseUrl() + "/en/boy/?listPageOrderType=most_popular")); + tabs.add(createTab("Boys HD", liveJasmin.getBaseUrl() + "/en/boy/hd/?listPageOrderType=most_popular")); followedTab = new LiveJasminFollowedTab(liveJasmin); followedTab.setRecorder(liveJasmin.getRecorder()); diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminUpdateService.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminUpdateService.java index 884bdb76..f1157c32 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminUpdateService.java @@ -40,28 +40,24 @@ public class LiveJasminUpdateService extends PaginatedScheduledService { protected Task> createTask() { return new Task>() { @Override - public List call() throws IOException, NotLoggedInExcetion { - //String _url = url + ((page-1) * 36); // TODO find out how to switch pages - if(!liveJasmin.credentialsAvailable() || !SiteUiFactory.getUi(liveJasmin).login()) { - throw new NotLoggedInExcetion(); - } - + public List call() throws IOException { // sort by popularity CookieJarImpl cookieJar = liveJasmin.getHttpClient().getCookieJar(); Cookie sortCookie = new Cookie.Builder() - .domain("livejasmin.com") + .domain(LiveJasmin.baseDomain) .name("listPageOrderType") .value("most_popular") .build(); - cookieJar.saveFromResponse(HttpUrl.parse("https://livejasmin.com"), Collections.singletonList(sortCookie)); + cookieJar.saveFromResponse(HttpUrl.parse("https://" + LiveJasmin.baseDomain), Collections.singletonList(sortCookie)); + // TODO find out how to switch pages LOG.debug("Fetching page {}", url); Request request = new Request.Builder() .url(url) .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) .addHeader("Accept", "application/json, text/javascript, */*") .addHeader("Accept-Language", "en") - .addHeader("Referer", liveJasmin.getBaseUrl() + "/en/girls/") + .addHeader("Referer", liveJasmin.getBaseUrl()) .addHeader("X-Requested-With", "XMLHttpRequest") .build(); try (Response response = liveJasmin.getHttpClient().execute(request)) { diff --git a/common/src/main/java/ctbrec/Settings.java b/common/src/main/java/ctbrec/Settings.java index 9e155327..33956234 100644 --- a/common/src/main/java/ctbrec/Settings.java +++ b/common/src/main/java/ctbrec/Settings.java @@ -65,6 +65,7 @@ public class Settings { public String cam4Password = ""; public String livejasminUsername = ""; public String livejasminPassword = ""; + public String livejasminBaseUrl = "https://www.livejasmin.com"; public boolean livejasminBetaAcknowledged = false; public String streamateUsername = ""; public String streamatePassword = ""; diff --git a/common/src/main/java/ctbrec/StringUtil.java b/common/src/main/java/ctbrec/StringUtil.java index d9ae9796..06e30f49 100644 --- a/common/src/main/java/ctbrec/StringUtil.java +++ b/common/src/main/java/ctbrec/StringUtil.java @@ -27,4 +27,31 @@ public class StringUtil { } return df.format(size) + ' ' + unit; } + + public static String toHexString(byte[] bytes, int bytesPerRow) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < bytes.length; i += bytesPerRow) { + int length = bytes.length - i >= bytesPerRow ? bytesPerRow : bytes.length % bytesPerRow; + byte[] row = new byte[bytesPerRow]; + System.arraycopy(bytes, i, row, 0, length); + for (int j = 0; j < length; j++) { + sb.append(toHexString(row[j])); + } + } + return sb.toString(); + } + + /** + * Converts one byte to its hex representation with leading zeros. E.g. 255 -> FF, 12 -> 0C + * + * @param b + * @return + */ + public static String toHexString(int b) { + String hex = Integer.toHexString(b & 0xFF); + if (hex.length() < 2) { + hex = "0" + hex; + } + return hex; + } } diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasmin.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasmin.java index c37cd368..9bdcb55f 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasmin.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasmin.java @@ -18,12 +18,14 @@ import ctbrec.io.HtmlParser; import ctbrec.io.HttpClient; import ctbrec.io.HttpException; import ctbrec.sites.AbstractSite; +import okhttp3.HttpUrl; import okhttp3.Request; import okhttp3.Response; public class LiveJasmin extends AbstractSite { - public static final String BASE_URL = "https://www.livejasmin.com"; + public static String baseUrl = ""; + public static String baseDomain = ""; private HttpClient httpClient; @Override @@ -33,12 +35,13 @@ public class LiveJasmin extends AbstractSite { @Override public String getBaseUrl() { - return BASE_URL; + return baseUrl; } @Override public String getAffiliateLink() { - return "https://awejmp.com/?siteId=jasmin&categoryName=girl&pageName=listpage&performerName=&prm[psid]=0xb00bface&prm[pstool]=205_1&prm[psprogram]=pps&prm[campaign_id]=&subAffId={SUBAFFID}&filters="; + return "https://awejmp.com/?siteId=jasmin&categoryName=girl&pageName=listpage&performerName=&prm[psid]=0xb00bface&prm[pstool]=205_1&prm[psprogram]=revs&prm[campaign_id]=&subAffId={SUBAFFID}&filters="; + // return "https://awejmp.com/?siteId=jasmin&categoryName=girl&pageName=listpage&performerName=&prm[psid]=0xb00bface&prm[pstool]=205_1&prm[psprogram]=pps&prm[campaign_id]=&subAffId={SUBAFFID}&filters="; } @Override @@ -53,22 +56,17 @@ public class LiveJasmin extends AbstractSite { @Override public Double getTokenBalance() throws IOException { - if(getLiveJasminHttpClient().login()) { + if (getLiveJasminHttpClient().login()) { String sessionId = getLiveJasminHttpClient().getSessionId(); String url = getBaseUrl() + "/en/offline-surprise/get-member-balance?session=" + sessionId; - Request request = new Request.Builder() - .url(url) - .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) - .addHeader("Accept", "*/*") - .addHeader("Accept-Language", "en") - .addHeader("Referer", getBaseUrl()) - .addHeader("X-Requested-With", "XMLHttpRequest") - .build(); + Request request = new Request.Builder().url(url).addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) + .addHeader("Accept", "*/*").addHeader("Accept-Language", "en").addHeader("Referer", getBaseUrl()) + .addHeader("X-Requested-With", "XMLHttpRequest").build(); try (Response response = getHttpClient().execute(request)) { - if(response.isSuccessful()) { + if (response.isSuccessful()) { String body = response.body().string(); JSONObject json = new JSONObject(body); - if(json.optBoolean("success")) { + if (json.optBoolean("success")) { return json.optDouble("result"); } else { throw new IOException("Response was not successful: " + url + "\n" + body); @@ -102,6 +100,9 @@ public class LiveJasmin extends AbstractSite { @Override public void init() throws IOException { + baseUrl = Config.getInstance().getSettings().livejasminBaseUrl; + HttpUrl url = HttpUrl.parse(baseUrl); + baseDomain = url.topPrivateDomain(); } @Override @@ -131,19 +132,13 @@ public class LiveJasmin extends AbstractSite { String query = URLEncoder.encode(q, "utf-8"); long ts = System.currentTimeMillis(); String url = getBaseUrl() + "/en/auto-suggest-search/auto-suggest?category=girls&searchText=" + query + "&_dc=" + ts + "&appletType=html5"; - Request request = new Request.Builder() - .url(url) - .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) - .addHeader("Accept", "*/*") - .addHeader("Accept-Language", "en") - .addHeader("Referer", getBaseUrl()) - .addHeader("X-Requested-With", "XMLHttpRequest") - .build(); + Request request = new Request.Builder().url(url).addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent).addHeader("Accept", "*/*") + .addHeader("Accept-Language", "en").addHeader("Referer", getBaseUrl()).addHeader("X-Requested-With", "XMLHttpRequest").build(); try (Response response = getHttpClient().execute(request)) { if (response.isSuccessful()) { String body = response.body().string(); JSONObject json = new JSONObject(body); - if(json.optBoolean("success")) { + if (json.optBoolean("success")) { List models = new ArrayList<>(); JSONObject data = json.getJSONObject("data"); String html = data.getString("content"); @@ -155,7 +150,7 @@ public class LiveJasmin extends AbstractSite { Element pic = HtmlParser.getTag(itemHtml, "span.pic i"); String style = pic.attr("style"); Matcher m = Pattern.compile("url\\('(.*?)'\\)").matcher(style); - if(m.find()) { + if (m.find()) { model.setPreview(m.group(1)); } models.add(model); diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminChunkedHttpDownload.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminChunkedHttpDownload.java index 30cb3c81..b769b0c7 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminChunkedHttpDownload.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminChunkedHttpDownload.java @@ -141,7 +141,7 @@ public class LiveJasminChunkedHttpDownload implements Download { Request request = new Request.Builder() .url("https://" + relayHost + "/?random=" + newClientInstanceId()) - .header("Origin", "https://www.livejasmin.com") + .header("Origin", LiveJasmin.baseUrl) .header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") .header("Accept-Language", "de,en-US;q=0.7,en;q=0.3") @@ -154,7 +154,7 @@ public class LiveJasminChunkedHttpDownload implements Download { + "\",\"connectionData\":{\"jasmin2App\":true,\"isMobileClient\":false,\"platform\":\"desktop\",\"chatID\":\"freechat\"," + "\"sessionID\":\"" + sessionId + "\"," + "\"jsm2SessionId\":\"" + jsm2SessionId + "\",\"userType\":\"user\"," + "\"performerId\":\"" + model - + "\",\"clientRevision\":\"\",\"proxyIP\":\"\",\"playerVer\":\"nanoPlayerVersion: 3.10.3 appCodeName: Mozilla appName: Netscape appVersion: 5.0 (X11) platform: Linux x86_64\",\"livejasminTvmember\":false,\"newApplet\":true,\"livefeedtype\":null,\"gravityCookieId\":\"\",\"passparam\":\"\",\"brandID\":\"jasmin\",\"cobrandId\":\"\",\"subbrand\":\"livejasmin\",\"siteName\":\"LiveJasmin\",\"siteUrl\":\"https://www.livejasmin.com\"," + + "\",\"clientRevision\":\"\",\"proxyIP\":\"\",\"playerVer\":\"nanoPlayerVersion: 3.10.3 appCodeName: Mozilla appName: Netscape appVersion: 5.0 (X11) platform: Linux x86_64\",\"livejasminTvmember\":false,\"newApplet\":true,\"livefeedtype\":null,\"gravityCookieId\":\"\",\"passparam\":\"\",\"brandID\":\"jasmin\",\"cobrandId\":\"\",\"subbrand\":\"livejasmin\",\"siteName\":\"LiveJasmin\",\"siteUrl\":\""+LiveJasmin.baseUrl+"\"," + "\"clientInstanceId\":\"" + clientInstanceId + "\",\"armaVersion\":\"34.10.0\",\"isPassive\":false}}"); response.close(); } @@ -231,13 +231,13 @@ public class LiveJasminChunkedHttpDownload implements Download { } protected void getPerformerDetails(String name) throws IOException { - String url = "https://m.livejasmin.com/en/chat-html5/" + name; + String url = "https://m."+LiveJasmin.baseDomain+"/en/chat-html5/" + name; Request req = new Request.Builder() .url(url) .header("User-Agent", USER_AGENT) .header("Accept", "application/json,*/*") .header("Accept-Language", "en") - .header("Referer", "https://www.livejasmin.com") + .header("Referer", LiveJasmin.baseUrl) .header("X-Requested-With", "XMLHttpRequest") .build(); try (Response response = client.execute(req)) { diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java index 3991c3d8..98c77107 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java @@ -44,13 +44,13 @@ public class LiveJasminHttpClient extends HttpClient { .followSslRedirects(false) .build(); - String url = "https://m.livejasmin.com/en/member/favourite/get-favourite-list?ajax=1"; + String url = "https://m." + LiveJasmin.baseDomain + "/en/member/favourite/get-favourite-list?ajax=1"; Request request = new Request.Builder() .url(url) .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgentMobile) .addHeader("Accept", "application/json, text/javascript, */*") .addHeader("Accept-Language", "en") - .addHeader("Referer", LiveJasmin.BASE_URL) + .addHeader("Referer", LiveJasmin.baseUrl) .addHeader("X-Requested-With", "XMLHttpRequest") .build(); try(Response response = temp.newCall(request).execute()) { @@ -64,7 +64,7 @@ public class LiveJasminHttpClient extends HttpClient { } public String getSessionId() { - Cookie sessionCookie = getCookieJar().getCookie(HttpUrl.parse(LiveJasmin.BASE_URL), "session"); + Cookie sessionCookie = getCookieJar().getCookie(HttpUrl.parse(LiveJasmin.baseUrl), "session"); if(sessionCookie != null) { return sessionCookie.value(); } else { diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminTippingWebSocket.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminTippingWebSocket.java index 305ebdfa..c3fd5280 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminTippingWebSocket.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminTippingWebSocket.java @@ -51,7 +51,7 @@ public class LiveJasminTippingWebSocket { Request request = new Request.Builder() .url("https://" + relayHost + "/") - .header("Origin", "https://www.livejasmin.com") + .header("Origin", LiveJasmin.baseUrl) .header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") .header("Accept-Language", "de,en-US;q=0.7,en;q=0.3") @@ -65,7 +65,7 @@ public class LiveJasminTippingWebSocket { + "\",\"connectionData\":{\"jasmin2App\":true,\"isMobileClient\":false,\"platform\":\"desktop\",\"chatID\":\"freechat\"," + "\"sessionID\":\"" + sessionId + "\"," + "\"jsm2SessionId\":\"" + jsm2SessionId + "\",\"userType\":\"user\"," + "\"performerId\":\"" + model - + "\",\"clientRevision\":\"\",\"proxyIP\":\"\",\"playerVer\":\"nanoPlayerVersion: 3.10.3 appCodeName: Mozilla appName: Netscape appVersion: 5.0 (X11) platform: Linux x86_64\",\"livejasminTvmember\":false,\"newApplet\":true,\"livefeedtype\":null,\"gravityCookieId\":\"\",\"passparam\":\"\",\"brandID\":\"jasmin\",\"cobrandId\":\"\",\"subbrand\":\"livejasmin\",\"siteName\":\"LiveJasmin\",\"siteUrl\":\"https://www.livejasmin.com\"," + + "\",\"clientRevision\":\"\",\"proxyIP\":\"\",\"playerVer\":\"nanoPlayerVersion: 3.10.3 appCodeName: Mozilla appName: Netscape appVersion: 5.0 (X11) platform: Linux x86_64\",\"livejasminTvmember\":false,\"newApplet\":true,\"livefeedtype\":null,\"gravityCookieId\":\"\",\"passparam\":\"\",\"brandID\":\"jasmin\",\"cobrandId\":\"\",\"subbrand\":\"livejasmin\",\"siteName\":\"LiveJasmin\",\"siteUrl\":\""+LiveJasmin.baseUrl+"\"," + "\"clientInstanceId\":\"" + clientInstanceId + "\",\"armaVersion\":\"34.10.0\",\"isPassive\":false}}"); response.close(); } @@ -136,13 +136,13 @@ public class LiveJasminTippingWebSocket { } protected void getPerformerDetails(String name) throws IOException { - String url = "https://m.livejasmin.com/en/chat-html5/" + name; + String url = "https://m." + LiveJasmin.baseDomain + "/en/chat-html5/" + name; Request req = new Request.Builder() .url(url) .header("User-Agent", "Mozilla/5.0 (iPhone; CPU OS 10_14 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.1 Mobile/14E304 Safari/605.1.15") .header("Accept", "application/json,*/*") .header("Accept-Language", "en") - .header("Referer", "https://www.livejasmin.com") + .header("Referer", LiveJasmin.baseUrl) .header("X-Requested-With", "XMLHttpRequest") .build(); try (Response response = client.execute(req)) { diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminWebSocketDownload.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminWebSocketDownload.java index f28c7252..19bdb665 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminWebSocketDownload.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminWebSocketDownload.java @@ -76,7 +76,7 @@ public class LiveJasminWebSocketDownload implements Download { Request request = new Request.Builder() .url("https://" + relayHost + "/") - .header("Origin", "https://www.livejasmin.com") + .header("Origin", LiveJasmin.baseUrl) .header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") .header("Accept-Language", "de,en-US;q=0.7,en;q=0.3") @@ -91,7 +91,7 @@ public class LiveJasminWebSocketDownload implements Download { + "\",\"connectionData\":{\"jasmin2App\":true,\"isMobileClient\":false,\"platform\":\"desktop\",\"chatID\":\"freechat\"," + "\"sessionID\":\"" + sessionId + "\"," + "\"jsm2SessionId\":\"" + jsm2SessionId + "\",\"userType\":\"user\"," + "\"performerId\":\"" + model - + "\",\"clientRevision\":\"\",\"proxyIP\":\"\",\"playerVer\":\"nanoPlayerVersion: 3.10.3 appCodeName: Mozilla appName: Netscape appVersion: 5.0 (X11) platform: Linux x86_64\",\"livejasminTvmember\":false,\"newApplet\":true,\"livefeedtype\":null,\"gravityCookieId\":\"\",\"passparam\":\"\",\"brandID\":\"jasmin\",\"cobrandId\":\"\",\"subbrand\":\"livejasmin\",\"siteName\":\"LiveJasmin\",\"siteUrl\":\"https://www.livejasmin.com\"," + + "\",\"clientRevision\":\"\",\"proxyIP\":\"\",\"playerVer\":\"nanoPlayerVersion: 3.10.3 appCodeName: Mozilla appName: Netscape appVersion: 5.0 (X11) platform: Linux x86_64\",\"livejasminTvmember\":false,\"newApplet\":true,\"livefeedtype\":null,\"gravityCookieId\":\"\",\"passparam\":\"\",\"brandID\":\"jasmin\",\"cobrandId\":\"\",\"subbrand\":\"livejasmin\",\"siteName\":\"LiveJasmin\",\"siteUrl\":\""+LiveJasmin.baseUrl+"\"," + "\"clientInstanceId\":\"" + clientInstanceId + "\",\"armaVersion\":\"34.10.0\",\"isPassive\":false}}"); response.close(); } @@ -218,13 +218,13 @@ public class LiveJasminWebSocketDownload implements Download { } protected void getPerformerDetails(String name) throws IOException { - String url = "https://m.livejasmin.com/en/chat-html5/" + name; + String url = "https://m." + LiveJasmin.baseDomain + "/en/chat-html5/" + name; Request req = new Request.Builder() .url(url) .header("User-Agent", "Mozilla/5.0 (iPhone; CPU OS 10_14 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.1 Mobile/14E304 Safari/605.1.15") .header("Accept", "application/json,*/*") .header("Accept-Language", "en") - .header("Referer", "https://www.livejasmin.com") + .header("Referer", LiveJasmin.baseUrl) .header("X-Requested-With", "XMLHttpRequest") .build(); try (Response response = client.execute(req)) { @@ -260,7 +260,9 @@ public class LiveJasminWebSocketDownload implements Download { LOG.trace(rtmpUrl); LOG.trace(url); - Request request = new Request.Builder().url(url).header("Origin", "https://www.livejasmin.com") + Request request = new Request.Builder() + .url(url) + .header("Origin", LiveJasmin.baseUrl) .header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:63.0) Gecko/20100101 Firefox/63.0") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8").header("Accept-Language", "de,en-US;q=0.7,en;q=0.3") .build(); From b548db4a6614cbbc3a25884df3d41350f91fadc8 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 17:40:20 +0100 Subject: [PATCH 06/12] Adjust CamsodaUpdateService to new JSON structure --- .../sites/camsoda/CamsodaUpdateService.java | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java index 75f827a6..9f7ff403 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java @@ -84,31 +84,25 @@ public class CamsodaUpdateService extends PaginatedScheduledService { } else { String name = result.getString("username"); CamsodaModel model = (CamsodaModel) camsoda.createModel(name); - if(result.has("server_prefix")) { - String serverPrefix = result.getString("server_prefix"); - String streamName = result.getString("stream_name"); - model.setSortOrder(result.getFloat("sort_value")); - models.add(model); - if(result.has("status")) { - model.setOnlineStateByStatus(result.getString("status")); - } + String streamName = result.getString("stream_name"); + model.setSortOrder(result.getFloat("sort_value")); + models.add(model); + if(result.has("status")) { + model.setOnlineStateByStatus(result.getString("status")); + } - if(result.has("display_name")) { - model.setDisplayName(result.getString("display_name")); - } + if(result.has("display_name")) { + model.setDisplayName(result.getString("display_name")); + } - if(result.has("edge_servers")) { - JSONArray edgeServers = result.getJSONArray("edge_servers"); - model.setStreamUrl("https://" + edgeServers.getString(0) + "/cam/mp4:" + streamName + "_h264_aac_480p/playlist.m3u8"); - } + if(result.has("edge_servers")) { + JSONArray edgeServers = result.getJSONArray("edge_servers"); + model.setStreamUrl("https://" + edgeServers.getString(0) + "/cam/mp4:" + streamName + "_h264_aac_480p/playlist.m3u8"); + } - if(result.has("tsize")) { - long unixtime = System.currentTimeMillis() / 1000; - String tsize = result.getString("tsize"); - String preview = "https://thumbs-orig.camsoda.com/thumbs/" - + streamName + '/' + serverPrefix + '/' + tsize + '/' + unixtime + '/' + name + ".jpg?cb=" + unixtime; - model.setPreview(preview); - } + if(result.has("thumb")) { + String previewUrl = "https:" + result.getString("thumb"); + model.setPreview(previewUrl); } } } @@ -118,6 +112,7 @@ public class CamsodaUpdateService extends PaginatedScheduledService { .limit(modelsPerPage) .collect(Collectors.toList()); } else { + LOG.debug("Response was not successful: {}", json.toString()); return Collections.emptyList(); } } else { From c5474eb79b0b99684958df0321b07a42bef1eba4 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 17:40:46 +0100 Subject: [PATCH 07/12] Start OnlineMonitor after initializing the Sites --- server/src/main/java/ctbrec/recorder/server/HttpServer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/ctbrec/recorder/server/HttpServer.java b/server/src/main/java/ctbrec/recorder/server/HttpServer.java index 8cc3b289..d36328c4 100644 --- a/server/src/main/java/ctbrec/recorder/server/HttpServer.java +++ b/server/src/main/java/ctbrec/recorder/server/HttpServer.java @@ -68,13 +68,13 @@ public class HttpServer { LOG.info("HMAC authentication is enabled"); } recorder = new LocalRecorder(config); - OnlineMonitor monitor = new OnlineMonitor(recorder); - monitor.start(); for (Site site : sites) { if(site.isEnabled()) { site.init(); } } + OnlineMonitor monitor = new OnlineMonitor(recorder); + monitor.start(); startHttpServer(); } From e8572434a9c791884678252936852b1a890ffdf1 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 17:41:03 +0100 Subject: [PATCH 08/12] Set version to 1.17.1 --- client/pom.xml | 2 +- common/pom.xml | 2 +- master/pom.xml | 2 +- server/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index 0c1f7ca8..a133d018 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -8,7 +8,7 @@ ctbrec master - 1.17.0 + 1.17.1 ../master diff --git a/common/pom.xml b/common/pom.xml index 73f11d3b..dfc22d57 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -8,7 +8,7 @@ ctbrec master - 1.17.0 + 1.17.1 ../master diff --git a/master/pom.xml b/master/pom.xml index 5b7f7464..409000fa 100644 --- a/master/pom.xml +++ b/master/pom.xml @@ -6,7 +6,7 @@ ctbrec master pom - 1.17.0 + 1.17.1 ../common diff --git a/server/pom.xml b/server/pom.xml index 6a6473ec..22018611 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -8,7 +8,7 @@ ctbrec master - 1.17.0 + 1.17.1 ../master From 3d21f64ab0ba4d32585f2f2f9818d75b77f5e27d Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 17:54:10 +0100 Subject: [PATCH 09/12] Update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 936a05e6..45dd69d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +1.17.1 +======================== +* Improved LiveJasmin recordings. Login is not required anymore (thanks to M1h43ly) + HD recordings should also work much better +* Added setting for the base URL for LiveJasmin +* Fixed CamSoda thumbnail overviews + 1.17.0 ======================== * Added LiveJasmin From 0417fd6bfb66ffc11c17eda39074a887485011da Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 23 Jan 2019 18:27:34 +0100 Subject: [PATCH 10/12] Remove guest session cookies on start for LiveJasmin --- .../main/java/ctbrec/io/CookieJarImpl.java | 23 +++++++++++++++---- .../sites/jasmin/LiveJasminHttpClient.java | 12 ++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/ctbrec/io/CookieJarImpl.java b/common/src/main/java/ctbrec/io/CookieJarImpl.java index 324fb93a..add7b643 100644 --- a/common/src/main/java/ctbrec/io/CookieJarImpl.java +++ b/common/src/main/java/ctbrec/io/CookieJarImpl.java @@ -34,7 +34,7 @@ public class CookieJarImpl implements CookieJar { String name = oldCookie.name(); for (Cookie newCookie : cookies) { if(newCookie.name().equalsIgnoreCase(name)) { - LOG.debug("Replacing cookie {} {} -> {} [{}]", oldCookie.name(), oldCookie.value(), newCookie.value(), oldCookie.domain()); + LOG.trace("Replacing cookie {} {} -> {} [{}]", oldCookie.name(), oldCookie.value(), newCookie.value(), oldCookie.domain()); iterator.remove(); break; } @@ -42,11 +42,11 @@ public class CookieJarImpl implements CookieJar { } cookiesForUrl.addAll(cookies); cookieStore.put(host, cookiesForUrl); - LOG.debug("Adding cookie: {} for {}", cookiesForUrl, host); + LOG.trace("Adding cookie: {} for {}", cookiesForUrl, host); } else { cookieStore.put(host, cookies); - LOG.debug("Storing cookie: {} for {}", cookies, host); + LOG.trace("Storing cookie: {} for {}", cookies, host); } } @@ -54,9 +54,9 @@ public class CookieJarImpl implements CookieJar { public List loadForRequest(HttpUrl url) { String host = getDomain(url); List cookies = cookieStore.get(host); - LOG.debug("Cookies for {}", url); + LOG.trace("Cookies for {}", url); Optional.ofNullable(cookies).ifPresent(cookiez -> cookiez.forEach(c -> { - LOG.debug(" {} expires on:{}", c, c.expiresAt()); + LOG.trace(" {} expires on:{}", c, c.expiresAt()); })); //LOG.debug("Cookies for {}: {}", url.host(), cookies); return cookies != null ? cookies : new ArrayList(); @@ -72,6 +72,19 @@ public class CookieJarImpl implements CookieJar { throw new NoSuchElementException("No cookie named " + name + " for " + url.host() + " available"); } + public void deleteCookie(HttpUrl url, String name) { + List cookies = loadForRequest(url); + for (Iterator iterator = cookies.iterator(); iterator.hasNext();) { + Cookie cookie = iterator.next(); + if(Objects.equals(cookie.name(), name)) { + iterator.remove(); + LOG.debug("Removed cookie \"{}\" for {}", name, url.toString()); + return; + } + } + throw new NoSuchElementException("No cookie named " + name + " for " + url.host() + " available"); + } + private String getDomain(HttpUrl url) { // String host = url.host(); // if (host.startsWith("www.")) { diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java index 98c77107..dd625e90 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java @@ -20,6 +20,18 @@ public class LiveJasminHttpClient extends HttpClient { protected LiveJasminHttpClient() { super("livejasmin"); + + // delete session, if we are guests, because old guest sessions cause + // endless redirects + if(Config.getInstance().getSettings().livejasminUsername.isEmpty()) { + HttpUrl url = HttpUrl.parse("https://" + LiveJasmin.baseDomain); + try { + getCookieJar().deleteCookie(url, "session"); + } catch (NoSuchElementException e) { + LOG.debug("Session cookie not found -> let's go!"); + // fine, no session cookie means we are good to go + } + } } @Override From aa093c0ec1185c4167ef39da03880c9125d22271 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Thu, 24 Jan 2019 15:47:26 +0100 Subject: [PATCH 11/12] Delete all LiveJasmin cookies, if we are guests --- .../java/ctbrec/sites/jasmin/LiveJasminHttpClient.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java index dd625e90..00800c10 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHttpClient.java @@ -21,16 +21,10 @@ public class LiveJasminHttpClient extends HttpClient { protected LiveJasminHttpClient() { super("livejasmin"); - // delete session, if we are guests, because old guest sessions cause + // delete all cookies, if we are guests, because old guest sessions cause // endless redirects if(Config.getInstance().getSettings().livejasminUsername.isEmpty()) { - HttpUrl url = HttpUrl.parse("https://" + LiveJasmin.baseDomain); - try { - getCookieJar().deleteCookie(url, "session"); - } catch (NoSuchElementException e) { - LOG.debug("Session cookie not found -> let's go!"); - // fine, no session cookie means we are good to go - } + getCookieJar().clear(); } } From 6fcdce673d9d1194abb469fd32d47623aa8f2745 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Thu, 24 Jan 2019 15:52:25 +0100 Subject: [PATCH 12/12] Show error message on Followed tab, if credentials are missing --- .../ui/sites/jasmin/LiveJasminFollowedUpdateService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java index ecbd0066..4c1ae667 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminFollowedUpdateService.java @@ -38,6 +38,10 @@ public class LiveJasminFollowedUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { + if(!liveJasmin.credentialsAvailable()) { + throw new RuntimeException("Credentials missing"); + } + boolean loggedIn = SiteUiFactory.getUi(liveJasmin).login(); if(!loggedIn) { throw new RuntimeException("Couldn't login to livejasmin");