Przeglądaj źródła

云存分表功能上线

peng 2 lat temu
rodzic
commit
f4ae19e1a6

+ 11 - 1
AdminController/DeviceManagementController.py

@@ -14,13 +14,15 @@ from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_
     AWS_SES_ACCESS_REGION
     AWS_SES_ACCESS_REGION
 from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
 from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
     VodHlsModel, ExperienceContextModel, DeviceTypeModel, Equipment_Info, UidUserModel, ExperienceAiModel, AiService, \
     VodHlsModel, ExperienceContextModel, DeviceTypeModel, Equipment_Info, UidUserModel, ExperienceAiModel, AiService, \
-    AppBundle, App_Info, AppDeviceType, DeviceNameLanguage, AppVersionNumber, UIDCompanySerialModel
+    AppBundle, App_Info, AppDeviceType, DeviceNameLanguage, AppVersionNumber, UIDCompanySerialModel, UIDModel, \
+    CompanySerialModel
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 
 
 class DeviceManagement(View):
 class DeviceManagement(View):
@@ -329,6 +331,9 @@ class DeviceManagement(View):
                 Order_Model.objects.filter(UID=uid, order_type=0).delete()
                 Order_Model.objects.filter(UID=uid, order_type=0).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
+                # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(uid=uid)
                 ExperienceContextModel.objects.filter(uid=uid).delete()
                 ExperienceContextModel.objects.filter(uid=uid).delete()
                 Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
                 Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
             return response.json(0)
             return response.json(0)
@@ -475,6 +480,9 @@ class DeviceManagement(View):
                     UID_Bucket.objects.filter(uid__in=uidList).delete()
                     UID_Bucket.objects.filter(uid__in=uidList).delete()
                     StsCrdModel.objects.filter(uid__in=uidList).delete()
                     StsCrdModel.objects.filter(uid__in=uidList).delete()
                     VodHlsModel.objects.filter(uid__in=uidList).delete()
                     VodHlsModel.objects.filter(uid__in=uidList).delete()
+                    # 删除vod_hls分表数据
+                    split_vod_hls_obj = SplitVodHlsObject()
+                    split_vod_hls_obj.del_vod_hls_data(uid__in=uidList)
                     Unused_Uid_Meal.objects.filter(uid__in=uidList).delete()
                     Unused_Uid_Meal.objects.filter(uid__in=uidList).delete()
                     ExperienceContextModel.objects.filter(uid__in=uidList).delete()
                     ExperienceContextModel.objects.filter(uid__in=uidList).delete()
                     Order_Model.objects.filter(UID__in=uidList, order_type=0).delete()
                     Order_Model.objects.filter(UID__in=uidList, order_type=0).delete()
@@ -742,6 +750,8 @@ class DeviceManagement(View):
                 StsCrdModel.objects.filter(uid=uid).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
                 # 删除vod_hls分表数据
                 # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(uid=uid)
                 ExperienceContextModel.objects.filter(uid=uid).delete()
                 ExperienceContextModel.objects.filter(uid=uid).delete()
                 # 删除AI
                 # 删除AI
                 ExperienceAiModel.objects.filter(uid=uid).delete()
                 ExperienceAiModel.objects.filter(uid=uid).delete()

+ 112 - 85
Controller/CloudStorage.py

@@ -7,16 +7,16 @@ import logging
 import ssl
 import ssl
 import sys
 import sys
 import time
 import time
-import jwt
 from decimal import Decimal
 from decimal import Decimal
 from itertools import groupby
 from itertools import groupby
 from operator import itemgetter
 from operator import itemgetter
 from urllib.parse import quote, parse_qs, unquote
 from urllib.parse import quote, parse_qs, unquote
 
 
 import boto3
 import boto3
+import jwt
 import paypalrestsdk
 import paypalrestsdk
 from django.db import transaction
 from django.db import transaction
-from django.db.models import Q, F, Count
+from django.db.models import Q, F
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.views.generic.base import View
 from django.views.generic.base import View
 
 
@@ -27,7 +27,7 @@ from Controller.CloudPhoto.CloudServiceController import CloudServiceController
 from Controller.PaymentCycle import Paypal
 from Controller.PaymentCycle import Paypal
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, UID_Bucket, StsCrdModel, \
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, UID_Bucket, StsCrdModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMsgModel, Unused_Uid_Meal, PromotionRuleModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMsgModel, Unused_Uid_Meal, PromotionRuleModel, \
-    VideoPlaybackTimeModel, CouponModel, VodBucketModel, VodHlsSummary
+    VideoPlaybackTimeModel, CouponModel, VodBucketModel, VodHlsSummary, VodHlsTag
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.AliPayObject import AliPayObject
 from Object.AliPayObject import AliPayObject
@@ -40,9 +40,12 @@ from Object.WechatPayObject import WechatPayObject
 from Object.m3u8generate import PlaylistGenerator
 from Object.m3u8generate import PlaylistGenerator
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.PayService import PaymentService
 from Service.PayService import PaymentService
+from Service.VodHlsService import SplitVodHlsObject
+
 ssl._create_default_https_context = ssl._create_unverified_context
 ssl._create_default_https_context = ssl._create_unverified_context
 LOGGER = logging.getLogger('info')
 LOGGER = logging.getLogger('info')
 
 
+
 # 设备信息添加
 # 设备信息添加
 class CloudStorageView(View):
 class CloudStorageView(View):
 
 
@@ -286,25 +289,30 @@ class CloudStorageView(View):
         """
         """
         uid_token = request_dict.get('uid', None)
         uid_token = request_dict.get('uid', None)
         channel = request_dict.get('channel', None)
         channel = request_dict.get('channel', None)
-        store_time = request_dict.get('time', None)
-        if not all([uid_token, channel, store_time]):
+        start_time = request_dict.get('time', None)
+        if not all([uid_token, channel, start_time]):
             return response.json(444)
             return response.json(444)
         uid = jwt.decode(uid_token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256').get('uid', '')
         uid = jwt.decode(uid_token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256').get('uid', '')
         now_time = int(time.time())
         now_time = int(time.time())
-        vod_hls_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, time=store_time,
-                                                endTime__gte=now_time).values("sec", "fg", "bucket__bucket",
-                                                                              "bucket__endpoint", "bucket__region",
-                                                                              "bucket__mold")
+
+        split_vod_hls_obj = SplitVodHlsObject()
+        vod_hls_qs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time=start_time,
+                                                        end_time__gte=now_time).values("sec", "fg", "bucket_id",
+                                                                                       'start_time')
         if not vod_hls_qs.exists():
         if not vod_hls_qs.exists():
             return response.json(173)
             return response.json(173)
+        bucket_id = vod_hls_qs[0]['bucket_id']
+        vod_bucket_qs = VodBucketModel.objects.filter(id=bucket_id).values('bucket', 'region', 'mold')
+        if not vod_bucket_qs.exists():
+            return response.json(173)
+        bucket_region = vod_bucket_qs[0]['region']
+        bucket_name = vod_bucket_qs[0]['bucket']
+        mold = vod_bucket_qs[0]["mold"]
         fg = int(vod_hls_qs[0]['fg'])
         fg = int(vod_hls_qs[0]['fg'])
-        bucket__region = vod_hls_qs[0]['bucket__region']
-        bucket_name = vod_hls_qs[0]['bucket__bucket']
-
         s3_obj = AmazonS3Util(
         s3_obj = AmazonS3Util(
-            AWS_ACCESS_KEY_ID[vod_hls_qs[0]["bucket__mold"]],
-            AWS_SECRET_ACCESS_KEY[vod_hls_qs[0]["bucket__mold"]],
-            bucket__region
+            AWS_ACCESS_KEY_ID[mold],
+            AWS_SECRET_ACCESS_KEY[mold],
+            bucket_region
         )
         )
 
 
         playlist_entries = []
         playlist_entries = []
@@ -314,7 +322,7 @@ class CloudStorageView(View):
             shift = (i + 1) * 4
             shift = (i + 1) * 4
             duration = (fg >> shift) & 0xf
             duration = (fg >> shift) & 0xf
             if duration > 0:
             if duration > 0:
-                ts_file = '{uid}/vod{channel}/{time}/ts{i}.ts'.format(uid=uid, channel=channel, time=store_time, i=i)
+                ts_file = '{uid}/vod{channel}/{time}/ts{i}.ts'.format(uid=uid, channel=channel, time=start_time, i=i)
                 response_url = s3_obj.generate_file_obj_url(bucket_name, ts_file)
                 response_url = s3_obj.generate_file_obj_url(bucket_name, ts_file)
                 playlist_entries.append({
                 playlist_entries.append({
                     'name': response_url,
                     'name': response_url,
@@ -390,7 +398,7 @@ class CloudStorageView(View):
                         "Effect": "Allow",
                         "Effect": "Allow",
                         "Action": "s3:*",
                         "Action": "s3:*",
                         "Resource": ["{aws_arn}:::{bucket_name}/{uid_channel}*".
                         "Resource": ["{aws_arn}:::{bucket_name}/{uid_channel}*".
-                                     format(aws_arn=aws_arn, bucket_name=bucket_name, uid_channel=storage)]
+                                         format(aws_arn=aws_arn, bucket_name=bucket_name, uid_channel=storage)]
                     }
                     }
                 ]
                 ]
             }
             }
