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.
@@ -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 application (process) name.
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
- ScreenRecorder.logger.debug "Retrieving available windows for: #{application}"
15
- WindowGrabber.new.available_windows_for application
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
@@ -1,5 +1,7 @@
1
1
  module ScreenRecorder
2
2
  # @since 1.0.0.beta10
3
+ #
4
+ # @api private
3
5
  module TypeChecker
4
6
  #
5
7
  # Compares the given object's type (class) to the desired object type.
@@ -1,3 +1,3 @@
1
1
  module ScreenRecorder
2
- VERSION = '1.1.0'.freeze
2
+ VERSION = '1.5.0'.freeze
3
3
  end
@@ -3,21 +3,57 @@ module ScreenRecorder
3
3
  # @since 1.0.0-beta11
4
4
  class Window < Common
5
5
  #
6
- # Window recording specific initializer.
6
+ # Window recording mode.
7
7
  #
8
8
  def initialize(title:, output:, advanced: {})
9
- raise NotImplementedError, 'Window recording is only supported on Microsoft Windows.' unless OS.windows?
9
+ raise 'Window recording is only supported on Microsoft Windows.' unless OS.windows?
10
10
 
11
- super(input: format_input(title), output: output, advanced: advanced)
11
+ super(input: %("title=#{title}"), output: output, advanced: advanced)
12
12
  end
13
13
 
14
- private
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
- # Sets input syntax specific to the FFmpeg window recorder.
18
- #
19
- def format_input(title)
20
- %("title=#{title}")
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
@@ -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 via Ruby.'
13
- spec.description = 'Video record your computer screen - desktop or specific window - using FFmpeg via Ruby on Windows, Linux, and macOS.'
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,RubyStringKeysInHashInspection,RubyStringKeysInHashInspection
16
+ # noinspection RubyStringKeysInHashInspection
16
17
  spec.metadata = {
17
- 'changelog_uri' => 'https://github.com/kapoorlakshya/screen-recorder/blob/master/CHANGES.md',
18
- 'source_code_uri' => 'https://github.com/kapoorlakshya/screen-recorder/',
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 'rake', '~> 12.0'
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.59'
32
- spec.add_development_dependency 'rubocop-performance', '~> 1.1.0'
33
- spec.add_development_dependency 'rubocop-rspec', '~> 1.32'
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', '~> 3.0'
39
+ spec.add_development_dependency 'webdrivers', '~> 4.0'
37
40
 
38
- spec.add_runtime_dependency 'os', '~> 1.0.0'
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.1.0
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: 2019-04-14 00:00:00.000000000 Z
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.59'
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.59'
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.1.0
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.1.0
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.32'
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.32'
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: '3.0'
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: '3.0'
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.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.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: Video record your computer screen - desktop or specific window - using
154
- FFmpeg via Ruby on Windows, Linux, and macOS.
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
- - ".travis.yml"
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/CHANGES.md
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
- rubyforge_project:
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 via Ruby.
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 &