|
@@ -11,11 +11,17 @@
|
|
|
@file: Test.py
|
|
|
@Contact: chanjunkai@163.com
|
|
|
"""
|
|
|
+import os
|
|
|
+import traceback
|
|
|
+
|
|
|
import botocore
|
|
|
+import cv2
|
|
|
from botocore import client
|
|
|
+
|
|
|
from Controller.DeviceConfirmRegion import Device_Region
|
|
|
from Object.AWS.AmazonS3Util import AmazonS3Util
|
|
|
from Object.RedisObject import RedisObject
|
|
|
+from Service.VodHlsService import SplitVodHlsObject
|
|
|
|
|
|
'''
|
|
|
http://192.168.136.40:8077/Test
|
|
@@ -30,7 +36,6 @@ import oss2
|
|
|
import paypalrestsdk
|
|
|
import logging
|
|
|
from aliyunsdkcore import client
|
|
|
-from aliyunsdksts.request.v20150401 import AssumeRoleRequest
|
|
|
from django.http import JsonResponse, HttpResponse
|
|
|
from django.utils.decorators import method_decorator
|
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
@@ -38,7 +43,7 @@ from django.views.generic.base import View
|
|
|
from django.contrib.auth.hashers import make_password # 对密码加密模块
|
|
|
from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, AWS_ACCESS_KEY_ID, \
|
|
|
AWS_SECRET_ACCESS_KEY, SERVER_TYPE, AWS_SES_ACCESS_REGION
|
|
|
-from Model.models import Order_Model, Store_Meal, VodHlsModel, OssCrdModel, StsCrdModel, DeviceLogModel
|
|
|
+from Model.models import Order_Model, Store_Meal, OssCrdModel, StsCrdModel, DeviceLogModel, VodBucketModel
|
|
|
from Object.ResponseObject import ResponseObject
|
|
|
from Object.TokenObject import TokenObject
|
|
|
from Service.CommonService import CommonService
|
|
@@ -49,6 +54,7 @@ from Ansjer.config import SERVER_DOMAIN_SSL
|
|
|
SERVER_DOMAIN = 'http://test.dvema.com/'
|
|
|
ACCESS_KEY = "AKIA2E67UIMD3CYTIWPA"
|
|
|
SECRET_KEY = "mHl79oiKxEf+89friTtwIcF8FUFIdVksUwySixwQ"
|
|
|
+LOGGER = logging.getLogger('info')
|
|
|
|
|
|
|
|
|
# 测试接口sdk
|
|
@@ -148,9 +154,47 @@ class testView(View):
|
|
|
return self.read_redis_list(response)
|
|
|
elif operation == 'playM3u8':
|
|
|
return self.play_m3u8(request_dict, response)
|
|
|
+ elif operation == 'generate_video':
|
|
|
+ return self.generate_video(request_dict, response)
|
|
|
else:
|
|
|
return 123
|
|
|
|
|
|
+ @classmethod
|
|
|
+ def generate_video(cls, request_dict, response):
|
|
|
+ # 设计抽取图片规则通过消息随机还是时间随机,调试copy S3对象查询是否携带失效时间
|
|
|
+ try:
|
|
|
+ DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
|
|
+ arr_list = ['1666756086.jpeg', '1666831275.jpeg', '1666841492.jpeg']
|
|
|
+ s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[0], AWS_SECRET_ACCESS_KEY[0], 'cn-northwest-1')
|
|
|
+ bucket = 'push-cloud-photo'
|
|
|
+ for item in arr_list:
|
|
|
+ path = DIR + r'\Ansjer\file\{}'.format(item)
|
|
|
+ s3_key = 'HA154GVEDH41RY8Y111A/1/{}'.format(item)
|
|
|
+ s3.download_object(bucket, s3_key, path)
|
|
|
+ video_dir = DIR + r'\Ansjer\file\result.mp4' # 输出视频的保存路径
|
|
|
+ fps = 0.5 # 帧率
|
|
|
+ img_size = (1920, 1080) # 图片尺寸
|
|
|
+ fourcc = cv2.VideoWriter_fourcc(*"mp4v")
|
|
|
+ videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
|
|
|
+ for i in arr_list:
|
|
|
+ img_path = DIR + r'\Ansjer\file\{}'.format(i)
|
|
|
+ frame = cv2.imread(img_path)
|
|
|
+ frame = cv2.resize(frame, img_size) # 生成视频 图片尺寸和设定尺寸相同
|
|
|
+ videoWriter.write(frame) # 将图片写进视频里
|
|
|
+ os.remove(img_path)
|
|
|
+ videoWriter.release() # 释放资源
|
|
|
+ data = open(video_dir, 'rb')
|
|
|
+ key = 'HA154GVEDH41RY8Y111A/1/20221027.mp4'
|
|
|
+ s3.upload_file_obj(bucket, key, data)
|
|
|
+ response_url = s3.generate_file_obj_url(bucket, key)
|
|
|
+ os.remove(video_dir)
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+ ex = traceback.format_exc()
|
|
|
+ LOGGER.info('--->抽取推送图片异常:{}'.format(ex))
|
|
|
+ return response.json(177, ex)
|
|
|
+ return response.json(0, response_url)
|
|
|
+
|
|
|
@classmethod
|
|
|
def head_bucket(cls, request_dict, response):
|
|
|
bucket_name = request_dict.get('bucket', None)
|
|
@@ -489,294 +533,6 @@ class testView(View):
|
|
|
# return response
|
|
|
# return HttpResponse(status=200, content=playlist)
|
|
|
|
|
|
- def do_test_get_sign_sts(self, request_dict, ip, response):
|
|
|
- # uid = 'GZL2PEFJPLY7W6BG111A'
|
|
|
- # channel = 2
|
|
|
- uid = 'VVDHCVBYDKFMJRWA111A'
|
|
|
- channel = 1
|
|
|
- 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", "endTime")
|
|
|
- if ubqs.exists():
|
|
|
- if ubqs[0]["bucket__mold"] == 0:
|
|
|
- # 阿里云 oss sts
|
|
|
- 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 + '_' + channel)
|
|
|
- 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)
|
|
|
- elif ubqs[0]["bucket__mold"] == 1:
|
|
|
- # 亚马逊 s3 sts
|
|
|
- sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
|
|
|
- values("addTime", "data")
|
|
|
- if sts_qs.exists():
|
|
|
- endTime = int(sts_qs[0]["addTime"]) + 3500
|
|
|
- if endTime > now_time:
|
|
|
- print(endTime)
|
|
|
- print(now_time)
|
|
|
- res = json.loads(sts_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']
|
|
|
- region_id = ubqs[0]['bucket__region']
|
|
|
-
|
|
|
- ###############
|
|
|
- REGION_NAME = region_id
|
|
|
- boto3_sts = boto3.client(
|
|
|
- 'sts',
|
|
|
- aws_access_key_id='AKIA2E67UIMD45Y3HL53',
|
|
|
- aws_secret_access_key='ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw',
|
|
|
- region_name=REGION_NAME
|
|
|
- )
|
|
|
- Policy = {
|
|
|
- "Version": "2012-10-17",
|
|
|
- "Statement": [
|
|
|
- {
|
|
|
- "Effect": "Allow",
|
|
|
- "Action": "s3:*",
|
|
|
- "Resource": ["arn:aws:s3:::azvod1/{uid_channel}/*".
|
|
|
- format(uid_channel=storage)]
|
|
|
- }
|
|
|
- ]
|
|
|
- }
|
|
|
- response = boto3_sts.get_federation_token(
|
|
|
- Name='{role_name}'.format(role_name=uid + '_' + channel),
|
|
|
- Policy=json.dumps(Policy),
|
|
|
- DurationSeconds=7200
|
|
|
- )
|
|
|
- ###############
|
|
|
- res = {
|
|
|
- 'AccessKeyId': response['Credentials']['AccessKeyId'],
|
|
|
- 'AccessKeySecret': response['Credentials']['SecretAccessKey'],
|
|
|
- 'SessionToken': response['Credentials']['SessionToken'],
|
|
|
- 'Expiration': response['Credentials']['Expiration'],
|
|
|
- 'expire': '3600',
|
|
|
- 'endpoint': endpoint,
|
|
|
- 'bucket_name': bucket_name,
|
|
|
- 'arn': response['FederatedUser']['Arn'],
|
|
|
- 'code': 0,
|
|
|
- 'storage': storage,
|
|
|
- 'endTime': ubqs[0]['endTime'],
|
|
|
- 'ip': ip,
|
|
|
- }
|
|
|
- if sts_qs.exists():
|
|
|
- sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
|
|
|
- else:
|
|
|
- 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!'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False),
|
|
|
- content_type="application/json,charset=utf-8")
|
|
|
-
|
|
|
- def do_get_sign_sts(self, request_dict, ip, response):
|
|
|
- # uid = 'GZL2PEFJPLY7W6BG111A'
|
|
|
- # channel = 2
|
|
|
- uid = '86YC8Z192VB1VMKU111A'
|
|
|
- channel = 1
|
|
|
- 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", "endTime")
|
|
|
- if ubqs.exists():
|
|
|
- if ubqs[0]["bucket__mold"] == 0:
|
|
|
- # 阿里云 oss sts
|
|
|
- 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 + '_' + channel)
|
|
|
- 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)
|
|
|
- elif ubqs[0]["bucket__mold"] == 1:
|
|
|
- # 亚马逊 s3 sts
|
|
|
- sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
|
|
|
- values("addTime", "data")
|
|
|
- if sts_qs.exists():
|
|
|
- endTime = int(sts_qs[0]["addTime"]) + 3500
|
|
|
- if endTime > now_time:
|
|
|
- print(endTime)
|
|
|
- print(now_time)
|
|
|
- res = json.loads(sts_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']
|
|
|
- region_id = ubqs[0]['bucket__region']
|
|
|
-
|
|
|
- ###############
|
|
|
- REGION_NAME = region_id
|
|
|
- boto3_sts = boto3.client(
|
|
|
- 'sts',
|
|
|
- aws_access_key_id='AKIA2E67UIMD45Y3HL53',
|
|
|
- aws_secret_access_key='ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw',
|
|
|
- region_name=REGION_NAME
|
|
|
- )
|
|
|
- Policy = {
|
|
|
- "Version": "2012-10-17",
|
|
|
- "Statement": [
|
|
|
- {
|
|
|
- "Effect": "Allow",
|
|
|
- "Action": "s3:*",
|
|
|
- "Resource": ["arn:aws:s3:::azvod1/{uid_channel}/*".
|
|
|
- format(uid_channel=storage)]
|
|
|
- }
|
|
|
- ]
|
|
|
- }
|
|
|
- response = boto3_sts.get_federation_token(
|
|
|
- Name='{role_name}'.format(role_name=uid + '_' + channel),
|
|
|
- Policy=json.dumps(Policy),
|
|
|
- DurationSeconds=7200
|
|
|
- )
|
|
|
- ###############
|
|
|
- res = {
|
|
|
- 'AccessKeyId': response['Credentials']['AccessKeyId'],
|
|
|
- 'AccessKeySecret': response['Credentials']['SecretAccessKey'],
|
|
|
- 'SessionToken': response['Credentials']['SessionToken'],
|
|
|
- 'Expiration': response['Credentials']['Expiration'],
|
|
|
- 'expire': '3600',
|
|
|
- 'endpoint': endpoint,
|
|
|
- 'bucket_name': bucket_name,
|
|
|
- 'arn': response['FederatedUser']['Arn'],
|
|
|
- 'code': 0,
|
|
|
- 'storage': storage,
|
|
|
- 'endTime': ubqs[0]['endTime'],
|
|
|
- 'ip': ip,
|
|
|
- }
|
|
|
- if sts_qs.exists():
|
|
|
- sts_qs.update(data=json.dumps(res, default=str), addTime=now_time)
|
|
|
- else:
|
|
|
- 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!'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False),
|
|
|
- content_type="application/json,charset=utf-8")
|
|
|
-
|
|
|
def do_pay_by_ali(self, request_dict, userID, response):
|
|
|
uid = request_dict.get('uid', None)
|
|
|
rank = request_dict.get('rank', None)
|
|
@@ -855,23 +611,24 @@ class testView(View):
|
|
|
ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel).values('status')
|
|
|
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")
|
|
|
- vodqs = VodHlsModel.objects.filter(uid=uid, channel=channel) \
|
|
|
- .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).values("start_time", "sec", "bucket_id")
|
|
|
+ if not vodqs.exists():
|
|
|
+ return response.json(173)
|
|
|
vod_play_list = []
|
|
|
- print(vodqs)
|
|
|
auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
|
|
|
+ bucket_id = vodqs[0]['bucket_id']
|
|
|
+ vod_bucket_qs = VodBucketModel.objects.filter(id=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"]
|
|
|
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])
|
|
@@ -880,7 +637,8 @@ class testView(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']})
|
|
|
return response.json(0, vod_play_list)
|
|
|
|
|
|
def generate_token(self, request_dict, userID):
|
|
@@ -977,7 +735,8 @@ class testView(View):
|
|
|
month = int(month)
|
|
|
startTime = CommonService.str_to_timestamp('{year}-{month}'.format(year=year, month=month), '%Y-%m')
|
|
|
endTime = CommonService.str_to_timestamp('{year}-{month}'.format(year=year, month=month + 1), '%Y-%m') - 1
|
|
|
- qsTs = VodHlsModel.objects.filter(time__gte=startTime, time__lte=endTime).values('fg')
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ qsTs = split_vod_hls_obj.get_vod_hls_data(time__gte=startTime, time__lte=endTime).values('fg')
|
|
|
if not qsTs.exists():
|
|
|
return HttpResponse('查无数据')
|
|
|
sumTs = 0 # 总ts个数
|
|
@@ -1020,22 +779,25 @@ class testView(View):
|
|
|
storeTime = request_dict.get('time', None)
|
|
|
now_time = int(time.time())
|
|
|
try:
|
|
|
- vh_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, time=storeTime, endTime__gte=now_time). \
|
|
|
- values("sec", "fg", "bucket__bucket", "bucket__endpoint", "bucket__region", "bucket__mold")
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ vh_qs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time=storeTime,
|
|
|
+ end_time__gte=now_time).values("sec", "fg", "bucket_id")
|
|
|
if not vh_qs.exists():
|
|
|
return response.json(173)
|
|
|
- fg = vh_qs[0]['fg']
|
|
|
- bucket__region = vh_qs[0]['bucket__region']
|
|
|
- bucket_name = vh_qs[0]['bucket__bucket']
|
|
|
-
|
|
|
+ vod_bucket_qs = VodBucketModel.objects.filter(id=vh_qs[0]['bucket_id']).values('bucket', 'region', 'mold')
|
|
|
+ if not vod_bucket_qs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ fg = int(vh_qs[0]['fg'])
|
|
|
+ bucket_region = vod_bucket_qs[0]['region']
|
|
|
+ bucket_name = vod_bucket_qs[0]['bucket']
|
|
|
+ mold = vod_bucket_qs[0]['mold']
|
|
|
session = Session(
|
|
|
- aws_access_key_id=AWS_ACCESS_KEY_ID[vh_qs[0]["bucket__mold"]],
|
|
|
- aws_secret_access_key=AWS_SECRET_ACCESS_KEY[vh_qs[0]["bucket__mold"]],
|
|
|
- region_name=bucket__region
|
|
|
+ aws_access_key_id=AWS_ACCESS_KEY_ID[mold],
|
|
|
+ aws_secret_access_key=AWS_SECRET_ACCESS_KEY[mold],
|
|
|
+ region_name=bucket_region
|
|
|
)
|
|
|
conn = session.client('s3')
|
|
|
playlist_entries = []
|
|
|
- fg = int(fg)
|
|
|
# ts_count = fg & 0xf
|
|
|
# fg 64位整型,低四位代表ts文件总数,然后进行位运算,一次移四位,每四位转为十进制即为当前ts文件的秒数
|
|
|
for i in range(15):
|
|
@@ -1050,7 +812,7 @@ class testView(View):
|
|
|
'Bucket': bucket_name,
|
|
|
'Key': tsFile
|
|
|
},
|
|
|
- ExpiresIn=24*60*60
|
|
|
+ ExpiresIn=24 * 60 * 60
|
|
|
)
|
|
|
playlist_entries.append({
|
|
|
'name': response_url,
|