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 6efe4302..55b7475a 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeTabProvider.java @@ -14,8 +14,8 @@ import javafx.util.Duration; public class Flirt4FreeTabProvider implements TabProvider { - private Flirt4Free flirt4Free; - private ThumbOverviewTab followedTab; + private final Flirt4Free flirt4Free; + private final ThumbOverviewTab followedTab; public Flirt4FreeTabProvider(Flirt4Free flirt4Free) { this.flirt4Free = flirt4Free; @@ -29,6 +29,7 @@ public class Flirt4FreeTabProvider implements TabProvider { 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("Couples", flirt4Free.getBaseUrl() + "/live/couples/", m -> m.getCategories().contains("2"))); tabs.add(createTab("Trans", flirt4Free.getBaseUrl() + "/live/trans/", m -> true)); tabs.add(followedTab); return tabs; 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 63ee12cd..7006d0e5 100644 --- a/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java +++ b/client/src/main/java/ctbrec/ui/sites/flirt4free/Flirt4FreeUpdateService.java @@ -1,19 +1,5 @@ package ctbrec.ui.sites.flirt4free; -import static ctbrec.io.HttpClient.*; -import static ctbrec.io.HttpConstants.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Predicate; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import ctbrec.Config; import ctbrec.Model; import ctbrec.io.HttpException; @@ -22,14 +8,30 @@ import ctbrec.sites.flirt4free.Flirt4FreeModel; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; +import org.json.JSONObject; +import org.jsoup.nodes.Entities; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static ctbrec.io.HttpClient.gunzipBody; +import static ctbrec.io.HttpConstants.*; public class Flirt4FreeUpdateService extends PaginatedScheduledService { private static final Logger LOG = LoggerFactory.getLogger(Flirt4FreeUpdateService.class); private static final int MODELS_PER_PAGE = 40; - private String url; - private Flirt4Free flirt4Free; - private Predicate filter; + private final String url; + private final Flirt4Free flirt4Free; + private final Predicate filter; public Flirt4FreeUpdateService(Flirt4Free flirt4Free, String url, Predicate filter) { this.flirt4Free = flirt4Free; @@ -39,7 +41,7 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { @Override protected Task> createTask() { - return new Task>() { + return new Task<>() { @Override public List call() throws IOException { LOG.debug("Fetching page {}", url); @@ -65,6 +67,7 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { var m = Pattern.compile("window\\.__homePageData__ = (\\{.*\\})", Pattern.DOTALL).matcher(body); if (m.find()) { var data = new JSONObject(m.group(1)); + Files.writeString(Paths.get("/tmp/data.json"), data.toString(2)); var modelData = data.getJSONArray("models"); LOG.debug("Found {} models", modelData.length()); for (var i = 0; i < modelData.length(); i++) { @@ -89,7 +92,7 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { private Flirt4FreeModel parseModel(JSONObject modelData) { var name = modelData.getString("model_seo_name"); Flirt4FreeModel model = (Flirt4FreeModel) flirt4Free.createModel(name); - model.setDisplayName(modelData.getString("display")); + model.setDisplayName(Entities.unescape(modelData.getString("display"))); model.setDescription(modelData.getString("topic")); model.setUrl(Flirt4Free.BASE_URI + "/rooms/" + model.getName() + '/'); model.setNew(modelData.optString("is_new", "0").equals("1")); @@ -101,6 +104,15 @@ public class Flirt4FreeUpdateService extends PaginatedScheduledService { model.setPreview("https://live-screencaps.vscdns.com/" + modelId + "-desktop.jpg"); model.setOnlineState(ctbrec.Model.State.ONLINE); model.setOnline(true); + if (modelData.has("category_id")) { + model.getCategories().add(modelData.getString("category_id")); + } + if (modelData.has("category_id_2")) { + model.getCategories().add(modelData.getString("category_id_2")); + } + if (modelData.has("category_id_3")) { + model.getCategories().add(modelData.getString("category_id_3")); + } return model; } } diff --git a/common/src/main/java/ctbrec/sites/flirt4free/Flirt4FreeModel.java b/common/src/main/java/ctbrec/sites/flirt4free/Flirt4FreeModel.java index 1fdf9869..e74ecd1a 100644 --- a/common/src/main/java/ctbrec/sites/flirt4free/Flirt4FreeModel.java +++ b/common/src/main/java/ctbrec/sites/flirt4free/Flirt4FreeModel.java @@ -5,10 +5,7 @@ import static ctbrec.io.HttpConstants.*; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; @@ -51,14 +48,15 @@ public class Flirt4FreeModel extends AbstractModel { private String streamHost; private String streamUrl; int[] resolution = new int[2]; - private transient Object monitor = new Object(); + private final transient Object monitor = new Object(); + private final transient List categories = new LinkedList<>(); private boolean online = false; private boolean isInteractiveShow = false; private boolean isNew = false; private String userIdt = ""; private String userIp = "0.0.0.0"; - private static Semaphore requestThrottle = new Semaphore(2, true); + private static final Semaphore requestThrottle = new Semaphore(2, true); private static volatile long lastRequest = 0; private long lastOnlineRequest = 0; @@ -532,4 +530,8 @@ public class Flirt4FreeModel extends AbstractModel { lastRequest = System.currentTimeMillis(); requestThrottle.release(); } + + public List getCategories() { + return categories; + } } diff --git a/master/pom.xml b/master/pom.xml index 4ab99aea..4aab5094 100644 --- a/master/pom.xml +++ b/master/pom.xml @@ -58,7 +58,7 @@ org.jsoup jsoup - 1.10.3 + 1.14.3 com.squareup.okhttp3