diff --git a/client/.project b/client/.project index 93146da6..d2d61fca 100644 --- a/client/.project +++ b/client/.project @@ -1,6 +1,6 @@ - ctbrec + ctbrec-client diff --git a/client/pom.xml b/client/pom.xml index c5d1764e..0c12d37b 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -3,9 +3,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ctbrec client - 1.9.0 + + + ctbrec + master + 1.9.0 + ../master + UTF-8 @@ -60,76 +65,58 @@ + + ctbrec + common + org.jsoup jsoup - 1.10.3 com.squareup.okhttp3 okhttp - 3.10.0 com.squareup.moshi moshi - 1.5.0 org.json json - 20180130 org.slf4j slf4j-api - 1.7.25 ch.qos.logback logback-classic - 1.2.3 runtime - - org.eclipse.jetty - jetty-server - [9.3.24.v20180605,) - - - org.eclipse.jetty - jetty-servlet - [9.3.24.v20180605,) - com.iheartradio.m3u8 open-m3u8 - 0.2.4 org.jcodec jcodec - 0.2.3 org.openjfx javafx-controls - 11 org.openjfx javafx-web - 11 com.google.guava guava - 17.0 junit junit - 4.12 test diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4HttpClient.java b/client/src/main/java/ctbrec/sites/cam4/Cam4HttpClient.java deleted file mode 100644 index b1b6d3ff..00000000 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4HttpClient.java +++ /dev/null @@ -1,125 +0,0 @@ -package ctbrec.sites.cam4; - -import java.io.IOException; -import java.net.HttpCookie; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; - -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import ctbrec.io.HttpClient; -import javafx.application.Platform; -import okhttp3.Cookie; -import okhttp3.HttpUrl; -import okhttp3.Request; -import okhttp3.Response; - -public class Cam4HttpClient extends HttpClient { - - private static final transient Logger LOG = LoggerFactory.getLogger(Cam4HttpClient.class); - - public Cam4HttpClient() { - super("cam4"); - } - - @Override - public synchronized boolean login() throws IOException { - if(loggedIn) { - return true; - } - - boolean cookiesWorked = checkLoginSuccess(); - if(cookiesWorked) { - loggedIn = true; - LOG.debug("Logged in with cookies"); - return true; - } - - BlockingQueue queue = new LinkedBlockingQueue<>(); - - Runnable showDialog = () -> { - // login with javafx WebView - Cam4LoginDialog loginDialog = new Cam4LoginDialog(); - - // transfer cookies from WebView to OkHttp cookie jar - transferCookies(loginDialog); - - try { - queue.put(true); - } catch (InterruptedException e) { - LOG.error("Error while signaling termination", e); - } - }; - - if(Platform.isFxApplicationThread()) { - showDialog.run(); - } else { - Platform.runLater(showDialog); - try { - queue.take(); - } catch (InterruptedException e) { - LOG.error("Error while waiting for login dialog to close", e); - throw new IOException(e); - } - } - - loggedIn = checkLoginSuccess(); - return loggedIn; - } - - /** - * check, if the login worked by requesting unchecked mail - * @throws IOException - */ - private boolean checkLoginSuccess() throws IOException { - String mailUrl = Cam4.BASE_URI + "/mail/unreadThreads"; - Request req = new Request.Builder() - .url(mailUrl) - .addHeader("X-Requested-With", "XMLHttpRequest") - .build(); - Response response = execute(req); - if(response.isSuccessful() && response.body().contentLength() > 0) { - JSONObject json = new JSONObject(response.body().string()); - return json.has("status") && Objects.equals("success", json.getString("status")); - } else { - response.close(); - return false; - } - } - - private void transferCookies(Cam4LoginDialog loginDialog) { - HttpUrl redirectedUrl = HttpUrl.parse(loginDialog.getUrl()); - List cookies = new ArrayList<>(); - for (HttpCookie webViewCookie : loginDialog.getCookies()) { - if(webViewCookie.getDomain().contains("cam4")) { - Cookie cookie = Cookie.parse(redirectedUrl, webViewCookie.toString()); - LOG.debug("{} {} {}", webViewCookie.getDomain(), webViewCookie.getName(), webViewCookie.getValue()); - cookies.add(cookie); - } - } - cookieJar.saveFromResponse(redirectedUrl, cookies); - - HttpUrl origUrl = HttpUrl.parse(Cam4LoginDialog.URL); - cookies = new ArrayList<>(); - for (HttpCookie webViewCookie : loginDialog.getCookies()) { - if(webViewCookie.getDomain().contains("cam4")) { - Cookie cookie = Cookie.parse(origUrl, webViewCookie.toString()); - cookies.add(cookie); - } - } - cookieJar.saveFromResponse(origUrl, cookies); - } - - protected int getTokenBalance() throws IOException { - if(!loggedIn) { - login(); - } - - throw new RuntimeException("Not implemented, yet"); - } -} diff --git a/client/src/main/java/ctbrec/ui/JavaFxModel.java b/client/src/main/java/ctbrec/ui/JavaFxModel.java index 7d94afb4..fccdd9e3 100644 --- a/client/src/main/java/ctbrec/ui/JavaFxModel.java +++ b/client/src/main/java/ctbrec/ui/JavaFxModel.java @@ -126,6 +126,7 @@ public class JavaFxModel implements Model { @Override public void receiveTip(int tokens) throws IOException { + SiteUiFactory.getUi(getSite()).login(); delegate.receiveTip(tokens); } @@ -136,11 +137,13 @@ public class JavaFxModel implements Model { @Override public boolean follow() throws IOException { + SiteUiFactory.getUi(getSite()).login(); return delegate.follow(); } @Override public boolean unfollow() throws IOException { + SiteUiFactory.getUi(getSite()).login(); return delegate.unfollow(); } diff --git a/client/src/main/java/ctbrec/ui/SettingsTab.java b/client/src/main/java/ctbrec/ui/SettingsTab.java index e0b1c27a..87ecf4b9 100644 --- a/client/src/main/java/ctbrec/ui/SettingsTab.java +++ b/client/src/main/java/ctbrec/ui/SettingsTab.java @@ -126,7 +126,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { rightSide.getChildren().add(credentialsAccordion); for (int i = 0; i < sites.size(); i++) { Site site = sites.get(i); - ConfigUI siteConfig = site.getConfigurationGui(); + ConfigUI siteConfig = SiteUiFactory.getUi(site).getConfigUI(); if(siteConfig != null) { TitledPane pane = new TitledPane(site.getName(), siteConfig.createConfigPanel()); credentialsAccordion.getPanes().add(pane); diff --git a/client/src/main/java/ctbrec/ui/SiteTabPane.java b/client/src/main/java/ctbrec/ui/SiteTabPane.java index 38785bfd..2902935f 100644 --- a/client/src/main/java/ctbrec/ui/SiteTabPane.java +++ b/client/src/main/java/ctbrec/ui/SiteTabPane.java @@ -14,7 +14,8 @@ public class SiteTabPane extends TabPane { setSide(Side.LEFT); // add all tabs - for (Tab tab : site.getTabProvider().getTabs(scene)) { + TabProvider tabProvider = SiteUiFactory.getUi(site).getTabProvider(); + for (Tab tab : tabProvider.getTabs(scene)) { getTabs().add(tab); } diff --git a/client/src/main/java/ctbrec/ui/SiteUI.java b/client/src/main/java/ctbrec/ui/SiteUI.java new file mode 100644 index 00000000..865b1b53 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/SiteUI.java @@ -0,0 +1,12 @@ +package ctbrec.ui; + +import java.io.IOException; + +import ctbrec.sites.ConfigUI; + +public interface SiteUI { + + public TabProvider getTabProvider(); + public ConfigUI getConfigUI(); + public boolean login() throws IOException; +} diff --git a/client/src/main/java/ctbrec/ui/SiteUiFactory.java b/client/src/main/java/ctbrec/ui/SiteUiFactory.java new file mode 100644 index 00000000..94352c1e --- /dev/null +++ b/client/src/main/java/ctbrec/ui/SiteUiFactory.java @@ -0,0 +1,53 @@ +package ctbrec.ui; + +import ctbrec.sites.Site; +import ctbrec.sites.bonga.BongaCams; +import ctbrec.sites.cam4.Cam4; +import ctbrec.sites.camsoda.Camsoda; +import ctbrec.sites.chaturbate.Chaturbate; +import ctbrec.sites.mfc.MyFreeCams; +import ctbrec.ui.sites.bonga.BongaCamsSiteUi; +import ctbrec.ui.sites.cam4.Cam4SiteUi; +import ctbrec.ui.sites.camsoda.CamsodaSiteUi; +import ctbrec.ui.sites.chaturbate.ChaturbateSiteUi; +import ctbrec.ui.sites.myfreecams.MyFreeCamsSiteUi; + +public class SiteUiFactory { + + private static BongaCamsSiteUi bongaSiteUi; + private static Cam4SiteUi cam4SiteUi; + private static CamsodaSiteUi camsodaSiteUi; + private static ChaturbateSiteUi ctbSiteUi; + private static MyFreeCamsSiteUi mfcSiteUi; + + public static SiteUI getUi(Site site) { + if (site instanceof BongaCams) { + if (bongaSiteUi == null) { + bongaSiteUi = new BongaCamsSiteUi((BongaCams) site); + } + return bongaSiteUi; + } else if (site instanceof Cam4) { + if (cam4SiteUi == null) { + cam4SiteUi = new Cam4SiteUi((Cam4) site); + } + return cam4SiteUi; + } else if (site instanceof Camsoda) { + if (camsodaSiteUi == null) { + camsodaSiteUi = new CamsodaSiteUi((Camsoda) site); + } + return camsodaSiteUi; + } else if (site instanceof Chaturbate) { + if (ctbSiteUi == null) { + ctbSiteUi = new ChaturbateSiteUi((Chaturbate) site); + } + return ctbSiteUi; + } else if (site instanceof MyFreeCams) { + if (mfcSiteUi == null) { + mfcSiteUi = new MyFreeCamsSiteUi((MyFreeCams) site); + } + return mfcSiteUi; + } + throw new RuntimeException("Unknown site " + site.getName()); + } + +} diff --git a/client/src/main/java/ctbrec/ui/ThumbCell.java b/client/src/main/java/ctbrec/ui/ThumbCell.java index f7441965..146cd680 100644 --- a/client/src/main/java/ctbrec/ui/ThumbCell.java +++ b/client/src/main/java/ctbrec/ui/ThumbCell.java @@ -401,6 +401,7 @@ public class ThumbCell extends StackPane { return CompletableFuture.supplyAsync(() -> { try { if(follow) { + SiteUiFactory.getUi(model.getSite()).login(); boolean followed = model.follow(); if(followed) { return true; @@ -415,6 +416,7 @@ public class ThumbCell extends StackPane { return false; } } else { + SiteUiFactory.getUi(model.getSite()).login(); boolean unfollowed = model.unfollow(); if(unfollowed) { Platform.runLater(() -> thumbCellList.remove(ThumbCell.this)); diff --git a/client/src/main/java/ctbrec/ui/ThumbOverviewTab.java b/client/src/main/java/ctbrec/ui/ThumbOverviewTab.java index 958ac30c..ba77291a 100644 --- a/client/src/main/java/ctbrec/ui/ThumbOverviewTab.java +++ b/client/src/main/java/ctbrec/ui/ThumbOverviewTab.java @@ -366,6 +366,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { if(tipText.matches("[1-9]\\d*")) { int tokens = Integer.parseInt(tipText); try { + SiteUiFactory.getUi(site).login(); cell.getModel().receiveTip(tokens); Map event = new HashMap<>(); event.put("event", "tokens.sent"); @@ -485,7 +486,8 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { } private double getFollowedTabYPosition() { - Tab followedTab = site.getTabProvider().getFollowedTab(); + TabProvider tabProvider = SiteUiFactory.getUi(site).getTabProvider(); + Tab followedTab = tabProvider.getFollowedTab(); TabPane tabPane = getTabPane(); int idx = tabPane.getTabs().indexOf(followedTab); for (Node node : tabPane.getChildrenUnmodifiable()) { diff --git a/client/src/main/java/ctbrec/ui/TipDialog.java b/client/src/main/java/ctbrec/ui/TipDialog.java index aa9dca22..2b4dfcf0 100644 --- a/client/src/main/java/ctbrec/ui/TipDialog.java +++ b/client/src/main/java/ctbrec/ui/TipDialog.java @@ -35,6 +35,7 @@ public class TipDialog extends TextInputDialog { @Override protected Integer call() throws Exception { if (!Objects.equals(System.getenv("CTBREC_DEV"), "1")) { + SiteUiFactory.getUi(site).login(); return site.getTokenBalance(); } else { return 1_000_000; diff --git a/client/src/main/java/ctbrec/ui/TokenLabel.java b/client/src/main/java/ctbrec/ui/TokenLabel.java index 30471ab8..d19b16d0 100644 --- a/client/src/main/java/ctbrec/ui/TokenLabel.java +++ b/client/src/main/java/ctbrec/ui/TokenLabel.java @@ -58,6 +58,7 @@ public class TokenLabel extends Label { @Override protected Integer call() throws Exception { if (!Objects.equals(System.getenv("CTBREC_DEV"), "1")) { + SiteUiFactory.getUi(site).login(); return site.getTokenBalance(); } else { return 1_000_000; diff --git a/client/src/main/java/ctbrec/sites/bonga/BongaCamsConfigUI.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java similarity index 97% rename from client/src/main/java/ctbrec/sites/bonga/BongaCamsConfigUI.java rename to client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java index 24bdc287..4c74d258 100644 --- a/client/src/main/java/ctbrec/sites/bonga/BongaCamsConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsConfigUI.java @@ -1,7 +1,8 @@ -package ctbrec.sites.bonga; +package ctbrec.ui.sites.bonga; import ctbrec.Config; import ctbrec.sites.ConfigUI; +import ctbrec.sites.bonga.BongaCams; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.SettingsTab; import javafx.geometry.Insets; diff --git a/client/src/main/java/ctbrec/sites/bonga/BongaCamsLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsLoginDialog.java similarity index 98% rename from client/src/main/java/ctbrec/sites/bonga/BongaCamsLoginDialog.java rename to client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsLoginDialog.java index 626667d3..099d0c7c 100644 --- a/client/src/main/java/ctbrec/sites/bonga/BongaCamsLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsLoginDialog.java @@ -1,4 +1,4 @@ -package ctbrec.sites.bonga; +package ctbrec.ui.sites.bonga; import java.io.File; import java.io.InputStream; @@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.OS; +import ctbrec.sites.bonga.BongaCams; import javafx.concurrent.Worker.State; import javafx.scene.Scene; import javafx.scene.control.ProgressIndicator; diff --git a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsSiteUi.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsSiteUi.java new file mode 100644 index 00000000..328528bc --- /dev/null +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsSiteUi.java @@ -0,0 +1,112 @@ +package ctbrec.ui.sites.bonga; + +import java.io.IOException; +import java.net.HttpCookie; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ctbrec.sites.ConfigUI; +import ctbrec.sites.bonga.BongaCams; +import ctbrec.sites.bonga.BongaCamsHttpClient; +import ctbrec.ui.SiteUI; +import ctbrec.ui.TabProvider; +import javafx.application.Platform; +import okhttp3.Cookie; +import okhttp3.CookieJar; +import okhttp3.HttpUrl; + +public class BongaCamsSiteUi implements SiteUI { + + private static final transient Logger LOG = LoggerFactory.getLogger(BongaCamsSiteUi.class); + private BongaCamsTabProvider tabProvider; + private BongaCamsConfigUI configUi; + private BongaCams bongaCams; + + public BongaCamsSiteUi(BongaCams bongaCams) { + this.bongaCams = bongaCams; + tabProvider = new BongaCamsTabProvider(bongaCams); + configUi = new BongaCamsConfigUI(bongaCams); + } + + @Override + public TabProvider getTabProvider() { + return tabProvider; + } + + @Override + public ConfigUI getConfigUI() { + return configUi; + } + + @Override + public boolean login() throws IOException { + boolean automaticLogin = bongaCams.login(); + if(automaticLogin) { + return true; + } else { + BlockingQueue queue = new LinkedBlockingQueue<>(); + + Runnable showDialog = () -> { + // login with javafx WebView + BongaCamsLoginDialog loginDialog = new BongaCamsLoginDialog(); + + // transfer cookies from WebView to OkHttp cookie jar + transferCookies(loginDialog); + + try { + queue.put(true); + } catch (InterruptedException e) { + LOG.error("Error while signaling termination", e); + } + }; + + if(Platform.isFxApplicationThread()) { + showDialog.run(); + } else { + Platform.runLater(showDialog); + try { + queue.take(); + } catch (InterruptedException e) { + LOG.error("Error while waiting for login dialog to close", e); + throw new IOException(e); + } + } + + BongaCamsHttpClient httpClient = (BongaCamsHttpClient)bongaCams.getHttpClient(); + boolean loggedIn = httpClient.checkLoginSuccess(); + if(loggedIn) { + LOG.info("Logged in. User ID is {}", httpClient.getUserId()); + } else { + LOG.info("Login failed"); + } + return loggedIn; + } + } + + + private void transferCookies(BongaCamsLoginDialog loginDialog) { + BongaCamsHttpClient httpClient = (BongaCamsHttpClient)bongaCams.getHttpClient(); + CookieJar cookieJar = httpClient.getCookieJar(); + + HttpUrl redirectedUrl = HttpUrl.parse(loginDialog.getUrl()); + List cookies = new ArrayList<>(); + for (HttpCookie webViewCookie : loginDialog.getCookies()) { + Cookie cookie = Cookie.parse(redirectedUrl, webViewCookie.toString()); + cookies.add(cookie); + } + cookieJar.saveFromResponse(redirectedUrl, cookies); + + HttpUrl origUrl = HttpUrl.parse(BongaCamsLoginDialog.URL); + cookies = new ArrayList<>(); + for (HttpCookie webViewCookie : loginDialog.getCookies()) { + Cookie cookie = Cookie.parse(origUrl, webViewCookie.toString()); + cookies.add(cookie); + } + cookieJar.saveFromResponse(origUrl, cookies); + } +} diff --git a/client/src/main/java/ctbrec/sites/bonga/BongaCamsTabProvider.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java similarity index 93% rename from client/src/main/java/ctbrec/sites/bonga/BongaCamsTabProvider.java rename to client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java index d54420dc..a0171d9a 100644 --- a/client/src/main/java/ctbrec/sites/bonga/BongaCamsTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsTabProvider.java @@ -1,9 +1,10 @@ -package ctbrec.sites.bonga; +package ctbrec.ui.sites.bonga; import java.util.ArrayList; import java.util.List; import ctbrec.recorder.Recorder; +import ctbrec.sites.bonga.BongaCams; import ctbrec.ui.PaginatedScheduledService; import ctbrec.ui.TabProvider; import ctbrec.ui.ThumbOverviewTab; @@ -16,9 +17,9 @@ public class BongaCamsTabProvider extends TabProvider { private Recorder recorder; private Tab friendsTab; - public BongaCamsTabProvider(Recorder recorder, BongaCams bongaCams) { - this.recorder = recorder; + public BongaCamsTabProvider(BongaCams bongaCams) { this.bongaCams = bongaCams; + this.recorder = bongaCams.getRecorder(); } @Override diff --git a/client/src/main/java/ctbrec/sites/bonga/BongaCamsUpdateService.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsUpdateService.java similarity index 96% rename from client/src/main/java/ctbrec/sites/bonga/BongaCamsUpdateService.java rename to client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsUpdateService.java index 9761be92..80f979fe 100644 --- a/client/src/main/java/ctbrec/sites/bonga/BongaCamsUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsUpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.bonga; +package ctbrec.ui.sites.bonga; import java.io.IOException; import java.util.ArrayList; @@ -11,6 +11,8 @@ import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.Model; +import ctbrec.sites.bonga.BongaCams; +import ctbrec.sites.bonga.BongaCamsModel; import ctbrec.ui.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4ConfigUI.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java similarity index 97% rename from client/src/main/java/ctbrec/sites/cam4/Cam4ConfigUI.java rename to client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java index 04ad5c9a..4429c729 100644 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4ConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4ConfigUI.java @@ -1,7 +1,8 @@ -package ctbrec.sites.cam4; +package ctbrec.ui.sites.cam4; import ctbrec.Config; import ctbrec.sites.ConfigUI; +import ctbrec.sites.cam4.Cam4; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.SettingsTab; import javafx.geometry.Insets; diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4FollowedTab.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedTab.java similarity index 97% rename from client/src/main/java/ctbrec/sites/cam4/Cam4FollowedTab.java rename to client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedTab.java index bd25fa90..f56a4743 100644 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4FollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedTab.java @@ -1,5 +1,6 @@ -package ctbrec.sites.cam4; +package ctbrec.ui.sites.cam4; +import ctbrec.sites.cam4.Cam4; import ctbrec.ui.FollowedTab; import ctbrec.ui.ThumbOverviewTab; import javafx.concurrent.WorkerStateEvent; diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4FollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedUpdateService.java similarity index 93% rename from client/src/main/java/ctbrec/sites/cam4/Cam4FollowedUpdateService.java rename to client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedUpdateService.java index a3757293..60047998 100644 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4FollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4FollowedUpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.cam4; +package ctbrec.ui.sites.cam4; import java.io.IOException; import java.util.ArrayList; @@ -16,9 +16,12 @@ import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.Model; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpException; -import ctbrec.ui.HtmlParser; +import ctbrec.sites.cam4.Cam4; +import ctbrec.sites.cam4.Cam4Model; import ctbrec.ui.PaginatedScheduledService; +import ctbrec.ui.SiteUiFactory; import javafx.concurrent.Task; import okhttp3.Request; import okhttp3.Response; @@ -48,11 +51,13 @@ public class Cam4FollowedUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { + // login first + SiteUiFactory.getUi(site).login(); List models = new ArrayList<>(); String username = Config.getInstance().getSettings().cam4Username; String url = site.getBaseUrl() + '/' + username + "/edit/friends_favorites"; Request req = new Request.Builder().url(url).build(); - try(Response response = site.getHttpClient().execute(req, true)) { + try(Response response = site.getHttpClient().execute(req)) { if(response.isSuccessful()) { String content = response.body().string(); Elements cells = HtmlParser.getTags(content, "div#favorites div.ff_thumb"); diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4LoginDialog.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4LoginDialog.java similarity index 98% rename from client/src/main/java/ctbrec/sites/cam4/Cam4LoginDialog.java rename to client/src/main/java/ctbrec/ui/sites/cam4/Cam4LoginDialog.java index bb862bed..65c13019 100644 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4LoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4LoginDialog.java @@ -1,4 +1,4 @@ -package ctbrec.sites.cam4; +package ctbrec.ui.sites.cam4; import java.io.File; import java.io.InputStream; @@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.OS; +import ctbrec.sites.cam4.Cam4; import javafx.concurrent.Worker.State; import javafx.scene.Scene; import javafx.scene.control.ProgressIndicator; diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4SiteUi.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4SiteUi.java new file mode 100644 index 00000000..d0c5d2b5 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4SiteUi.java @@ -0,0 +1,113 @@ +package ctbrec.ui.sites.cam4; + +import java.io.IOException; +import java.net.HttpCookie; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ctbrec.sites.ConfigUI; +import ctbrec.sites.cam4.Cam4; +import ctbrec.sites.cam4.Cam4HttpClient; +import ctbrec.ui.SiteUI; +import ctbrec.ui.TabProvider; +import javafx.application.Platform; +import okhttp3.Cookie; +import okhttp3.CookieJar; +import okhttp3.HttpUrl; + +public class Cam4SiteUi implements SiteUI { + private static final transient Logger LOG = LoggerFactory.getLogger(Cam4SiteUi.class); + + private Cam4TabProvider tabProvider; + private Cam4ConfigUI configUI; + private Cam4 cam4; + + public Cam4SiteUi(Cam4 cam4) { + this.cam4 = cam4; + tabProvider = new Cam4TabProvider(cam4); + configUI = new Cam4ConfigUI(); + } + + @Override + public TabProvider getTabProvider() { + return tabProvider; + } + + @Override + public ConfigUI getConfigUI() { + return configUI; + } + + @Override + public boolean login() throws IOException { + boolean automaticLogin = cam4.login(); + if(automaticLogin) { + return true; + } else { + + BlockingQueue queue = new LinkedBlockingQueue<>(); + + Runnable showDialog = () -> { + // login with javafx WebView + Cam4LoginDialog loginDialog = new Cam4LoginDialog(); + + // transfer cookies from WebView to OkHttp cookie jar + transferCookies(loginDialog); + + try { + queue.put(true); + } catch (InterruptedException e) { + LOG.error("Error while signaling termination", e); + } + }; + + if(Platform.isFxApplicationThread()) { + showDialog.run(); + } else { + Platform.runLater(showDialog); + try { + queue.take(); + } catch (InterruptedException e) { + LOG.error("Error while waiting for login dialog to close", e); + throw new IOException(e); + } + } + + Cam4HttpClient httpClient = (Cam4HttpClient) cam4.getHttpClient(); + boolean loggedIn = httpClient.checkLoginSuccess(); + return loggedIn; + } + } + + + private void transferCookies(Cam4LoginDialog loginDialog) { + Cam4HttpClient httpClient = (Cam4HttpClient) cam4.getHttpClient(); + CookieJar cookieJar = httpClient.getCookieJar(); + + HttpUrl redirectedUrl = HttpUrl.parse(loginDialog.getUrl()); + List cookies = new ArrayList<>(); + for (HttpCookie webViewCookie : loginDialog.getCookies()) { + if(webViewCookie.getDomain().contains("cam4")) { + Cookie cookie = Cookie.parse(redirectedUrl, webViewCookie.toString()); + LOG.debug("{} {} {}", webViewCookie.getDomain(), webViewCookie.getName(), webViewCookie.getValue()); + cookies.add(cookie); + } + } + cookieJar.saveFromResponse(redirectedUrl, cookies); + + HttpUrl origUrl = HttpUrl.parse(Cam4LoginDialog.URL); + cookies = new ArrayList<>(); + for (HttpCookie webViewCookie : loginDialog.getCookies()) { + if(webViewCookie.getDomain().contains("cam4")) { + Cookie cookie = Cookie.parse(origUrl, webViewCookie.toString()); + cookies.add(cookie); + } + } + cookieJar.saveFromResponse(origUrl, cookies); + } +} diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4TabProvider.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java similarity index 91% rename from client/src/main/java/ctbrec/sites/cam4/Cam4TabProvider.java rename to client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java index fc8d0acf..38fd1745 100644 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4TabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java @@ -1,9 +1,10 @@ -package ctbrec.sites.cam4; +package ctbrec.ui.sites.cam4; import java.util.ArrayList; import java.util.List; import ctbrec.recorder.Recorder; +import ctbrec.sites.cam4.Cam4; import ctbrec.ui.TabProvider; import ctbrec.ui.ThumbOverviewTab; import javafx.scene.Scene; @@ -15,9 +16,9 @@ public class Cam4TabProvider extends TabProvider { private Recorder recorder; private Cam4FollowedTab followed; - public Cam4TabProvider(Cam4 cam4, Recorder recorder) { + public Cam4TabProvider(Cam4 cam4) { this.cam4 = cam4; - this.recorder = recorder; + this.recorder = cam4.getRecorder(); } @Override diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4UpdateService.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4UpdateService.java similarity index 92% rename from client/src/main/java/ctbrec/sites/cam4/Cam4UpdateService.java rename to client/src/main/java/ctbrec/ui/sites/cam4/Cam4UpdateService.java index da6ea05f..40905828 100644 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4UpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4UpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.cam4; +package ctbrec.ui.sites.cam4; import java.io.IOException; import java.util.ArrayList; @@ -8,7 +8,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; -import org.eclipse.jetty.util.StringUtil; import org.json.JSONObject; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; @@ -17,9 +16,13 @@ import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.Model; +import ctbrec.StringUtil; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpException; -import ctbrec.ui.HtmlParser; +import ctbrec.sites.cam4.Cam4; +import ctbrec.sites.cam4.Cam4Model; import ctbrec.ui.PaginatedScheduledService; +import ctbrec.ui.SiteUiFactory; import javafx.concurrent.Task; import okhttp3.Request; import okhttp3.Response; @@ -58,8 +61,11 @@ public class Cam4UpdateService extends PaginatedScheduledService { } else { String url = Cam4UpdateService.this.url + "&page=" + page; LOG.debug("Fetching page {}", url); + if(loginRequired) { + SiteUiFactory.getUi(site).login(); + } Request request = new Request.Builder().url(url).build(); - try (Response response = site.getHttpClient().execute(request, loginRequired)) { + try (Response response = site.getHttpClient().execute(request)) { if (response.isSuccessful()) { JSONObject json = new JSONObject(response.body().string()); String html = json.getString("html"); diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaConfigUI.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java similarity index 96% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaConfigUI.java rename to client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java index 9669e865..c8468a82 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaConfigUI.java @@ -1,7 +1,8 @@ -package ctbrec.sites.camsoda; +package ctbrec.ui.sites.camsoda; import ctbrec.Config; import ctbrec.sites.ConfigUI; +import ctbrec.sites.camsoda.Camsoda; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.SettingsTab; import javafx.geometry.Insets; diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaFollowedTab.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedTab.java similarity index 97% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaFollowedTab.java rename to client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedTab.java index bc95672b..d1d5a8c6 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaFollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedTab.java @@ -1,5 +1,6 @@ -package ctbrec.sites.camsoda; +package ctbrec.ui.sites.camsoda; +import ctbrec.sites.camsoda.Camsoda; import ctbrec.ui.FollowedTab; import ctbrec.ui.ThumbOverviewTab; import javafx.concurrent.WorkerStateEvent; diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaFollowedUpdateService.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedUpdateService.java similarity index 93% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaFollowedUpdateService.java rename to client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedUpdateService.java index 16b45af7..4e92d25c 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaFollowedUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaFollowedUpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.camsoda; +package ctbrec.ui.sites.camsoda; import java.io.IOException; import java.util.ArrayList; @@ -12,7 +12,10 @@ import org.json.JSONObject; import ctbrec.Model; import ctbrec.io.HttpException; +import ctbrec.sites.camsoda.Camsoda; +import ctbrec.sites.camsoda.CamsodaModel; import ctbrec.ui.PaginatedScheduledService; +import ctbrec.ui.SiteUiFactory; import javafx.concurrent.Task; import okhttp3.Request; import okhttp3.Response; @@ -32,8 +35,9 @@ public class CamsodaFollowedUpdateService extends PaginatedScheduledService { public List call() throws IOException { List models = new ArrayList<>(); String url = camsoda.getBaseUrl() + "/api/v1/user/current"; + SiteUiFactory.getUi(camsoda).login(); Request request = new Request.Builder().url(url).build(); - try(Response response = camsoda.getHttpClient().execute(request, true)) { + try(Response response = camsoda.getHttpClient().execute(request)) { if (response.isSuccessful()) { JSONObject json = new JSONObject(response.body().string()); if(json.has("status") && json.getBoolean("status")) { diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaLoginDialog.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaLoginDialog.java similarity index 98% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaLoginDialog.java rename to client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaLoginDialog.java index 6668babf..e08731ea 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaLoginDialog.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaLoginDialog.java @@ -1,4 +1,4 @@ -package ctbrec.sites.camsoda; +package ctbrec.ui.sites.camsoda; import java.io.File; import java.io.InputStream; @@ -9,6 +9,7 @@ import java.util.Base64; import java.util.List; import ctbrec.OS; +import ctbrec.sites.camsoda.Camsoda; import javafx.concurrent.Worker.State; import javafx.scene.Scene; import javafx.scene.control.ProgressIndicator; diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaShowsTab.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java similarity index 98% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaShowsTab.java rename to client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java index 8ebcb4bb..377797ee 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaShowsTab.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java @@ -1,4 +1,4 @@ -package ctbrec.sites.camsoda; +package ctbrec.ui.sites.camsoda; import java.io.IOException; import java.security.InvalidKeyException; @@ -21,8 +21,10 @@ import org.slf4j.LoggerFactory; import ctbrec.Model; import ctbrec.recorder.Recorder; +import ctbrec.sites.camsoda.Camsoda; import ctbrec.ui.AutosizeAlert; import ctbrec.ui.DesktopIntegration; +import ctbrec.ui.SiteUiFactory; import ctbrec.ui.TabSelectionListener; import javafx.application.Platform; import javafx.beans.value.ChangeListener; @@ -203,6 +205,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { setCursor(Cursor.WAIT); new Thread(() -> { try { + SiteUiFactory.getUi(model.getSite()).login(); model.follow(); } catch (Exception e) { LOG.error("Couldn't follow model {}", model, e); diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaSiteUi.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaSiteUi.java new file mode 100644 index 00000000..a86f72e3 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaSiteUi.java @@ -0,0 +1,107 @@ +package ctbrec.ui.sites.camsoda; + +import java.io.IOException; +import java.net.HttpCookie; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ctbrec.sites.ConfigUI; +import ctbrec.sites.camsoda.Camsoda; +import ctbrec.sites.camsoda.CamsodaHttpClient; +import ctbrec.ui.SiteUI; +import ctbrec.ui.TabProvider; +import ctbrec.ui.sites.cam4.Cam4LoginDialog; +import javafx.application.Platform; +import okhttp3.Cookie; +import okhttp3.HttpUrl; + +public class CamsodaSiteUi implements SiteUI { + + private static final transient Logger LOG = LoggerFactory.getLogger(CamsodaSiteUi.class); + + private CamsodaTabProvider tabProvider; + private CamsodaConfigUI configUi; + private Camsoda camsoda; + + public CamsodaSiteUi(Camsoda camsoda) { + this.camsoda = camsoda; + tabProvider = new CamsodaTabProvider(camsoda); + configUi = new CamsodaConfigUI(camsoda); + } + + @Override + public TabProvider getTabProvider() { + return tabProvider; + } + + @Override + public ConfigUI getConfigUI() { + return configUi; + } + + @Override + public boolean login() throws IOException { + boolean automaticLogin = camsoda.login(); + return automaticLogin; + } + + + @SuppressWarnings("unused") + private boolean loginWithDialog() throws IOException { + BlockingQueue queue = new LinkedBlockingQueue<>(); + + Runnable showDialog = () -> { + // login with javafx WebView + CamsodaLoginDialog loginDialog = new CamsodaLoginDialog(); + + // transfer cookies from WebView to OkHttp cookie jar + transferCookies(loginDialog); + + try { + queue.put(true); + } catch (InterruptedException e) { + LOG.error("Error while signaling termination", e); + } + }; + + if(Platform.isFxApplicationThread()) { + showDialog.run(); + } else { + Platform.runLater(showDialog); + try { + queue.take(); + } catch (InterruptedException e) { + LOG.error("Error while waiting for login dialog to close", e); + throw new IOException(e); + } + } + + CamsodaHttpClient httpClient = (CamsodaHttpClient)camsoda.getHttpClient(); + boolean loggedIn = httpClient.checkLoginSuccess(); + return loggedIn; + } + + private void transferCookies(CamsodaLoginDialog loginDialog) { + HttpUrl redirectedUrl = HttpUrl.parse(loginDialog.getUrl()); + List cookies = new ArrayList<>(); + for (HttpCookie webViewCookie : loginDialog.getCookies()) { + Cookie cookie = Cookie.parse(redirectedUrl, webViewCookie.toString()); + cookies.add(cookie); + } + camsoda.getHttpClient().getCookieJar().saveFromResponse(redirectedUrl, cookies); + + HttpUrl origUrl = HttpUrl.parse(Cam4LoginDialog.URL); + cookies = new ArrayList<>(); + for (HttpCookie webViewCookie : loginDialog.getCookies()) { + Cookie cookie = Cookie.parse(origUrl, webViewCookie.toString()); + cookies.add(cookie); + } + camsoda.getHttpClient().getCookieJar().saveFromResponse(origUrl, cookies); + } + +} diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaTabProvider.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java similarity index 88% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaTabProvider.java rename to client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java index 7ac423a6..5873b9cf 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java @@ -1,4 +1,4 @@ -package ctbrec.sites.camsoda; +package ctbrec.ui.sites.camsoda; import static ctbrec.sites.camsoda.Camsoda.*; @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; import ctbrec.recorder.Recorder; +import ctbrec.sites.camsoda.Camsoda; import ctbrec.ui.TabProvider; import ctbrec.ui.ThumbOverviewTab; import javafx.scene.Scene; @@ -17,9 +18,9 @@ public class CamsodaTabProvider extends TabProvider { private Recorder recorder; CamsodaFollowedTab followedTab; - public CamsodaTabProvider(Camsoda camsoda, Recorder recorder) { + public CamsodaTabProvider(Camsoda camsoda) { this.camsoda = camsoda; - this.recorder = recorder; + this.recorder = camsoda.getRecorder(); followedTab = new CamsodaFollowedTab("Followed", camsoda); } diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaUpdateService.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java similarity index 95% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaUpdateService.java rename to client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java index c76b3c28..f7b6e321 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.camsoda; +package ctbrec.ui.sites.camsoda; import java.io.IOException; import java.util.ArrayList; @@ -6,15 +6,18 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import org.eclipse.jetty.util.StringUtil; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Model; +import ctbrec.StringUtil; import ctbrec.io.HttpException; +import ctbrec.sites.camsoda.Camsoda; +import ctbrec.sites.camsoda.CamsodaModel; import ctbrec.ui.PaginatedScheduledService; +import ctbrec.ui.SiteUiFactory; import javafx.concurrent.Task; import okhttp3.Request; import okhttp3.Response; @@ -45,8 +48,11 @@ public class CamsodaUpdateService extends PaginatedScheduledService { } else { String url = CamsodaUpdateService.this.url; LOG.debug("Fetching page {}", url); + if(loginRequired) { + SiteUiFactory.getUi(camsoda).login(); + } Request request = new Request.Builder().url(url).build(); - try(Response response = camsoda.getHttpClient().execute(request, loginRequired)) { + try(Response response = camsoda.getHttpClient().execute(request)) { if (response.isSuccessful()) { JSONObject json = new JSONObject(response.body().string()); if(json.has("status") && json.getBoolean("status")) { diff --git a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateConfigUi.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java similarity index 96% rename from client/src/main/java/ctbrec/sites/chaturbate/ChaturbateConfigUi.java rename to client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java index ee5c6b68..1a824c0c 100644 --- a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateConfigUi.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateConfigUi.java @@ -1,7 +1,8 @@ -package ctbrec.sites.chaturbate; +package ctbrec.ui.sites.chaturbate; import ctbrec.Config; import ctbrec.sites.ConfigUI; +import ctbrec.sites.chaturbate.Chaturbate; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.SettingsTab; import javafx.geometry.Insets; diff --git a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateFollowedTab.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateFollowedTab.java similarity index 97% rename from client/src/main/java/ctbrec/sites/chaturbate/ChaturbateFollowedTab.java rename to client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateFollowedTab.java index 16e5220a..a94b986f 100644 --- a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateFollowedTab.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateFollowedTab.java @@ -1,5 +1,6 @@ -package ctbrec.sites.chaturbate; +package ctbrec.ui.sites.chaturbate; +import ctbrec.sites.chaturbate.Chaturbate; import ctbrec.ui.FollowedTab; import ctbrec.ui.ThumbOverviewTab; import javafx.concurrent.WorkerStateEvent; diff --git a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateSiteUi.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateSiteUi.java new file mode 100644 index 00000000..7765e717 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateSiteUi.java @@ -0,0 +1,37 @@ +package ctbrec.ui.sites.chaturbate; + +import java.io.IOException; + +import ctbrec.sites.ConfigUI; +import ctbrec.sites.chaturbate.Chaturbate; +import ctbrec.ui.SiteUI; +import ctbrec.ui.TabProvider; + +public class ChaturbateSiteUi implements SiteUI { + + private ChaturbateTabProvider tabProvider; + private ChaturbateConfigUi configUi; + private Chaturbate chaturbate; + + public ChaturbateSiteUi(Chaturbate chaturbate) { + this.chaturbate = chaturbate; + tabProvider = new ChaturbateTabProvider(chaturbate); + configUi = new ChaturbateConfigUi(); + } + + @Override + public TabProvider getTabProvider() { + return tabProvider; + } + + @Override + public ConfigUI getConfigUI() { + return configUi; + } + + @Override + public boolean login() throws IOException { + return chaturbate.login(); + } + +} diff --git a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateTabProvider.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java similarity index 89% rename from client/src/main/java/ctbrec/sites/chaturbate/ChaturbateTabProvider.java rename to client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java index 3d01dd7d..b9864907 100644 --- a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java @@ -1,4 +1,4 @@ -package ctbrec.sites.chaturbate; +package ctbrec.ui.sites.chaturbate; import static ctbrec.sites.chaturbate.Chaturbate.*; @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; import ctbrec.recorder.Recorder; +import ctbrec.sites.chaturbate.Chaturbate; import ctbrec.ui.TabProvider; import ctbrec.ui.ThumbOverviewTab; import javafx.scene.Scene; @@ -17,9 +18,9 @@ public class ChaturbateTabProvider extends TabProvider { private Recorder recorder; private ChaturbateFollowedTab followedTab; - public ChaturbateTabProvider(Chaturbate chaturbate, Recorder recorder) { + public ChaturbateTabProvider(Chaturbate chaturbate) { this.chaturbate = chaturbate; - this.recorder = recorder; + this.recorder = chaturbate.getRecorder(); this.followedTab = new ChaturbateFollowedTab("Followed", BASE_URI + "/followed-cams/", chaturbate); } diff --git a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateUpdateService.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateUpdateService.java similarity index 88% rename from client/src/main/java/ctbrec/sites/chaturbate/ChaturbateUpdateService.java rename to client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateUpdateService.java index 612602c0..84d5cdc2 100644 --- a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateUpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.chaturbate; +package ctbrec.ui.sites.chaturbate; import java.io.IOException; import java.util.Collections; @@ -7,12 +7,15 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; -import org.eclipse.jetty.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Model; +import ctbrec.StringUtil; +import ctbrec.sites.chaturbate.Chaturbate; +import ctbrec.sites.chaturbate.ChaturbateModelParser; import ctbrec.ui.PaginatedScheduledService; +import ctbrec.ui.SiteUiFactory; import javafx.concurrent.Task; import okhttp3.Request; import okhttp3.Response; @@ -51,8 +54,11 @@ public class ChaturbateUpdateService extends PaginatedScheduledService { } else { String url = ChaturbateUpdateService.this.url + "?page="+page+"&keywords=&_=" + System.currentTimeMillis(); LOG.debug("Fetching page {}", url); + if(loginRequired) { + SiteUiFactory.getUi(chaturbate).login(); + } Request request = new Request.Builder().url(url).build(); - Response response = chaturbate.getHttpClient().execute(request, loginRequired); + Response response = chaturbate.getHttpClient().execute(request); if (response.isSuccessful()) { List models = ChaturbateModelParser.parseModels(chaturbate, response.body().string()); response.close(); diff --git a/client/src/main/java/ctbrec/sites/mfc/FriendsUpdateService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/FriendsUpdateService.java similarity index 92% rename from client/src/main/java/ctbrec/sites/mfc/FriendsUpdateService.java rename to client/src/main/java/ctbrec/ui/sites/myfreecams/FriendsUpdateService.java index 08ac013c..75ddff18 100644 --- a/client/src/main/java/ctbrec/sites/mfc/FriendsUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/FriendsUpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.mfc; +package ctbrec.ui.sites.myfreecams; import java.io.IOException; @@ -7,13 +7,19 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import org.eclipse.jetty.util.StringUtil; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Model; +import ctbrec.StringUtil; +import ctbrec.sites.mfc.MyFreeCams; +import ctbrec.sites.mfc.MyFreeCamsClient; +import ctbrec.sites.mfc.MyFreeCamsModel; +import ctbrec.sites.mfc.SessionState; +import ctbrec.sites.mfc.User; import ctbrec.ui.PaginatedScheduledService; +import ctbrec.ui.SiteUiFactory; import javafx.concurrent.Task; import okhttp3.Request; import okhttp3.Response; @@ -42,12 +48,13 @@ public class FriendsUpdateService extends PaginatedScheduledService { return Collections.emptyList(); } else { List models = new ArrayList<>(); + SiteUiFactory.getUi(myFreeCams).login(); String url = myFreeCams.getBaseUrl() + "/php/manage_lists2.php?passcode=&list_type=friends&data_mode=online&get_user_list=1"; Request req = new Request.Builder() .url(url) .header("Referer", myFreeCams.getBaseUrl()) .build(); - try(Response resp = myFreeCams.getHttpClient().execute(req, true)) { + try(Response resp = myFreeCams.getHttpClient().execute(req)) { if(resp.isSuccessful()) { String body = resp.body().string().substring(4); try { diff --git a/client/src/main/java/ctbrec/sites/mfc/HDCamsUpdateService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/HDCamsUpdateService.java similarity index 94% rename from client/src/main/java/ctbrec/sites/mfc/HDCamsUpdateService.java rename to client/src/main/java/ctbrec/ui/sites/myfreecams/HDCamsUpdateService.java index 9ed26925..9fd990ac 100644 --- a/client/src/main/java/ctbrec/sites/mfc/HDCamsUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/HDCamsUpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.mfc; +package ctbrec.ui.sites.myfreecams; import java.io.IOException; @@ -6,6 +6,7 @@ import java.util.List; import java.util.stream.Collectors; import ctbrec.Model; +import ctbrec.sites.mfc.MyFreeCamsClient; import ctbrec.ui.PaginatedScheduledService; import javafx.concurrent.Task; diff --git a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsConfigUI.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsConfigUI.java similarity index 96% rename from client/src/main/java/ctbrec/sites/mfc/MyFreeCamsConfigUI.java rename to client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsConfigUI.java index 2f26f1d9..e74f63d8 100644 --- a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsConfigUI.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsConfigUI.java @@ -1,7 +1,8 @@ -package ctbrec.sites.mfc; +package ctbrec.ui.sites.myfreecams; import ctbrec.Config; import ctbrec.sites.ConfigUI; +import ctbrec.sites.mfc.MyFreeCams; import ctbrec.ui.DesktopIntegration; import ctbrec.ui.SettingsTab; import javafx.geometry.Insets; diff --git a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsFriendsTab.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsFriendsTab.java similarity index 93% rename from client/src/main/java/ctbrec/sites/mfc/MyFreeCamsFriendsTab.java rename to client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsFriendsTab.java index eb1f7e31..5b2e2a31 100644 --- a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsFriendsTab.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsFriendsTab.java @@ -1,8 +1,9 @@ -package ctbrec.sites.mfc; -import static ctbrec.sites.mfc.FriendsUpdateService.Mode.*; +package ctbrec.ui.sites.myfreecams; +import static ctbrec.ui.sites.myfreecams.FriendsUpdateService.Mode.*; import java.util.concurrent.TimeUnit; +import ctbrec.sites.mfc.MyFreeCams; import ctbrec.ui.FollowedTab; import ctbrec.ui.ThumbOverviewTab; import javafx.geometry.Insets; diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsSiteUi.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsSiteUi.java new file mode 100644 index 00000000..f98528ed --- /dev/null +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsSiteUi.java @@ -0,0 +1,37 @@ +package ctbrec.ui.sites.myfreecams; + +import java.io.IOException; + +import ctbrec.sites.ConfigUI; +import ctbrec.sites.mfc.MyFreeCams; +import ctbrec.ui.SiteUI; +import ctbrec.ui.TabProvider; + +public class MyFreeCamsSiteUi implements SiteUI { + + private MyFreeCamsTabProvider tabProvider; + private MyFreeCamsConfigUI configUi; + private MyFreeCams myFreeCams; + + public MyFreeCamsSiteUi(MyFreeCams myFreeCams) { + this.myFreeCams = myFreeCams; + tabProvider = new MyFreeCamsTabProvider(myFreeCams); + configUi = new MyFreeCamsConfigUI(myFreeCams); + } + + @Override + public TabProvider getTabProvider() { + return tabProvider; + } + + @Override + public ConfigUI getConfigUI() { + return configUi; + } + + @Override + public boolean login() throws IOException { + return myFreeCams.login(); + } + +} diff --git a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsTabProvider.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java similarity index 90% rename from client/src/main/java/ctbrec/sites/mfc/MyFreeCamsTabProvider.java rename to client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java index 5035c28d..ad5eb961 100644 --- a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java @@ -1,10 +1,11 @@ -package ctbrec.sites.mfc; +package ctbrec.ui.sites.myfreecams; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import ctbrec.recorder.Recorder; +import ctbrec.sites.mfc.MyFreeCams; import ctbrec.ui.PaginatedScheduledService; import ctbrec.ui.TabProvider; import ctbrec.ui.ThumbOverviewTab; @@ -17,9 +18,9 @@ public class MyFreeCamsTabProvider extends TabProvider { private MyFreeCams myFreeCams; private MyFreeCamsFriendsTab friends; - public MyFreeCamsTabProvider(MyFreeCamsClient client, Recorder recorder, MyFreeCams myFreeCams) { - this.recorder = recorder; + public MyFreeCamsTabProvider(MyFreeCams myFreeCams) { this.myFreeCams = myFreeCams; + this.recorder = myFreeCams.getRecorder(); } @Override diff --git a/client/src/main/java/ctbrec/sites/mfc/OnlineCamsUpdateService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/OnlineCamsUpdateService.java similarity index 94% rename from client/src/main/java/ctbrec/sites/mfc/OnlineCamsUpdateService.java rename to client/src/main/java/ctbrec/ui/sites/myfreecams/OnlineCamsUpdateService.java index 6ecaf5ba..320aae5c 100644 --- a/client/src/main/java/ctbrec/sites/mfc/OnlineCamsUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/OnlineCamsUpdateService.java @@ -1,4 +1,4 @@ -package ctbrec.sites.mfc; +package ctbrec.ui.sites.myfreecams; import java.io.IOException; @@ -6,6 +6,7 @@ import java.util.List; import java.util.stream.Collectors; import ctbrec.Model; +import ctbrec.sites.mfc.MyFreeCamsClient; import ctbrec.ui.PaginatedScheduledService; import javafx.concurrent.Task; diff --git a/client/src/main/java/ctbrec/sites/mfc/PopularModelService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/PopularModelService.java similarity index 94% rename from client/src/main/java/ctbrec/sites/mfc/PopularModelService.java rename to client/src/main/java/ctbrec/ui/sites/myfreecams/PopularModelService.java index fea5f2fd..9d60eebd 100644 --- a/client/src/main/java/ctbrec/sites/mfc/PopularModelService.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/PopularModelService.java @@ -1,10 +1,11 @@ -package ctbrec.sites.mfc; +package ctbrec.ui.sites.myfreecams; import java.io.IOException; import java.util.List; import java.util.stream.Collectors; import ctbrec.Model; +import ctbrec.sites.mfc.MyFreeCamsClient; import ctbrec.ui.PaginatedScheduledService; import javafx.concurrent.Task; diff --git a/common/.classpath b/common/.classpath new file mode 100644 index 00000000..e1b830e8 --- /dev/null +++ b/common/.classpath @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 00000000..09e3bc9b --- /dev/null +++ b/common/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/common/.project b/common/.project new file mode 100644 index 00000000..22727067 --- /dev/null +++ b/common/.project @@ -0,0 +1,23 @@ + + + ctbrec-common + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/common/.settings/org.eclipse.core.resources.prefs b/common/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/common/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/common/.settings/org.eclipse.jdt.core.prefs b/common/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..8445b6b1 --- /dev/null +++ b/common/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/common/.settings/org.eclipse.m2e.core.prefs b/common/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/common/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 00000000..1ffda026 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + common + + + ctbrec + master + 1.9.0 + ../master + + + + 1.8 + 1.8 + + + + + org.slf4j + slf4j-api + + + org.jsoup + jsoup + + + com.squareup.okhttp3 + okhttp + + + com.squareup.moshi + moshi + + + org.json + json + + + com.iheartradio.m3u8 + open-m3u8 + + + org.jcodec + jcodec + + + com.google.guava + guava + + + org.openjfx + javafx-controls + provided + + + org.openjfx + javafx-web + provided + + + + diff --git a/client/src/main/java/ctbrec/AbstractModel.java b/common/src/ctbrec/AbstractModel.java similarity index 100% rename from client/src/main/java/ctbrec/AbstractModel.java rename to common/src/ctbrec/AbstractModel.java diff --git a/client/src/main/java/ctbrec/Config.java b/common/src/ctbrec/Config.java similarity index 100% rename from client/src/main/java/ctbrec/Config.java rename to common/src/ctbrec/Config.java diff --git a/client/src/main/java/ctbrec/Hmac.java b/common/src/ctbrec/Hmac.java similarity index 100% rename from client/src/main/java/ctbrec/Hmac.java rename to common/src/ctbrec/Hmac.java diff --git a/client/src/main/java/ctbrec/Java.java b/common/src/ctbrec/Java.java similarity index 100% rename from client/src/main/java/ctbrec/Java.java rename to common/src/ctbrec/Java.java diff --git a/client/src/main/java/ctbrec/LoggingInterceptor.java b/common/src/ctbrec/LoggingInterceptor.java similarity index 100% rename from client/src/main/java/ctbrec/LoggingInterceptor.java rename to common/src/ctbrec/LoggingInterceptor.java diff --git a/client/src/main/java/ctbrec/Model.java b/common/src/ctbrec/Model.java similarity index 100% rename from client/src/main/java/ctbrec/Model.java rename to common/src/ctbrec/Model.java diff --git a/client/src/main/java/ctbrec/OS.java b/common/src/ctbrec/OS.java similarity index 100% rename from client/src/main/java/ctbrec/OS.java rename to common/src/ctbrec/OS.java diff --git a/client/src/main/java/ctbrec/Recording.java b/common/src/ctbrec/Recording.java similarity index 100% rename from client/src/main/java/ctbrec/Recording.java rename to common/src/ctbrec/Recording.java diff --git a/client/src/main/java/ctbrec/Settings.java b/common/src/ctbrec/Settings.java similarity index 100% rename from client/src/main/java/ctbrec/Settings.java rename to common/src/ctbrec/Settings.java diff --git a/common/src/ctbrec/StringUtil.java b/common/src/ctbrec/StringUtil.java new file mode 100644 index 00000000..229e44b1 --- /dev/null +++ b/common/src/ctbrec/StringUtil.java @@ -0,0 +1,11 @@ +package ctbrec; + +public class StringUtil { + public static boolean isBlank(String s) { + return s == null || s.trim().isEmpty(); + } + + public static boolean isNotBlank(String s) { + return !isBlank(s); + } +} diff --git a/client/src/main/java/ctbrec/Version.java b/common/src/ctbrec/Version.java similarity index 100% rename from client/src/main/java/ctbrec/Version.java rename to common/src/ctbrec/Version.java diff --git a/client/src/main/java/ctbrec/io/CookieContainerJsonAdapter.java b/common/src/ctbrec/io/CookieContainerJsonAdapter.java similarity index 100% rename from client/src/main/java/ctbrec/io/CookieContainerJsonAdapter.java rename to common/src/ctbrec/io/CookieContainerJsonAdapter.java diff --git a/client/src/main/java/ctbrec/io/CookieJarImpl.java b/common/src/ctbrec/io/CookieJarImpl.java similarity index 100% rename from client/src/main/java/ctbrec/io/CookieJarImpl.java rename to common/src/ctbrec/io/CookieJarImpl.java diff --git a/client/src/main/java/ctbrec/io/CookieJsonAdapter.java b/common/src/ctbrec/io/CookieJsonAdapter.java similarity index 100% rename from client/src/main/java/ctbrec/io/CookieJsonAdapter.java rename to common/src/ctbrec/io/CookieJsonAdapter.java diff --git a/client/src/main/java/ctbrec/io/DevNull.java b/common/src/ctbrec/io/DevNull.java similarity index 100% rename from client/src/main/java/ctbrec/io/DevNull.java rename to common/src/ctbrec/io/DevNull.java diff --git a/client/src/main/java/ctbrec/ui/HtmlParser.java b/common/src/ctbrec/io/HtmlParser.java similarity index 98% rename from client/src/main/java/ctbrec/ui/HtmlParser.java rename to common/src/ctbrec/io/HtmlParser.java index d2d545b9..121d494c 100644 --- a/client/src/main/java/ctbrec/ui/HtmlParser.java +++ b/common/src/ctbrec/io/HtmlParser.java @@ -1,4 +1,4 @@ -package ctbrec.ui; +package ctbrec.io; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; diff --git a/client/src/main/java/ctbrec/io/HttpClient.java b/common/src/ctbrec/io/HttpClient.java similarity index 92% rename from client/src/main/java/ctbrec/io/HttpClient.java rename to common/src/ctbrec/io/HttpClient.java index f1afed9b..df03cf52 100644 --- a/client/src/main/java/ctbrec/io/HttpClient.java +++ b/common/src/ctbrec/io/HttpClient.java @@ -23,6 +23,7 @@ import ctbrec.Config; import ctbrec.Settings.ProxyType; import okhttp3.ConnectionPool; import okhttp3.Cookie; +import okhttp3.CookieJar; import okhttp3.Credentials; import okhttp3.OkHttpClient; import okhttp3.OkHttpClient.Builder; @@ -91,18 +92,19 @@ public abstract class HttpClient { } } - public Response execute(Request request) throws IOException { - Response resp = execute(request, false); - return resp; - } + // public Response execute(Request request) throws IOException { + // Response resp = execute(request, false); + // return resp; + // } - public Response execute(Request req, boolean requiresLogin) throws IOException { - if(requiresLogin && !loggedIn) { - loggedIn = login(); - if(!loggedIn) { - throw new IOException("403 Unauthorized"); - } - } + // public Response execute(Request req, boolean requiresLogin) throws IOException { + public Response execute(Request req) throws IOException { + // if(requiresLogin && !loggedIn) { + // loggedIn = login(); + // if(!loggedIn) { + // throw new IOException("403 Unauthorized"); + // } + // } Response resp = client.newCall(req).execute(); return resp; } @@ -209,4 +211,8 @@ public abstract class HttpClient { return auth; } } + + public CookieJar getCookieJar() { + return cookieJar; + } } diff --git a/client/src/main/java/ctbrec/io/HttpException.java b/common/src/ctbrec/io/HttpException.java similarity index 100% rename from client/src/main/java/ctbrec/io/HttpException.java rename to common/src/ctbrec/io/HttpException.java diff --git a/client/src/main/java/ctbrec/io/InstantJsonAdapter.java b/common/src/ctbrec/io/InstantJsonAdapter.java similarity index 100% rename from client/src/main/java/ctbrec/io/InstantJsonAdapter.java rename to common/src/ctbrec/io/InstantJsonAdapter.java diff --git a/client/src/main/java/ctbrec/io/ModelJsonAdapter.java b/common/src/ctbrec/io/ModelJsonAdapter.java similarity index 100% rename from client/src/main/java/ctbrec/io/ModelJsonAdapter.java rename to common/src/ctbrec/io/ModelJsonAdapter.java diff --git a/client/src/main/java/ctbrec/io/StreamRedirectThread.java b/common/src/ctbrec/io/StreamRedirectThread.java similarity index 100% rename from client/src/main/java/ctbrec/io/StreamRedirectThread.java rename to common/src/ctbrec/io/StreamRedirectThread.java diff --git a/client/src/main/java/ctbrec/recorder/LocalRecorder.java b/common/src/ctbrec/recorder/LocalRecorder.java similarity index 99% rename from client/src/main/java/ctbrec/recorder/LocalRecorder.java rename to common/src/ctbrec/recorder/LocalRecorder.java index 00b7b077..381a276a 100644 --- a/client/src/main/java/ctbrec/recorder/LocalRecorder.java +++ b/common/src/ctbrec/recorder/LocalRecorder.java @@ -36,13 +36,13 @@ import ctbrec.Model; import ctbrec.OS; import ctbrec.Recording; import ctbrec.Recording.STATUS; +import ctbrec.io.HttpClient; import ctbrec.io.HttpException; import ctbrec.io.StreamRedirectThread; import ctbrec.recorder.PlaylistGenerator.InvalidPlaylistException; import ctbrec.recorder.download.Download; import ctbrec.recorder.download.HlsDownload; import ctbrec.recorder.download.MergedHlsDownload; -import ctbrec.recorder.server.RecorderHttpClient; public class LocalRecorder implements Recorder { @@ -722,4 +722,9 @@ public class LocalRecorder implements Recorder { lock.unlock(); } } + + @Override + public HttpClient getHttpClient() { + return client; + } } diff --git a/client/src/main/java/ctbrec/recorder/PlaylistGenerator.java b/common/src/ctbrec/recorder/PlaylistGenerator.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/PlaylistGenerator.java rename to common/src/ctbrec/recorder/PlaylistGenerator.java diff --git a/client/src/main/java/ctbrec/recorder/ProgressListener.java b/common/src/ctbrec/recorder/ProgressListener.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/ProgressListener.java rename to common/src/ctbrec/recorder/ProgressListener.java diff --git a/client/src/main/java/ctbrec/recorder/Recorder.java b/common/src/ctbrec/recorder/Recorder.java similarity index 96% rename from client/src/main/java/ctbrec/recorder/Recorder.java rename to common/src/ctbrec/recorder/Recorder.java index e1ffa76b..bc4e60cf 100644 --- a/client/src/main/java/ctbrec/recorder/Recorder.java +++ b/common/src/ctbrec/recorder/Recorder.java @@ -7,6 +7,7 @@ import java.util.List; import ctbrec.Model; import ctbrec.Recording; +import ctbrec.io.HttpClient; public interface Recorder { public void startRecording(Model model) throws IOException, InvalidKeyException, NoSuchAlgorithmException, IllegalStateException; @@ -39,4 +40,6 @@ public interface Recorder { * @return */ public List getOnlineModels(); + + public HttpClient getHttpClient(); } diff --git a/client/src/main/java/ctbrec/recorder/server/RecorderHttpClient.java b/common/src/ctbrec/recorder/RecorderHttpClient.java similarity index 89% rename from client/src/main/java/ctbrec/recorder/server/RecorderHttpClient.java rename to common/src/ctbrec/recorder/RecorderHttpClient.java index 7b3170e7..a965ee67 100644 --- a/client/src/main/java/ctbrec/recorder/server/RecorderHttpClient.java +++ b/common/src/ctbrec/recorder/RecorderHttpClient.java @@ -1,4 +1,4 @@ -package ctbrec.recorder.server; +package ctbrec.recorder; import java.io.IOException; diff --git a/client/src/main/java/ctbrec/recorder/RemoteRecorder.java b/common/src/ctbrec/recorder/RemoteRecorder.java similarity index 99% rename from client/src/main/java/ctbrec/recorder/RemoteRecorder.java rename to common/src/ctbrec/recorder/RemoteRecorder.java index 84d1a38e..dd648301 100644 --- a/client/src/main/java/ctbrec/recorder/RemoteRecorder.java +++ b/common/src/ctbrec/recorder/RemoteRecorder.java @@ -357,4 +357,9 @@ public class RemoteRecorder implements Recorder { public List getOnlineModels() { return onlineModels; } + + @Override + public HttpClient getHttpClient() { + return client; + } } diff --git a/client/src/main/java/ctbrec/recorder/download/AbstractHlsDownload.java b/common/src/ctbrec/recorder/download/AbstractHlsDownload.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/download/AbstractHlsDownload.java rename to common/src/ctbrec/recorder/download/AbstractHlsDownload.java diff --git a/client/src/main/java/ctbrec/recorder/download/Download.java b/common/src/ctbrec/recorder/download/Download.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/download/Download.java rename to common/src/ctbrec/recorder/download/Download.java diff --git a/client/src/main/java/ctbrec/recorder/download/HlsDownload.java b/common/src/ctbrec/recorder/download/HlsDownload.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/download/HlsDownload.java rename to common/src/ctbrec/recorder/download/HlsDownload.java diff --git a/client/src/main/java/ctbrec/recorder/download/MergedHlsDownload.java b/common/src/ctbrec/recorder/download/MergedHlsDownload.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/download/MergedHlsDownload.java rename to common/src/ctbrec/recorder/download/MergedHlsDownload.java diff --git a/client/src/main/java/ctbrec/recorder/download/StreamSource.java b/common/src/ctbrec/recorder/download/StreamSource.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/download/StreamSource.java rename to common/src/ctbrec/recorder/download/StreamSource.java diff --git a/client/src/main/java/ctbrec/sites/AbstractSite.java b/common/src/ctbrec/sites/AbstractSite.java similarity index 53% rename from client/src/main/java/ctbrec/sites/AbstractSite.java rename to common/src/ctbrec/sites/AbstractSite.java index 05f98d69..1d50d186 100644 --- a/client/src/main/java/ctbrec/sites/AbstractSite.java +++ b/common/src/ctbrec/sites/AbstractSite.java @@ -1,8 +1,11 @@ package ctbrec.sites; +import ctbrec.recorder.Recorder; + public abstract class AbstractSite implements Site { private boolean enabled; + private Recorder recorder; @Override public void setEnabled(boolean enabled) { @@ -13,4 +16,14 @@ public abstract class AbstractSite implements Site { public boolean isEnabled() { return enabled; } + + @Override + public void setRecorder(Recorder recorder) { + this.recorder = recorder; + } + + @Override + public Recorder getRecorder() { + return recorder; + } } diff --git a/client/src/main/java/ctbrec/sites/ConfigUI.java b/common/src/ctbrec/sites/ConfigUI.java similarity index 100% rename from client/src/main/java/ctbrec/sites/ConfigUI.java rename to common/src/ctbrec/sites/ConfigUI.java diff --git a/common/src/ctbrec/sites/NeedsManualLoginException.java b/common/src/ctbrec/sites/NeedsManualLoginException.java new file mode 100644 index 00000000..2c13ad8c --- /dev/null +++ b/common/src/ctbrec/sites/NeedsManualLoginException.java @@ -0,0 +1,7 @@ +package ctbrec.sites; + +import java.io.IOException; + +public class NeedsManualLoginException extends IOException { + +} diff --git a/client/src/main/java/ctbrec/sites/Site.java b/common/src/ctbrec/sites/Site.java similarity index 83% rename from client/src/main/java/ctbrec/sites/Site.java rename to common/src/ctbrec/sites/Site.java index 29a0e226..08fef0f4 100644 --- a/client/src/main/java/ctbrec/sites/Site.java +++ b/common/src/ctbrec/sites/Site.java @@ -5,25 +5,23 @@ import java.io.IOException; import ctbrec.Model; import ctbrec.io.HttpClient; import ctbrec.recorder.Recorder; -import ctbrec.ui.TabProvider; public interface Site { public String getName(); public String getBaseUrl(); public String getAffiliateLink(); public void setRecorder(Recorder recorder); - public TabProvider getTabProvider(); + public Recorder getRecorder(); public Model createModel(String name); public Integer getTokenBalance() throws IOException; public String getBuyTokensLink(); - public void login() throws IOException; + public boolean login() throws IOException; public HttpClient getHttpClient(); public void init() throws IOException; public void shutdown(); public boolean supportsTips(); public boolean supportsFollow(); public boolean isSiteForModel(Model m); - public ConfigUI getConfigurationGui(); public boolean credentialsAvailable(); public void setEnabled(boolean enabled); public boolean isEnabled(); diff --git a/client/src/main/java/ctbrec/sites/bonga/BongaCams.java b/common/src/ctbrec/sites/bonga/BongaCams.java similarity index 82% rename from client/src/main/java/ctbrec/sites/bonga/BongaCams.java rename to common/src/ctbrec/sites/bonga/BongaCams.java index cad99f0a..f763bccc 100644 --- a/client/src/main/java/ctbrec/sites/bonga/BongaCams.java +++ b/common/src/ctbrec/sites/bonga/BongaCams.java @@ -8,10 +8,7 @@ import ctbrec.Config; import ctbrec.Model; import ctbrec.io.HttpClient; import ctbrec.io.HttpException; -import ctbrec.recorder.Recorder; import ctbrec.sites.AbstractSite; -import ctbrec.sites.ConfigUI; -import ctbrec.ui.TabProvider; import okhttp3.FormBody; import okhttp3.Request; import okhttp3.RequestBody; @@ -22,8 +19,6 @@ public class BongaCams extends AbstractSite { public static final String BASE_URL = "https://bongacams.com"; private BongaCamsHttpClient httpClient; - private Recorder recorder; - private BongaCamsTabProvider tabProvider; @Override public String getName() { @@ -40,19 +35,6 @@ public class BongaCams extends AbstractSite { return "http://bongacams2.com/track?c=610249"; } - @Override - public void setRecorder(Recorder recorder) { - this.recorder = recorder; - } - - @Override - public TabProvider getTabProvider() { - if(tabProvider == null) { - tabProvider = new BongaCamsTabProvider(recorder, this); - } - return tabProvider; - } - @Override public Model createModel(String name) { BongaCamsModel model = new BongaCamsModel(); @@ -80,7 +62,7 @@ public class BongaCams extends AbstractSite { .addHeader("X-Requested-With", "XMLHttpRequest") .post(body) .build(); - try(Response response = getHttpClient().execute(request, true)) { + try(Response response = getHttpClient().execute(request)) { if(response.isSuccessful()) { JSONObject json = new JSONObject(response.body().string()); if(json.optString("status").equals("online")) { @@ -101,8 +83,8 @@ public class BongaCams extends AbstractSite { } @Override - public void login() throws IOException { - getHttpClient().login(); + public boolean login() throws IOException { + return credentialsAvailable() && getHttpClient().login(); } @Override @@ -139,11 +121,6 @@ public class BongaCams extends AbstractSite { return m instanceof BongaCamsModel; } - @Override - public ConfigUI getConfigurationGui() { - return new BongaCamsConfigUI(this); - } - @Override public boolean credentialsAvailable() { String username = Config.getInstance().getSettings().bongaUsername; diff --git a/client/src/main/java/ctbrec/sites/bonga/BongaCamsHttpClient.java b/common/src/ctbrec/sites/bonga/BongaCamsHttpClient.java similarity index 77% rename from client/src/main/java/ctbrec/sites/bonga/BongaCamsHttpClient.java rename to common/src/ctbrec/sites/bonga/BongaCamsHttpClient.java index b082b127..9f77da35 100644 --- a/client/src/main/java/ctbrec/sites/bonga/BongaCamsHttpClient.java +++ b/common/src/ctbrec/sites/bonga/BongaCamsHttpClient.java @@ -1,14 +1,10 @@ package ctbrec.sites.bonga; import java.io.IOException; -import java.net.HttpCookie; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; import org.json.JSONArray; import org.json.JSONObject; @@ -18,10 +14,8 @@ import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.io.HttpClient; import ctbrec.io.HttpException; -import javafx.application.Platform; import okhttp3.Cookie; import okhttp3.FormBody; -import okhttp3.HttpUrl; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; @@ -72,48 +66,14 @@ public class BongaCamsHttpClient extends HttpClient { return true; } - BlockingQueue queue = new LinkedBlockingQueue<>(); - - Runnable showDialog = () -> { - // login with javafx WebView - BongaCamsLoginDialog loginDialog = new BongaCamsLoginDialog(); - - // transfer cookies from WebView to OkHttp cookie jar - transferCookies(loginDialog); - - try { - queue.put(true); - } catch (InterruptedException e) { - LOG.error("Error while signaling termination", e); - } - }; - - if(Platform.isFxApplicationThread()) { - showDialog.run(); - } else { - Platform.runLater(showDialog); - try { - queue.take(); - } catch (InterruptedException e) { - LOG.error("Error while waiting for login dialog to close", e); - throw new IOException(e); - } - } - - loggedIn = checkLoginSuccess(); - if(loggedIn) { - LOG.info("Logged in. User ID is {}", userId); - } else { - LOG.info("Login failed"); - } - return loggedIn; + return false; } /** * Check, if the login worked by requesting roomdata and looking * @throws IOException */ - private boolean checkLoginSuccess() throws IOException { + public boolean checkLoginSuccess() throws IOException { String modelName = getAnyModelName(); // we request the roomData of a random model, because it contains // user data, if the user is logged in, which we can use to verify, that the login worked @@ -180,24 +140,6 @@ public class BongaCamsHttpClient extends HttpClient { } } - private void transferCookies(BongaCamsLoginDialog loginDialog) { - HttpUrl redirectedUrl = HttpUrl.parse(loginDialog.getUrl()); - List cookies = new ArrayList<>(); - for (HttpCookie webViewCookie : loginDialog.getCookies()) { - Cookie cookie = Cookie.parse(redirectedUrl, webViewCookie.toString()); - cookies.add(cookie); - } - cookieJar.saveFromResponse(redirectedUrl, cookies); - - HttpUrl origUrl = HttpUrl.parse(BongaCamsLoginDialog.URL); - cookies = new ArrayList<>(); - for (HttpCookie webViewCookie : loginDialog.getCookies()) { - Cookie cookie = Cookie.parse(origUrl, webViewCookie.toString()); - cookies.add(cookie); - } - cookieJar.saveFromResponse(origUrl, cookies); - } - // @Override // public boolean login() throws IOException { // String url = BongaCams.BASE_URL + "/login"; diff --git a/client/src/main/java/ctbrec/sites/bonga/BongaCamsModel.java b/common/src/ctbrec/sites/bonga/BongaCamsModel.java similarity index 99% rename from client/src/main/java/ctbrec/sites/bonga/BongaCamsModel.java rename to common/src/ctbrec/sites/bonga/BongaCamsModel.java index bcf9d77e..210ada4f 100644 --- a/client/src/main/java/ctbrec/sites/bonga/BongaCamsModel.java +++ b/common/src/ctbrec/sites/bonga/BongaCamsModel.java @@ -165,7 +165,7 @@ public class BongaCamsModel extends AbstractModel { .addHeader("X-Requested-With", "XMLHttpRequest") .post(body) .build(); - try(Response response = site.getHttpClient().execute(request, true)) { + try(Response response = site.getHttpClient().execute(request)) { if(response.isSuccessful()) { JSONObject json = new JSONObject(response.body().string()); if(!json.optString("status").equals("success")) { diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4.java b/common/src/ctbrec/sites/cam4/Cam4.java similarity index 71% rename from client/src/main/java/ctbrec/sites/cam4/Cam4.java rename to common/src/ctbrec/sites/cam4/Cam4.java index 1ac2c7f3..d63ef050 100644 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4.java +++ b/common/src/ctbrec/sites/cam4/Cam4.java @@ -2,15 +2,10 @@ package ctbrec.sites.cam4; import java.io.IOException; -import org.slf4j.LoggerFactory; - import ctbrec.Config; import ctbrec.Model; import ctbrec.io.HttpClient; -import ctbrec.recorder.Recorder; import ctbrec.sites.AbstractSite; -import ctbrec.sites.ConfigUI; -import ctbrec.ui.TabProvider; public class Cam4 extends AbstractSite { @@ -19,8 +14,6 @@ public class Cam4 extends AbstractSite { public static final String AFFILIATE_LINK = BASE_URI + "/?referrerId=1514a80d87b5effb456cca02f6743aa1"; private HttpClient httpClient; - private Recorder recorder; - private Cam4TabProvider tabProvider; @Override public String getName() { @@ -37,19 +30,6 @@ public class Cam4 extends AbstractSite { return AFFILIATE_LINK; } - @Override - public void setRecorder(Recorder recorder) { - this.recorder = recorder; - } - - @Override - public TabProvider getTabProvider() { - if(tabProvider == null) { - tabProvider = new Cam4TabProvider(this, recorder); - } - return tabProvider; - } - @Override public Model createModel(String name) { Cam4Model m = new Cam4Model(); @@ -73,11 +53,8 @@ public class Cam4 extends AbstractSite { } @Override - public void login() throws IOException { - if (credentialsAvailable()) { - boolean success = getHttpClient().login(); - LoggerFactory.getLogger(getClass()).debug("Login success: {}", success); - } + public boolean login() throws IOException { + return credentialsAvailable() && getHttpClient().login(); } @Override @@ -117,9 +94,4 @@ public class Cam4 extends AbstractSite { String username = Config.getInstance().getSettings().cam4Username; return username != null && !username.trim().isEmpty(); } - - @Override - public ConfigUI getConfigurationGui() { - return new Cam4ConfigUI(); - } } diff --git a/common/src/ctbrec/sites/cam4/Cam4HttpClient.java b/common/src/ctbrec/sites/cam4/Cam4HttpClient.java new file mode 100644 index 00000000..a9d8abd7 --- /dev/null +++ b/common/src/ctbrec/sites/cam4/Cam4HttpClient.java @@ -0,0 +1,65 @@ +package ctbrec.sites.cam4; + +import java.io.IOException; +import java.util.Objects; + +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import ctbrec.io.HttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class Cam4HttpClient extends HttpClient { + + private static final transient Logger LOG = LoggerFactory.getLogger(Cam4HttpClient.class); + + public Cam4HttpClient() { + super("cam4"); + } + + @Override + public synchronized boolean login() throws IOException { + if(loggedIn) { + return true; + } + + boolean cookiesWorked = checkLoginSuccess(); + if(cookiesWorked) { + loggedIn = true; + LOG.debug("Logged in with cookies"); + return true; + } + + return false; + } + + /** + * check, if the login worked by requesting unchecked mail + * @throws IOException + */ + public boolean checkLoginSuccess() throws IOException { + String mailUrl = Cam4.BASE_URI + "/mail/unreadThreads"; + Request req = new Request.Builder() + .url(mailUrl) + .addHeader("X-Requested-With", "XMLHttpRequest") + .build(); + Response response = execute(req); + if(response.isSuccessful() && response.body().contentLength() > 0) { + JSONObject json = new JSONObject(response.body().string()); + return json.has("status") && Objects.equals("success", json.getString("status")); + } else { + response.close(); + return false; + } + } + + protected int getTokenBalance() throws IOException { + if(!loggedIn) { + login(); + } + + throw new RuntimeException("Not implemented, yet"); + } +} diff --git a/client/src/main/java/ctbrec/sites/cam4/Cam4Model.java b/common/src/ctbrec/sites/cam4/Cam4Model.java similarity index 97% rename from client/src/main/java/ctbrec/sites/cam4/Cam4Model.java rename to common/src/ctbrec/sites/cam4/Cam4Model.java index 1e7c05e1..96e63317 100644 --- a/client/src/main/java/ctbrec/sites/cam4/Cam4Model.java +++ b/common/src/ctbrec/sites/cam4/Cam4Model.java @@ -24,11 +24,10 @@ import com.iheartradio.m3u8.data.PlaylistData; import ctbrec.AbstractModel; import ctbrec.Config; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpException; import ctbrec.recorder.download.StreamSource; import ctbrec.sites.Site; -import ctbrec.ui.CamrecApplication; -import ctbrec.ui.HtmlParser; import okhttp3.FormBody; import okhttp3.Request; import okhttp3.RequestBody; @@ -168,7 +167,7 @@ public class Cam4Model extends AbstractModel { .url(url) .addHeader("X-Requested-With", "XMLHttpRequest") .build(); - Response response = site.getHttpClient().execute(req, true); + Response response = site.getHttpClient().execute(req); boolean success = response.isSuccessful(); response.close(); return success; @@ -185,7 +184,7 @@ public class Cam4Model extends AbstractModel { // we have to use a client without any cam4 cookies here, otherwise // this request is redirected to the login page. no idea why - try(Response response = CamrecApplication.httpClient.execute(req)) { + try(Response response = site.getRecorder().getHttpClient().execute(req)) { String broadCasterId = null; if(response.isSuccessful()) { String content = response.body().string(); @@ -209,7 +208,7 @@ public class Cam4Model extends AbstractModel { .post(body) .addHeader("X-Requested-With", "XMLHttpRequest") .build(); - Response resp = site.getHttpClient().execute(req, true); + Response resp = site.getHttpClient().execute(req); if(resp.isSuccessful()) { return Objects.equals(resp.body().string(), "Ok"); } else { diff --git a/client/src/main/java/ctbrec/sites/camsoda/Camsoda.java b/common/src/ctbrec/sites/camsoda/Camsoda.java similarity index 78% rename from client/src/main/java/ctbrec/sites/camsoda/Camsoda.java rename to common/src/ctbrec/sites/camsoda/Camsoda.java index e3c813ab..c8750bc5 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/Camsoda.java +++ b/common/src/ctbrec/sites/camsoda/Camsoda.java @@ -8,19 +8,14 @@ import ctbrec.Config; import ctbrec.Model; import ctbrec.io.HttpClient; import ctbrec.io.HttpException; -import ctbrec.recorder.Recorder; import ctbrec.sites.AbstractSite; -import ctbrec.sites.ConfigUI; -import ctbrec.ui.TabProvider; import okhttp3.Request; import okhttp3.Response; public class Camsoda extends AbstractSite { public static final String BASE_URI = "https://www.camsoda.com"; - private Recorder recorder; private HttpClient httpClient; - private CamsodaTabProvider tabProvider; @Override public String getName() { @@ -42,19 +37,6 @@ public class Camsoda extends AbstractSite { return BASE_URI; } - @Override - public void setRecorder(Recorder recorder) { - this.recorder = recorder; - } - - @Override - public TabProvider getTabProvider() { - if(tabProvider == null) { - tabProvider = new CamsodaTabProvider(this, recorder); - } - return tabProvider; - } - @Override public Model createModel(String name) { CamsodaModel model = new CamsodaModel(); @@ -73,7 +55,7 @@ public class Camsoda extends AbstractSite { String username = Config.getInstance().getSettings().camsodaUsername; String url = BASE_URI + "/api/v1/user/" + username; Request request = new Request.Builder().url(url).build(); - try(Response response = getHttpClient().execute(request, true)) { + try(Response response = getHttpClient().execute(request)) { if(response.isSuccessful()) { JSONObject json = new JSONObject(response.body().string()); if(json.has("user")) { @@ -90,10 +72,8 @@ public class Camsoda extends AbstractSite { } @Override - public void login() throws IOException { - if(credentialsAvailable()) { - getHttpClient().login(); - } + public boolean login() throws IOException { + return credentialsAvailable() && getHttpClient().login(); } @Override @@ -135,9 +115,4 @@ public class Camsoda extends AbstractSite { String username = Config.getInstance().getSettings().camsodaUsername; return username != null && !username.trim().isEmpty(); } - - @Override - public ConfigUI getConfigurationGui() { - return new CamsodaConfigUI(this); - } } diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaHttpClient.java b/common/src/ctbrec/sites/camsoda/CamsodaHttpClient.java similarity index 59% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaHttpClient.java rename to common/src/ctbrec/sites/camsoda/CamsodaHttpClient.java index d4905bbf..d37f58d1 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaHttpClient.java +++ b/common/src/ctbrec/sites/camsoda/CamsodaHttpClient.java @@ -1,12 +1,7 @@ package ctbrec.sites.camsoda; import java.io.IOException; -import java.net.HttpCookie; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; import org.json.JSONObject; import org.jsoup.nodes.Element; @@ -14,14 +9,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpClient; import ctbrec.io.HttpException; -import ctbrec.sites.cam4.Cam4LoginDialog; -import ctbrec.ui.HtmlParser; -import javafx.application.Platform; -import okhttp3.Cookie; import okhttp3.FormBody; -import okhttp3.HttpUrl; import okhttp3.Request; import okhttp3.Response; @@ -76,45 +67,11 @@ public class CamsodaHttpClient extends HttpClient { } } - @SuppressWarnings("unused") - private boolean loginWithDialog() throws IOException { - BlockingQueue queue = new LinkedBlockingQueue<>(); - - Runnable showDialog = () -> { - // login with javafx WebView - CamsodaLoginDialog loginDialog = new CamsodaLoginDialog(); - - // transfer cookies from WebView to OkHttp cookie jar - transferCookies(loginDialog); - - try { - queue.put(true); - } catch (InterruptedException e) { - LOG.error("Error while signaling termination", e); - } - }; - - if(Platform.isFxApplicationThread()) { - showDialog.run(); - } else { - Platform.runLater(showDialog); - try { - queue.take(); - } catch (InterruptedException e) { - LOG.error("Error while waiting for login dialog to close", e); - throw new IOException(e); - } - } - - loggedIn = checkLoginSuccess(); - return loggedIn; - } - /** * check, if the login worked * @throws IOException */ - private boolean checkLoginSuccess() throws IOException { + public boolean checkLoginSuccess() throws IOException { String url = Camsoda.BASE_URI + "/api/v1/user/current"; Request request = new Request.Builder().url(url).build(); try(Response response = execute(request)) { @@ -127,29 +84,11 @@ public class CamsodaHttpClient extends HttpClient { } } - private void transferCookies(CamsodaLoginDialog loginDialog) { - HttpUrl redirectedUrl = HttpUrl.parse(loginDialog.getUrl()); - List cookies = new ArrayList<>(); - for (HttpCookie webViewCookie : loginDialog.getCookies()) { - Cookie cookie = Cookie.parse(redirectedUrl, webViewCookie.toString()); - cookies.add(cookie); - } - cookieJar.saveFromResponse(redirectedUrl, cookies); - - HttpUrl origUrl = HttpUrl.parse(Cam4LoginDialog.URL); - cookies = new ArrayList<>(); - for (HttpCookie webViewCookie : loginDialog.getCookies()) { - Cookie cookie = Cookie.parse(origUrl, webViewCookie.toString()); - cookies.add(cookie); - } - cookieJar.saveFromResponse(origUrl, cookies); - } - protected String getCsrfToken() throws IOException { if(csrfToken == null) { String url = Camsoda.BASE_URI; Request request = new Request.Builder().url(url).build(); - try(Response response = execute(request, true)) { + try(Response response = execute(request)) { if(response.isSuccessful()) { Element meta = HtmlParser.getTag(response.body().string(), "meta[name=\"_token\"]"); csrfToken = meta.attr("content"); diff --git a/client/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java b/common/src/ctbrec/sites/camsoda/CamsodaModel.java similarity index 99% rename from client/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java rename to common/src/ctbrec/sites/camsoda/CamsodaModel.java index ef45e4e7..6177991e 100644 --- a/client/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java +++ b/common/src/ctbrec/sites/camsoda/CamsodaModel.java @@ -188,7 +188,7 @@ public class CamsodaModel extends AbstractModel { .addHeader("Accept-Language", "en") .addHeader("X-CSRF-Token", csrfToken) .build(); - try(Response response = site.getHttpClient().execute(request, true)) { + try(Response response = site.getHttpClient().execute(request)) { if(!response.isSuccessful()) { throw new HttpException(response.code(), response.message()); } @@ -210,7 +210,7 @@ public class CamsodaModel extends AbstractModel { .addHeader("Accept-Language", "en") .addHeader("X-CSRF-Token", csrfToken) .build(); - try(Response response = site.getHttpClient().execute(request, true)) { + try(Response response = site.getHttpClient().execute(request)) { if (response.isSuccessful()) { return true; } else { @@ -233,7 +233,7 @@ public class CamsodaModel extends AbstractModel { .addHeader("Accept-Language", "en") .addHeader("X-CSRF-Token", csrfToken) .build(); - try (Response response = site.getHttpClient().execute(request, true)) { + try (Response response = site.getHttpClient().execute(request)) { if (response.isSuccessful()) { return true; } else { diff --git a/client/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java b/common/src/ctbrec/sites/chaturbate/Chaturbate.java similarity index 89% rename from client/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java rename to common/src/ctbrec/sites/chaturbate/Chaturbate.java index e6f3cf4e..105be013 100644 --- a/client/src/main/java/ctbrec/sites/chaturbate/Chaturbate.java +++ b/common/src/ctbrec/sites/chaturbate/Chaturbate.java @@ -26,13 +26,10 @@ import com.squareup.moshi.Moshi; import ctbrec.Config; import ctbrec.Model; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpClient; import ctbrec.io.HttpException; -import ctbrec.recorder.Recorder; import ctbrec.sites.AbstractSite; -import ctbrec.sites.ConfigUI; -import ctbrec.ui.HtmlParser; -import ctbrec.ui.TabProvider; import okhttp3.FormBody; import okhttp3.Request; import okhttp3.RequestBody; @@ -44,9 +41,7 @@ public class Chaturbate extends AbstractSite { public static final String BASE_URI = "https://chaturbate.com"; public static final String AFFILIATE_LINK = BASE_URI + "/in/?track=default&tour=grq0&campaign=55vTi"; public static final String REGISTRATION_LINK = BASE_URI + "/in/?track=default&tour=g4pe&campaign=55vTi"; - private Recorder recorder; private ChaturbateHttpClient httpClient; - private ChaturbateTabProvider tabProvider; @Override public void init() throws IOException { @@ -68,19 +63,6 @@ public class Chaturbate extends AbstractSite { return getBaseUrl() + "/in/?track=default&tour=LQps&campaign=55vTi&room=0xb00bface"; } - @Override - public TabProvider getTabProvider() { - if(tabProvider == null) { - tabProvider = new ChaturbateTabProvider(this, recorder); - } - return tabProvider; - } - - @Override - public void setRecorder(Recorder recorder) { - this.recorder = recorder; - } - @Override public Model createModel(String name) { ChaturbateModel m = new ChaturbateModel(this); @@ -98,7 +80,7 @@ public class Chaturbate extends AbstractSite { String url = "https://chaturbate.com/p/" + username + "/"; Request req = new Request.Builder().url(url).build(); - Response resp = getHttpClient().execute(req, true); + Response resp = getHttpClient().execute(req); if (resp.isSuccessful()) { String profilePage = resp.body().string(); String tokenText = HtmlParser.getText(profilePage, "span.tokencount"); @@ -115,19 +97,8 @@ public class Chaturbate extends AbstractSite { } @Override - public void login() { - if (credentialsAvailable()) { - new Thread() { - @Override - public void run() { - try { - getHttpClient().login(); - } catch (IOException e1) { - LOG.warn("Initial login failed", e1); - } - }; - }.start(); - } + public boolean login() throws IOException { + return credentialsAvailable() && getHttpClient().login(); } @Override @@ -196,7 +167,7 @@ public class Chaturbate extends AbstractSite { .addHeader("Referer", "https://chaturbate.com/"+name+"/") .addHeader("X-Requested-With", "XMLHttpRequest") .build(); - try(Response response = getHttpClient().execute(req, true)) { + try(Response response = getHttpClient().execute(req)) { if(!response.isSuccessful()) { throw new IOException(response.code() + " " + response.message()); } @@ -312,11 +283,6 @@ public class Chaturbate extends AbstractSite { } } - @Override - public ConfigUI getConfigurationGui() { - return new ChaturbateConfigUi(); - } - @Override public boolean credentialsAvailable() { String username = Config.getInstance().getSettings().username; diff --git a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateHttpClient.java b/common/src/ctbrec/sites/chaturbate/ChaturbateHttpClient.java similarity index 95% rename from client/src/main/java/ctbrec/sites/chaturbate/ChaturbateHttpClient.java rename to common/src/ctbrec/sites/chaturbate/ChaturbateHttpClient.java index 58e1f059..9950bccd 100644 --- a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateHttpClient.java +++ b/common/src/ctbrec/sites/chaturbate/ChaturbateHttpClient.java @@ -7,8 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpClient; -import ctbrec.ui.HtmlParser; import okhttp3.Cookie; import okhttp3.FormBody; import okhttp3.Request; @@ -115,8 +115,8 @@ public class ChaturbateHttpClient extends HttpClient { } @Override - public Response execute(Request req, boolean requiresLogin) throws IOException { - Response resp = super.execute(req, requiresLogin); + public Response execute(Request req) throws IOException { + Response resp = super.execute(req); extractCsrfToken(req); return resp; } diff --git a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateModel.java b/common/src/ctbrec/sites/chaturbate/ChaturbateModel.java similarity index 99% rename from client/src/main/java/ctbrec/sites/chaturbate/ChaturbateModel.java rename to common/src/ctbrec/sites/chaturbate/ChaturbateModel.java index d635994b..840e902a 100644 --- a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateModel.java +++ b/common/src/ctbrec/sites/chaturbate/ChaturbateModel.java @@ -152,7 +152,7 @@ public class ChaturbateModel extends AbstractModel { .header("X-CSRFToken", ((ChaturbateHttpClient)site.getHttpClient()).getToken()) .header("X-Requested-With", "XMLHttpRequest") .build(); - resp = site.getHttpClient().execute(req, true); + resp = site.getHttpClient().execute(req); if(resp.isSuccessful()) { String msg = resp.body().string(); if(!msg.equalsIgnoreCase("ok")) { diff --git a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateModelParser.java b/common/src/ctbrec/sites/chaturbate/ChaturbateModelParser.java similarity index 98% rename from client/src/main/java/ctbrec/sites/chaturbate/ChaturbateModelParser.java rename to common/src/ctbrec/sites/chaturbate/ChaturbateModelParser.java index dec5690d..89dafc83 100644 --- a/client/src/main/java/ctbrec/sites/chaturbate/ChaturbateModelParser.java +++ b/common/src/ctbrec/sites/chaturbate/ChaturbateModelParser.java @@ -9,7 +9,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Model; -import ctbrec.ui.HtmlParser; +import ctbrec.io.HtmlParser; public class ChaturbateModelParser { private static final transient Logger LOG = LoggerFactory.getLogger(ChaturbateModelParser.class); diff --git a/client/src/main/java/ctbrec/sites/chaturbate/StreamInfo.java b/common/src/ctbrec/sites/chaturbate/StreamInfo.java similarity index 100% rename from client/src/main/java/ctbrec/sites/chaturbate/StreamInfo.java rename to common/src/ctbrec/sites/chaturbate/StreamInfo.java diff --git a/client/src/main/java/ctbrec/sites/mfc/Fcext.java b/common/src/ctbrec/sites/mfc/Fcext.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/Fcext.java rename to common/src/ctbrec/sites/mfc/Fcext.java diff --git a/client/src/main/java/ctbrec/sites/mfc/Message.java b/common/src/ctbrec/sites/mfc/Message.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/Message.java rename to common/src/ctbrec/sites/mfc/Message.java diff --git a/client/src/main/java/ctbrec/sites/mfc/MessageTypes.java b/common/src/ctbrec/sites/mfc/MessageTypes.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/MessageTypes.java rename to common/src/ctbrec/sites/mfc/MessageTypes.java diff --git a/client/src/main/java/ctbrec/sites/mfc/Model.java b/common/src/ctbrec/sites/mfc/Model.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/Model.java rename to common/src/ctbrec/sites/mfc/Model.java diff --git a/client/src/main/java/ctbrec/sites/mfc/MyFreeCams.java b/common/src/ctbrec/sites/mfc/MyFreeCams.java similarity index 77% rename from client/src/main/java/ctbrec/sites/mfc/MyFreeCams.java rename to common/src/ctbrec/sites/mfc/MyFreeCams.java index 56fc5de4..bb0d4c13 100644 --- a/client/src/main/java/ctbrec/sites/mfc/MyFreeCams.java +++ b/common/src/ctbrec/sites/mfc/MyFreeCams.java @@ -6,12 +6,9 @@ import org.jsoup.select.Elements; import ctbrec.Config; import ctbrec.Model; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpException; -import ctbrec.recorder.Recorder; import ctbrec.sites.AbstractSite; -import ctbrec.sites.ConfigUI; -import ctbrec.ui.HtmlParser; -import ctbrec.ui.TabProvider; import okhttp3.Request; import okhttp3.Response; @@ -19,10 +16,8 @@ public class MyFreeCams extends AbstractSite { public static final String BASE_URI = "https://www.myfreecams.com"; - private Recorder recorder; private MyFreeCamsClient client; private MyFreeCamsHttpClient httpClient; - private MyFreeCamsTabProvider tabProvider; @Override public void init() throws IOException { @@ -32,8 +27,8 @@ public class MyFreeCams extends AbstractSite { } @Override - public void login() throws IOException { - getHttpClient().login(); + public boolean login() throws IOException { + return credentialsAvailable() && getHttpClient().login(); } @Override @@ -51,19 +46,6 @@ public class MyFreeCams extends AbstractSite { return BASE_URI + "/?baf=8127165"; } - @Override - public void setRecorder(Recorder recorder) { - this.recorder = recorder; - } - - @Override - public TabProvider getTabProvider() { - if(tabProvider == null) { - tabProvider = new MyFreeCamsTabProvider(client, recorder, this); - } - return tabProvider; - } - @Override public MyFreeCamsModel createModel(String name) { MyFreeCamsModel model = new MyFreeCamsModel(this); @@ -75,7 +57,7 @@ public class MyFreeCams extends AbstractSite { @Override public Integer getTokenBalance() throws IOException { Request req = new Request.Builder().url(BASE_URI + "/php/account.php?request=status").build(); - try(Response response = getHttpClient().execute(req, true)) { + try(Response response = getHttpClient().execute(req)) { if(response.isSuccessful()) { String content = response.body().string(); Elements tags = HtmlParser.getTags(content, "div.content > p > b"); @@ -124,11 +106,6 @@ public class MyFreeCams extends AbstractSite { return client; } - @Override - public ConfigUI getConfigurationGui() { - return new MyFreeCamsConfigUI(this); - } - @Override public boolean credentialsAvailable() { String username = Config.getInstance().getSettings().mfcUsername; diff --git a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsClient.java b/common/src/ctbrec/sites/mfc/MyFreeCamsClient.java similarity index 99% rename from client/src/main/java/ctbrec/sites/mfc/MyFreeCamsClient.java rename to common/src/ctbrec/sites/mfc/MyFreeCamsClient.java index d66a28a5..7a5ef0c6 100644 --- a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsClient.java +++ b/common/src/ctbrec/sites/mfc/MyFreeCamsClient.java @@ -16,7 +16,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import org.eclipse.jetty.util.StringUtil; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; @@ -29,6 +28,7 @@ import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.Moshi; import ctbrec.Config; +import ctbrec.StringUtil; import okhttp3.Cookie; import okhttp3.Request; import okhttp3.Response; @@ -509,7 +509,7 @@ public class MyFreeCamsClient { } } - String getStreamUrl(SessionState state) { + public String getStreamUrl(SessionState state) { Integer camserv = state.getU().getCamserv(); if(camserv != null) { int userChannel = 100000000 + state.getUid(); diff --git a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsHttpClient.java b/common/src/ctbrec/sites/mfc/MyFreeCamsHttpClient.java similarity index 99% rename from client/src/main/java/ctbrec/sites/mfc/MyFreeCamsHttpClient.java rename to common/src/ctbrec/sites/mfc/MyFreeCamsHttpClient.java index 7924f5d4..1225ee45 100644 --- a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsHttpClient.java +++ b/common/src/ctbrec/sites/mfc/MyFreeCamsHttpClient.java @@ -10,9 +10,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpClient; import ctbrec.io.HttpException; -import ctbrec.ui.HtmlParser; import okhttp3.Cookie; import okhttp3.CookieJar; import okhttp3.FormBody; diff --git a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java b/common/src/ctbrec/sites/mfc/MyFreeCamsModel.java similarity index 99% rename from client/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java rename to common/src/ctbrec/sites/mfc/MyFreeCamsModel.java index 6378ce99..649c44f6 100644 --- a/client/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java +++ b/common/src/ctbrec/sites/mfc/MyFreeCamsModel.java @@ -27,10 +27,10 @@ import com.squareup.moshi.JsonReader; import com.squareup.moshi.JsonWriter; import ctbrec.AbstractModel; +import ctbrec.io.HtmlParser; import ctbrec.io.HttpException; import ctbrec.recorder.download.StreamSource; import ctbrec.sites.Site; -import ctbrec.ui.HtmlParser; import okhttp3.FormBody; import okhttp3.Request; import okhttp3.RequestBody; @@ -153,7 +153,7 @@ public class MyFreeCamsModel extends AbstractModel { .post(body) .addHeader("Referer", initUrl) .build(); - try(Response response = site.getHttpClient().execute(req, true)) { + try(Response response = site.getHttpClient().execute(req)) { if(!response.isSuccessful()) { throw new HttpException(response.code(), response.message()); } diff --git a/client/src/main/java/ctbrec/sites/mfc/ServerConfig.java b/common/src/ctbrec/sites/mfc/ServerConfig.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/ServerConfig.java rename to common/src/ctbrec/sites/mfc/ServerConfig.java diff --git a/client/src/main/java/ctbrec/sites/mfc/SessionState.java b/common/src/ctbrec/sites/mfc/SessionState.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/SessionState.java rename to common/src/ctbrec/sites/mfc/SessionState.java diff --git a/client/src/main/java/ctbrec/sites/mfc/Share.java b/common/src/ctbrec/sites/mfc/Share.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/Share.java rename to common/src/ctbrec/sites/mfc/Share.java diff --git a/client/src/main/java/ctbrec/sites/mfc/State.java b/common/src/ctbrec/sites/mfc/State.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/State.java rename to common/src/ctbrec/sites/mfc/State.java diff --git a/client/src/main/java/ctbrec/sites/mfc/User.java b/common/src/ctbrec/sites/mfc/User.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/User.java rename to common/src/ctbrec/sites/mfc/User.java diff --git a/client/src/main/java/ctbrec/sites/mfc/X.java b/common/src/ctbrec/sites/mfc/X.java similarity index 100% rename from client/src/main/java/ctbrec/sites/mfc/X.java rename to common/src/ctbrec/sites/mfc/X.java diff --git a/client/src/main/java/org/taktik/CHANGELOG.md b/common/src/org/taktik/CHANGELOG.md similarity index 100% rename from client/src/main/java/org/taktik/CHANGELOG.md rename to common/src/org/taktik/CHANGELOG.md diff --git a/client/src/main/java/org/taktik/ioutils/NIOUtils.java b/common/src/org/taktik/ioutils/NIOUtils.java similarity index 100% rename from client/src/main/java/org/taktik/ioutils/NIOUtils.java rename to common/src/org/taktik/ioutils/NIOUtils.java diff --git a/client/src/main/java/org/taktik/mpegts/Constants.java b/common/src/org/taktik/mpegts/Constants.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/Constants.java rename to common/src/org/taktik/mpegts/Constants.java diff --git a/client/src/main/java/org/taktik/mpegts/MTSPacket.java b/common/src/org/taktik/mpegts/MTSPacket.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/MTSPacket.java rename to common/src/org/taktik/mpegts/MTSPacket.java diff --git a/client/src/main/java/org/taktik/mpegts/Merger.java b/common/src/org/taktik/mpegts/Merger.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/Merger.java rename to common/src/org/taktik/mpegts/Merger.java diff --git a/client/src/main/java/org/taktik/mpegts/PATSection.java b/common/src/org/taktik/mpegts/PATSection.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/PATSection.java rename to common/src/org/taktik/mpegts/PATSection.java diff --git a/client/src/main/java/org/taktik/mpegts/PMTSection.java b/common/src/org/taktik/mpegts/PMTSection.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/PMTSection.java rename to common/src/org/taktik/mpegts/PMTSection.java diff --git a/client/src/main/java/org/taktik/mpegts/PSISection.java b/common/src/org/taktik/mpegts/PSISection.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/PSISection.java rename to common/src/org/taktik/mpegts/PSISection.java diff --git a/client/src/main/java/org/taktik/mpegts/PacketSupport.java b/common/src/org/taktik/mpegts/PacketSupport.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/PacketSupport.java rename to common/src/org/taktik/mpegts/PacketSupport.java diff --git a/client/src/main/java/org/taktik/mpegts/Streamer.java b/common/src/org/taktik/mpegts/Streamer.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/Streamer.java rename to common/src/org/taktik/mpegts/Streamer.java diff --git a/client/src/main/java/org/taktik/mpegts/StreamerTest.java b/common/src/org/taktik/mpegts/StreamerTest.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/StreamerTest.java rename to common/src/org/taktik/mpegts/StreamerTest.java diff --git a/client/src/main/java/org/taktik/mpegts/sinks/ByteChannelSink.java b/common/src/org/taktik/mpegts/sinks/ByteChannelSink.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sinks/ByteChannelSink.java rename to common/src/org/taktik/mpegts/sinks/ByteChannelSink.java diff --git a/client/src/main/java/org/taktik/mpegts/sinks/MTSSink.java b/common/src/org/taktik/mpegts/sinks/MTSSink.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sinks/MTSSink.java rename to common/src/org/taktik/mpegts/sinks/MTSSink.java diff --git a/client/src/main/java/org/taktik/mpegts/sinks/UDPTransport.java b/common/src/org/taktik/mpegts/sinks/UDPTransport.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sinks/UDPTransport.java rename to common/src/org/taktik/mpegts/sinks/UDPTransport.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/AbstractByteChannelMTSSource.java b/common/src/org/taktik/mpegts/sources/AbstractByteChannelMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/AbstractByteChannelMTSSource.java rename to common/src/org/taktik/mpegts/sources/AbstractByteChannelMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/AbstractMTSSource.java b/common/src/org/taktik/mpegts/sources/AbstractMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/AbstractMTSSource.java rename to common/src/org/taktik/mpegts/sources/AbstractMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/BlockingMultiMTSSource.java b/common/src/org/taktik/mpegts/sources/BlockingMultiMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/BlockingMultiMTSSource.java rename to common/src/org/taktik/mpegts/sources/BlockingMultiMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/ByteChannelMTSSource.java b/common/src/org/taktik/mpegts/sources/ByteChannelMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/ByteChannelMTSSource.java rename to common/src/org/taktik/mpegts/sources/ByteChannelMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/ByteSourceMTSSource.java b/common/src/org/taktik/mpegts/sources/ByteSourceMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/ByteSourceMTSSource.java rename to common/src/org/taktik/mpegts/sources/ByteSourceMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/ConcatenatingMTSSource.java b/common/src/org/taktik/mpegts/sources/ConcatenatingMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/ConcatenatingMTSSource.java rename to common/src/org/taktik/mpegts/sources/ConcatenatingMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/ContinuityFixer.java b/common/src/org/taktik/mpegts/sources/ContinuityFixer.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/ContinuityFixer.java rename to common/src/org/taktik/mpegts/sources/ContinuityFixer.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/ContinuityFixingMTSSource.java b/common/src/org/taktik/mpegts/sources/ContinuityFixingMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/ContinuityFixingMTSSource.java rename to common/src/org/taktik/mpegts/sources/ContinuityFixingMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/FixedBitrateMTSSource.java b/common/src/org/taktik/mpegts/sources/FixedBitrateMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/FixedBitrateMTSSource.java rename to common/src/org/taktik/mpegts/sources/FixedBitrateMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/InputStreamMTSSource.java b/common/src/org/taktik/mpegts/sources/InputStreamMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/InputStreamMTSSource.java rename to common/src/org/taktik/mpegts/sources/InputStreamMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/LoopingMTSSource.java b/common/src/org/taktik/mpegts/sources/LoopingMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/LoopingMTSSource.java rename to common/src/org/taktik/mpegts/sources/LoopingMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/MTSSource.java b/common/src/org/taktik/mpegts/sources/MTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/MTSSource.java rename to common/src/org/taktik/mpegts/sources/MTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/MTSSources.java b/common/src/org/taktik/mpegts/sources/MTSSources.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/MTSSources.java rename to common/src/org/taktik/mpegts/sources/MTSSources.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/MultiplexingMTSSource.java b/common/src/org/taktik/mpegts/sources/MultiplexingMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/MultiplexingMTSSource.java rename to common/src/org/taktik/mpegts/sources/MultiplexingMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/NullPacketSource.java b/common/src/org/taktik/mpegts/sources/NullPacketSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/NullPacketSource.java rename to common/src/org/taktik/mpegts/sources/NullPacketSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/ResettableMTSSource.java b/common/src/org/taktik/mpegts/sources/ResettableMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/ResettableMTSSource.java rename to common/src/org/taktik/mpegts/sources/ResettableMTSSource.java diff --git a/client/src/main/java/org/taktik/mpegts/sources/SeekableByteChannelMTSSource.java b/common/src/org/taktik/mpegts/sources/SeekableByteChannelMTSSource.java similarity index 100% rename from client/src/main/java/org/taktik/mpegts/sources/SeekableByteChannelMTSSource.java rename to common/src/org/taktik/mpegts/sources/SeekableByteChannelMTSSource.java diff --git a/master/pom.xml b/master/pom.xml index 6778e809..23b60583 100644 --- a/master/pom.xml +++ b/master/pom.xml @@ -7,128 +7,95 @@ master pom 1.9.0 + + + ../common + ../client + ../server + UTF-8 - - - src/main/resources - false - - - src/main/java - false - - **/*.css - - - - src/main/resources - true - - version - - - maven-assembly-plugin 3.1.0 - - - assembly - package - - single - - - ${name.final} - false - - jar-with-dependencies - - - - - - - org.jsoup - jsoup - 1.10.3 - - - com.squareup.okhttp3 - okhttp - 3.10.0 - - - com.squareup.moshi - moshi - 1.5.0 - - - org.json - json - 20180130 - - - org.slf4j - slf4j-api - 1.7.25 - - - ch.qos.logback - logback-classic - 1.2.3 - runtime - - - org.eclipse.jetty - jetty-server - [9.3.24.v20180605,) - - - org.eclipse.jetty - jetty-servlet - [9.3.24.v20180605,) - - - com.iheartradio.m3u8 - open-m3u8 - 0.2.4 - - - org.jcodec - jcodec - 0.2.3 - - - org.openjfx - javafx-controls - 11 - - - org.openjfx - javafx-web - 11 - - - com.google.guava - guava - 17.0 - - - junit - junit - 4.12 - test - - + + + + ctbrec + common + ${project.version} + + + org.jsoup + jsoup + 1.10.3 + + + com.squareup.okhttp3 + okhttp + 3.10.0 + + + com.squareup.moshi + moshi + 1.5.0 + + + org.json + json + 20180130 + + + org.slf4j + slf4j-api + 1.7.25 + + + ch.qos.logback + logback-classic + 1.2.3 + runtime + + + com.iheartradio.m3u8 + open-m3u8 + 0.2.4 + + + org.jcodec + jcodec + 0.2.3 + + + org.openjfx + javafx-controls + 11 + + + org.openjfx + javafx-web + 11 + + + com.google.guava + guava + 17.0 + + + junit + junit + 4.12 + test + + + diff --git a/server/.classpath b/server/.classpath index d6554125..434c0f84 100644 --- a/server/.classpath +++ b/server/.classpath @@ -1,10 +1,15 @@ - + + - + - - + + + + + + diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 00000000..b83d2226 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/server/.project b/server/.project index d837ad8a..28cfc354 100644 --- a/server/.project +++ b/server/.project @@ -10,8 +10,14 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature diff --git a/server/.settings/org.eclipse.core.resources.prefs b/server/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/server/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/server/.settings/org.eclipse.jdt.core.prefs b/server/.settings/org.eclipse.jdt.core.prefs index a54bb93c..8445b6b1 100644 --- a/server/.settings/org.eclipse.jdt.core.prefs +++ b/server/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,13 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=10 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=10 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=10 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/server/.settings/org.eclipse.m2e.core.prefs b/server/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/server/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/server/pom.xml b/server/pom.xml index 9aed519b..875b4b43 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -3,14 +3,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ctbrec server - 1.9.0 + + + ctbrec + master + 1.9.0 + ../master + - UTF-8 - 10 - 10 + 1.8 + 1.8 ${project.artifactId}-${project.version}-final @@ -20,13 +24,6 @@ src/main/resources false - - src/main/java - false - - **/*.css - - src/main/resources true @@ -61,34 +58,12 @@ - org.jsoup - jsoup - 1.10.3 - - - com.squareup.okhttp3 - okhttp - 3.10.0 - - - com.squareup.moshi - moshi - 1.5.0 - - - org.json - json - 20180130 - - - org.slf4j - slf4j-api - 1.7.25 + ctbrec + common ch.qos.logback logback-classic - 1.2.3 runtime @@ -101,185 +76,10 @@ jetty-servlet [9.3.24.v20180605,) - - com.iheartradio.m3u8 - open-m3u8 - 0.2.4 - - - org.jcodec - jcodec - 0.2.3 - - - org.openjfx - javafx-controls - 11 - - - org.openjfx - javafx-web - 11 - - - com.google.guava - guava - 17.0 - junit junit - 4.12 test - - - - win - - - javafx.platform - win - - - - - - com.akathist.maven.plugins.launch4j - launch4j-maven-plugin - 1.7.22 - - - l4j-win - package - - launch4j - - - gui - target/ctbrec.exe - ${name.final}.jar - true - src/main/resources/icon.ico - ctbrec - - ctbrec.ui.Launcher - false - anything - - - jre - true - 1.8.0 - 512 - - - ${project.version}.0 - ${project.version} - Recorder for Charturbate streams - 2018 0xboobface - ${project.version}.0 - ${project.version} - CTB Recorder - ctbrec - ctbrec.exe - - - src/main/resources/splash.bmp - true - 60 - true - - - - - - - maven-assembly-plugin - 3.1.0 - - - zip - verify - - single - - - - src/assembly/win64.xml - src/assembly/win64-jre.xml - - - - - - - - - - linux - - - javafx.platform - linux - - - - - - maven-assembly-plugin - 3.1.0 - - - zip - verify - - single - - - - src/assembly/linux.xml - src/assembly/linux-jre.xml - - - - - - - - - - macos - - - javafx.platform - mac - - - - - - maven-assembly-plugin - 3.1.0 - - - zip - verify - - single - - - - src/assembly/macos.xml - src/assembly/macos-jre.xml - - - - - - - - - diff --git a/client/src/main/java/ctbrec/recorder/server/AbstractCtbrecServlet.java b/server/src/main/java/ctbrec/recorder/server/AbstractCtbrecServlet.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/server/AbstractCtbrecServlet.java rename to server/src/main/java/ctbrec/recorder/server/AbstractCtbrecServlet.java diff --git a/client/src/main/java/ctbrec/recorder/server/HlsServlet.java b/server/src/main/java/ctbrec/recorder/server/HlsServlet.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/server/HlsServlet.java rename to server/src/main/java/ctbrec/recorder/server/HlsServlet.java diff --git a/client/src/main/java/ctbrec/recorder/server/HttpServer.java b/server/src/main/java/ctbrec/recorder/server/HttpServer.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/server/HttpServer.java rename to server/src/main/java/ctbrec/recorder/server/HttpServer.java diff --git a/client/src/main/java/ctbrec/recorder/server/RecorderServlet.java b/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java similarity index 100% rename from client/src/main/java/ctbrec/recorder/server/RecorderServlet.java rename to server/src/main/java/ctbrec/recorder/server/RecorderServlet.java