import json import requests import dynaconf import dateutil.parser from datetime import datetime, timedelta from intelab_python_sdk.logger import log class PlaybackUrlException(Exception): def __init__(self, response): if not isinstance(response, dict): response = response.get_json() if 'message' in response: self.msg = response.get('message') else: self.msg = response.get('msg') self.code = response.get('code') def __str__(self): return self.msg def to_dict(self): return { 'msg': self.msg, 'code': self.code } class IntelabApiHelper: def __init__(self): config = dynaconf.settings.get('COMMON') self.host = config.get('HOST') @staticmethod def iso_format(t): return '{}+08:00'.format(t.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3]) def get_cameras_playback_urls(self, camera_code, start_time, end_time, protocol='rtmp'): streamform = 'ps' if protocol == 'rtmp' else 'rtp' params = { 'beginTime': start_time, 'endTime': end_time, 'protocol': protocol, 'streamform': streamform } uri = '/python/api/v1/secure/camera/playback/urls/{}'.format(camera_code) expired_time = datetime.now() + timedelta(minutes=5) response = requests.get(self.host + uri, params=params, timeout=30) response.raise_for_status() res_json = response.json() if res_json.get('code', '0') != '0': raise PlaybackUrlException(res_json) data = res_json.get('data') pre_events = data.get('list') or [] events = [] # TODO 单个事件时长较长,需要分切处理 for pre_event in pre_events: # 合并时间间隔较短的事件 if pre_event.get('online', 1) == '0': raise PlaybackUrlException({'message': 'offline', 'code': 404}) start_time = dateutil.parser.parse(pre_event['beginTime']) end_time = dateutil.parser.parse(pre_event['endTime']) if len(events) > 0 \ and start_time - events[-1]['end_time'] <= timedelta(seconds=2) \ and events[-1]['end_time'] - events[-1]['start_time'] <= timedelta(hours=0.5): events[-1]['end_time'] = end_time else: events.append({ 'start_time': start_time, 'end_time': end_time, 'expired_time': expired_time, 'stream_url': { 'url': data.get('url'), 'extra_args': 'playBackMode=1', 'protocol': protocol } }) return events def get_camera_online(self, camera_code): """ 查询摄像头在线状态 :return : online - 1 在线,0 离线 collectTime: 收集时间 """ uri = '/python/api/v1/secure/camera/status/by/{}'.format(camera_code) response = requests.get(self.host + uri, timeout=30) response.raise_for_status() res_json = response.json().get('data') or {} return res_json if __name__ == '__main__': api_helper = IntelabApiHelper() try: print(api_helper.get_cameras_playback_urls('F97310278', '2021-05-25T09:14:35.000+08:00', '2021-05-26T10:15:41.000+08:00')) except Exception as e: print(e) print(api_helper.get_cameras_playback_urls('D86639983', '2021-05-01T10:14:35.000+08:00', '2021-05-01T10:20:41.000+08:00'))