hkvideo_job.py 8.7 KB

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