@@ -480,9 +488,12 @@ class CloudStorageView(View):
             "UidBucketModelOverTime": uid_bucket_qs_time_over,
             "UidBucketModelOverTime": uid_bucket_qs_time_over,
         })
         })
 
 
-        vod_hls_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, endTime__gte=now_time,
-                                                time__range=(start_time, end_time)).values("id", "time", "sec", "fg",
-                                                                                           "bucket_id")
+        split_vod_hls_obj = SplitVodHlsObject()
+        vod_hls_qs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel,
+                                                        end_time__gte=now_time,
+                                                        start_time__range=(start_time, end_time),
+                                                        ) \
+            .values("id", "start_time", "sec", "fg", "bucket_id")
 
 
         vod_play_list = []
         vod_play_list = []
         if not vod_hls_qs.exists():
         if not vod_hls_qs.exists():
@@ -519,21 +530,21 @@ class CloudStorageView(View):
 
 
         for vod in vod_hls_qs:
         for vod in vod_hls_qs:
             bucket_name = regroup_bucket_qs[vod['bucket_id']]['bucket']
             bucket_name = regroup_bucket_qs[vod['bucket_id']]['bucket']
-            thumbs_png = '{uid}/vod{channel}/{time}/Thumb.jpeg'.format(uid=uid, channel=channel, time=vod['time'])
+            thumbs_png = '{uid}/vod{channel}/{time}/Thumb.jpeg'.format(uid=uid, channel=channel, time=vod['start_time'])
             response_url = s3_obj.generate_file_obj_url(bucket_name, thumbs_png)
             response_url = s3_obj.generate_file_obj_url(bucket_name, thumbs_png)
             vod_url = '{server_domain}cloudstorage/signplaym3u8?' \
             vod_url = '{server_domain}cloudstorage/signplaym3u8?' \
                       'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
                       'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
-                format(server_domain=SERVER_DOMAIN_SSL, uid=uid_token, channel=channel, time=vod['time'])
+                format(server_domain=SERVER_DOMAIN_SSL, uid=uid_token, channel=channel, time=vod['start_time'])
             ts_num = int(vod['fg']) & 0xf
             ts_num = int(vod['fg']) & 0xf
             vod_play_list.append({
             vod_play_list.append({
-                'start_time': vod['time'],
+                'start_time': vod['start_time'],
                 'sign_url': vod_url,
                 'sign_url': vod_url,
                 'thumb': response_url,
                 'thumb': response_url,
                 'sec': vod['sec'],
                 'sec': vod['sec'],
                 'ts_num': ts_num,
                 'ts_num': ts_num,
-                'vod_id': vod['id']
-            }),
-
+                'vod_id': vod['id'],
+            })
+        vod_play_list = sorted(vod_play_list, key=lambda item: -item['start_time'])
         generate_presigned_over_time = int(time.time())
         generate_presigned_over_time = int(time.time())
         if uid == 'UWE2ZJ52SE4FX75U111A':
         if uid == 'UWE2ZJ52SE4FX75U111A':
             logger.info({
             logger.info({
@@ -548,9 +559,9 @@ class CloudStorageView(View):
         return response.json(0, vod_play_list)
         return response.json(0, vod_play_list)
 
 
     @staticmethod
     @staticmethod
-    def do_store_playlist(request_dict, response):  # 设备调用,上传视频到s3,同时把视频数据信息传给服务器,服务器存储播放内容
+    def do_store_playlist(request_dict, response):
         """
         """
-        存储设备上传数据
+        存储设备上传云存信息数据
         @param request_dict: 请求数据
         @param request_dict: 请求数据
         @request_dict uidToken: uid_token
         @request_dict uidToken: uid_token
         @request_dict time: 播放列表名字时间戳
         @request_dict time: 播放列表名字时间戳
@@ -560,68 +571,76 @@ class CloudStorageView(View):
         @return: response
         @return: response
         """
         """
         uid_token = request_dict.get('uidToken', None)
         uid_token = request_dict.get('uidToken', None)
-        store_time = request_dict.get('time', None)
+        start_time = request_dict.get('time', None)
         sec = request_dict.get('sec', None)
         sec = request_dict.get('sec', None)
         fg = request_dict.get('fg', None)
         fg = request_dict.get('fg', None)
 
 
-        if not all([uid_token, store_time, sec]):
+        if not all([uid_token, start_time, sec]):
             return response.json(0)
             return response.json(0)
         uid_obj = UidTokenObject(uid_token)
         uid_obj = UidTokenObject(uid_token)
         if uid_obj.flag is False:
         if uid_obj.flag is False:
             return response.json(444, 'uidToken')
             return response.json(444, 'uidToken')
 
 
-        sec = int(sec)
-        uid = uid_obj.UID
-        channel = uid_obj.channel
-        now_time = int(time.time())
-        uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel).values(
-            "bucket__mold",
-            "bucket__bucket",
-            "bucket__endpoint",
-            "bucket__region",
-            "status",
-            "bucket__storeDay",
-            "bucket__id").order_by(
-            'addTime')
-        if uid_bucket_qs.exists():
+        try:
+            sec = int(sec)
+            uid = uid_obj.UID
+            channel = uid_obj.channel
+            now_time = int(time.time())
+            uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel).values(
+                "bucket__mold",
+                "bucket__bucket",
+                "bucket__endpoint",
+                "bucket__region",
+                "status",
+                "bucket__storeDay",
+                "bucket__id").order_by(
+                'addTime')
+            if not uid_bucket_qs.exists():
+                return response.json(10030)
+
+            # 判断设备是否开启云存
             uid_bucket = uid_bucket_qs.first()
             uid_bucket = uid_bucket_qs.first()
             store_day = uid_bucket['bucket__storeDay']
             store_day = uid_bucket['bucket__storeDay']
             bucket_id = uid_bucket['bucket__id']
             bucket_id = uid_bucket['bucket__id']
-            end_time = int(store_time) + store_day * 86400
-            if uid_bucket['status'] == 1:
-                VodHlsModel.objects.create(
-                    uid=uid,
-                    channel=channel,
-                    time=store_time,
-                    endTime=end_time,
-                    bucket_id=bucket_id,
-                    fg=fg,
-                    sec=sec,
-                )
-                end_time_stamp = datetime.datetime.fromtimestamp(int(store_time))
-                end_time_str = datetime.datetime(end_time_stamp.year, end_time_stamp.month, 1)
-                end_time_stamp = CommonService.str_to_timestamp(end_time_str.strftime('%Y-%m-%d %H:%M:%S'))
-                vod_hls_qs = VodHlsSummary.objects.filter(uid=uid, time=end_time_stamp)
-                if vod_hls_qs.exists():
-                    vod_hls = vod_hls_qs.first()
-                    vod_hls.upload_frequency += 1
-                    vod_hls.upload_duration += sec
-                    vod_hls.updated_time = now_time
-                    vod_hls.save()
-                else:
-                    VodHlsSummary.objects.create(uid=uid, time=end_time_stamp, created_time=now_time,
-                                                 updated_time=now_time,
-                                                 upload_duration=sec, upload_frequency=1)
-
-                res = {'code': 0, 'msg': '存储成功'}
-                return HttpResponse(json.dumps(res, ensure_ascii=False),
-                                    content_type="application/json,charset=utf-8")
+            end_time = int(start_time) + store_day * 86400
+            if uid_bucket['status'] != 1:
+                return response.json(10, {'msg': '设备未开启云存'})
+
+            # 保存云存信息数据
+            # 创建旧表数据
+            VodHlsModel.objects.create(
+                uid=uid,
+                channel=channel,
+                time=start_time,
+                endTime=end_time,
+                bucket_id=bucket_id,
+                fg=fg,
+                sec=sec,
+            )
+            # 创建分表数据
+            split_vod_hls_obj = SplitVodHlsObject()
+            vod_vo, week = split_vod_hls_obj.creat_vod_hls_data(uid=uid, channel=channel, start_time=start_time,
+                                                                end_time=end_time, bucket_id=bucket_id, fg=fg, sec=sec)
+
+            split_vod_hls_obj.cloud_vod_hls_tag(vod_vo.id, week, uid, start_time)
+            end_time_stamp = datetime.datetime.fromtimestamp(int(start_time))
+            end_time_str = datetime.datetime(end_time_stamp.year, end_time_stamp.month, 1)
+            end_time_stamp = CommonService.str_to_timestamp(end_time_str.strftime('%Y-%m-%d %H:%M:%S'))
+            vod_hls_sum_qs = VodHlsSummary.objects.filter(uid=uid, time=end_time_stamp)
+            if vod_hls_sum_qs.exists():
+                vod_hls_sum = vod_hls_sum_qs.first()
+                vod_hls_sum.upload_frequency += 1
+                vod_hls_sum.upload_duration += sec
+                vod_hls_sum.updated_time = now_time
+                vod_hls_sum.save()
             else:
             else:
-                res = {'code': 404, 'msg': '设备未开启'}
-                return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
-        else:
-            res = {'code': 404, 'msg': '设备未购买'}
-            return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
+                VodHlsSummary.objects.create(uid=uid, time=end_time_stamp, created_time=now_time, updated_time=now_time,
+                                             upload_duration=sec, upload_frequency=1)
+
+            res = {'code': 0, 'msg': '存储成功'}
+            return HttpResponse(json.dumps(res, ensure_ascii=False), content_type='application/json,charset=utf-8')
+        except Exception as e:
+            return response.json(500, repr(e))
 
 
     @staticmethod
     @staticmethod
     def do_change_vod_status(request_dict, user_id, response):  # 修改云存状态
     def do_change_vod_status(request_dict, user_id, response):  # 修改云存状态
@@ -1524,10 +1543,16 @@ class CloudStorageView(View):
         try:
         try:
             if is_del_all == 1:
             if is_del_all == 1:
                 VodHlsModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
+                # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(uid=uid)
             else:
             else:
                 if type(vod_id_list).__name__ != 'list':
                 if type(vod_id_list).__name__ != 'list':
                     return response.json(444)
                     return response.json(444)
                 VodHlsModel.objects.filter(id__in=vod_id_list).delete()
                 VodHlsModel.objects.filter(id__in=vod_id_list).delete()
+                # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(id__in=vod_id_list)
         except Exception as e:
         except Exception as e:
             return response.json(424, repr(e))
             return response.json(424, repr(e))
         else:
         else:
@@ -1681,9 +1706,11 @@ class CloudStorageView(View):
         if not uid_bucket_qs.exists():
         if not uid_bucket_qs.exists():
             return response.json(10030)
             return response.json(10030)
 
 
-        vod_hls_qs = VodHlsModel.objects.extra(select={'date': "FROM_UNIXTIME(time,'%%Y-%%m-%%d')"}).values(
-            'date').filter(uid=uid, endTime__gte=now_time, channel=channel).annotate(count=Count('time')).order_by(
-            '-date')[:31]
+        # vod_hls_qs = VodHlsModel.objects.extra(select={'date': "FROM_UNIXTIME(time,'%%Y-%%m-%%d')"}).values(
+        #     'date').filter(uid=uid, endTime__gte=now_time, channel=channel).annotate(count=Count('time')).order_by(
+        #     '-date')[:31]
+        split_vod_hls_obj = SplitVodHlsObject()
+        vod_hls_qs = split_vod_hls_obj.get_vod_hls_date(uid=uid, end_time__gte=now_time, channel=channel)
 
 
         had_vod_list = []
         had_vod_list = []
         for vod in vod_hls_qs:
         for vod in vod_hls_qs:
@@ -1692,7 +1719,7 @@ class CloudStorageView(View):
                 'vod_count': vod['count'],
                 'vod_count': vod['count'],
                 'date_format': vod['date'],
                 'date_format': vod['date'],
             })
             })
