Эх сурвалжийг харах

Merge branch 'dev' of http://192.168.136.45:3000/SERVER/AnsjerServer into dev

WuYiPei 5 жил өмнө
parent
commit
7e1f36a554

+ 1 - 0
Ansjer/config_formal.py

@@ -13,6 +13,7 @@
 """
 """
 NGINX_RTMP_STAT = 'http://www.dvema.com/stat'
 NGINX_RTMP_STAT = 'http://www.dvema.com/stat'
 SERVER_DOMAIN_SSL = 'https://www.dvema.com/'
 SERVER_DOMAIN_SSL = 'https://www.dvema.com/'
+SERVER_DOMAIN = 'http://www.dvema.com/'
 DOMAIN_HOST = 'www.dvema.com'
 DOMAIN_HOST = 'www.dvema.com'
 SERVER_HOST = 'localhost'
 SERVER_HOST = 'localhost'
 PAYPAL_CRD = {
 PAYPAL_CRD = {

+ 6 - 3
Ansjer/config_test.py

@@ -23,12 +23,15 @@ OAUTH_REFRESH_TOKEN_SECRET = 'test_r+jbgnw%@1%zy^=@dn62%'
 DOMAIN_HOST = 'test.dvema.com'
 DOMAIN_HOST = 'test.dvema.com'
 SERVER_HOST = 'localhost'
 SERVER_HOST = 'localhost'
 PAYPAL_CRD = {
 PAYPAL_CRD = {
-    "mode": "live",  # sandbox or live
-    "client_id": "AdSRd6WBn-qLl9OiQHQuNYTDFSx0ZX0RUttqa58au8bPzoGYQUrt8bc6591RmH8_pEAIPijdvVYSVXyI",
-    "client_secret": "ENT-J08N3Fw0B0uAokg4RukljAwO9hFHPf8whE6-Dwd8oBWJO8AWMgpdTKpfB1pOy89t4bsFEzMWDowm"
+    # "mode": "live",  # sandbox or live
+    # "client_id": "AdSRd6WBn-qLl9OiQHQuNYTDFSx0ZX0RUttqa58au8bPzoGYQUrt8bc6591RmH8_pEAIPijdvVYSVXyI",
+    # "client_secret": "ENT-J08N3Fw0B0uAokg4RukljAwO9hFHPf8whE6-Dwd8oBWJO8AWMgpdTKpfB1pOy89t4bsFEzMWDowm"
     # "mode": "sandbox",  # sandbox or live
     # "mode": "sandbox",  # sandbox or live
     # "client_id": "AeuhR7FHisO-lOd2OwtzyDu7PSLMmDZoDLgmzuEQ12WCtTu_8Z1AzcD4gG5SnymnuvJs-n5KBB8H9Z_G",
     # "client_id": "AeuhR7FHisO-lOd2OwtzyDu7PSLMmDZoDLgmzuEQ12WCtTu_8Z1AzcD4gG5SnymnuvJs-n5KBB8H9Z_G",
     # "client_secret": "EGkMCB3RWTcUGJGDYahJ9mCO0AQzEn2AvFfx1GAFjfyyn7-8a0NObcZks89QorlFpvNWTsDXVa2INRNM"
     # "client_secret": "EGkMCB3RWTcUGJGDYahJ9mCO0AQzEn2AvFfx1GAFjfyyn7-8a0NObcZks89QorlFpvNWTsDXVa2INRNM"
+    "mode": "sandbox",  # sandbox or live
+    "client_id": "AfnfDqezODOoWGS-W2Itu-Zl1ay1R95IsGlMqPghPA3KGhkPndNMnQT0bdEewvSv92XAFIfLiinmyhBL",
+    "client_secret": "EErLskwYA1xXY3890mHx5OhzgK83B2rNc57zIozGNyKc8i6RJuhPTF9WyhhdZgyDEih0heo1MH9Jk1lj"
 }
 }
 DETECT_PUSH_DOMAIN = 'http://test.push.dvema.com/'
 DETECT_PUSH_DOMAIN = 'http://test.push.dvema.com/'
 # 数据库dyanamo品牌日志数据库
 # 数据库dyanamo品牌日志数据库

+ 6 - 5
Ansjer/test/kbt.py

@@ -1,5 +1,6 @@
-trtrt = '0'
-if trtrt:
-    print(1)
-else:
-    print(2)
+import requests
+
+rq_url = 'http://test.dvema.com/web/playlist.m3u8'
+
+res = requests.get(url=rq_url)
+print(res.headers)

+ 1 - 1
Ansjer/test_settings.py

@@ -119,7 +119,7 @@ USE_TZ = True
 # 跨域增加忽略
 # 跨域增加忽略
 CORS_ALLOW_CREDENTIALS = True
 CORS_ALLOW_CREDENTIALS = True
 CORS_ORIGIN_ALLOW_ALL = True
 CORS_ORIGIN_ALLOW_ALL = True
-CORS_ORIGIN_WHITELIST = ('*')
+# CORS_ORIGIN_WHITELIST = ('*')
 
 
 CORS_ALLOW_METHODS = (
 CORS_ALLOW_METHODS = (
     'DELETE',
     'DELETE',

+ 262 - 39
Controller/CloudStorage.py

@@ -8,35 +8,48 @@
 @DATE: 2018/12/5 9:30
 @DATE: 2018/12/5 9:30
 @Version: python3.6
 @Version: python3.6
 @MODIFY DECORD:ansjer dev
 @MODIFY DECORD:ansjer dev
-@file: CloudVod.py
+@file: cloudstorage.py
 @Contact: chanjunkai@163.com
 @Contact: chanjunkai@163.com
 """
 """
 import json
 import json
-import math
 import time
 import time
 import urllib
 import urllib
-from Object.AliPayObject import AliPayObject
+
+import boto3
 import oss2
 import oss2
 import paypalrestsdk
 import paypalrestsdk
-import boto3
 from aliyunsdkcore import client
 from aliyunsdkcore import client
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
+from boto3.session import Session
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
-from django.utils.decorators import method_decorator
-from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 from django.views.generic.base import View
 
 
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
     SERVER_DOMAIN_SSL
     SERVER_DOMAIN_SSL
 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
+from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
-from Service.ModelService import ModelService
-from Object.ETkObject import ETkObject
+from Object.m3u8generate import PlaylistGenerator
+
+SERVER_DOMAIN = 'http://test.dvema.com/'
 
 
-SERVER_DOMAIN = 'http://cloudstroage.dvema.com/'
+'''
+生成订单
+http://test.dvema.com/cloudstorage/createpayorder?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJleHAiOjE1ODk1MjM0OTIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCIsImxhbmciOiJlbiIsInVzZXIiOiIxMzExOTY1NzcxMyJ9.e2NdhJtbXrDngZTSmOX_52Y-oxyfUEXjZD_qNxg6VrU&uid=VVDHCVBYDKFMJRWA111A&channel=1&pay_type=0&commodity_code=aws_us_vod_7_val_30
+开启开关
+http://test.dvema.com/cloudstorage/changevodstatus?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJleHAiOjE1ODk1MjM0OTIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCIsImxhbmciOiJlbiIsInVzZXIiOiIxMzExOTY1NzcxMyJ9.e2NdhJtbXrDngZTSmOX_52Y-oxyfUEXjZD_qNxg6VrU&uid=VVDHCVBYDKFMJRWA111A&channel=1&status=1
+# 获取播放列表
+http://localhost:8077/cloudstorage/queryvodlist?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJleHAiOjE1ODk1MjM0OTIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCIsImxhbmciOiJlbiIsInVzZXIiOiIxMzExOTY1NzcxMyJ9.e2NdhJtbXrDngZTSmOX_52Y-oxyfUEXjZD_qNxg6VrU&uid=VVDHCVBYDKFMJRWA111A&startTime=1&endTime=1954687458&channel=1
+# 存储视频列表信息
+http://test.dvema.com/cloudstorage/storeplaylist?uidToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJWVkRIQ1ZCWURLRk1KUldBMTExQSIsImNoYW5uZWwiOiIxIn0.eGwi5QKyrXi4WSKRbrUG7iFTChv_Utec2hSnqZkDKt8&time=1586940120&sec=20&fg=10
+# 获取订单列表
+http://localhost:8077/cloudstorage/queryorder?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJsYW5nIjoiZW4iLCJ1c2VyIjoiMTMxMTk2NTc3MTMiLCJtX2NvZGUiOiIxMjM0MTMyNDMyMTQiLCJleHAiOjE1ODk1OTIyNzh9.u211DHiMKg-pqhXv4b2yR__eNyOcSwBZCyPUGjsxFLU&page=1&line=10&uid=VVDHCVBYDKFMJRWA111A
+# commoditylist
+http://test.dvema.com/cloudstorage/commoditylist?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTY3NzU4MjE4NjE5MTM4MDAxMzgwMDAiLCJleHAiOjE1ODk1MjM0OTIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCIsImxhbmciOiJlbiIsInVzZXIiOiIxMzExOTY1NzcxMyJ9.e2NdhJtbXrDngZTSmOX_52Y-oxyfUEXjZD_qNxg6VrU
+'''
 
 
 
 
 # 设备信息添加
 # 设备信息添加
@@ -56,6 +69,8 @@ class CloudStorageView(View):
         response = ResponseObject()
         response = ResponseObject()
         if operation is None:
         if operation is None:
             return response.json(444, 'error path')
             return response.json(444, 'error path')
+        elif operation == 'testpaly.m3u8':
+            return self.do_test_play_m3u8(request_dict, response)
         elif operation == 'dopaypalcallback':
         elif operation == 'dopaypalcallback':
             return self.do_pay_by_paypal_callback(request_dict, response)
             return self.do_pay_by_paypal_callback(request_dict, response)
         elif operation == 'doalicallback':
         elif operation == 'doalicallback':
@@ -65,6 +80,10 @@ class CloudStorageView(View):
             return self.do_get_sign_sts(request_dict, ip, response)
             return self.do_get_sign_sts(request_dict, ip, response)
         elif operation == 'storeplaylist':
         elif operation == 'storeplaylist':
             return self.do_store_playlist(request_dict, response)
             return self.do_store_playlist(request_dict, response)
+        elif operation == 'signplaym3u8':
+            return self.do_sign_play_m3u8(request_dict, response)
+        elif operation == 'payOK':
+            return self.do_pay_ok()
         else:
         else:
             token = request_dict.get('token', None)
             token = request_dict.get('token', None)
             # 设备主键uid
             # 设备主键uid
@@ -79,9 +98,149 @@ class CloudStorageView(View):
                 return self.do_change_vod_status(request_dict, userID, response)
                 return self.do_change_vod_status(request_dict, userID, response)
             elif operation == 'queryvodlist':
             elif operation == 'queryvodlist':
                 return self.do_query_vod_list(request_dict, userID, response)
                 return self.do_query_vod_list(request_dict, userID, response)
+            elif operation == 'commoditylist':
+                return self.do_commodity_list(request_dict, userID, response)
+            elif operation == 'queryorder':
+                return self.do_query_order(request_dict, userID, response)
             else:
             else:
                 return response.json(414)
                 return response.json(414)
 
 
+    def do_test_play_m3u8(self, request_dict, response):
+        playlist_entries = [
+            {
+                'name': 'https://azvod1.s3-ap-northeast-1.amazonaws.com/test/output000.ts',
+                'duration': 10,
+            },
+            {
+                'name': 'https://azvod1.s3-ap-northeast-1.amazonaws.com/test/output000.ts',
+                'duration': 10,
+            },
+            {
+                'name': 'https://azvod1.s3-ap-northeast-1.amazonaws.com/test/output000.ts',
+                'duration': 10,
+            },
+        ]
+        playlist = PlaylistGenerator(playlist_entries).generate()
+        # return HttpResponse(playlist)
+        # response = HttpResponse(playlist, content_type="application/octet-stream")
+        response = HttpResponse(playlist, content_type="application/vnd.apple.mpegurl")
+        return response
+
+    def do_query_order(self, request_dict, userID, response):
+        status = request_dict.get('status', None)
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        uid = request_dict.get('uid', None)
+        order_qs = Order_Model.objects.filter(userID_id=userID)
+        if status:
+            order_qs = order_qs.filter(status=status)
+        # 筛选指定设备id的订单
+        if uid:
+            order_qs = order_qs.filter(UID=uid)
+        if not order_qs.exists():
+            return response.json(173)
+            # return response.json(10, '订单不存在')
+        count = order_qs.count()
+        order_ql = order_qs[(page - 1) * line:page * line]. \
+            values("orderID", "UID", "channel", "desc", "price", "currency",
+                   "addTime", "updTime", "endTime", "pay_url", "payType",
+                   "status", "commodity_type", "commodity_code")
+        order_list = list(order_ql)
+        data = []
+        nowTime = int(time.time())
+        # 这里需要进行优化
+        uid_list = []
+        for od in order_list:
+            uid_list.append(od['UID'])
+        didqs = Device_Info.objects.filter(userID_id=userID, UID__in=uid_list). \
+            values('id', 'UID', 'Type')
+        for d in order_list:
+            if d['status'] == 0:
+                if d['addTime'] + 3600 < nowTime:
+                    d['status'] = 3
+            for did in didqs:
+                if d['UID'] == did['UID']:
+                    d['did'] = did['id']
+                    d['Type'] = did['Type']
+                    data.append(d)
+        return response.json(0, {'data': data, 'count': count})
+
+    def do_commodity_list(self, request_dict, userID, response):
+        mold = request_dict.get('mold', None)
+        qs = Store_Meal.objects
+        if mold:
+            qs = qs.filter(bucket__mold=1)
+        else:
+            qs = qs.filter(bucket__mold=0)
+        qs = qs.values("id", "title", "content", "price",
+                       "day", "currency", "bucket__storeDay",
+                       "bucket__bucket", "bucket__area", "type",
+                       "commodity_code", "commodity_type")
+        if qs.exists():
+            ql = list(qs)
+            from operator import itemgetter
+            from itertools import groupby
+            ql.sort(key=itemgetter('bucket__area'))
+            res = []
+            for area, items in groupby(ql, key=itemgetter('bucket__area')):
+                res_c = {'area': area, 'items': list(items)}
+                res.append(res_c)
+            result = {
+                'meals': res,
+                'extra':
+                    {
+                        'cloud_banner': 'https://www.dvema.com/web/images/cloud_cn_banner.png',
+                        'cloud_en_baner': 'https://www.dvema.com/web/images/cloud_en_banner.png'
+                    }
+            }
+            return response.json(0, result)
+        else:
+            return response.json(0)
+
+    def do_sign_play_m3u8(self, request_dict, response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        storeTime = request_dict.get('time', None)
+        now_time = int(time.time())
+        vh_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, time=int(storeTime), endTime__gte=now_time). \
+            values("sec", "fg", "bucket__bucket", "bucket__endpoint", "bucket__region", "bucket__mold")
+        if not vh_qs.exists():
+            return response.json()
+        sec = vh_qs[0]['sec']
+        fg = vh_qs[0]['fg']
+        bucket__region = vh_qs[0]['bucket__region']
+        bucket_name = vh_qs[0]['bucket__bucket']
+        aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
+        aws_secret_access_key = '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'
+        session = Session(
+            aws_access_key_id=aws_access_key_id,
+            aws_secret_access_key=aws_secret_access_key,
+            region_name=bucket__region
+        )
+        conn = session.client('s3')
+        playlist_entries = []
+        for i in range(fg):
+            thumbspng = '{uid}/vod{channel}/{time}/thumbs.png'. \
+                format(uid=uid, channel=channel, time=storeTime)
+            response_url = conn.generate_presigned_url(
+                'get_object',
+                Params={
+                    'Bucket': bucket_name,
+                    'Key': thumbspng
+                },
+                ExpiresIn=3600
+            )
+            # m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
+            #     format(uid=uid, channel=channel, time=vod['time'])
+            playlist_entries.append({
+                'name': response_url,
+                'duration': 10,
+            })
+        playlist = PlaylistGenerator(playlist_entries).generate()
+        response = HttpResponse(playlist, content_type="application/octet-stream")
+        return response
+        return HttpResponse(status=200, content=playlist)
+
     def do_get_sign_sts(self, request_dict, ip, response):
     def do_get_sign_sts(self, request_dict, ip, response):
         uidToken = request_dict.get('uidToken', None)
         uidToken = request_dict.get('uidToken', None)
         utko = UidTokenObject(uidToken)
         utko = UidTokenObject(uidToken)
@@ -93,7 +252,7 @@ class CloudStorageView(View):
         print(uid)
         print(uid)
         now_time = int(time.time())
         now_time = int(time.time())
         ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
         ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
-            values("bucket__mold", "bucket__bucket", "bucket__endpoint", "bucket__region")
+            values("bucket__mold", "bucket__bucket", "bucket__endpoint", "bucket__region", "endTime")
         if ubqs.exists():
         if ubqs.exists():
             if ubqs[0]["bucket__mold"] == 0:
             if ubqs[0]["bucket__mold"] == 0:
                 # 阿里云 oss sts
                 # 阿里云 oss sts
@@ -220,9 +379,10 @@ class CloudStorageView(View):
                     'ip': ip,
                     'ip': ip,
                 }
                 }
                 if sts_qs.exists():
                 if sts_qs.exists():
-                    sts_qs.update(data=json.dumps(res), addTime=now_time)
+                    sts_qs.update(data=json.dumps(res,default=str), addTime=now_time)
                 else:
                 else:
-                    StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res), addTime=now_time, type=1)
+                    StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res, default=str),
+                                               addTime=now_time, type=1)
                 return JsonResponse(status=200, data=res)
                 return JsonResponse(status=200, data=res)
             else:
             else:
                 res = {'code': 404, 'msg': 'data not exists!'}
                 res = {'code': 404, 'msg': 'data not exists!'}
