HlsManage.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: Ansjer
  7. @software: PyCharm
  8. @DATE: 2018/5/30 17:53
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: HlsManage.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. from django.views.generic.base import View
  15. from django.utils.decorators import method_decorator
  16. from django.views.decorators.csrf import csrf_exempt
  17. from Service.TokenManager import JSONTokenManager
  18. from Service.ModelService import ModelService
  19. from Model.models import Device_Meal
  20. from Object.AWS.S3ClassObject import S3ClassObject
  21. from Object.AWS.CloudfrontSignUrl import CloudfrontSignUrl
  22. from Object.encryHlsVodUrl import getSignUrl
  23. from Object.m3u8generate import PlaylistGenerator
  24. from Service.ResponseService import *
  25. '''
  26. 设备端
  27. http://13.56.215.252:82/HlsManager?operation=signPutObj&key=555666.mp4&uid=L59KVYDAEPHR1T6M111A&channel=0
  28. http://13.56.215.252:82/HlsManager?operation=signPostObj&key=ppp.mp4&uid=L59KVYDAEPHR1T6M111A&channel=0
  29. 移动端
  30. http://13.56.215.252:82/HlsManager?operation=getHlsVod&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test&key=234234234.ts
  31. http://13.56.215.252:82/HlsManager?operation=getAllTs&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test
  32. http://13.56.215.252:82/HlsManager?operation=getVodUrl&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test&key=121212.mp4
  33. '''
  34. class HlsManage(View):
  35. @method_decorator(csrf_exempt)
  36. def dispatch(self, *args, **kwargs):
  37. return super(HlsManage, self).dispatch(*args, **kwargs)
  38. def get(self, request, *args, **kwargs):
  39. request.encoding = 'utf-8'
  40. return self.validation(request_dict=request.GET)
  41. def post(self, request, *args, **kwargs):
  42. request.encoding = 'utf-8'
  43. return self.validation(request_dict=request.POST)
  44. def validation(self, request_dict, *args, **kwargs):
  45. operation = request_dict.get('operation', None)
  46. if operation is not None:
  47. if operation == 'signPutObj':
  48. return self.sign_put_obj(request_dict=request_dict)
  49. elif operation == 'signPostObj':
  50. return self.sign_post_obj(request_dict=request_dict)
  51. elif operation == 'getHlsVod':
  52. return self.get_hls_vod(request_dict=request_dict)
  53. elif operation == 'getAllTs':
  54. return self.get_all_ts(request_dict=request_dict)
  55. elif operation == 'getVodUrl':
  56. return self.get_vod_url(request_dict=request_dict)
  57. return ResponseJSON(444)
  58. def sign_put_obj(self, request_dict):
  59. key = request_dict.get('key', None)
  60. uid = request_dict.get('uid', None)
  61. channel = request_dict.get('channel', None)
  62. param_flag = CommonService.get_param_flag(data=[key, uid, channel])
  63. if param_flag is True:
  64. device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
  65. if device_meal_queryset.exists():
  66. path = uid + '_' + channel + '/' + key
  67. meal_id = device_meal_queryset[0].rank_id
  68. bucket_meal={
  69. 1:'ansjer.meal.1',# 7
  70. 2:'ansjer.meal.2',# 30
  71. # 3:'ansjer.meal.3',
  72. }
  73. s3 = S3ClassObject()
  74. sign_url = s3.sign_put_object(key=path, bucket_meal=bucket_meal[meal_id])
  75. if sign_url is not False:
  76. return ResponseJSON(0, {'url': sign_url})
  77. else:
  78. return ResponseJSON(48)
  79. else:
  80. return ResponseJSON(444)
  81. else:
  82. return ResponseJSON(444)
  83. def sign_post_obj(self, request_dict):
  84. key = request_dict.get('key', None)
  85. uid = request_dict.get('uid', None)
  86. channel = request_dict.get('channel', None)
  87. param_flag = CommonService.get_param_flag(data=[key, uid, channel])
  88. if param_flag is True:
  89. device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
  90. if device_meal_queryset.exists():
  91. path = uid + '_' + channel + '/' + key
  92. meal_id = device_meal_queryset[0].rank_id
  93. bucket_meal = {
  94. 1: 'ansjer.meal.1', # 7
  95. 2: 'ansjer.meal.2', # 30
  96. # 3:'ansjer.meal.3',
  97. }
  98. s3 = S3ClassObject()
  99. data = s3.sign_post_object(key=path, bucket_meal=bucket_meal[meal_id])
  100. if data is not False:
  101. return ResponseJSON(0, {'url': data})
  102. else:
  103. return ResponseJSON(48)
  104. else:
  105. return ResponseJSON(444)
  106. else:
  107. return ResponseJSON(444)
  108. def get_all_ts(self, request_dict):
  109. token = request_dict.get('token', None)
  110. if token is not None:
  111. tokenManager = JSONTokenManager()
  112. error_code = tokenManager.verify_AToken(token)
  113. if error_code == 0:
  114. uid = request_dict.get('uid', None)
  115. channel = request_dict.get('channel', None)
  116. userID = tokenManager.accessDict.get('userID', None)
  117. param_flag = CommonService.get_param_flag(data=[userID, uid, channel])
  118. if param_flag is True:
  119. own_permission = ModelService.check_permission(userID=userID, permID=30)
  120. own_device = ModelService.check_own_device(userID=userID, UID=uid)
  121. if own_permission is True or own_device is True:
  122. device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
  123. if device_meal_queryset.exists():
  124. meal_id = device_meal_queryset[0].rank_id
  125. bucket_meal = {
  126. 1: 'ansjer.meal.1', # 7
  127. 2: 'ansjer.meal.2', # 30
  128. }
  129. s3 = S3ClassObject()
  130. data = s3.get_prefix_obj(prefix=uid + '_' + channel + '/', bucket=bucket_meal[meal_id])
  131. # return ResponseJSON(0, {'files': data,'bk':bucket_meal[meal_id]})
  132. return ResponseJSON(0, {'files': data})
  133. else:
  134. return ResponseJSON(444)
  135. else:
  136. return ResponseJSON(404)
  137. else:
  138. return ResponseJSON(444)
  139. else:
  140. return HttpResponse(tokenManager.errorCodeInfo(error_code))
  141. else:
  142. return ResponseJSON(311)
  143. def get_hls_vod(self, request_dict):
  144. token = request_dict.get('token', None)
  145. if token is not None:
  146. tokenManager = JSONTokenManager()
  147. error_code = tokenManager.verify_AToken(token)
  148. if error_code == 0:
  149. key = request_dict.get('key', None)
  150. uid = request_dict.get('uid', None)
  151. channel = request_dict.get('channel', None)
  152. userID = tokenManager.accessDict.get('userID', None)
  153. param_flag = CommonService.get_param_flag(data=[userID, key, uid, channel])
  154. if param_flag is True:
  155. own_device = ModelService.check_own_device(userID=userID, UID=uid)
  156. if own_device is True:
  157. device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
  158. if device_meal_queryset.exists():
  159. meal_id = device_meal_queryset[0].rank_id
  160. cf_domain = {
  161. 1: 'http://d3om3d8c0l14oc.cloudfront.net/',
  162. 2:'http://d4neaolnu8h83.cloudfront.net/',
  163. }
  164. url = cf_domain[meal_id]+uid + '_' + channel + '/' + key
  165. # url = 'http://d3om3d8c0l14oc.cloudfront.net/'+uid + '_' + channel + '/' + key
  166. sign_url = CloudfrontSignUrl(url=url)
  167. playlist_entries = [
  168. {
  169. 'name': sign_url,
  170. 'duration': '60',
  171. }
  172. ]
  173. playlist = PlaylistGenerator(playlist_entries).generate()
  174. response = HttpResponse(content_type='application/force-download',content=playlist)
  175. response['Content-Disposition'] = 'attachment; filename='+key+'.m3u8'
  176. # response['X-Sendfile'] = playlist
  177. # return ResponseJSON(404)
  178. return response
  179. # return HttpResponse(playlist)
  180. else:
  181. return ResponseJSON(0)
  182. else:
  183. return ResponseJSON(15)
  184. else:
  185. return ResponseJSON(444)
  186. else:
  187. return HttpResponse(tokenManager.errorCodeInfo(error_code))
  188. else:
  189. return ResponseJSON(311)
  190. # mp4
  191. def get_vod_url(self, request_dict):
  192. token = request_dict.get('token', None)
  193. if token is not None:
  194. tokenManager = JSONTokenManager()
  195. error_code = tokenManager.verify_AToken(token)
  196. if error_code == 0:
  197. key = request_dict.get('key', None)
  198. uid = request_dict.get('uid', None)
  199. channel = request_dict.get('channel', None)
  200. userID = tokenManager.accessDict.get('userID', None)
  201. param_flag = CommonService.get_param_flag(data=[userID, key, uid, channel])
  202. if param_flag is True:
  203. own_device = ModelService.check_own_device(userID=userID, UID=uid)
  204. if own_device is True:
  205. device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
  206. if device_meal_queryset.exists():
  207. meal_id = device_meal_queryset[0].rank_id
  208. bucket_meal = {
  209. 1: 'ansjer.meal.1', # 7
  210. 2: 'ansjer.meal.2', # 30
  211. }
  212. bk = bucket_meal[meal_id]
  213. path = '/'+bk+'/'+uid+'_'+channel+'/'+key
  214. signUrl = getSignUrl(path=path)
  215. return ResponseJSON(0,{'signUrl':signUrl})
  216. else:
  217. return ResponseJSON(0)
  218. else:
  219. return ResponseJSON(15)
  220. else:
  221. return ResponseJSON(444)
  222. else:
  223. return HttpResponse(tokenManager.errorCodeInfo(error_code))
  224. else:
  225. return ResponseJSON(311)