peng 2 жил өмнө
parent
commit
7e633590fa

+ 1 - 1
Ansjer/server_urls/icloud_url.py

@@ -9,5 +9,5 @@ from Controller.IcloudService import IcloudMeal, IcloudService
 
 urlpatterns = [
     re_path(r'^meal/(?P<operation>.*)$', IcloudMeal.IcloudMeal.as_view()),
-    re_path(r'^service/(?P<operation>.*)$', IcloudService.IcloudService.as_view()),
+    re_path(r'^service/(?P<operation>.*)$', IcloudService.IcloudServiceView.as_view()),
 ]

+ 82 - 10
Controller/IcloudService/IcloudService.py

@@ -4,17 +4,23 @@
 @Time : 2023-6-7 18:26:35
 @File :IcloudMeal.py
 """
+import time
 
+from django.db.models import Sum, Q
 from django.http import HttpResponse
 from django.views import View
 
+from Model.models import IcloudUseDetails, IcloudService, VodBucketModel, IcloudStorageRecord, Device_Info
+from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
-from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN
+from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN, AWS_ACCESS_KEY_ID, \
+    AWS_SECRET_ACCESS_KEY
+from Service.VodHlsService import SplitVodHlsObject
 
 
-class IcloudService(View):
+class IcloudServiceView(View):
     def get(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
         operation = kwargs.get('operation')
@@ -32,27 +38,93 @@ class IcloudService(View):
         user_id = tko.userID
         if tko.code != 0:
             return response.json(tko.code)
-        if operation == '':  # 网页生成二维码
-            return self.generate_qr_code(response)
+        if operation == 'vodUpload':  # 云存上传云盘
+            return self.vod_upload(request_dict, response, user_id)
         elif operation == 'get-scanning-status':  # 确认app是否扫码
             return self.get_scanning_status(request_dict, response)
         else:
             return response.json(404)
 
     @staticmethod
-    def create_pay_order(request_dict, response):
+    def vod_upload(request_dict, response, user_id):
         """
-        购买订单
+        云存上传云盘
         @param request_dict: 请求参数
