Использование CarrierWave с Amazon Elastic Transcoder в приложении Rails

До этого я задавал два дополнительных вопроса о переполнении стека, но мне очень мало помогли, и я подумал, что задам открытый вопрос для потомков. Я потратил время на разбор документации по API AWS-SDK и нашел очень мало прямых ответов на мои потребности. Я также разместил на форумах AWS и не смог получить хороший ответ там. Простое, всеобъемлющее, пошаговое решение кажется невозможным.

Что я выполнил:

Загрузка с CarrierWave напрямую на s3. Я последовал за Railscast # 383 и адаптировал его под свои нужды.Я могу "извлечь" мои файлы из моего хранилища s3.

Подробности о том, что я сделал до сих пор:

Я использовал Carrierwave-Direct для прямой загрузки на s3 (это использует туман для загрузки непосредственно на s3). Загрузка обрабатывается в фоновом режиме с Sidekiq. После того, как файл помещен в корзину, я просто извлекаю его, перебирая загрузки пользователей и вызываю файл по URL загрузки из s3.

Вот где я потерялся:

Мне нужно перекодировать видео с помощью Elastic Transcoder, предоставляемого AWS.Мне нужно вспомнить загруженные / преобразованные видео из выходной корзины. Как мне сделать ссылку на URL из "output-bucket"? Это новая ссылка на URL или она остается такой же, как и исходный «URL для загрузки»?Мне нужно интегрировать транскодированные видео из транскодера в Cloudfront и отображать их с помощью JWPlayer.Как интегрировать код API в процесс загрузки в фоновом режиме?

Вот мой код до сих пор:

Мой загрузчик:

class VideoUploader < CarrierWave::Uploader::Base
 include CarrierWaveDirect::Uploader
end

Мой инициализатор, который обрабатывает детали S3:

CarrierWave.configure do |config|

 config.fog_credentials = {
 provider:              'AWS',
 aws_access_key_id:     'AWS_ACCESS_KEY_ID',
 aws_secret_access_key: 'AWS_SECRET_ACCESS_KEY',
 region:                'us-west-1'}

 config.fog_directory  = 'video-input'
 config.fog_public     = false                                        # optional, defaults to true
 config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" } # optional, defaults to {}
end

Моя модель загрузки:

class Upload < ActiveRecord::Base
 belongs_to :user
 mount_uploader :video, VideoUploader


 after_save :enqueue_video

 def enqueue_video
  VideoWorker.perform_async(id, key) if key.present?
 end

 class VideoWorker
  include Sidekiq::Worker

  def perform(id, key)
    upload = Upload.find(id)
    upload.key = key
    video.remote_video_url = upload.video.direct_fog_url(with_path: true)
    upload.save!
  end
 end
end

Мой взгляд:

Чтобы показать все добавления пользователя:

<% @user.uploads.each do |upload| %>
  <%= link_to upload.title, upload_url(upload) %>
<% end %>

Чтобы показать загрузку (сейчас это только ссылка на скачивание):

<h1><%= @upload.title %></h1>
<p><%= link_to @upload.video_url %></p>

Я не думаю, что моя схема или формы актуальны.

Пример того, как я думаю, что код может работать:

Я бы добавил этот код в рабочий Sidekiq, но я не уверен, правильно ли я это делаю. Я также не уверен, как я собираюсь подключить свою «загрузку» к «преобразованной загрузке».

 upload.update_column 'converted_video', 
 File.basename(upload.video.path)

transcoder = AWS::ElasticTranscoder::Client.new
transcoder.create_job(
  pipeline_id: APP_CONFIG[Rails.env][:pipeline_id],
  input: {
    key: upload.video.path,
    frame_rate: 'auto',
    resolution: 'auto',
    aspect_ratio: 'auto',
    interlaced: 'auto',
    container: 'auto'
  },
  output: {
    key: upload.converted_video.path,
    preset_id: WEB_M4_PRESET_ID,
    thumbnail_pattern: "",
    rotate: '0'
  }
)

Ссылки на полезную статью и документы о Elastic Transcoder:

http://www.techdarkside.com/getting-started-with-the-aws-elastic-transcoder-api-in-rails

http://docs.aws.amazon.com/sdkforruby/api/Aws/ElasticTranscoder.html

Ответы на вопрос(1)

Ваш ответ на вопрос