-
+        had_vod_list = sorted(had_vod_list, key=lambda item: -item['timestamp'])[:31]
         return response.json(0, had_vod_list)
         return response.json(0, had_vod_list)
 
 
     @staticmethod
     @staticmethod
@@ -1881,9 +1908,9 @@ class CloudStorageView(View):
         if not all([order_id, refund_amount]):
         if not all([order_id, refund_amount]):
             return response.json(444)
             return response.json(444)
         try:
         try:
-            order_qs = Order_Model.objects.filter(orderID=order_id)\
-                .values('status', 'payType', 'price','refunded_amount',
-                        'currency', 'paymentID','trade_no')
+            order_qs = Order_Model.objects.filter(orderID=order_id) \
+                .values('status', 'payType', 'price', 'refunded_amount',
+                        'currency', 'paymentID', 'trade_no')
             if not order_qs.exists():
             if not order_qs.exists():
                 return response.json(173)
                 return response.json(173)
 
 

+ 4 - 1
Controller/CloudTransfer.py

@@ -18,6 +18,7 @@ from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 
 
 class cloudTestView(View):
 class cloudTestView(View):
@@ -112,7 +113,9 @@ class cloudTestView(View):
                 Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID=vodPrimaryUserID,
                 Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID=vodPrimaryUserID,
                                                            vodPrimaryMaster=vodPrimaryMaster)
                                                            vodPrimaryMaster=vodPrimaryMaster)
                 VodHlsModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
-
+                # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(uid=uid)
                 if not serial_number:
                 if not serial_number:
                     serial_number = CommonService.query_serial_with_uid(uid)
                     serial_number = CommonService.query_serial_with_uid(uid)
                 u_dev_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number)
                 u_dev_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number)

+ 34 - 209
Controller/CloudVod.py

@@ -1,27 +1,11 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-"""
-@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
-@AUTHOR: ASJRD018
-@NAME: AnsjerFormal
-@software: PyCharm
-@DATE: 2018/12/5 9:30
-@Version: python3.6
-@MODIFY DECORD:ansjer dev
-@file: CloudVod.py
-@Contact: chanjunkai@163.com
-"""
 import json
 import json
 import math
 import math
 import time
 import time
 import urllib
 import urllib
-import datetime
-import boto3
 
 
-from Object.AliPayObject import AliPayObject
+import boto3
 import oss2
 import oss2
 import paypalrestsdk
 import paypalrestsdk
-import logging
 from aliyunsdkcore import client
 from aliyunsdkcore import client
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
@@ -29,42 +13,16 @@ from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 from django.views.generic.base import View
 
 
-from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
-    SERVER_DOMAIN_SSL
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
-    VodHlsSummary, LogModel
+    VodBucketModel
+from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
-
-'''
-# 获取设备推送hls流 证书
-http://192.168.136.40:8077/cloudVod/getSts?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJGVFNMTDhITTQzN1ozOFdVMTExQSIsImNoYW5uZWwiOiI0In0.HO-PzoRwhQ4CFNkjthqOitf48c-XOvHjtNGCeUmBe9g
-# 获取存储的播放文件列表
-#修改状态
-http://192.168.136.40:8077/cloudVod/status?token=local&uid=xxx&channel=4&status=1
-# 回调vod
-http://192.168.136.40:8077/cloudVod/storeplaylist?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJGVFNMTDhITTQzN1ozOFdVMTExQSIsImNoYW5uZWwiOiI0In0.HO-PzoRwhQ4CFNkjthqOitf48c-XOvHjtNGCeUmBe9g&time=1234567891
-=============================
-# 生成订单
-http://test.dvema.com/cloudVod/createOrder?token=test&uid=xxx&channel=4&rank=1
-# 修改设备云存状态
-http://test.dvema.com/cloudVod/status?uid=xxx&channel=4&token=test&status=1
-
-# 获取指定设备云存关联信息
-http://test.dvema.com/cloudVod/details?token=test&uid=xxxx
-
-# 获取回放列表
-http://test.dvema.com/cloudVod/getHlsList?uid=xxxx&channel=4&token=test&daytime=2018121001
-
-
-2设备端
-http://test.dvema.com/cloudVod/getSts?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaGFubmVsIjoiNCIsInVpZCI6IkZUU0xMOEhNNDM3WjM4V1UxMTFBIn0.wkrwYvIYf5qEukOSTxALSAgSqop-gNBdEvSwScOgYB8
-# 支付宝支付
-http://192.168.136.40:8077/cloudVod/aliPayCreateOrder?token=local&channel=2&rank=1&uid=OOBDSU9547NTRSMF111A
-'''
+from Service.VodHlsService import SplitVodHlsObject
 
 
 
 
 # 设备信息添加
 # 设备信息添加
@@ -85,7 +43,6 @@ class CloudVodView(View):
 
 
     def validation(self, request_dict, request, operation):
     def validation(self, request_dict, request, operation):
         response = ResponseObject()
         response = ResponseObject()
-        # operation => cloudVod/path
         if operation is None:
         if operation is None:
             return response.json(444, 'error path')
             return response.json(444, 'error path')
         if operation == 'getSts':
         if operation == 'getSts':
@@ -95,8 +52,6 @@ class CloudVodView(View):
         # 付款完成
         # 付款完成
         elif operation == 'payExecute':
         elif operation == 'payExecute':
             return self.do_paypal_execute(request_dict, response)
             return self.do_paypal_execute(request_dict, response)
-        elif operation == 'storeplaylist':
-            return self.do_store_palylist(request_dict, response)
         elif operation == 'payOK':
         elif operation == 'payOK':
             return self.do_pay_ok()
             return self.do_pay_ok()
         elif operation == 'payError':
         elif operation == 'payError':
@@ -441,90 +396,6 @@ class CloudVodView(View):
                 return HttpResponse(json.dumps(res, ensure_ascii=False),
                 return HttpResponse(json.dumps(res, ensure_ascii=False),
                                     content_type="application/json,charset=utf-8")
                                     content_type="application/json,charset=utf-8")
 
 
