123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
- @AUTHOR: ASJRD018
- @NAME: Ansjer
- @software: PyCharm
- @DATE: 2018/5/30 17:53
- @Version: python3.6
- @MODIFY DECORD:ansjer dev
- @file: HlsManage.py
- @Contact: chanjunkai@163.com
- """
- from django.views.generic.base import View
- from django.utils.decorators import method_decorator
- from django.views.decorators.csrf import csrf_exempt
- from Service.TokenManager import JSONTokenManager
- from Service.ModelService import ModelService
- from Service.CommonService import CommonService
- from Model.models import Device_Meal
- from Object.AWS.S3ClassObject import S3ClassObject
- from Object.AWS.CloudfrontSignUrl import CloudfrontSignUrl
- from Object.encryHlsVodUrl import getSignUrl
- from Object.m3u8generate import PlaylistGenerator
- from Service.ResponseService import *
- '''
- 设备端
- http://13.56.215.252:82/HlsManager?operation=signPutObj&key=555666.mp4&uid=L59KVYDAEPHR1T6M111A&channel=0
- http://13.56.215.252:82/HlsManager?operation=signPostObj&key=ppp.mp4&uid=L59KVYDAEPHR1T6M111A&channel=0
- 移动端
- http://13.56.215.252:82/HlsManager?operation=getHlsVod&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test&key=234234234.ts
- http://13.56.215.252:82/HlsManager?operation=getAllTs&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test
- http://13.56.215.252:82/HlsManager?operation=getVodUrl&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test&key=121212.mp4
- '''
- class HlsManage(View):
- @method_decorator(csrf_exempt)
- def dispatch(self, *args, **kwargs):
- return super(HlsManage, self).dispatch(*args, **kwargs)
- def get(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- return self.validation(request_dict=request.GET)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- return self.validation(request_dict=request.POST)
- def validation(self, request_dict, *args, **kwargs):
- operation = request_dict.get('operation', None)
- if operation is not None:
- if operation == 'signPutObj':
- return self.sign_put_obj(request_dict=request_dict)
- elif operation == 'signPostObj':
- return self.sign_post_obj(request_dict=request_dict)
- elif operation == 'getHlsVod':
- return self.get_hls_vod(request_dict=request_dict)
- elif operation == 'getAllTs':
- return self.get_all_ts(request_dict=request_dict)
- elif operation == 'getVodUrl':
- return self.get_vod_url(request_dict=request_dict)
- return ResponseJSON(444)
- def sign_put_obj(self, request_dict):
- key = request_dict.get('key', None)
- uid = request_dict.get('uid', None)
- channel = request_dict.get('channel', None)
- param_flag = CommonService.get_param_flag(data=[key, uid, channel])
- if param_flag is True:
- device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
- if device_meal_queryset.exists():
- path = uid + '_' + channel + '/' + key
- meal_id = device_meal_queryset[0].rank_id
- bucket_meal={
- 1:'ansjer.meal.1',# 7
- 2:'ansjer.meal.2',# 30
- # 3:'ansjer.meal.3',
- }
- s3 = S3ClassObject()
- sign_url = s3.sign_put_object(key=path, bucket_meal=bucket_meal[meal_id])
- if sign_url is not False:
- return ResponseJSON(0, {'url': sign_url})
- else:
- return ResponseJSON(48)
- else:
- return ResponseJSON(444)
- else:
- return ResponseJSON(444)
- def sign_post_obj(self, request_dict):
- key = request_dict.get('key', None)
- uid = request_dict.get('uid', None)
- channel = request_dict.get('channel', None)
- param_flag = CommonService.get_param_flag(data=[key, uid, channel])
- if param_flag is True:
- device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
- if device_meal_queryset.exists():
- path = uid + '_' + channel + '/' + key
- meal_id = device_meal_queryset[0].rank_id
- bucket_meal = {
- 1: 'ansjer.meal.1', # 7
- 2: 'ansjer.meal.2', # 30
- # 3:'ansjer.meal.3',
- }
- s3 = S3ClassObject()
- data = s3.sign_post_object(key=path, bucket_meal=bucket_meal[meal_id])
- if data is not False:
- return ResponseJSON(0, {'url': data})
- else:
- return ResponseJSON(48)
- else:
- return ResponseJSON(444)
- else:
- return ResponseJSON(444)
- def get_all_ts(self, request_dict):
- token = request_dict.get('token', None)
- if token is not None:
- tokenManager = JSONTokenManager()
- error_code = tokenManager.verify_AToken(token)
- if error_code == 0:
- uid = request_dict.get('uid', None)
- channel = request_dict.get('channel', None)
- userID = tokenManager.accessDict.get('userID', None)
- param_flag = CommonService.get_param_flag(data=[userID, uid, channel])
- if param_flag is True:
- own_permission = ModelService.check_permission(userID=userID, permID=30)
- own_device = ModelService.check_own_device(userID=userID, UID=uid)
- if own_permission is True or own_device is True:
- device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
- if device_meal_queryset.exists():
- meal_id = device_meal_queryset[0].rank_id
- bucket_meal = {
- 1: 'ansjer.meal.1', # 7
- 2: 'ansjer.meal.2', # 30
- }
- s3 = S3ClassObject()
- data = s3.get_prefix_obj(prefix=uid + '_' + channel + '/', bucket=bucket_meal[meal_id])
- # return ResponseJSON(0, {'files': data,'bk':bucket_meal[meal_id]})
- return ResponseJSON(0, {'files': data})
- else:
- return ResponseJSON(444)
- else:
- return ResponseJSON(404)
- else:
- return ResponseJSON(444)
- else:
- return HttpResponse(tokenManager.errorCodeInfo(error_code))
- else:
- return ResponseJSON(311)
- def get_hls_vod(self, request_dict):
- token = request_dict.get('token', None)
- if token is not None:
- tokenManager = JSONTokenManager()
- error_code = tokenManager.verify_AToken(token)
- if error_code == 0:
- key = request_dict.get('key', None)
- uid = request_dict.get('uid', None)
- channel = request_dict.get('channel', None)
- userID = tokenManager.accessDict.get('userID', None)
- param_flag = CommonService.get_param_flag(data=[userID, key, uid, channel])
- if param_flag is True:
- own_device = ModelService.check_own_device(userID=userID, UID=uid)
- if own_device is True:
- device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
- if device_meal_queryset.exists():
- meal_id = device_meal_queryset[0].rank_id
- cf_domain = {
- 1: 'http://d3om3d8c0l14oc.cloudfront.net/',
- 2:'http://d4neaolnu8h83.cloudfront.net/',
- }
- url = cf_domain[meal_id]+uid + '_' + channel + '/' + key
- # url = 'http://d3om3d8c0l14oc.cloudfront.net/'+uid + '_' + channel + '/' + key
- sign_url = CloudfrontSignUrl(url=url)
- playlist_entries = [
- {
- 'name': sign_url,
- 'duration': '60',
- }
- ]
- playlist = PlaylistGenerator(playlist_entries).generate()
- response = HttpResponse(content_type='application/force-download',content=playlist)
- response['Content-Disposition'] = 'attachment; filename='+key+'.m3u8'
- # response['X-Sendfile'] = playlist
- # return ResponseJSON(404)
- return response
- # return HttpResponse(playlist)
- else:
- return ResponseJSON(0)
- else:
- return ResponseJSON(15)
- else:
- return ResponseJSON(444)
- else:
- return HttpResponse(tokenManager.errorCodeInfo(error_code))
- else:
- return ResponseJSON(311)
- # mp4
- def get_vod_url(self, request_dict):
- token = request_dict.get('token', None)
- if token is not None:
- tokenManager = JSONTokenManager()
- error_code = tokenManager.verify_AToken(token)
- if error_code == 0:
- key = request_dict.get('key', None)
- uid = request_dict.get('uid', None)
- channel = request_dict.get('channel', None)
- userID = tokenManager.accessDict.get('userID', None)
- param_flag = CommonService.get_param_flag(data=[userID, key, uid, channel])
- if param_flag is True:
- own_device = ModelService.check_own_device(userID=userID, UID=uid)
- if own_device is True:
- device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
- if device_meal_queryset.exists():
- meal_id = device_meal_queryset[0].rank_id
- bucket_meal = {
- 1: 'ansjer.meal.1', # 7
- 2: 'ansjer.meal.2', # 30
- }
- bk = bucket_meal[meal_id]
- path = '/'+bk+'/'+uid+'_'+channel+'/'+key
- signUrl = getSignUrl(path=path)
- return ResponseJSON(0,{'signUrl':signUrl})
- else:
- return ResponseJSON(0)
- else:
- return ResponseJSON(15)
- else:
- return ResponseJSON(444)
- else:
- return HttpResponse(tokenManager.errorCodeInfo(error_code))
- else:
- return ResponseJSON(311)
|