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");
}