| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 | #!/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 Viewfrom django.utils.decorators import method_decoratorfrom django.views.decorators.csrf import csrf_exemptfrom Service.ModelService import ModelServicefrom Model.models import Device_Mealfrom Object.AWS.S3ClassObject import S3ClassObjectfrom Object.AWS.CloudfrontSignUrl import CloudfrontSignUrlfrom Object.encryHlsVodUrl import getSignUrlfrom Object.m3u8generate import PlaylistGeneratorfrom Object.TokenObject import TokenObjectfrom Object.ResponseObject import ResponseObjectfrom django.http import HttpResponse'''设备端http://13.56.215.252:82/HlsManager?operation=signPutObj&key=555666.mp4&uid=L59KVYDAEPHR1T6M111A&channel=0http://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.tshttp://13.56.215.252:82/HlsManager?operation=getAllTs&uid=L59KVYDAEPHR1T6M111A&channel=0&token=testhttp://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):        response = ResponseObject()        operation = request_dict.get('operation', None)        if operation == 'signPutObj':            return self.sign_put_obj(request_dict,response)        elif operation == 'signPostObj':            return self.sign_post_obj(request_dict,response)        elif operation == 'getHlsVod':            return self.get_hls_vod(request_dict,response)        elif operation == 'getAllTs':            return self.get_all_ts(request_dict,response)        elif operation == 'getVodUrl':            return self.get_vod_url(request_dict,response)        else:            return response.json(444, 'operation')    def sign_put_obj(self, request_dict,response):        key = request_dict.get('key', None)        uid = request_dict.get('uid', None)        channel = request_dict.get('channel', None)        if key is not None and uid is not None and channel is not None:            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 (0, {'url': sign_url})                else:                    return response.json(48)            else:                return response.json(444)        else:            return response.json(444,'key, uid, channel')    def sign_post_obj(self, request_dict,response):        key = request_dict.get('key', None)        uid = request_dict.get('uid', None)        channel = request_dict.get('channel', None)        if key is not None and uid is not None and channel is not None:            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 response.json(0, {'url': data})                else:                    return response.json(48)            else:                return response.json(444)        else:            return response.json(444,'key, uid, channel')    def get_all_ts(self, request_dict,response):        token = request_dict.get('token', None)        if token is not None:            tko = TokenObject(token)            response.lang = tko.lang            if tko.code == 0:                userID = tko.userID                if userID is not None:                    uid = request_dict.get('uid', None)                    channel = request_dict.get('channel', None)                    if uid is not None and channel is not None:                        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 response.json(0, {'files': data,'bk':bucket_meal[meal_id]})                                return response.json(0, {'files': data})                            else:                                return response.json(444)                        else:                            return response.json(404)                    else:                        return response.json(444,'uid,channel')                else:                    return response.json(309)            else:                return response.json(tko.code)        else:            return response.json(309)    def get_hls_vod(self, request_dict,response):        token = request_dict.get('token', None)        if token is not None:            tko = TokenObject(token)            response.lang = tko.lang            if tko.code == 0:                userID = tko.userID                                if userID is not None:                    key = request_dict.get('key', None)                    uid = request_dict.get('uid', None)                    channel = request_dict.get('channel', None)                    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                            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 response.json(404)                            return response                            # return HttpResponse(playlist)                        else:                            return response.json(0)                    else:                        return response.json(15)                else:                    return response.json(309)            else:                return response.json(tko.code)        else:            return response.json(309)            # mp4    def get_vod_url(self, request_dict,response):        token = request_dict.get('token', None)        if token is not None:            tko = TokenObject(token)            response.lang = tko.lang            if tko.code == 0:                userID = tko.userID                key = request_dict.get('key', None)                uid = request_dict.get('uid', None)                channel = request_dict.get('channel', None)                if userID is not None:                    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 response.json(0,{'signUrl':signUrl})                        else:                            return response.json(0)                    else:                        return response.json(15)                else:                    return response.json(309)            else:                return response.json(tko.code)        else:            return response.json(309)
 |