title: Can I convert a django video upload from a form using ffmpeg before storing the video?
body: <p>I've been stuck for weeks trying to use ffmpeg to convert user uploaded videos to flv.  I use heroku to host my website, and store my static and media files on amazon S3 with s3boto.  The initial video file will upload fine, however when I retrieve the video and run a celery task (in the same view where the initial video file is uploaded), the new file won't store on S3. I've been trying to get this to work for over a month, with no luck, and really no good resources available for learning how to do this, so I figure maybe if I can get the ffmpeg task to run before storing the video I may be able to get it to work.  Unfortunately I'm still not a very advanced at python (or django), so I don't even know if/how this is possible. Anyone have any ideas? I am willing to use any solution at this point no matter how ugly, as long as it successfully takes video uploads and converts to flv using ffmpeg, with the resulting file being stored on S3.  It doesn't seem that my situation is very common, because no matter where I look, I cannot find a solution that explains what I should be trying to do. Therefore I will be very appreciative of any guidance.  Thanks. My relevant code follows:</p>
  
  <pre><code>#models.py
  def content_file_name(instance, filename):
      ext = filename.split('.')[-1]
      new_file_name = "remove%s.%s" % (uuid.uuid4(), ext)
      return '/'.join(['videos', instance.teacher.username, new_file_name])
  
  class BroadcastUpload(models.Model):
      title = models.CharField(max_length=50, verbose_name=_('Title'))
      description = models.TextField(max_length=100, verbose_name=_('Description'))
      teacher = models.ForeignKey(User, null=True, blank=True, related_name='teacher')
      created_date = models.DateTimeField(auto_now_add=True)
      video_upload = models.FileField(upload_to=content_file_name)
      flvfilename = models.CharField(max_length=100, null=True, blank=True)
      videothumbnail = models.CharField(max_length=100, null=True, blank=True)
  
  #tasks.py
  @task(name='celeryfiles.tasks.convert_flv')
  def convert_flv(video_id):
      video = BroadcastUpload.objects.get(pk=video_id)
      print "ID: %s" % video.id
      id = video.id
      print "VIDEO NAME: %s" % video.video_upload.name
      teacher = video.teacher
      print "TEACHER: %s" % teacher
      filename = video.video_upload
      sourcefile = "%s%s" % (settings.MEDIA_URL, filename)
      vidfilename = "%s_%s.flv" % (teacher, video.id)
      targetfile = "%svideos/flv/%s" % (settings.MEDIA_URL, vidfilename)
      ffmpeg = "ffmpeg -i %s %s" % (sourcefile, vidfilename)
      try:
          ffmpegresult = subprocess.call(ffmpeg)
          #also tried separately with following line:
          #ffmpegresult = commands.getoutput(ffmpeg)
          print "---------------FFMPEG---------------"
          print "FFMPEGRESULT: %s" % ffmpegresult
      except Exception as e:
          ffmpegresult = None
          print("Failed to convert video file %s to %s" % (sourcefile, targetfile))
          print(traceback.format_exc())
      video.flvfilename = vidfilename
      video.save()
  
  @task(name='celeryfiles.tasks.ffmpeg_image')        
  def ffmpeg_image(video_id):
      video = BroadcastUpload.objects.get(pk=video_id)
      print "ID: %s" %video.id
      id = video.id
      print "VIDEO NAME: %s" % video.video_upload.name
      teacher = video.teacher
      print "TEACHER: %s" % teacher
      filename = video.video_upload
      sourcefile = "%s%s" % (settings.MEDIA_URL, filename)
      imagefilename = "%s_%s.png" % (teacher, video.id)
      thumbnailfilename = "%svideos/flv/%s" % (settings.MEDIA_URL, thumbnailfilename)
      grabimage = "ffmpeg -y -i %s -vframes 1 -ss 00:00:02 -an -vcodec png -f rawvideo -s 320x240 %s" % (sourcefile, thumbnailfilename)
      try:        
           videothumbnail = subprocess.call(grabimage)
           #also tried separately following line:
           #videothumbnail = commands.getoutput(grabimage)
           print "---------------IMAGE---------------"
           print "VIDEOTHUMBNAIL: %s" % videothumbnail
      except Exception as e:
           videothumbnail = None
           print("Failed to convert video file %s to %s" % (sourcefile, thumbnailfilename))
           print(traceback.format_exc())
      video.videothumbnail = imagefilename
      video.save()
  
  #views.py
  def upload_broadcast(request):
      if request.method == 'POST':
          form = BroadcastUploadForm(request.POST, request.FILES)
          if form.is_valid():
              upload=form.save()
              video_id = upload.id
              image_grab = ffmpeg_image.delay(video_id)
              video_conversion = convert_flv.delay(video_id)
              return HttpResponseRedirect('/current_classes/')
      else:
          form = BroadcastUploadForm(initial={'teacher': request.user,})
      return render_to_response('videos/create_video.html', {'form': form,}, context_instance=RequestContext(request))
  
  #settings.py
  DEFAULT_FILE_STORAGE = 'myapp.s3utils.MediaRootS3BotoStorage'
  DEFAULT_S3_PATH = "media"
  STATICFILES_STORAGE = 'myapp.s3utils.StaticRootS3BotoStorage'
  STATIC_S3_PATH = "static"
  AWS_STORAGE_BUCKET_NAME = 'my_bucket'
  CLOUDFRONT_DOMAIN = 'domain.cloudfront.net'
  AWS_ACCESS_KEY_ID = 'MY_KEY_ID'
  AWS_SECRET_ACCESS_KEY = 'MY_SECRET_KEY'
  MEDIA_ROOT = '/%s/' % DEFAULT_S3_PATH
  MEDIA_URL = 'http://%s/%s/' % (CLOUDFRONT_DOMAIN, DEFAULT_S3_PATH)
  ...
  
  #s3utils.py
  from storages.backends.s3boto import S3BotoStorage
  from django.utils.functional import SimpleLazyObject
  
  StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
  MediaRootS3BotoStorage  = lambda: S3BotoStorage(location='media')
  </code></pre>
  
  <p>I can add any other info if needed to help me solve my problem.</p>