Переименование расширения несущей до завершения процесса

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

Когда я обрабатываю версию, обычно я переписываю расширение файла через

def full_filename(for_file=file)
  super.chomp(File.extname(super)) + '.mp3'
end 

но это будет выполнено после процесса создания версии.

Как я могу сделать версию и переименовать ее, прежде чем она будет сохранена.

Чтобы быть более конкретным:

Я конвертирую файл WAV в MP3 с помощью ffmpeg.

FFMPEG требуется входной файл (-i inputfile.wav) и имя выходного файла, которому требуется расширение файла mp3 для обработки mp3. (output.mp3 в моем случае)

Как я могу переименовать расширение, прежде чем оно будет сохранено?

ffmpeg -i inputfile.wav -acodec libmp3lame -f mp3 watermarked.mp3
         HOW CAN I RENAME THE EXTENSTION BEFORE IT GET SAVED? ^^^

Приведенный выше фрагмент (-f форсирует кодек и формат) НЕ выполняет свою работу и

def full_filename(for_file=file)
  super.chomp(File.extname(super)) + '.mp3'
end 

происходит слишком поздно (сделано после обработки)

Как я могу переименовать временное имя Carrierfile?


person Jan    schedule 02.09.2013    source источник
comment
Они загружают wav, а вы сохраняете преобразованный mp3 как версию? Или вы выбрасываете wav?   -  person Taavo    schedule 06.09.2013
comment
да, они загружают wav. И я хочу сохранить mp3 как версию. Wav также должен быть сохранен.   -  person Jan    schedule 06.09.2013


Ответы (1)


Вы можете обойти эту проблему, используя временный файл (с расширением mp3), а затем переместив его в место, где он может быть обработан full_filename, как и ожидалось:

version :mp3 do
  process :convert_to_mp3

  def convert_to_mp3
    temp_path = ... # generate good temp path, ending in '.mp3'

    `ffmpeg -i #{ current_path.shellescape } -acodec libmp3lame -f mp3 #{ temp_path.shellescape }`

    File.unlink(current_path)
    FileUtils.mv(temp_path, current_path)
  end

  def full_filename(for_file)
    super.chomp(File.extname(super)) + '.mp3'
  end
end

Некоторые параметры для создания вашего temp_path, чтобы вы могли проверить и принять решение:

  • current_path.chomp(File.extname(current_path)) + '.mp3'
  • Tempfile.new([File.basename(current_path), '.mp3']).path
  • Rails.root.join('tmp', 'mp3', Dir::Tmpname.make_tmpname([original_filename,'.mp3'], nil))
person Taavo    schedule 06.09.2013
comment
Ты сделал это! Это то, что я искал. Ты не представляешь, как ты мне помог. Большое спасибо! - person Jan; 10.09.2013
comment
@Taavo 2 года спустя, и ты только что помог мне, наконец, избавиться от около 10 часов головной боли. Спасибо! - person Alexander Lozada; 05.08.2015