From 2b0af3be14d3f8ac28a1cb031e21dc3a69146d2b Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 25 三月 2024 17:59:09 +0800
Subject: [PATCH] 支持hook
---
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 35 ++++-------------
src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java | 11 +++++
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java | 18 +++++++++
src/main/java/com/genersoft/iot/vmp/service/IMediaService.java | 7 +++
4 files changed, 44 insertions(+), 27 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java
index 5b6f0fb..dc0edec 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java
@@ -126,6 +126,9 @@
@ConfigKeyId("on_stream_disconnect")
private String onStreamDisconnect;
+ @ConfigKeyId("on_stream_not_found")
+ private String onStreamNotFound;
+
@ConfigKeyId("on_record_mp4")
private String onRecordMp4;
@@ -798,4 +801,12 @@
public void setPictureMaxCount(Integer pictureMaxCount) {
this.pictureMaxCount = pictureMaxCount;
}
+
+ public String getOnStreamNotFound() {
+ return onStreamNotFound;
+ }
+
+ public void setOnStreamNotFound(String onStreamNotFound) {
+ this.onStreamNotFound = onStreamNotFound;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index a247a78..b8f6f2f 100755
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -139,7 +139,6 @@
* 鏈嶅姟鍣ㄥ畾鏃朵笂鎶ユ椂闂达紝涓婃姤闂撮殧鍙厤缃紝榛樿10s涓婃姤涓�娆�
*/
@ResponseBody
-
@PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
public HookResult onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param) {
try {
@@ -164,25 +163,11 @@
if (logger.isDebugEnabled()) {
logger.debug("[ZLM HOOK] 鎾斁閴存潈锛歿}->{}", param.getMediaServerId(), param);
}
- String mediaServerId = param.getMediaServerId();
-
- taskExecutor.execute(() -> {
- JSONObject json = (JSONObject) JSON.toJSON(param);
- ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_play, json);
- if (subscribe != null) {
- MediaServer mediaInfo = mediaServerService.getOne(mediaServerId);
- if (mediaInfo != null) {
- subscribe.response(mediaInfo, param);
- }
- }
- });
- // TODO 姝ゅ閫昏緫閫傚悎杩佺Щ鍒癕ediaService涓�
- if (!"rtp".equals(param.getApp())) {
- Map<String, String> paramMap = urlParamToMap(param.getParams());
- StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream());
- if (streamAuthorityInfo != null && streamAuthorityInfo.getCallId() != null && !streamAuthorityInfo.getCallId().equals(paramMap.get("callId"))) {
- return new HookResult(401, "Unauthorized");
- }
+ Map<String, String> paramMap = urlParamToMap(param.getParams());
+ // 瀵逛簬鎾斁娴佽繘琛岄壌鏉�
+ boolean authenticateResult = mediaService.authenticatePlay(param.getApp(), param.getStream(), paramMap.get("callId"));
+ if (!authenticateResult) {
+ return new HookResult(401, "Unauthorized");
}
return HookResult.SUCCESS();
@@ -215,12 +200,14 @@
return result;
}
if (userSetting.getPushAuthority()) {
+ // 瀵逛簬鎺ㄦ祦杩涜閴存潈
+ Map<String, String> paramMap = urlParamToMap(param.getParams());
// 鎺ㄦ祦閴存潈
if (param.getParams() == null) {
logger.info("鎺ㄦ祦閴存潈澶辫触锛� 缂哄皯蹇呰鍙傛暟锛歴ign=md5(user琛ㄧ殑pushKey)");
return new HookResultForOnPublish(401, "Unauthorized");
}
- Map<String, String> paramMap = urlParamToMap(param.getParams());
+
String sign = paramMap.get("sign");
if (sign == null) {
logger.info("鎺ㄦ祦閴存潈澶辫触锛� 缂哄皯蹇呰鍙傛暟锛歴ign=md5(user琛ㄧ殑pushKey)");
@@ -648,12 +635,6 @@
}
return ret;
}
- // TODO 鎺ㄦ祦鍏锋湁涓诲姩鎬э紝鏆傛椂涓嶅仛澶勭悊
-// StreamPushItem streamPushItem = streamPushService.getPush(app, streamId);
-// if (streamPushItem != null) {
-// // TODO 鍙戦�佸仠姝�
-//
-// }
}
return ret;
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java b/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
index 338814c..9230b35 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
@@ -41,4 +41,11 @@
* @return
*/
StreamInfo getStreamInfoByAppAndStream(MediaServer mediaServerItem, String app, String stream, MediaInfo mediaInfo, String addr, String callId, boolean isPlay);
+
+ /**
+ * 鎾斁閴存潈
+ */
+ boolean authenticatePlay(String app, String stream, String callId);
+
+ boolean authenticatePublish(String app, String stream, String callId, String sign);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
index 07a28a3..9c54068 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -4,10 +4,14 @@
import com.genersoft.iot.vmp.conf.MediaConfig;
import com.genersoft.iot.vmp.media.bean.MediaInfo;
import com.genersoft.iot.vmp.media.service.IMediaServerService;
+import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServer;
import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
+import com.genersoft.iot.vmp.media.zlm.dto.hook.HookResultForOnPublish;
import com.genersoft.iot.vmp.service.IMediaService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
@@ -16,6 +20,8 @@
@Service
public class MediaServiceImpl implements IMediaService {
+
+ private final static Logger logger = LoggerFactory.getLogger(MediaServiceImpl.class);
@Autowired
private IRedisCatchStorage redisCatchStorage;
@@ -85,4 +91,16 @@
streamInfoResult.setMediaInfo(mediaInfo);
return streamInfoResult;
}
+
+ @Override
+ public boolean authenticatePlay(String app, String stream, String callId) {
+ if (app == null || stream == null) {
+ return false;
+ }
+ if ("rtp".equals(app)) {
+ return true;
+ }
+ StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(app, stream);
+ return (streamAuthorityInfo != null && streamAuthorityInfo.getCallId() != null && !streamAuthorityInfo.getCallId().equals(callId));
+ }
}
--
Gitblit v1.8.0