完成获取视频url接口

This commit is contained in:
zqc
2026-01-23 09:38:43 +08:00
parent 52de35e755
commit c73713fcf6

View File

@@ -5,6 +5,19 @@
from typing import List from typing import List
from fastapi import APIRouter, HTTPException, status from fastapi import APIRouter, HTTPException, status
from pydantic import BaseModel from pydantic import BaseModel
import requests
import urllib3
from hikvision_openapi_signer import HikvisionOpenAPISigner
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 初始化签名器
signer = HikvisionOpenAPISigner(
"https://29.2.19.19:443",
"28031410",
"Y79rv6LqBahxoEH6adLv",
headers={'tagId': '0'} # 根据平台要求设置
)
# 创建路由器 # 创建路由器
router = APIRouter( router = APIRouter(
@@ -28,6 +41,40 @@ class VideoUrlResponse(BaseModel):
videoUrl: List[str] videoUrl: List[str]
def get_video_preview_url(video_id: str):
"""
获取单个视频的预览地址
参数:
video_id: 视频ID
返回:
视频预览地址字符串
"""
try:
# 签名一个请求
request = signer.sign(
'POST',
'/api/video/v1/cameras/previewURLs',
jsons={'cameraIndexCode': video_id, 'protocol': 'hls', 'expand': 'transcode=1'},
accept='application/json'
)
method, url, headers, body = request
# 发送请求
response = requests.request(method, url, headers=headers, data=body, verify=False)
result = response.json()
# 提取url
if 'data' in result and 'url' in result['data']:
return result['data']['url']
else:
raise ValueError(f"未找到视频地址: {result}")
except Exception as e:
raise ValueError(f"获取视频地址失败: {str(e)}")
@router.post( @router.post(
"/", "/",
response_model=VideoUrlResponse, response_model=VideoUrlResponse,
@@ -45,18 +92,21 @@ async def get_video_urls(request: VideoUrlRequest):
- **videoUrl**: 视频地址数组 (字符串数组) - **videoUrl**: 视频地址数组 (字符串数组)
""" """
try: try:
# TODO: 后续实现根据videoId查询视频地址的逻辑
# 目前先返回模拟数据
video_urls = [] video_urls = []
# 批量获取视频地址
for video_id in request.videoId: for video_id in request.videoId:
# 模拟根据videoId生成视频地址 try:
video_url = f"http://example.com/videos/{video_id}.mp4" video_url = get_video_preview_url(video_id)
video_urls.append(video_url) video_urls.append(video_url)
except Exception as e:
# 单个视频获取失败时记录错误,但继续处理其他视频
video_urls.append(f"net_error_url")
return VideoUrlResponse(videoUrl=video_urls) return VideoUrlResponse(videoUrl=video_urls)
except Exception as e: except Exception as e:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"获取视频地址失败: {str(e)}" detail=f"批量获取视频地址失败: {str(e)}"
) )