How to upload mp3 with custom duration/length

Does anyone know the right approach to change the duration/length of an uploaded mp3 file? User has the option to upload mp3 file as full, 30 secs or 90 secs. So far, I have gotten it to work for full.

Do I have to use a processor (with ffmpeg) for this? Or is there a built-in option in paperclip for this to happen?

Tried googling around to no avail....

By the way, if user selects 90 secs (for example), then I need Paperclip not to upload the original. The same goes for 30 secs. In theory, its one file or the other.

Your suggestions / feedback are welcome

Note that I am using Paperclip for all my uploads ...

This is what I have. When i submit the form, the page just hangs. No errors, no nothing.

model:   has_attached_file :media,                     :styles => { :short => 'k128' },                     :url => '/assets/:id/:style.:extension',                     :path => ':rails_root/public/ assets/:id/:style.:extension',                     :processors => [:process_audio]

Checkout http://blog.ncodedevlabs.com/2010/01/14/extracting-audio-length-using-rails/

I got mine to work with the following code, incase future devs stumble across a similar situation:

module Paperclip   class ProcessAudio < Processor

    attr_accessor :geometry, :whiny

    def initialize(file, options = {}, attachment = nil)       super       @file = file

      unless options[:geometry].nil?         if options[:geometry] == 'full'           @geometry = ''         elsif options[:geometry] == '30'           @geometry = '-t 30'         elsif options[:geometry] == '90'           @geometry = '-t 90'         end       end

      @whiny = options[:whiny].nil? ? true : options[:whiny]       @basename = File.basename(@file.path, File.extname(@file.path))     end

    def make       dst = Tempfile.new([ @basename, 'mp3' ].compact.join("."))       dst.binmode

      cmd = "ffmpeg -i #{@file.path} #{@geometry} -acodec copy -y #{File.expand_path(dst.path)}"

      begin         success = Paperclip.run(cmd)       rescue PaperclipCommandLineError         raise PaperclipError, "There was an error processing the preview for #{@basename}" if whiny       end       dst     end   end end