From 239831daa8c25b9fcedea5a330440a8355f97d22 Mon Sep 17 00:00:00 2001 From: Jafea7 Date: Tue, 22 Apr 2025 21:17:02 +1000 Subject: [PATCH] Fix SC spy show auth token --- .../sites/stripchat/StripchatModel.java | 151 +++--------------- 1 file changed, 19 insertions(+), 132 deletions(-) diff --git a/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java b/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java index bb60516d..450c3aec 100644 --- a/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java +++ b/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java @@ -48,10 +48,12 @@ public class StripchatModel extends AbstractModel { @Override public boolean isOnline(boolean ignoreCache) throws IOException, ExecutionException, InterruptedException { - JSONObject info; - if (ignoreCache && (info = getModelInfo()).has("user")) { - JSONObject cam; + JSONObject info = getModelInfo(); + if (ignoreCache && info.has("user")) { JSONObject user = info.getJSONObject("user").getJSONObject("user"); + if (info.has("cam")) { + JSONObject cam = info.getJSONObject("cam"); + } String status = user.optString("status"); mapOnlineState(status); if (onlineState == OFFLINE) { @@ -59,10 +61,10 @@ public class StripchatModel extends AbstractModel { } if (isBanned(user)) { log.debug("Model inactive or deleted: {}", getName()); - // Config.getInstance().setModelNotes(this, "Model inactive or deleted"); + // Config.getInstance().setModelNotes(this, "Model inactive or deleted"); <- from v5.0.24 setMarkedForLaterRecording(true); } - if (onlineState == PRIVATE && info.has("cam") && StringUtil.isNotBlank((cam = info.getJSONObject("cam")).optString(KEY_MODEL_TOKEN))) { + if (onlineState == PRIVATE && StringUtil.isNotBlank((cam.optString(KEY_MODEL_TOKEN))) { setOnlineState(ONLINE); return true; } @@ -70,37 +72,6 @@ public class StripchatModel extends AbstractModel { return onlineState == ONLINE; } - // @Override - // public boolean isOnline(boolean ignoreCache) throws IOException, ExecutionException, InterruptedException { - // JSONObject jsonResponse = getModelInfo(); - // if (ignoreCache) { - // if (jsonResponse.has("user")) { - // JSONObject user = jsonResponse.getJSONObject("user").getJSONObject("user"); - // String status = user.optString("status"); - // mapOnlineState(status); - // if (onlineState == OFFLINE) { - // setLastSeen(user.optString("statusChangedAt")); - // } - // if (isBanned(user)) { - // log.debug("Model inactive or deleted: {}", getName()); - // setMarkedForLaterRecording(true); - // } - // if ((onlineState == PRIVATE) && jsonResponse.has("cam")) { - // JSONObject cam = jsonResponse.getJSONObject("cam"); - // if (StringUtil.isNotBlank(cam.optString(KEY_MODEL_TOKEN))) { - // setOnlineState(ONLINE); - // return true; - // } - // } - // } - // if (jsonResponse.optString("error").equals("Not Found")) { - // setMarkedForLaterRecording(true); - // setOnlineState(OFFLINE); - // } - // } - // return onlineState == ONLINE; - // } - private boolean isBanned(JSONObject user) { boolean isDeleted = user.optBoolean("isDeleted", false); boolean isApprovedModel = user.optBoolean("isApprovedModel", true); @@ -119,45 +90,17 @@ public class StripchatModel extends AbstractModel { private void mapOnlineState(String status) { switch (status) { - case "public": { - setOnlineState(Model.State.ONLINE); - break; - } - case "idle": { - setOnlineState(Model.State.AWAY); - break; - } - case "private": - case "p2p": - case "groupShow": - case "virtualPrivate": { - setOnlineState(Model.State.PRIVATE); - break; - } - case "off": { - setOnlineState(Model.State.OFFLINE); - break; - } - default: { + case "public" -> setOnlineState(ONLINE); + case "idle" -> setOnlineState(AWAY); + case "private", "p2p", "groupShow", "virtualPrivate" -> setOnlineState(PRIVATE); + case "off" -> setOnlineState(OFFLINE); + default -> { log.debug("Unknown online state {} for model {}", status, getName()); - setOnlineState(Model.State.OFFLINE); + setOnlineState(OFFLINE); } } } - // private void mapOnlineState(String status) { - // switch (status) { - // case "public" -> setOnlineState(ONLINE); - // case "idle" -> setOnlineState(AWAY); - // case "private", "p2p", "groupShow", "virtualPrivate" -> setOnlineState(PRIVATE); - // case "off" -> setOnlineState(OFFLINE); - // default -> { - // log.debug("Unknown online state {} for model {}", status, getName()); - // setOnlineState(OFFLINE); - // } - // } - // } - private JSONObject getModelInfo() throws IOException { if (Objects.nonNull(modelInfo) && Duration.between(lastInfoRequest, Instant.now()).getSeconds() < 5) { return modelInfo; @@ -190,28 +133,7 @@ public class StripchatModel extends AbstractModel { } } - // private JSONObject loadModelInfo() throws IOException { - // String url = getSite().getBaseUrl() + "/api/front/v2/models/username/" + getName() + "/cam?timezoneOffset=0&triggerRequest=loadCam&uniq=" + getUniq(); - // Request req = new Request.Builder() - // .url(url) - // .header(ACCEPT, MIMETYPE_APPLICATION_JSON) - // .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage()) - // .header(X_REQUESTED_WITH, XML_HTTP_REQUEST) - // .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) - // .header(REFERER, getUrl()) - // .header(ORIGIN, getSite().getBaseUrl()) - // .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()); - // } - // } - // } - - private void checkIfRenamed(String responseText) { + private void checkIfRenamed(String responseText) { try { String newName; JSONObject data; @@ -223,7 +145,7 @@ public class StripchatModel extends AbstractModel { if (modelGroup.isPresent()) { modelGroup.get().add(newUrl); } - // Config.getInstance().setModelNotes(this, "Old username: " + oldName); + // Config.getInstance().setModelNotes(this, "Old username: " + oldName); <- From v5.0.24 setName(newName); setUrl(newUrl); log.warn("Model {} renamed to {}", (Object)oldName, (Object)newName); @@ -236,12 +158,7 @@ public class StripchatModel extends AbstractModel { @Override public List getStreamSources() throws IOException, ExecutionException, ParseException, PlaylistException { - log.debug("getStreamSources: modelInfo = \n{}", modelInfo.toString(2)); // Added - String url = getMasterPlaylistUrl(); - - log.debug("getStreamSources: url = {}", url); // Added - MasterPlaylist masterPlaylist = getMasterPlaylist(url); List streamSources = extractStreamSources(masterPlaylist); try { @@ -272,6 +189,7 @@ public class StripchatModel extends AbstractModel { src.setHeight(playlist.getStreamInfo().getResolution().height); src.setWidth(playlist.getStreamInfo().getResolution().width); src.setMediaPlaylistUrl(playlist.getUri()); + // v5.3.2 commented out - truncating auth token // if (src.getMediaPlaylistUrl().contains("?")) { // src.setMediaPlaylistUrl(src.getMediaPlaylistUrl().substring(0, src.getMediaPlaylistUrl().lastIndexOf('?'))); // } @@ -290,44 +208,18 @@ public class StripchatModel extends AbstractModel { try (Response response = getSite().getHttpClient().execute(req)) { if (response.isSuccessful()) { String body = response.body().string(); - log.debug(body); InputStream inputStream = new ByteArrayInputStream(body.getBytes(UTF_8)); PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8, ParsingMode.LENIENT); Playlist playlist = parser.parse(); MasterPlaylist master = playlist.getMasterPlaylist(); return master; - } // else { + } throw new HttpException(response.code(), response.message()); - // } } } - // private String getMasterPlaylistUrl() throws IOException { - // JSONObject info = getModelInfo(); - // if (info.has("user")) { - // JSONObject cam; - // JSONObject user = info.getJSONObject("user").getJSONObject("user"); - // long modelId = user.optLong("id"); - - // boolean saveVR = Config.getInstance().getSettings().stripchatVR; - // boolean isVRStream = user.optBoolean("isVr", false); - // String vrSuffix = (saveVR && isVRStream) ? "_vr" : ""; - - // Object token = ""; - // if (info.has("cam") && StringUtil.isNotBlank((cam = info.getJSONObject("cam")).optString(KEY_MODEL_TOKEN))) { - // log.debug("Cam token: {}", token); // Added - // token = "&aclAuth=" + cam.getString(KEY_MODEL_TOKEN); - // log.debug("Spy start for {}", getName()); - // } - // String hlsUrlTemplate = "https://edge-hls.doppiocdn.com/hls/{0}/master/{0}_auto.m3u8?playlistType=Standart{1}"; - // return MessageFormat.format(hlsUrlTemplate, String.valueOf(modelId), token); - // } - // throw new IOException("Playlist URL not found"); - // } - private String getMasterPlaylistUrl() throws IOException { JSONObject info = getModelInfo(); - log.debug("getMasterPlaylistUrl: modelInfo = \n{}", info.toString(2)); // Added if (info.has("user")) { JSONObject user = info.getJSONObject("user").getJSONObject("user"); long id = user.optLong("id"); @@ -340,15 +232,10 @@ public class StripchatModel extends AbstractModel { if (info.has("cam")) { JSONObject cam = info.getJSONObject("cam"); token = cam.optString(KEY_MODEL_TOKEN); - log.debug("getMasterPlaylistUrl: Cam token: {}", token); // Added if (StringUtil.isNotBlank(token)) { token = "&aclAuth=" + token; log.debug("Spy start for {}", getName()); - } - // if (StringUtil.isNotBlank(cam.optString(KEY_MODEL_TOKEN))) { - // token = "&aclAuth=" + cam.getString(KEY_MODEL_TOKEN); - // log.debug("Spy start for {}", getName()); - // } + } } String hlsUrlTemplate = "https://edge-hls.doppiocdn.com/hls/{0}{1}/master/{0}{1}_auto.m3u8?playlistType=Standart{2}"; return MessageFormat.format(hlsUrlTemplate, String.valueOf(id), vrSuffix, token); @@ -436,7 +323,7 @@ public class StripchatModel extends AbstractModel { long id = user.optLong("id"); long userId = client.getUserId(); JSONArray favoriteIds = new JSONArray().put(id); - // favoriteIds.put(id); + // favoriteIds.put(id); <- v5.3.2 duplication of above String url = Stripchat.getBaseUri() + "/api/front/users/" + client.getUserId() + "/favorites"; JSONObject eventData = StripchatUtil.getEventData()