lolcommits 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +3 -3
- data/CHANGELOG.md +18 -7
- data/Gemfile +2 -0
- data/README.md +101 -76
- data/Rakefile +3 -1
- data/bin/console +1 -0
- data/bin/lolcommits +37 -32
- data/config/cucumber.yml +1 -1
- data/features/bugs.feature +2 -2
- data/features/lolcommits.feature +42 -17
- data/features/step_definitions/lolcommits_steps.rb +7 -3
- data/lib/lolcommits/animated_gif.rb +77 -0
- data/lib/lolcommits/backends/git_info.rb +15 -11
- data/lib/lolcommits/backends/installation_git.rb +4 -3
- data/lib/lolcommits/backends/installation_mercurial.rb +1 -1
- data/lib/lolcommits/backends/mercurial_info.rb +13 -9
- data/lib/lolcommits/capturer.rb +14 -6
- data/lib/lolcommits/capturer/capture_cygwin.rb +3 -14
- data/lib/lolcommits/capturer/capture_fake.rb +8 -2
- data/lib/lolcommits/capturer/capture_linux.rb +11 -10
- data/lib/lolcommits/capturer/capture_linux_video.rb +15 -0
- data/lib/lolcommits/capturer/capture_mac.rb +6 -11
- data/lib/lolcommits/capturer/capture_mac_video.rb +23 -0
- data/lib/lolcommits/capturer/capture_windows.rb +14 -9
- data/lib/lolcommits/capturer/capture_windows_video.rb +46 -0
- data/lib/lolcommits/cli/fatals.rb +1 -1
- data/lib/lolcommits/cli/launcher.rb +1 -1
- data/lib/lolcommits/cli/timelapse_gif.rb +28 -12
- data/lib/lolcommits/configuration.rb +4 -26
- data/lib/lolcommits/platform.rb +4 -4
- data/lib/lolcommits/plugin/base.rb +2 -2
- data/lib/lolcommits/plugin/configuration_helper.rb +1 -1
- data/lib/lolcommits/runner.rb +138 -69
- data/lib/lolcommits/version.rb +2 -2
- data/lolcommits.gemspec +4 -2
- data/test/assets/test_image.jpg +0 -0
- data/test/assets/test_video.mp4 +0 -0
- metadata +12 -9
- data/lib/lolcommits/capturer/capture_linux_animated.rb +0 -74
- data/lib/lolcommits/capturer/capture_mac_animated.rb +0 -75
- data/lib/lolcommits/capturer/capture_windows_animated.rb +0 -110
data/config/cucumber.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
---
|
2
|
-
default: <%=
|
2
|
+
default: <%= ENV['TRAVIS'] == 'true' ? '--tags ~@requires_ffmpeg' : 'features' %>
|
data/features/bugs.feature
CHANGED
@@ -21,9 +21,9 @@ Feature: Bug regression testing
|
|
21
21
|
@fake-interactive-rebase @slow_process
|
22
22
|
Scenario: Don't trigger capture during a git rebase
|
23
23
|
Given I am in a git repo named "yuh8history" with lolcommits enabled
|
24
|
-
And I do
|
24
|
+
And I do 2 git commits
|
25
25
|
When I run `git rebase -i HEAD~2`
|
26
|
-
Then there should be exactly
|
26
|
+
Then there should be exactly 2 jpgs in "~/.lolcommits/yuh8history"
|
27
27
|
|
28
28
|
#
|
29
29
|
# issue #87, https://github.com/lolcommits/lolcommits/issues/87
|
data/features/lolcommits.feature
CHANGED
@@ -8,6 +8,11 @@ Feature: Basic UI functionality
|
|
8
8
|
Then the exit status should be 0
|
9
9
|
And the banner should be present
|
10
10
|
|
11
|
+
Scenario: Shows version information
|
12
|
+
When I run `lolcommits --version`
|
13
|
+
Then the output should show the version number
|
14
|
+
And the exit status should be 0
|
15
|
+
|
11
16
|
Scenario: Help should show the animate option on a Mac platform
|
12
17
|
Given I am using a "darwin" platform
|
13
18
|
When I get help for "lolcommits"
|
@@ -75,7 +80,7 @@ Feature: Basic UI functionality
|
|
75
80
|
# Then there should be exactly 1 pid in "~/.lolcommits/forked"
|
76
81
|
# When I wait for the child process to exit in "forked"
|
77
82
|
# Then a directory named "~/.lolcommits/forked" should exist
|
78
|
-
# And a file named "~/.lolcommits/forked/
|
83
|
+
# And a file named "~/.lolcommits/forked/raw_capture.jpg" should not exist
|
79
84
|
# And there should be exactly 1 jpg in "~/.lolcommits/forked"
|
80
85
|
|
81
86
|
Scenario: Commiting in an enabled git repo triggers successful capture
|
@@ -83,7 +88,7 @@ Feature: Basic UI functionality
|
|
83
88
|
When I do a git commit
|
84
89
|
Then the output should contain "*** Preserving this moment in history."
|
85
90
|
And a directory named "~/.lolcommits/myrepo" should exist
|
86
|
-
And a file named "~/.lolcommits/myrepo/
|
91
|
+
And a file named "~/.lolcommits/myrepo/raw_capture.jpg" should not exist
|
87
92
|
And there should be exactly 1 jpg in "~/.lolcommits/myrepo"
|
88
93
|
|
89
94
|
Scenario: Commiting in enabled git repo subdirectory triggers successful capture
|
@@ -124,8 +129,8 @@ Feature: Basic UI functionality
|
|
124
129
|
When I run `lolcommits --test --show-config`
|
125
130
|
Then the output should match /loltext:\s+:enabled: false/
|
126
131
|
|
127
|
-
Scenario: test capture should work regardless of whether in a
|
128
|
-
Given I am in a directory named "
|
132
|
+
Scenario: test capture should work regardless of whether in a vcs repo
|
133
|
+
Given I am in a directory named "not_a_vcs_repo"
|
129
134
|
When I run `lolcommits --test --capture`
|
130
135
|
Then the output should contain "*** Capturing in test mode."
|
131
136
|
And the output should not contain "path does not exist (ArgumentError)"
|
@@ -216,30 +221,50 @@ Feature: Basic UI functionality
|
|
216
221
|
Then the exit status should be 0
|
217
222
|
And there should be exactly 1 jpg in its loldir
|
218
223
|
|
219
|
-
Scenario: generate gif should store in
|
224
|
+
Scenario: generate gif should store in the timelapses directory
|
220
225
|
Given I am in a git repo named "giffy" with lolcommits enabled
|
221
226
|
And a loldir named "giffy" with 2 lolimages
|
222
227
|
When I run `lolcommits --timelapse`
|
223
|
-
Then the output should contain "Generating animated gif."
|
224
|
-
And a directory named "~/.lolcommits/giffy/
|
225
|
-
And
|
228
|
+
Then the output should contain "Generating animated timelapse gif."
|
229
|
+
And a directory named "~/.lolcommits/giffy/timelapses" should exist
|
230
|
+
And there should be exactly 1 gif in "~/.lolcommits/giffy/timelapses"
|
226
231
|
|
227
232
|
Scenario: generate gif with argument 'today'
|
228
233
|
Given I am in a git repo named "sunday" with lolcommits enabled
|
229
234
|
And a loldir named "sunday" with 2 lolimages
|
230
235
|
When I run `lolcommits --timelapse --period today`
|
231
|
-
Then there should be exactly 1 gif in "~/.lolcommits/sunday/
|
236
|
+
Then there should be exactly 1 gif in "~/.lolcommits/sunday/timelapses"
|
232
237
|
|
233
|
-
@
|
234
|
-
Scenario: should generate
|
235
|
-
Given I am in a git repo named "
|
238
|
+
@requires_ffmpeg @slow_process
|
239
|
+
Scenario: should generate a lolcommit animated gif
|
240
|
+
Given I am in a git repo named "gif"
|
236
241
|
And I do a git commit
|
237
242
|
When I run `lolcommits --capture --animate=1`
|
238
243
|
Then the output should contain "*** Preserving this moment in history."
|
239
|
-
And a directory named "~/.lolcommits/
|
240
|
-
And a file named "~/.lolcommits/animate/
|
241
|
-
And
|
242
|
-
|
244
|
+
And a directory named "~/.lolcommits/gif" should exist
|
245
|
+
And a file named "~/.lolcommits/animate/raw_capture.mp4" should not exist
|
246
|
+
And there should be exactly 1 gif in "~/.lolcommits/gif"
|
247
|
+
|
248
|
+
@requires_ffmpeg @slow_process
|
249
|
+
Scenario: should generate a lolcommit video
|
250
|
+
Given I am in a git repo named "video"
|
251
|
+
And I do a git commit
|
252
|
+
When I run `lolcommits --capture --video=1`
|
253
|
+
Then the output should contain "*** Preserving this moment in history."
|
254
|
+
And a directory named "~/.lolcommits/video" should exist
|
255
|
+
And a file named "~/.lolcommits/animate/raw_capture.mp4" should not exist
|
256
|
+
And there should be exactly 1 mp4 in "~/.lolcommits/video"
|
257
|
+
|
258
|
+
@requires_ffmpeg @slow_process
|
259
|
+
Scenario: should generate a lolcommit video and animated gif
|
260
|
+
Given I am in a git repo named "video-and-gif"
|
261
|
+
And I do a git commit
|
262
|
+
When I run `lolcommits --capture -v1 -a1`
|
263
|
+
Then the output should contain "*** Preserving this moment in history."
|
264
|
+
And a directory named "~/.lolcommits/video-and-gif" should exist
|
265
|
+
And a file named "~/.lolcommits/animate/raw_capture.mp4" should not exist
|
266
|
+
And there should be exactly 1 mp4 in "~/.lolcommits/video-and-gif"
|
267
|
+
And there should be exactly 1 gif in "~/.lolcommits/video-and-gif"
|
243
268
|
|
244
269
|
@fake-no-ffmpeg
|
245
270
|
Scenario: gracefully fail when ffmpeg not installed and --animate is used
|
@@ -292,7 +317,7 @@ Feature: Basic UI functionality
|
|
292
317
|
When I do a mercurial commit
|
293
318
|
Then the output should contain "*** Preserving this moment in history."
|
294
319
|
And a directory named "~/.lolcommits/myrepo" should exist
|
295
|
-
And a file named "~/.lolcommits/myrepo/
|
320
|
+
And a file named "~/.lolcommits/myrepo/raw_capture.jpg" should not exist
|
296
321
|
And there should be exactly 1 jpg in "~/.lolcommits/myrepo"
|
297
322
|
|
298
323
|
Scenario: Commiting in enabled mercurial repo subdirectory triggers successful capture
|
@@ -147,17 +147,17 @@ Given(/^a loldir named "(.*?)" with (\d+) lolimages$/) do |repo, num_images|
|
|
147
147
|
FileUtils.mkdir_p loldir
|
148
148
|
num_images.to_i.times do
|
149
149
|
hex = format('%011x', (rand * 0xfffffffffff)).to_s
|
150
|
-
FileUtils.cp 'test/
|
150
|
+
FileUtils.cp 'test/assets/test_image.jpg', File.join(loldir, "#{hex}.jpg")
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
154
|
-
Then(/^there should be exactly (.*?) (jpg|gif|pid)s? in its loldir$/) do |n, type|
|
154
|
+
Then(/^there should be exactly (.*?) (mp4|jpg|gif|pid)s? in its loldir$/) do |n, type|
|
155
155
|
steps %(
|
156
156
|
Then there should be exactly #{n} #{type} in "#{default_loldir}"
|
157
157
|
)
|
158
158
|
end
|
159
159
|
|
160
|
-
Then(/^there should be exactly (.*?) (jpg|gif|pid)s? in "(.*?)"$/) do |n, type, folder|
|
160
|
+
Then(/^there should be exactly (.*?) (mp4|jpg|gif|pid)s? in "(.*?)"$/) do |n, type, folder|
|
161
161
|
expect(Dir[expand_path("#{folder}/*.#{type}")].count).to eq(n.to_i)
|
162
162
|
end
|
163
163
|
|
@@ -166,6 +166,10 @@ Then(/^the output should contain a list of plugins$/) do
|
|
166
166
|
step %(the output should contain "[*] loltext")
|
167
167
|
end
|
168
168
|
|
169
|
+
Then(/^the output should show the version number$/) do
|
170
|
+
step %(the output should match /^#{Lolcommits::VERSION}$/)
|
171
|
+
end
|
172
|
+
|
169
173
|
When(/^I do a git commit with commit message "(.*?)"$/) do |commit_msg|
|
170
174
|
filename = FFaker::Lorem.words(1).first
|
171
175
|
steps %(
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lolcommits
|
4
|
+
class AnimatedGif
|
5
|
+
def create(video_path:, output_path:)
|
6
|
+
unless File.exist?(video_path)
|
7
|
+
debug "**warning** unable to create animated gif, no video at #{video_path}"
|
8
|
+
return
|
9
|
+
end
|
10
|
+
|
11
|
+
debug "creating animated gif at #{output_path}"
|
12
|
+
system_call "ffmpeg -nostats -v quiet -i \"#{video_path}\" \"#{frames_dir}/%09d.png\" > #{null_string}"
|
13
|
+
|
14
|
+
# use fps to set delay and number of frames to skip (for lower filesized gifs)
|
15
|
+
fps = video_fps(video_path)
|
16
|
+
skip = frame_skip(fps)
|
17
|
+
delay = frame_delay(fps, skip)
|
18
|
+
debug "animated gif choosing every #{skip} frames with a frame delay of #{delay} (video fps: #{fps})"
|
19
|
+
|
20
|
+
# create the looping animated gif from frames (delete frame files except every #{skip} frame)
|
21
|
+
Dir["#{frames_dir}/*.png"].each do |frame_filename|
|
22
|
+
basename = File.basename(frame_filename)
|
23
|
+
frame_number = basename.split('.').first.to_i
|
24
|
+
File.delete(frame_filename) if frame_number % skip != 0
|
25
|
+
end
|
26
|
+
|
27
|
+
# convert to animated gif with delay and gif optimisation
|
28
|
+
system_call "convert -layers OptimizeTransparency -delay #{delay} -loop 0 \"#{frames_dir}/*.png\" -coalesce \"#{output_path}\""
|
29
|
+
|
30
|
+
# remove tmp frames dir
|
31
|
+
FileUtils.rm_rf(frames_dir)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def frames_dir
|
37
|
+
@frames_dir ||= Dir.mktmpdir
|
38
|
+
end
|
39
|
+
|
40
|
+
def null_string
|
41
|
+
Lolcommits::Platform.platform_windows? ? 'nul' : '/dev/null'
|
42
|
+
end
|
43
|
+
|
44
|
+
def frame_delay(fps, skip)
|
45
|
+
# calculate frame delay
|
46
|
+
delay = ((100.0 * skip) / fps.to_f).to_i
|
47
|
+
delay < 6 ? 6 : delay # hard limit for IE browsers
|
48
|
+
end
|
49
|
+
|
50
|
+
def video_fps(file)
|
51
|
+
# inspect fps of the captured video file (default to 29.97)
|
52
|
+
fps = system_call("ffmpeg -nostats -v quiet -i \"#{file}\" 2>&1 | sed -n \"s/.*, \\(.*\\) fp.*/\\1/p\"", true)
|
53
|
+
fps.to_i < 1 ? 29.97 : fps.to_f
|
54
|
+
end
|
55
|
+
|
56
|
+
def frame_skip(fps)
|
57
|
+
# of frames to skip depends on video fps
|
58
|
+
case fps
|
59
|
+
when 0..15
|
60
|
+
2
|
61
|
+
when 16..28
|
62
|
+
3
|
63
|
+
else
|
64
|
+
4
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def system_call(call_str, capture_output = false)
|
69
|
+
debug "making system call for \n #{call_str}"
|
70
|
+
capture_output ? `#{call_str}` : system(call_str)
|
71
|
+
end
|
72
|
+
|
73
|
+
def debug(message)
|
74
|
+
super("#{self.class}: #{message}")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -13,15 +13,15 @@ module Lolcommits
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def initialize
|
16
|
-
debug '
|
17
|
-
debug "
|
18
|
-
debug "
|
19
|
-
debug "
|
20
|
-
debug "
|
21
|
-
debug "
|
22
|
-
debug "
|
23
|
-
debug "
|
24
|
-
debug "
|
16
|
+
debug 'parsed the following values from commit:'
|
17
|
+
debug "\t#{message}"
|
18
|
+
debug "\t#{sha}"
|
19
|
+
debug "\t#{repo_internal_path}"
|
20
|
+
debug "\t#{repo}"
|
21
|
+
debug "\t#{branch}"
|
22
|
+
debug "\t#{commit_date}"
|
23
|
+
debug "\t#{author_name}" if author_name
|
24
|
+
debug "\t#{author_email}" if author_email
|
25
25
|
end
|
26
26
|
|
27
27
|
def branch
|
@@ -44,7 +44,7 @@ module Lolcommits
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def url
|
47
|
-
@url ||= remote_repo? ? remote_https_url(repository.remote
|
47
|
+
@url ||= remote_repo? ? remote_https_url(repository.remote&.url) : nil
|
48
48
|
end
|
49
49
|
|
50
50
|
def repo
|
@@ -73,6 +73,10 @@ module Lolcommits
|
|
73
73
|
|
74
74
|
private
|
75
75
|
|
76
|
+
def debug(message)
|
77
|
+
super("#{self.class}: #{message}")
|
78
|
+
end
|
79
|
+
|
76
80
|
def remote_https_url(url)
|
77
81
|
url.tr(':', '/').gsub(/^git@/, 'https://').gsub(/\.git$/, '') + '/commit/'
|
78
82
|
end
|
@@ -86,7 +90,7 @@ module Lolcommits
|
|
86
90
|
end
|
87
91
|
|
88
92
|
def remote_repo?
|
89
|
-
repository.remote
|
93
|
+
!repository.remote&.url.nil?
|
90
94
|
end
|
91
95
|
end
|
92
96
|
end
|
@@ -70,9 +70,10 @@ module Lolcommits
|
|
70
70
|
end
|
71
71
|
|
72
72
|
<<-HOOK
|
73
|
-
|
74
|
-
|
75
|
-
|
73
|
+
|
74
|
+
### lolcommits hook (begin) ###
|
75
|
+
#{exports} && #{capture_cmd}
|
76
|
+
### lolcommits hook (end) ###
|
76
77
|
HOOK
|
77
78
|
end
|
78
79
|
|
@@ -20,15 +20,15 @@ module Lolcommits
|
|
20
20
|
Mercurial.configure do |conf|
|
21
21
|
conf.hg_binary_path = 'hg'
|
22
22
|
end
|
23
|
-
debug '
|
24
|
-
debug "
|
25
|
-
debug "
|
26
|
-
debug "
|
27
|
-
debug "
|
28
|
-
debug "
|
29
|
-
debug "
|
30
|
-
debug "
|
31
|
-
debug "
|
23
|
+
debug 'parsed the following values from commit:'
|
24
|
+
debug "\t#{message}"
|
25
|
+
debug "\t#{sha}"
|
26
|
+
debug "\t#{repo_internal_path}"
|
27
|
+
debug "\t#{repo}"
|
28
|
+
debug "\t#{branch}"
|
29
|
+
debug "\t#{commit_date}"
|
30
|
+
debug "\t#{author_name}" if author_name
|
31
|
+
debug "\t#{author_email}" if author_email
|
32
32
|
end
|
33
33
|
|
34
34
|
def branch
|
@@ -72,6 +72,10 @@ module Lolcommits
|
|
72
72
|
|
73
73
|
private
|
74
74
|
|
75
|
+
def debug(message)
|
76
|
+
super("#{self.class}: #{message}")
|
77
|
+
end
|
78
|
+
|
75
79
|
def repository(path = '.')
|
76
80
|
@repository ||= Mercurial::Repository.open(path)
|
77
81
|
end
|
data/lib/lolcommits/capturer.rb
CHANGED
@@ -2,23 +2,31 @@
|
|
2
2
|
|
3
3
|
module Lolcommits
|
4
4
|
class Capturer
|
5
|
-
attr_accessor :capture_device, :capture_delay, :
|
6
|
-
:
|
5
|
+
attr_accessor :capture_device, :capture_delay, :capture_duration,
|
6
|
+
:capture_path
|
7
7
|
|
8
8
|
def initialize(attributes = {})
|
9
9
|
attributes.each do |attr, val|
|
10
10
|
send("#{attr}=", val)
|
11
11
|
end
|
12
|
-
|
12
|
+
end
|
13
|
+
|
14
|
+
def system_call(call_str, capture_output = false)
|
15
|
+
debug "making system call for \n #{call_str}"
|
16
|
+
capture_output ? `#{call_str}` : system(call_str)
|
17
|
+
end
|
18
|
+
|
19
|
+
def debug(message)
|
20
|
+
super("#{self.class}: #{message}")
|
13
21
|
end
|
14
22
|
end
|
15
23
|
end
|
16
24
|
|
17
25
|
require 'lolcommits/capturer/capture_mac'
|
18
|
-
require 'lolcommits/capturer/
|
26
|
+
require 'lolcommits/capturer/capture_mac_video'
|
19
27
|
require 'lolcommits/capturer/capture_linux'
|
20
|
-
require 'lolcommits/capturer/
|
28
|
+
require 'lolcommits/capturer/capture_linux_video'
|
21
29
|
require 'lolcommits/capturer/capture_windows'
|
22
|
-
require 'lolcommits/capturer/
|
30
|
+
require 'lolcommits/capturer/capture_windows_video'
|
23
31
|
require 'lolcommits/capturer/capture_cygwin'
|
24
32
|
require 'lolcommits/capturer/capture_fake'
|
@@ -1,23 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Lolcommits
|
4
|
-
class CaptureCygwin <
|
4
|
+
class CaptureCygwin < CaptureWindows
|
5
5
|
def capture
|
6
|
-
|
7
|
-
delaycmd = ' /delay 3000'
|
8
|
-
if capture_delay > 0
|
9
|
-
# CommandCam delay is in milliseconds
|
10
|
-
delaycmd = " /delay #{capture_delay * 1000}"
|
11
|
-
end
|
6
|
+
_stdin, stdout, _stderr = Open3.popen3("#{executable_path} /filename `cygpath -w #{capture_path}`#{delay_arg}")
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
# looks like we still need to read the output for something to happen
|
8
|
+
# need to read the output for something to happen
|
16
9
|
stdout.read
|
17
10
|
end
|
18
|
-
|
19
|
-
def executable_path
|
20
|
-
File.join(Configuration::LOLCOMMITS_ROOT, 'vendor', 'ext', 'CommandCam', 'CommandCam.exe')
|
21
|
-
end
|
22
11
|
end
|
23
12
|
end
|
@@ -3,8 +3,14 @@
|
|
3
3
|
module Lolcommits
|
4
4
|
class CaptureFake < Capturer
|
5
5
|
def capture
|
6
|
-
|
7
|
-
|
6
|
+
FileUtils.cp(test_file, capture_path)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def test_file
|
12
|
+
filename = capture_duration.zero? ? 'test_image.jpg' : 'test_video.mp4'
|
13
|
+
File.join(Configuration::LOLCOMMITS_ROOT, 'test', 'assets', filename)
|
8
14
|
end
|
9
15
|
end
|
10
16
|
end
|
@@ -4,12 +4,7 @@ module Lolcommits
|
|
4
4
|
class CaptureLinux < Capturer
|
5
5
|
MPLAYER_FPS = 25
|
6
6
|
|
7
|
-
def capture_device_string
|
8
|
-
@capture_device.nil? ? nil : "-tv device=\"#{@capture_device}\""
|
9
|
-
end
|
10
|
-
|
11
7
|
def capture
|
12
|
-
debug 'LinuxCapturer: making tmp directory'
|
13
8
|
tmpdir = Dir.mktmpdir
|
14
9
|
|
15
10
|
# Default delay is 1s
|
@@ -20,13 +15,13 @@ module Lolcommits
|
|
20
15
|
# multiply the set value (in seconds) by 25
|
21
16
|
frames = delay.to_i * MPLAYER_FPS
|
22
17
|
|
23
|
-
debug '
|
18
|
+
debug 'calling out to mplayer to capture image'
|
24
19
|
# mplayer's output is ugly and useless, let's throw it away
|
25
20
|
_stdin, stdout, _stderr = Open3.popen3("mplayer -vo jpeg:outdir=#{tmpdir} #{capture_device_string} -frames #{frames} -fps #{MPLAYER_FPS} tv://")
|
26
21
|
# looks like we still need to read the output for something to happen
|
27
22
|
stdout.read
|
28
23
|
|
29
|
-
debug '
|
24
|
+
debug 'calling out to mplayer to capture image'
|
30
25
|
|
31
26
|
# get last frame from tmpdir (regardless of fps)
|
32
27
|
all_frames = Dir.glob("#{tmpdir}/*.jpg").sort_by do |f|
|
@@ -34,13 +29,19 @@ module Lolcommits
|
|
34
29
|
end
|
35
30
|
|
36
31
|
if all_frames.empty?
|
37
|
-
debug '
|
32
|
+
debug 'failed to capture any image'
|
38
33
|
else
|
39
|
-
FileUtils.mv(all_frames.last,
|
40
|
-
debug '
|
34
|
+
FileUtils.mv(all_frames.last, capture_path)
|
35
|
+
debug 'cleaning up'
|
41
36
|
end
|
42
37
|
|
43
38
|
FileUtils.rm_rf(tmpdir)
|
44
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def capture_device_string
|
44
|
+
"-tv device=\"#{capture_device || Dir.glob('/dev/video*').first}\""
|
45
|
+
end
|
45
46
|
end
|
46
47
|
end
|