+        @param user_id: 用户id
         @request_dict serial_number: 序列号
         @param response: 响应对象
         @return: response
         """
-        uuid_number = request_dict.get('uuid', None)
-        if not uuid_number:
-            return response.json(444, {'error param': 'uuid'})
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        start_time = request_dict.get('start_time', None)
+        if not all([uid, channel, start_time]):
+            return response.json(444, {'error param': 'uid,channel,start_time'})
+        device_qs = Device_Info.objects.filter(UID=uid, userID=user_id).values('NickName')
+        if not device_qs.exists():
+            return response.json(173)
+        # 查询是否开通云盘
+        use_details_qs = IcloudUseDetails.objects.filter(user_id=user_id).values('id', 'bucket_id', 'size')
+        if not use_details_qs.exists():
+            return response.json(173)
+        use_details_id = use_details_qs[0]['id']
+        bucket_id = use_details_qs[0]['bucket_id']
+        use_size = use_details_qs[0]['size']
+        now_time = int(time.time())
+        nickname = device_qs[0]['NickName']
+        # 判断云盘是否还有容量
+        all_size = IcloudService.objects.filter(Q(use_details_id=use_details_id), Q(use_status=0),
+                                                Q(end_time__gt=now_time) | Q(end_time=0)).values(
+            'size').aggregate(total_size=Sum('count'))['total_size']
+        all_size = all_size if all_size else 0
+        if use_size > all_size:
+            return response.json(910)
+        split_vod_hls_obj = SplitVodHlsObject()
+        vod_hls = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time=start_time).values(
+            'bucket_id', 'fg', 'sec')
+        if not vod_hls.exists():
+            return response.json(173)
+        source_bucket_id = vod_hls[0]['bucket_id']
+        fg = vod_hls[0]['fg']
+        sec = vod_hls[0]['sec']
+        bucket_qs = VodBucketModel.objects.filter(id=bucket_id).values('bucket')
+        if not bucket_qs.exists():
+            return response.json(173)
+        to_bucket_name = bucket_qs[0]['bucket']
+
+        source_bucket_qs = VodBucketModel.objects.filter(id=source_bucket_id).values('bucket', 'region', 'mold')
+        if not source_bucket_qs.exists():
+            return response.json(173)
+        bucket_region = source_bucket_qs[0]['region']
+        source_bucket_name = source_bucket_qs[0]['bucket']
+        mold = source_bucket_qs[0]["mold"]
+        ts_list = []
+        ts_size = 0
         try:
+            s3_obj = AmazonS3Util(
+                AWS_ACCESS_KEY_ID[mold],
+                AWS_SECRET_ACCESS_KEY[mold],
+                bucket_region
+            )
+            for i in range(15):
+                shift = (i + 1) * 4
+                duration = (fg >> shift) & 0xf
+                if duration > 0:
+                    ts_file = '{uid}/vod{channel}/{time}/ts{i}.ts'.format(uid=uid, channel=channel, time=start_time,
+                                                                          i=i)
+                    ts_list.append(ts_file)
+                    ts_size += s3_obj.get_object_size(source_bucket_name, ts_file)
+            temp_size = ts_size + use_size
+            if temp_size > all_size:
+                return response.json(910)
+            for item in ts_list:
+                key_name = '{user_id}/ts_file/'.format(user_id=user_id) + item
+                s3_obj.copy_single_obj(source_bucket_name, item, to_bucket_name, key_name)
+            IcloudStorageRecord.objects.create(user_id=user_id, uid=uid, channel=channel, time_stamp=start_time,
+                                               nickname=nickname,
+                                               sec=sec, bucket_id=bucket_id, fg=fg, size=ts_size, store_type=1)
+            use_details_qs.update(size=temp_size)
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500)
+            return response.json(500)

+ 4 - 4
Model/models.py

@@ -3578,7 +3578,7 @@ class ICloudStoreMeal(models.Model):
 
 class IcloudUseDetails(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    size = models.IntegerField(default=0, verbose_name='已使用容量大小')  # 单位G
+    use_size = models.IntegerField(default=0, verbose_name='已使用容量大小')  # 单位G
     add_time = models.IntegerField(verbose_name='添加时间', default=0)
     upd_time = models.BigIntegerField(verbose_name='更新时间', default=0)
     detect_status = models.SmallIntegerField(default=0, verbose_name='开关状态')  # 0:关闭, 1:开启
@@ -3595,9 +3595,9 @@ class IcloudUseDetails(models.Model):
 class IcloudService(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     size = models.IntegerField(default=0, verbose_name='容量大小')  # 单位G
-    end_time = models.BigIntegerField(verbose_name='套餐结束时间', db_index=True, default=0)
+    end_time = models.IntegerField(verbose_name='套餐结束时间', db_index=True, default=0)
     add_time = models.IntegerField(verbose_name='添加时间', default=0)
-    upd_time = models.BigIntegerField(verbose_name='更新时间', default=0)
+    upd_time = models.IntegerField(verbose_name='更新时间', default=0)
     use_status = models.IntegerField(verbose_name='使用状态', default=0)  # 0:使用中, 1:已过期
     use_details_id = models.IntegerField(default=0, verbose_name='关联云盘使用表id')
     type = models.SmallIntegerField(default=0, verbose_name='云盘购买类型')  # 0:注册永久送,1:购买运存附送,2:单独购买套餐
@@ -3616,7 +3616,7 @@ class IcloudStorageRecord(models.Model):
     uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     nickname = models.CharField(max_length=20, verbose_name='设备昵称', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
-    time_stamp = models.IntegerField(verbose_name='视频/图片名字时间戳', default=0, db_index=True)  # 单位毫秒
+    time_stamp = models.BigIntegerField(verbose_name='视频/图片名字时间戳', default=0, db_index=True)  # 单位毫秒
     sec = models.IntegerField(verbose_name='秒数', default=0)
     bucket_id = models.IntegerField(verbose_name='关联存储桶id', default=0)
     fg = models.CharField(max_length=20, verbose_name='ts个数,时间描述片段数')  # 阿里为时间片段数,亚马逊为一个32bit整型,前28bit代表ts文件的时长

+ 2 - 0
Object/ResponseObject.py

@@ -77,6 +77,7 @@ class ResponseObject(object):
             904: 'Version does not support this feature!',
             906: 'Cause of file operation error',
             907: 'The download file does not exist!',
+            910: 'Icloud Insufficient capacity!',
             10001: 'Customer number, customer confidentiality error',
             10002: 'Check your configuration: no customer number, customer confidentiality',
             10003: 'The authorization code does not exist. Please reauthorize',
@@ -193,6 +194,7 @@ class ResponseObject(object):
             904: '版本不支持本功能!',
             906: '文件操作错误',
             907: '文件不存在!',
+            910: '云盘容量不足!',
             10001: '客户编号,客户机密错误',
             10002: '检查您的配置:没有客户编号,客户机密',
             10003: '授权码不存在,请重新授权',