浏览代码

kvs获取设备列表

peng 2 年之前
父节点
当前提交
cd1fba93be

+ 8 - 5
AdminController/ServeManagementController.py

@@ -711,30 +711,32 @@ class serveManagement(View):
             wt_sheet.write(row_start, 3, refund_total)
             wt_sheet.write(row_start, 4, refund_count)
             wt_sheet.write(row_start, 5, paid_total)
-            wt_sheet.write(row_start, 8, label=xlwt.Formula('f{row}-h{row}'.format(row=row_start + 1)))
+            wt_sheet.write(row_start, 8, label=xlwt.Formula('f{row}-h{row}+g{row}'.format(row=row_start + 1)))
             row_start += 1
             #  第二部分表格填写
             row_start += 2
             paypal_money = 0
+            fee_money = 0
             for row in range(rd_sheet.nrows):
                 if row == 0:
                     wt_sheet.write(row_start, 0, '是否匹配账单')
                     for col in range(rd_sheet.ncols):
                         value = rd_sheet.cell_value(row, col)
                         temp_col = col + 1
-                        wt_sheet.write(row_start, temp_col, value)
+                        wt_sheet.write(row_start, temp_col, str(value))
                     row_start += 1
                     continue
                 if rd_sheet.cell_value(row, 0) == '合计':
                     break
-                paypal_money += rd_sheet.cell_value(row, 5)
+                paypal_money += rd_sheet.cell_value(row, 7)
+                fee_money += rd_sheet.cell_value(row, 6)
                 transaction_id = rd_sheet.cell_value(row, 9)
                 order_qs = all_order_qs.filter(trade_no=transaction_id)
                 if not order_qs.exists():
                     col_value_list = rd_sheet.row_values(row)
                     col_value_list.insert(0, '否')
                     for index, value in enumerate(col_value_list):
-                        wt_sheet.write(row_start, index, value)
+                        wt_sheet.write(row_start, index, str(value))
                     row_start += 1
 
             # 第三部分表格填写
@@ -767,8 +769,9 @@ class serveManagement(View):
                             content = '部分退款'
                     if col in [11, 12]:
                         content = CommonService.timestamp_to_str(int(content))
-                    wt_sheet.write(row_start, col + 1, content)
+                    wt_sheet.write(row_start, col + 1, str(content))
                 row_start += 1
+            wt_sheet.write(1, 6, fee_money)
             wt_sheet.write(1, 7, paypal_money)
 
             res = HttpResponse(content_type='application/vnd.ms-excel')

+ 115 - 7
Controller/AWS/KVSController.py

@@ -7,12 +7,14 @@
 import hashlib
 import time
 import uuid
+import datetime
+
+import pytz
 from django.views import View
 
-from Model.models import KVS, Device_User
+from Model.models import KVS, Device_User, Device_Info
 from Object.AWS.AmazonKVSUtil import AmazonKVSObject
-from Object.AWS.AmazonKVAMUtil import AmazonKVAMObject
-from Object.AWS.AmazonKinesisVideoUtil import AmazonKinesisVideoObject
+from Object.AWS.AmazonKinesisVideoUtil import AmazonKinesisVideoObject, AmazonKVAMObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Ansjer.config import ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, SERVER_DOMAIN
@@ -40,7 +42,17 @@ class UserRelatedView(View):
         elif operation == 'confirm-login':  # app确认登录
             return self.confirm_login(request_dict, response)
         else:
-            return response.json(404)
+            tko = TokenObject(
+                request.META.get('HTTP_AUTHORIZATION'),
+                returntpye='pc')
+            if tko.code != 0:
+                return response.json(tko.code)
+            response.lang = tko.lang
+            user_id = tko.userID
+            if operation == 'get-device':  # 获取设备列表
+                return self.get_device(request_dict, response, user_id)
+            else:
+                return response.json(404)
 
     @staticmethod
     def generate_qr_code(request_dict, response):
@@ -89,7 +101,8 @@ class UserRelatedView(View):
             if tko.code != 0:
                 return response.json(tko.code)
             user_id = tko.userID
