CloudPhotoController.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : CronCloudPhotoController.py
  4. @Time : 2022/11/3 10:16
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import logging
  10. import time
  11. from django.db import transaction
  12. from django.views import View
  13. from Ansjer.cn_config.config_test import PUSH_CLOUD_PHOTO
  14. from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME
  15. from Model.models import DeviceCloudPhotoInfo, Device_Info, CloudPhotoBGM, DevicePicturePushInfo
  16. from Object.AWS.AmazonS3Util import AmazonS3Util
  17. from Object.ResponseObject import ResponseObject
  18. from Object.TokenObject import TokenObject
  19. from Object.utils import LocalDateTimeUtil
  20. LOGGER = logging.getLogger('info')
  21. class CronCloudPhotoView(View):
  22. def get(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.GET, request, operation)
  26. def post(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation')
  29. return self.validation(request.POST, request, operation)
  30. def validation(self, request_dict, request, operation):
  31. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  32. lang = request_dict.get('lang', token.lang)
  33. response = ResponseObject(lang)
  34. if token.code != 0:
  35. return response.json(token.code)
  36. user_id = token.userID
  37. if operation == 'save-photo':
  38. return self.save_cloud_photo(user_id, request_dict, response)
  39. elif operation == 'bgm-list':
  40. return self.get_bgm_list(response)
  41. elif operation == 'video-list':
  42. return self.query_cloud_photo_page(user_id, request_dict, response)
  43. elif operation == 'video-del':
  44. return self.del_cloud_photo(request_dict, response)
  45. else:
  46. return response.json(404)
  47. @classmethod
  48. def save_cloud_photo(cls, user_id, request_dict, response):
  49. """
  50. 保存云相册
  51. """
  52. try:
  53. with transaction.atomic():
  54. status = request_dict.get('status', None)
  55. uid = request_dict.get('uid', None)
  56. if not all([status, user_id]):
  57. return response(444)
  58. status = int(status)
  59. device_info_qs = Device_Info.objects.filter(userID_id=user_id)
  60. if uid:
  61. device_info_qs = device_info_qs.filter(UID=uid)
  62. device_info_qs = device_info_qs.values('vodPrimaryUserID', 'UID')
  63. if not device_info_qs.exists():
  64. return response.json(14)
  65. for item in device_info_qs:
  66. master_user_id = item['vodPrimaryUserID']
  67. uid = item['UID']
  68. if master_user_id == '' or master_user_id != user_id:
  69. continue
  70. now_time = int(time.time())
  71. cloud_photo_qs = DeviceCloudPhotoInfo.objects.filter(uid=uid)
  72. if not cloud_photo_qs.exists():
  73. data = {'status': status, 'user_id': user_id, 'uid': uid, 'created_time': now_time,
  74. 'updated_time': now_time}
  75. DeviceCloudPhotoInfo.objects.create(**data)
  76. continue
  77. cloud_photo_qs.update(status=status, updated_time=now_time)
  78. return response.json(0)
  79. except Exception as e:
  80. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  81. return response.json(500)
  82. @classmethod
  83. def get_bgm_list(cls, response):
  84. """
  85. 获取背景音乐列表
  86. """
  87. photo_bgm = CloudPhotoBGM.objects.filter(is_show=1).values('name', 'link').order_by('sort')
  88. if not photo_bgm.exists():
  89. return response.json(0, [])
  90. return response.json(0, list(photo_bgm))
  91. @classmethod
  92. def query_cloud_photo_page(cls, user_id, request_dict, response):
  93. """
  94. 分页查询云相册视频
  95. @param user_id: 用户id
  96. @param request_dict: 请求参数
  97. @param response: 响应对象
  98. @return: []
  99. """
  100. try:
  101. device_name = request_dict.get('deviceName', None)
  102. start_time = request_dict.get('startTime', None)
  103. end_time = request_dict.get('endTime', None)
  104. page = request_dict.get('page', None)
  105. size = request_dict.get('size', None)
  106. if not all([page, size]):
  107. return response.json(444)
  108. page = int(page)
  109. size = int(size)
  110. video_qs = DevicePicturePushInfo.objects.filter(user_id=user_id, type=1)
  111. if device_name:
  112. name_list = device_name.split(',')
  113. video_qs = video_qs.filter(device_nick_name__in=name_list)
  114. if start_time:
  115. start_time = LocalDateTimeUtil.time_stamp_to_time(int(start_time), '%Y%m')
  116. video_qs = video_qs.filter(event_time__gte=int(start_time))
  117. if end_time:
  118. end_time = LocalDateTimeUtil.time_stamp_to_time(int(end_time), '%Y%m')
  119. video_qs = video_qs.filter(event_time__lte=int(end_time))
  120. video_qs = video_qs.values('id', 'uid', 'device_nick_name', 'event_time', 'created_time').order_by(
  121. '-event_time')[(page - 1) * size:page * size]
  122. if not video_qs.exists():
  123. return response.json(0, [])
  124. s3 = AmazonS3Util(ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME)
  125. res_data = []
  126. now_month = LocalDateTimeUtil.get_cur_month_start()
  127. start_time = "{} 00:00:00".format(str(now_month))
  128. time_array = time.strptime(start_time, "%Y-%m-%d %H:%M:%S")
  129. for item in video_qs:
  130. picture_qs = DevicePicturePushInfo.objects \
  131. .filter(uid=item['uid'], event_time__gt=int(time.mktime(time_array)), type=0).order_by('event_time')
  132. event_time = picture_qs.first().event_time
  133. channel = picture_qs.first().channel
  134. data = {'id': item['id'], 'deviceNickname': item['device_nick_name'],
  135. 'createdTime': item['created_time']}
  136. picture_key = '{}/{}/{}.jpeg'.format(item['uid'], channel, event_time)
  137. picture_url = s3.generate_file_obj_url(PUSH_CLOUD_PHOTO, picture_key)
  138. data['picture'] = picture_url
  139. key = '{}/video/{}.mp4'.format(item['uid'], str(item['event_time']))
  140. obj_url = s3.generate_file_obj_url(PUSH_CLOUD_PHOTO, key)
  141. data['videoLink'] = obj_url
  142. res_data.append(data)
  143. return response.json(0, res_data)
  144. except Exception as e:
  145. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  146. return response.json(500)
  147. @classmethod
  148. def del_cloud_photo(cls, request_dict, response):
  149. """
  150. 根据id删除视频列表
  151. @param request_dict:
  152. @param response:
  153. @return:
  154. """
  155. try:
  156. ids = request_dict.get('ids', None)
  157. if not ids:
  158. return response.json(444)
  159. cloud_photo_qs = DevicePicturePushInfo.objects.filter(id__in=ids.split(','))
  160. if not cloud_photo_qs.exists():
  161. return response.json(173)
  162. s3 = AmazonS3Util(ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME)
  163. for item in cloud_photo_qs:
  164. key = '{}/video/{}.mp4'.format(item.uid, str(item.event_time))
  165. s3.delete_obj(PUSH_CLOUD_PHOTO, key)
  166. cloud_photo_qs.delete()
  167. return response.json(0)
  168. except Exception as e:
  169. LOGGER.info('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  170. return response.json(500)