diff --git a/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayTabProvider.java b/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayTabProvider.java index 72529419..8e1d41ce 100644 --- a/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayTabProvider.java +++ b/client/src/main/java/ctbrec/ui/sites/streamray/StreamrayTabProvider.java @@ -14,8 +14,11 @@ import java.util.function.Predicate; public class StreamrayTabProvider extends AbstractTabProvider { + private final Tab followedTab; + public StreamrayTabProvider(Streamray site) { super(site); + followedTab = favoritesTab(); } @Override @@ -25,7 +28,7 @@ public class StreamrayTabProvider extends AbstractTabProvider { tabs.add(createTab("Boys", m -> Objects.equals("M", m.getGender()))); tabs.add(createTab("Trans", m -> Objects.equals("TS", m.getGender()))); tabs.add(createTab("New", StreamrayModel::isNew)); - tabs.add(favoritesTab()); + tabs.add(followedTab); return tabs; } @@ -45,4 +48,8 @@ public class StreamrayTabProvider extends AbstractTabProvider { return tab; } + @Override + public Tab getFollowedTab() { + return followedTab; + } } diff --git a/common/src/main/java/ctbrec/sites/streamray/Streamray.java b/common/src/main/java/ctbrec/sites/streamray/Streamray.java index beec51cc..50d2aa50 100644 --- a/common/src/main/java/ctbrec/sites/streamray/Streamray.java +++ b/common/src/main/java/ctbrec/sites/streamray/Streamray.java @@ -107,7 +107,7 @@ public class Streamray extends AbstractSite { @Override public boolean supportsFollow() { - return false; + return true; } @Override diff --git a/common/src/main/java/ctbrec/sites/streamray/StreamrayModel.java b/common/src/main/java/ctbrec/sites/streamray/StreamrayModel.java index 6535c80e..3e92b78e 100644 --- a/common/src/main/java/ctbrec/sites/streamray/StreamrayModel.java +++ b/common/src/main/java/ctbrec/sites/streamray/StreamrayModel.java @@ -4,6 +4,7 @@ import com.iheartradio.m3u8.ParseException; import com.iheartradio.m3u8.PlaylistException; import ctbrec.AbstractModel; import ctbrec.Config; +import ctbrec.StringUtil; import ctbrec.io.HttpException; import ctbrec.recorder.download.RecordingProcess; import ctbrec.recorder.download.StreamSource; @@ -11,7 +12,9 @@ import ctbrec.recorder.download.hls.FfmpegHlsDownload; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import okhttp3.MediaType; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; import org.json.JSONObject; @@ -28,6 +31,7 @@ import java.util.concurrent.ExecutionException; import static ctbrec.Model.State.*; import static ctbrec.io.HttpConstants.*; +import static ctbrec.sites.streamray.Streamray.API_URL; @Slf4j public class StreamrayModel extends AbstractModel { @@ -117,7 +121,7 @@ public class StreamrayModel extends AbstractModel { private JSONObject loadModelInfo() throws IOException { lastInfoRequest = Instant.now(); - String url = "https://beta-api.cams.com/models/stream/" + getName() + "/"; + String url = API_URL + "/models/stream/" + getName() + "/"; Request req = new Request.Builder().url(url) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) @@ -133,6 +137,24 @@ public class StreamrayModel extends AbstractModel { } } + private JSONObject loadModelProfileInfo() throws IOException { + String url = API_URL + "/models/new/" + getName() + "/"; + Request req = new Request.Builder().url(url) + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .header(ACCEPT, MIMETYPE_APPLICATION_JSON) + .header(ACCEPT_LANGUAGE, "en") + .header(REFERER, getSite().getBaseUrl() + '/' + getName()) + .build(); + try (Response response = site.getHttpClient().execute(req)) { + if (response.isSuccessful()) { + JSONObject jsonResponse = new JSONObject(response.body().string()); + return jsonResponse; + } else { + throw new HttpException(response.code(), response.message()); + } + } + } + @Override public RecordingProcess createDownload() { return new FfmpegHlsDownload(getSite().getHttpClient()); @@ -140,12 +162,70 @@ public class StreamrayModel extends AbstractModel { @Override public boolean follow() throws IOException { - return false; + JSONObject info = loadModelProfileInfo(); + String id = info.optString("id"); + if (StringUtil.isBlank(id)) { + log.debug("Can't get model id"); + return false; + } + String token = ((StreamrayHttpClient) site.getHttpClient()).getUserToken(); + if (StringUtil.isBlank(token)) { + log.debug("Not logged in"); + return false; + } + String url = API_URL + "/favorites/member_favorites/"; + JSONObject json = new JSONObject().put("model", id); + RequestBody requestBody = RequestBody.create(json.toString(), MediaType.parse("application/json")); + Request req = new Request.Builder() + .url(url) + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .header(ACCEPT, MIMETYPE_APPLICATION_JSON) + .header(ACCEPT_LANGUAGE, "en") + .header(REFERER, getSite().getBaseUrl() + '/' + getName()) + .header(ORIGIN, getSite().getBaseUrl()) + .header(AUTHORIZATION, "Bearer " + token) + .post(requestBody) + .build(); + try (Response response = site.getHttpClient().execute(req)) { + if (response.isSuccessful()) { + return true; + } else { + throw new HttpException(response.code(), response.message()); + } + } } @Override public boolean unfollow() throws IOException { - return false; + JSONObject info = loadModelProfileInfo(); + String id = info.optString("id"); + if (StringUtil.isBlank(id)) { + log.debug("Can't get model id"); + return false; + } + String token = ((StreamrayHttpClient) site.getHttpClient()).getUserToken(); + if (StringUtil.isBlank(token)) { + log.debug("Not logged in"); + return false; + } + String url = API_URL + "/favorites/member_favorites/" + id + "/"; + Request req = new Request.Builder() + .url(url) + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .header(ACCEPT, "*/*") + .header(ACCEPT_LANGUAGE, "en") + .header(REFERER, getSite().getBaseUrl() + '/' + getName()) + .header(ORIGIN, getSite().getBaseUrl()) + .header(AUTHORIZATION, "Bearer " + token) + .delete() + .build(); + try (Response response = site.getHttpClient().execute(req)) { + if (response.isSuccessful()) { + return true; + } else { + throw new HttpException(response.code(), response.message()); + } + } } @Override