You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

88 lines
4.0 KiB

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));
}
}