-    #  生成设备sts上传授权
-    # def do_getSts(self, request_dict, ip, response):
-    #     uidToken = request_dict.get('uidToken', None)
-    #     utko = UidTokenObject(uidToken)
-    #     if utko.flag is False:
-    #         return response.json(444, 'uidToken')
-    #     UID = utko.UID
-    #     channel = utko.channel
-    #     print(channel)
-    #     print(UID)
-    #     ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1). \
-    #         values('channel', 'bucket__bucket', 'bucket__endpoint', 'bucket__region', 'endTime')
-    #     now_time = int(time.time())
-    #     if not ubqs.exists():
-    #         res = {'code': 404, 'msg': '未购买'}
-    #         return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
-    #     elif ubqs[0]['endTime'] < now_time:
-    #         res = {'code': 404, 'msg': '过期'}
-    #         return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
-    #     oc_qs = OssCrdModel.objects.filter(uid=UID, channel=channel).values("addTime", "data")
-    #     if oc_qs.exists():
-    #         endTime = int(oc_qs[0]["addTime"]) + 3500
-    #         if endTime > now_time:
-    #             print(endTime)
-    #             print(now_time)
-    #             res = json.loads(oc_qs[0]["data"])
-    #             return JsonResponse(status=200, data=res)
-    #     # 套餐id
-    #     storage = '{uid}/vod{channel}/'.format(uid=UID, channel=channel)
-    #     bucket_name = ubqs[0]['bucket__bucket']
-    #     endpoint = ubqs[0]['bucket__endpoint']
-    #     access_key_id = OSS_STS_ACCESS_KEY
-    #     access_key_secret = OSS_STS_ACCESS_SECRET
-    #     region_id = ubqs[0]['bucket__region']
-    #     role_arn = OSS_ROLE_ARN
-    #     clt = client.AcsClient(access_key_id, access_key_secret, region_id)
-    #     req = AssumeRoleRequest.AssumeRoleRequest()
-    #     # 设置返回值格式为JSON。
-    #     req.set_accept_format('json')
-    #     req.set_RoleArn(role_arn)
-    #     req.set_RoleSessionName(UID)
-    #     req.set_DurationSeconds(3600)
-    #     Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*".format(bucket_name=bucket_name,
-    #                                                                         uid_channel=storage)
-    #     print(Resource_access)
-    #     policys = {
-    #         "Version": "1",
-    #         "Statement": [
-    #             {
-    #                 "Action": ["oss:PutObject", "oss:DeleteObject", ],
-    #                 "Resource": [Resource_access],
-    #                 "Effect": "Allow",
-    #                 "Condition": {
-    #                     "IpAddress": {"acs:SourceIp": ip}
-    #                     # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
-    #                     # "IpAddress": {"acs:SourceIp": "*"}
-    #                 }
-    #             }
-    #         ]
-    #     }
-    #     req.set_Policy(Policy=json.dumps(policys))
-    #     body = clt.do_action(req)
-    #     # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
-    #     token = json.loads(body.decode('utf-8'))
-    #     print(token)
-    #     res = {
-    #         'AccessKeyId': token['Credentials']['AccessKeyId'],
-    #         'AccessKeySecret': token['Credentials']['AccessKeySecret'],
-    #         'SecurityToken': token['Credentials']['SecurityToken'],
-    #         'Expiration': token['Credentials']['Expiration'],
-    #         'expire': '3600',
-    #         'endpoint': endpoint,
-    #         'bucket_name': bucket_name,
-    #         'arn': token['AssumedRoleUser']['Arn'],
-    #         'code': 0,
-    #         'storage': storage,
-    #         'endTime': ubqs[0]['endTime'],
-    #         'ip': ip}
-    #     if oc_qs.exists():
-    #         oc_qs.update(data=json.dumps(res), addTime=now_time)
-    #     else:
-    #         OssCrdModel.objects.create(uid=UID, channel=channel, data=json.dumps(res), addTime=now_time)
-    #     return JsonResponse(status=200, data=res)
-
     def do_paypal_execute(self, request_dict, response):
     def do_paypal_execute(self, request_dict, response):
         paymentId = request_dict.get('paymentId', None)
         paymentId = request_dict.get('paymentId', None)
         PayerID = request_dict.get('PayerID', None)
         PayerID = request_dict.get('PayerID', None)
@@ -611,51 +482,6 @@ class CloudVodView(View):
             format(uidToken=utko.token, SERVER_DOMAIN=SERVER_DOMAIN)
             format(uidToken=utko.token, SERVER_DOMAIN=SERVER_DOMAIN)
         return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
         return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
 
 
-    def do_store_palylist(self, request_dict, response):
-        uidToken = request_dict.get('uidToken', None)
-        storeTime = request_dict.get('time', None)
-        sec = request_dict.get('sec', None)
-        utko = UidTokenObject(uidToken)
-        if utko.flag is False:
-            return response.json(444, 'uidToken')
-        if not uidToken or not storeTime or not sec:
-            return response.json(444, 'uidToken,time,sec')
-        sec = int(sec)
-        UID = utko.UID
-        channel = utko.channel
-        print(channel)
-        print(UID)
-        nowTime = int(time.time())
-        if not OssCrdModel.objects.filter(uid=UID, channel=channel).exists():
-            res = {'code': 404, 'msg': '设备未购买'}
-            return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
-        qs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1, endTime__gte=nowTime). \
-            values("channel", "bucket__storeDay", "bucket_id")
-        if not qs.exists():
-            res = {'code': 404, 'msg': '设备未购买'}
-            return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
-        storeDay = qs[0]['bucket__storeDay']
-        bucketID = qs[0]['bucket_id']
-        endTime = int(storeTime) + storeDay * 86400
-        VodHlsModel.objects.create(uid=UID, channel=channel, time=storeTime,
-                                   endTime=endTime, bucket_id=bucketID, sec=sec)
-
-        end_time_stamp = datetime.datetime.fromtimestamp(int(storeTime))
-        end_time_str = datetime.datetime(end_time_stamp.year, end_time_stamp.month, 1)
-        end_time_stamp = CommonService.str_to_timestamp(end_time_str.strftime('%Y-%m-%d %H:%M:%S'))
-        vod_hls_qs = VodHlsSummary.objects.filter(uid=UID, time=end_time_stamp)
-        if vod_hls_qs.exists():
-            vod_hls = vod_hls_qs.first()
-            vod_hls.upload_frequency += 1
-            vod_hls.upload_duration += sec
-            vod_hls.updated_time = nowTime
-            vod_hls.save()
-        else:
-            VodHlsSummary.objects.create(uid=UID, time=end_time_stamp, created_time=nowTime, updated_time=nowTime,
-                                         upload_duration=sec, upload_frequency=1)
-
-        return response.json(0)
-
     def do_filter_playlist(self, request_dict, userID, response):
     def do_filter_playlist(self, request_dict, userID, response):
         startTime = int(request_dict.get('startTime', None))
         startTime = int(request_dict.get('startTime', None))
         endTime = int(request_dict.get('endTime', None))
         endTime = int(request_dict.get('endTime', None))
@@ -668,20 +494,25 @@ class CloudVodView(View):
         if not ubqs.exists():
         if not ubqs.exists():
             return response.json(10, '设备未购买')
             return response.json(10, '设备未购买')
         nowTime = int(time.time())
         nowTime = int(time.time())
-        vodqs = VodHlsModel.objects.filter(uid=uid, channel=channel, time__range=(startTime, endTime),
-                                           endTime__gte=nowTime) \
-            .values("time", "sec", "bucket__bucket", "bucket__endpoint", "bucket__region")
+        split_vod_hls_obj = SplitVodHlsObject()
+        vodqs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time__range=(startTime, endTime),
+                                                   end_time__gte=nowTime).values("start_time", "sec", "bucket_id")
+        if not vodqs.exists():
+            return response.json(173)
+        vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
+        if not vod_bucket_qs.exists():
+            return response.json(173)
+        bucket_name = vod_bucket_qs[0]["bucket"]
+        endpoint = vod_bucket_qs[0]["endpoint"]
         vod_play_list = []
         vod_play_list = []
         print(vodqs)
         print(vodqs)
         auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
         auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
         for vod in vodqs:
         for vod in vodqs:
-            bucket_name = vod["bucket__bucket"]
-            endpoint = vod["bucket__endpoint"]
             bucket = oss2.Bucket(auth, endpoint, bucket_name)
             bucket = oss2.Bucket(auth, endpoint, bucket_name)
             m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
             m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
-                format(uid=uid, channel=channel, time=vod['time'])
+                format(uid=uid, channel=channel, time=vod['start_time'])
             ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
             ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
-                format(uid=uid, channel=channel, time=vod['time'])
+                format(uid=uid, channel=channel, time=vod['start_time'])
             url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
             url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
             urllst = url.split('?')
             urllst = url.split('?')
             url_start = urllib.parse.unquote(urllst[0])
             url_start = urllib.parse.unquote(urllst[0])
@@ -690,7 +521,9 @@ class CloudVodView(View):
                 format(url_start=url_start, url_end=url_end)
                 format(url_start=url_start, url_end=url_end)
             thumb = bucket.sign_url('GET', ts, 3600,
             thumb = bucket.sign_url('GET', ts, 3600,
                                     params={'x-oss-process': 'video/snapshot,t_10000,m_fast,w_300'})
                                     params={'x-oss-process': 'video/snapshot,t_10000,m_fast,w_300'})
