peng 2 лет назад
Родитель
Сommit
d150f407c0

+ 7 - 0
AdminController/DeviceManagementController.py

@@ -21,6 +21,7 @@ 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):
@@ -328,6 +329,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)
@@ -463,6 +467,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()

+ 1 - 2
AdminController/dataSystemManagement/BusinessDataController.py

@@ -8,10 +8,9 @@
 """
 
 import requests
-from django.db.models import Count, Sum
 from django.views.generic.base import View
 
-from Model.models import VodHlsModel, VodHlsSummary
+from Model.models import VodHlsSummary
 from Service.CommonService import CommonService
 
 

+ 101 - 78
Controller/CloudStorage.py

@@ -39,6 +39,7 @@ 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
 
 
 # 设备信息添加
@@ -284,25 +285,29 @@ 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")
         if not vod_hls_qs.exists():
             return response.json(173)
         fg = int(vod_hls_qs[0]['fg'])
-        bucket__region = vod_hls_qs[0]['bucket__region']
-        bucket_name = vod_hls_qs[0]['bucket__bucket']
-
+        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"]
         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 = []
@@ -312,7 +317,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,
@@ -478,9 +483,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():
@@ -517,14 +525,14 @@ 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'],
@@ -546,9 +554,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: 播放列表名字时间戳
@@ -558,68 +566,75 @@ 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()
+            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)
+
+            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):  # 修改云存状态
@@ -1520,10 +1535,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:
@@ -1677,9 +1698,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:
@@ -1688,7 +1711,7 @@ class CloudStorageView(View):
                 'vod_count': vod['count'],
                 'date_format': vod['date'],
             })
-
+        had_vod_list = sorted(had_vod_list, key=lambda item: -item['timestamp'])
         return response.json(0, had_vod_list)
 
     @staticmethod
@@ -1877,9 +1900,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)

+ 30 - 31
Controller/CloudVod.py

@@ -14,13 +14,15 @@ 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
-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, \
+    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
+from Service.VodHlsService import SplitVodHlsObject
 
 
 # 设备信息添加
@@ -492,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.render(uid=uid, channel=channel, start_time=(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])
@@ -514,7 +521,8 @@ 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']})
         return response.json(0, vod_play_list)
 
     # backend find play list0
@@ -527,20 +535,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])
@@ -550,7 +563,7 @@ 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']})
         return response.json(0, vod_play_list)
 
     def do_pay_status(self, request_dict, userID, response):
@@ -731,17 +744,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)

+ 8 - 2
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')
 
@@ -147,6 +148,9 @@ class CronDelDataView(View):
             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'] = []

+ 34 - 29
Controller/DetectControllerV2.py

@@ -12,13 +12,14 @@ from Ansjer.config import DETECT_PUSH_DOMAIN, DETECT_PUSH_DOMAINS, DETECT_PUSH_D
     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
+    AiService, VodBucketModel
 from Object.ETkObject import ETkObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 class DetectControllerViewV2(View):
@@ -333,34 +334,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'] = []

+ 4 - 0
Controller/SerialNumberController.py

@@ -18,6 +18,7 @@ from Object.uidManageResponseObject import uidManageResponseObject
 from Service.AlgorithmService import AlgorithmBaseOn35
 from Service.CommonService import CommonService
 from Service.EquipmentInfoService import EquipmentInfoService
+from Service.VodHlsService import SplitVodHlsObject
 
 
 class SerialNumberView(View):
@@ -305,6 +306,9 @@ class SerialNumberView(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()
 
                 # 重置AI

+ 31 - 24
Controller/TestApi.py

@@ -21,6 +21,7 @@ from botocore import client
 from Controller.DeviceConfirmRegion import Device_Region
 from Object.AWS.AmazonS3Util import AmazonS3Util
 from Object.RedisObject import RedisObject
+from Service.VodHlsService import SplitVodHlsObject
 
 '''
 http://192.168.136.40:8077/Test
@@ -42,7 +43,7 @@ from django.views.generic.base import View
 from django.contrib.auth.hashers import make_password  # 对密码加密模块
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, AWS_ACCESS_KEY_ID, \
     AWS_SECRET_ACCESS_KEY, SERVER_TYPE, AWS_SES_ACCESS_REGION
-from Model.models import Order_Model, Store_Meal, VodHlsModel, OssCrdModel, StsCrdModel, DeviceLogModel
+from Model.models import Order_Model, Store_Meal, OssCrdModel, StsCrdModel, DeviceLogModel, VodBucketModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
@@ -610,23 +611,24 @@ class testView(View):
         ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel).values('status')
         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")
-        vodqs = VodHlsModel.objects.filter(uid=uid, channel=channel) \
-            .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).values("start_time", "sec", "bucket_id")
+        if not vodqs.exists():
+            return response.json(173)
         vod_play_list = []
-        print(vodqs)
         auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+        bucket_id = vodqs[0]['bucket_id']
+        vod_bucket_qs = VodBucketModel.objects.filter(id=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"]
         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])
@@ -635,7 +637,8 @@ class testView(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']})
         return response.json(0, vod_play_list)
 
     def generate_token(self, request_dict, userID):
@@ -732,7 +735,8 @@ class testView(View):
         month = int(month)
         startTime = CommonService.str_to_timestamp('{year}-{month}'.format(year=year, month=month), '%Y-%m')
         endTime = CommonService.str_to_timestamp('{year}-{month}'.format(year=year, month=month + 1), '%Y-%m') - 1
-        qsTs = VodHlsModel.objects.filter(time__gte=startTime, time__lte=endTime).values('fg')
+        split_vod_hls_obj = SplitVodHlsObject()
+        qsTs = split_vod_hls_obj.get_vod_hls_data(time__gte=startTime, time__lte=endTime).values('fg')
         if not qsTs.exists():
             return HttpResponse('查无数据')
         sumTs = 0  # 总ts个数
@@ -775,22 +779,25 @@ class testView(View):
         storeTime = request_dict.get('time', None)
         now_time = int(time.time())
         try:
-            vh_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, time=storeTime, endTime__gte=now_time). \
-                values("sec", "fg", "bucket__bucket", "bucket__endpoint", "bucket__region", "bucket__mold")
+            split_vod_hls_obj = SplitVodHlsObject()
+            vh_qs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time=storeTime,
+                                                       end_time__gte=now_time).values("sec", "fg", "bucket_id")
             if not vh_qs.exists():
                 return response.json(173)
-            fg = vh_qs[0]['fg']
-            bucket__region = vh_qs[0]['bucket__region']
-            bucket_name = vh_qs[0]['bucket__bucket']
-
+            vod_bucket_qs = VodBucketModel.objects.filter(id=vh_qs[0]['bucket_id']).values('bucket', 'region', 'mold')
+            if not vod_bucket_qs.exists():
+                return response.json(173)
+            fg = int(vh_qs[0]['fg'])
+            bucket_region = vod_bucket_qs[0]['region']
+            bucket_name = vod_bucket_qs[0]['bucket']
+            mold = vod_bucket_qs[0]['mold']
             session = Session(
-                aws_access_key_id=AWS_ACCESS_KEY_ID[vh_qs[0]["bucket__mold"]],
-                aws_secret_access_key=AWS_SECRET_ACCESS_KEY[vh_qs[0]["bucket__mold"]],
-                region_name=bucket__region
+                aws_access_key_id=AWS_ACCESS_KEY_ID[mold],
+                aws_secret_access_key=AWS_SECRET_ACCESS_KEY[mold],
+                region_name=bucket_region
             )
             conn = session.client('s3')
             playlist_entries = []
-            fg = int(fg)
             # ts_count = fg & 0xf
             # fg 64位整型,低四位代表ts文件总数,然后进行位运算,一次移四位,每四位转为十进制即为当前ts文件的秒数
             for i in range(15):

+ 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:

+ 73 - 7
Service/VodHlsService.py

@@ -4,7 +4,7 @@
 from Model.models import VodHlsMon, VodHlsTues, VodHlsWed, VodHlsThur, VodHlsFri, VodHlsSat, VodHlsSun
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
-
+from django.db.models import Count
 
 class SplitVodHlsObject:
     # VodHls分表功能类
@@ -12,13 +12,7 @@ class SplitVodHlsObject:
     def creat_vod_hls_data(self, **kwargs):
         """
         分表保存云存信息数据
