From 0aa5dadda741fdfc747ecd1c2ca9e08556fbb7e5 Mon Sep 17 00:00:00 2001 From: reusedname <155286845+reusedname@users.noreply.github.com> Date: Fri, 11 Apr 2025 18:52:48 +0500 Subject: [PATCH] SC model-dependent CDN host for master playlist --- common/pom.xml | 5 +++ .../sites/stripchat/StripchatModel.java | 35 +++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/common/pom.xml b/common/pom.xml index 7d5df002..babb4bab 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -93,6 +93,11 @@ commons-collections commons-collections 3.2.2 + + + org.apache.commons + commons-text + 1.7 diff --git a/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java b/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java index 93dd95d6..83d4f9d8 100644 --- a/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java +++ b/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java @@ -16,6 +16,8 @@ import lombok.extern.slf4j.Slf4j; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; + +import org.apache.commons.text.StringSubstitutor; import org.json.JSONArray; import org.json.JSONObject; @@ -30,6 +32,8 @@ import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.concurrent.ExecutionException; +import java.util.HashMap; +import java.util.Map; import static ctbrec.Model.State.*; import static ctbrec.io.HttpConstants.*; @@ -196,6 +200,26 @@ public class StripchatModel extends AbstractModel { } } } + + private String getHlsUrlTemplate() throws IOException { + log.trace("Loading URL template for {}", getName()); + Request req = new Request.Builder() + .url(getSite().getBaseUrl() + "/api/front/v3/config/initial?requestPath=%2F" + getName() + "&timezoneOffset=0") + .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) + .build(); + try (Response response = getSite().getHttpClient().execute(req)) { + if (response.isSuccessful()) { + JSONObject jsonResponse = new JSONObject(response.body().string()); + var common = jsonResponse.getJSONObject("initial").getJSONObject("common"); + var urlTemplate = common.getString("hlsStreamUrlTemplate"); + var host = common.getString("hlsStreamHost"); + + return urlTemplate.replace("{cdnHost}", host); + } else { + throw new HttpException(response.code(), response.message()); + } + } + } private String getMasterPlaylistUrl() throws IOException { JSONObject info = getModelInfo(); @@ -215,8 +239,15 @@ public class StripchatModel extends AbstractModel { 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); + + // the master playlist host can vary per model + String hlsUrlTemplate = getHlsUrlTemplate(); + Map params = new HashMap<>(); + params.put("streamName", String.valueOf(id) + vrSuffix); + params.put("suffix", "_auto"); + + var result = StringSubstitutor.replace(hlsUrlTemplate, params, "{", "}") + "?playlistType=Standart" + token; + return result; } else { throw new IOException("Playlist URL not found"); }