#!/usr/bin/env python3 # -*- coding: utf-8 -*- from datetime import datetime from sqlalchemy.orm import Session from sqlalchemy import text from utils import * from utils.video_util import unitIndexCode_get_video_region_info from utils.redis_util import * from models import * from exceptions import * from database import get_db_local from extensions import logger import traceback import time from utils import hk_video_api def proc(): lock_key = "hkvideo_job_proc" if redis_lock(lock_key): logger.info(datetime.now()) db = get_db_local() refresh_hkvideo(db) refresh_hkvideo_region_list(db) refresh_hkvideo_list(db) db.close() redis_unlock(lock_key) def refresh_hkvideo(db: Session): rows = db.query(VideoJob).order_by(VideoJob.update_time.asc()).limit(200).all() for row in rows: video_code = row.video_code status = 9 time.sleep(0.01) try: data = hk_video_api.indexCode(video_code) # print(video_code, data) if data is not None: status = data['status'] except Exception as e: traceback.print_exc() row.status = status row.update_time = datetime.now() db.commit() update_assis_video_table(video_code, status, db) def update_assis_video_table(video_code: str, status: int, db: Session) -> None: pass # def refresh_hkvideo_list(db: Session): # api = hk_video_api.HikvisionAPI() # data = api.get_cameras() # if isinstance(data,dict): # if data['code']=='0': # total = data['data']['total'] # pageSize= 1000 # totalPages = (total + pageSize - 1) // pageSize # infos = [] # for i in range(totalPages): # data = api.get_cameras(i+1,pageSize) # if data['code'] == '0': # list = data['data']['list'] # for i in list: # infos.append(TPVideoInfo(cameraIndexCode = i['cameraIndexCode'], # gbIndexCode = i['gbIndexCode'], # name = i['name'], # longitude = i['longitude'], # latitude = i['latitude'], # altitude = i['altitude'], # pixel = i['pixel'], # cameraType = i['cameraType'], # cameraTypeName = i['cameraTypeName'], # installPlace = i['installPlace'], # updateTime = i['updateTime'], # createTime = i['createTime'], # status =i['status'], # statusName = i['statusName'])) # db.execute(text(f"TRUNCATE TABLE tp_video_info;")) # db.add_all(infos) # db.commit() def refresh_hkvideo_list(db: Session): api = hk_video_api.HikvisionAPI() data = api.get_cameras() if isinstance(data, dict): if data['code'] == '0': total = data['data']['total'] page_size = 1000 total_pages = (total + page_size - 1) // page_size infos = [] for page in range(total_pages): print(f'视频条数{total_pages},正在获取视频信息第{page}页') data = api.get_cameras(page + 1, page_size) if data['code'] == '0': camera_list = data['data']['list'] for camera_info in camera_list: longitude= camera_info['longitude'] latitude = camera_info['latitude'] if longitude=='': longitude = 0.0 if latitude=='': latitude = 0.0 regionPath = '' region = unitIndexCode_get_video_region_info(db,camera_info['unitIndexCode']) if region is not None: regionPath = region.regionPath info = TPVideoInfo( cameraIndexCode=camera_info['cameraIndexCode'], gbIndexCode=camera_info['gbIndexCode'], name=camera_info['name'], longitude=longitude, latitude=latitude, altitude=camera_info['altitude'], pixel=camera_info['pixel'], cameraType=camera_info['cameraType'], unitIndexCode = camera_info['unitIndexCode'], regionPath = regionPath, cameraTypeName=camera_info['cameraTypeName'], installPlace=camera_info['installPlace'], updateTime=camera_info['updateTime'], createTime=camera_info['createTime'], status=camera_info['status'], statusName=camera_info['statusName'] ) infos.append(info) else: print(f"Failed to fetch cameras on page {page + 1}") return try: # 清空表 db.execute(text("TRUNCATE TABLE tp_video_info;")) # 插入新数据 db.add_all(infos) db.commit() except Exception as e: db.rollback() # 回滚事务 print(f"Error occurred during database operations: {e}") else: print("Failed to fetch initial camera data") else: print("API response is not in the expected format") def refresh_hkvideo_region_list(db: Session): api = hk_video_api.HikvisionAPI() data = api.get_regions() if isinstance(data, dict): if data['code'] == '0': total = data['data']['total'] page_size = 1000 total_pages = (total + page_size - 1) // page_size infos = [] for page in range(total_pages): print(f'视频条数{total_pages},正在获取视频信息第{page}页') data = api.get_regions(page + 1, page_size) if data['code'] == '0': region_list = data['data']['list'] for cregion_info in region_list: if cregion_info['leaf']: leaf='1' else: leaf='0' if cregion_info['available']: available ='1' else: available = '0' info = TPVideoRegion( indexCode = cregion_info['indexCode'], regionPath = cregion_info['regionPath'], name = cregion_info['name'], parentIndexCode = cregion_info['parentIndexCode'], treeCode = cregion_info['treeCode'], externalIndexCode = cregion_info['externalIndexCode'], sort = cregion_info['sort'], updateTime = cregion_info['updateTime'], createTime = cregion_info['createTime'], status = cregion_info['status'], available=available, leaf=leaf ) infos.append(info) else: print(f"Failed to fetch cameras on page {page + 1}") return try: # 清空表 db.execute(text("TRUNCATE TABLE tp_video_region;")) # 插入新数据 db.add_all(infos) db.commit() except Exception as e: db.rollback() # 回滚事务 print(f"Error occurred during database operations: {e}") else: print("Failed to fetch initial camera data") else: print("API response is not in the expected format")