Использование скрепки для сохранения вложения в файловой системе и S3 - PullRequest
2 голосов
/ 13 марта 2012

Я использую вариант wav-mp3 в качестве процессора для скрепок, и мне нужно иметь возможность сохранять вложения как локально, так и удаленно.Вот процессор:

module Paperclip
    class Ffmpeg < Processor

    attr_accessor :file, :params, :format

    def initialize file, options = {}, attachment = nil
      super
      @file           = file
      @params         = options[:params]
      @current_format = File.extname(@file.path)
      @basename       = File.basename(@file.path, @current_format)
      @format         = options[:format]
    end

    def make
      src = @file
      dst = Tempfile.new([@basename, @format ? ".#{@format}" : ''])
      begin
        parameters = []
        parameters << @params
        parameters << ":source"
        parameters << ":dest"
        parameters = parameters.flatten.compact.join(" ").strip.squeeze(" ")
        cmd = "-y -i #{File.expand_path(src.path)} #{File.expand_path(dst.path)} -acodec mp3"
        success = Paperclip.run("ffmpeg", cmd)
        # This was an idea but I don't know how to access the Tempfile's name from the controller
        FileUtils.copy_file(File.expand_path(dst.path), "#{Rails.root}/tmp/#{File.basename(src.path)}" )
      rescue PaperclipCommandLineError => e
        raise PaperclipError, "There was an error converting #{@basename} to mp3"
      end
      dst
    end
  end
end

Вы можете видеть, что я использую FileUtils.copy_file, чтобы сохранить его локально, но я не уверен, как передать имя файла обратно в контроллер.

Здесьмоя модель:

class AudioFile < ActiveRecord::Base
  establish_connection "audio_file"

  has_attached_file :wav,
                    :styles => {
                       :mp3 => {
                         #:params => "-encode --scale 1 --vbr-new -V7",
                         #:params => "-i
                         :format => "mp3" }
                    },
                    :default_style => :normal,
                    :processors => [:ffmpeg],
                    :storage => :s3,
                    :s3_credentials => "#{Rails.root}/config/s3.yml",
                    :path => "/call_recordings/:filename"

  after_post_process :get_duration

  def get_duration
    # This what I'm ultimately trying to do:
    #self.duration = `mp3info -p "%S" #{File.expand_path(dst.path)}`
  end
end

В конечном итоге я пытаюсь получить длительность mp3 в модель, но не уверен, как именно так я собирался сделать это в контроллере с локальной копией файла,затем удалите файл.

Открыто для любых предложений:)

...