VodHlsService.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. # @Author : Rocky
  2. # @File : VodHlsService.py
  3. # @Time : 2023/2/1 15:57
  4. import random
  5. from Ansjer.config import LOGGER
  6. from django.db import connection
  7. from django.db.models import Value, CharField, Count
  8. from Model.models import VodHls01, VodHls02, VodHls03, VodHls04, VodHls05, VodHls06, VodHls07, VodHls08, VodHls09, \
  9. VodHls10, VodHls11, VodHls12, VodHls13, VodHls14, VodHls15, VodHls16, VodHls17, VodHls18, VodHls19, VodHls20, \
  10. VodHls21, VodHls22, VodHls23, VodHls24, VodHls25, VodHls26, VodHls27, VodHls28, VodHls29, VodHls30, VodHls31, \
  11. VodHls32, VodHls33, VodHls34, VodHls35, VodHls36, VodHls37, VodHls38, VodHls39, VodHls40, VodHlsTag
  12. Vod_Hls_List = [VodHls01, VodHls02, VodHls03, VodHls04, VodHls05, VodHls06, VodHls07, VodHls08, VodHls09, VodHls10,
  13. VodHls11, VodHls12, VodHls13, VodHls14, VodHls15, VodHls16, VodHls17, VodHls18, VodHls19, VodHls20,
  14. VodHls21, VodHls22, VodHls23, VodHls24, VodHls25, VodHls26, VodHls27, VodHls28, VodHls29, VodHls30,
  15. VodHls31, VodHls32, VodHls33, VodHls34, VodHls35, VodHls36, VodHls37, VodHls38, VodHls39, VodHls40]
  16. class SplitVodHlsObject:
  17. # VodHls分表功能类
  18. @classmethod
  19. def creat_vod_hls_data(cls, **kwargs):
  20. """
  21. 分表保存云存信息数据
  22. """
  23. vod_hls_model = random.choice(Vod_Hls_List)
  24. tal_num = Vod_Hls_List.index(vod_hls_model) + 1
  25. vod_hls_obj = vod_hls_model.objects.create(**kwargs)
  26. return vod_hls_obj, tal_num
  27. def del_vod_hls_data(self, **kwargs):
  28. """
  29. 分表删除云存信息数据
  30. """
  31. if 'id__in' in kwargs:
  32. for vod_id in kwargs['id__in']:
  33. tal_index = int(vod_id[:2]) - 11
  34. temp_id = vod_id[2:]
  35. Vod_Hls_List[tal_index].objects.filter(id=temp_id).delete()
  36. else:
  37. for model in Vod_Hls_List:
  38. model.objects.filter(**kwargs).delete()
  39. def get_vod_hls_data(self, **kwargs):
  40. """
  41. 分表获取云存信息数据
  42. @return: vod_hls
  43. """
  44. if kwargs['type_list']:
  45. vod_hls_union = VodHls01.objects.none().annotate(tab_val=Value('11', output_field=CharField()))
  46. kwargs = self.vod_query_param(**kwargs)
  47. if 'id__in' in kwargs:
  48. for item in kwargs['id__in']:
  49. tab_val = str(item['tab_val'] + 10)
  50. vod_hls_union = vod_hls_union.union(
  51. Vod_Hls_List[item['tab_val'] - 1].objects.filter(id=item['vod_id']).annotate(
  52. tab_val=Value(tab_val, output_field=CharField())), all=True)
  53. else:
  54. kwargs.pop('type_list')
  55. vod_hls_01 = VodHls01.objects.filter(**kwargs).annotate(tab_val=Value('11', output_field=CharField()))
  56. vod_hls_02 = VodHls02.objects.filter(**kwargs).annotate(tab_val=Value('12', output_field=CharField()))
  57. vod_hls_03 = VodHls03.objects.filter(**kwargs).annotate(tab_val=Value('13', output_field=CharField()))
  58. vod_hls_04 = VodHls04.objects.filter(**kwargs).annotate(tab_val=Value('14', output_field=CharField()))
  59. vod_hls_05 = VodHls05.objects.filter(**kwargs).annotate(tab_val=Value('15', output_field=CharField()))
  60. vod_hls_06 = VodHls06.objects.filter(**kwargs).annotate(tab_val=Value('16', output_field=CharField()))
  61. vod_hls_07 = VodHls07.objects.filter(**kwargs).annotate(tab_val=Value('17', output_field=CharField()))
  62. vod_hls_08 = VodHls08.objects.filter(**kwargs).annotate(tab_val=Value('18', output_field=CharField()))
  63. vod_hls_09 = VodHls09.objects.filter(**kwargs).annotate(tab_val=Value('19', output_field=CharField()))
  64. vod_hls_10 = VodHls10.objects.filter(**kwargs).annotate(tab_val=Value('20', output_field=CharField()))
  65. vod_hls_11 = VodHls11.objects.filter(**kwargs).annotate(tab_val=Value('21', output_field=CharField()))
  66. vod_hls_12 = VodHls12.objects.filter(**kwargs).annotate(tab_val=Value('22', output_field=CharField()))
  67. vod_hls_13 = VodHls13.objects.filter(**kwargs).annotate(tab_val=Value('23', output_field=CharField()))
  68. vod_hls_14 = VodHls14.objects.filter(**kwargs).annotate(tab_val=Value('24', output_field=CharField()))
  69. vod_hls_15 = VodHls15.objects.filter(**kwargs).annotate(tab_val=Value('25', output_field=CharField()))
  70. vod_hls_16 = VodHls16.objects.filter(**kwargs).annotate(tab_val=Value('26', output_field=CharField()))
  71. vod_hls_17 = VodHls17.objects.filter(**kwargs).annotate(tab_val=Value('27', output_field=CharField()))
  72. vod_hls_18 = VodHls18.objects.filter(**kwargs).annotate(tab_val=Value('28', output_field=CharField()))
  73. vod_hls_19 = VodHls19.objects.filter(**kwargs).annotate(tab_val=Value('29', output_field=CharField()))
  74. vod_hls_20 = VodHls20.objects.filter(**kwargs).annotate(tab_val=Value('30', output_field=CharField()))
  75. vod_hls_21 = VodHls21.objects.filter(**kwargs).annotate(tab_val=Value('31', output_field=CharField()))
  76. vod_hls_22 = VodHls22.objects.filter(**kwargs).annotate(tab_val=Value('32', output_field=CharField()))
  77. vod_hls_23 = VodHls23.objects.filter(**kwargs).annotate(tab_val=Value('33', output_field=CharField()))
  78. vod_hls_24 = VodHls24.objects.filter(**kwargs).annotate(tab_val=Value('34', output_field=CharField()))
  79. vod_hls_25 = VodHls25.objects.filter(**kwargs).annotate(tab_val=Value('35', output_field=CharField()))
  80. vod_hls_26 = VodHls26.objects.filter(**kwargs).annotate(tab_val=Value('36', output_field=CharField()))
  81. vod_hls_27 = VodHls27.objects.filter(**kwargs).annotate(tab_val=Value('37', output_field=CharField()))
  82. vod_hls_28 = VodHls28.objects.filter(**kwargs).annotate(tab_val=Value('38', output_field=CharField()))
  83. vod_hls_29 = VodHls29.objects.filter(**kwargs).annotate(tab_val=Value('39', output_field=CharField()))
  84. vod_hls_30 = VodHls30.objects.filter(**kwargs).annotate(tab_val=Value('40', output_field=CharField()))
  85. vod_hls_31 = VodHls31.objects.filter(**kwargs).annotate(tab_val=Value('41', output_field=CharField()))
  86. vod_hls_32 = VodHls32.objects.filter(**kwargs).annotate(tab_val=Value('42', output_field=CharField()))
  87. vod_hls_33 = VodHls33.objects.filter(**kwargs).annotate(tab_val=Value('43', output_field=CharField()))
  88. vod_hls_34 = VodHls34.objects.filter(**kwargs).annotate(tab_val=Value('44', output_field=CharField()))
  89. vod_hls_35 = VodHls35.objects.filter(**kwargs).annotate(tab_val=Value('45', output_field=CharField()))
  90. vod_hls_36 = VodHls36.objects.filter(**kwargs).annotate(tab_val=Value('46', output_field=CharField()))
  91. vod_hls_37 = VodHls37.objects.filter(**kwargs).annotate(tab_val=Value('47', output_field=CharField()))
  92. vod_hls_38 = VodHls38.objects.filter(**kwargs).annotate(tab_val=Value('48', output_field=CharField()))
  93. vod_hls_39 = VodHls39.objects.filter(**kwargs).annotate(tab_val=Value('49', output_field=CharField()))
  94. vod_hls_40 = VodHls40.objects.filter(**kwargs).annotate(tab_val=Value('50', output_field=CharField()))
  95. vod_hls_union = vod_hls_01.union(vod_hls_02, vod_hls_03, vod_hls_04, vod_hls_05, vod_hls_06, vod_hls_07,
  96. vod_hls_08, vod_hls_09, vod_hls_10, vod_hls_11, vod_hls_12, vod_hls_13,
  97. vod_hls_14, vod_hls_15, vod_hls_16, vod_hls_17, vod_hls_18, vod_hls_19,
  98. vod_hls_20, vod_hls_21, vod_hls_22, vod_hls_23, vod_hls_24, vod_hls_25,
  99. vod_hls_26, vod_hls_27, vod_hls_28, vod_hls_29, vod_hls_30, vod_hls_31,
  100. vod_hls_32, vod_hls_33, vod_hls_34, vod_hls_35, vod_hls_36, vod_hls_37,
  101. vod_hls_38, vod_hls_39, vod_hls_40, all=True)
  102. LOGGER.info('vod_hls_union结果:{},kwargs:{}'.format(vod_hls_union.values(), kwargs))
  103. return vod_hls_union
  104. def get_vod_hls_date(self, **kwargs):
  105. """
  106. 分表获取云存日期信息数据
  107. @return: vod_hls
  108. """
  109. vod_hls_union = VodHls01.objects.none()
  110. for vod_hls_model in Vod_Hls_List:
  111. vod_hls_union = vod_hls_union.union(vod_hls_model.objects.extra(
  112. select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values('date', 'start_time').filter(
  113. **kwargs).annotate(
  114. count=Count('start_time')).order_by('-date'))
  115. result = {}
  116. for item in vod_hls_union:
  117. if item['date'] not in result:
  118. result[item['date']] = item['count']
  119. else:
  120. result[item['date']] += item['count']
  121. res = []
  122. for key, value in result.items():
  123. res.append({'date': key, 'count': value})
  124. return res
  125. @classmethod
  126. def cloud_vod_hls_tag(cls, vod_id, num, uid, start_time, sec):
  127. """
  128. 云存回调信息关联标签
  129. @param vod_id: 云存回放信息id
  130. @param num: 云存所在表编号
  131. @param uid: 设备UID
  132. @param start_time: 云存开始时间
  133. @param sec: 云存片段秒数
  134. @return: True | False
  135. """
  136. try:
  137. start_time = int(start_time)
  138. end_time = start_time + sec
  139. vod_tag_qs = VodHlsTag.objects.filter(ai_event_time__range=(start_time, end_time), uid=uid)
  140. if not vod_tag_qs.exists():
  141. return False
  142. vod_tag_qs.update(vod_hls_id=vod_id, tab_num=num)
  143. return True
  144. except Exception as e:
  145. print(
  146. 'cloud_vod_hls_tag异常详情,uid:{},errLine:{},errMsg:{}'.format(uid, e.__traceback__.tb_lineno, repr(e)))
  147. return False
  148. @classmethod
  149. def vod_query_param(cls, **kwargs):
  150. types = kwargs.get('type_list')
  151. vod_ids = cls.query_tag_by_types(kwargs.get('uid'),
  152. kwargs.get('start_time__range'),
  153. kwargs.get('type_list'))
  154. if vod_ids:
  155. kwargs['id__in'] = vod_ids
  156. kwargs.pop('type_list')
  157. return kwargs
  158. @classmethod
  159. def query_tag_by_types(cls, uid, time, types):
  160. """
  161. 根据类型查询云存标签关联ID
  162. @return:
  163. """
  164. try:
  165. if not types or len(types) == 0:
  166. return []
  167. cursor = connection.cursor()
  168. param_list = [int(time[0]), int(time[1]), uid]
  169. sql = 'SELECT vod_hls_id, tab_num FROM '
  170. sql += 'vod_hls_tag vht INNER JOIN vod_hls_tag_type vhtt ON vht.id = vhtt.tag_id '
  171. sql += 'WHERE vht.ai_event_time >= %s AND vht.ai_event_time <= %s '
  172. sql += 'AND vht.uid = %s '
  173. if types:
  174. sql += 'AND vhtt.type IN %s '
  175. param_list.append(types)
  176. cursor.execute(sql, param_list)
  177. data_list = cursor.fetchall()
  178. cursor.close() # 执行完,关闭
  179. connection.close()
  180. data_list = [{'vod_id': val[0], 'tab_val': val[1]} for val in data_list]
  181. return data_list
  182. except Exception as e:
  183. print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  184. return False
  185. @classmethod
  186. def query_tag_type_list(cls, vod_ids):
  187. """
  188. 根据云存ID获取AI类型
  189. @return:
  190. """
  191. try:
  192. qs = VodHlsTag.objects.none()
  193. for vod_id in vod_ids:
  194. tab_val = int(vod_id[:2]) - 10
  195. temp_id = vod_id[2:]
  196. qs = qs.union(VodHlsTag.objects.filter(vod_hls_id=temp_id, tab_num=tab_val).values('id', 'vod_hls_id'))
  197. if not qs:
  198. return []
  199. return list(qs)
  200. except Exception as e:
  201. print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  202. return []