完成final接口适配
This commit is contained in:
@@ -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 停止服务器')
|
||||
|
||||
Reference in New Issue
Block a user