@@ -230,15 +390,72 @@ class CloudStorageView(View):
                                     content_type="application/json,charset=utf-8")
                                     content_type="application/json,charset=utf-8")
 
 
     def do_query_vod_list(self, request_dict, userID, response):
     def do_query_vod_list(self, request_dict, userID, response):
-        startTime = int(request_dict.get('startTime',None))
-        endTime = int(request_dict.get('endTime',None))
-        uid =request_dict.get('uid',None)
-        channel = request_dict.get('channel',None)
-        dv_qs = Device_Info.objects.filter(UID=uid,userID_id=userID,isShare=False)
+        startTime = int(request_dict.get('startTime', None))
+        endTime = int(request_dict.get('endTime', None))
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        dv_qs = Device_Info.objects.filter(UID=uid, userID_id=userID, isShare=False)
         if not dv_qs.exists():
         if not dv_qs.exists():
             return response.json(12)
             return response.json(12)
         now_time = int(time.time())
         now_time = int(time.time())
-        vh_qs = VodHlsModel.objects.filter(uid=uid,channel=channel,time__range=(startTime,endTime))
+        vh_qs = VodHlsModel.objects.filter\
+            (uid=uid, channel=channel, time__range=(startTime, endTime), endTime__gte=now_time). \
+            values("time", "sec", "bucket__bucket", "bucket__endpoint", "bucket__region", "bucket__mold")
+        vod_play_list = []
+        print("---")
+        print(vh_qs)
+        auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+        for vod in vh_qs:
+            bucket__mold = vod["bucket__mold"]
+            bucket_name = vod["bucket__bucket"]
+            endpoint = vod["bucket__endpoint"]
+            bucket__region = vod["bucket__region"]
+            if bucket__mold == 0:
+                bucket = oss2.Bucket(auth, endpoint, bucket_name)
+                m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
+                    format(uid=uid, channel=channel, time=vod['time'])
+                ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
+                    format(uid=uid, channel=channel, time=vod['time'])
+                url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
+                urllst = url.split('?')
+                url_start = urllib.parse.unquote(urllst[0])
+                url_end = urllst[1]
+                vod_play_url = '{url_start}?{url_end}'. \
+                    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']})
+            elif bucket__mold == 1:
+                aws_access_key_id = 'AKIA2E67UIMD45Y3HL53'
+                aws_secret_access_key = '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'
+                session = Session(
+                    aws_access_key_id=aws_access_key_id,
+                    aws_secret_access_key=aws_secret_access_key,
+                    region_name=bucket__region
+                )
+                conn = session.client('s3')
+                thumbspng = '{uid}/vod{channel}/{time}/thumbs.png'. \
+                    format(uid=uid, channel=channel, time=vod['time'])
+                response_url = conn.generate_presigned_url(
+                    'get_object',
+                    Params={
+                        'Bucket': bucket_name,
+                        'Key': thumbspng
+                    },
+                    ExpiresIn=3600
+                )
+                # m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
+                #     format(uid=uid, channel=channel, time=vod['time'])
+                thumb_url = response_url
+                vod_url = 'http://cloudstroage.dvema.com/cloudstorage/signplaym3u8?' \
+                          'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
+                    format(uid=uid, channel=channel, time=vod['time'])
+                vod_play_list.append({
+                    'name': vod['time'],
+                    'sign_url': vod_url,
+                    'thumb': thumb_url,
+                    'sec': vod['sec']})
+        return response.json(0, vod_play_list)
 
 
     def do_store_playlist(self, request_dict, response):
     def do_store_playlist(self, request_dict, response):
         uidToken = request_dict.get('uidToken', None)
         uidToken = request_dict.get('uidToken', None)
