diff --git a/server/apps/vod/serializers.py b/server/apps/vod/serializers.py index 9944712..e09bdcb 100644 --- a/server/apps/vod/serializers.py +++ b/server/apps/vod/serializers.py @@ -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 diff --git a/server/apps/vod/urls.py b/server/apps/vod/urls.py index c110b3e..77a38a5 100644 --- a/server/apps/vod/urls.py +++ b/server/apps/vod/urls.py @@ -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//myview/', MyViewRecordAPIView.as_view()), path('signature/', SignatureAPIView.as_view()), + path('playcode//', PlayCodeAPIView.as_view()) ] diff --git a/server/apps/vod/views.py b/server/apps/vod/views.py index a115d4e..b570be7 100644 --- a/server/apps/vod/views.py +++ b/server/apps/vod/views.py @@ -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}) diff --git a/server/apps/vod/vodclient.py b/server/apps/vod/vodclient.py index 753796a..c6123dc 100644 --- a/server/apps/vod/vodclient.py +++ b/server/apps/vod/vodclient.py @@ -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)