class VideoScreenshoter::Abstract

Attributes

duration[RW]
exact[RW]
ffmpeg[RW]
imagemagick[RW]
input[RW]
offset_end[RW]
offset_start[RW]
output_dir[RW]
output_file[RW]
presets[RW]
size[RW]
times[RW]
verbose[RW]

Public Class Methods

new(params) click to toggle source
# File lib/video_screenshoter/abstract.rb, line 7
def initialize params
  params.each_with_index do |param, index|
    params[index] = Shellwords.escape(param) if param.is_a?(String)
  end
  [:ffmpeg, :imagemagick, :output_dir, :output_file, :verbose].each do |attr|
    self.send("#{attr}=".to_sym, params[attr].nil? ? VideoScreenshoter.send(attr) : params[attr])
  end
  FileUtils.mkdir_p self.output_dir
  self.input = params[:input]
  self.duration = input_duration
  raise ArgumentError.new('Incorrect or empty m3u8 playlist') if duration.nil? || duration <= 0

  # if false ffmpeg uses fast seek by keyframes like: ffmpeg -ss ... -i
  self.exact = params[:exact]

  if params[:times]
    self.exact = true if exact.nil?
    self.times = params[:times].to_a.map do |time|
      if time.is_a?(String) && matches = time.match(/(.*)%$/)
        time = matches[1].to_f / 100 * duration
      end
      time = duration + time if time < 0
      time = time.to_i
      time
    end.uniq
  elsif (number = params[:number].to_i) > 0
    [:offset_start, :offset_end].each do |attr|
      if percent = params[attr].to_s.match(/^(\d+)\\?%$/).to_a[1]
        self.send("#{attr}=", duration * percent.to_i / 100.0)
      else
        self.send("#{attr}=", params[attr].to_f)
      end
    end
    self.times = number.times.to_a.map { |time| ((offset_start + (duration - offset_start - offset_end) / number * time) * 100).round / 100.0 }.uniq
  else
    raise ArgumentError.new('times or number required') if times.empty?
  end

  self.size = params[:size] ? "-s #{params[:size]}" : ''

  # TODO possibility to replace original image by presetted image
  if params[:presets] && params[:presets].is_a?(Hash)
    self.presets = {}
    params[:presets].each do |name, preset|
      self.presets[name.to_sym] = !preset || preset.empty? || preset.index('-') == 0 ? preset : "-resize #{preset}"
    end
  end
end

Public Instance Methods

ffmpeg_command(input, output, time) click to toggle source
# File lib/video_screenshoter/abstract.rb, line 62
def ffmpeg_command input, output, time
  is = exact ? "-i #{input} -ss #{time}" : "-ss #{time} -i #{input}"
  "#{ffmpeg} #{is} -acodec -an #{size} -f image2 -vframes 1 -y #{output} 1>/dev/null 2>&1"
end
ffmpeg_run(time = nil) click to toggle source
# File lib/video_screenshoter/abstract.rb, line 67
def ffmpeg_run time = nil
  cmd = ffmpeg_command(input, output_fullpath(time), time)
  puts cmd if verbose
  system cmd
end
imagemagick_command(input, preset_name) click to toggle source
# File lib/video_screenshoter/abstract.rb, line 77
def imagemagick_command input, preset_name
  preset = presets[preset_name.to_sym]
  if !preset || preset.empty?
    "cp #{input} #{output_with_preset(input, preset_name)}"
  else
    "#{imagemagick} #{input} #{preset} #{output_with_preset(input, preset_name)}"
  end
end
imagemagick_run(scr) click to toggle source
# File lib/video_screenshoter/abstract.rb, line 86
def imagemagick_run scr
  if presets
    presets.each do |preset_name, preset|
      cmd = imagemagick_command(scr, preset_name)
      puts cmd if verbose
      system cmd
    end
  end
end
output_fullpath(time, preset = nil) click to toggle source
# File lib/video_screenshoter/abstract.rb, line 56
def output_fullpath time, preset = nil
  res = sprintf(File.join(output_dir, output_file), time)
  res.sub!(File.extname(res), "_#{preset}#{File.extname(res)}") if preset
  res
end
output_with_preset(input, preset_name) click to toggle source
# File lib/video_screenshoter/abstract.rb, line 73
def output_with_preset input, preset_name
  File.join(output_dir, File.basename(input, File.extname(input)) + '_' + preset_name.to_s + File.extname(input))
end
run() click to toggle source
# File lib/video_screenshoter/abstract.rb, line 96
def run
  raise NotImplementedError
end

Protected Instance Methods

input_duration() click to toggle source
# File lib/video_screenshoter/abstract.rb, line 102
def input_duration
  raise NotImplementedError
end