浏览代码

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

pengzhibo168 5 年之前
父节点
当前提交
32b4b15b1f
共有 7 个文件被更改,包括 301 次插入55 次删除
  1. 1 0
      Ansjer/config_formal.py
  2. 6 3
      Ansjer/config_test.py
  3. 6 5
      Ansjer/test/kbt.py
  4. 1 1
      Ansjer/test_settings.py
  5. 262 39
      Controller/CloudStorage.py
  6. 3 3
      Model/models.py
  7. 22 4
      Object/m3u8generate.py

+ 1 - 0
Ansjer/config_formal.py

@@ -13,6 +13,7 @@
 """
 NGINX_RTMP_STAT = 'http://www.dvema.com/stat'
 SERVER_DOMAIN_SSL = 'https://www.dvema.com/'
+SERVER_DOMAIN = 'http://www.dvema.com/'
 DOMAIN_HOST = 'www.dvema.com'
 SERVER_HOST = 'localhost'
 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'
 SERVER_HOST = 'localhost'
 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
     # "client_id": "AeuhR7FHisO-lOd2OwtzyDu7PSLMmDZoDLgmzuEQ12WCtTu_8Z1AzcD4gG5SnymnuvJs-n5KBB8H9Z_G",
     # "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/'
 # 数据库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_ORIGIN_ALLOW_ALL = True
-CORS_ORIGIN_WHITELIST = ('*')
+# CORS_ORIGIN_WHITELIST = ('*')
 
 CORS_ALLOW_METHODS = (
     'DELETE',

+ 262 - 39
Controller/CloudStorage.py

@@ -8,35 +8,48 @@
 @DATE: 2018/12/5 9:30
 @Version: python3.6
 @MODIFY DECORD:ansjer dev
-@file: CloudVod.py
+@file: cloudstorage.py
 @Contact: chanjunkai@163.com
 """
 import json
-import math
 import time
 import urllib
-from Object.AliPayObject import AliPayObject
+
+import boto3
 import oss2
 import paypalrestsdk
-import boto3
 from aliyunsdkcore import client
 from aliyunsdksts.request.v20150401 import AssumeRoleRequest
+from boto3.session import Session
 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 Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
     SERVER_DOMAIN_SSL
 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.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 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()
         if operation is None:
             return response.json(444, 'error path')
+        elif operation == 'testpaly.m3u8':
+            return self.do_test_play_m3u8(request_dict, response)
         elif operation == 'dopaypalcallback':
             return self.do_pay_by_paypal_callback(request_dict, response)
         elif operation == 'doalicallback':
@@ -65,6 +80,10 @@ class CloudStorageView(View):
             return self.do_get_sign_sts(request_dict, ip, response)
         elif operation == 'storeplaylist':
             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:
             token = request_dict.get('token', None)
             # 设备主键uid
@@ -79,9 +98,149 @@ class CloudStorageView(View):
                 return self.do_change_vod_status(request_dict, userID, response)
             elif operation == 'queryvodlist':
                 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:
                 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):
         uidToken = request_dict.get('uidToken', None)
         utko = UidTokenObject(uidToken)
@@ -93,7 +252,7 @@ class CloudStorageView(View):
         print(uid)
         now_time = int(time.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[0]["bucket__mold"] == 0:
                 # 阿里云 oss sts
@@ -220,9 +379,10 @@ class CloudStorageView(View):
                     'ip': ip,
                 }
                 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:
-                    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)
             else:
                 res = {'code': 404, 'msg': 'data not exists!'}
@@ -230,15 +390,72 @@ class CloudStorageView(View):
                                     content_type="application/json,charset=utf-8")
 
     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():
             return response.json(12)
         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):
         uidToken = request_dict.get('uidToken', None)
@@ -259,11 +476,12 @@ class CloudStorageView(View):
         print(channel)
         now_time = int(time.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():
             ub_qs_data = ubqs[0]
             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
             if ub_qs_data['status'] == 1:
                 if ub_qs_data["bucket__mold"] == 0:
@@ -313,7 +531,7 @@ class CloudStorageView(View):
         uid = request_dict.get('uid', None)
         status = request_dict.get('status', 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)
             if dv_qs.exists():
                 now_time = int(time.time())
@@ -323,13 +541,14 @@ class CloudStorageView(View):
                     print(repr(e))
                     return response.json(10, '未购买')
                 else:
-                    ubqs.update(status=status)
+                    ubqs.status = status
+                    ubqs.save()
                     if status == 0:
                         return response.json(0)
                     else:
                         utko = UidTokenObject()
                         utko.generate(data={'uid': uid, 'channel': channel})
-                        uidTK = utko.toke
+                        uidTK = utko.token
                         uidTkUrl = "{SERVER_DOMAIN}cloudstorage/getsignsts?uidToken={uidToken}". \
                             format(uidToken=uidTK, SERVER_DOMAIN=SERVER_DOMAIN)
                         storeHlsUrl = "{SERVER_DOMAIN}cloudstorage/storeplaylist?uidToken={uidToken}". \
@@ -337,7 +556,6 @@ class CloudStorageView(View):
                         return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
             else:
                 return response.json(12)
-
         else:
             return response.json(444, 'uid,status,channel')
 
@@ -548,7 +766,7 @@ class CloudStorageView(View):
                 uid_bucket_id = ub_cqs.id
             order_qs.update \
                 (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 response.json(0, signature)
 
@@ -557,7 +775,7 @@ class CloudStorageView(View):
         PayerID = request_dict.get('PayerID', None)
         orderID = request_dict.get('orderID', None)
         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)
         paypalrestsdk.configure(PAYPAL_CRD)
         # ID of the payment. This ID is provided when creating payment.
@@ -565,7 +783,7 @@ class CloudStorageView(View):
         payres = payment.execute({"payer_id": PayerID})
         print(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)
         print("Payment execute successfully")
         order_qs = Order_Model.objects.filter(orderID=orderID)
@@ -585,18 +803,22 @@ class CloudStorageView(View):
             values("bucket__storeDay", "bucket__region", "endTime")
         if ubqs.exists():
             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
-            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
         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
         order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
 
         # 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)
 
     def do_create_pay_order(self, request_dict, userID, response):
@@ -625,11 +847,11 @@ class CloudStorageView(View):
         nowTime = int(time.time())
         orderID = CommonService.createOrderID()
         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)
-            # 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)
-            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)
             payment = paypalrestsdk.Payment({
                 "intent": "sale",
@@ -666,10 +888,11 @@ class CloudStorageView(View):
                     out_trade_no=orderID,
                     total_amount=price,
                     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:
                 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,
                                default=1, verbose_name='存储空间')
     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):
         return self.id
@@ -533,8 +533,8 @@ class Order_Model(models.Model):
     nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')
     uid_bucket_id = models.IntegerField(default=0, verbose_name='关联uid_bucket的字段')
     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):
         return self.orderID

+ 22 - 4
Object/m3u8generate.py

@@ -34,7 +34,7 @@ class PlaylistGenerator(object):
     def _generate_playlist_entries(self):
         playlist = ""
         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(" ", "")
 
@@ -67,6 +67,24 @@ class PlaylistGenerator(object):
         return duration_total
 
     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)