• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

EsupPortail / Esup-Pod / 5322792349

pending completion
5322792349

push

github

web-flow
Merge pull request #863 from EsupPortail/develop

#3.3.0

- Import external video from url, youtube, peertube and BigBlueButton
- Change xapi actor to deal with Moodle
- Update template to BS5.3 and improve compliance for W3C
- Use redis to cache session and improve logging
- refactor of encoding/transcripting to move it in separate application
- Fixbug on categories, recorder, user liste, tags cloud

1484 of 1484 new or added lines in 51 files covered. (100.0%)

9011 of 12517 relevant lines covered (71.99%)

0.76 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

67.11
/pod/video_encode_transcript/rest_views.py
1
from rest_framework import serializers, viewsets
1✔
2
from .models import EncodingVideo, EncodingAudio, VideoRendition, PlaylistVideo
1✔
3
from pod.video.models import Video
1✔
4
from pod.video.rest_views import VideoSerializer
1✔
5

6
from rest_framework.decorators import action
1✔
7
from rest_framework.decorators import api_view
1✔
8
from rest_framework.response import Response
1✔
9
from django.shortcuts import get_object_or_404
1✔
10
from pod.video_encode_transcript.transcript import start_transcript
1✔
11

12

13
class VideoRenditionSerializer(serializers.HyperlinkedModelSerializer):
1✔
14
    class Meta:
1✔
15
        model = VideoRendition
1✔
16
        fields = (
1✔
17
            "id",
18
            "url",
19
            "resolution",
20
            "video_bitrate",
21
            "audio_bitrate",
22
            "encode_mp4",
23
            "sites",
24
        )
25

26

27
class EncodingVideoSerializer(serializers.HyperlinkedModelSerializer):
1✔
28
    """Serializer for the EncodingVideo model."""
29

30
    class Meta:
1✔
31
        model = EncodingVideo
1✔
32
        fields = (
1✔
33
            "id",
34
            "url",
35
            "name",
36
            "video",
37
            "rendition",
38
            "encoding_format",
39
            "source_file",
40
            "sites_all",
41
        )
42

43

44
class EncodingAudioSerializer(serializers.HyperlinkedModelSerializer):
1✔
45
    """Serializer for the EncodingAudio model."""
46

47
    class Meta:
1✔
48
        model = EncodingAudio
1✔
49
        fields = (
1✔
50
            "id",
51
            "url",
52
            "name",
53
            "video",
54
            "encoding_format",
55
            "source_file",
56
            "sites_all",
57
        )
58

59

60
class EncodingVideoViewSet(viewsets.ModelViewSet):
1✔
61
    """Viewset for EncodingVideo model."""
62

63
    queryset = EncodingVideo.objects.all()
1✔
64
    serializer_class = EncodingVideoSerializer
1✔
65
    filter_fields = ("video",)
1✔
66

67
    @action(detail=False, methods=["get"])
1✔
68
    def video_encodedfiles(self, request):
1✔
69
        """Retrieve encoded video files."""
70
        encoded_videos = EncodingVideoViewSet.filter_encoded_medias(
×
71
            self.queryset, request
72
        )
73
        encoded_videos = sorted(encoded_videos, key=lambda x: x.height)
×
74
        serializer = EncodingVideoSerializer(
×
75
            encoded_videos, many=True, context={"request": request}
76
        )
77
        return Response(serializer.data)
×
78

79
    @staticmethod
1✔
80
    def filter_encoded_medias(queryset, request):
1✔
81
        """Filter encoded media files."""
82
        encoded_audios = queryset
×
83
        if request.GET.get("video"):
×
84
            encoded_audios = encoded_audios.filter(video__id=request.GET.get("video"))
×
85
        if request.GET.get("extension"):
×
86
            encoded_audios = encoded_audios.filter(
×
87
                source_file__iendswith=request.GET.get("extension")
88
            )
89
        return encoded_audios
×
90

91

92
class EncodingAudioViewSet(viewsets.ModelViewSet):
1✔
93
    """Viewset for EncodingAudio model."""
94

95
    queryset = EncodingAudio.objects.all()
1✔
96
    serializer_class = EncodingAudioSerializer
1✔
97
    filter_fields = ("video",)
1✔
98

99
    @action(detail=False, methods=["get"])
1✔
100
    def audio_encodedfiles(self, request):
1✔
101
        """Retrieve encoded audio files."""
102
        encoded_audios = EncodingVideoViewSet.filter_encoded_medias(
×
103
            self.queryset, request
104
        )
105
        serializer = EncodingAudioSerializer(
×
106
            encoded_audios, many=True, context={"request": request}
107
        )
108
        return Response(serializer.data)
×
109

110

111
class VideoRenditionViewSet(viewsets.ModelViewSet):
1✔
112
    queryset = VideoRendition.objects.all()
1✔
113
    serializer_class = VideoRenditionSerializer
1✔
114

115

116
class PlaylistVideoSerializer(serializers.HyperlinkedModelSerializer):
1✔
117
    class Meta:
1✔
118
        model = PlaylistVideo
1✔
119
        fields = (
1✔
120
            "id",
121
            "url",
122
            "name",
123
            "video",
124
            "encoding_format",
125
            "source_file",
126
            "sites_all",
127
        )
128

129

130
class PlaylistVideoViewSet(viewsets.ModelViewSet):
1✔
131
    queryset = PlaylistVideo.objects.all()
1✔
132
    serializer_class = PlaylistVideoSerializer
1✔
133

134

135
@api_view(["GET"])
1✔
136
def launch_encode_view(request):
1✔
137
    """API view for launching video encoding."""
138
    video = get_object_or_404(Video, slug=request.GET.get("slug"))
×
139
    if (
×
140
        video is not None
141
        and (
142
            not hasattr(video, "launch_encode") or getattr(video, "launch_encode") is True
143
        )
144
        and video.encoding_in_progress is False
145
    ):
146
        video.launch_encode = True
×
147
        video.save()
×
148
    return Response(VideoSerializer(instance=video, context={"request": request}).data)
×
149

150

151
@api_view(["GET"])
1✔
152
def launch_transcript_view(request):
1✔
153
    """API view for launching transcript."""
154
    video = get_object_or_404(Video, slug=request.GET.get("slug"))
×
155
    if video is not None and video.get_video_mp3():
×
156
        start_transcript(video.id, threaded=True)
×
157
    return Response(VideoSerializer(instance=video, context={"request": request}).data)
×
158

159

160
@api_view(["GET"])
1✔
161
def store_remote_encoded_video(request):
1✔
162
    """API view for storing remote encoded videos."""
163
    video_id = request.GET.get("id", 0)
×
164
    video = get_object_or_404(Video, id=video_id)
×
165
    # start_store_remote_encoding_video(video_id)
166
    return Response(VideoSerializer(instance=video, context={"request": request}).data)
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc