|  |  |  | 
|---|
|  |  |  | import com.alibaba.excel.read.metadata.ReadSheet; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.common.StreamInfo; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.UserSetting; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.security.SecurityUtils; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.security.dto.LoginUser; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.gb28181.bean.GbStream; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.service.IMediaServerService; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.service.IMediaService; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.service.IStreamPushService; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.service.impl.StreamPushUploadFileHandler; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.vmanager.bean.BatchGBStreamParam; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.vmanager.bean.*; | 
|---|
|  |  |  | import com.github.pagehelper.PageInfo; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import io.swagger.v3.oas.annotations.Operation; | 
|---|
|  |  |  | import io.swagger.v3.oas.annotations.Parameter; | 
|---|
|  |  |  | import io.swagger.v3.oas.annotations.tags.Tag; | 
|---|
|  |  |  | import org.apache.poi.sl.usermodel.Sheet; | 
|---|
|  |  |  | import org.slf4j.Logger; | 
|---|
|  |  |  | import org.slf4j.LoggerFactory; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.http.HttpStatus; | 
|---|
|  |  |  | import org.springframework.http.ResponseEntity; | 
|---|
|  |  |  | import org.springframework.stereotype.Controller; | 
|---|
|  |  |  | import org.springframework.util.StringUtils; | 
|---|
|  |  |  | import org.springframework.util.ObjectUtils; | 
|---|
|  |  |  | import org.springframework.web.bind.annotation.*; | 
|---|
|  |  |  | import org.springframework.web.context.request.async.DeferredResult; | 
|---|
|  |  |  | import org.springframework.web.multipart.MultipartFile; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.servlet.http.HttpServletRequest; | 
|---|
|  |  |  | import java.io.IOException; | 
|---|
|  |  |  | import java.io.InputStream; | 
|---|
|  |  |  | import java.util.HashMap; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Tag(name  = "推流信息管理") | 
|---|
|  |  |  | @Controller | 
|---|
|  |  |  | @CrossOrigin | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @RequestMapping(value = "/api/push") | 
|---|
|  |  |  | public class StreamPushController { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | @RequestParam(required = false)Boolean pushing, | 
|---|
|  |  |  | @RequestParam(required = false)String mediaServerId ){ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (StringUtils.isEmpty(query)) { | 
|---|
|  |  |  | if (ObjectUtils.isEmpty(query)) { | 
|---|
|  |  |  | query = null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (StringUtils.isEmpty(mediaServerId)) { | 
|---|
|  |  |  | if (ObjectUtils.isEmpty(mediaServerId)) { | 
|---|
|  |  |  | mediaServerId = null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | PageInfo<StreamPushItem> pushList = streamPushService.getPushList(page, count, query, pushing, mediaServerId); | 
|---|
|  |  |  | 
|---|
|  |  |  | @PostMapping(value = "/save_to_gb") | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @Operation(summary = "将推流添加到国标") | 
|---|
|  |  |  | public Object saveToGB(@RequestBody GbStream stream){ | 
|---|
|  |  |  | if (streamPushService.saveToGB(stream)){ | 
|---|
|  |  |  | return "success"; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | return "fail"; | 
|---|
|  |  |  | public void saveToGB(@RequestBody GbStream stream){ | 
|---|
|  |  |  | if (!streamPushService.saveToGB(stream)){ | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR100); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | @DeleteMapping(value = "/remove_form_gb") | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @Operation(summary = "将推流移出到国标") | 
|---|
|  |  |  | public Object removeFormGB(@RequestBody GbStream stream){ | 
|---|
|  |  |  | if (streamPushService.removeFromGB(stream)){ | 
|---|
|  |  |  | return "success"; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | return "fail"; | 
|---|
|  |  |  | public void removeFormGB(@RequestBody GbStream stream){ | 
|---|
|  |  |  | if (!streamPushService.removeFromGB(stream)){ | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR100); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | @Operation(summary = "中止一个推流") | 
|---|
|  |  |  | @Parameter(name = "app", description = "应用名", required = true) | 
|---|
|  |  |  | @Parameter(name = "stream", description = "流id", required = true) | 
|---|
|  |  |  | public Object stop(String app, String streamId){ | 
|---|
|  |  |  | if (streamPushService.stop(app, streamId)){ | 
|---|
|  |  |  | return "success"; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | return "fail"; | 
|---|
|  |  |  | public void stop(String app, String streamId){ | 
|---|
|  |  |  | if (!streamPushService.stop(app, streamId)){ | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR100); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @DeleteMapping(value = "/batchStop") | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @Operation(summary = "中止多个推流") | 
|---|
|  |  |  | public Object batchStop(@RequestBody BatchGBStreamParam batchGBStreamParam){ | 
|---|
|  |  |  | public void batchStop(@RequestBody BatchGBStreamParam batchGBStreamParam){ | 
|---|
|  |  |  | if (batchGBStreamParam.getGbStreams().size() == 0) { | 
|---|
|  |  |  | return "fail"; | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR100); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (streamPushService.batchStop(batchGBStreamParam.getGbStreams())){ | 
|---|
|  |  |  | return "success"; | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | return "fail"; | 
|---|
|  |  |  | if (!streamPushService.batchStop(batchGBStreamParam.getGbStreams())){ | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR100); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | String name = file.getName(); | 
|---|
|  |  |  | inputStream = file.getInputStream(); | 
|---|
|  |  |  | } catch (IOException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | logger.error("未处理的异常 ", e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | //传入参数 | 
|---|
|  |  |  | 
|---|
|  |  |  | @Parameter(name = "app", description = "应用名", required = true) | 
|---|
|  |  |  | @Parameter(name = "stream", description = "流id", required = true) | 
|---|
|  |  |  | @Parameter(name = "mediaServerId", description = "媒体服务器id") | 
|---|
|  |  |  | public WVPResult<StreamInfo> getPlayUrl(@RequestParam String app,@RequestParam String stream, | 
|---|
|  |  |  | @RequestParam(required = false) String mediaServerId){ | 
|---|
|  |  |  | public StreamContent getPlayUrl(@RequestParam String app, @RequestParam String stream, | 
|---|
|  |  |  | @RequestParam(required = false) String mediaServerId){ | 
|---|
|  |  |  | boolean authority = false; | 
|---|
|  |  |  | // 是否登陆用户, 登陆用户返回完整信息 | 
|---|
|  |  |  | LoginUser userInfo = SecurityUtils.getUserInfo(); | 
|---|
|  |  |  | if (userInfo!= null) { | 
|---|
|  |  |  | authority = true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | WVPResult<StreamInfo> result = new WVPResult<>(); | 
|---|
|  |  |  | StreamPushItem push = streamPushService.getPush(app, stream); | 
|---|
|  |  |  | if (push != null && !push.isSelf()) { | 
|---|
|  |  |  | result.setCode(-1); | 
|---|
|  |  |  | result.setMsg("来自其他平台的推流信息"); | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR100.getCode(), "来自其他平台的推流信息"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority); | 
|---|
|  |  |  | if (streamInfo != null){ | 
|---|
|  |  |  | result.setCode(0); | 
|---|
|  |  |  | result.setMsg("success"); | 
|---|
|  |  |  | result.setData(streamInfo); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | result.setCode(-1); | 
|---|
|  |  |  | result.setMsg("获取播放地址失败"); | 
|---|
|  |  |  | if (streamInfo == null){ | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR100.getCode(), "获取播放地址失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | return new StreamContent(streamInfo); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取推流播放地址 | 
|---|
|  |  |  | * 添加推流信息 | 
|---|
|  |  |  | * @param stream 推流信息 | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @PostMapping(value = "/add") | 
|---|
|  |  |  | @ResponseBody | 
|---|
|  |  |  | @Operation(summary = "停止视频回放") | 
|---|
|  |  |  | public WVPResult<StreamInfo> add(@RequestBody StreamPushItem stream){ | 
|---|
|  |  |  | if (StringUtils.isEmpty(stream.getGbId())) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return new WVPResult<>(400, "国标ID不可为空", null); | 
|---|
|  |  |  | @Operation(summary = "添加推流信息") | 
|---|
|  |  |  | public void add(@RequestBody StreamPushItem stream){ | 
|---|
|  |  |  | if (ObjectUtils.isEmpty(stream.getGbId())) { | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR400.getCode(), "国标ID不可为空"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (StringUtils.isEmpty(stream.getApp()) && StringUtils.isEmpty(stream.getStream())) { | 
|---|
|  |  |  | return new WVPResult<>(400, "app或stream不可为空", null); | 
|---|
|  |  |  | if (ObjectUtils.isEmpty(stream.getApp()) && ObjectUtils.isEmpty(stream.getStream())) { | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR400.getCode(), "app或stream不可为空"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | stream.setStatus(false); | 
|---|
|  |  |  | stream.setPushIng(false); | 
|---|
|  |  |  | stream.setAliveSecond(0L); | 
|---|
|  |  |  | stream.setTotalReaderCount("0"); | 
|---|
|  |  |  | boolean result = streamPushService.add(stream); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (result) { | 
|---|
|  |  |  | return new WVPResult<>(0, "success", null); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | return new WVPResult<>(-1, "fail", null); | 
|---|
|  |  |  | if (!streamPushService.add(stream)) { | 
|---|
|  |  |  | throw new ControllerException(ErrorCode.ERROR100); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|