Browse Source

Merge branch 'dev' into pzb

pengzhibo168 5 years ago
parent
commit
0e74c5dbc6

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

+ 71 - 61
Controller/UserController.py

@@ -2386,7 +2386,7 @@ class generatePictureCodeView(TemplateView):
             random_low_alpha = chr(random.randint(97, 122))
             random_low_alpha = chr(random.randint(97, 122))
             random_high_alpha = chr(random.randint(65, 90))
             random_high_alpha = chr(random.randint(65, 90))
             random_char = random.choice([random_num, random_low_alpha, random_high_alpha])
             random_char = random.choice([random_num, random_low_alpha, random_high_alpha])
-            draw.text((i * 50 + 20, 5), random_char, 'white', kumo_font)
+            draw.text((i * 50 + 20, -3), random_char, 'white', kumo_font)
 
 
             # 保存验证码字符串
             # 保存验证码字符串
             valid_code_str += random_char
             valid_code_str += random_char
@@ -2397,13 +2397,14 @@ class generatePictureCodeView(TemplateView):
         # 噪点噪线
         # 噪点噪线
         width = 260
         width = 260
         height = 34
         height = 34
-        for i in range(5):
+        for i in range(10):
             x1 = random.randint(0, width)
             x1 = random.randint(0, width)
             x2 = random.randint(0, width)
             x2 = random.randint(0, width)
             y1 = random.randint(0, height)
             y1 = random.randint(0, height)
             y2 = random.randint(0, height)
             y2 = random.randint(0, height)
             draw.line((x1, y1, x2, y2), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
             draw.line((x1, y1, x2, y2), fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
-        for i in range(5):
+
+        for i in range(10):
             draw.point([random.randint(0, width), random.randint(0, height)],
             draw.point([random.randint(0, width), random.randint(0, height)],
                        fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
                        fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
             x = random.randint(0, width)
             x = random.randint(0, width)
@@ -2420,10 +2421,12 @@ class generatePictureCodeView(TemplateView):
     # 生成验证码方法
     # 生成验证码方法
     def validates(self, request_dict):
     def validates(self, request_dict):
         # 页面传过来的uuid
         # 页面传过来的uuid
-        # id = request.GET.get('id','')
-        id = request_dict.get('id', '')
+        imageCodeId = request_dict.get('imageCodeId', '')
+        response = ResponseObject()
+        if not imageCodeId:
+            return response.json(444)
         # 存入redis的key
         # 存入redis的key
-        image_code_id = "image_code_%s" % id
+        image_code_id = "image_code_%s" % imageCodeId
         """
         """
         基于PIL模块动态生成响应状态码图片
         基于PIL模块动态生成响应状态码图片
         :param request:
         :param request:
@@ -2431,7 +2434,7 @@ class generatePictureCodeView(TemplateView):
         """
         """
         # 图片data,验证码
         # 图片data,验证码
         data, valid_code_str = self.get_valid_code_img(request_dict)
         data, valid_code_str = self.get_valid_code_img(request_dict)
-        if id:
+        if imageCodeId:
             redisObj = RedisObject(db=6)
             redisObj = RedisObject(db=6)
             # 单条维护
             # 单条维护
             redisObj.set_data(key=image_code_id, val=valid_code_str, expire=120)
             redisObj.set_data(key=image_code_id, val=valid_code_str, expire=120)
@@ -2447,7 +2450,6 @@ class Image_Code_RegisterView(TemplateView):
         return super(Image_Code_RegisterView, self).dispatch(*args, **kwargs)
         return super(Image_Code_RegisterView, self).dispatch(*args, **kwargs)
 
 
     def post(self, request, *args, **kwargs):
     def post(self, request, *args, **kwargs):
-        print("post进来了吗")
         request.encoding = 'utf-8'
         request.encoding = 'utf-8'
         request_dict = request.POST
         request_dict = request.POST
         return self.validates(request_dict)
         return self.validates(request_dict)
@@ -2460,18 +2462,17 @@ class Image_Code_RegisterView(TemplateView):
     #检测验证码,并注册
     #检测验证码,并注册
     def validates(self,request_dict):
     def validates(self,request_dict):
         print("__________request_dict:%s" % request_dict)
         print("__________request_dict:%s" % request_dict)
-        phone = request_dict.get('phone',None)
-        #注释
-        #username = request_dict.get('userName',None)
         userEmail = request_dict.get('userEmail',None)
         userEmail = request_dict.get('userEmail',None)
         password = request_dict.get('userPwd',None)
         password = request_dict.get('userPwd',None)
-        language = request_dict.get('language',None)
-
+        lang = request_dict.get('lang',None)
         #前端传进来的uuid
         #前端传进来的uuid
         imageCodeId = request_dict.get('imageCodeId',None)
         imageCodeId = request_dict.get('imageCodeId',None)
         # 页面输入的验证码
         # 页面输入的验证码
-        valid_code = request_dict.get('id_v_code',None)
-        response = ResponseObject(language)
+        response = ResponseObject(lang)
+        valid_code = request_dict.get('id_v_code', None)
+
+        if not all([userEmail, password, lang, imageCodeId, valid_code]):
+            return response.json(444)
         try:
         try:
             for i in range(1, 4):
             for i in range(1, 4):
                 if i == 1:
                 if i == 1:
@@ -2486,54 +2487,63 @@ class Image_Code_RegisterView(TemplateView):
                     password = base64.b64decode(password)
                     password = base64.b64decode(password)
                     password = password.decode('utf-8')
                     password = password.decode('utf-8')
                     password = password[3:-3]
                     password = password[3:-3]
-            # print(password)
         except Exception as e:
         except Exception as e:
             return response.json(111)
             return response.json(111)
-        else:
-            if not userEmail:
-                return response.json(105)
-            if not password:
-                return response.json(109)
-            if not phone:
-                return response.json(100)
-            userEmail = userEmail.strip()
-            password = password.strip()
-            # 注释
-            if userEmail:
-                emailValid = Device_User.objects.filter(userEmail=userEmail)
-                if emailValid:
-                    return response.json(103)
-            if phone:
-                phoneValid = Device_User.objects.filter(phone=phone)
-                if phoneValid:
-                    return response.json(101)
-            #根据uuid拼接的key
-            image_code_key = "image_code_%s" %imageCodeId
-            #判断验证码是否过期
-            if image_code_key is None:
-                return response.json(120)
-            redisObj = RedisObject(db=6)
-            #redis里面的验证码
-            redis_image_code = redisObj.get_data(key=image_code_key)
-            #验证用户输入的验证码和redis中的验证码
-            if valid_code.lower()!=redis_image_code.lower():
-                return response.json(121)
-            # 删除redis中的图片验证码,防止用户使用同一个图片验证码验证多次
-            redisObj.del_data(key=image_code_key)
-            username = phone
-            # #存用户名和密码
-            create_data = {
-                "phone":phone,
-                "username": username,
-                "NickName": username,
-                "userEmail": userEmail,
-                "password": make_password(password),
-                "userID": CommonService.getUserID(μs=False, setOTAID=True),
-                "is_active": True,
-                "user_isValid": True,
-            }
-            users = Device_User.objects.create(**create_data)
-            return response.json(0)
+        try:
+            for i in range(1, 4):
+                if i == 1:
+                    valid_code = base64.b64decode(valid_code)
+                    valid_code = valid_code.decode('utf-8')
+                    valid_code = valid_code[1:-1]
+                if i == 2:
+                    valid_code = base64.b64decode(valid_code)
+                    valid_code = valid_code.decode('utf-8')
+                    valid_code = valid_code[2:-2]
+                if i == 3:
+                    valid_code = base64.b64decode(valid_code)
+                    valid_code = valid_code.decode('utf-8')
+                    valid_code = valid_code[3:-3]
+            print(valid_code)
+        except Exception as e:
+            return response.json(121)
+        if not userEmail:
+            return response.json(105)
+        if not password:
+            return response.json(109)
+        userEmail = userEmail.strip()
+        password = password.strip()
+        # 注释
+        if userEmail:
+            emailValid = Device_User.objects.filter(userEmail=userEmail)
+            if emailValid:
+                return response.json(103)
+        #根据uuid拼接的key
+        image_code_key = "image_code_%s" %imageCodeId
+        #判断验证码是否过期
+        if image_code_key is None:
+            return response.json(120)
+        redisObj = RedisObject(db=6)
+        #redis里面的验证码
+        redis_image_code = redisObj.get_data(key=image_code_key)
+        #验证用户输入的验证码和redis中的验证码
+        if valid_code.lower()!=redis_image_code.lower():
+            return response.json(121)
+        # 删除redis中的图片验证码,防止用户使用同一个图片验证码验证多次
+        redisObj.del_data(key=image_code_key)
+        username = userEmail
+        # #存用户名和密码
+        create_data = {
+            "username": username,
+            "NickName": username,
+            "userEmail": userEmail,
+            "password": make_password(password),
+            "userID": CommonService.getUserID(μs=False, setOTAID=True),
+            "is_active": True,
+            "user_isValid": True,
+        }
+        print("bbbb")
+        users = Device_User.objects.create(**create_data)
+        return response.json(0)
 
 
 
 
 
 

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