生成播放签名

This commit is contained in:
caoqianming 2022-04-14 08:29:50 +08:00
parent e08ffe580e
commit 531a44daa1
4 changed files with 61 additions and 3 deletions

View File

@ -8,6 +8,11 @@ class VideoSerializer(serializers.ModelSerializer):
model = Video model = Video
fields = '__all__' fields = '__all__'
class VideoListDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Video
exclude = ['mediaurl']
class VideoSimpleSerializer(serializers.ModelSerializer): class VideoSimpleSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Video model = Video

View File

@ -1,6 +1,6 @@
from django.db.models import base from django.db.models import base
from django.urls import path, include from django.urls import path, include
from .views import ClassView, SignatureAPIView, VideoView, VideoViewSet, VRecordViewSet, MyViewRecordAPIView from .views import ClassView, PlayCodeAPIView, SignatureAPIView, VideoView, VideoViewSet, VRecordViewSet, MyViewRecordAPIView
from rest_framework import routers from rest_framework import routers
router = routers.DefaultRouter() router = routers.DefaultRouter()
@ -10,4 +10,5 @@ urlpatterns = [
path('', include(router.urls)), path('', include(router.urls)),
path('video/<int:id>/myview/', MyViewRecordAPIView.as_view()), path('video/<int:id>/myview/', MyViewRecordAPIView.as_view()),
path('signature/', SignatureAPIView.as_view()), path('signature/', SignatureAPIView.as_view()),
path('playcode/<str:fileId>/', PlayCodeAPIView.as_view())
] ]

View File

@ -1,10 +1,10 @@
from datetime import timedelta from datetime import timedelta
from time import timezone from time import timezone
from rest_framework.mixins import ListModelMixin from rest_framework.mixins import ListModelMixin
from apps.vod.serializers import VRecordSerializer, VRecordUpdateSerializer, VideoSerializer from apps.vod.serializers import VRecordSerializer, VRecordUpdateSerializer, VideoListDetailSerializer, VideoSerializer
from apps.vod.models import Video, ViewRecord from apps.vod.models import Video, ViewRecord
from django.shortcuts import render from django.shortcuts import render
from .vodclient import getAllClass, searchMedia, getSignature from .vodclient import getAllClass, getPlayCode, searchMedia, getSignature
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework.viewsets import GenericViewSet, ModelViewSet
@ -14,6 +14,7 @@ from rest_framework.decorators import action, permission_classes
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.status import HTTP_400_BAD_REQUEST
from django.utils import timezone from django.utils import timezone
from rest_framework.exceptions import ParseError
# Create your views here. # Create your views here.
class ClassView(APIView): class ClassView(APIView):
@ -47,6 +48,10 @@ class VideoViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
serializer_class = VideoSerializer serializer_class = VideoSerializer
ordering = ['-views', '-create_time'] ordering = ['-views', '-create_time']
def get_serializer_class(self):
if self.action in ['list', 'retrieve']:
return VideoListDetailSerializer
return super().get_serializer_class()
@action(methods=['get'], detail=False, perms_map={'get':'video_view'}) @action(methods=['get'], detail=False, perms_map={'get':'video_view'})
def myview(self, request, *args, **kwargs): def myview(self, request, *args, **kwargs):
""" """
@ -61,6 +66,7 @@ class VideoViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
return Response(serializer.data) return Response(serializer.data)
class VRecordViewSet(ListModelMixin, GenericViewSet): class VRecordViewSet(ListModelMixin, GenericViewSet):
perms_map = {'get':'viewrecord_view'} perms_map = {'get':'viewrecord_view'}
queryset = ViewRecord.objects.all() queryset = ViewRecord.objects.all()
@ -116,3 +122,17 @@ class SignatureAPIView(APIView):
获取上传签名 获取上传签名
""" """
return Response(getSignature(procedure=request.query_params.get('procedure', None))) return Response(getSignature(procedure=request.query_params.get('procedure', None)))
class PlayCodeAPIView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, fileId):
"""获取播放签名
"""
from .vodclient import appId
try:
playcode = getPlayCode(fileId)
except:
raise ParseError('获取签名失败')
return Response({'psign':playcode, 'appId': appId})

View File

@ -1,9 +1,11 @@
import base64 import base64
from dataclasses import field
import hashlib import hashlib
import hmac import hmac
import json import json
import random import random
import time import time
import jwt
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.status import HTTP_400_BAD_REQUEST
@ -16,6 +18,8 @@ from tencentcloud.vod.v20180717 import models, vod_client
SecretId = 'AKIDhDTaV9WeXAXcQxEH4buwg9LGvJQHr9Au' SecretId = 'AKIDhDTaV9WeXAXcQxEH4buwg9LGvJQHr9Au'
SecretKey = 'VjfKjrhGYrte8MIxMUMxHL9h39zYqrc6' SecretKey = 'VjfKjrhGYrte8MIxMUMxHL9h39zYqrc6'
appId = '1253484223'
referKey = 'ntXQi6eDkgUXnvvsiAtm'
# 初始化点播client # 初始化点播client
def initClient(): def initClient():
@ -71,3 +75,31 @@ def getSignature(procedure=None):
Signature = bytes(Sha1) + bytes(Original, 'utf-8') Signature = bytes(Sha1) + bytes(Original, 'utf-8')
Signature2 = base64.b64encode(Signature) Signature2 = base64.b64encode(Signature)
return str(Signature2, 'UTF-8') return str(Signature2, 'UTF-8')
def getPlayCode(fileId:str):
currentTimeStamp = int(time.time())
Original = {
"appId": appId,
"fileId": fileId,
"currentTimeStamp": currentTimeStamp,
"pcfg": "basicDrmPreset",
}
print(Original)
return jwt.encode(Original, referKey, algorithm='HS256')
def startSeVideo(fileId:str):
"""
开始加密视频
"""
try:
client = initClient()
req = models.ProcessMediaByProcedureRequest()
params = {
"FileId":field,
"ProcedureName":"myAesEncryptPreset"
}
req.from_json_string(json.dumps(params))
resp = client.ProcessMediaByProcedure(req)
return doResponse(resp)
except TencentCloudSDKException as err:
print(err)