IcloudService.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Author : peng
  4. @Time : 2023-6-7 18:26:35
  5. @File :IcloudMeal.py
  6. """
  7. import logging
  8. import time
  9. from django.db.models import Sum, Q
  10. from django.http import HttpResponse
  11. from django.views import View
  12. from Model.models import IcloudUseDetails, IcloudService, VodBucketModel, IcloudStorageRecord, Device_Info
  13. from Object.AWS.AmazonS3Util import AmazonS3Util
  14. from Object.RedisObject import RedisObject
  15. from Object.ResponseObject import ResponseObject
  16. from Object.TokenObject import TokenObject
  17. from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN, AWS_ACCESS_KEY_ID, \
  18. AWS_SECRET_ACCESS_KEY
  19. from Service.VodHlsService import SplitVodHlsObject
  20. logger = logging.getLogger('info')
  21. class IcloudServiceView(View):
  22. def get(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.GET, operation, request)
  26. def post(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation')
  29. return self.validation(request.POST, operation, request)
  30. def validation(self, request_dict, operation, request):
  31. response = ResponseObject()
  32. tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  33. response.lang = tko.lang
  34. user_id = tko.userID
  35. if tko.code != 0:
  36. return response.json(tko.code)
  37. if operation == 'vodUpload': # 云存上传云盘
  38. return self.vod_upload(request_dict, response, user_id)
  39. elif operation == 'get-scanning-status': # 确认app是否扫码
  40. return self.get_scanning_status(request_dict, response)
  41. else:
  42. return response.json(404)
  43. @staticmethod
  44. def vod_upload(request_dict, response, user_id):
  45. """
  46. 云存上传云盘
  47. @param request_dict: 请求参数
  48. @param user_id: 用户id
  49. @request_dict serial_number: 序列号
  50. @param response: 响应对象
  51. @return: response
  52. """
  53. logger.info('开始云存转移到云盘')
  54. uid = request_dict.get('uid', None)
  55. channel = request_dict.get('channel', None)
  56. start_time = request_dict.get('start_time', None)
  57. if not all([uid, channel, start_time]):
  58. return response.json(444, {'error param': 'uid,channel,start_time'})
  59. device_qs = Device_Info.objects.filter(UID=uid, userID=user_id).values('NickName')
  60. if not device_qs.exists():
  61. return response.json(173)
  62. # 查询是否开通云盘
  63. use_details_qs = IcloudUseDetails.objects.filter(user_id=user_id).values('id', 'bucket_id', 'use_size')
  64. if not use_details_qs.exists():
  65. return response.json(173)
  66. use_details_id = use_details_qs[0]['id']
  67. target_bucket_id = use_details_qs[0]['bucket_id']
  68. use_size = float(use_details_qs[0]['use_size'])
  69. now_time = int(time.time())
  70. nickname = device_qs[0]['NickName']
  71. # 判断云盘是否还有容量
  72. all_size = IcloudService.objects.filter(Q(use_details_id=use_details_id), Q(use_status=0),
  73. Q(end_time__gt=now_time) | Q(end_time=0)).values(
  74. 'size').aggregate(total_size=Sum('size'))['total_size']
  75. all_size = all_size * 1024 if all_size else 0
  76. if use_size > all_size:
  77. logger.info('{}用户套餐总容量为:{},已使用容量为:{}'.format(uid, all_size, use_size))
  78. return response.json(910)
  79. split_vod_hls_obj = SplitVodHlsObject()
  80. vod_hls = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time=start_time).values(
  81. 'bucket_id', 'fg', 'sec')
  82. if not vod_hls.exists():
  83. logger.info('{}用户查无此云存:{}'.format(uid, start_time))
  84. return response.json(173)
  85. source_bucket_id = vod_hls[0]['bucket_id']
  86. fg = int(vod_hls[0]['fg'])
  87. sec = vod_hls[0]['sec']
  88. target_bucket_qs = VodBucketModel.objects.filter(id=target_bucket_id).values('bucket')
  89. if not target_bucket_qs.exists():
  90. return response.json(173)
  91. target_bucket_name = target_bucket_qs[0]['bucket']
  92. source_bucket_qs = VodBucketModel.objects.filter(id=source_bucket_id).values('bucket', 'region', 'mold')
  93. if not source_bucket_qs.exists():
  94. return response.json(173)
  95. bucket_region = source_bucket_qs[0]['region']
  96. source_bucket_name = source_bucket_qs[0]['bucket']
  97. mold = source_bucket_qs[0]["mold"]
  98. ts_list = []
  99. ts_size = 0
  100. try:
  101. s3_obj = AmazonS3Util(
  102. AWS_ACCESS_KEY_ID[mold],
  103. AWS_SECRET_ACCESS_KEY[mold],
  104. bucket_region
  105. )
  106. for i in range(15):
  107. shift = (i + 1) * 4
  108. duration = (fg >> shift) & 0xf
  109. if duration > 0:
  110. ts_file = '{uid}/vod{channel}/{time}/ts{i}.ts'.format(uid=uid, channel=channel, time=start_time,
  111. i=i)
  112. ts_list.append(ts_file)
  113. ts_size += s3_obj.get_object_size(source_bucket_name, ts_file) # 获取存储对象字节,单位B
  114. ts_size = round(ts_size / 1024 / 1024, 2) # 字节转换为MB单位
  115. temp_size = ts_size + use_size
  116. if temp_size > all_size:
  117. logger.info('{}用户无空间上传,套餐容量为:{},使用容量为:{}'.format(uid, all_size, temp_size))
  118. return response.json(910)
  119. start_time = int(start_time) * 1000 # 转换单位为毫秒
  120. icloud_record_qs = IcloudStorageRecord.objects.filter(user_id=user_id, uid=uid, channel=channel,
  121. time_stamp=start_time,
  122. size=ts_size, store_type=1)
  123. if not icloud_record_qs.exists():
  124. for source_key in ts_list:
  125. ts_name = source_key.split('/')[-1]
  126. target_key = '{user_id}/ts_file/{uid}/vod{channel}/{time}/{ts_name}'.format(user_id=user_id,
  127. uid=uid,
  128. channel=channel,
  129. time=start_time,
  130. ts_name=ts_name)
  131. s3_obj.copy_single_obj(source_bucket_name, source_key, target_bucket_name, target_key)
  132. IcloudStorageRecord.objects.create(user_id=user_id, uid=uid, channel=channel, time_stamp=start_time,
  133. nickname=nickname,
  134. sec=sec, bucket_id=target_bucket_id, fg=fg, size=ts_size,
  135. store_type=1)
  136. use_details_qs.update(use_size=temp_size)
  137. return response.json(0)
  138. else:
  139. return response.json(174)
  140. except Exception as e:
  141. logger.info('云存转移云盘异常:{}'.format(repr(e)))
  142. return response.json(500)