-            vod_play_list.append({'name': vod['time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec']})
+            vod_play_list.append(
+                {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec']})
+        vod_play_list = sorted(vod_play_list, key=lambda item: -item['name'])
         return response.json(0, vod_play_list)
         return response.json(0, vod_play_list)
 
 
     # backend find play list0
     # backend find play list0
@@ -703,20 +536,25 @@ class CloudVodView(View):
         if own_perm is False:
         if own_perm is False:
             return response.json(404)
             return response.json(404)
         nowTime = int(time.time())
         nowTime = int(time.time())
-        vodqs = VodHlsModel.objects.filter(uid=UID, channel=channel, time__range=(startTime, endTime),
-                                           endTime__gte=nowTime) \
-            .values("time", "sec", "bucket__bucket", "bucket__endpoint", "bucket__region", "id")
+        split_vod_hls_obj = SplitVodHlsObject()
+        vodqs = split_vod_hls_obj.get_vod_hls_data(uid=UID, channel=channel, start_time__range=(startTime, endTime),
+                                                   end_time__gte=nowTime).values("start_time", "sec", "bucket_id", "id")
+        if not vodqs.exists():
+            return response.json(173)
+        vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
+        if not vod_bucket_qs.exists():
+            return response.json(173)
+        bucket_name = vod_bucket_qs[0]["bucket"]
+        endpoint = vod_bucket_qs[0]["endpoint"]
         vod_play_list = []
         vod_play_list = []
         print(vodqs)
         print(vodqs)
         auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
         auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
         for vod in vodqs:
         for vod in vodqs:
-            bucket_name = vod["bucket__bucket"]
-            endpoint = vod["bucket__endpoint"]
             bucket = oss2.Bucket(auth, endpoint, bucket_name)
             bucket = oss2.Bucket(auth, endpoint, bucket_name)
             m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
             m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
-                format(uid=UID, channel=channel, time=vod['time'])
+                format(uid=UID, channel=channel, time=vod['start_time'])
             ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
             ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
-                format(uid=UID, channel=channel, time=vod['time'])
+                format(uid=UID, channel=channel, time=vod['start_time'])
             url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
             url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
             urllst = url.split('?')
             urllst = url.split('?')
             url_start = urllib.parse.unquote(urllst[0])
             url_start = urllib.parse.unquote(urllst[0])
@@ -726,7 +564,8 @@ class CloudVodView(View):
             thumb = bucket.sign_url('GET', ts, 3600,
             thumb = bucket.sign_url('GET', ts, 3600,
                                     params={'x-oss-process': 'video/snapshot,t_1000,m_fast,w_300'})
                                     params={'x-oss-process': 'video/snapshot,t_1000,m_fast,w_300'})
             vod_play_list.append(
             vod_play_list.append(
-                {'name': vod['time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'], 'id': vod['id']})
+                {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'], 'id': vod['id']})
+        vod_play_list = sorted(vod_play_list, key=lambda item: -item['name'])
         return response.json(0, vod_play_list)
         return response.json(0, vod_play_list)
 
 
     def do_pay_status(self, request_dict, userID, response):
     def do_pay_status(self, request_dict, userID, response):
@@ -907,17 +746,3 @@ class CloudVodView(View):
                 return response.json(804)
                 return response.json(804)
         else:
         else:
             return response.json(804)
             return response.json(804)
-
-
-def deleteVodHls(request):
-    response = ResponseObject()
-    i = int(request.GET.get('i', 5))
-
-    import time
-    nowTime = int(time.time())
-    for i in range(i):
-        vh_qs = VodHlsModel.objects.filter(time__lte=str(nowTime - 3600 * 24 * 35))[0:10000]
-        id_list = vh_qs.values_list("id", flat=True)
-        print(id_list)
-        VodHlsModel.objects.filter(id__in=list(id_list)).delete()
-    return response.json(0)

+ 9 - 3
Controller/Cron/CronTaskController.py

@@ -26,6 +26,7 @@ from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 LOGGER = logging.getLogger('info')
 LOGGER = logging.getLogger('info')
 
 
@@ -143,10 +144,13 @@ class CronDelDataView(View):
         nowTime = int(time.time())
         nowTime = int(time.time())
         try:
         try:
             cursor = connection.cursor()
             cursor = connection.cursor()
-            month_ago_time = nowTime - 30 * 24 * 60 * 60  # 删除1个月前的数据
+            month_ago_time = nowTime - 3 * 30 * 24 * 60 * 60  # 删除3个月前的数据
             sql = 'DELETE FROM `vod_hls` WHERE endTime<{} LIMIT 50000'.format(month_ago_time)
             sql = 'DELETE FROM `vod_hls` WHERE endTime<{} LIMIT 50000'.format(month_ago_time)
             cursor.execute(sql)
             cursor.execute(sql)
             cursor.close()
             cursor.close()
+            # 删除vod_hls分表数据
+            split_vod_hls_obj = SplitVodHlsObject()
+            split_vod_hls_obj.del_vod_hls_data(end_time__lt=month_ago_time)
             return response.json(0)
             return response.json(0)
         except Exception as e:
         except Exception as e:
             return response.json(500, repr(e))
             return response.json(500, repr(e))
@@ -199,8 +203,10 @@ class CronDelDataView(View):
                 Order_Model.objects.filter(UID__in=uid_list).delete()
                 Order_Model.objects.filter(UID__in=uid_list).delete()
                 StsCrdModel.objects.filter(uid__in=uid_list).delete()
                 StsCrdModel.objects.filter(uid__in=uid_list).delete()
                 VodHlsModel.objects.filter(uid__in=uid_list).delete()
                 VodHlsModel.objects.filter(uid__in=uid_list).delete()
-                ExperienceContextModel.objects.filter(
-                    uid__in=uid_list).delete()
+                # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(uid__in=uid_list)
+                ExperienceContextModel.objects.filter(uid__in=uid_list).delete()
                 Device_Info.objects.filter(userID__in=device_user).delete()
                 Device_Info.objects.filter(userID__in=device_user).delete()
             return response.json(0)
             return response.json(0)
         except Exception as e:
         except Exception as e:

+ 24 - 14
Controller/DetectController.py

@@ -26,7 +26,8 @@ from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, DETECT_PUSH
     JPUSH_CONFIG, FCM_CONFIG, APNS_CONFIG, \
     JPUSH_CONFIG, FCM_CONFIG, APNS_CONFIG, \
     BASE_DIR, APNS_MODE, SERVER_TYPE
     BASE_DIR, APNS_MODE, SERVER_TYPE
 from Ansjer.config import PUSH_REDIS_ADDRESS
 from Ansjer.config import PUSH_REDIS_ADDRESS
-from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel, SysMsgModel
+from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel, SysMsgModel, \
+    VodBucketModel
 from Object.ETkObject import ETkObject
 from Object.ETkObject import ETkObject
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
@@ -34,6 +35,7 @@ from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.EquipmentInfoService import EquipmentInfoService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 
 
 class DetectControllerView(View):
 class DetectControllerView(View):
@@ -139,19 +141,27 @@ class DetectControllerView(View):
                                                          format(uid=devUid, channel=channel, time=eventTime), 300)]
                                                          format(uid=devUid, channel=channel, time=eventTime), 300)]
                 elif p['is_st'] == 2:
                 elif p['is_st'] == 2:
                     # 列表装载回放时间戳标记
                     # 列表装载回放时间戳标记
-                    vodqs = VodHlsModel.objects.filter(uid=devUid, channel=channel, time=int(eventTime)) \
-                        .values("bucket__bucket", "bucket__endpoint")
-                    # print(vodqs)
-                    if vodqs.exists():
-                        bucket_name = vodqs[0]['bucket__bucket']
-                        endpoint = vodqs[0]['bucket__endpoint']
-                        bucket = oss2.Bucket(auth, endpoint, bucket_name)
-                        ts = '{uid}/vod{channel}/{etime}/ts0.ts'.format(uid=devUid, channel=p['Channel'], etime=eventTime)
-                        thumb0 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_0000,w_700'})
-                        thumb1 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_1000,w_700'})
-                        thumb2 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_2000,w_700'})
-                        # thumb3 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_3000,w_700'})
-                        p['img_list'] = [thumb0, thumb1, thumb2]
+                    split_vod_hls_obj = SplitVodHlsObject()
+                    vodqs = split_vod_hls_obj.get_vod_hls_data(uid=devUid, channel=channel, start_time=int(eventTime)).values(
+                        "bucket_id")
+                    if not vodqs.exists():
+                        return response.json(173)
+                    vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
+                    if not vod_bucket_qs.exists():
+                        return response.json(173)
+                    bucket_name = vod_bucket_qs[0]['bucket']
+                    endpoint = vod_bucket_qs[0]['endpoint']
+                    bucket = oss2.Bucket(auth, endpoint, bucket_name)
+                    ts = '{uid}/vod{channel}/{etime}/ts0.ts'.format(uid=devUid, channel=p['Channel'],
+                                                                    etime=eventTime)
+                    thumb0 = bucket.sign_url('GET', ts, 3600,
+                                             params={'x-oss-process': 'video/snapshot,t_0000,w_700'})
+                    thumb1 = bucket.sign_url('GET', ts, 3600,
+                                             params={'x-oss-process': 'video/snapshot,t_1000,w_700'})
+                    thumb2 = bucket.sign_url('GET', ts, 3600,
+                                             params={'x-oss-process': 'video/snapshot,t_2000,w_700'})
+                    # thumb3 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_3000,w_700'})
+                    p['img_list'] = [thumb0, thumb1, thumb2]
                 elif p['is_st'] == 3:
                 elif p['is_st'] == 3:
                     # 列表装载回放时间戳标记
                     # 列表装载回放时间戳标记
                     p['img_list'] = []
                     p['img_list'] = []

