Class: Lolcommits::CaptureLinux

Inherits:
Capturer
  • Object
show all
Defined in:
lib/lolcommits/capturer/capture_linux.rb

Constant Summary collapse

MPLAYER_FPS =
25

Instance Attribute Summary

Attributes inherited from Capturer

#capture_delay, #capture_device, #capture_duration, #capture_path

Instance Method Summary collapse

Methods inherited from Capturer

#debug, #initialize, #system_call

Constructor Details

This class inherits a constructor from Lolcommits::Capturer

Instance Method Details

#captureObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/lolcommits/capturer/capture_linux.rb', line 7

def capture
  tmpdir = Dir.mktmpdir

  # Default delay is 1s
  delay = capture_delay.zero? ? 1 : capture_delay

  # There's no way to give a capture delay in mplayer, but a number of frame
  # mplayer's "delay" is actually a number of frames at 25 fps
  # multiply the set value (in seconds) by 25
  frames = delay.to_i * MPLAYER_FPS

  debug 'calling out to mplayer to capture image'
  # mplayer's output is ugly and useless, let's throw it away
  _stdin, stdout, _stderr = Open3.popen3("mplayer -vo jpeg:outdir=#{tmpdir} #{capture_device_string} -frames #{frames} -fps #{MPLAYER_FPS} tv://")
  # looks like we still need to read the output for something to happen
  stdout.read

  debug 'calling out to mplayer to capture image'

  # get last frame from tmpdir (regardless of fps)
  all_frames = Dir.glob("#{tmpdir}/*.jpg").sort_by do |f|
    File.mtime(f)
  end

  if all_frames.empty?
    debug 'failed to capture any image'
  else
    FileUtils.mv(all_frames.last, capture_path)
    debug 'cleaning up'
  end

  FileUtils.rm_rf(tmpdir)
end