Search code examples
ruby-on-railspaperclipswfupload

How to get image capture date and video duration when uploading files using SWFUpload and Paperclip on Rails


I'm using SWFUpload and Paperclip on Rails 2.3.5 to upload images and videos. How can I store the capture date of images and duration of videos?

The following works correctly in irb:

irb(main):001:0> File.new('hatem.jpg').mtime
=> Tue Mar 09 16:56:38 +0200 2010

But when I try to use Paperclip's before_post_process:

before_post_process :get_file_info
def get_file_info
  puts File.new(self.media.to_file.path).mtime  # =>Wed Apr 14 18:36:22 +0200 2010
end

I get the current date instead of the capture date. How can I fix this? Also, how can I get the video duration and store it with the model?

Thank you.


Solution

  • It turns out that SWFUpload provides access to the file properties before uploading in the handlers.js file. So, to get the capture date:

    //handlers.js    
    function uploadStart(file) {
        // set the captured_at to the params
        swfu.removePostParam("captured_at");
        swfu.addPostParam("captured_at", file.modificationdate);
        ...
    }
    

    Now, you can receive it in the controller:

    class UploadsController < ApplicationController
      def create
        @upload.captured_at = params[:captured_at].try :to_time
        ...
      end
    end
    

    To get the video duration, we have used Paperclip's before_post_process to run an FFmpeg command:

    class Upload < ActiveRecord::Base
      before_post_process :get_video_duration
    
      def get_video_duration
        result = `ffmpeg -i #{self.media.to_file.path} 2>&1`
        if result =~ /Duration: ([\d][\d]:[\d][\d]:[\d][\d].[\d]+)/
          self.duration = $1.to_s
        end
        return true
      end
      ...
    end