From acd6126619548d169cd6e3aa2107d4d8701aacf7 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Sun, 7 Jun 2020 13:53:54 +0200 Subject: [PATCH] Add "New" tab to each site where it was missing --- .../ctbrec/ui/sites/cam4/Cam4TabProvider.java | 1 + .../ui/sites/camsoda/CamsodaShowsTab.java | 21 +-- .../ui/sites/camsoda/CamsodaTabProvider.java | 9 +- .../sites/camsoda/CamsodaUpdateService.java | 174 +++++++++--------- .../chaturbate/ChaturbateTabProvider.java | 1 + .../flirt4free/Flirt4FreeTabProvider.java | 13 +- .../flirt4free/Flirt4FreeUpdateService.java | 14 +- .../sites/jasmin/LiveJasminTabProvider.java | 1 + .../myfreecams/MyFreeCamsTabProvider.java | 5 + .../ui/sites/myfreecams/NewModelService.java | 38 ++++ .../sites/stripchat/StripchatTabProvider.java | 1 + .../ctbrec/sites/camsoda/CamsodaModel.java | 10 + .../sites/flirt4free/Flirt4FreeModel.java | 9 + .../ctbrec/sites/mfc/MyFreeCamsModel.java | 21 ++- 14 files changed, 201 insertions(+), 117 deletions(-) create mode 100644 client/src/main/java/ctbrec/ui/sites/myfreecams/NewModelService.java diff --git a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java index 4cfb118d..e9eb0149 100644 --- a/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/cam4/Cam4TabProvider.java @@ -29,6 +29,7 @@ public class Cam4TabProvider extends TabProvider { tabs.add(createTab("Male", cam4.getBaseUrl() + "/directoryResults?online=true&gender=male&orderBy=MOST_VIEWERS")); tabs.add(createTab("Couples", cam4.getBaseUrl() + "/directoryResults?online=true&broadcastType=male_group&broadcastType=female_group&broadcastType=male_female_group&orderBy=MOST_VIEWERS")); tabs.add(createTab("HD", cam4.getBaseUrl() + "/directoryResults?online=true&hd=true&orderBy=MOST_VIEWERS")); + tabs.add(createTab("New", cam4.getBaseUrl() + "/directoryResults?online=true&gender=female&orderBy=MOST_VIEWERS&newPerformer=true")); followed = new Cam4FollowedTab(cam4); followed.setRecorder(recorder); diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java index 867b8414..c36d0e8e 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java @@ -28,7 +28,6 @@ import ctbrec.ui.SiteUiFactory; import ctbrec.ui.tabs.TabSelectionListener; import javafx.application.Platform; import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; import javafx.concurrent.Task; import javafx.geometry.Insets; import javafx.scene.Cursor; @@ -52,12 +51,11 @@ import okhttp3.Response; public class CamsodaShowsTab extends Tab implements TabSelectionListener { - private static final transient Logger LOG = LoggerFactory.getLogger(CamsodaShowsTab.class); + private static final Logger LOG = LoggerFactory.getLogger(CamsodaShowsTab.class); private Camsoda camsoda; private Recorder recorder; private GridPane showList; - private ProgressIndicator progressIndicator; public CamsodaShowsTab(Camsoda camsoda, Recorder recorder) { this.camsoda = camsoda; @@ -70,7 +68,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { showList.setPadding(new Insets(5)); showList.setHgap(5); showList.setVgap(5); - progressIndicator = new ProgressIndicator(); + ProgressIndicator progressIndicator = new ProgressIndicator(); progressIndicator.setPrefSize(100, 100); setContent(progressIndicator); setClosable(false); @@ -101,7 +99,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { } return boxes; } else { - LOG.error("Couldn't load upcoming camsoda shows. Unexpected response: {}", json.toString()); + LOG.error("Couldn't load upcoming camsoda shows. Unexpected response: {}", json); showErrorDialog("Oh no!", "Couldn't load upcoming CamSoda shows", "Got an unexpected response from server"); } } else { @@ -143,6 +141,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { @Override public void deselected() { + // nothing to do } private void showErrorDialog(String title, String head, String msg) { @@ -257,16 +256,12 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { } Platform.runLater(() -> { Image img = new Image(imageUrl, 1000, thumbSize, true, true, true); - img.progressProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, Number oldValue, Number newValue) { - if (newValue.doubleValue() == 1.0) { - thumb.setImage(img); - root.setLeft(thumb); - } + img.progressProperty().addListener((ChangeListener) (observable, oldValue, newValue) -> { + if (newValue.doubleValue() == 1.0) { + thumb.setImage(img); + root.setLeft(thumb); } }); - }); } } diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java index d44c3ba9..796a0e70 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaTabProvider.java @@ -4,9 +4,11 @@ import static ctbrec.sites.camsoda.Camsoda.*; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; import ctbrec.recorder.Recorder; import ctbrec.sites.camsoda.Camsoda; +import ctbrec.sites.camsoda.CamsodaModel; import ctbrec.ui.tabs.TabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; @@ -27,7 +29,8 @@ public class CamsodaTabProvider extends TabProvider { @Override public List getTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Online", BASE_URI + "/api/v1/browse/online")); + tabs.add(createTab("Online", BASE_URI + "/api/v1/browse/online", m -> true)); + tabs.add(createTab("New", BASE_URI + "/api/v1/browse/online", CamsodaModel::isNew)); followedTab.setRecorder(recorder); followedTab.setScene(scene); tabs.add(followedTab); @@ -40,8 +43,8 @@ public class CamsodaTabProvider extends TabProvider { return followedTab; } - private Tab createTab(String title, String url) { - CamsodaUpdateService updateService = new CamsodaUpdateService(url, false, camsoda); + private Tab createTab(String title, String url, Predicate filter) { + CamsodaUpdateService updateService = new CamsodaUpdateService(url, false, camsoda, filter); ThumbOverviewTab tab = new ThumbOverviewTab(title, updateService, camsoda); tab.setRecorder(recorder); return tab; diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java index d801af7f..53822bcc 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaUpdateService.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.function.Predicate; import java.util.stream.Collectors; import org.json.JSONArray; @@ -33,10 +34,13 @@ public class CamsodaUpdateService extends PaginatedScheduledService { private Camsoda camsoda; int modelsPerPage = 50; - public CamsodaUpdateService(String url, boolean loginRequired, Camsoda camsoda) { + private Predicate filter; + + public CamsodaUpdateService(String url, boolean loginRequired, Camsoda camsoda, Predicate filter) { this.url = url; this.loginRequired = loginRequired; this.camsoda = camsoda; + this.filter = filter; } @Override @@ -44,90 +48,94 @@ public class CamsodaUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - List models = new ArrayList<>(); - if(loginRequired && StringUtil.isBlank(ctbrec.Config.getInstance().getSettings().username)) { - return Collections.emptyList(); - } 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)) { - if (response.isSuccessful()) { - JSONObject json = new JSONObject(response.body().string()); - if(json.has("status") && json.getBoolean("status")) { - JSONArray template = json.getJSONArray("template"); - JSONArray results = json.getJSONArray("results"); - for (int i = 0; i < results.length(); i++) { - JSONObject result = results.getJSONObject(i); - try { - if(result.has("tpl")) { - JSONArray tpl = result.getJSONArray("tpl"); - String name = tpl.getString(getTemplateIndex(template, "username")); - CamsodaModel model = (CamsodaModel) camsoda.createModel(name); - model.setDescription(tpl.getString(getTemplateIndex(template, "subject_html"))); - model.setSortOrder(tpl.getFloat(getTemplateIndex(template, "sort_value"))); - String preview = "https:" + tpl.getString(getTemplateIndex(template, "thumb")); - model.setPreview(preview); - String displayName = tpl.getString(getTemplateIndex(template, "display_name")); - model.setDisplayName(displayName.replaceAll("[^a-zA-Z0-9]", "")); - if(model.getDisplayName().isBlank()) { - model.setDisplayName(name); - } - models.add(model); - } else { - String name = result.getString("username"); - CamsodaModel model = (CamsodaModel) camsoda.createModel(name); - model.setSortOrder(result.getFloat("sort_value")); - models.add(model); - if(result.has("status")) { - model.setOnlineStateByStatus(result.getString("status")); - } - - if(result.has("display_name")) { - model.setDisplayName(result.getString("display_name").replaceAll("[^a-zA-Z0-9]", "")); - if(model.getDisplayName().isBlank()) { - model.setDisplayName(name); - } - } - - if(result.has("thumb")) { - String previewUrl = "https:" + result.getString("thumb"); - model.setPreview(previewUrl); - } - } - } catch (Exception e) { - LOG.warn("Couldn't parse one of the models: {}", result, e); - } - } - return models.stream() - .sorted((m1,m2) -> (int)(m2.getSortOrder() - m1.getSortOrder())) - .skip( (page-1) * modelsPerPage) - .limit(modelsPerPage) - .collect(Collectors.toList()); - } else { - LOG.debug("Response was not successful: {}", json); - return Collections.emptyList(); - } - } else { - throw new HttpException(response.code(), response.message()); - } - } - } - } - - private int getTemplateIndex(JSONArray template, String string) { - for (int i = 0; i < template.length(); i++) { - String s = template.getString(i); - if(Objects.equals(s, string)) { - return i; - } - } - throw new NoSuchElementException(string + " not found in template: " + template.toString()); + return loadOnlineModels().stream() + .sorted((m1,m2) -> (int)(m2.getSortOrder() - m1.getSortOrder())) + .filter(filter) + .skip( (page-1) * modelsPerPage) + .limit(modelsPerPage) + .collect(Collectors.toList()); } }; } + protected List loadOnlineModels() throws IOException { + List models = new ArrayList<>(); + if(loginRequired && StringUtil.isBlank(ctbrec.Config.getInstance().getSettings().username)) { + return Collections.emptyList(); + } 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)) { + if (response.isSuccessful()) { + JSONObject json = new JSONObject(response.body().string()); + if(json.has("status") && json.getBoolean("status")) { + JSONArray template = json.getJSONArray("template"); + JSONArray results = json.getJSONArray("results"); + for (int i = 0; i < results.length(); i++) { + JSONObject result = results.getJSONObject(i); + try { + if(result.has("tpl")) { + JSONArray tpl = result.getJSONArray("tpl"); + String name = tpl.getString(getTemplateIndex(template, "username")); + CamsodaModel model = (CamsodaModel) camsoda.createModel(name); + model.setDescription(tpl.getString(getTemplateIndex(template, "subject_html"))); + model.setSortOrder(tpl.getFloat(getTemplateIndex(template, "sort_value"))); + String preview = "https:" + tpl.getString(getTemplateIndex(template, "thumb")); + model.setPreview(preview); + String displayName = tpl.getString(getTemplateIndex(template, "display_name")); + model.setDisplayName(displayName.replaceAll("[^a-zA-Z0-9]", "")); + if(model.getDisplayName().isBlank()) { + model.setDisplayName(name); + } + model.setNew(result.optBoolean("new")); + models.add(model); + } else { + String name = result.getString("username"); + CamsodaModel model = (CamsodaModel) camsoda.createModel(name); + model.setSortOrder(result.getFloat("sort_value")); + if(result.has("status")) { + model.setOnlineStateByStatus(result.getString("status")); + } + if(result.has("display_name")) { + model.setDisplayName(result.getString("display_name").replaceAll("[^a-zA-Z0-9]", "")); + if(model.getDisplayName().isBlank()) { + model.setDisplayName(name); + } + } + if(result.has("thumb")) { + String previewUrl = "https:" + result.getString("thumb"); + model.setPreview(previewUrl); + } + model.setNew(result.optBoolean("new")); + models.add(model); + } + } catch (Exception e) { + LOG.warn("Couldn't parse one of the models: {}", result, e); + } + } + return models; + } else { + LOG.debug("Response was not successful: {}", json); + return Collections.emptyList(); + } + } else { + throw new HttpException(response.code(), response.message()); + } + } + } + } + + private int getTemplateIndex(JSONArray template, String string) { + for (int i = 0; i < template.length(); i++) { + String s = template.getString(i); + if(Objects.equals(s, string)) { + return i; + } + } + throw new NoSuchElementException(string + " not found in template: " + template.toString()); + } } diff --git a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java index 641c65fe..4fafd43f 100644 --- a/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/chaturbate/ChaturbateTabProvider.java @@ -27,6 +27,7 @@ public class ChaturbateTabProvider extends TabProvider { List tabs = new ArrayList<>(); tabs.add(createTab("Featured", chaturbate.getBaseUrl() + "/")); tabs.add(createTab("Female", chaturbate.getBaseUrl() + "/female-cams/")); + tabs.add(createTab("New Female", chaturbate.getBaseUrl() + "/new-cams/female/")); tabs.add(createTab("Male", chaturbate.getBaseUrl() + "/male-cams/")); tabs.add(createTab("Couples", chaturbate.getBaseUrl() + "/couple-cams/")); tabs.add(createTab("Trans", chaturbate.getBaseUrl() + "/trans-cams/")); diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java index f10878f4..5439cd0f 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java @@ -2,8 +2,10 @@ package ctbrec.ui.sites.flirt4free; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; import ctbrec.sites.flirt4free.Flirt4Free; +import ctbrec.sites.flirt4free.Flirt4FreeModel; import ctbrec.ui.tabs.TabProvider; import ctbrec.ui.tabs.ThumbOverviewTab; import javafx.scene.Scene; @@ -24,9 +26,10 @@ public class Flirt4FreeTabProvider extends TabProvider { @Override public List getTabs(Scene scene) { List tabs = new ArrayList<>(); - tabs.add(createTab("Girls", flirt4Free.getBaseUrl() + "/live/girls/")); - tabs.add(createTab("Boys", flirt4Free.getBaseUrl() + "/live/guys/")); - tabs.add(createTab("Trans", flirt4Free.getBaseUrl() + "/live/trans/")); + tabs.add(createTab("Girls", flirt4Free.getBaseUrl() + "/live/girls/", m -> true)); + tabs.add(createTab("New Girls", flirt4Free.getBaseUrl() + "/live/girls/", Flirt4FreeModel::isNew)); + tabs.add(createTab("Boys", flirt4Free.getBaseUrl() + "/live/guys/", m -> true)); + tabs.add(createTab("Trans", flirt4Free.getBaseUrl() + "/live/trans/", m -> true)); tabs.add(followedTab); return tabs; } @@ -36,8 +39,8 @@ public class Flirt4FreeTabProvider extends TabProvider { return followedTab; } - private ThumbOverviewTab createTab(String title, String url) { - Flirt4FreeUpdateService s = new Flirt4FreeUpdateService(flirt4Free, url); + private ThumbOverviewTab createTab(String title, String url, Predicate filter) { + Flirt4FreeUpdateService s = new Flirt4FreeUpdateService(flirt4Free, url, filter); ThumbOverviewTab tab = new ThumbOverviewTab(title, s, flirt4Free); tab.setRecorder(flirt4Free.getRecorder()); s.setPeriod(Duration.seconds(60)); diff --git a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java index efa4d9a2..d1fae3f9 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java @@ -5,6 +5,8 @@ import static ctbrec.io.HttpConstants.*; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -32,10 +34,12 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { private static final int MODELS_PER_PAGE = 40; private String url; private Flirt4Free flirt4Free; + private Predicate filter; - public Flirt4FreeUpdateService(Flirt4Free flirt4Free, String url) { + public Flirt4FreeUpdateService(Flirt4Free flirt4Free, String url, Predicate filter) { this.flirt4Free = flirt4Free; this.url = url; + this.filter = filter; } @Override @@ -60,7 +64,7 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { } private List parseResponse(Response response) throws IOException { - List models = new ArrayList<>(); + List models = new ArrayList<>(); String body = response.body().string(); Matcher m = Pattern.compile("window\\.homepageData = (\\{.*\\})", Pattern.DOTALL).matcher(body); if (m.find()) { @@ -68,12 +72,13 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { JSONArray modelData = data.getJSONArray("liveModels"); LOG.debug("Found {} models", modelData.length()); for (int i = 0; i < modelData.length(); i++) { - Model model = parseModel(modelData.getString(i)); + Flirt4FreeModel model = parseModel(modelData.getString(i)); if (model != null) { models.add(model); } } return models.stream() + .filter(filter) .skip((page - 1) * MODELS_PER_PAGE) .limit(MODELS_PER_PAGE) .collect(Collectors.toList()); @@ -82,7 +87,7 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { } } - private Model parseModel(String modelHtml) { + private Flirt4FreeModel parseModel(String modelHtml) { if (modelHtml.trim().isEmpty() || !modelHtml.contains("modelLink")) { return null; } @@ -114,6 +119,7 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { model.setStreamUrl(streamUrl); model.setOnlineState(ctbrec.Model.State.ONLINE); model.setOnline(true); + model.setNew(!Optional.ofNullable(modelDiv.attr("data-model-new")).orElse("0").equals("0")); return model; } } diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java index da0c7c03..4b7c8f6a 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminTabProvider.java @@ -25,6 +25,7 @@ public class LiveJasminTabProvider extends TabProvider { tabs.add(createTab("Girls", liveJasmin.getBaseUrl() + "/en/girl/?listPageOrderType=most_popular")); tabs.add(createTab("Girls HD", liveJasmin.getBaseUrl() + "/en/girl/hd/?listPageOrderType=most_popular")); + tabs.add(createTab("New Girls", liveJasmin.getBaseUrl() + "/en/girls/newbie/?listPageOrderType=most_popular")); tabs.add(createTab("Boys", liveJasmin.getBaseUrl() + "/en/boy/?listPageOrderType=most_popular")); tabs.add(createTab("Boys HD", liveJasmin.getBaseUrl() + "/en/boy/hd/?listPageOrderType=most_popular")); diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java index 978cb86f..9c407622 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTabProvider.java @@ -44,6 +44,11 @@ public class MyFreeCamsTabProvider extends TabProvider { pop.setRecorder(recorder); tabs.add(pop); + updateService = new NewModelService(); + ThumbOverviewTab newModels = new ThumbOverviewTab("New", updateService, myFreeCams); + newModels.setRecorder(recorder); + tabs.add(newModels); + MyFreeCamsTableTab table = new MyFreeCamsTableTab(myFreeCams); tabs.add(table); diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/NewModelService.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/NewModelService.java new file mode 100644 index 00000000..3ac03d2b --- /dev/null +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/NewModelService.java @@ -0,0 +1,38 @@ +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.tabs.PaginatedScheduledService; +import javafx.concurrent.Task; + +public class NewModelService extends PaginatedScheduledService { + + @Override + protected Task> createTask() { + return new Task>() { + @Override + public List call() throws IOException { + MyFreeCamsClient client = MyFreeCamsClient.getInstance(); + int modelsPerPage = 50; + return client.getModels().stream() + .filter(m -> m.getPreview() != null) + .filter(m -> m.getStreamUrl() != null) + .filter(m -> { + try { + return m.isNew(); + } catch (Exception e) { + return false; + } + }) + .sorted((m1, m2) -> m2.getViewerCount() - m1.getViewerCount()) + .skip( (page-1) * modelsPerPage) + .limit(modelsPerPage) + .collect(Collectors.toList()); + } + }; + } +} diff --git a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java index 29ae6485..675cf143 100644 --- a/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/stripchat/StripchatTabProvider.java @@ -32,6 +32,7 @@ public class StripchatTabProvider extends TabProvider { List tabs = new ArrayList<>(); tabs.add(createTab("Girls", MessageFormat.format(urlTemplate, "girls"))); tabs.add(createTab("Girls HD", stripchat.getBaseUrl() + "/api/front/models?primaryTag=girls&filterGroupTags=%5B%5B%22autoTagHd%22%5D%5D&parentTag=autoTagHd")); + tabs.add(createTab("New Girls", stripchat.getBaseUrl() +"/api/front/models?primaryTag=girls&filterGroupTags=%5B%5B%22autoTagNew%22%5D%5D&parentTag=autoTagNew")); tabs.add(createTab("Couples", MessageFormat.format(urlTemplate, "couples"))); tabs.add(createTab("Boys", MessageFormat.format(urlTemplate, "men"))); tabs.add(createTab("Trans", MessageFormat.format(urlTemplate, "trans"))); diff --git a/common/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java b/common/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java index a196a5ad..9b182202 100644 --- a/common/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java +++ b/common/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java @@ -46,6 +46,8 @@ public class CamsodaModel extends AbstractModel { private static final Logger LOG = LoggerFactory.getLogger(CamsodaModel.class); private String streamUrl; private transient List streamSources = null; + private transient boolean isNew; + private float sortOrder = 0; private Random random = new Random(); int[] resolution = new int[2]; @@ -318,4 +320,12 @@ public class CamsodaModel extends AbstractModel { public void setSortOrder(float sortOrder) { this.sortOrder = sortOrder; } + + public boolean isNew() { + return isNew; + } + + public void setNew(boolean isNew) { + this.isNew = isNew; + } } diff --git a/common/src/main/java/ctbrec/sites/flirt4free/Flirt4FreeModel.java b/common/src/main/java/ctbrec/sites/flirt4free/Flirt4FreeModel.java index f72735f9..13357872 100644 --- a/common/src/main/java/ctbrec/sites/flirt4free/Flirt4FreeModel.java +++ b/common/src/main/java/ctbrec/sites/flirt4free/Flirt4FreeModel.java @@ -54,6 +54,7 @@ public class Flirt4FreeModel extends AbstractModel { private Object monitor = new Object(); private boolean online = false; private boolean isInteractiveShow = false; + private boolean isNew = false; private String userIdt = ""; private String userIp = "0.0.0.0"; @@ -471,6 +472,14 @@ public class Flirt4FreeModel extends AbstractModel { online = b; } + public boolean isNew() { + return isNew; + } + + public void setNew(boolean isNew) { + this.isNew = isNew; + } + private void acquireSlot() throws InterruptedException { //LOG.debug("Acquire: {}", requestThrottle.availablePermits()); requestThrottle.acquire(); diff --git a/common/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java b/common/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java index fbd304c1..0ff45d69 100644 --- a/common/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java +++ b/common/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java @@ -1,6 +1,7 @@ package ctbrec.sites.mfc; import static ctbrec.io.HttpConstants.*; +import static java.util.Optional.*; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -10,7 +11,6 @@ import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Objects; -import java.util.Optional; import java.util.concurrent.ExecutionException; import javax.xml.bind.JAXBException; @@ -101,10 +101,6 @@ public class MyFreeCamsModel extends AbstractModel { return new HlsStreamSourceProvider(getSite().getHttpClient()); } - private boolean isHlsStream() { - return Optional.ofNullable(streamUrl).orElse("").contains(".m3u8"); - } - private String updateStreamUrl() { if(streamUrl == null) { MyFreeCams mfc = (MyFreeCams) getSite(); @@ -203,6 +199,12 @@ public class MyFreeCamsModel extends AbstractModel { this.camScore = camScore; } + public boolean isNew() { + MyFreeCams mfc = (MyFreeCams) getSite(); + SessionState sessionState = mfc.getClient().getSessionState(this); + return ofNullable(sessionState).map(SessionState::getM).map(Model::getNewModel).orElse(0) == 1; + } + public void setMfcState(ctbrec.sites.mfc.State state) { this.state = state; } @@ -221,7 +223,8 @@ public class MyFreeCamsModel extends AbstractModel { setName(state.getNm()); setMfcState(ctbrec.sites.mfc.State.of(state.getVs())); setStreamUrl(streamUrl); - setCamScore(Optional.ofNullable(state.getM()).map(Model::getCamscore).orElse(0.0)); + setCamScore(ofNullable(state.getM()).map(Model::getCamscore).orElse(0.0)); + // preview String uidString = state.getUid().toString(); @@ -237,14 +240,14 @@ public class MyFreeCamsModel extends AbstractModel { setPreview(previewUrl); // tags - Optional.ofNullable(state.getM()).map(Model::getTags).ifPresent(tags -> { + ofNullable(state.getM()).map(Model::getTags).ifPresent(tags -> { ArrayList t = new ArrayList<>(); t.addAll(tags); setTags(t); }); // description - Optional.ofNullable(state.getM()).map(Model::getTopic).ifPresent(topic -> { + ofNullable(state.getM()).map(Model::getTopic).ifPresent(topic -> { try { setDescription(URLDecoder.decode(topic, "utf-8")); } catch (UnsupportedEncodingException e) { @@ -252,7 +255,7 @@ public class MyFreeCamsModel extends AbstractModel { } }); - viewerCount = Optional.ofNullable(state.getM()).map(Model::getRc).orElse(0); + viewerCount = ofNullable(state.getM()).map(Model::getRc).orElse(0); } private String getLivePreviewUrl(SessionState state) {