Ver Fonte

云存分表功能上线

peng há 2 anos atrás
pai
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
 from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
     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.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
 from Service.ModelService import ModelService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 class DeviceManagement(View):
@@ -329,6 +331,9 @@ class DeviceManagement(View):
                 Order_Model.objects.filter(UID=uid, order_type=0).delete()
                 StsCrdModel.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()
                 Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
             return response.json(0)
@@ -475,6 +480,9 @@ class DeviceManagement(View):
                     UID_Bucket.objects.filter(uid__in=uidList).delete()
                     StsCrdModel.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()
                     ExperienceContextModel.objects.filter(uid__in=uidList).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()
                 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()
                 # 删除AI
                 ExperienceAiModel.objects.filter(uid=uid).delete()

+ 112 - 85
Controller/CloudStorage.py

@@ -7,16 +7,16 @@ import logging
 import ssl
 import sys
 import time
-import jwt
 from decimal import Decimal
 from itertools import groupby
 from operator import itemgetter
 from urllib.parse import quote, parse_qs, unquote
 
 import boto3
+import jwt
 import paypalrestsdk
 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.views.generic.base import View
 
@@ -27,7 +27,7 @@ from Controller.CloudPhoto.CloudServiceController import CloudServiceController
 from Controller.PaymentCycle import Paypal
 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, \
-    VideoPlaybackTimeModel, CouponModel, VodBucketModel, VodHlsSummary
+    VideoPlaybackTimeModel, CouponModel, VodBucketModel, VodHlsSummary, VodHlsTag
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.AWS.S3Email import S3Email
 from Object.AliPayObject import AliPayObject
@@ -40,9 +40,12 @@ from Object.WechatPayObject import WechatPayObject
 from Object.m3u8generate import PlaylistGenerator
 from Service.CommonService import CommonService
 from Service.PayService import PaymentService
+from Service.VodHlsService import SplitVodHlsObject
+
 ssl._create_default_https_context = ssl._create_unverified_context
 LOGGER = logging.getLogger('info')
 
+
 # 设备信息添加
 class CloudStorageView(View):
 
@@ -286,25 +289,30 @@ class CloudStorageView(View):
         """
         uid_token = request_dict.get('uid', 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)
         uid = jwt.decode(uid_token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256').get('uid', '')
         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():
             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'])
-        bucket__region = vod_hls_qs[0]['bucket__region']
-        bucket_name = vod_hls_qs[0]['bucket__bucket']
-
         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 = []
@@ -314,7 +322,7 @@ class CloudStorageView(View):
             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=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)
                 playlist_entries.append({
                     'name': response_url,
@@ -390,7 +398,7 @@ class CloudStorageView(View):
                         "Effect": "Allow",
                         "Action": "s3:*",
                         "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,
         })
 
-        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 = []
         if not vod_hls_qs.exists():
@@ -519,21 +530,21 @@ class CloudStorageView(View):
 
         for vod in vod_hls_qs:
             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)
             vod_url = '{server_domain}cloudstorage/signplaym3u8?' \
                       '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
             vod_play_list.append({
-                'start_time': vod['time'],
+                'start_time': vod['start_time'],
                 'sign_url': vod_url,
                 'thumb': response_url,
                 'sec': vod['sec'],
                 '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())
         if uid == 'UWE2ZJ52SE4FX75U111A':
             logger.info({
@@ -548,9 +559,9 @@ class CloudStorageView(View):
         return response.json(0, vod_play_list)
 
     @staticmethod
-    def do_store_playlist(request_dict, response):  # 设备调用,上传视频到s3,同时把视频数据信息传给服务器,服务器存储播放内容
+    def do_store_playlist(request_dict, response):
         """
-        存储设备上传数据
+        存储设备上传云存信息数据
         @param request_dict: 请求数据
         @request_dict uidToken: uid_token
         @request_dict time: 播放列表名字时间戳
