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