screen-recorder 1.1.0 → 1.5.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 +4 -4
- data/.github/ISSUE_TEMPLATE.md +2 -0
- data/.github/workflows/tests.yml +97 -0
- data/.rspec +1 -1
- data/.rubocop.yml +83 -32
- data/{CHANGES.md → CHANGELOG.md} +37 -1
- data/Gemfile +3 -3
- data/README.md +281 -219
- data/Rakefile +10 -10
- data/bin/console +14 -14
- data/lib/screen-recorder.rb +34 -6
- data/lib/screen-recorder/common.rb +113 -56
- data/lib/screen-recorder/desktop.rb +5 -5
- data/lib/screen-recorder/errors.rb +10 -2
- data/lib/screen-recorder/options.rb +77 -59
- data/lib/screen-recorder/titles.rb +8 -41
- data/lib/screen-recorder/type_checker.rb +2 -0
- data/lib/screen-recorder/version.rb +1 -1
- data/lib/screen-recorder/window.rb +45 -9
- data/screen-recorder.gemspec +16 -12
- metadata +57 -23
- data/.travis.yml +0 -35
@@ -1,50 +1,17 @@
|
|
1
1
|
module ScreenRecorder
|
2
2
|
# @since 1.0.0-beta4
|
3
3
|
module Titles
|
4
|
-
# Regex to filter out "Window Title: N/A" from Chrome extensions and "Window Title: ".
|
5
|
-
# This is done to remove unusable titles and to match the Ffmpeg expected input format
|
6
|
-
# for capturing specific windows.
|
7
|
-
# For example, "Window Title: Google - Mozilla Firefox" becomes "Google - Mozilla Firefox".
|
8
|
-
FILTERED_TITLES = %r{^Window Title:( N/A|\s+)?}.freeze
|
9
|
-
|
10
4
|
#
|
11
|
-
# Returns a list of available window titles for the given
|
5
|
+
# Returns a list of available window titles for the given process (application) name.
|
12
6
|
#
|
7
|
+
# @return [Array]
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# ScreenRecorder::Titles.fetch('chrome')
|
11
|
+
# #=> ["New Tab - Google Chrome"]
|
13
12
|
def self.fetch(application)
|
14
|
-
|
15
|
-
|
13
|
+
# @todo Remove Titles.fetch in v2.0
|
14
|
+
Window.fetch_title application
|
16
15
|
end
|
17
|
-
|
18
|
-
# @since 1.0.0-beta4
|
19
|
-
class WindowGrabber
|
20
|
-
#
|
21
|
-
# Returns a list of available window titles for the given application (process) name.
|
22
|
-
#
|
23
|
-
def available_windows_for(application)
|
24
|
-
raise NotImplementedError, 'Only Microsoft Windows (gdigrab) supports window capture.' unless OS.windows?
|
25
|
-
|
26
|
-
titles = `tasklist /v /fi "imagename eq #{application}.exe" /fo list | findstr Window`
|
27
|
-
.split("\n")
|
28
|
-
.map { |i| i.gsub(FILTERED_TITLES, '') }
|
29
|
-
.reject(&:empty?)
|
30
|
-
raise Errors::ApplicationNotFound, "No open windows found for: #{application}.exe" if titles.empty?
|
31
|
-
|
32
|
-
warn_on_mismatch(titles, application)
|
33
|
-
titles
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
#
|
39
|
-
# Prints a warning if the retrieved list of window titles does no include
|
40
|
-
# the given application process name, which applications commonly do.
|
41
|
-
#
|
42
|
-
def warn_on_mismatch(titles, application)
|
43
|
-
return if titles.map(&:downcase).join(',').include? application.to_s
|
44
|
-
|
45
|
-
ScreenRecorder.logger.warn "Process name and window title(s) do not match: #{titles}"
|
46
|
-
ScreenRecorder.logger.warn 'Please manually provide the displayed window title.'
|
47
|
-
end
|
48
|
-
end # class WindowGrabber
|
49
16
|
end # module Windows
|
50
17
|
end # module FFMPEG
|
@@ -3,21 +3,57 @@ module ScreenRecorder
|
|
3
3
|
# @since 1.0.0-beta11
|
4
4
|
class Window < Common
|
5
5
|
#
|
6
|
-
# Window recording
|
6
|
+
# Window recording mode.
|
7
7
|
#
|
8
8
|
def initialize(title:, output:, advanced: {})
|
9
|
-
raise
|
9
|
+
raise 'Window recording is only supported on Microsoft Windows.' unless OS.windows?
|
10
10
|
|
11
|
-
super(input:
|
11
|
+
super(input: %("title=#{title}"), output: output, advanced: advanced)
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
class << self
|
15
|
+
#
|
16
|
+
# Returns a list of available window titles for the given process (application) name.
|
17
|
+
#
|
18
|
+
# @return [Array]
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
# ScreenRecorder::Window.fetch_title('chrome')
|
22
|
+
# #=> ["New Tab - Google Chrome"]
|
23
|
+
def fetch_title(process_name)
|
24
|
+
ScreenRecorder.logger.debug "Retrieving window title from '#{process_name}'"
|
25
|
+
window_title_for process_name
|
26
|
+
end
|
15
27
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
28
|
+
private
|
29
|
+
|
30
|
+
# Regex to filter out "Window Title: N/A" from Chrome extensions and "Window Title: ".
|
31
|
+
# This is done to remove unusable titles and to match the Ffmpeg expected input format
|
32
|
+
# for capturing specific windows.
|
33
|
+
# For example, "Window Title: Google - Mozilla Firefox" becomes "Google - Mozilla Firefox".
|
34
|
+
FILTERED_TITLES = %r{^Window Title:( N/A|\s+)?}.freeze
|
35
|
+
|
36
|
+
def window_title_for(process_name)
|
37
|
+
raise NotImplementedError, 'Only Microsoft Windows (gdigrab) supports window capture.' unless OS.windows?
|
38
|
+
|
39
|
+
titles = `tasklist /v /fi "imagename eq #{process_name}.exe" /fo list | findstr Window`
|
40
|
+
.split("\n")
|
41
|
+
.map { |i| i.gsub(FILTERED_TITLES, '') }
|
42
|
+
.reject(&:empty?)
|
43
|
+
raise Errors::ApplicationNotFound, "No open windows found for: #{process_name}.exe" if titles.empty?
|
44
|
+
|
45
|
+
warn_on_mismatch(titles, process_name)
|
46
|
+
ScreenRecorder.logger.debug "Retrieved titles: #{titles}"
|
47
|
+
|
48
|
+
titles
|
49
|
+
end
|
50
|
+
|
51
|
+
def warn_on_mismatch(titles, process_name)
|
52
|
+
return if titles.map(&:downcase).join(',').include? process_name.to_s
|
53
|
+
|
54
|
+
ScreenRecorder.logger.warn "Process name and window title(s) do not match: #{titles}"
|
55
|
+
ScreenRecorder.logger.warn 'Please manually provide the displayed window title.'
|
56
|
+
end
|
21
57
|
end
|
22
58
|
end
|
23
59
|
end
|
data/screen-recorder.gemspec
CHANGED
@@ -9,13 +9,15 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['Lakshya Kapoor']
|
10
10
|
spec.email = ['kapoorlakshya@gmail.com']
|
11
11
|
spec.homepage = 'http://github.com/kapoorlakshya/screen-recorder'
|
12
|
-
spec.summary = 'Video record your computer screen using FFmpeg
|
13
|
-
spec.description = '
|
12
|
+
spec.summary = 'Video record and take screenshots your computer screen using FFmpeg.'
|
13
|
+
spec.description = 'A Ruby gem to video record and take screenshots of your desktop or ' \
|
14
|
+
' specific application window. Works on Windows, Linux, and macOS.'
|
14
15
|
spec.license = 'MIT'
|
15
|
-
# noinspection RubyStringKeysInHashInspection
|
16
|
+
# noinspection RubyStringKeysInHashInspection
|
16
17
|
spec.metadata = {
|
17
|
-
'changelog_uri' => 'https://github.com/kapoorlakshya/screen-recorder/blob/master/
|
18
|
-
'source_code_uri' =>
|
18
|
+
'changelog_uri' => 'https://github.com/kapoorlakshya/screen-recorder/blob/master/CHANGELOG.md',
|
19
|
+
'source_code_uri' => "https://github.com/kapoorlakshya/screen-recorder/tree/v#{ScreenRecorder::VERSION}",
|
20
|
+
'documentation_uri' => "https://www.rubydoc.info/gems/screen-recorder/#{ScreenRecorder::VERSION}",
|
19
21
|
'bug_tracker_uri' => 'https://github.com/kapoorlakshya/screen-recorder/issues',
|
20
22
|
'wiki_uri' => 'https://github.com/kapoorlakshya/screen-recorder/wiki'
|
21
23
|
}
|
@@ -26,15 +28,17 @@ Gem::Specification.new do |spec|
|
|
26
28
|
|
27
29
|
spec.require_paths = ['lib']
|
28
30
|
|
29
|
-
spec.add_development_dependency '
|
31
|
+
spec.add_development_dependency 'ffi' # For selenium-webdriver on Windows
|
32
|
+
spec.add_development_dependency 'rake', '>= 12.0'
|
30
33
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
31
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
32
|
-
spec.add_development_dependency 'rubocop-performance', '~> 1.
|
33
|
-
spec.add_development_dependency 'rubocop-rspec', '~> 1.
|
34
|
+
spec.add_development_dependency 'rubocop', '~> 0.75'
|
35
|
+
spec.add_development_dependency 'rubocop-performance', '~> 1.0'
|
36
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.0'
|
34
37
|
spec.add_development_dependency 'simplecov', '~> 0.16'
|
35
38
|
spec.add_development_dependency 'watir', '~> 6.0'
|
36
|
-
spec.add_development_dependency 'webdrivers', '~>
|
39
|
+
spec.add_development_dependency 'webdrivers', '~> 4.0'
|
37
40
|
|
38
|
-
spec.add_runtime_dependency '
|
41
|
+
spec.add_runtime_dependency 'childprocess', '>= 1.0', '< 4.0' # Roughly match Selenium
|
42
|
+
spec.add_runtime_dependency 'os', '~> 1.0'
|
39
43
|
spec.add_runtime_dependency 'streamio-ffmpeg', '~> 3.0'
|
40
|
-
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,27 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: screen-recorder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lakshya Kapoor
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ffi
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rake
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- - "
|
31
|
+
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
33
|
version: '12.0'
|
20
34
|
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
|
-
- - "
|
38
|
+
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '12.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
@@ -44,42 +58,42 @@ dependencies:
|
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
61
|
+
version: '0.75'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
68
|
+
version: '0.75'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rubocop-performance
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.
|
75
|
+
version: '1.0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.
|
82
|
+
version: '1.0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rubocop-rspec
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '1.
|
89
|
+
version: '1.0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '1.
|
96
|
+
version: '1.0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: simplecov
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,28 +128,48 @@ dependencies:
|
|
114
128
|
requirements:
|
115
129
|
- - "~>"
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
131
|
+
version: '4.0'
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
138
|
+
version: '4.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: childprocess
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '1.0'
|
146
|
+
- - "<"
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '4.0'
|
149
|
+
type: :runtime
|
150
|
+
prerelease: false
|
151
|
+
version_requirements: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - ">="
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '1.0'
|
156
|
+
- - "<"
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '4.0'
|
125
159
|
- !ruby/object:Gem::Dependency
|
126
160
|
name: os
|
127
161
|
requirement: !ruby/object:Gem::Requirement
|
128
162
|
requirements:
|
129
163
|
- - "~>"
|
130
164
|
- !ruby/object:Gem::Version
|
131
|
-
version: 1.0
|
165
|
+
version: '1.0'
|
132
166
|
type: :runtime
|
133
167
|
prerelease: false
|
134
168
|
version_requirements: !ruby/object:Gem::Requirement
|
135
169
|
requirements:
|
136
170
|
- - "~>"
|
137
171
|
- !ruby/object:Gem::Version
|
138
|
-
version: 1.0
|
172
|
+
version: '1.0'
|
139
173
|
- !ruby/object:Gem::Dependency
|
140
174
|
name: streamio-ffmpeg
|
141
175
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,8 +184,8 @@ dependencies:
|
|
150
184
|
- - "~>"
|
151
185
|
- !ruby/object:Gem::Version
|
152
186
|
version: '3.0'
|
153
|
-
description:
|
154
|
-
|
187
|
+
description: A Ruby gem to video record and take screenshots of your desktop or specific
|
188
|
+
application window. Works on Windows, Linux, and macOS.
|
155
189
|
email:
|
156
190
|
- kapoorlakshya@gmail.com
|
157
191
|
executables: []
|
@@ -159,11 +193,11 @@ extensions: []
|
|
159
193
|
extra_rdoc_files: []
|
160
194
|
files:
|
161
195
|
- ".github/ISSUE_TEMPLATE.md"
|
196
|
+
- ".github/workflows/tests.yml"
|
162
197
|
- ".gitignore"
|
163
198
|
- ".rspec"
|
164
199
|
- ".rubocop.yml"
|
165
|
-
-
|
166
|
-
- CHANGES.md
|
200
|
+
- CHANGELOG.md
|
167
201
|
- Gemfile
|
168
202
|
- LICENSE.txt
|
169
203
|
- README.md
|
@@ -184,8 +218,9 @@ homepage: http://github.com/kapoorlakshya/screen-recorder
|
|
184
218
|
licenses:
|
185
219
|
- MIT
|
186
220
|
metadata:
|
187
|
-
changelog_uri: https://github.com/kapoorlakshya/screen-recorder/blob/master/
|
188
|
-
source_code_uri: https://github.com/kapoorlakshya/screen-recorder/
|
221
|
+
changelog_uri: https://github.com/kapoorlakshya/screen-recorder/blob/master/CHANGELOG.md
|
222
|
+
source_code_uri: https://github.com/kapoorlakshya/screen-recorder/tree/v1.5.0
|
223
|
+
documentation_uri: https://www.rubydoc.info/gems/screen-recorder/1.5.0
|
189
224
|
bug_tracker_uri: https://github.com/kapoorlakshya/screen-recorder/issues
|
190
225
|
wiki_uri: https://github.com/kapoorlakshya/screen-recorder/wiki
|
191
226
|
post_install_message:
|
@@ -203,9 +238,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
238
|
- !ruby/object:Gem::Version
|
204
239
|
version: '0'
|
205
240
|
requirements: []
|
206
|
-
|
207
|
-
rubygems_version: 2.7.6
|
241
|
+
rubygems_version: 3.1.4
|
208
242
|
signing_key:
|
209
243
|
specification_version: 4
|
210
|
-
summary: Video record your computer screen using FFmpeg
|
244
|
+
summary: Video record and take screenshots your computer screen using FFmpeg.
|
211
245
|
test_files: []
|
data/.travis.yml
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
---
|
2
|
-
os:
|
3
|
-
- linux
|
4
|
-
- osx
|
5
|
-
dist: xenial
|
6
|
-
language: ruby
|
7
|
-
cache: bundler
|
8
|
-
|
9
|
-
branches:
|
10
|
-
only:
|
11
|
-
- /.*/
|
12
|
-
|
13
|
-
rvm:
|
14
|
-
- 2.3.8
|
15
|
-
- 2.4.5
|
16
|
-
- 2.5.5
|
17
|
-
- 2.6.2
|
18
|
-
|
19
|
-
env:
|
20
|
-
- DISPLAY=":0"
|
21
|
-
|
22
|
-
addons:
|
23
|
-
firefox: latest
|
24
|
-
apt:
|
25
|
-
packages:
|
26
|
-
- ffmpeg
|
27
|
-
homebrew:
|
28
|
-
packages:
|
29
|
-
- ffmpeg
|
30
|
-
|
31
|
-
before_install:
|
32
|
-
- gem update --system --no-document
|
33
|
-
|
34
|
-
before_script:
|
35
|
-
- nohup Xvfb :0 -screen 0 1024x768x24 &
|