VodHlsService.py 13 KB

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