From 3fa00c0aa9c82fe9a47bce4dc1eb6ec99a1b6156 Mon Sep 17 00:00:00 2001 From: Chneemann Date: Sat, 10 May 2025 13:40:48 +0200 Subject: [PATCH] feat: ensure video entry is only visible after thumbnail creation and processing ("is_available") --- backend/video_app/models.py | 2 +- backend/video_app/services.py | 3 +-- backend/video_app/signals.py | 10 ++++++---- backend/video_app/tasks.py | 9 ++------- backend/video_app/views.py | 4 ++-- 5 files changed, 12 insertions(+), 16 deletions(-) diff --git a/backend/video_app/models.py b/backend/video_app/models.py index d5a6111..90c5fd0 100644 --- a/backend/video_app/models.py +++ b/backend/video_app/models.py @@ -2,7 +2,6 @@ from django.db import models from django.conf import settings from datetime import date from .class_assets import VIDEO_GENRES -import uuid class Video(models.Model): creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,default=1) @@ -12,6 +11,7 @@ class Video(models.Model): genre = models.CharField(max_length=20, choices=VIDEO_GENRES, blank=True, null=True) file_path = models.FileField(upload_to='videos/', blank=True, null=True) file_name = models.CharField(max_length=50, blank=True, null=True) + is_available = models.BooleanField(default=False) def __str__(self): return f'({self.id}) {self.title}' \ No newline at end of file diff --git a/backend/video_app/services.py b/backend/video_app/services.py index 67eafe3..c4049fd 100644 --- a/backend/video_app/services.py +++ b/backend/video_app/services.py @@ -1,5 +1,4 @@ -import os -import uuid +import os, uuid from django.core.files.storage import FileSystemStorage from django.conf import settings from .models import Video diff --git a/backend/video_app/signals.py b/backend/video_app/signals.py index 732c393..5a95b05 100644 --- a/backend/video_app/signals.py +++ b/backend/video_app/signals.py @@ -2,9 +2,7 @@ from .models import Video from .tasks import convert_video_to_hls, create_thumbnails, delete_original_video from django.dispatch import receiver from django.db.models.signals import post_save, post_delete -import os -import django_rq -import shutil +import os, shutil, django_rq @receiver(post_save, sender=Video) def video_post_save(sender, instance, created, **kwargs): @@ -14,12 +12,16 @@ def video_post_save(sender, instance, created, **kwargs): - Convert video to different resolutions (HLS) - Delete original video """ - if not created: + if not created and instance.is_available: return if instance.file_path and instance.file_name: try: create_thumbnails(instance, instance.id) + + if not instance.is_available: + instance.is_available = True + instance.save(update_fields=['is_available']) queue = django_rq.get_queue("default", autocommit=True) resolutions = ["1280x720", "640x360", "1920x1080"] diff --git a/backend/video_app/tasks.py b/backend/video_app/tasks.py index 4d2fe77..84d12db 100644 --- a/backend/video_app/tasks.py +++ b/backend/video_app/tasks.py @@ -1,7 +1,4 @@ -import shutil -import subprocess -import ffmpeg -import os +import shutil, subprocess, ffmpeg, os from django.conf import settings def convert_video_to_hls(source, resolution, model_id): @@ -59,11 +56,9 @@ def create_thumbnails(instance, model_id): os.makedirs(thumbnail_dir) try: - # Generate the image thumbnails ffmpeg.input(video_file_path, ss=1).output(thumbnail_1080p_path, vf='scale=1920:-1', vframes=1).run(overwrite_output=True) ffmpeg.input(video_file_path, ss=1).output(thumbnail_480_path, vf='scale=720:-1', vframes=1).run(overwrite_output=True) - # Create the 10-second video thumbnail create_video_thumbnail(video_file_path, thumbnail_dir, base_filename) except ffmpeg._run.Error as e: @@ -82,7 +77,7 @@ def create_video_thumbnail(video_file_path, thumbnail_dir, base_filename): video_thumbnail_path, vf='scale=1280:-1', vcodec='libx264', - an=None # Disable audio + an=None ).run(overwrite_output=True) except ffmpeg._run.Error as e: diff --git a/backend/video_app/views.py b/backend/video_app/views.py index de7263f..2c615a4 100644 --- a/backend/video_app/views.py +++ b/backend/video_app/views.py @@ -15,9 +15,9 @@ import os @permission_classes([IsAuthenticated]) def video_list(request): """ - List all videos + List all videos with is_available=True """ - videos = Video.objects.all() + videos = Video.objects.filter(is_available=True) serializer = VideoSerializer(videos, many=True) return Response(serializer.data)