diff --git a/common/src/main/java/ctbrec/sites/streamate/Streamate.java b/common/src/main/java/ctbrec/sites/streamate/Streamate.java index e0da236b..12cf63c7 100644 --- a/common/src/main/java/ctbrec/sites/streamate/Streamate.java +++ b/common/src/main/java/ctbrec/sites/streamate/Streamate.java @@ -1,17 +1,25 @@ package ctbrec.sites.streamate; import java.io.IOException; +import java.net.URLEncoder; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.json.JSONArray; +import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ctbrec.Config; import ctbrec.Model; import ctbrec.io.HttpClient; +import ctbrec.io.HttpException; import ctbrec.sites.AbstractSite; +import okhttp3.Request; +import okhttp3.Response; public class Streamate extends AbstractSite { @@ -33,7 +41,8 @@ public class Streamate extends AbstractSite { @Override public String getAffiliateLink() { - return BASE_URL + "/landing/click/?AFNO=2-11330.2"; + return BASE_URL + "/landing/click/?AFNO=2-11329.1"; + // return BASE_URL + "/landing/click/?AFNO=2-11330.2"; } @Override @@ -48,34 +57,34 @@ public class Streamate extends AbstractSite { @Override public Integer getTokenBalance() throws IOException { - // int userId = ((StreamateHttpClient)getHttpClient()).getUserId(); - // String url = Streamate.BASE_URL + "/tools/amf.php"; - // RequestBody body = new FormBody.Builder() - // .add("method", "ping") - // .add("args[]", Integer.toString(userId)) - // .build(); - // Request request = new Request.Builder() - // .url(url) - // .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) - // .addHeader("Accept", "application/json, text/javascript, */*") - // .addHeader("Accept-Language", "en") - // .addHeader("Referer", Streamate.BASE_URL) - // .addHeader("X-Requested-With", "XMLHttpRequest") - // .post(body) - // .build(); - // try(Response response = getHttpClient().execute(request)) { - // if(response.isSuccessful()) { - // JSONObject json = new JSONObject(response.body().string()); - // if(json.optString("status").equals("online")) { - // JSONObject userData = json.getJSONObject("userData"); - // return userData.getInt("balance"); - // } else { - // throw new IOException("Request was not successful: " + json.toString(2)); - // } - // } else { - // throw new HttpException(response.code(), response.message()); - // } - // } + // int userId = ((StreamateHttpClient)getHttpClient()).getUserId(); + // String url = Streamate.BASE_URL + "/tools/amf.php"; + // RequestBody body = new FormBody.Builder() + // .add("method", "ping") + // .add("args[]", Integer.toString(userId)) + // .build(); + // Request request = new Request.Builder() + // .url(url) + // .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) + // .addHeader("Accept", "application/json, text/javascript, */*") + // .addHeader("Accept-Language", "en") + // .addHeader("Referer", Streamate.BASE_URL) + // .addHeader("X-Requested-With", "XMLHttpRequest") + // .post(body) + // .build(); + // try(Response response = getHttpClient().execute(request)) { + // if(response.isSuccessful()) { + // JSONObject json = new JSONObject(response.body().string()); + // if(json.optString("status").equals("online")) { + // JSONObject userData = json.getJSONObject("userData"); + // return userData.getInt("balance"); + // } else { + // throw new IOException("Request was not successful: " + json.toString(2)); + // } + // } else { + // throw new HttpException(response.code(), response.message()); + // } + // } return 0; } @@ -91,7 +100,7 @@ public class Streamate extends AbstractSite { @Override public HttpClient getHttpClient() { - if(httpClient == null) { + if (httpClient == null) { httpClient = new StreamateHttpClient(); } return httpClient; @@ -103,7 +112,7 @@ public class Streamate extends AbstractSite { @Override public void shutdown() { - if(httpClient != null) { + if (httpClient != null) { httpClient.shutdown(); } } @@ -120,54 +129,51 @@ public class Streamate extends AbstractSite { @Override public boolean supportsSearch() { - return false; - } - - @Override - public boolean searchRequiresLogin() { return true; } + @Override + public boolean searchRequiresLogin() { + return false; + } + @Override public List search(String q) throws IOException, InterruptedException { - // String url = BASE_URL + "/tools/listing_v3.php?offset=0&model_search[display_name][text]=" + URLEncoder.encode(q, "utf-8"); - // Request req = new Request.Builder() - // .url(url) - // .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) - // .addHeader("Accept", "application/json, text/javascript, */*") - // .addHeader("Accept-Language", "en") - // .addHeader("Referer", Streamate.BASE_URL) - // .addHeader("X-Requested-With", "XMLHttpRequest") - // .build(); - // try(Response response = getHttpClient().execute(req)) { - // if(response.isSuccessful()) { - // String body = response.body().string(); - // JSONObject json = new JSONObject(body); - // if(json.optString("status").equals("success")) { - // List models = new ArrayList<>(); - // JSONArray results = json.getJSONArray("models"); - // for (int i = 0; i < results.length(); i++) { - // JSONObject result = results.getJSONObject(i); - // Model model = createModel(result.getString("username")); - // String thumb = result.getString("thumb_image"); - // if(thumb != null) { - // model.setPreview("https:" + thumb); - // } - // if(result.has("display_name")) { - // model.setDisplayName(result.getString("display_name")); - // } - // models.add(model); - // } - // return models; - // } else { - // LOG.warn("Search result: " + json.toString(2)); - // return Collections.emptyList(); - // } - // } else { - // throw new HttpException(response.code(), response.message()); - // } - // } - return Collections.emptyList(); + String url = BASE_URL + "/api/search/autocomplete?exact=false&skin_search_kids=0&results_per_page=10&query=" + URLEncoder.encode(q, "utf-8"); + Request req = new Request.Builder().url(url) + .addHeader("User-Agent", Config.getInstance().getSettings().httpUserAgent) + .addHeader("Accept", "application/json, text/javascript, */*") + .addHeader("Accept-Language", "en") + .addHeader("Referer", Streamate.BASE_URL) + .addHeader("X-Requested-With", "XMLHttpRequest").build(); + try (Response response = getHttpClient().execute(req)) { + if (response.isSuccessful()) { + String body = response.body().string(); + JSONObject json = new JSONObject(body); + if (json.optString("status").equals("SM_OK")) { + List models = new ArrayList<>(); + JSONObject results = json.getJSONObject("results"); + JSONArray nickname = results.getJSONArray("nickname"); + for (int i = 0; i < nickname.length(); i++) { + JSONObject result = nickname.getJSONObject(i); + StreamateModel model = (StreamateModel) createModel(result.getString("nickname")); + model.setId(result.getString("performerId")); + String thumb = result.getString("thumbnail"); + if (thumb != null) { + model.setPreview(thumb); + } + model.setOnline(result.optString("liveStatus").equals("live")); + models.add(model); + } + return models; + } else { + LOG.warn("Search result: " + json.toString(2)); + return Collections.emptyList(); + } + } else { + throw new HttpException(response.code(), response.message()); + } + } } @Override @@ -183,7 +189,7 @@ public class Streamate extends AbstractSite { @Override public Model createModelFromUrl(String url) { Matcher m = Pattern.compile("https?://.*?streamate.com/cam/([^/]*?)/?").matcher(url); - if(m.matches()) { + if (m.matches()) { String modelName = m.group(1); return createModel(modelName); } else { diff --git a/common/src/main/java/ctbrec/sites/streamate/StreamateHttpClient.java b/common/src/main/java/ctbrec/sites/streamate/StreamateHttpClient.java index 6772eadd..aa64b61f 100644 --- a/common/src/main/java/ctbrec/sites/streamate/StreamateHttpClient.java +++ b/common/src/main/java/ctbrec/sites/streamate/StreamateHttpClient.java @@ -1,11 +1,14 @@ package ctbrec.sites.streamate; import java.io.IOException; +import java.util.Collections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.io.HttpClient; +import okhttp3.Cookie; +import okhttp3.HttpUrl; public class StreamateHttpClient extends HttpClient { @@ -13,6 +16,14 @@ public class StreamateHttpClient extends HttpClient { public StreamateHttpClient() { super("streamate"); + + // this cookie is needed for the search + Cookie searchCookie = new Cookie.Builder() + .domain("streamate.com") + .name("Xld_rct") + .value("1") + .build(); + getCookieJar().saveFromResponse(HttpUrl.parse(Streamate.BASE_URL), Collections.singletonList(searchCookie)); } @Override diff --git a/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java b/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java index cecf91da..425009d7 100644 --- a/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java +++ b/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java @@ -45,11 +45,10 @@ public class StreamateModel extends AbstractModel { @Override public boolean isOnline(boolean ignoreCache) throws IOException, ExecutionException, InterruptedException { if(ignoreCache) { - String url = getStreamUrl(); - Request req = new Request.Builder().url(url).build(); - try(Response resp = site.getHttpClient().execute(req)) { - online = resp.isSuccessful(); - } + JSONObject roomInfo = getRoomInfo(); + JSONObject stream = roomInfo.getJSONObject("stream"); + String serverId = stream.optString("serverId"); + online = !serverId.equals("0"); } return online; }