hkvideo_job.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from datetime import datetime
  4. from sqlalchemy.orm import Session
  5. from sqlalchemy import text
  6. from utils import *
  7. from utils.video_util import unitIndexCode_get_video_region_info
  8. from utils.redis_util import *
  9. from models import *
  10. from exceptions import *
  11. from database import get_local_db
  12. from extensions import logger
  13. import traceback
  14. import time
  15. from utils import hk_video_api
  16. def proc():
  17. lock_key = "hkvideo_job_proc"
  18. if redis_lock(lock_key):
  19. logger.info(datetime.now())
  20. with get_local_db() as db:
  21. try:
  22. refresh_hkvideo(db)
  23. refresh_hkvideo_region_list(db)
  24. refresh_hkvideo_list(db)
  25. except Exception as e:
  26. traceback.print_exc()
  27. redis_unlock(lock_key)
  28. def refresh_hkvideo(db: Session):
  29. rows = db.query(VideoJob).order_by(VideoJob.update_time.asc()).limit(200).all()
  30. for row in rows:
  31. video_code = row.video_code
  32. status = 9
  33. time.sleep(0.01)
  34. try:
  35. data = hk_video_api.indexCode(video_code)
  36. # print(video_code, data)
  37. if data is not None:
  38. status = data['status']
  39. except Exception as e:
  40. traceback.print_exc()
  41. row.status = status
  42. row.update_time = datetime.now()
  43. db.commit()
  44. update_assis_video_table(video_code, status, db)
  45. def update_assis_video_table(video_code: str, status: int, db: Session) -> None:
  46. pass
  47. # def refresh_hkvideo_list(db: Session):
  48. # api = hk_video_api.HikvisionAPI()
  49. # data = api.get_cameras()
  50. # if isinstance(data,dict):
  51. # if data['code']=='0':
  52. # total = data['data']['total']
  53. # pageSize= 1000
  54. # totalPages = (total + pageSize - 1) // pageSize
  55. # infos = []
  56. # for i in range(totalPages):
  57. # data = api.get_cameras(i+1,pageSize)
  58. # if data['code'] == '0':
  59. # list = data['data']['list']
  60. # for i in list:
  61. # infos.append(TPVideoInfo(cameraIndexCode = i['cameraIndexCode'],
  62. # gbIndexCode = i['gbIndexCode'],
  63. # name = i['name'],
  64. # longitude = i['longitude'],
  65. # latitude = i['latitude'],
  66. # altitude = i['altitude'],
  67. # pixel = i['pixel'],
  68. # cameraType = i['cameraType'],
  69. # cameraTypeName = i['cameraTypeName'],
  70. # installPlace = i['installPlace'],
  71. # updateTime = i['updateTime'],
  72. # createTime = i['createTime'],
  73. # status =i['status'],
  74. # statusName = i['statusName']))
  75. # db.execute(text(f"TRUNCATE TABLE tp_video_info;"))
  76. # db.add_all(infos)
  77. # db.commit()
  78. def refresh_hkvideo_list(db: Session):
  79. api = hk_video_api.HikvisionAPI()
  80. data = api.get_cameras()
  81. if isinstance(data, dict):
  82. if data['code'] == '0':
  83. total = data['data']['total']
  84. page_size = 1000
  85. total_pages = (total + page_size - 1) // page_size
  86. infos = []
  87. for page in range(total_pages):
  88. # print(f'视频条数{total_pages},正在获取视频信息第{page}页')
  89. data = api.get_cameras(page + 1, page_size)
  90. if data['code'] == '0':
  91. camera_list = data['data']['list']
  92. for camera_info in camera_list:
  93. longitude= camera_info['longitude']
  94. latitude = camera_info['latitude']
  95. if longitude=='':
  96. longitude = 0.0
  97. if latitude=='':
  98. latitude = 0.0
  99. regionPath = ''
  100. region = unitIndexCode_get_video_region_info(db,camera_info['unitIndexCode'])
  101. if region is not None:
  102. regionPath = region.regionPath
  103. info = TPVideoInfo(
  104. cameraIndexCode=camera_info['cameraIndexCode'],
  105. gbIndexCode=camera_info['gbIndexCode'],
  106. name=camera_info['name'],
  107. longitude=longitude,
  108. latitude=latitude,
  109. altitude=camera_info['altitude'],
  110. pixel=camera_info['pixel'],
  111. cameraType=camera_info['cameraType'],
  112. unitIndexCode = camera_info['unitIndexCode'],
  113. regionPath = regionPath,
  114. cameraTypeName=camera_info['cameraTypeName'],
  115. installPlace=camera_info['installPlace'],
  116. updateTime=camera_info['updateTime'],
  117. createTime=camera_info['createTime'],
  118. status=camera_info['status'],
  119. statusName=camera_info['statusName']
  120. )
  121. infos.append(info)
  122. else:
  123. print(f"Failed to fetch cameras on page {page + 1}")
  124. return
  125. try:
  126. # 清空表
  127. db.execute(text("TRUNCATE TABLE tp_video_info;"))
  128. # 插入新数据
  129. db.add_all(infos)
  130. db.commit()
  131. except Exception as e:
  132. db.rollback() # 回滚事务
  133. print(f"Error occurred during database operations: {e}")
  134. else:
  135. print("Failed to fetch initial camera data")
  136. else:
  137. print("API response is not in the expected format")
  138. def refresh_hkvideo_region_list(db: Session):
  139. api = hk_video_api.HikvisionAPI()
  140. data = api.get_regions()
  141. if isinstance(data, dict):
  142. if data['code'] == '0':
  143. total = data['data']['total']
  144. page_size = 1000
  145. total_pages = (total + page_size - 1) // page_size
  146. infos = []
  147. for page in range(total_pages):
  148. # print(f'视频条数{total_pages},正在获取视频信息第{page}页')
  149. data = api.get_regions(page + 1, page_size)
  150. if data['code'] == '0':
  151. region_list = data['data']['list']
  152. for cregion_info in region_list:
  153. if cregion_info['leaf']:
  154. leaf='1'
  155. else:
  156. leaf='0'
  157. if cregion_info['available']:
  158. available ='1'
  159. else:
  160. available = '0'
  161. info = TPVideoRegion(
  162. indexCode = cregion_info['indexCode'],
  163. regionPath = cregion_info['regionPath'],
  164. name = cregion_info['name'],
  165. parentIndexCode = cregion_info['parentIndexCode'],
  166. treeCode = cregion_info['treeCode'],
  167. externalIndexCode = cregion_info['externalIndexCode'],
  168. sort = cregion_info['sort'],
  169. updateTime = cregion_info['updateTime'],
  170. createTime = cregion_info['createTime'],
  171. status = cregion_info['status'],
  172. available=available,
  173. leaf=leaf
  174. )
  175. infos.append(info)
  176. else:
  177. print(f"Failed to fetch cameras on page {page + 1}")
  178. return
  179. try:
  180. # 清空表
  181. db.execute(text("TRUNCATE TABLE tp_video_region;"))
  182. # 插入新数据
  183. db.add_all(infos)
  184. db.commit()
  185. except Exception as e:
  186. db.rollback() # 回滚事务
  187. print(f"Error occurred during database operations: {e}")
  188. else:
  189. print("Failed to fetch initial camera data")
  190. else:
  191. print("API response is not in the expected format")