-            device_user_qs = Device_User.objects.filter(userID=user_id).values('NickName', 'userIconPath', 'userIconUrl')
+            device_user_qs = Device_User.objects.filter(userID=user_id).values('NickName', 'userIconPath',
+                                                                               'userIconUrl')
             if not device_user_qs.exists():
                 user_icon_url = ''
                 nick_name = ''
@@ -133,6 +146,22 @@ class UserRelatedView(View):
             print(e)
             return response.json(500)
 
+    @staticmethod
+    def get_device(request_dict, response, user_id):
+        """
+        获取设备列表
+        @param request_dict: 请求参数
+        @param response: 响应对象
+        @param user_id: 用户id
+        @return: response
+        """
+        try:
+            device_qs = Device_Info.objects.filter(userID=user_id).values('serial_number', 'NickName')
+            return response.json(0, list(device_qs))
+        except Exception as e:
+            print(e)
+            return response.json(500)
+
 
 class KVSView(View):
     def get(self, request, *args, **kwargs):
@@ -154,7 +183,17 @@ class KVSView(View):
         elif operation == 'get-hls-midea':  # 修改视频流数据保留时间
             return self.get_hls_midea_url(request_dict, response)
         else:
-            return response.json(404)
+            tko = TokenObject(
+                request.META.get('HTTP_AUTHORIZATION'),
+                returntpye='pc')
+            if tko.code != 0:
+                return response.json(tko.code)
+            response.lang = tko.lang
+            user_id = tko.userID
+            if operation == 'get-device-midea_list':  # 获取设备列表
+                return self.get_device_midea_list(request_dict, response)
+            else:
+                return response.json(404)
 
     @staticmethod
     def create_media(request_dict, response):
@@ -224,7 +263,22 @@ class KVSView(View):
 
     @staticmethod
     def get_hls_midea_url(request_dict, response):
+        """
+        获取视频播放地址
+        @param request_dict: 请求参数
+        @request_dict serial_number: 序列号
+        @request_dict startTime: 开始时间
+        @request_dict endTime: 结束时间
+        @param response: 响应对象
+        @return: response
+        """
         serial_number = request_dict.get('serial_number', None)
+        start_time = request_dict.get('startTime', None)
+        end_time = request_dict.get('endTime', None)
+        if not all([serial_number, start_time, end_time]):
+            return response.json(444)
+        start_time = datetime.datetime.fromtimestamp(int(start_time)).astimezone(pytz.utc)
+        end_time = datetime.datetime.fromtimestamp(int(end_time)).astimezone(pytz.utc)
         try:
             # kvs_qs = KVS.objects.filter(stream_name=serial_number)
             # if not kvs_qs.exists():
@@ -236,8 +290,62 @@ class KVSView(View):
                 stream_name=serial_number,
                 api_name='GET_HLS_STREAMING_SESSION_URL'
             )
-            hls_streaming_session_url = kinesis_video_obj.get_hls_streaming_session_url(serial_number)
+            hls_streaming_session_url = kinesis_video_obj.get_hls_streaming_session_url(serial_number, start_time,
+                                                                                        end_time)
             return response.json(0, {"HlsStreamingSessionUrl": hls_streaming_session_url})
         except Exception as e:
             print(e)
             return response.json(500, repr(e))
