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