|
@@ -1,27 +1,11 @@
|
|
|
-#!/usr/bin/env python3
|
|
|
-# -*- coding: utf-8 -*-
|
|
|
-"""
|
|
|
-@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
|
|
|
-@AUTHOR: ASJRD018
|
|
|
-@NAME: AnsjerFormal
|
|
|
-@software: PyCharm
|
|
|
-@DATE: 2018/12/5 9:30
|
|
|
-@Version: python3.6
|
|
|
-@MODIFY DECORD:ansjer dev
|
|
|
-@file: CloudVod.py
|
|
|
-@Contact: chanjunkai@163.com
|
|
|
-"""
|
|
|
import json
|
|
|
import math
|
|
|
import time
|
|
|
import urllib
|
|
|
-import datetime
|
|
|
-import boto3
|
|
|
|
|
|
-from Object.AliPayObject import AliPayObject
|
|
|
+import boto3
|
|
|
import oss2
|
|
|
import paypalrestsdk
|
|
|
-import logging
|
|
|
from aliyunsdkcore import client
|
|
|
from aliyunsdksts.request.v20150401 import AssumeRoleRequest
|
|
|
from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
|
|
@@ -29,42 +13,16 @@ 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 Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD
|
|
|
from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
|
|
|
- VodHlsSummary, LogModel
|
|
|
+ VodBucketModel
|
|
|
+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
|
|
|
-
|
|
|
-'''
|
|
|
-# 获取设备推送hls流 证书
|
|
|
-http://192.168.136.40:8077/cloudVod/getSts?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJGVFNMTDhITTQzN1ozOFdVMTExQSIsImNoYW5uZWwiOiI0In0.HO-PzoRwhQ4CFNkjthqOitf48c-XOvHjtNGCeUmBe9g
|
|
|
-# 获取存储的播放文件列表
|
|
|
-#修改状态
|
|
|
-http://192.168.136.40:8077/cloudVod/status?token=local&uid=xxx&channel=4&status=1
|
|
|
-# 回调vod
|
|
|
-http://192.168.136.40:8077/cloudVod/storeplaylist?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJGVFNMTDhITTQzN1ozOFdVMTExQSIsImNoYW5uZWwiOiI0In0.HO-PzoRwhQ4CFNkjthqOitf48c-XOvHjtNGCeUmBe9g&time=1234567891
|
|
|
-=============================
|
|
|
-# 生成订单
|
|
|
-http://test.dvema.com/cloudVod/createOrder?token=test&uid=xxx&channel=4&rank=1
|
|
|
-# 修改设备云存状态
|
|
|
-http://test.dvema.com/cloudVod/status?uid=xxx&channel=4&token=test&status=1
|
|
|
-
|
|
|
-# 获取指定设备云存关联信息
|
|
|
-http://test.dvema.com/cloudVod/details?token=test&uid=xxxx
|
|
|
-
|
|
|
-# 获取回放列表
|
|
|
-http://test.dvema.com/cloudVod/getHlsList?uid=xxxx&channel=4&token=test&daytime=2018121001
|
|
|
-
|
|
|
-
|
|
|
-2设备端
|
|
|
-http://test.dvema.com/cloudVod/getSts?uidToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjaGFubmVsIjoiNCIsInVpZCI6IkZUU0xMOEhNNDM3WjM4V1UxMTFBIn0.wkrwYvIYf5qEukOSTxALSAgSqop-gNBdEvSwScOgYB8
|
|
|
-# 支付宝支付
|
|
|
-http://192.168.136.40:8077/cloudVod/aliPayCreateOrder?token=local&channel=2&rank=1&uid=OOBDSU9547NTRSMF111A
|
|
|
-'''
|
|
|
+from Service.VodHlsService import SplitVodHlsObject
|
|
|
|
|
|
|
|
|
# 设备信息添加
|
|
@@ -85,7 +43,6 @@ class CloudVodView(View):
|
|
|
|
|
|
def validation(self, request_dict, request, operation):
|
|
|
response = ResponseObject()
|
|
|
- # operation => cloudVod/path
|
|
|
if operation is None:
|
|
|
return response.json(444, 'error path')
|
|
|
if operation == 'getSts':
|
|
@@ -95,8 +52,6 @@ class CloudVodView(View):
|
|
|
# 付款完成
|
|
|
elif operation == 'payExecute':
|
|
|
return self.do_paypal_execute(request_dict, response)
|
|
|
- elif operation == 'storeplaylist':
|
|
|
- return self.do_store_palylist(request_dict, response)
|
|
|
elif operation == 'payOK':
|
|
|
return self.do_pay_ok()
|
|
|
elif operation == 'payError':
|
|
@@ -441,90 +396,6 @@ class CloudVodView(View):
|
|
|
return HttpResponse(json.dumps(res, ensure_ascii=False),
|
|
|
content_type="application/json,charset=utf-8")
|
|
|
|
|
|
- # 生成设备sts上传授权
|
|
|
- # def do_getSts(self, request_dict, ip, response):
|
|
|
- # uidToken = request_dict.get('uidToken', None)
|
|
|
- # utko = UidTokenObject(uidToken)
|
|
|
- # if utko.flag is False:
|
|
|
- # return response.json(444, 'uidToken')
|
|
|
- # UID = utko.UID
|
|
|
- # channel = utko.channel
|
|
|
- # print(channel)
|
|
|
- # print(UID)
|
|
|
- # ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1). \
|
|
|
- # values('channel', 'bucket__bucket', 'bucket__endpoint', 'bucket__region', 'endTime')
|
|
|
- # now_time = int(time.time())
|
|
|
- # if not ubqs.exists():
|
|
|
- # res = {'code': 404, 'msg': '未购买'}
|
|
|
- # return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
- # elif ubqs[0]['endTime'] < now_time:
|
|
|
- # res = {'code': 404, 'msg': '过期'}
|
|
|
- # return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
- # oc_qs = OssCrdModel.objects.filter(uid=UID, channel=channel).values("addTime", "data")
|
|
|
- # if oc_qs.exists():
|
|
|
- # endTime = int(oc_qs[0]["addTime"]) + 3500
|
|
|
- # if endTime > now_time:
|
|
|
- # print(endTime)
|
|
|
- # print(now_time)
|
|
|
- # res = json.loads(oc_qs[0]["data"])
|
|
|
- # return JsonResponse(status=200, data=res)
|
|
|
- # # 套餐id
|
|
|
- # storage = '{uid}/vod{channel}/'.format(uid=UID, channel=channel)
|
|
|
- # bucket_name = ubqs[0]['bucket__bucket']
|
|
|
- # endpoint = ubqs[0]['bucket__endpoint']
|
|
|
- # access_key_id = OSS_STS_ACCESS_KEY
|
|
|
- # access_key_secret = OSS_STS_ACCESS_SECRET
|
|
|
- # region_id = ubqs[0]['bucket__region']
|
|
|
- # role_arn = OSS_ROLE_ARN
|
|
|
- # clt = client.AcsClient(access_key_id, access_key_secret, region_id)
|
|
|
- # req = AssumeRoleRequest.AssumeRoleRequest()
|
|
|
- # # 设置返回值格式为JSON。
|
|
|
- # req.set_accept_format('json')
|
|
|
- # req.set_RoleArn(role_arn)
|
|
|
- # req.set_RoleSessionName(UID)
|
|
|
- # req.set_DurationSeconds(3600)
|
|
|
- # Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*".format(bucket_name=bucket_name,
|
|
|
- # uid_channel=storage)
|
|
|
- # print(Resource_access)
|
|
|
- # policys = {
|
|
|
- # "Version": "1",
|
|
|
- # "Statement": [
|
|
|
- # {
|
|
|
- # "Action": ["oss:PutObject", "oss:DeleteObject", ],
|
|
|
- # "Resource": [Resource_access],
|
|
|
- # "Effect": "Allow",
|
|
|
- # "Condition": {
|
|
|
- # "IpAddress": {"acs:SourceIp": ip}
|
|
|
- # # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
|
|
|
- # # "IpAddress": {"acs:SourceIp": "*"}
|
|
|
- # }
|
|
|
- # }
|
|
|
- # ]
|
|
|
- # }
|
|
|
- # req.set_Policy(Policy=json.dumps(policys))
|
|
|
- # body = clt.do_action(req)
|
|
|
- # # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
|
|
|
- # token = json.loads(body.decode('utf-8'))
|
|
|
- # print(token)
|
|
|
- # res = {
|
|
|
- # 'AccessKeyId': token['Credentials']['AccessKeyId'],
|
|
|
- # 'AccessKeySecret': token['Credentials']['AccessKeySecret'],
|
|
|
- # 'SecurityToken': token['Credentials']['SecurityToken'],
|
|
|
- # 'Expiration': token['Credentials']['Expiration'],
|
|
|
- # 'expire': '3600',
|
|
|
- # 'endpoint': endpoint,
|
|
|
- # 'bucket_name': bucket_name,
|
|
|
- # 'arn': token['AssumedRoleUser']['Arn'],
|
|
|
- # 'code': 0,
|
|
|
- # 'storage': storage,
|
|
|
- # 'endTime': ubqs[0]['endTime'],
|
|
|
- # 'ip': ip}
|
|
|
- # if oc_qs.exists():
|
|
|
- # oc_qs.update(data=json.dumps(res), addTime=now_time)
|
|
|
- # else:
|
|
|
- # OssCrdModel.objects.create(uid=UID, channel=channel, data=json.dumps(res), addTime=now_time)
|
|
|
- # return JsonResponse(status=200, data=res)
|
|
|
-
|
|
|
def do_paypal_execute(self, request_dict, response):
|
|
|
paymentId = request_dict.get('paymentId', None)
|
|
|
PayerID = request_dict.get('PayerID', None)
|
|
@@ -611,51 +482,6 @@ class CloudVodView(View):
|
|
|
format(uidToken=utko.token, SERVER_DOMAIN=SERVER_DOMAIN)
|
|
|
return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
|
|
|
|
|
|
- def do_store_palylist(self, request_dict, response):
|
|
|
- uidToken = request_dict.get('uidToken', None)
|
|
|
- storeTime = request_dict.get('time', None)
|
|
|
- sec = request_dict.get('sec', None)
|
|
|
- utko = UidTokenObject(uidToken)
|
|
|
- if utko.flag is False:
|
|
|
- return response.json(444, 'uidToken')
|
|
|
- if not uidToken or not storeTime or not sec:
|
|
|
- return response.json(444, 'uidToken,time,sec')
|
|
|
- sec = int(sec)
|
|
|
- UID = utko.UID
|
|
|
- channel = utko.channel
|
|
|
- print(channel)
|
|
|
- print(UID)
|
|
|
- nowTime = int(time.time())
|
|
|
- if not OssCrdModel.objects.filter(uid=UID, channel=channel).exists():
|
|
|
- res = {'code': 404, 'msg': '设备未购买'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
- qs = UID_Bucket.objects.filter(uid=UID, channel=channel, status=1, endTime__gte=nowTime). \
|
|
|
- values("channel", "bucket__storeDay", "bucket_id")
|
|
|
- if not qs.exists():
|
|
|
- res = {'code': 404, 'msg': '设备未购买'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
- storeDay = qs[0]['bucket__storeDay']
|
|
|
- bucketID = qs[0]['bucket_id']
|
|
|
- endTime = int(storeTime) + storeDay * 86400
|
|
|
- VodHlsModel.objects.create(uid=UID, channel=channel, time=storeTime,
|
|
|
- endTime=endTime, bucket_id=bucketID, sec=sec)
|
|
|
-
|
|
|
- end_time_stamp = datetime.datetime.fromtimestamp(int(storeTime))
|
|
|
- end_time_str = datetime.datetime(end_time_stamp.year, end_time_stamp.month, 1)
|
|
|
- end_time_stamp = CommonService.str_to_timestamp(end_time_str.strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
- vod_hls_qs = VodHlsSummary.objects.filter(uid=UID, time=end_time_stamp)
|
|
|
- if vod_hls_qs.exists():
|
|
|
- vod_hls = vod_hls_qs.first()
|
|
|
- vod_hls.upload_frequency += 1
|
|
|
- vod_hls.upload_duration += sec
|
|
|
- vod_hls.updated_time = nowTime
|
|
|
- vod_hls.save()
|
|
|
- else:
|
|
|
- VodHlsSummary.objects.create(uid=UID, time=end_time_stamp, created_time=nowTime, updated_time=nowTime,
|
|
|
- upload_duration=sec, upload_frequency=1)
|
|
|
-
|
|
|
- return response.json(0)
|
|
|
-
|
|
|
def do_filter_playlist(self, request_dict, userID, response):
|
|
|
startTime = int(request_dict.get('startTime', None))
|
|
|
endTime = int(request_dict.get('endTime', None))
|
|
@@ -668,20 +494,25 @@ class CloudVodView(View):
|
|
|
if not ubqs.exists():
|
|
|
return response.json(10, '设备未购买')
|
|
|
nowTime = int(time.time())
|
|
|
- vodqs = VodHlsModel.objects.filter(uid=uid, channel=channel, time__range=(startTime, endTime),
|
|
|
- endTime__gte=nowTime) \
|
|
|
- .values("time", "sec", "bucket__bucket", "bucket__endpoint", "bucket__region")
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ vodqs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time__range=(startTime, endTime),
|
|
|
+ end_time__gte=nowTime).values("start_time", "sec", "bucket_id")
|
|
|
+ if not vodqs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
|
|
|
+ if not vod_bucket_qs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ bucket_name = vod_bucket_qs[0]["bucket"]
|
|
|
+ endpoint = vod_bucket_qs[0]["endpoint"]
|
|
|
vod_play_list = []
|
|
|
print(vodqs)
|
|
|
auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
|
|
|
for vod in vodqs:
|
|
|
- bucket_name = vod["bucket__bucket"]
|
|
|
- endpoint = vod["bucket__endpoint"]
|
|
|
bucket = oss2.Bucket(auth, endpoint, bucket_name)
|
|
|
m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
|
|
|
- format(uid=uid, channel=channel, time=vod['time'])
|
|
|
+ format(uid=uid, channel=channel, time=vod['start_time'])
|
|
|
ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
|
|
|
- format(uid=uid, channel=channel, time=vod['time'])
|
|
|
+ format(uid=uid, channel=channel, time=vod['start_time'])
|
|
|
url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
|
|
|
urllst = url.split('?')
|
|
|
url_start = urllib.parse.unquote(urllst[0])
|
|
@@ -690,7 +521,9 @@ class CloudVodView(View):
|
|
|
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']})
|
|
|
+ vod_play_list.append(
|
|
|
+ {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec']})
|
|
|
+ vod_play_list = sorted(vod_play_list, key=lambda item: -item['name'])
|
|
|
return response.json(0, vod_play_list)
|
|
|
|
|
|
# backend find play list0
|
|
@@ -703,20 +536,25 @@ class CloudVodView(View):
|
|
|
if own_perm is False:
|
|
|
return response.json(404)
|
|
|
nowTime = int(time.time())
|
|
|
- vodqs = VodHlsModel.objects.filter(uid=UID, channel=channel, time__range=(startTime, endTime),
|
|
|
- endTime__gte=nowTime) \
|
|
|
- .values("time", "sec", "bucket__bucket", "bucket__endpoint", "bucket__region", "id")
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ vodqs = split_vod_hls_obj.get_vod_hls_data(uid=UID, channel=channel, start_time__range=(startTime, endTime),
|
|
|
+ end_time__gte=nowTime).values("start_time", "sec", "bucket_id", "id")
|
|
|
+ if not vodqs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ vod_bucket_qs = VodBucketModel.objects.filter(id=vodqs[0]['bucket_id']).values('bucket', 'endpoint')
|
|
|
+ if not vod_bucket_qs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ bucket_name = vod_bucket_qs[0]["bucket"]
|
|
|
+ endpoint = vod_bucket_qs[0]["endpoint"]
|
|
|
vod_play_list = []
|
|
|
print(vodqs)
|
|
|
auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
|
|
|
for vod in vodqs:
|
|
|
- bucket_name = vod["bucket__bucket"]
|
|
|
- endpoint = vod["bucket__endpoint"]
|
|
|
bucket = oss2.Bucket(auth, endpoint, bucket_name)
|
|
|
m3u8 = '{uid}/vod{channel}/{time}/{time}.m3u8'. \
|
|
|
- format(uid=UID, channel=channel, time=vod['time'])
|
|
|
+ format(uid=UID, channel=channel, time=vod['start_time'])
|
|
|
ts = '{uid}/vod{channel}/{time}/ts0.ts'. \
|
|
|
- format(uid=UID, channel=channel, time=vod['time'])
|
|
|
+ format(uid=UID, channel=channel, time=vod['start_time'])
|
|
|
url = bucket.sign_url('GET', m3u8, 3600, params={'x-oss-process': 'hls/sign'})
|
|
|
urllst = url.split('?')
|
|
|
url_start = urllib.parse.unquote(urllst[0])
|
|
@@ -726,7 +564,8 @@ class CloudVodView(View):
|
|
|
thumb = bucket.sign_url('GET', ts, 3600,
|
|
|
params={'x-oss-process': 'video/snapshot,t_1000,m_fast,w_300'})
|
|
|
vod_play_list.append(
|
|
|
- {'name': vod['time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'], 'id': vod['id']})
|
|
|
+ {'name': vod['start_time'], 'sign_url': vod_play_url, 'thumb': thumb, 'sec': vod['sec'], 'id': vod['id']})
|
|
|
+ vod_play_list = sorted(vod_play_list, key=lambda item: -item['name'])
|
|
|
return response.json(0, vod_play_list)
|
|
|
|
|
|
def do_pay_status(self, request_dict, userID, response):
|
|
@@ -907,17 +746,3 @@ class CloudVodView(View):
|
|
|
return response.json(804)
|
|
|
else:
|
|
|
return response.json(804)
|
|
|
-
|
|
|
-
|
|
|
-def deleteVodHls(request):
|
|
|
- response = ResponseObject()
|
|
|
- i = int(request.GET.get('i', 5))
|
|
|
-
|
|
|
- import time
|
|
|
- nowTime = int(time.time())
|
|
|
- for i in range(i):
|
|
|
- vh_qs = VodHlsModel.objects.filter(time__lte=str(nowTime - 3600 * 24 * 35))[0:10000]
|
|
|
- id_list = vh_qs.values_list("id", flat=True)
|
|
|
- print(id_list)
|
|
|
- VodHlsModel.objects.filter(id__in=list(id_list)).delete()
|
|
|
- return response.json(0)
|