|
|
@@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
+import java.net.URLDecoder;
|
|
|
import java.net.URLEncoder;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
@@ -36,29 +37,6 @@ public class VideoMultiServiceImpl implements VideoMultiService {
|
|
|
|
|
|
@Override
|
|
|
public String setVideoMultiTitleCoverPagePath(Long videoId, String pageUrl, String title, String coverUrl) {
|
|
|
- // 解析已有的growthExtData,判断是否已包含对应字段
|
|
|
- if (pageUrl.contains("growthExtData")) {
|
|
|
- try {
|
|
|
- String decoded = java.net.URLDecoder.decode(pageUrl, "UTF-8");
|
|
|
- int idx = decoded.indexOf("growthExtData=");
|
|
|
- if (idx >= 0) {
|
|
|
- String jsonStr = decoded.substring(idx + "growthExtData=".length());
|
|
|
- // 截取到下一个&或结尾,避免后续参数干扰JSON解析
|
|
|
- int ampIdx = jsonStr.indexOf("&");
|
|
|
- if (ampIdx >= 0) {
|
|
|
- jsonStr = jsonStr.substring(0, ampIdx);
|
|
|
- }
|
|
|
- JSONObject existingData = JSONObject.parseObject(jsonStr);
|
|
|
- if (existingData != null
|
|
|
- && existingData.containsKey("growthTitleId")
|
|
|
- && existingData.containsKey("growthCoverId")) {
|
|
|
- return pageUrl;
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("VideoMultiService parse existing growthExtData error", e);
|
|
|
- }
|
|
|
- }
|
|
|
List<VideoGrowthMultiTitle> multiTitleList = getMultiTitleByVideoId(videoId);
|
|
|
List<VideoGrowthMultiCover> multiCoverList = getMultiCoverByVideoId(videoId);
|
|
|
PageUrlExtData extData = new PageUrlExtData();
|
|
|
@@ -143,7 +121,7 @@ public class VideoMultiServiceImpl implements VideoMultiService {
|
|
|
}
|
|
|
if (Objects.nonNull(extData.getGrowthTitleId()) || Objects.nonNull(extData.getGrowthCoverId())) {
|
|
|
try {
|
|
|
- pageUrl += URLEncoder.encode("&growthExtData=" + JSONObject.toJSONString(extData), "UTF-8");
|
|
|
+ pageUrl = mergeOrAppendGrowthExtData(pageUrl, extData);
|
|
|
} catch (Exception e) {
|
|
|
log.error("VideoMultiService VideoMultiService Error,data:", e);
|
|
|
}
|
|
|
@@ -151,6 +129,65 @@ public class VideoMultiServiceImpl implements VideoMultiService {
|
|
|
return pageUrl;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 将 extData 中的字段合并到 pageUrl 的 growthExtData 中:
|
|
|
+ * - pageUrl 不含 growthExtData:在末尾拼接 URL 编码后的 &growthExtData={...}
|
|
|
+ * - pageUrl 已含 growthExtData:解析出已有 JSON 对象,将新字段合并进去后再替换回原位置
|
|
|
+ */
|
|
|
+ private String mergeOrAppendGrowthExtData(String pageUrl, PageUrlExtData extData) throws Exception {
|
|
|
+ int valueStart = -1;
|
|
|
+ int valueEnd = -1;
|
|
|
+ int gIdx = pageUrl.indexOf("growthExtData");
|
|
|
+ if (gIdx >= 0) {
|
|
|
+ int afterKey = gIdx + "growthExtData".length();
|
|
|
+ if (pageUrl.length() > afterKey && pageUrl.charAt(afterKey) == '=') {
|
|
|
+ valueStart = afterKey + 1;
|
|
|
+ } else if (pageUrl.length() >= afterKey + 3
|
|
|
+ && pageUrl.substring(afterKey, afterKey + 3).equalsIgnoreCase("%3D")) {
|
|
|
+ valueStart = afterKey + 3;
|
|
|
+ }
|
|
|
+ if (valueStart > 0) {
|
|
|
+ valueEnd = pageUrl.length();
|
|
|
+ int ampIdx = pageUrl.indexOf("&", valueStart);
|
|
|
+ if (ampIdx >= 0 && ampIdx < valueEnd) {
|
|
|
+ valueEnd = ampIdx;
|
|
|
+ }
|
|
|
+ int encAmpIdx = pageUrl.indexOf("%26", valueStart);
|
|
|
+ if (encAmpIdx >= 0 && encAmpIdx < valueEnd) {
|
|
|
+ valueEnd = encAmpIdx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (valueStart > 0) {
|
|
|
+ // 已存在 growthExtData:解析出对象,将新字段合并进去
|
|
|
+ String encodedJson = pageUrl.substring(valueStart, valueEnd);
|
|
|
+ JSONObject existing = null;
|
|
|
+ try {
|
|
|
+ String jsonStr = URLDecoder.decode(encodedJson, "UTF-8");
|
|
|
+ existing = JSONObject.parseObject(jsonStr);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("VideoMultiService parse existing growthExtData error", e);
|
|
|
+ }
|
|
|
+ if (existing == null) {
|
|
|
+ existing = new JSONObject();
|
|
|
+ }
|
|
|
+ if (Objects.nonNull(extData.getGrowthTitleId())) {
|
|
|
+ existing.put("growthTitleId", extData.getGrowthTitleId());
|
|
|
+ existing.put("growthTitleSource", extData.getGrowthTitleSource());
|
|
|
+ }
|
|
|
+ if (Objects.nonNull(extData.getGrowthCoverId())) {
|
|
|
+ existing.put("growthCoverId", extData.getGrowthCoverId());
|
|
|
+ existing.put("growthCoverSource", extData.getGrowthCoverSource());
|
|
|
+ }
|
|
|
+ String newEncodedJson = URLEncoder.encode(JSONObject.toJSONString(existing), "UTF-8");
|
|
|
+ return pageUrl.substring(0, valueStart) + newEncodedJson + pageUrl.substring(valueEnd);
|
|
|
+ }
|
|
|
+
|
|
|
+ // pageUrl 中不存在 growthExtData:直接在末尾拼接
|
|
|
+ return pageUrl + URLEncoder.encode("&growthExtData=" + JSONObject.toJSONString(extData), "UTF-8");
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Long saveMultiTitle(Long videoId, String source, String title) {
|
|
|
VideoGrowthMultiTitle multiTitle = new VideoGrowthMultiTitle();
|