@@ -560,68 +571,76 @@ class CloudStorageView(View):
         @return: response
         """
         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)
         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)
         uid_obj = UidTokenObject(uid_token)
         if uid_obj.flag is False:
             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()
             store_day = uid_bucket['bucket__storeDay']
             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:
-                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
     def do_change_vod_status(request_dict, user_id, response):  # 修改云存状态
@@ -1524,10 +1543,16 @@ class CloudStorageView(View):
         try:
             if is_del_all == 1:
                 VodHlsModel.objects.filter(uid=uid).delete()
+                # 删除vod_hls分表数据
+                split_vod_hls_obj = SplitVodHlsObject()
+                split_vod_hls_obj.del_vod_hls_data(uid=uid)
             else:
                 if type(vod_id_list).__name__ != 'list':
                     return response.json(444)
                 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:
             return response.json(424, repr(e))
         else:
@@ -1681,9 +1706,11 @@ class CloudStorageView(View):
         if not uid_bucket_qs.exists():
             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 = []
         for vod in vod_hls_qs:
@@ -1692,7 +1719,7 @@ class CloudStorageView(View):
                 'vod_count': vod['count'],
                 'date_format': vod['date'],
             })
-
+        had_vod_list = sorted(had_vod_list, key=lambda item: -item['timestamp'])[:31]
         return response.json(0, had_vod_list)
 
     @staticmethod
@@ -1881,9 +1908,9 @@ class CloudStorageView(View):
         if not all([order_id, refund_amount]):
             return response.json(444)
         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():
                 return response.json(173)
 

+ 4 - 1
Controller/CloudTransfer.py

@@ -18,6 +18,7 @@ from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 class cloudTestView(View):
@@ -112,7 +113,9 @@ class cloudTestView(View):
                 Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID=vodPrimaryUserID,
                                                            vodPrimaryMaster=vodPrimaryMaster)
                 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:
                     serial_number = CommonService.query_serial_with_uid(uid)
                 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 math
 import time
 import urllib
-import datetime
-import boto3
 
-from Object.AliPayObject import AliPayObject
+import boto3
 import oss2
 import paypalrestsdk
-import logging
 from aliyunsdkcore import client
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 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.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, \
-    VodHlsSummary, LogModel
+    VodBucketModel
+from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
 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):
         response = ResponseObject()
-        # operation => cloudVod/path
         if operation is None:
             return response.json(444, 'error path')
         if operation == 'getSts':
@@ -95,8 +52,6 @@ class CloudVodView(View):
         # 付款完成
         elif operation == 'payExecute':
             return self.do_paypal_execute(request_dict, response)
-        elif operation == 'storeplaylist':
-            return self.do_store_palylist(request_dict, response)
         elif operation == 'payOK':
             return self.do_pay_ok()
         elif operation == 'payError':
@@ -441,90 +396,6 @@ class CloudVodView(View):
                 return HttpResponse(json.dumps(res, ensure_ascii=False),
                                     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):
         paymentId = request_dict.get('paymentId', None)
         PayerID = request_dict.get('PayerID', None)
@@ -611,51 +482,6 @@ class CloudVodView(View):
             format(uidToken=utko.token, SERVER_DOMAIN=SERVER_DOMAIN)
         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):
         startTime = int(request_dict.get('startTime', None))
         endTime = int(request_dict.get('endTime', None))
@@ -668,20 +494,25 @@ class CloudVodView(View):
         if not ubqs.exists():
             return response.json(10, '设备未购买')
         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 = []
         print(vodqs)
         auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
         for vod in vodqs:
-            bucket_name = vod["bucket__bucket"]
-            endpoint = vod["bucket__endpoint"]
             bucket = oss2.Bucket(auth, endpoint, bucket_name)
             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'. \
-                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'})
             urllst = url.split('?')
             url_start = urllib.parse.unquote(urllst[0])
@@ -690,7 +521,9 @@ class CloudVodView(View):
                 format(url_start=url_start, url_end=url_end)
             thumb = bucket.sign_url('GET', ts, 3600,
                                     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)
 
     # backend find play list0
@@ -703,20 +536,25 @@ class CloudVodView(View):
         if own_perm is False:
             return response.json(404)
         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 = []
         print(vodqs)
         auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
         for vod in vodqs:
-            bucket_name = vod["bucket__bucket"]
-            endpoint = vod["bucket__endpoint"]
             bucket = oss2.Bucket(auth, endpoint, bucket_name)
             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'. \
-                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'})
             urllst = url.split('?')
             url_start = urllib.parse.unquote(urllst[0])
@@ -726,7 +564,8 @@ class CloudVodView(View):
             thumb = bucket.sign_url('GET', ts, 3600,
                                     params={'x-oss-process': 'video/snapshot,t_1000,m_fast,w_300'})
             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)
 
     def do_pay_status(self, request_dict, userID, response):
@@ -907,17 +746,3 @@ class CloudVodView(View):
                 return response.json(804)
         else:
             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.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
+from Service.VodHlsService import SplitVodHlsObject
 
 LOGGER = logging.getLogger('info')
 
@@ -143,10 +144,13 @@ class CronDelDataView(View):
         nowTime = int(time.time())
         try:
             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)
             cursor.execute(sql)
             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)
         except Exception as e:
             return response.json(500, repr(e))
@@ -199,8 +203,10 @@ class CronDelDataView(View):
                 Order_Model.objects.filter(UID__in=uid_list).delete()
                 StsCrdModel.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()
             return response.json(0)
         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, \
     BASE_DIR, APNS_MODE, SERVER_TYPE
 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.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
@@ -34,6 +35,7 @@ from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 class DetectControllerView(View):
@@ -139,19 +141,27 @@ class DetectControllerView(View):
                                                          format(uid=devUid, channel=channel, time=eventTime), 300)]
                 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:
                     # 列表装载回放时间戳标记
                     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, \
     OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
 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.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
@@ -20,6 +20,7 @@ from Object.TokenObject import TokenObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 class DetectControllerViewV2(View):
@@ -339,34 +340,38 @@ class DetectControllerViewV2(View):
 
                 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:
                     # 列表装载回放时间戳标记
                     p['img_list'] = []

+ 0 - 51
Controller/EquipmentManagerV3.py

@@ -48,10 +48,6 @@ class EquipmentManagerV3(View):
 
         if operation == 'notLoginMainUserDevice':
             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':
             return self.test_tool_del_device(request_dict, response)
 
@@ -976,53 +972,6 @@ class EquipmentManagerV3(View):
                 qs[0]['phone'] = NickName
         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
     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.ModelService import ModelService
 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()
                     StsCrdModel.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()
                     Device_Info.objects.filter(UID__in=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
                 if 'Device_Info' in id_list:
@@ -511,6 +515,9 @@ class UidSetView(View):
                     Order_Model.objects.filter(UID=uid).delete()
                     StsCrdModel.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()
                     # UIDMainUser.objects.filter(UID=uid).delete()
                     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 django.db import transaction
 import time
+from Service.VodHlsService import SplitVodHlsObject
 
 
 class VodBucketView(View):
@@ -249,6 +250,9 @@ class UidBucketView(View):
                 uid_bucket_qs.delete()
                 # OssCrdModel.objects.filter(uid=uid, channel=channel).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()
                 Unused_Uid_Meal.objects.filter(uid=uid).delete()
         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:是
     addTime = 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')
 
     class Meta:
@@ -1377,7 +1377,8 @@ class UidPushModel(models.Model):
     uid_set = models.ForeignKey(UidSetModel, to_field='id', on_delete=models.CASCADE)
     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:安卓')
-    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'设备验证令牌')
     m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识')
     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')
     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: 安卓
-    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'设备验证令牌')
     m_code = models.CharField(default='', max_length=64, db_index=True, 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'
         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
 # @Time      : 2023/2/1 15:57
 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 Model.models import VodHlsMon, VodHlsTues, VodHlsWed, VodHlsThur, VodHlsFri, VodHlsSat, VodHlsSun, VodHlsTag, \
+    AiService, VodHlsTagType
+from Service.CommonService import CommonService
+
+
 class SplitVodHlsObject:
     # VodHls分表功能类
 
-    def creat_vod_hls_data(self, **kwargs):
+    @classmethod
+    def creat_vod_hls_data(cls, **kwargs):
         """
         分表保存云存信息数据
         """
         start_time = kwargs.get('start_time')
         week = datetime.datetime.fromtimestamp(int(start_time)).isoweekday()
         if week == 1:
-            VodHlsMon.objects.create(**kwargs)
+            vod_hls_mon = VodHlsMon.objects.create(**kwargs)
+            return vod_hls_mon, week
         elif week == 2:
-            VodHlsTues.objects.create(**kwargs)
+            vod_hls_tues = VodHlsTues.objects.create(**kwargs)
+            return vod_hls_tues, week
         elif week == 3:
-            VodHlsWed.objects.create(**kwargs)
+            vod_hls_wed = VodHlsWed.objects.create(**kwargs)
+            return vod_hls_wed, week
         elif week == 4:
-            VodHlsThur.objects.create(**kwargs)
+            vod_hls_thur = VodHlsThur.objects.create(**kwargs)
+            return vod_hls_thur, week
         elif week == 5:
-            VodHlsFri.objects.create(**kwargs)
+            vod_hls_fri = VodHlsFri.objects.create(**kwargs)
+            return vod_hls_fri, week
         elif week == 6:
-            VodHlsSat.objects.create(**kwargs)
+            vod_hls_sat = VodHlsSat.objects.create(**kwargs)
+            return vod_hls_sat, week
         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):
         """
@@ -85,18 +98,25 @@ class SplitVodHlsObject:
                     day_list.append(week)
             for week in day_list:
                 if week == 1:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_mon = VodHlsMon.objects.filter(**kwargs)
                 elif week == 2:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_tus = VodHlsTues.objects.filter(**kwargs)
                 elif week == 3:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_wed = VodHlsWed.objects.filter(**kwargs)
                 elif week == 4:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_thur = VodHlsThur.objects.filter(**kwargs)
                 elif week == 5:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_fri = VodHlsFri.objects.filter(**kwargs)
                 elif week == 6:
+                    kwargs = self.vod_query_param(week, **kwargs)
                     vod_hls_sat = VodHlsSat.objects.filter(**kwargs)
                 elif week == 7:
+                    kwargs = self.vod_query_param(week, **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)
@@ -109,7 +129,8 @@ class SplitVodHlsObject:
         vod_hls_sat = VodHlsSat.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
 
     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(
-             '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(
-             '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(
-             '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(
-             '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(
-             '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(
-             '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(
-             '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)
-        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 []