class MixUploader < CarrierWave::Uploader::Base # include CarrierWaveDirect::Uploader include CarrierWave::MimeTypes process :set_content_type process :add_metadata version :mp3_url do process :create_mp3 def full_filename(file) model.filename('mp3') if model.id end end def initialize(*) super JamRuby::UploaderConfiguration.set_aws_private_configuration(self) end # Add a white list of extensions which are allowed to be uploaded. def extension_white_list %w(ogg) end def store_dir nil end def md5 @md5 ||= ::Digest::MD5.file(current_path).hexdigest end def filename model.filename('ogg') if model.id end def add_metadata # add this metadata to ogg file without disturbing audio # JamRecordingId=438 # JamMixId=438 # JamType=Mix # secret sauce is -codec copy (or -acodec), and a bunch of -metadata arguments. # after done, stomp input file with new one input_file = current_path output_file = current_path + '.new.ogg' codec_param = RUBY_PLATFORM.include?('darwin') ? 'codec' : 'acodec' ffmpeg_cmd = "#{APP_CONFIG.ffmpeg_path} -i \"#{input_file}\" -#{codec_param} copy -metadata JamRecordingId=#{model.recording_id} -metadata JamMixId=#{model.id} -metadata JamType=Mix \"#{output_file}\"" system(ffmpeg_cmd) unless $? == 0 raise "ffmpeg metadata copy failed. cmd=#{ffmpeg_cmd}" end FileUtils.mv output_file, input_file end def create_mp3 # add this metadata to mp3 file # JamRecordingId=438 # JamMixId=438 # JamType=Mix input_file = current_path output_file = current_path + '.new.mp3' ffmpeg_cmd = "#{APP_CONFIG.ffmpeg_path} -i \"#{input_file}\" -ab 128k -metadata JamRecordingId=#{model.recording_id} -metadata JamMixId=#{model.id} -metadata JamType=Mix \"#{output_file}\"" system(ffmpeg_cmd) unless $? == 0 raise "ffmpeg mp3 convert failed. cmd=#{ffmpeg_cmd}" end model.mp3_md5 = Digest::MD5.file(output_file).hexdigest model.mp3_length = File.size(output_file) model.mp3_url = model.filename('mp3') file.instance_variable_set(:@content_type, 'audio/mpeg') FileUtils.mv output_file, input_file end end