From 20a3cb9e73d16bd08d99780b91ca0e8d8722a0f9 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期五, 10 十二月 2021 11:28:25 +0800
Subject: [PATCH] 启用失败的流转发如果开启无人观看自动移除则不保存在数据库

---
 src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java |  190 +++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 164 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
index aabf35f..63596b2 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -3,25 +3,28 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
+import com.genersoft.iot.vmp.common.StreamInfo;
+import com.genersoft.iot.vmp.conf.UserSetup;
 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
+import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
+import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+import com.genersoft.iot.vmp.media.zlm.dto.OriginType;
 import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
 import com.genersoft.iot.vmp.service.IMediaServerService;
 import com.genersoft.iot.vmp.service.IStreamPushService;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
+import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
 import com.genersoft.iot.vmp.storager.dao.StreamPushMapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Service
 public class StreamPushServiceImpl implements IStreamPushService {
@@ -33,10 +36,16 @@
     private StreamPushMapper streamPushMapper;
 
     @Autowired
+    private PlatformGbStreamMapper platformGbStreamMapper;
+
+    @Autowired
     private ZLMRESTfulUtils zlmresTfulUtils;
 
     @Autowired
     private IRedisCatchStorage redisCatchStorage;
+
+    @Autowired
+    private UserSetup userSetup;
 
     @Autowired
     private IMediaServerService mediaServerService;
@@ -51,32 +60,40 @@
         for (MediaItem item : mediaItems) {
 
             // 涓嶄繚瀛樺浗鏍囨帹鐞嗕互鍙婃媺娴佷唬鐞嗙殑娴�
-            if (item.getOriginType() == 3 || item.getOriginType() == 4 || item.getOriginType() == 5) {
-                continue;
+            if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal()
+                    || item.getOriginType() == OriginType.RTMP_PUSH.ordinal()
+                    || item.getOriginType() == OriginType.RTC_PUSH.ordinal() ) {
+                String key = item.getApp() + "_" + item.getStream();
+                StreamPushItem streamPushItem = result.get(key);
+                if (streamPushItem == null) {
+                    streamPushItem = transform(item);
+                    result.put(key, streamPushItem);
+                }
             }
-            String key = item.getApp() + "_" + item.getStream();
-            StreamPushItem streamPushItem = result.get(key);
-            if (streamPushItem == null) {
-                streamPushItem = new StreamPushItem();
-                streamPushItem.setApp(item.getApp());
-                streamPushItem.setMediaServerId(mediaServerItem.getId());
-                streamPushItem.setStream(item.getStream());
-                streamPushItem.setAliveSecond(item.getAliveSecond());
-                streamPushItem.setCreateStamp(item.getCreateStamp());
-                streamPushItem.setOriginSock(item.getOriginSock());
-                streamPushItem.setTotalReaderCount(item.getTotalReaderCount());
-                streamPushItem.setOriginType(item.getOriginType());
-                streamPushItem.setOriginTypeStr(item.getOriginTypeStr());
-                streamPushItem.setOriginUrl(item.getOriginUrl());
-                streamPushItem.setCreateStamp(item.getCreateStamp());
-                streamPushItem.setAliveSecond(item.getAliveSecond());
-                streamPushItem.setStatus(true);
-                streamPushItem.setVhost(item.getVhost());
-                result.put(key, streamPushItem);
-            }
+
         }
 
         return new ArrayList<>(result.values());
+    }
+    @Override
+    public StreamPushItem transform(MediaItem item) {
+        StreamPushItem streamPushItem = new StreamPushItem();
+        streamPushItem.setApp(item.getApp());
+        streamPushItem.setMediaServerId(item.getMediaServerId());
+        streamPushItem.setStream(item.getStream());
+        streamPushItem.setAliveSecond(item.getAliveSecond());
+        streamPushItem.setCreateStamp(item.getCreateStamp());
+        streamPushItem.setOriginSock(item.getOriginSock());
+        streamPushItem.setTotalReaderCount(item.getTotalReaderCount());
+        streamPushItem.setOriginType(item.getOriginType());
+        streamPushItem.setOriginTypeStr(item.getOriginTypeStr());
+        streamPushItem.setOriginUrl(item.getOriginUrl());
+        streamPushItem.setCreateStamp(item.getCreateStamp());
+        streamPushItem.setAliveSecond(item.getAliveSecond());
+        streamPushItem.setStatus(true);
+        streamPushItem.setStreamType("push");
+        streamPushItem.setVhost(item.getVhost());
+        return streamPushItem;
     }
 
     @Override
@@ -84,6 +101,11 @@
         PageHelper.startPage(page, count);
         List<StreamPushItem> all = streamPushMapper.selectAll();
         return new PageInfo<>(all);
+    }
+
+    @Override
+    public List<StreamPushItem> getPushList(String mediaServerId) {
+        return streamPushMapper.selectAllByMediaServerId(mediaServerId);
     }
 
     @Override
@@ -104,4 +126,120 @@
         }
         return del > 0;
     }