+
+    @staticmethod
+    def get_device_midea_list(request_dict, response):
+        """
+        获取视频播放列表
+        @param request_dict: 请求参数
+        @request_dict serial_number: 序列号
+        @request_dict startTime: 开始时间
+        @request_dict endTime: 结束时间
+        @param response: 响应对象
+        @return: response
+        """
+        serial_number = request_dict.get('serial_number', None)
+        start_time = request_dict.get('startTime', None)
+        end_time = request_dict.get('endTime', None)
+        page = request_dict.get('page', None)
+        size = request_dict.get('size', None)
+        if not all([serial_number, start_time, end_time, page, size]):
+            return response.json(444)
+        page = int(page)
+        size = int(size)
+        start_time = datetime.datetime.fromtimestamp(int(start_time)).astimezone(pytz.utc)
+        end_time = datetime.datetime.fromtimestamp(int(end_time)).astimezone(pytz.utc)
+        try:
+            # kvs_qs = KVS.objects.filter(stream_name=serial_number)
+            # if not kvs_qs.exists():
+            #     return response.json(174)
+            kinesis_fragments_obj = AmazonKVAMObject(
+                aws_access_key_id='AKIA2E67UIMD45Y3HL53',
+                secret_access_key='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',
+                region_name='us-east-1',
+                stream_name=serial_number,
+                api_name='LIST_FRAGMENTS'
+            )
+            kinesis_images_obj = AmazonKVAMObject(
+                aws_access_key_id='AKIA2E67UIMD45Y3HL53',
+                secret_access_key='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',
+                region_name='us-east-1',
+                stream_name=serial_number,
+                api_name='GET_IMAGES'
+            )
+            stream_list = kinesis_fragments_obj.get_list_fragments(serial_number, start_time, end_time)[
+                          (page - 1) * size:page * size]
+            for item in stream_list:
+                temp_start_time = item['startTime'].astimezone(pytz.utc)
+                temp_end_time = temp_start_time + datetime.timedelta(seconds=300)
+                item['image'] = kinesis_images_obj.get_images(serial_number, temp_start_time, temp_end_time)
+                item['startTime'] = int(time.mktime(item['startTime'].timetuple()))
+                item['endTime'] = int(time.mktime(item['endTime'].timetuple()))
+            return response.json(0, stream_list)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 0 - 33
Object/AWS/AmazonKVAMUtil.py

@@ -1,33 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-@Author : Rocky
-@Time : 2022/10/17 16:57
-@File :AmazonKVSUtil.py
-"""
-import boto3
-from Object.AWS.AmazonKinesisVideoUtil import AmazonKinesisVideoObject
-
-
-class AmazonKVAMObject:
-    def __init__(self, aws_access_key_id, secret_access_key, region_name, stream_name, api_name):
-        self.access_id = aws_access_key_id
-        self.access_secret = secret_access_key
-        self.region_name = region_name
-        self.kv_client_conn = AmazonKinesisVideoObject(aws_access_key_id, secret_access_key, region_name)
-        self.endpoint = self.kv_client_conn.get_data_endpoint(stream_name, api_name)
-        self.kvam_client_coon = boto3.client(
-            'kinesis-video-archived-media',
-            endpoint_url=self.endpoint,
-            aws_access_key_id=aws_access_key_id,
-            aws_secret_access_key=secret_access_key,
-            region_name=region_name
-        )
-
-    def get_hls_streaming_session_url(self, stream_name):
-        """
-        获取视频流数据保留时间
-        @param stream_name: 视频流名称
-        @return HLSStreamingSessionURL: 媒体播放器可用于检索HLS主播放列表的URL
-        """
-        return self.kvam_client_coon.get_hls_streaming_session_url(StreamName=stream_name)['HLSStreamingSessionURL']
-

+ 92 - 0
Object/AWS/AmazonKinesisVideoUtil.py

@@ -4,6 +4,8 @@
 @Time : 2022/10/18 17:13
 @File :AmazonKinesisVideoUtil.py
 """
+import datetime
+
 import boto3
 
 
@@ -12,6 +14,7 @@ class AmazonKinesisVideoObject:
     Amazon Kinesis Video Streams对象
     api文档链接: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/kinesisvideo.html
     """
+
     def __init__(self, aws_access_key_id, secret_access_key, region_name):
         self.access_id = aws_access_key_id
         self.access_secret = secret_access_key
@@ -70,3 +73,92 @@ class AmazonKinesisVideoObject:
         @return stream_info: 视频流信息数据
         """
         return self.client_conn.get_data_endpoint(StreamName=stream_name, APIName=api_name)['DataEndpoint']
