VodHlsService.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. # @Author : Rocky
  2. # @File : VodHlsService.py
  3. # @Time : 2023/2/1 15:57
  4. import datetime
  5. from django.db import connection
  6. from django.db.models import Count
  7. from Model.models import VodHlsMon, VodHlsTues, VodHlsWed, VodHlsThur, VodHlsFri, VodHlsSat, VodHlsSun, VodHlsTag, \
  8. AiService, VodHlsTagType
  9. from Service.CommonService import CommonService
  10. class SplitVodHlsObject:
  11. # VodHls分表功能类
  12. @classmethod
  13. def creat_vod_hls_data(cls, **kwargs):
  14. """
  15. 分表保存云存信息数据
  16. """
  17. start_time = kwargs.get('start_time')
  18. week = datetime.datetime.fromtimestamp(int(start_time)).isoweekday()
  19. if week == 1:
  20. vod_hls_mon = VodHlsMon.objects.create(**kwargs)
  21. return vod_hls_mon, week
  22. elif week == 2:
  23. vod_hls_tues = VodHlsTues.objects.create(**kwargs)
  24. return vod_hls_tues, week
  25. elif week == 3:
  26. vod_hls_wed = VodHlsWed.objects.create(**kwargs)
  27. return vod_hls_wed, week
  28. elif week == 4:
  29. vod_hls_thur = VodHlsThur.objects.create(**kwargs)
  30. return vod_hls_thur, week
  31. elif week == 5:
  32. vod_hls_fri = VodHlsFri.objects.create(**kwargs)
  33. return vod_hls_fri, week
  34. elif week == 6:
  35. vod_hls_sat = VodHlsSat.objects.create(**kwargs)
  36. return vod_hls_sat, week
  37. elif week == 7:
  38. vod_hls_sun = VodHlsSun.objects.create(**kwargs)
  39. return vod_hls_sun, week
  40. def del_vod_hls_data(self, **kwargs):
  41. """
  42. 分表删除云存信息数据
  43. """
  44. VodHlsMon.objects.filter(**kwargs).delete()
  45. VodHlsTues.objects.filter(**kwargs).delete()
  46. VodHlsWed.objects.filter(**kwargs).delete()
  47. VodHlsThur.objects.filter(**kwargs).delete()
  48. VodHlsFri.objects.filter(**kwargs).delete()
  49. VodHlsSat.objects.filter(**kwargs).delete()
  50. VodHlsSun.objects.filter(**kwargs).delete()
  51. def get_vod_hls_data(self, **kwargs):
  52. """
  53. 分表获取云存信息数据
  54. @return: vod_hls
  55. """
  56. vod_hls = VodHlsMon.objects.filter(pk=-1)
  57. if 'start_time' in kwargs:
  58. start_time = kwargs.get('start_time')
  59. week = datetime.datetime.fromtimestamp(int(start_time)).isoweekday()
  60. if week == 1:
  61. vod_hls = VodHlsMon.objects.filter(**kwargs)
  62. elif week == 2:
  63. vod_hls = VodHlsTues.objects.filter(**kwargs)
  64. elif week == 3:
  65. vod_hls = VodHlsWed.objects.filter(**kwargs)
  66. elif week == 4:
  67. vod_hls = VodHlsThur.objects.filter(**kwargs)
  68. elif week == 5:
  69. vod_hls = VodHlsFri.objects.filter(**kwargs)
  70. elif week == 6:
  71. vod_hls = VodHlsSat.objects.filter(**kwargs)
  72. elif week == 7:
  73. vod_hls = VodHlsSun.objects.filter(**kwargs)
  74. return vod_hls
  75. if 'start_time__range' in kwargs:
  76. start_time, end_time = kwargs.get('start_time__range')
  77. vod_hls_mon = VodHlsMon.objects.filter(pk=-1)
  78. vod_hls_tus = VodHlsTues.objects.filter(pk=-1)
  79. vod_hls_wed = VodHlsWed.objects.filter(pk=-1)
  80. vod_hls_thur = VodHlsThur.objects.filter(pk=-1)
  81. vod_hls_fri = VodHlsFri.objects.filter(pk=-1)
  82. vod_hls_sat = VodHlsSat.objects.filter(pk=-1)
  83. vod_hls_sun = VodHlsSun.objects.filter(pk=-1)
  84. start_time = datetime.datetime.fromtimestamp(int(start_time))
  85. end_time = datetime.datetime.fromtimestamp(int(end_time))
  86. time_list = CommonService.cutting_time_stamp(start_time, end_time)
  87. day_list = []
  88. type_list = kwargs.get('type_list')
  89. for time_item in time_list:
  90. week = datetime.datetime.fromtimestamp(int(time_item[0])).isoweekday()
  91. if week not in day_list:
  92. day_list.append(week)
  93. for week in day_list:
  94. kwargs['type_list'] = type_list
  95. if week == 1:
  96. kwargs = self.vod_query_param(week, **kwargs)
  97. if not kwargs:
  98. return vod_hls_mon
  99. vod_hls_mon = VodHlsMon.objects.filter(**kwargs)
  100. elif week == 2:
  101. kwargs = self.vod_query_param(week, **kwargs)
  102. if not kwargs:
  103. return vod_hls_tus
  104. vod_hls_tus = VodHlsTues.objects.filter(**kwargs)
  105. elif week == 3:
  106. kwargs = self.vod_query_param(week, **kwargs)
  107. if not kwargs:
  108. return vod_hls_wed
  109. vod_hls_wed = VodHlsWed.objects.filter(**kwargs)
  110. elif week == 4:
  111. kwargs = self.vod_query_param(week, **kwargs)
  112. if not kwargs:
  113. return vod_hls_thur
  114. vod_hls_thur = VodHlsThur.objects.filter(**kwargs)
  115. elif week == 5:
  116. kwargs = self.vod_query_param(week, **kwargs)
  117. if not kwargs:
  118. return vod_hls_fri
  119. vod_hls_fri = VodHlsFri.objects.filter(**kwargs)
  120. elif week == 6:
  121. kwargs = self.vod_query_param(week, **kwargs)
  122. if not kwargs:
  123. return vod_hls_sat
  124. vod_hls_sat = VodHlsSat.objects.filter(**kwargs)
  125. elif week == 7:
  126. kwargs = self.vod_query_param(week, **kwargs)
  127. if not kwargs:
  128. return vod_hls_sun
  129. vod_hls_sun = VodHlsSun.objects.filter(**kwargs)
  130. vod_hls = vod_hls.union(vod_hls_mon, vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat,
  131. vod_hls_sun)
  132. return vod_hls
  133. vod_hls_mon = VodHlsMon.objects.filter(**kwargs)
  134. vod_hls_tus = VodHlsTues.objects.filter(**kwargs)
  135. vod_hls_wed = VodHlsWed.objects.filter(**kwargs)
  136. vod_hls_thur = VodHlsThur.objects.filter(**kwargs)
  137. vod_hls_fri = VodHlsFri.objects.filter(**kwargs)
  138. vod_hls_sat = VodHlsSat.objects.filter(**kwargs)
  139. vod_hls_sun = VodHlsSun.objects.filter(**kwargs)
  140. vod_hls = vod_hls.union(vod_hls_mon, vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat,
  141. vod_hls_sun)
  142. return vod_hls
  143. def get_vod_hls_date(self, **kwargs):
  144. """
  145. 分表获取云存日期信息数据
  146. @return: vod_hls
  147. """
  148. vod_hls_mon = VodHlsMon.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
  149. 'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
  150. vod_hls_tus = VodHlsTues.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
  151. 'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
  152. vod_hls_wed = VodHlsWed.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
  153. 'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
  154. vod_hls_thur = VodHlsThur.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
  155. 'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
  156. vod_hls_fri = VodHlsFri.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
  157. 'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
  158. vod_hls_sat = VodHlsSat.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
  159. 'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
  160. vod_hls_sun = VodHlsSun.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
  161. 'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
  162. vod_hls = vod_hls_mon.union(vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat, vod_hls_sun)
  163. return vod_hls
  164. @classmethod
  165. def cloud_vod_hls_tag(cls, vod_id, num, uid, start_time):
  166. """
  167. 云存回调信息关联标签
  168. @param vod_id: 云存回放信息id
  169. @param num: 所在表编号
  170. @param uid: 设备UID
  171. @param start_time: 云存开始时间
  172. @return: True | False
  173. """
  174. try:
  175. # 查询设备是否有使用中的ai服务
  176. # ai_service_qs = AiService.objects \
  177. # .filter(uid=uid, detect_status=1, use_status=1, endTime__gt=start_time) \
  178. # .values('detect_group')
  179. # if not ai_service_qs.exists():
  180. # return False
  181. start_time = int(start_time)
  182. end_time = start_time + 5
  183. vod_tag_qs = VodHlsTag.objects.filter(ai_event_time__range=(start_time, end_time), uid=uid)
  184. if not vod_tag_qs.exists():
  185. return False
  186. vod_tag_qs.update(vod_hls_id=vod_id, tab_num=num)
  187. return True
  188. except Exception as e:
  189. print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  190. return False
  191. @classmethod
  192. def vod_query_param(cls, week, **kwargs):
  193. types = kwargs.get('type_list')
  194. vod_ids = cls.query_tag_by_types(kwargs.get('uid'),
  195. kwargs.get('start_time__range'),
  196. kwargs.get('type_list'), week)
  197. if vod_ids:
  198. kwargs['id__in'] = vod_ids
  199. if types and not vod_ids:
  200. return []
  201. kwargs.pop('type_list')
  202. return kwargs
  203. @classmethod
  204. def query_tag_by_types(cls, uid, time, types, num):
  205. """
  206. 根据类型查询云存标签关联ID
  207. @return:
  208. """
  209. try:
  210. if not types or len(types) == 0:
  211. return []
  212. cursor = connection.cursor()
  213. param_list = [int(time[0]), int(time[1]), uid, num]
  214. sql = 'SELECT vod_hls_id FROM '
  215. sql += 'vod_hls_tag vht INNER JOIN vod_hls_tag_type vhtt ON vht.id = vhtt.tag_id '
  216. sql += 'WHERE vht.ai_event_time >= %s AND vht.ai_event_time <= %s '
  217. sql += 'AND vht.uid = %s '
  218. sql += 'AND tab_num = %s '
  219. if types:
  220. sql += 'AND vhtt.type IN %s '
  221. param_list.append(types)
  222. sql += 'GROUP BY vht.vod_hls_id '
  223. cursor.execute(sql, param_list)
  224. data_list = cursor.fetchall()
  225. cursor.close() # 执行完,关闭
  226. connection.close()
  227. data_list = [val[0] for val in data_list]
  228. return data_list
  229. except Exception as e:
  230. print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  231. return False
  232. @classmethod
  233. def query_tag_type_list(cls, start_time, vod_ids):
  234. """
  235. 根据云存ID获取AI类型
  236. @return:
  237. """
  238. try:
  239. week = datetime.datetime.fromtimestamp(int(start_time)).isoweekday()
  240. qs = VodHlsTag.objects.filter(vod_hls_id__in=vod_ids, tab_num=int(week)).values('id', 'vod_hls_id')
  241. if not qs:
  242. return []
  243. return list(qs)
  244. except Exception as e:
  245. print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  246. return []