diff --git a/live_catalog/live_catalog_backend.py b/live_catalog/live_catalog_backend.py index 8dc4bf8..0399b1e 100644 --- a/live_catalog/live_catalog_backend.py +++ b/live_catalog/live_catalog_backend.py @@ -5,13 +5,13 @@ import json from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler import sys sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from utils.hikvision_cam_utils import get_organization_list +from utils.hikvision_cam_utils import get_organization_list, get_final_list # ========== 海康威视 API 配置 ========== ROOT_PARENT_INDEX_CODE = "4fa15af07b6b400f94af1e35d8235c30" -def transform_hikvision_node(item, parent_id=None): - """将海康威视返回的节点转换为前端期望的格式""" +def transform_org_node(item, parent_id=None): + """将海康威视组织节点转换为前端期望的格式""" return { "id": item["indexCode"], "name": item["name"], @@ -20,27 +20,54 @@ def transform_hikvision_node(item, parent_id=None): "stream_url": None } +def transform_camera_node(item, parent_id=None): + """将海康威视摄像头节点转换为前端期望的格式(叶子节点)""" + return { + "id": item["cameraIndexCode"], + "name": item["name"], + "parent_id": parent_id, + "is_leaf": True, # 摄像头是叶子节点 + "stream_url": None + } + def get_children(parent_id): - """返回父节点下的直接子节点列表(从海康威视 API 获取)""" + """返回父节点下的直接子节点列表(从海康威视 API 获取) + + 逻辑: + 1. 先调用 get_organization_list 获取子组织 + 2. 如果返回 list 为空,则调用 get_final_list 获取摄像头(叶子节点) + """ if parent_id is None: parent_id = ROOT_PARENT_INDEX_CODE try: + # 先尝试获取子组织 result = get_organization_list(parent_id) if result.get("code") != "0": print(f"海康威视 API 返回错误: {result.get('msg')}") return [] items = result.get("data", {}).get("list", []) - return [transform_hikvision_node(item, parent_id) for item in items] + + # 如果有子组织,返回组织节点 + if items: + return [transform_org_node(item, parent_id) for item in items] + + # 如果没有子组织,尝试获取摄像头列表(叶子节点) + print(f"组织 {parent_id} 无下级组织,尝试获取摄像头列表...") + final_result = get_final_list(parent_id) + if final_result.get("code") != "0": + print(f"获取摄像头列表失败: {final_result.get('msg')}") + return [] + + camera_items = final_result.get("data", {}).get("list", []) + print(f"获取到 {len(camera_items)} 个摄像头") + return [transform_camera_node(item, parent_id) for item in camera_items] + except Exception as e: print(f"调用海康威视 API 失败: {e}") return [] -def get_node(node_id): - """根据 id 获取节点详情(暂不实现,后续可扩展)""" - return None - def get_stream_url(node_id): """获取叶子节点的视频流地址(暂不实现,后续可扩展)""" return None @@ -106,19 +133,6 @@ class APIHandler(SimpleHTTPRequestHandler): self.send_json_response(children) return - elif path.startswith('/api/node/'): - # GET /api/node/21020000 - node_id = path.split('/')[-1] - if not node_id: - self.send_error_json("Invalid node id", 400) - return - node = get_node(node_id) - if node is None: - self.send_error_json("Node not found", 404) - return - self.send_json_response(node) - return - elif path.startswith('/api/stream/'): # GET /api/stream/21020000 node_id = path.split('/')[-1] @@ -216,8 +230,7 @@ def run(): print(f'Server running on http://localhost:{port}') print('API endpoints:') print(' GET /api/roots - 获取所有根节点') - print(' GET /api/children/ - 获取指定节点的子节点') - print(' GET /api/node/ - 获取节点详情') + print(' GET /api/children/ - 获取指定节点的子节点(自动判断组织/摄像头)') print(' GET /api/stream/ - 获取视频流地址') print('静态文件服务: 访问 / 或 /index.html') print('按 Ctrl+C 停止服务器')