@@ -259,11 +476,12 @@ class CloudStorageView(View):
         print(channel)
         print(channel)
         now_time = int(time.time())
         now_time = int(time.time())
         ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, endTime__gte=now_time). \
         ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, endTime__gte=now_time). \
-            values("bucket__mold", "bucket__bucket", "bucket__endpoint", "bucket__region", "status", "bucket__storeDay")
+            values("bucket__mold", "bucket__bucket", "bucket__endpoint",
+                   "bucket__region", "status", "bucket__storeDay", "bucket__id")
         if ubqs.exists():
         if ubqs.exists():
             ub_qs_data = ubqs[0]
             ub_qs_data = ubqs[0]
             store_day = ub_qs_data['bucket__storeDay']
             store_day = ub_qs_data['bucket__storeDay']
-            bucket_id = ub_qs_data['bucket_id']
+            bucket_id = ub_qs_data['bucket__id']
             end_time = int(storeTime) + store_day * 86400
             end_time = int(storeTime) + store_day * 86400
             if ub_qs_data['status'] == 1:
             if ub_qs_data['status'] == 1:
                 if ub_qs_data["bucket__mold"] == 0:
                 if ub_qs_data["bucket__mold"] == 0:
@@ -313,7 +531,7 @@ class CloudStorageView(View):
         uid = request_dict.get('uid', None)
         uid = request_dict.get('uid', None)
         status = request_dict.get('status', None)
         status = request_dict.get('status', None)
         channel = request_dict.get('channel', None)
         channel = request_dict.get('channel', None)
