forked from j62/ctbrec
Add follow / unfollow for Streamray
This commit is contained in:
parent
a9b1080d2f
commit
b07a478d03
|
@ -14,8 +14,11 @@ import java.util.function.Predicate;
|
||||||
|
|
||||||
public class StreamrayTabProvider extends AbstractTabProvider {
|
public class StreamrayTabProvider extends AbstractTabProvider {
|
||||||
|
|
||||||
|
private final Tab followedTab;
|
||||||
|
|
||||||
public StreamrayTabProvider(Streamray site) {
|
public StreamrayTabProvider(Streamray site) {
|
||||||
super(site);
|
super(site);
|
||||||
|
followedTab = favoritesTab();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -25,7 +28,7 @@ public class StreamrayTabProvider extends AbstractTabProvider {
|
||||||
tabs.add(createTab("Boys", m -> Objects.equals("M", m.getGender())));
|
tabs.add(createTab("Boys", m -> Objects.equals("M", m.getGender())));
|
||||||
tabs.add(createTab("Trans", m -> Objects.equals("TS", m.getGender())));
|
tabs.add(createTab("Trans", m -> Objects.equals("TS", m.getGender())));
|
||||||
tabs.add(createTab("New", StreamrayModel::isNew));
|
tabs.add(createTab("New", StreamrayModel::isNew));
|
||||||
tabs.add(favoritesTab());
|
tabs.add(followedTab);
|
||||||
return tabs;
|
return tabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,4 +48,8 @@ public class StreamrayTabProvider extends AbstractTabProvider {
|
||||||
return tab;
|
return tab;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Tab getFollowedTab() {
|
||||||
|
return followedTab;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,7 +107,7 @@ public class Streamray extends AbstractSite {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsFollow() {
|
public boolean supportsFollow() {
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -4,6 +4,7 @@ import com.iheartradio.m3u8.ParseException;
|
||||||
import com.iheartradio.m3u8.PlaylistException;
|
import com.iheartradio.m3u8.PlaylistException;
|
||||||
import ctbrec.AbstractModel;
|
import ctbrec.AbstractModel;
|
||||||
import ctbrec.Config;
|
import ctbrec.Config;
|
||||||
|
import ctbrec.StringUtil;
|
||||||
import ctbrec.io.HttpException;
|
import ctbrec.io.HttpException;
|
||||||
import ctbrec.recorder.download.RecordingProcess;
|
import ctbrec.recorder.download.RecordingProcess;
|
||||||
import ctbrec.recorder.download.StreamSource;
|
import ctbrec.recorder.download.StreamSource;
|
||||||
|
@ -11,7 +12,9 @@ import ctbrec.recorder.download.hls.FfmpegHlsDownload;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import okhttp3.MediaType;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
|
import okhttp3.RequestBody;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
@ -28,6 +31,7 @@ import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
import static ctbrec.Model.State.*;
|
import static ctbrec.Model.State.*;
|
||||||
import static ctbrec.io.HttpConstants.*;
|
import static ctbrec.io.HttpConstants.*;
|
||||||
|
import static ctbrec.sites.streamray.Streamray.API_URL;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class StreamrayModel extends AbstractModel {
|
public class StreamrayModel extends AbstractModel {
|
||||||
|
@ -117,7 +121,7 @@ public class StreamrayModel extends AbstractModel {
|
||||||
|
|
||||||
private JSONObject loadModelInfo() throws IOException {
|
private JSONObject loadModelInfo() throws IOException {
|
||||||
lastInfoRequest = Instant.now();
|
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)
|
Request req = new Request.Builder().url(url)
|
||||||
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
|
.header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent)
|
||||||
.header(ACCEPT, MIMETYPE_APPLICATION_JSON)
|
.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
|
@Override
|
||||||
public RecordingProcess createDownload() {
|
public RecordingProcess createDownload() {
|
||||||
return new FfmpegHlsDownload(getSite().getHttpClient());
|
return new FfmpegHlsDownload(getSite().getHttpClient());
|
||||||
|
@ -140,12 +162,70 @@ public class StreamrayModel extends AbstractModel {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean follow() throws IOException {
|
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
|
@Override
|
||||||
public boolean unfollow() throws IOException {
|
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
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue