完成final接口适配

This commit is contained in:
zqc
2026-04-02 12:30:58 +08:00
parent bfbe69eeb5
commit 68d6849120

View File

@@ -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/<id> - 获取指定节点的子节点')
print(' GET /api/node/<id> - 获取节点详情')
print(' GET /api/children/<id> - 获取指定节点的子节点(自动判断组织/摄像头)')
print(' GET /api/stream/<id> - 获取视频流地址')
print('静态文件服务: 访问 / 或 /index.html')
print('按 Ctrl+C 停止服务器')