Browse Source

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

pengzhibo168 5 năm trước cách đây
mục cha
commit
32b4b15b1f

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

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