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 config() { // 查询全部启用 NVR 及其 ivs_camera 子节点,并返回不含账号密码的公开配置。 return ResponseEntity.ok(deviceTreeService.loadConfig()); } /** * 根据页面提交的 cameraCode 和时间范围创建 HLS 回放会话。 * * @param request 页面侧回放请求,不包含后端固定保存的 NVR 密码 * @return 新建的 HLS 回放会话信息 */ @PostMapping("/sessions") public ResponseEntity 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 control( @PathVariable("sessionId") String sessionId, @RequestBody HikNvrPlaybackHlsControlRequest request) { // UI 控制强制同时校验 sessionId 与 cameraCode,防止旧页面状态控制到其他摄像机。 return ResponseEntity.ok( playbackHlsService.controlByCameraCode(sessionId, request)); } }