class VideoConverter::OpenSSL

Attributes

bin[RW]
command[RW]
encryption_type[RW]

Public Class Methods

get_encryption_key(output) click to toggle source
# File lib/video_converter/openssl.rb, line 43
def self.get_encryption_key(output)
  if output.encryption_key
    File.join(output.work_dir, "video.key")
  elsif output.encryption_key_url
    File.join(output.work_dir, "url.video.key")
  else
    File.join(output.work_dir, "#{output.filename}.key")
  end
end
get_encryption_key_path(output) click to toggle source
# File lib/video_converter/openssl.rb, line 29
def self.get_encryption_key_path(output)
  if output.encryption_key
    File.open(File.join(output.work_dir,'video.key'), 'wb') { |f| f.write output.encryption_key }
    'video.key'
  elsif output.encryption_key_url
    uri = URI(output.encryption_key_url)
    File.open(File.join(output.work_dir,'url.video.key'), 'wb') { |f| f.puts Net::HTTP.get(uri.host, uri.path) }
    output.encryption_key_url
  else
    File.open(File.join(output.work_dir, "#{output.filename}.key"), 'wb') { |f| f.write SecureRandom.hex(8) }
    "#{output.filename}.key"
  end
end
run(output) click to toggle source
# File lib/video_converter/openssl.rb, line 12
def self.run(output)
  success = true
  playlist = File.join(output.work_dir, output.filename)
  File.write(playlist, File.read(playlist).sub("#EXTM3U\n", "#EXTM3U\n#EXT-X-KEY:METHOD=AES-128,URI=\"#{OpenSSL.get_encryption_key_path(output)}\"\n"))
  encryption_dir = FileUtils.mkdir_p("#{output.chunks_dir}_encrypted").first
  chunks = Dir::glob(File.join(output.chunks_dir, "*.ts")).sort do |c1, c2|
    File.basename(c1).match(/\d+/).to_s.to_i <=> File.basename(c2).match(/\d+/).to_s.to_i
  end
  chunks.each_with_index do |chunk, index|
    initialization_vector = "%032x" % index
    success &&= Command.new(command, prepare_params( :chunk => chunk, :encrypted_chunk => File.join(encryption_dir,File.basename(chunk)),
                                                     :initialization_vector => initialization_vector, :encryption_key => OpenSSL.get_encryption_key(output) )).execute
  end
  remove_old_dir(output) if success
  success
end

Private Class Methods

prepare_params(params) click to toggle source
# File lib/video_converter/openssl.rb, line 55
def self.prepare_params(params)
  {
    :bin => bin,
    :encryption_type => encryption_type,
    :chunk => params[:chunk],
    :encrypted_chunk => params[:encrypted_chunk],
    :initialization_vector => params[:initialization_vector],
    :encryption_key => `hexdump -e '16/1 "%02x"' #{params[:encryption_key]}`
  }
end
remove_old_dir(output) click to toggle source
# File lib/video_converter/openssl.rb, line 66
def self.remove_old_dir(output)
  FileUtils.rm_r(output.chunks_dir)
  FileUtils.mv("#{output.chunks_dir}_encrypted", output.chunks_dir)
  FileUtils.rm (File.join(output.work_dir,'url.video.key')) if File.exists?(File.join(output.work_dir,'url.video.key'))
end