-        if not all([uid, status, channel]):
+        if all([uid, status, channel]):
             dv_qs = Device_Info.objects.filter(UID=uid, userID_id=userID, isShare=False, isExist=1)
             dv_qs = Device_Info.objects.filter(UID=uid, userID_id=userID, isShare=False, isExist=1)
             if dv_qs.exists():
             if dv_qs.exists():
                 now_time = int(time.time())
                 now_time = int(time.time())
@@ -323,13 +541,14 @@ class CloudStorageView(View):
                     print(repr(e))
                     print(repr(e))
                     return response.json(10, '未购买')
                     return response.json(10, '未购买')
                 else:
                 else:
-                    ubqs.update(status=status)
+                    ubqs.status = status
+                    ubqs.save()
                     if status == 0:
                     if status == 0:
                         return response.json(0)
                         return response.json(0)
                     else:
                     else:
                         utko = UidTokenObject()
                         utko = UidTokenObject()
                         utko.generate(data={'uid': uid, 'channel': channel})
                         utko.generate(data={'uid': uid, 'channel': channel})
-                        uidTK = utko.toke
+                        uidTK = utko.token
                         uidTkUrl = "{SERVER_DOMAIN}cloudstorage/getsignsts?uidToken={uidToken}". \
                         uidTkUrl = "{SERVER_DOMAIN}cloudstorage/getsignsts?uidToken={uidToken}". \
                             format(uidToken=uidTK, SERVER_DOMAIN=SERVER_DOMAIN)
                             format(uidToken=uidTK, SERVER_DOMAIN=SERVER_DOMAIN)
                         storeHlsUrl = "{SERVER_DOMAIN}cloudstorage/storeplaylist?uidToken={uidToken}". \
                         storeHlsUrl = "{SERVER_DOMAIN}cloudstorage/storeplaylist?uidToken={uidToken}". \