+ 35 - 30
Controller/DetectControllerV2.py

@@ -11,8 +11,8 @@ from django.views.generic.base import View
 from Ansjer.config import DETECT_PUSH_DOMAIN, DETECT_PUSH_DOMAINS, DETECT_PUSH_DOMAIN_JIUAN, DETECT_PUSH_DOMAINS_JIUAN, \
 from Ansjer.config import DETECT_PUSH_DOMAIN, DETECT_PUSH_DOMAINS, DETECT_PUSH_DOMAIN_JIUAN, DETECT_PUSH_DOMAINS_JIUAN, \
     OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
     OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
 from Ansjer.config import PUSH_REDIS_ADDRESS
 from Ansjer.config import PUSH_REDIS_ADDRESS
-from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel, CompanyModel, SysMsgModel, \
-    AiService
+from Model.models import Device_Info, Equipment_Info, UidSetModel, UidPushModel, CompanyModel, SysMsgModel, \
+    AiService, VodBucketModel
 from Object.ETkObject import ETkObject
 from Object.ETkObject import ETkObject
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
@@ -20,6 +20,7 @@ from Object.TokenObject import TokenObject
 from Object.utils import LocalDateTimeUtil
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.EquipmentInfoService import EquipmentInfoService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 
 
 class DetectControllerViewV2(View):
 class DetectControllerViewV2(View):
@@ -339,34 +340,38 @@ class DetectControllerViewV2(View):
 
 
                 elif p['is_st'] == 2:
                 elif p['is_st'] == 2:
                     # 列表装载回放时间戳标记
                     # 列表装载回放时间戳标记
-                    vodqs = VodHlsModel.objects.filter(uid=devUid, channel=channel, time=int(eventTime)) \
-                        .values("bucket__bucket", "bucket__endpoint")
-                    # print(vodqs)
-                    if vodqs.exists():
-                        bucket_name = vodqs[0]['bucket__bucket']
-                        endpoint = vodqs[0]['bucket__endpoint']
-                        bucket = oss2.Bucket(auth, endpoint, bucket_name)
-                        ts = '{uid}/vod{channel}/{etime}/ts0.ts'.format(uid=devUid, channel=p['Channel'],
-                                                                        etime=eventTime)
-                        if storage_location == 1:  # oss
-                            thumb0 = bucket.sign_url('GET', ts, 3600,
-                                                     params={'x-oss-process': 'video/snapshot,t_0000,w_700'})
-                            thumb1 = bucket.sign_url('GET', ts, 3600,
-                                                     params={'x-oss-process': 'video/snapshot,t_1000,w_700'})
-                            thumb2 = bucket.sign_url('GET', ts, 3600,
-                                                     params={'x-oss-process': 'video/snapshot,t_2000,w_700'})
-                            # thumb3 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_3000,w_700'})
-                            p['img_list'] = [thumb0, thumb1, thumb2]
-                        elif region == 2 and storage_location == 2:  # 2:国内,aws
-                            thumb = aws_s3_guonei.generate_presigned_url('get_object',
-                                                                         Params={'Bucket': 'push', 'Key': ts},
-                                                                         ExpiresIn=3600)
-                            p['img_list'] = [thumb]
-                        elif region == 1 and storage_location == 2:  # 1:国外,aws
-                            thumb = aws_s3_guowai.generate_presigned_url('get_object',
-                                                                         Params={'Bucket': 'foreignpush', 'Key': ts},
-                                                                         ExpiresIn=3600)
-                            p['img_list'] = [thumb]
+                    split_vod_hls_obj = SplitVodHlsObject()
+                    vodqs = split_vod_hls_obj.get_vod_hls_data(uid=devUid, channel=channel,
+                                                               start_time=int(eventTime)).values("bucket_id")
+                    if not vodqs.exists():
+                        return response.json(173)
+                    vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
+                    if not vod_bucket_qs.exists():
+                        return response.json(173)
+                    bucket_name = vod_bucket_qs[0]['bucket']
+                    endpoint = vod_bucket_qs[0]['endpoint']
+                    bucket = oss2.Bucket(auth, endpoint, bucket_name)
+                    ts = '{uid}/vod{channel}/{etime}/ts0.ts'.format(uid=devUid, channel=p['Channel'],
+                                                                    etime=eventTime)
+                    if storage_location == 1:  # oss
+                        thumb0 = bucket.sign_url('GET', ts, 3600,
+                                                 params={'x-oss-process': 'video/snapshot,t_0000,w_700'})
+                        thumb1 = bucket.sign_url('GET', ts, 3600,
+                                                 params={'x-oss-process': 'video/snapshot,t_1000,w_700'})
+                        thumb2 = bucket.sign_url('GET', ts, 3600,
+                                                 params={'x-oss-process': 'video/snapshot,t_2000,w_700'})
+                        # thumb3 = bucket.sign_url('GET', ts, 3600, params={'x-oss-process': 'video/snapshot,t_3000,w_700'})
+                        p['img_list'] = [thumb0, thumb1, thumb2]
+                    elif region == 2 and storage_location == 2:  # 2:国内,aws
+                        thumb = aws_s3_guonei.generate_presigned_url('get_object',
+                                                                     Params={'Bucket': 'push', 'Key': ts},
+                                                                     ExpiresIn=3600)
+                        p['img_list'] = [thumb]
+                    elif region == 1 and storage_location == 2:  # 1:国外,aws
+                        thumb = aws_s3_guowai.generate_presigned_url('get_object',
+                                                                     Params={'Bucket': 'foreignpush', 'Key': ts},
+                                                                     ExpiresIn=3600)
+                        p['img_list'] = [thumb]
                 elif p['is_st'] == 3 or p['is_st'] == 4:
                 elif p['is_st'] == 3 or p['is_st'] == 4:
                     # 列表装载回放时间戳标记
                     # 列表装载回放时间戳标记
                     p['img_list'] = []
                     p['img_list'] = []

+ 0 - 51
Controller/EquipmentManagerV3.py

@@ -48,10 +48,6 @@ class EquipmentManagerV3(View):
 
 
         if operation == 'notLoginMainUserDevice':
         if operation == 'notLoginMainUserDevice':
             return self.not_login_do_mainUserDevice(request_dict, response)
             return self.not_login_do_mainUserDevice(request_dict, response)
-        elif operation == 'notLoginUserDevice':
-            return self.not_login_get_mainUserDevice(request_dict, response)
-        elif operation == 'notLoginGlobalUserDevice':
-            return self.not_login_get_global_mainUserDevice(request_dict, response)
         elif operation == 'notLoginMainDelDevice':
         elif operation == 'notLoginMainDelDevice':
             return self.test_tool_del_device(request_dict, response)
             return self.test_tool_del_device(request_dict, response)
 
 
@@ -976,53 +972,6 @@ class EquipmentManagerV3(View):
                 qs[0]['phone'] = NickName
                 qs[0]['phone'] = NickName
         return response.json(0, qs)
         return response.json(0, qs)
 
 
-    def not_login_get_mainUserDevice(self, request_dict, response):
-        UID = request_dict.get('UID')
-        token = request_dict.get('token', None)
-        time_stamp = request_dict.get('time_stamp', None)
-
-        if not all([token, time_stamp]):
-            return response.json(444)
-
-        # 时间戳token校验
-        if not CommonService.check_time_stamp_token(token, time_stamp):
-            return response.json(13)
-
-        dvq = Device_Info.objects.filter(UID=UID).values('userID', 'userID__NickName', 'userID__username',
-                                                         'userID__userEmail', 'userID__phone',
-                                                         'vodPrimaryUserID')
-        qs = []
-        for item in dvq:
-            user_dict = {
-                'userID': item['userID'],
-                'NickName': item['userID__NickName'] if item['userID__NickName'] else item['userID__username'],
-                'username': item['userID__username'],
-                'userEmail': item['userID__userEmail'],
-                'phone': item['userID__phone'] if item['userID__phone'] else item['userID__NickName'],
-                'vodPrimaryUserID': item['vodPrimaryUserID']
-            }
-            qs.append(user_dict)
-        return response.json(0, qs)
-
-    def not_login_get_global_mainUserDevice(self, request_dict, response):
-        orders_domain_name_list = SERVER_DOMAIN_LIST
-        if SERVER_DOMAIN_TEST in orders_domain_name_list:
-            orders_domain_name_list.remove(SERVER_DOMAIN_TEST)
-        uid_list = []
-        try:
-            for orders_domain_name in orders_domain_name_list:
-                url = orders_domain_name + 'v3/equipment/notLoginUserDevice'
-                res = requests.post(url=url, data=request_dict)
-                result = res.json()
-                if result['result_code'] != 0:
-                    return response.json(result['result_code'])
-                for item in result['result']:
-                    item['domain_name'] = orders_domain_name
-                    uid_list.append(item)
-            return response.json(0, uid_list)
-        except Exception as e:
-            return response.json(500, repr(e))
-
     @staticmethod
     @staticmethod
     def test_tool_del_device(request_dict, response):
     def test_tool_del_device(request_dict, response):
         """
         """

