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