@@ -337,7 +556,6 @@ class CloudStorageView(View):
                         return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
                         return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
             else:
             else:
                 return response.json(12)
                 return response.json(12)
-
         else:
         else:
             return response.json(444, 'uid,status,channel')
             return response.json(444, 'uid,status,channel')
 
 
@@ -548,7 +766,7 @@ class CloudStorageView(View):
                 uid_bucket_id = ub_cqs.id
                 uid_bucket_id = ub_cqs.id
             order_qs.update \
             order_qs.update \
                 (payTime=nowTime, status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
                 (payTime=nowTime, status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
-            red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            red_url = "{SERVER_DOMAIN}cloudstorage/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
             return HttpResponseRedirect(red_url)
             return HttpResponseRedirect(red_url)
         return response.json(0, signature)
         return response.json(0, signature)
 
 
@@ -557,7 +775,7 @@ class CloudStorageView(View):
         PayerID = request_dict.get('PayerID', None)
         PayerID = request_dict.get('PayerID', None)
         orderID = request_dict.get('orderID', None)
         orderID = request_dict.get('orderID', None)
         if not paymentId or not PayerID or not orderID:
         if not paymentId or not PayerID or not orderID:
-            red_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            red_url = "{SERVER_DOMAIN}cloudstorage/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
             return HttpResponseRedirect(red_url)
             return HttpResponseRedirect(red_url)
         paypalrestsdk.configure(PAYPAL_CRD)
         paypalrestsdk.configure(PAYPAL_CRD)
         # ID of the payment. This ID is provided when creating payment.
         # ID of the payment. This ID is provided when creating payment.
@@ -565,7 +783,7 @@ class CloudStorageView(View):
         payres = payment.execute({"payer_id": PayerID})
         payres = payment.execute({"payer_id": PayerID})
         print(payres)
         print(payres)
         if not payres:
         if not payres:
-            red_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            red_url = "{SERVER_DOMAIN}cloudstorage/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
             return HttpResponseRedirect(red_url)
             return HttpResponseRedirect(red_url)
         print("Payment execute successfully")
         print("Payment execute successfully")
         order_qs = Order_Model.objects.filter(orderID=orderID)
         order_qs = Order_Model.objects.filter(orderID=orderID)
@@ -585,18 +803,22 @@ class CloudStorageView(View):
             values("bucket__storeDay", "bucket__region", "endTime")
             values("bucket__storeDay", "bucket__region", "endTime")
         if ubqs.exists():
         if ubqs.exists():
             ubqs_count = ubqs.count()
             ubqs_count = ubqs.count()
-            ubq = ubqs[ubqs_count - 1, ubqs_count]
+            print(ubqs_count)
+            ubq = ubqs[ubqs_count - 1]
+            print(ubq)
             new_starTime = ubq['endTime'] + 1
             new_starTime = ubq['endTime'] + 1
-            ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId,
-                                               endTime=new_starTime + addTime)
+            ub_cqs = UID_Bucket.objects.create \
+                (uid=UID, channel=channel, bucket_id=bucketId,
+                 endTime=new_starTime + addTime)
             uid_bucket_id = ub_cqs.id
             uid_bucket_id = ub_cqs.id
         else:
         else:
-            ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=nowTime + addTime)
+            ub_cqs = UID_Bucket.objects.create \
+                (uid=UID, channel=channel, bucket_id=bucketId, endTime=nowTime + addTime)
             uid_bucket_id = ub_cqs.id
             uid_bucket_id = ub_cqs.id
         order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
         order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
 
 
         # return response.json(0)
         # return response.json(0)
-        red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
+        red_url = "{SERVER_DOMAIN}cloudstorage/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
         return HttpResponseRedirect(red_url)
         return HttpResponseRedirect(red_url)
 
 
     def do_create_pay_order(self, request_dict, userID, response):
     def do_create_pay_order(self, request_dict, userID, response):
@@ -625,11 +847,11 @@ class CloudStorageView(View):
         nowTime = int(time.time())
         nowTime = int(time.time())
         orderID = CommonService.createOrderID()
         orderID = CommonService.createOrderID()
         if pay_type == 0:
         if pay_type == 0:
-            call_sub_url = "{SERVER_DOMAIN}cloudVod/dopaypalcallback?orderID={orderID}". \
+            call_sub_url = "{SERVER_DOMAIN}cloudstorage/dopaypalcallback?orderID={orderID}". \
                 format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
                 format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
-            # call_sub_url = "http://192.168.136.40:8077/cloudVod/payExecute?orderID={orderID}".format(
+            # call_sub_url = "http://192.168.136.40:8077/cloudstorage/payExecute?orderID={orderID}".format(
             #     SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
             #     SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
