|
@@ -39,6 +39,7 @@ from Object.WechatPayObject import WechatPayObject
|
|
|
from Object.m3u8generate import PlaylistGenerator
|
|
|
from Service.CommonService import CommonService
|
|
|
from Service.PayService import PaymentService
|
|
|
+from Service.VodHlsService import SplitVodHlsObject
|
|
|
|
|
|
|
|
|
# 设备信息添加
|
|
@@ -284,25 +285,29 @@ class CloudStorageView(View):
|
|
|
"""
|
|
|
uid_token = request_dict.get('uid', None)
|
|
|
channel = request_dict.get('channel', None)
|
|
|
- store_time = request_dict.get('time', None)
|
|
|
- if not all([uid_token, channel, store_time]):
|
|
|
+ start_time = request_dict.get('time', None)
|
|
|
+ if not all([uid_token, channel, start_time]):
|
|
|
return response.json(444)
|
|
|
uid = jwt.decode(uid_token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256').get('uid', '')
|
|
|
now_time = int(time.time())
|
|
|
- vod_hls_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, time=store_time,
|
|
|
- endTime__gte=now_time).values("sec", "fg", "bucket__bucket",
|
|
|
- "bucket__endpoint", "bucket__region",
|
|
|
- "bucket__mold")
|
|
|
+
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ vod_hls_qs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, start_time=start_time,
|
|
|
+ end_time__gte=now_time).values("sec", "fg", "bucket_id")
|
|
|
if not vod_hls_qs.exists():
|
|
|
return response.json(173)
|
|
|
fg = int(vod_hls_qs[0]['fg'])
|
|
|
- bucket__region = vod_hls_qs[0]['bucket__region']
|
|
|
- bucket_name = vod_hls_qs[0]['bucket__bucket']
|
|
|
-
|
|
|
+ bucket_id = vod_hls_qs[0]['bucket_id']
|
|
|
+ vod_bucket_qs = VodBucketModel.objects.filter(id=bucket_id).values('bucket', 'region', 'mold')
|
|
|
+ if not vod_bucket_qs.exists():
|
|
|
+ return response.json(173)
|
|
|
+ bucket_region = vod_bucket_qs[0]['region']
|
|
|
+ bucket_name = vod_bucket_qs[0]['bucket']
|
|
|
+ mold = vod_bucket_qs[0]["mold"]
|
|
|
s3_obj = AmazonS3Util(
|
|
|
- AWS_ACCESS_KEY_ID[vod_hls_qs[0]["bucket__mold"]],
|
|
|
- AWS_SECRET_ACCESS_KEY[vod_hls_qs[0]["bucket__mold"]],
|
|
|
- bucket__region
|
|
|
+ AWS_ACCESS_KEY_ID[mold],
|
|
|
+ AWS_SECRET_ACCESS_KEY[mold],
|
|
|
+ bucket_region
|
|
|
)
|
|
|
|
|
|
playlist_entries = []
|
|
@@ -312,7 +317,7 @@ class CloudStorageView(View):
|
|
|
shift = (i + 1) * 4
|
|
|
duration = (fg >> shift) & 0xf
|
|
|
if duration > 0:
|
|
|
- ts_file = '{uid}/vod{channel}/{time}/ts{i}.ts'.format(uid=uid, channel=channel, time=store_time, i=i)
|
|
|
+ ts_file = '{uid}/vod{channel}/{time}/ts{i}.ts'.format(uid=uid, channel=channel, time=start_time, i=i)
|
|
|
response_url = s3_obj.generate_file_obj_url(bucket_name, ts_file)
|
|
|
playlist_entries.append({
|
|
|
'name': response_url,
|
|
@@ -478,9 +483,12 @@ class CloudStorageView(View):
|
|
|
"UidBucketModelOverTime": uid_bucket_qs_time_over,
|
|
|
})
|
|
|
|
|
|
- vod_hls_qs = VodHlsModel.objects.filter(uid=uid, channel=channel, endTime__gte=now_time,
|
|
|
- time__range=(start_time, end_time)).values("id", "time", "sec", "fg",
|
|
|
- "bucket_id")
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ vod_hls_qs = split_vod_hls_obj.get_vod_hls_data(uid=uid, channel=channel, end_time__gte=now_time,
|
|
|
+ start_time__range=(start_time, end_time)).values("id",
|
|
|
+ "start_time",
|
|
|
+ "sec", "fg",
|
|
|
+ "bucket_id")
|
|
|
|
|
|
vod_play_list = []
|
|
|
if not vod_hls_qs.exists():
|
|
@@ -517,14 +525,14 @@ class CloudStorageView(View):
|
|
|
|
|
|
for vod in vod_hls_qs:
|
|
|
bucket_name = regroup_bucket_qs[vod['bucket_id']]['bucket']
|
|
|
- thumbs_png = '{uid}/vod{channel}/{time}/Thumb.jpeg'.format(uid=uid, channel=channel, time=vod['time'])
|
|
|
+ thumbs_png = '{uid}/vod{channel}/{time}/Thumb.jpeg'.format(uid=uid, channel=channel, time=vod['start_time'])
|
|
|
response_url = s3_obj.generate_file_obj_url(bucket_name, thumbs_png)
|
|
|
vod_url = '{server_domain}/cloudstorage/signplaym3u8?' \
|
|
|
'uid={uid}&channel={channel}&time={time}&sign=tktktktk'. \
|
|
|
- format(server_domain=SERVER_DOMAIN_SSL, uid=uid_token, channel=channel, time=vod['time'])
|
|
|
+ format(server_domain=SERVER_DOMAIN_SSL, uid=uid_token, channel=channel, time=vod['start_time'])
|
|
|
ts_num = int(vod['fg']) & 0xf
|
|
|
vod_play_list.append({
|
|
|
- 'start_time': vod['time'],
|
|
|
+ 'start_time': vod['start_time'],
|
|
|
'sign_url': vod_url,
|
|
|
'thumb': response_url,
|
|
|
'sec': vod['sec'],
|
|
@@ -546,9 +554,9 @@ class CloudStorageView(View):
|
|
|
return response.json(0, vod_play_list)
|
|
|
|
|
|
@staticmethod
|
|
|
- def do_store_playlist(request_dict, response): # 设备调用,上传视频到s3,同时把视频数据信息传给服务器,服务器存储播放内容
|
|
|
+ def do_store_playlist(request_dict, response):
|
|
|
"""
|
|
|
- 存储设备上传数据
|
|
|
+ 存储设备上传云存信息数据
|
|
|
@param request_dict: 请求数据
|
|
|
@request_dict uidToken: uid_token
|
|
|
@request_dict time: 播放列表名字时间戳
|
|
@@ -558,68 +566,75 @@ class CloudStorageView(View):
|
|
|
@return: response
|
|
|
"""
|
|
|
uid_token = request_dict.get('uidToken', None)
|
|
|
- store_time = request_dict.get('time', None)
|
|
|
+ start_time = request_dict.get('time', None)
|
|
|
sec = request_dict.get('sec', None)
|
|
|
fg = request_dict.get('fg', None)
|
|
|
|
|
|
- if not all([uid_token, store_time, sec]):
|
|
|
+ if not all([uid_token, start_time, sec]):
|
|
|
return response.json(0)
|
|
|
uid_obj = UidTokenObject(uid_token)
|
|
|
if uid_obj.flag is False:
|
|
|
return response.json(444, 'uidToken')
|
|
|
|
|
|
- sec = int(sec)
|
|
|
- uid = uid_obj.UID
|
|
|
- channel = uid_obj.channel
|
|
|
- now_time = int(time.time())
|
|
|
- uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel).values(
|
|
|
- "bucket__mold",
|
|
|
- "bucket__bucket",
|
|
|
- "bucket__endpoint",
|
|
|
- "bucket__region",
|
|
|
- "status",
|
|
|
- "bucket__storeDay",
|
|
|
- "bucket__id").order_by(
|
|
|
- 'addTime')
|
|
|
- if uid_bucket_qs.exists():
|
|
|
+ try:
|
|
|
+ sec = int(sec)
|
|
|
+ uid = uid_obj.UID
|
|
|
+ channel = uid_obj.channel
|
|
|
+ now_time = int(time.time())
|
|
|
+ uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel).values(
|
|
|
+ "bucket__mold",
|
|
|
+ "bucket__bucket",
|
|
|
+ "bucket__endpoint",
|
|
|
+ "bucket__region",
|
|
|
+ "status",
|
|
|
+ "bucket__storeDay",
|
|
|
+ "bucket__id").order_by(
|
|
|
+ 'addTime')
|
|
|
+ if not uid_bucket_qs.exists():
|
|
|
+ return response.json(10030)
|
|
|
+
|
|
|
+ # 判断设备是否开启云存
|
|
|
uid_bucket = uid_bucket_qs.first()
|
|
|
store_day = uid_bucket['bucket__storeDay']
|
|
|
bucket_id = uid_bucket['bucket__id']
|
|
|
- end_time = int(store_time) + store_day * 86400
|
|
|
- if uid_bucket['status'] == 1:
|
|
|
- VodHlsModel.objects.create(
|
|
|
- uid=uid,
|
|
|
- channel=channel,
|
|
|
- time=store_time,
|
|
|
- endTime=end_time,
|
|
|
- bucket_id=bucket_id,
|
|
|
- fg=fg,
|
|
|
- sec=sec,
|
|
|
- )
|
|
|
- end_time_stamp = datetime.datetime.fromtimestamp(int(store_time))
|
|
|
- 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 = now_time
|
|
|
- vod_hls.save()
|
|
|
- else:
|
|
|
- VodHlsSummary.objects.create(uid=uid, time=end_time_stamp, created_time=now_time,
|
|
|
- updated_time=now_time,
|
|
|
- upload_duration=sec, upload_frequency=1)
|
|
|
-
|
|
|
- res = {'code': 0, 'msg': '存储成功'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False),
|
|
|
- content_type="application/json,charset=utf-8")
|
|
|
+ end_time = int(start_time) + store_day * 86400
|
|
|
+ if uid_bucket['status'] != 1:
|
|
|
+ return response.json(10, {'msg': '设备未开启云存'})
|
|
|
+
|
|
|
+ # 保存云存信息数据
|
|
|
+ # 创建旧表数据
|
|
|
+ VodHlsModel.objects.create(
|
|
|
+ uid=uid,
|
|
|
+ channel=channel,
|
|
|
+ time=start_time,
|
|
|
+ endTime=end_time,
|
|
|
+ bucket_id=bucket_id,
|
|
|
+ fg=fg,
|
|
|
+ sec=sec,
|
|
|
+ )
|
|
|
+ # 创建分表数据
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ split_vod_hls_obj.creat_vod_hls_data(uid=uid, channel=channel, start_time=start_time, end_time=end_time,
|
|
|
+ bucket_id=bucket_id, fg=fg, sec=sec)
|
|
|
+
|
|
|
+ end_time_stamp = datetime.datetime.fromtimestamp(int(start_time))
|
|
|
+ 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_sum_qs = VodHlsSummary.objects.filter(uid=uid, time=end_time_stamp)
|
|
|
+ if vod_hls_sum_qs.exists():
|
|
|
+ vod_hls_sum = vod_hls_sum_qs.first()
|
|
|
+ vod_hls_sum.upload_frequency += 1
|
|
|
+ vod_hls_sum.upload_duration += sec
|
|
|
+ vod_hls_sum.updated_time = now_time
|
|
|
+ vod_hls_sum.save()
|
|
|
else:
|
|
|
- res = {'code': 404, 'msg': '设备未开启'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
- else:
|
|
|
- res = {'code': 404, 'msg': '设备未购买'}
|
|
|
- return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
|
|
|
+ VodHlsSummary.objects.create(uid=uid, time=end_time_stamp, created_time=now_time, updated_time=now_time,
|
|
|
+ upload_duration=sec, upload_frequency=1)
|
|
|
+
|
|
|
+ res = {'code': 0, 'msg': '存储成功'}
|
|
|
+ return HttpResponse(json.dumps(res, ensure_ascii=False), content_type='application/json,charset=utf-8')
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(500, repr(e))
|
|
|
|
|
|
@staticmethod
|
|
|
def do_change_vod_status(request_dict, user_id, response): # 修改云存状态
|
|
@@ -1522,10 +1537,16 @@ class CloudStorageView(View):
|
|
|
try:
|
|
|
if is_del_all == 1:
|
|
|
VodHlsModel.objects.filter(uid=uid).delete()
|
|
|
+ # 删除vod_hls分表数据
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ split_vod_hls_obj.del_vod_hls_data(uid=uid)
|
|
|
else:
|
|
|
if type(vod_id_list).__name__ != 'list':
|
|
|
return response.json(444)
|
|
|
VodHlsModel.objects.filter(id__in=vod_id_list).delete()
|
|
|
+ # 删除vod_hls分表数据
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ split_vod_hls_obj.del_vod_hls_data(id__in=vod_id_list)
|
|
|
except Exception as e:
|
|
|
return response.json(424, repr(e))
|
|
|
else:
|
|
@@ -1679,9 +1700,11 @@ class CloudStorageView(View):
|
|
|
if not uid_bucket_qs.exists():
|
|
|
return response.json(10030)
|
|
|
|
|
|
- vod_hls_qs = VodHlsModel.objects.extra(select={'date': "FROM_UNIXTIME(time,'%%Y-%%m-%%d')"}).values(
|
|
|
- 'date').filter(uid=uid, endTime__gte=now_time, channel=channel).annotate(count=Count('time')).order_by(
|
|
|
- '-date')[:31]
|
|
|
+ # vod_hls_qs = VodHlsModel.objects.extra(select={'date': "FROM_UNIXTIME(time,'%%Y-%%m-%%d')"}).values(
|
|
|
+ # 'date').filter(uid=uid, endTime__gte=now_time, channel=channel).annotate(count=Count('time')).order_by(
|
|
|
+ # '-date')[:31]
|
|
|
+ split_vod_hls_obj = SplitVodHlsObject()
|
|
|
+ vod_hls_qs = split_vod_hls_obj.get_vod_hls_date(uid=uid, end_time__gte=now_time, channel=channel)
|
|
|
|
|
|
had_vod_list = []
|
|
|
for vod in vod_hls_qs:
|
|
@@ -1690,7 +1713,7 @@ class CloudStorageView(View):
|
|
|
'vod_count': vod['count'],
|
|
|
'date_format': vod['date'],
|
|
|
})
|
|
|
-
|
|
|
+ had_vod_list = sorted(had_vod_list, key=lambda item: -item['timestamp'])
|
|
|
return response.json(0, had_vod_list)
|
|
|
|
|
|
@staticmethod
|
|
@@ -1879,9 +1902,9 @@ class CloudStorageView(View):
|
|
|
if not all([order_id, refund_amount]):
|
|
|
return response.json(444)
|
|
|
try:
|
|
|
- order_qs = Order_Model.objects.filter(orderID=order_id)\
|
|
|
- .values('status', 'payType', 'price','refunded_amount',
|
|
|
- 'currency', 'paymentID','trade_no')
|
|
|
+ order_qs = Order_Model.objects.filter(orderID=order_id) \
|
|
|
+ .values('status', 'payType', 'price', 'refunded_amount',
|
|
|
+ 'currency', 'paymentID', 'trade_no')
|
|
|
if not order_qs.exists():
|
|
|
return response.json(173)
|
|
|
|