|
|
package com.inspect.nvr.hik.controller;
|
|
|
|
|
|
import com.inspect.nvr.hik.domain.HikNvrCameraTarget;
|
|
|
import com.inspect.nvr.hik.domain.HikNvrPlaybackErrorResponse;
|
|
|
import com.inspect.nvr.hik.domain.HikNvrPlaybackHlsControlRequest;
|
|
|
import com.inspect.nvr.hik.domain.HikNvrPlaybackHlsSession;
|
|
|
import com.inspect.nvr.hik.domain.HikNvrPlaybackRequest;
|
|
|
import com.inspect.nvr.hik.domain.HikNvrPlaybackUiConfig;
|
|
|
import com.inspect.nvr.hik.domain.HikNvrPlaybackUiSessionRequest;
|
|
|
import com.inspect.nvr.hik.service.HikNvrCameraTargetService;
|
|
|
import com.inspect.nvr.hik.service.HikNvrDeviceTreeService;
|
|
|
import com.inspect.nvr.hik.service.HikNvrPlaybackHlsService;
|
|
|
import com.inspect.nvr.hik.service.HikNvrPlaybackRequestFactory;
|
|
|
import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.web.bind.annotation.CrossOrigin;
|
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
|
import org.springframework.web.bind.annotation.PathVariable;
|
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
|
@RestController
|
|
|
@CrossOrigin
|
|
|
@RequestMapping("/hik/nvr/playback/hls/ui")
|
|
|
public class HikNvrPlaybackUiController {
|
|
|
|
|
|
/** 浏览器 HLS 回放会话服务。 */
|
|
|
@Resource
|
|
|
private HikNvrPlaybackHlsService playbackHlsService;
|
|
|
/** 从 NVR 表和 ivs_camera 查询并转换浏览器设备树。 */
|
|
|
@Resource
|
|
|
private HikNvrDeviceTreeService deviceTreeService;
|
|
|
/** 根据 cameraCode 查询摄像机并解析所属 NVR、通道和服务端凭据。 */
|
|
|
@Resource
|
|
|
private HikNvrCameraTargetService cameraTargetService;
|
|
|
/** 使用数据库 NVR 参数组装内部回放请求。 */
|
|
|
@Resource
|
|
|
private HikNvrPlaybackRequestFactory playbackRequestFactory;
|
|
|
|
|
|
/**
|
|
|
* 从 NVR 表和 ivs_camera 返回浏览器所需的多 NVR 设备树与默认选择。
|
|
|
*
|
|
|
* @return 不包含 NVR 密码的控制台配置
|
|
|
*/
|
|
|
@GetMapping("/config")
|
|
|
public ResponseEntity<HikNvrPlaybackUiConfig> config() {
|
|
|
// 查询全部启用 NVR 及其 ivs_camera 子节点,并返回不含账号密码的公开配置。
|
|
|
return ResponseEntity.ok(deviceTreeService.loadConfig());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 根据页面提交的 cameraCode 和时间范围创建 HLS 回放会话。
|
|
|
*
|
|
|
* @param request 页面侧回放请求,不包含后端固定保存的 NVR 密码
|
|
|
* @return 新建的 HLS 回放会话信息
|
|
|
*/
|
|
|
@PostMapping("/sessions")
|
|
|
public ResponseEntity<HikNvrPlaybackHlsSession> create(
|
|
|
@RequestBody HikNvrPlaybackUiSessionRequest request) {
|
|
|
// 只接受设备树返回的完整 cameraCode,并从数据库解析真实 NVR 与通道。
|
|
|
HikNvrCameraTarget cameraTarget = cameraTargetService.resolve(
|
|
|
request == null ? null : request.getCameraCode());
|
|
|
// 使用 cameraCode 解析结果和已校验页面条件组装内部 SDK 请求。
|
|
|
HikNvrPlaybackRequest playbackRequest =
|
|
|
playbackRequestFactory.create(request, cameraTarget);
|
|
|
// 使用已绑定 cameraCode、通道和 NVR 凭据的请求创建回放会话。
|
|
|
return ResponseEntity.ok(playbackHlsService.create(playbackRequest));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 使用 cameraCode 校验并控制页面创建的 HLS 回放会话。
|
|
|
*
|
|
|
* @param sessionId 页面当前持有的回放会话标识
|
|
|
* @param request cameraCode、暂停/恢复等控制动作及附加参数
|
|
|
* @return 控制后的会话状态
|
|
|
*/
|
|
|
@PostMapping("/sessions/{sessionId}/controls")
|
|
|
public ResponseEntity<HikNvrPlaybackHlsSession> control(
|
|
|
@PathVariable("sessionId") String sessionId,
|
|
|
@RequestBody HikNvrPlaybackHlsControlRequest request) {
|
|
|
// UI 控制强制同时校验 sessionId 与 cameraCode,防止旧页面状态控制到其他摄像机。
|
|
|
return ResponseEntity.ok(
|
|
|
playbackHlsService.controlByCameraCode(sessionId, request));
|
|
|
}
|
|
|
}
|