-            call_clc_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            call_clc_url = "{SERVER_DOMAIN}cloudstorage/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
             paypalrestsdk.configure(PAYPAL_CRD)
             paypalrestsdk.configure(PAYPAL_CRD)
             payment = paypalrestsdk.Payment({
             payment = paypalrestsdk.Payment({
                 "intent": "sale",
                 "intent": "sale",
@@ -666,10 +888,11 @@ class CloudStorageView(View):
                     out_trade_no=orderID,
                     out_trade_no=orderID,
                     total_amount=price,
                     total_amount=price,
                     subject=subject,
                     subject=subject,
-                    return_url="{SERVER_DOMAIN_SSL}cloudVod/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
-                    notify_url="{SERVER_DOMAIN_SSL}cloudVod/doalicallback".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
-                    # return_url="http://192.168.136.40/cloudVod/payOK",
-                    # notify_url="http://192.168.136.40/cloudVod/aliPayCallback"
+                    return_url="{SERVER_DOMAIN_SSL}cloudstorage/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
+                    notify_url="{SERVER_DOMAIN_SSL}cloudstorage/doalicallback".format(
+                        SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
+                    # return_url="http://192.168.136.40/cloudstorage/payOK",
+                    # notify_url="http://192.168.136.40/cloudstorage/aliPayCallback"
                 )
                 )
             except Exception as e:
             except Exception as e:
                 print(repr(e))
                 print(repr(e))

+ 3 - 1
Controller/DetectController.py

@@ -20,7 +20,7 @@ import oss2
 from django.http import JsonResponse
 from django.http import JsonResponse
 from django.views.generic.base import View
 from django.views.generic.base import View
 from pyfcm import FCMNotification
 from pyfcm import FCMNotification
-
+from Object.RedisObject import RedisObject
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, DETECT_PUSH_DOMAIN, JPUSH_CONFIG, \
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, DETECT_PUSH_DOMAIN, JPUSH_CONFIG, \
     FCM_CONFIG, APNS_CONFIG, BASE_DIR, APNS_MODE
     FCM_CONFIG, APNS_CONFIG, BASE_DIR, APNS_MODE
 from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel
 from Model.models import Device_Info, VodHlsModel, Equipment_Info, UidSetModel, UidPushModel
@@ -295,6 +295,8 @@ class DetectControllerView(View):
         if dvqs.exists():
         if dvqs.exists():
             uid_set_qs = UidSetModel.objects. \
             uid_set_qs = UidSetModel.objects. \
                 filter(uid=uid, uidpushmodel__userID_id=userID)
                 filter(uid=uid, uidpushmodel__userID_id=userID)
+            redisObj = RedisObject(db=8)
+            redisObj.del_data(key='uid_qs_' + userID)
             if uid_set_qs.exists():
             if uid_set_qs.exists():
                 uid_set_qs.update(interval=int(interval))
                 uid_set_qs.update(interval=int(interval))
             else:
             else:

+ 3 - 1
Controller/DeviceShare.py

@@ -16,7 +16,7 @@ import json
 import time
 import time
 
 
 from django.views.generic.base import View
 from django.views.generic.base import View
-
+from Object.RedisObject import RedisObject
 from Ansjer.config import SERVER_DOMAIN
 from Ansjer.config import SERVER_DOMAIN
 from Model.models import Device_Info, Device_User
 from Model.models import Device_Info, Device_User
 from Model.models import UID_Bucket
 from Model.models import UID_Bucket
@@ -225,6 +225,8 @@ class DeviceShareView(View):
         id = request_dict.get('id', None)
         id = request_dict.get('id', None)
         if id:
         if id:
             try:
             try:
+                redisObj = RedisObject(db=8)
+                redisObj.del_data(key='uid_qs_' + userID)
                 Device_Info.objects.filter(id=id, primaryUserID=userID).update(isExist=0)
                 Device_Info.objects.filter(id=id, primaryUserID=userID).update(isExist=0)
             except Exception as e:
             except Exception as e:
                 return response.json(10, repr(e))
                 return response.json(10, repr(e))

+ 2 - 0
Controller/EquipmentManager.py

@@ -826,6 +826,8 @@ def update_uid_set(request):
         userID = tko.userID
         userID = tko.userID
         nowTime = int(time.time())
         nowTime = int(time.time())
         dvqs = Device_Info.objects.filter(userID_id=userID)
         dvqs = Device_Info.objects.filter(userID_id=userID)
+        redisObj = RedisObject(db=8)
+        redisObj.del_data(key='uid_qs_' + userID)
         if dvqs.exists():
         if dvqs.exists():
             us_qs = UidSetModel.objects.filter(uid=uid)
             us_qs = UidSetModel.objects.filter(uid=uid)
             if us_qs.exists():
             if us_qs.exists():

+ 100 - 6
Controller/EquipmentManagerV3.py

@@ -2,8 +2,8 @@ import re
 import threading
 import threading
 import time
 import time
 import traceback
 import traceback
-
-import oss2
+from Controller.CheckUserData import RandomStr
+import oss2, base64
 from django.db.models import Q
 from django.db.models import Q
 from django.views.generic.base import View
 from django.views.generic.base import View
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
@@ -35,10 +35,13 @@ class EquipmentManagerV3(View):
         if tko.code == 0:
         if tko.code == 0:
             response.lang = tko.lang
             response.lang = tko.lang
             userID = tko.userID
             userID = tko.userID
-            # if operation == 'add':
-            #     return self.do_add(userID, request_dict, response)
-            if operation == 'query':
+            # 手机端添加设备,查询,修改
+            if operation == 'add':
+                return self.do_add(userID, request_dict, response, request)
+            elif operation == 'query':
                 return self.do_query(userID, request_dict, response)
                 return self.do_query(userID, request_dict, response)
+            elif operation == 'modify':
+                return self.do_modify(userID, request_dict, response)
             elif operation == 'query_reset':
             elif operation == 'query_reset':
                 return self.do_query_reset(userID, request_dict, response)
                 return self.do_query_reset(userID, request_dict, response)
             else:
             else:
@@ -52,6 +55,8 @@ class EquipmentManagerV3(View):
         NickName = request_dict.get('NickName', None)
         NickName = request_dict.get('NickName', None)
         View_Account = request_dict.get('View_Account', None)
         View_Account = request_dict.get('View_Account', None)
         View_Password = request_dict.get('View_Password', '')
         View_Password = request_dict.get('View_Password', '')
+        print("准备解密")
+        View_Password = self.decode_pwd(View_Password)
         Type = request_dict.get('Type', None)
         Type = request_dict.get('Type', None)
         ChannelIndex = request_dict.get('ChannelIndex', None)
         ChannelIndex = request_dict.get('ChannelIndex', None)
         if all([UID, NickName, View_Account, Type, ChannelIndex]):
         if all([UID, NickName, View_Account, Type, ChannelIndex]):
@@ -81,7 +86,7 @@ class EquipmentManagerV3(View):
                                 'uid': UID,
                                 'uid': UID,
                                 'addTime': nowTime,
                                 'addTime': nowTime,
                                 'updTime': nowTime,
                                 'updTime': nowTime,
-                                'ip': CommonService.get_ip_address(request),
+                                'ip': CommonService.get_ip_address(request_dict),
                                 'channel': ChannelIndex,
                                 'channel': ChannelIndex,
                                 'nickname': NickName,
                                 'nickname': NickName,
                             }
                             }
@@ -115,6 +120,51 @@ class EquipmentManagerV3(View):
         else:
         else:
             return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex'})
             return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex'})
 
 
+    def do_modify(self, userID, request_dict, response):
+        token = request_dict.get('token', None)
+        deviceContent = request_dict.get('content', None)
+        id = request_dict.get('id', None)
+        if not deviceContent or not id:
+            return response.json(444, 'content,id')
+        tko = TokenObject(token)
+        response.lang = tko.lang
+        if tko.code != 0:
+            return response.json(tko.code)
+        userID = tko.userID
+        if userID is None:
+            return response.json(309)
+        try:
+            deviceData = json.loads(deviceContent)
+            print(deviceData['View_Password'])
+            deviceData['View_Password'] = self.decode_pwd(deviceData['View_Password'])
+            dev_info_qs = Device_Info.objects.filter(userID_id=userID, id=id)
+            dev_info_qs.update(**deviceData)
+        except Exception as e:
+            return response.json(177, repr(e))
+        else:
+            qs = Device_Info.objects.filter(userID_id=userID, id=id)
+            res = CommonService.qs_to_dict(qs)
+            if qs.exists():
+                uid = qs[0].UID
+                nickname = qs[0].NickName
+                # 增加设备影子信息修改昵称 start
+                us_qs = UidSetModel.objects.filter(uid=uid)
+                if us_qs.exists():
+                    us_qs.update(nickname=nickname)
+                else:
+                    ChannelIndex = qs[0].ChannelIndex
+                    nowTime = int(time.time())
+                    uid_set_create_dict = {
+                        'uid': uid,
+                        'addTime': nowTime,
+                        'updTime': nowTime,
+                        'ip': CommonService.get_ip_address(request),
+                        'channel': ChannelIndex,
+                        'nickname': nickname,
+                    }
+                    UidSetModel.objects.create(**uid_set_create_dict)
+                Device_Info.objects.filter(UID=uid).update(NickName=nickname)
+            return response.json(0, res)
     # 新查询设备字段
     # 新查询设备字段
     def do_query(self, userID, request_dict, response):
     def do_query(self, userID, request_dict, response):
         token = request_dict.get('token', None)
         token = request_dict.get('token', None)
@@ -190,6 +240,7 @@ class EquipmentManagerV3(View):
                 for index, item in enumerate(data):
                 for index, item in enumerate(data):
                     if (page - 1) * line <= index:
                     if (page - 1) * line <= index:
                         if index < page * line:
                         if index < page * line:
+                            item['View_Password']=self.encrypt_pwd(item['View_Password'])
                             items.append(item)
                             items.append(item)
                 return response.json(0, items)
                 return response.json(0, items)
             else:
             else:
@@ -207,17 +258,23 @@ class EquipmentManagerV3(View):
                     # print('NickName搜索缓存')
                     # print('NickName搜索缓存')
                     for index, item in enumerate(redis_value):
                     for index, item in enumerate(redis_value):
                         if NickName ==item['NickName']:
                         if NickName ==item['NickName']:
+                            # 加密
+                            item['View_Password'] = self.encrypt_pwd(item['View_Password'])
                             return response.json(0, item)
                             return response.json(0, item)
                 if uid:
                 if uid:
                     # print('uid搜索缓存')
                     # print('uid搜索缓存')
                     for index, item in enumerate(redis_value):
                     for index, item in enumerate(redis_value):
                         if uid == item['UID']:
                         if uid == item['UID']:
+                            # 加密
+                            item['View_Password'] = self.encrypt_pwd(item['View_Password'])
                             return response.json(0, item)
                             return response.json(0, item)
                 items = []
                 items = []
                 # print('缓存分页')
                 # print('缓存分页')
                 for index, item in enumerate(redis_value):
                 for index, item in enumerate(redis_value):
                     if (page - 1) * line <= index:
                     if (page - 1) * line <= index:
                         if index < page * line:
                         if index < page * line:
+                            # 加密
+                            item['View_Password'] = self.encrypt_pwd(item['View_Password'])
                             items.append(item)
                             items.append(item)
                 return response.json(0, items)
                 return response.json(0, items)
         else:
         else:
@@ -230,3 +287,40 @@ class EquipmentManagerV3(View):
             ('id', 'NickName', 'UID', 'ChannelIndex', 'Type', 'isShare')
             ('id', 'NickName', 'UID', 'ChannelIndex', 'Type', 'isShare')
         res = CommonService.qs_to_list(dvql)
         res = CommonService.qs_to_list(dvql)
         return response.json(0, res)
         return response.json(0, res)
+
+    # 加密
+    def encrypt_pwd(self,userPwd):
+        for i in range(1, 4):
+            if i == 1:
+                userPwd = RandomStr(3, False)+userPwd+RandomStr(3, False)
+                userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
+            if i == 2:
+                userPwd = RandomStr(2, False)+str(userPwd)+RandomStr(2, False)
+                userPwd =base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
+            if i == 3:
+                userPwd = RandomStr(1, False)+str(userPwd)+RandomStr(1, False)
+                userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
+        return userPwd
+
+    # 解密
+    def decode_pwd(self, password):
+        for i in range(1, 4):
+            if i == 1:
+                # 第一次先解密
+                password = base64.b64decode(password)
+                password = password.decode('utf-8')
+                # 截去第一位,最后一位
+                password = password[1:-1]
+            if i == 2:
+                # 第2次先解密
+                password = base64.b64decode(password)
+                password = password.decode('utf-8')
+                # 去前2位,后2位
+                password = password[2:-2]
+            if i == 3:
+                # 第3次先解密
+                password = base64.b64decode(password)
+                password = password.decode('utf-8')
+                # 去前3位,后3位
+                password = password[3:-3]
+        return password

+ 3 - 2
Controller/UidSetController.py

@@ -13,7 +13,7 @@
 """
 """
 import time
 import time
 import traceback
 import traceback
-
+from Object.RedisObject import RedisObject
 import simplejson as json
 import simplejson as json
 from django.utils.decorators import method_decorator
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.csrf import csrf_exempt
@@ -113,7 +113,8 @@ class UidSetView(View):
         if own_perm is True:
         if own_perm is True:
             uid = request_dict.getlist('uid', None)
             uid = request_dict.getlist('uid', None)
             id_list = request_dict.get('id_list', None)
             id_list = request_dict.get('id_list', None)
-
+            redisObj = RedisObject(db=8)
+            redisObj.del_data(key='uid_qs_' + userID)
             # 删除回滚
             # 删除回滚
             with transaction.atomic():  # 上下文格式,可以在python代码的任何位置使用
             with transaction.atomic():  # 上下文格式,可以在python代码的任何位置使用
                 val = 1
                 val = 1

+ 4 - 4
Model/models.py

@@ -426,7 +426,7 @@ class Store_Meal(models.Model):
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE,
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE,
                                default=1, verbose_name='存储空间')
                                default=1, verbose_name='存储空间')
     commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')  # 0:事件型 1:连续型
     commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')  # 0:事件型 1:连续型