+
+
+    @Override
+    public StreamPushItem getPush(String app, String streamId) {
+
+        return streamPushMapper.selectOne(app, streamId);
+    }
+
+    @Override
+    public boolean stop(String app, String streamId) {
+        StreamPushItem streamPushItem = streamPushMapper.selectOne(app, streamId);
+        int delStream = streamPushMapper.del(app, streamId);
+        gbStreamMapper.del(app, streamId);
+        platformGbStreamMapper.delByAppAndStream(app, streamId);
+        if (delStream > 0) {
+            MediaServerItem mediaServerItem = mediaServerService.getOne(streamPushItem.getMediaServerId());
+            zlmresTfulUtils.closeStreams(mediaServerItem,app, streamId);
+        }
+        return true;
+    }
+
+    @Override
+    public void zlmServerOnline(String mediaServerId) {
+        // 鍚屾zlm鎺ㄦ祦淇℃伅
+        MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
+        if (mediaServerItem == null) {
+            return;
+        }
+        // 鏁版嵁搴撹褰�
+        List<StreamPushItem> pushList = getPushList(mediaServerId);
+        Map<String, StreamPushItem> pushItemMap = new HashMap<>();
+        // redis璁板綍
+        List<StreamInfo> streamInfoPushList = redisCatchStorage.getStreams(mediaServerId, "PUSH");
+        Map<String, StreamInfo> streamInfoPushItemMap = new HashMap<>();
+        if (pushList.size() > 0) {
+            for (StreamPushItem streamPushItem : pushList) {
+                pushItemMap.put(streamPushItem.getApp() + streamPushItem.getStream(), streamPushItem);
+            }
+        }
+        if (streamInfoPushList.size() > 0) {
+            for (StreamInfo streamInfo : streamInfoPushList) {
+                streamInfoPushItemMap.put(streamInfo.getApp() + streamInfo.getStreamId(), streamInfo);
+            }
+        }
+        zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{
+            if (mediaList == null) return;
+            String dataStr = mediaList.getString("data");
+
+            Integer code = mediaList.getInteger("code");
+            List<StreamPushItem> streamPushItems = null;
+            if (code == 0 ) {
+                if (dataStr != null) {
+                    streamPushItems = handleJSON(dataStr, mediaServerItem);
+                }
+            }
+
+            if (streamPushItems != null) {
+                for (StreamPushItem streamPushItem : streamPushItems) {
+                    pushItemMap.remove(streamPushItem.getApp() + streamPushItem.getStream());
+                    streamInfoPushItemMap.remove(streamPushItem.getApp() + streamPushItem.getStream());
+                }
+            }
+            Collection<StreamPushItem> offlinePushItems = pushItemMap.values();
+            if (offlinePushItems.size() > 0) {
+                String type = "PUSH";
+                streamPushMapper.delAll(new ArrayList<>(offlinePushItems));
+            }
+            Collection<StreamInfo> offlineStreamInfoItems = streamInfoPushItemMap.values();
+            if (offlineStreamInfoItems.size() > 0) {
+                String type = "PUSH";
+                for (StreamInfo offlineStreamInfoItem : offlineStreamInfoItems) {
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("serverId", userSetup.getServerId());
+                    jsonObject.put("app", offlineStreamInfoItem.getApp());
+                    jsonObject.put("stream", offlineStreamInfoItem.getStreamId());
+                    jsonObject.put("register", false);
+                    jsonObject.put("mediaServerId", mediaServerId);
+                    redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
+                    // 绉婚櫎redis鍐呮祦鐨勪俊鎭�
+                    redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlineStreamInfoItem.getApp(), offlineStreamInfoItem.getStreamId());
+                }
+            }
+        }));
+    }
+
+    @Override
+    public void zlmServerOffline(String mediaServerId) {
+        List<StreamPushItem> streamPushItems = streamPushMapper.selectAllByMediaServerId(mediaServerId);
+        // 绉婚櫎娌℃湁GBId鐨勬帹娴�
+        streamPushMapper.deleteWithoutGBId(mediaServerId);
+        gbStreamMapper.deleteWithoutGBId("push", mediaServerId);
+        // 鍏朵粬鐨勬祦璁剧疆鏈惎鐢�
+        gbStreamMapper.updateStatusByMediaServerId(mediaServerId, false);
+        // 鍙戦�佹祦鍋滄娑堟伅
+        String type = "PUSH";
+        // 鍙戦�乺edis娑堟伅
+        List<StreamInfo> streamInfoList = redisCatchStorage.getStreams(mediaServerId, type);
+        if (streamInfoList.size() > 0) {
+            for (StreamInfo streamInfo : streamInfoList) {
+                // 绉婚櫎redis鍐呮祦鐨勪俊鎭�
+                redisCatchStorage.removeStream(mediaServerId, type, streamInfo.getApp(), streamInfo.getStreamId());
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("serverId", userSetup.getServerId());
+                jsonObject.put("app", streamInfo.getApp());
+                jsonObject.put("stream", streamInfo.getStreamId());
+                jsonObject.put("register", false);
+                jsonObject.put("mediaServerId", mediaServerId);
+                redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
+            }
+        }
+    }
+
+    @Override
+    public void clean() {
+
+    }
 }

--
Gitblit v1.8.0