hkvideo_job.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. if '84021e2f6eba4e6b8ccc7d750fb833fa' in regionPath:
  104. continue
  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. # if '84021e2f6eba4e6b8ccc7d750fb833fa' in cregion_info['regionPath']:
  164. # continue
  165. info = TPVideoRegion(
  166. indexCode = cregion_info['indexCode'],
  167. regionPath = cregion_info['regionPath'],
  168. name = cregion_info['name'],
  169. parentIndexCode = cregion_info['parentIndexCode'],
  170. treeCode = cregion_info['treeCode'],
  171. externalIndexCode = cregion_info['externalIndexCode'],
  172. sort = cregion_info['sort'],
  173. updateTime = cregion_info['updateTime'],
  174. createTime = cregion_info['createTime'],
  175. status = cregion_info['status'],
  176. available=available,
  177. leaf=leaf
  178. )
  179. infos.append(info)
  180. else:
  181. print(f"Failed to fetch cameras on page {page + 1}")
  182. return
  183. try:
  184. # 清空表
  185. db.execute(text("TRUNCATE TABLE tp_video_region;"))
  186. # 插入新数据
  187. db.add_all(infos)
  188. db.commit()
  189. except Exception as e:
  190. db.rollback() # 回滚事务
  191. print(f"Error occurred during database operations: {e}")
  192. else:
  193. print("Failed to fetch initial camera data")
  194. else:
  195. print("API response is not in the expected format")