-    commodity_code = models.CharField(default='', max_length=16, verbose_name='套餐规格码')
+    commodity_code = models.CharField(default='', max_length=32, verbose_name='套餐规格码')
 
 
     def __str__(self):
     def __str__(self):
         return self.id
         return self.id
@@ -533,8 +533,8 @@ class Order_Model(models.Model):
     nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')
     nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')
     uid_bucket_id = models.IntegerField(default=0, verbose_name='关联uid_bucket的字段')
     uid_bucket_id = models.IntegerField(default=0, verbose_name='关联uid_bucket的字段')
     commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')
     commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')
-    commodity_code = models.CharField(default='', max_length=16, verbose_name='套餐规格码')
-    pay_url = models.CharField(max_length=250,default='',verbose_name='支付url')
+    commodity_code = models.CharField(default='', max_length=32, verbose_name='套餐规格码')
+    pay_url = models.CharField(max_length=500,default='', verbose_name='支付url')
 
 
     def __str__(self):
     def __str__(self):
         return self.orderID
         return self.orderID
@@ -675,7 +675,7 @@ class UidSetModel(models.Model):
     # 设备重置后第一次启动时间
     # 设备重置后第一次启动时间
     is_alexa = models.IntegerField(default=0, verbose_name='是否支持alexa')  # 0为不支持,1为支持,2为开启alexa发现
     is_alexa = models.IntegerField(default=0, verbose_name='是否支持alexa')  # 0为不支持,1为支持,2为开启alexa发现
     detect_group = models.CharField(default='', max_length=32, verbose_name=u'检测类型')
     detect_group = models.CharField(default='', max_length=32, verbose_name=u'检测类型')
