Add follow / unfollow for Streamray

This commit is contained in:
0xb00bface 2023-11-05 15:03:00 +01:00
parent a9b1080d2f
commit b07a478d03
3 changed files with 92 additions and 5 deletions

View File

@ -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;
}
}

View File

@ -107,7 +107,7 @@ public class Streamray extends AbstractSite {
@Override
public boolean supportsFollow() {
return false;
return true;
}
@Override

View File

@ -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