-        @return: None
         """
-        vod_hls_obj = self.get_vod_hls_obj(**kwargs)
-        vod_hls_obj.save()
-
-    @staticmethod
-    def get_vod_hls_obj(**kwargs):
         start_time = kwargs.get('start_time')
         str_date = CommonService.get_now_time_str(n_time=start_time, tz='0', lang='cn')[:10]
         week = LocalDateTimeUtil.date_to_week(str_date)
@@ -37,4 +31,76 @@ class SplitVodHlsObject:
             vod_hls = VodHlsSat(**kwargs)
         elif week == 7:
             vod_hls = VodHlsSun(**kwargs)
+        vod_hls.save()
+
+    def del_vod_hls_data(self, **kwargs):
+        """
+        分表删除云存信息数据
+        """
+        VodHlsMon.objects.filter(**kwargs).delete()
+        VodHlsTues.objects.filter(**kwargs).delete()
+        VodHlsWed.objects.filter(**kwargs).delete()
+        VodHlsThur.objects.filter(**kwargs).delete()
+        VodHlsFri.objects.filter(**kwargs).delete()
+        VodHlsSat.objects.filter(**kwargs).delete()
+        VodHlsSun.objects.filter(**kwargs).delete()
+
+    def get_vod_hls_data(self, **kwargs):
+        """
+        分表获取云存信息数据
+        @return: vod_hls
+        """
+        if 'start_time' in kwargs:
+            start_time = kwargs.get('start_time')
+            str_date = CommonService.get_now_time_str(n_time=start_time, tz='0', lang='cn')[:10]
+            week = LocalDateTimeUtil.date_to_week(str_date)
+            vod_hls = None
+            if week == 1:
+                vod_hls = VodHlsMon.objects.filter(**kwargs)
+            elif week == 2:
+                vod_hls = VodHlsTues.objects.filter(**kwargs)
+            elif week == 3:
+                vod_hls = VodHlsWed.objects.filter(**kwargs)
+            elif week == 4:
+                vod_hls = VodHlsThur.objects.filter(**kwargs)
+            elif week == 5:
+                vod_hls = VodHlsFri.objects.filter(**kwargs)
+            elif week == 6:
+                vod_hls = VodHlsSat.objects.filter(**kwargs)
+            elif week == 7:
+                vod_hls = VodHlsSun.objects.filter(**kwargs)
+            return vod_hls
+        vod_hls_mon = VodHlsMon.objects.filter(**kwargs)
+        vod_hls_tus = VodHlsTues.objects.filter(**kwargs)
+        vod_hls_wed = VodHlsWed.objects.filter(**kwargs)
+        vod_hls_thur = VodHlsThur.objects.filter(**kwargs)
+        vod_hls_fri = VodHlsFri.objects.filter(**kwargs)
+        vod_hls_sat = VodHlsSat.objects.filter(**kwargs)
+        vod_hls_sun = VodHlsSun.objects.filter(**kwargs)
+
+        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
+
+    def get_vod_hls_date(self, **kwargs):
+        """
+        分表获取云存日期信息数据
+        @return: vod_hls
+        """
+
+        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')
+        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')
+        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')
+        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')
+        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')
+        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')
+        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')
+
+        vod_hls = vod_hls_mon.union(vod_hls_tus, vod_hls_wed, vod_hls_thur, vod_hls_fri, vod_hls_sat, vod_hls_sun)[:31]
+        return vod_hls