#!/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)