-    pwd = models.CharField(max_length=32, default='', verbose_name=u'设备密码')
+    pwd = models.CharField(max_length=32, default='', verbose_name=u'设备密码') # 暂时是预留字段
     resetTime = models.IntegerField(default=0, verbose_name='设备重置时间')
     resetTime = models.IntegerField(default=0, verbose_name='设备重置时间')
     region_alexa = models.CharField(max_length=8, verbose_name='设备alexa区域', default='ALL')  # ALL CN EU US
     region_alexa = models.CharField(max_length=8, verbose_name='设备alexa区域', default='ALL')  # ALL CN EU US
 
 

+ 22 - 4
Object/m3u8generate.py

@@ -34,7 +34,7 @@ class PlaylistGenerator(object):
     def _generate_playlist_entries(self):
     def _generate_playlist_entries(self):
         playlist = ""
         playlist = ""
         for entry in self.playlist_entries:
         for entry in self.playlist_entries:
-            playlist += "#EXTINF:{duration}\n{media}\n".format(duration=float(entry['duration']), media=(entry['name']))
+            playlist += "#EXTINF:{duration},\n{media}\n".format(duration=float(entry['duration']), media=(entry['name']))
 
 
         return playlist.replace(" ", "")
         return playlist.replace(" ", "")
 
 
@@ -67,6 +67,24 @@ class PlaylistGenerator(object):
         return duration_total
         return duration_total
 
 
     def generate(self):
     def generate(self):
-        """ This is a proxy for _generate makes it
-        difficult to edit the real method for future."""
-        return self._generate()
+        """
+        This is a proxy for _generate makes it
+        difficult to edit the real method for future.
+        """
+        return self._generate()
+
+#
+# playlist_entries = [
+#     {
+#         'name':  "Awesomevideo_001.mp4",
+#         'duration': '10.04',
+#     },
+#     {
+#         'name': "xxx.ts",
+#         'duration': '30'
+#     }
+#
+# ]
+# playlist = PlaylistGenerator(playlist_entries).generate()
+# #
+# print(playlist)

+ 5 - 1
Service/TemplateService.py

@@ -68,7 +68,11 @@ class TemplateService:
             'wechat/authsign',
             'wechat/authsign',
             'login/oauth/authorize',
             'login/oauth/authorize',
             'login/oauth/access_token',
             'login/oauth/access_token',
-            'login/oauth/user'
+            'login/oauth/user',
+            'v3/equipment/query',
+            'v3/equipment/add',
+            'v3/equipment/modify',
+            'v2/account/login',
         ]
         ]
         return apiList
         return apiList