0

I want to give the signal after the video has fully uploaded, i tried with delays but the time varies conform the upload speed

Here is the model:

class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
title = models.CharField(max_length=500)
description = models.TextField()
video = models.FileField(blank=True ,upload_to='media/uploads/video_files/', validators = [FileExtensionValidator(allowed_extensions=['mp4'])])
thumbnail = models.ImageField(blank=True, upload_to='thumbnail/', validators = [FileExtensionValidator(allowed_extensions=['jpeg', 'png', 'gif', 'webp', 'jpg'])])
video_preview = models.ImageField(blank=True, upload_to='thumbnail/')
video_compressed = models.FileField(blank=True, upload_to='media/uploads/compressed/', validators= [FileExtensionValidator(allowed_extensions=['mp4'])])
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
comments = GenericRelation(Comment)
tags = TaggableManager()
categories = models.ManyToManyField('Category', blank=True)
hit_count_generic = GenericRelation(HitCount, object_id_field='object_pk', related_query_name='hit_count_generic_relation')
existingPath = models.CharField(null=True, unique=True, max_length=1000)
eof = models.BooleanField(default=False)

iframe = models.URLField(max_length=5000, blank=True)
approved = models.BooleanField(default=False)
link = models.URLField(max_length=5000, blank=True)
duration = models.CharField(max_length=500, default='N/A')

javascript for the video to upload in chunks:

class FileUpload {

constructor(input) {
    this.input = input
    this.max_length = 1024 * 1024 * 10;
}

create_progress_bar() {
    var progress = `<div class="file-icon">
                        <i class="fa fa-file-o" aria-hidden="true"></i>
                    </div>
                    <div class="file-details">
                    <p class="filename"></p>
                        <small class="textbox"></small>
                        <div class="progress" style="margin-top: 5px;">
                            <div class="progress-bar bg-success" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
                            </div>
                            </div>
                            </div>`
    document.getElementById('uploaded_files').innerHTML = progress
}

upload() {
    this.create_progress_bar();
    this.initFileUpload();
}

initFileUpload() {
    this.file = this.input.files[0];
    this.upload_file(0, null);
}

//upload file
upload_file(start, model_id) {

    var id_categories = []; 
    var category = document.querySelectorAll("input[type=checkbox]:checked")
    for (var i = 0; i < category.length; i++) {
        id_categories.push(category[i].value)
    }
    var end;
    var self = this;
    var existingPath = model_id;
    var formData = new FormData();
    var nextChunk = start + this.max_length + 1;
    var title = $('#title').val();
    var tags = $('#tags').val();
    var description = $('#description').val()
    var currentChunk = this.file.slice(start, nextChunk);
    var uploadedChunk = start + currentChunk.size
    if (uploadedChunk >= this.file.size) {
        end = 1;
    } else {
        end = 0;
    }
    let r = (Math.random() + 1).toString(36).substring(7);

    if(!$('#fileimage')[0].files[0]){
        
       formData.append('image', null)
       formData.append('imagename', null)
    }else{
       formData.append('image', $('#fileimage')[0].files[0])
       formData.append('imagename', r + $('#fileimage')[0].files[0].name)
    }       
    formData.append('file', currentChunk)
    formData.append('filename', this.file.name)
    $('.filename').text(this.file.name)
    formData.append('title', title)
    formData.append('description', description)
    formData.append('categories', id_categories)
    formData.append('tags', tags)
    $('.textbox').text("Uploading file")
    formData.append('end', end)
    formData.append('existingPath', existingPath);
    formData.append('nextSlice', nextChunk);
    $.ajaxSetup({
        headers: {
            "X-CSRFToken": document.querySelector('[name=csrfmiddlewaretoken]').value,
        }
    });
    $.ajax({
        xhr: function () {
            var xhr = new XMLHttpRequest();
            xhr.upload.addEventListener('progress', function (e) {
                if (e.lengthComputable) {
                    if (self.file.size < self.max_length) {
                        var percent = Math.round((e.loaded / e.total) * 100);
                    } else {
                        var percent = Math.round((uploadedChunk / self.file.size) * 100);
                    }
                    $('.progress-bar').css('width', percent + '%')
                    $('.progress-bar').text(percent + '%')
                }
            });
            return xhr;
        },

        url: '/create-post',
        type: 'POST',
        dataType: 'json',
        cache: false,
        processData: false,
        contentType: false,
        data: formData,
        error: function (xhr) {
            alert(xhr.statusText);
        },
        success: function (res) {
            if (nextChunk < self.file.size) {
                // upload file in chunks
                existingPath = res.existingPath
                self.upload_file(nextChunk, existingPath);
            } else {
                // upload complete
                $('.textbox').text(res.data);
                alert(res.data)
                window.location.assign('https://lumenporn.com')
            }
        }
    });
};}

signals.py:

    @receiver(post_save, sender=Post)
def generate_thumbnail(sender, instance ,**kwargs):
    queue = get_queue('default')
    queue.enqueue_in(timedelta(seconds=200) ,tasks.generate_thumbnail, instance.pk)


@receiver(post_save, sender=Post)
def generate_preview(sender, instance, **kwargs):
    queue = get_queue('default')
    queue.enqueue_in(timedelta(seconds=200) ,tasks.generate_preview, instance.pk)

@receiver(post_save, sender=Post)
def generate_video_compression(sender, instance, timeout=40 ,**kwargs):
    queue = get_queue('default')
    queue.enqueue_in(timedelta(seconds=5050), tasks.generate_video_compression, instance.pk, job_timeout=600)

@receiver(post_save, sender=Post)
def get_duration(sender, instance, timeout=40 ,**kwargs):
    queue = get_queue('default')
    queue.enqueue_in(timedelta(seconds=4000), tasks.get_duration, instance.pk, job_timeout=600)

I cant find anything online, i have the boolean field in my model that results true after the file fully uploaded, i want to start the jobs after the boolean is true

MrLonely
  • 23
  • 1
  • 5
  • Create a new route in your Django app responsible for triggering your RQ job and update your Javascript uploaded to call that route with the upload ID on completion. – AdamMcKay Jun 08 '23 at 09:41

0 Answers0