lolcommits 0.13.1 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|