+
+
+class AmazonKVAMObject:
+    def __init__(self, aws_access_key_id, secret_access_key, region_name, stream_name, api_name):
+        self.access_id = aws_access_key_id
+        self.access_secret = secret_access_key
+        self.region_name = region_name
+        self.kv_client_conn = AmazonKinesisVideoObject(aws_access_key_id, secret_access_key, region_name)
+        self.endpoint = self.kv_client_conn.get_data_endpoint(stream_name, api_name)
+        self.kvam_client_coon = boto3.client(
+            'kinesis-video-archived-media',
+            endpoint_url=self.endpoint,
+            aws_access_key_id=aws_access_key_id,
+            aws_secret_access_key=secret_access_key,
+            region_name=region_name
+        )
+
+    def get_hls_streaming_session_url(self, stream_name, start_time, end_time):
+        """
+        获取视频流数据保留时间
+        @param stream_name: 视频流名称
+        @param start_time: 开始时间
+        @param end_time: 结束时间
+        @return HLSStreamingSessionURL: 媒体播放器可用于检索HLS主播放列表的URL
+        """
+        return self.kvam_client_coon.get_hls_streaming_session_url(StreamName=stream_name,
+                                                                   PlaybackMode='ON_DEMAND',
+                                                                   HLSFragmentSelector={
+                                                                       'FragmentSelectorType': 'PRODUCER_TIMESTAMP',
+                                                                       'TimestampRange': {
+                                                                           'StartTimestamp': start_time,
+                                                                           'EndTimestamp': end_time
+                                                                       }
+                                                                   },
+                                                                   ContainerFormat='FRAGMENTED_MP4',
+                                                                   DiscontinuityMode='ON_DISCONTINUITY',
+                                                                   DisplayFragmentTimestamp='NEVER',
+                                                                   Expires=43200,
+                                                                   MaxMediaPlaylistFragmentResults=5000)[
+            'HLSStreamingSessionURL']
+
+    def get_list_fragments(self, stream_name, start_time, end_time):
+        """
+        获取视频流片段
+        @param stream_name: 视频流名称
+        @param start_time: 开始时间
+        @param end_time: 结束时间
+        @return HLSStreamingSessionURL: 视频流片段列表信息
+        """
+        stream_list = []
+        result = self.kvam_client_coon.list_fragments(StreamName=stream_name, FragmentSelector={
+            'FragmentSelectorType': 'PRODUCER_TIMESTAMP',
+            'TimestampRange': {
+                'StartTimestamp': start_time,
+                'EndTimestamp': end_time
+            }}, MaxResults=1000)
+        fragments_list = result['Fragments']
+        while 'NextToken' in result:
+            result = self.kvam_client_coon.list_fragments(StreamName=stream_name, NextToken=result['NextToken'])
+            fragments_list.extend(result['Fragments'])
+        fragments_list = sorted(fragments_list, key=lambda item: item['FragmentNumber'])
+        for item in fragments_list:
+            stream_list.append({'startTime': item['ProducerTimestamp'],
+                                'endTime': item['ProducerTimestamp'] + datetime.timedelta(
+                                    milliseconds=item['FragmentLengthInMilliseconds']),
+                                'duration': item['FragmentLengthInMilliseconds']})
+        return stream_list
+
+    def get_images(self, stream_name, start_time, end_time):
+        """
+        获取视频流片段封面图片
+        @param stream_name: 视频流名称
+        @param start_time: 开始时间
+        @param end_time: 结束时间
+        @return HLSStreamingSessionURL: 视频流片段列表信息
+        """
+        try:
+            images_list = self.kvam_client_coon.get_images(StreamName=stream_name,
+                                                           ImageSelectorType='PRODUCER_TIMESTAMP',
+                                                           StartTimestamp=start_time,
+                                                           EndTimestamp=end_time,
+                                                           SamplingInterval=3000,
+                                                           MaxResults=100,
+                                                           Format='JPEG')['Images']
+            for image in images_list:
+                if 'ImageContent' in image:
+                    return image['ImageContent']
+        except Exception as e:
+            return ''