Django Rest Framework:Как вычислить процент продолжительности видео?

В моем проекте есть раздел видео, в котором я хочу рассчитать процент времени, которое пользователь будет смотреть. Через приведенный ниже URL можно получить доступ к деталям видео

URL : video/video_id выход:

"video": {
                "id": "84e7288c-dc09-44aa-850c-08546a98ffde",
                "deleted": null,
                "datetime_created": "02/04/2022 06:56 AM",
                "datetime_updated": "02/04/2022 06:56 AM",
                "video_name": "video name3",
                "description": "description about video",
                "duration": "00:33:20",
                "create_date": "02/04/2022 06:56 AM",
                "video_type": "micro",
                "file_url": "https://vimeo.com/216763352",
                "general_status": "high",
                "review_status": "draft",
                "video_number": "VD6129",
                "created_by": null
            },

"duration": "00:33:20" - общая продолжительность видео. Как вычислить процент времени, которое пользователь смотрит видео, если передать время в секундах, как

{
    "time":200
}

Недавно я делал нечто подобное, моей задачей было подсчитать время просмотра видео и дать соответствующие баллы. Меня также попросили не давать процент и баллы за просмотренное время видео. Я использовал алгоритм слияния, чтобы сделать слияние перекрывающихся интервалов. Вы можете адаптировать код под требования вашей задачи, потому что вас могут не попросить дать пользователю баллы и сделать уникальный 100% точный расчет, как это сделал я, вот что я сделал:

models.py

views.py

class LessonVideoExamSubmitView(generics.GenericAPIView):
    queryset = LessonProgress.objects.all()
    serializer_class = serializers.LessonVideoExamSubmitSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(
            data=request.data, context={"request": request}
        )
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

serializers.py

class LessonVideoExamSubmitSerializer(serializers.Serializer):
    lesson_id = serializers.IntegerField()
    video_length = serializers.FloatField()
    start_progress = serializers.FloatField()
    end_progress = serializers.FloatField()
    is_expired = serializers.BooleanField(default=False)

    def create(self, validated_data):
        # get lesson progress for given lesson id
        progress = LessonProgress.objects.get(
            lesson_id=validated_data.get("lesson_id"), user=self.context["request"].user
        )

        # get the current video progress before merging with other progresses
        progress_before_merge = progress.progress_before_merge(
            progress.lesson_video_progress
        )

    # create new video progress for given intervals
    progress.create_lesson_video_progress(
        progress.id,
        validated_data.get("video_length"),
        validated_data.get("start_progress"),
        validated_data.get("end_progress"),
    )

    # merge created video progress objects with existing objects in the database
    progress_merge = progress.merge(
        progress.lesson_video_progress.all().order_by("start_progress"),
        progress_before_merge,
    )

    # pass video length and merged objects duration in seconds and get watched video percentage
    percentage = progress.calculate_percentage(
        validated_data.get("video_length"), progress_merge
    )

    if progress.percentage + percentage >= 100:
        """
        add progress percentage and calculated percentage, round the sum to 100
        """
        percentage = progress.round_percentage(percentage, progress.percentage)

    # get points to the lesson by passing the percentage
    points = progress.calculate_points(progress.lesson, percentage)

    # add points to user
    progress.user_points(progress.user, points, validated_data.get("is_expired"))

    # get completed status by sum of progress percentages
    is_completed = progress.is_complete(progress.percentage + percentage)

    # update lesson progress object
    progress.exam_video_progress_points(
        progress,
        percentage,
        validated_data.get("end_progress"),
        is_completed,
        points,
        validated_data.get("is_expired"),
    )

    return validated_data

ЗАМЕЧАНИЕ, что вы можете оптимизировать и удалить ненужные части для вашей собственной логики расчета видео. Обычно я не делюсь исходным кодом, но просто потому, что я действительно хочу помочь, я сделал это, будьте здоровы)

Вернуться на верх