+ 7 - 0
Controller/UidSetController.py

@@ -32,6 +32,7 @@ from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
 from django.db import transaction
 from django.db import transaction
+from Service.VodHlsService import SplitVodHlsObject
 
 
 '''
 '''
 # 管理员获取信息
 # 管理员获取信息
@@ -166,6 +167,9 @@ class UidSetView(View):
                     Order_Model.objects.filter(UID__in=uid).delete()
                     Order_Model.objects.filter(UID__in=uid).delete()
                     StsCrdModel.objects.filter(uid__in=uid).delete()
                     StsCrdModel.objects.filter(uid__in=uid).delete()
                     VodHlsModel.objects.filter(uid__in=uid).delete()
                     VodHlsModel.objects.filter(uid__in=uid).delete()
+                    # 删除vod_hls分表数据
+                    split_vod_hls_obj = SplitVodHlsObject()
+                    split_vod_hls_obj.del_vod_hls_data(uid__in=uid)
                     ExperienceContextModel.objects.filter(uid__in=uid).delete()
                     ExperienceContextModel.objects.filter(uid__in=uid).delete()
                     Device_Info.objects.filter(UID__in=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
                     Device_Info.objects.filter(UID__in=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
                 if 'Device_Info' in id_list:
                 if 'Device_Info' in id_list:
@@ -511,6 +515,9 @@ class UidSetView(View):
                     Order_Model.objects.filter(UID=uid).delete()
                     Order_Model.objects.filter(UID=uid).delete()
                     StsCrdModel.objects.filter(uid=uid).delete()
                     StsCrdModel.objects.filter(uid=uid).delete()
                     VodHlsModel.objects.filter(uid=uid).delete()
                     VodHlsModel.objects.filter(uid=uid).delete()
+                    # 删除vod_hls分表数据
+                    split_vod_hls_obj = SplitVodHlsObject()
+                    split_vod_hls_obj.del_vod_hls_data(uid=uid)
                     ExperienceContextModel.objects.filter(uid=uid).delete()
                     ExperienceContextModel.objects.filter(uid=uid).delete()
                     # UIDMainUser.objects.filter(UID=uid).delete()
                     # UIDMainUser.objects.filter(UID=uid).delete()
                     Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
                     Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')

+ 4 - 0
Controller/VodBucket.py

@@ -25,6 +25,7 @@ from Object.TokenObject import TokenObject
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
 from django.db import transaction
 from django.db import transaction
 import time
 import time
+from Service.VodHlsService import SplitVodHlsObject
 
 
 
 
 class VodBucketView(View):
 class VodBucketView(View):
@@ -249,6 +250,9 @@ class UidBucketView(View):
                 uid_bucket_qs.delete()
                 uid_bucket_qs.delete()
                 # OssCrdModel.objects.filter(uid=uid, channel=channel).delete()
                 # OssCrdModel.objects.filter(uid=uid, channel=channel).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
                 VodHlsModel.objects.filter(uid=uid).delete()
+                # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(uid=uid)
                 StsCrdModel.objects.filter(uid=uid).delete()
                 StsCrdModel.objects.filter(uid=uid).delete()
                 Unused_Uid_Meal.objects.filter(uid=uid).delete()
                 Unused_Uid_Meal.objects.filter(uid=uid).delete()
         except Exception as e:
         except Exception as e:

+ 31 - 3
Model/models.py

@@ -1304,7 +1304,7 @@ class SysMsgModel(models.Model):
     status = models.SmallIntegerField(verbose_name='是否已读', default=0)  # 0:否,1:是
     status = models.SmallIntegerField(verbose_name='是否已读', default=0)  # 0:否,1:是
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
-    eventType = models.IntegerField(verbose_name='消息类型', default=0)  # 默认系统消息类型,0系统消息,1 ipcamera消息
+    eventType = models.IntegerField(verbose_name='消息类型', default=0)  # 默认系统消息类型,0系统消息,1 ipcamera消息,2 超级密码
     uid = models.CharField(default='', max_length=20, db_index=True, verbose_name='设备UID')
     uid = models.CharField(default='', max_length=20, db_index=True, verbose_name='设备UID')
 
 
     class Meta:
     class Meta:
@@ -1377,7 +1377,8 @@ class UidPushModel(models.Model):
     uid_set = models.ForeignKey(UidSetModel, to_field='id', on_delete=models.CASCADE)
     uid_set = models.ForeignKey(UidSetModel, to_field='id', on_delete=models.CASCADE)
     appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID')
     appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID')
     app_type = models.IntegerField(default=0, verbose_name=u'app类型 1:ios,2:安卓')
     app_type = models.IntegerField(default=0, verbose_name=u'app类型 1:ios,2:安卓')
-    push_type = models.IntegerField(default=0, verbose_name=u'推送类型')  # 0,apns 1,安卓gcm 2,极光
+    push_type = models.IntegerField(default=0,
+                                    verbose_name=u'推送类型')  # 0: apns, 1: 安卓gcm, 2: 极光, 3:华为, 4:小米, 5:vivo, 6:oppo, 7:魅族
     token_val = models.CharField(default='', max_length=500, verbose_name=u'设备验证令牌')
     token_val = models.CharField(default='', max_length=500, verbose_name=u'设备验证令牌')
     m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识')
     m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
@@ -1397,7 +1398,8 @@ class GatewayPush(models.Model):
     user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name=u'用户id')
     user_id = models.CharField(default='', max_length=32, db_index=True, verbose_name=u'用户id')
     app_bundle_id = models.CharField(default='', max_length=32, verbose_name=u'app包id')
     app_bundle_id = models.CharField(default='', max_length=32, verbose_name=u'app包id')
     app_type = models.IntegerField(default=0, verbose_name=u'app类型')  # 1: ios, 2: 安卓
     app_type = models.IntegerField(default=0, verbose_name=u'app类型')  # 1: ios, 2: 安卓
-    push_type = models.IntegerField(default=0, verbose_name=u'推送类型')  # 0: apns, 1: 安卓gcm, 2: 极光
+    push_type = models.IntegerField(default=0,
+                                    verbose_name=u'推送类型')  # 0: apns, 1: 安卓gcm, 2: 极光, 3:华为, 4:小米, 5:vivo, 6:oppo, 7:魅族
     token_val = models.CharField(default='', max_length=500, verbose_name=u'设备验证令牌')
     token_val = models.CharField(default='', max_length=500, verbose_name=u'设备验证令牌')
     m_code = models.CharField(default='', max_length=64, db_index=True, verbose_name='手机唯一标识')
     m_code = models.CharField(default='', max_length=64, db_index=True, verbose_name='手机唯一标识')
     lang = models.CharField(default='en', max_length=8, verbose_name='推送语言')
     lang = models.CharField(default='en', max_length=8, verbose_name='推送语言')
@@ -3334,3 +3336,29 @@ class DeviceSuperPassword(models.Model):
         db_table = 'device_super_password'
         db_table = 'device_super_password'
         verbose_name = '超级密码请求表'
         verbose_name = '超级密码请求表'
         verbose_name_plural = verbose_name
         verbose_name_plural = verbose_name
+
+
+class VodHlsTag(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增id')
+    uid = models.CharField(blank=True, db_index=True, max_length=32, verbose_name=u'设备UID')
+    vod_hls_id = models.IntegerField(default=0, db_index=True, verbose_name='云存hlsId')
+    tab_num = models.SmallIntegerField(default=0, verbose_name='所在表编号')
+    ai_event_time = models.IntegerField(default=0, db_index=True, verbose_name='ai事件事件')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'vod_hls_tag'
+        verbose_name = '云存hls标签'
+        verbose_name_plural = verbose_name
+
+
+class VodHlsTagType(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增id')
+    tag_id = models.IntegerField(default=0, db_index=True, verbose_name='云存关联AI标签ID')
+    type = models.SmallIntegerField(default=0, db_index=True, verbose_name='标签类型')
+    created_time = models.IntegerField(default=0, verbose_name='创建时间')
+
+    class Meta:
+        db_table = 'vod_hls_tag_type'
+        verbose_name = '云存hls关联标签类型'
+        verbose_name_plural = verbose_name

+ 131 - 19
Service/VodHlsService.py

@@ -2,33 +2,46 @@
 # @File      : VodHlsService.py
 # @File      : VodHlsService.py
 # @Time      : 2023/2/1 15:57
 # @Time      : 2023/2/1 15:57
 import datetime
 import datetime
-from Model.models import VodHlsMon, VodHlsTues, VodHlsWed, VodHlsThur, VodHlsFri, VodHlsSat, VodHlsSun
-from Service.CommonService import CommonService
+
+from django.db import connection
 from django.db.models import Count
 from django.db.models import Count
 
 
+from Model.models import VodHlsMon, VodHlsTues, VodHlsWed, VodHlsThur, VodHlsFri, VodHlsSat, VodHlsSun, VodHlsTag, \
+    AiService, VodHlsTagType
+from Service.CommonService import CommonService
+
+
 class SplitVodHlsObject:
 class SplitVodHlsObject:
     # VodHls分表功能类
     # VodHls分表功能类
 
 
-    def creat_vod_hls_data(self, **kwargs):
+    @classmethod
+    def creat_vod_hls_data(cls, **kwargs):
         """
         """
         分表保存云存信息数据
         分表保存云存信息数据
         """
         """
         start_time = kwargs.get('start_time')
         start_time = kwargs.get('start_time')
         week = datetime.datetime.fromtimestamp(int(start_time)).isoweekday()
         week = datetime.datetime.fromtimestamp(int(start_time)).isoweekday()
         if week == 1:
         if week == 1:
-            VodHlsMon.objects.create(**kwargs)
+            vod_hls_mon = VodHlsMon.objects.create(**kwargs)
+            return vod_hls_mon, week
         elif week == 2:
         elif week == 2:
-            VodHlsTues.objects.create(**kwargs)
+            vod_hls_tues = VodHlsTues.objects.create(**kwargs)
+            return vod_hls_tues, week
         elif week == 3:
         elif week == 3:
-            VodHlsWed.objects.create(**kwargs)
+            vod_hls_wed = VodHlsWed.objects.create(**kwargs)
+            return vod_hls_wed, week
         elif week == 4:
         elif week == 4:
-            VodHlsThur.objects.create(**kwargs)
+            vod_hls_thur = VodHlsThur.objects.create(**kwargs)
+            return vod_hls_thur, week
         elif week == 5:
         elif week == 5:
-            VodHlsFri.objects.create(**kwargs)
+            vod_hls_fri = VodHlsFri.objects.create(**kwargs)
+            return vod_hls_fri, week
         elif week == 6:
         elif week == 6:
-            VodHlsSat.objects.create(**kwargs)
+            vod_hls_sat = VodHlsSat.objects.create(**kwargs)
+            return vod_hls_sat, week
         elif week == 7:
         elif week == 7:
-            VodHlsSun.objects.create(**kwargs)
+            vod_hls_sun = VodHlsSun.objects.create(**kwargs)
+            return vod_hls_sun, week
 
 
     def del_vod_hls_data(self, **kwargs):
     def del_vod_hls_data(self, **kwargs):
         """
         """
@@ -85,18 +98,25 @@ class SplitVodHlsObject:
                     day_list.append(week)
                     day_list.append(week)
             for week in day_list:
             for week in day_list:
                 if week == 1:
                 if week == 1:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_mon = VodHlsMon.objects.filter(**kwargs)
                     vod_hls_mon = VodHlsMon.objects.filter(**kwargs)
                 elif week == 2:
                 elif week == 2:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_tus = VodHlsTues.objects.filter(**kwargs)
                     vod_hls_tus = VodHlsTues.objects.filter(**kwargs)
                 elif week == 3:
                 elif week == 3:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_wed = VodHlsWed.objects.filter(**kwargs)
                     vod_hls_wed = VodHlsWed.objects.filter(**kwargs)
                 elif week == 4:
                 elif week == 4:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_thur = VodHlsThur.objects.filter(**kwargs)
                     vod_hls_thur = VodHlsThur.objects.filter(**kwargs)
                 elif week == 5:
                 elif week == 5:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_fri = VodHlsFri.objects.filter(**kwargs)
                     vod_hls_fri = VodHlsFri.objects.filter(**kwargs)
                 elif week == 6:
                 elif week == 6:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_sat = VodHlsSat.objects.filter(**kwargs)
                     vod_hls_sat = VodHlsSat.objects.filter(**kwargs)
                 elif week == 7:
                 elif week == 7:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_sun = VodHlsSun.objects.filter(**kwargs)
                     vod_hls_sun = VodHlsSun.objects.filter(**kwargs)
             vod_hls = vod_hls.union(vod_hls_mon, vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat,
             vod_hls = vod_hls.union(vod_hls_mon, vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat,
                                     vod_hls_sun)
                                     vod_hls_sun)
@@ -109,7 +129,8 @@ class SplitVodHlsObject:
         vod_hls_sat = VodHlsSat.objects.filter(**kwargs)
         vod_hls_sat = VodHlsSat.objects.filter(**kwargs)
         vod_hls_sun = VodHlsSun.objects.filter(**kwargs)
         vod_hls_sun = VodHlsSun.objects.filter(**kwargs)
 
 
-        vod_hls = vod_hls.union(vod_hls_mon, vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat, vod_hls_sun)
+        vod_hls = vod_hls.union(vod_hls_mon, vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat,
+                                vod_hls_sun)
         return vod_hls
         return vod_hls
 
 
     def get_vod_hls_date(self, **kwargs):
     def get_vod_hls_date(self, **kwargs):
@@ -119,19 +140,110 @@ class SplitVodHlsObject:
         """
         """
 
 
         vod_hls_mon = VodHlsMon.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
         vod_hls_mon = VodHlsMon.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
-             'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
+            'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
         vod_hls_tus = VodHlsTues.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
         vod_hls_tus = VodHlsTues.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
-             'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
+            'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
         vod_hls_wed = VodHlsWed.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
         vod_hls_wed = VodHlsWed.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
-             'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
+            'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
         vod_hls_thur = VodHlsThur.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
         vod_hls_thur = VodHlsThur.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
-             'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
+            'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
         vod_hls_fri = VodHlsFri.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
         vod_hls_fri = VodHlsFri.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
-             'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
+            'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
         vod_hls_sat = VodHlsSat.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
         vod_hls_sat = VodHlsSat.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
-             'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
+            'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
         vod_hls_sun = VodHlsSun.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
         vod_hls_sun = VodHlsSun.objects.extra(select={'date': "FROM_UNIXTIME(start_time,'%%Y-%%m-%%d')"}).values(
-             'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
+            'date').filter(**kwargs).annotate(count=Count('start_time')).order_by('-date')
 
 
         vod_hls = vod_hls_mon.union(vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat, vod_hls_sun)
         vod_hls = vod_hls_mon.union(vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat, vod_hls_sun)
-        return vod_hls
+        return vod_hls
+
+    @classmethod
+    def cloud_vod_hls_tag(cls, vod_id, num, uid, start_time):
+        """
+        云存回调信息关联标签
+        @param vod_id: 云存回放信息id
+        @param num: 所在表编号
+        @param uid: 设备UID
+        @param start_time: 云存开始时间
+        @return: True | False
+        """
+        try:
+            # 查询设备是否有使用中的ai服务
+            # ai_service_qs = AiService.objects \
+            #     .filter(uid=uid, detect_status=1, use_status=1, endTime__gt=start_time) \
+            #     .values('detect_group')
+            # if not ai_service_qs.exists():
+            #     return False
+            start_time = int(start_time)
+            end_time = start_time + 5
+            vod_tag_qs = VodHlsTag.objects.filter(ai_event_time__range=(start_time, end_time), uid=uid)
+            if not vod_tag_qs.exists():
+                return False
+            vod_tag_qs.update(vod_hls_id=vod_id, tab_num=num)
+            return True
+        except Exception as e:
+            print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
+
+    @classmethod
+    def vod_query_param(cls, week, **kwargs):
+        vod_ids = cls.query_tag_by_types(kwargs.get('uid'),
+                                         kwargs.get('start_time__range'),
+                                         kwargs.get('type_list'), week)
+        if vod_ids:
+            kwargs['id__in'] = vod_ids
+        kwargs.pop('type_list')
+        return kwargs
+
+    @classmethod
+    def query_tag_by_types(cls, uid, time, types, num):
+        """
+        根据类型查询云存标签关联ID
+        @return:
+        """
+        try:
+            if not types or len(types) == 0:
+                return []
+            cursor = connection.cursor()
+            param_list = [int(time[0]), int(time[1]), uid, num]
+            sql = 'SELECT vod_hls_id FROM '
+            sql += 'vod_hls_tag vht INNER JOIN vod_hls_tag_type vhtt ON vht.id = vhtt.tag_id '
+            sql += 'WHERE vht.ai_event_time >= %s AND vht.ai_event_time <= %s '
+            sql += 'AND vht.uid = %s '
+            sql += 'AND tab_num = %s '
+            if types:
+                sql += 'AND vhtt.type IN %s '
+                param_list.append(types)
+            sql += 'GROUP BY vht.vod_hls_id '
+
+            cursor.execute(sql, param_list)
+            data_list = cursor.fetchall()
+            cursor.close()  # 执行完,关闭
+            connection.close()
+            data_list = [val[0] for val in data_list]
+            return data_list
+        except Exception as e:
+            print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
+
+    @classmethod
+    def query_tag_type_list(cls, vod_id):
+        """
+        根据云存ID获取AI类型
+        @return:
+        """
+        try:
+            cursor = connection.cursor()
+            sql = 'SELECT vhtt.type FROM '
+            sql += 'vod_hls_tag vht INNER JOIN vod_hls_tag_type vhtt ON vht.id = vhtt.tag_id '
+            sql += 'WHERE vht.vod_hls_id = %s  '
+
+            cursor.execute(sql, [vod_id])
+            data_list = cursor.fetchall()
+            cursor.close()  # 执行完,关闭
+            connection.close()
+            data_list = [val[0] for val in data_list]
+            return data_list
+        except Exception as e:
+            print('异常详情,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return []