生成播放签名

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
fields = '__all__'
class VideoListDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Video
exclude = ['mediaurl']
class VideoSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Video

View File

@ -1,6 +1,6 @@
from django.db.models import base
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
router = routers.DefaultRouter()
@ -10,4 +10,5 @@ urlpatterns = [
path('', include(router.urls)),
path('video/<int:id>/myview/', MyViewRecordAPIView.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 time import timezone
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 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.response import Response
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.status import HTTP_400_BAD_REQUEST
from django.utils import timezone
from rest_framework.exceptions import ParseError
# Create your views here.
class ClassView(APIView):
@ -47,6 +48,10 @@ class VideoViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
serializer_class = VideoSerializer
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'})
def myview(self, request, *args, **kwargs):
"""
@ -61,6 +66,7 @@ class VideoViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
return Response(serializer.data)
class VRecordViewSet(ListModelMixin, GenericViewSet):
perms_map = {'get':'viewrecord_view'}
queryset = ViewRecord.objects.all()
@ -116,3 +122,17 @@ class SignatureAPIView(APIView):
获取上传签名
"""
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
from dataclasses import field
import hashlib
import hmac
import json
import random
import time
import jwt
from rest_framework.response import Response
from rest_framework.status import HTTP_400_BAD_REQUEST
@ -16,6 +18,8 @@ from tencentcloud.vod.v20180717 import models, vod_client
SecretId = 'AKIDhDTaV9WeXAXcQxEH4buwg9LGvJQHr9Au'
SecretKey = 'VjfKjrhGYrte8MIxMUMxHL9h39zYqrc6'
appId = '1253484223'
referKey = 'ntXQi6eDkgUXnvvsiAtm'
# 初始化点播client
def initClient():
@ -71,3 +75,31 @@ def getSignature(procedure=None):
Signature = bytes(Sha1) + bytes(Original, 'utf-8')
Signature2 = base64.b64encode(Signature)
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)