vncrec 1.0.1
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 +7 -0
- data/.gitignore +16 -0
- data/.rspec +4 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +36 -0
- data/Rakefile +8 -0
- data/bin/vncrec +80 -0
- data/examples/exit.rb +8 -0
- data/examples/mp4.rb +10 -0
- data/examples/mp4audio.rb +11 -0
- data/ext/enchex_c/ReadRect.c +215 -0
- data/ext/enchex_c/extconf.rb +5 -0
- data/lib/vncrec.rb +6 -0
- data/lib/vncrec/constants.rb +10 -0
- data/lib/vncrec/recorder.rb +286 -0
- data/lib/vncrec/rfb/enchex.rb +115 -0
- data/lib/vncrec/rfb/encraw.rb +33 -0
- data/lib/vncrec/rfb/enczrle.rb +202 -0
- data/lib/vncrec/rfb/proxy.rb +200 -0
- data/lib/vncrec/version.rb +3 -0
- data/lib/vncrec/writers.rb +209 -0
- data/spec/executable_spec.rb +40 -0
- data/spec/recorder_spec.rb +338 -0
- data/spec/spec_helper.rb +171 -0
- data/spec/writers_spec.rb +121 -0
- data/vncrec.gemspec +34 -0
- metadata +165 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
require "vncrec"
|
2
|
+
|
3
|
+
|
4
|
+
describe VNCRec::Writers do
|
5
|
+
|
6
|
+
describe ".get_writer" do
|
7
|
+
after(:all) {|| `rm -f *.raw *.mp4`}
|
8
|
+
after(:each) {|| begin $w.close; rescue NoMethodError; end; $w = nil}
|
9
|
+
it "handles no extension correctly" do
|
10
|
+
$w = VNCRec::Writers.get_writer("somefile", geometry: "1920x1080",pix_fmt: "bgr8")
|
11
|
+
expect($w).to be_kind_of(VNCRec::Writers::RawVideo)
|
12
|
+
field = $w.instance_variable_get(:@filename)
|
13
|
+
fn = File.basename(field)
|
14
|
+
expect(fn).to eq("somefile.raw")
|
15
|
+
end
|
16
|
+
it "handles raw extension correctly" do
|
17
|
+
$w = VNCRec::Writers.get_writer("somefile.raw", geometry: "1920x1080",pix_fmt: "bgr8")
|
18
|
+
expect($w).to be_kind_of(VNCRec::Writers::RawVideo)
|
19
|
+
field = $w.instance_variable_get(:@filename)
|
20
|
+
fn = File.basename(field)
|
21
|
+
expect(fn).to eq("somefile.raw")
|
22
|
+
end
|
23
|
+
it "handles mp4 extension correctly" do
|
24
|
+
$w = VNCRec::Writers.get_writer("somefile.mp4", geometry: "1920x1080",pix_fmt: "bgr8")
|
25
|
+
expect($w).to be_kind_of(VNCRec::Writers::FFmpeg)
|
26
|
+
field = $w.instance_variable_get(:@filename)
|
27
|
+
fn = File.basename(field)
|
28
|
+
expect(fn).to eq("somefile.mp4")
|
29
|
+
end
|
30
|
+
it "handles /dev/null correctly" do
|
31
|
+
$w = VNCRec::Writers.get_writer("somefile.mp4", geometry: "1920x1080",pix_fmt: "bgr8")
|
32
|
+
expect($w).to be_kind_of(VNCRec::Writers::FFmpeg)
|
33
|
+
field = $w.instance_variable_get(:@filename)
|
34
|
+
fn = File.basename(field)
|
35
|
+
expect(fn).to eq("somefile.mp4")
|
36
|
+
end
|
37
|
+
context "when file cannot be created" do
|
38
|
+
it "raises error" do
|
39
|
+
expect do
|
40
|
+
VNCRec::Writers.get_writer("/root/somefile")
|
41
|
+
end.to raise_error "Cannot create output file"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe VNCRec::Writers::RawVideo do
|
47
|
+
after(:each) {|| begin subject.close(); rescue IOError; end; `rm -f *.raw`}
|
48
|
+
subject {VNCRec::Writers::RawVideo.new("file.raw")}
|
49
|
+
it "initializes" do
|
50
|
+
subject.inspect
|
51
|
+
end
|
52
|
+
it "closes correctly" do
|
53
|
+
expect do
|
54
|
+
subject.inspect
|
55
|
+
subject.close
|
56
|
+
end.not_to raise_error
|
57
|
+
end
|
58
|
+
it "#write" do
|
59
|
+
expect(subject).to respond_to(:write)
|
60
|
+
subject.inspect
|
61
|
+
filesize = File.size("file.raw")
|
62
|
+
expect do
|
63
|
+
subject.write("\xFF"*10e+6)
|
64
|
+
filesize = File.size("file.raw")
|
65
|
+
end.to change{filesize}.from(0).to(10e+6)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe VNCRec::Writers::FFmpeg do
|
70
|
+
|
71
|
+
context "initialization" do
|
72
|
+
after(:all) { `rm -f *.mp4`}
|
73
|
+
it "Raises exception in case of wrong args" do
|
74
|
+
expect { || VNCRec::Writers::FFmpeg.new}.to raise_error(ArgumentError)
|
75
|
+
expect { || VNCRec::Writers::FFmpeg.new("somefile.mp4", pix_fmt: "bgr8")}.to raise_error("Undefined frame size")
|
76
|
+
expect { || VNCRec::Writers::FFmpeg.new("somefile.mp4", geometry: "1920x1080")}
|
77
|
+
expect {VNCRec::Writers::FFmpeg.new("somefile.mp4", geometry: "1920x1080")}.to raise_error("Undefined pixel format")
|
78
|
+
end
|
79
|
+
it "Raises nothing given correct args" do
|
80
|
+
expect { || VNCRec::Writers::FFmpeg.new("somefile.mp4", geometry: "1920x1080",pix_fmt: "bgr8").close}.not_to raise_error
|
81
|
+
end
|
82
|
+
context "when passed pixel format" do
|
83
|
+
subject {VNCRec::Writers::FFmpeg.new("somefile.mp4", geometry: "1920x1080", pix_fmt: "bgra")}
|
84
|
+
after(:each) {subject.close; `killall ffmpeg`}
|
85
|
+
it "sets @pix_fmt correspondingly" do
|
86
|
+
expect(subject.instance_variable_get(:@pix_fmt)).to eq VNCRec::PIX_FMT_BGRA
|
87
|
+
expect(subject.instance_variable_get(:@cmd)).to include("-pix_fmt bgra")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "Closing:" do
|
93
|
+
w = VNCRec::Writers::FFmpeg.new("somefile.mp4", geometry: "1920x1080",pix_fmt: "bgr8")
|
94
|
+
w.close
|
95
|
+
it "#close closes" do
|
96
|
+
expect(w.closed?).to be_truthy
|
97
|
+
end
|
98
|
+
it "double #close raises" do
|
99
|
+
expect do
|
100
|
+
w.close
|
101
|
+
end.to raise_error
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "Writing" do
|
106
|
+
subject {|| VNCRec::Writers::FFmpeg.new("somefile.mp4", geometry: "300x300",pix_fmt: "bgr8") }
|
107
|
+
after(:each) {|| begin; subject.close; rescue ;end }
|
108
|
+
context "when closed" do
|
109
|
+
it "raises error" do
|
110
|
+
subject.close
|
111
|
+
expect{ || subject.write("somedata") }.to raise_error("No writer running")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
it "creates exactly one file w/ exact name" do
|
115
|
+
subject.write("\x00"*(300*300*3))
|
116
|
+
expect(File.exists?("somefile.mp4")).to be_truthy
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
data/vncrec.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'vncrec/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'vncrec'
|
8
|
+
spec.version = VNCRec::VERSION
|
9
|
+
spec.authors = ['d-theus']
|
10
|
+
spec.email = ['slma0x02@gmail.com']
|
11
|
+
spec.summary = 'VNC session recording'
|
12
|
+
spec.description = 'Connect to/receive reverse-connect
|
13
|
+
from VNC server and record session as raw video or any video
|
14
|
+
format FFmpeg supports'
|
15
|
+
spec.homepage = ""
|
16
|
+
spec.license = 'MIT'
|
17
|
+
|
18
|
+
spec.files = `git ls-files -z`.split("\x0")
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
|
+
spec.require_paths = ['lib']
|
22
|
+
|
23
|
+
spec.extensions = 'ext/enchex_c/extconf.rb'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
26
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
27
|
+
spec.add_development_dependency 'rake-compiler'
|
28
|
+
spec.add_development_dependency 'rspec'
|
29
|
+
spec.add_development_dependency 'rspec-its'
|
30
|
+
spec.add_development_dependency 'activesupport'
|
31
|
+
|
32
|
+
spec.requirements << 'ffmpeg'
|
33
|
+
spec.requirements << 'x11vnc'
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,165 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vncrec
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- d-theus
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake-compiler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-its
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: activesupport
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: |-
|
98
|
+
Connect to/receive reverse-connect
|
99
|
+
from VNC server and record session as raw video or any video
|
100
|
+
format FFmpeg supports
|
101
|
+
email:
|
102
|
+
- slma0x02@gmail.com
|
103
|
+
executables:
|
104
|
+
- vncrec
|
105
|
+
extensions:
|
106
|
+
- ext/enchex_c/extconf.rb
|
107
|
+
extra_rdoc_files: []
|
108
|
+
files:
|
109
|
+
- .gitignore
|
110
|
+
- .rspec
|
111
|
+
- Gemfile
|
112
|
+
- LICENSE.txt
|
113
|
+
- README.md
|
114
|
+
- Rakefile
|
115
|
+
- bin/vncrec
|
116
|
+
- examples/exit.rb
|
117
|
+
- examples/mp4.rb
|
118
|
+
- examples/mp4audio.rb
|
119
|
+
- ext/enchex_c/ReadRect.c
|
120
|
+
- ext/enchex_c/extconf.rb
|
121
|
+
- lib/vncrec.rb
|
122
|
+
- lib/vncrec/constants.rb
|
123
|
+
- lib/vncrec/recorder.rb
|
124
|
+
- lib/vncrec/rfb/enchex.rb
|
125
|
+
- lib/vncrec/rfb/encraw.rb
|
126
|
+
- lib/vncrec/rfb/enczrle.rb
|
127
|
+
- lib/vncrec/rfb/proxy.rb
|
128
|
+
- lib/vncrec/version.rb
|
129
|
+
- lib/vncrec/writers.rb
|
130
|
+
- spec/executable_spec.rb
|
131
|
+
- spec/recorder_spec.rb
|
132
|
+
- spec/spec_helper.rb
|
133
|
+
- spec/writers_spec.rb
|
134
|
+
- vncrec.gemspec
|
135
|
+
homepage: ''
|
136
|
+
licenses:
|
137
|
+
- MIT
|
138
|
+
metadata: {}
|
139
|
+
post_install_message:
|
140
|
+
rdoc_options: []
|
141
|
+
require_paths:
|
142
|
+
- lib
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - '>='
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
requirements:
|
154
|
+
- ffmpeg
|
155
|
+
- x11vnc
|
156
|
+
rubyforge_project:
|
157
|
+
rubygems_version: 2.0.14
|
158
|
+
signing_key:
|
159
|
+
specification_version: 4
|
160
|
+
summary: VNC session recording
|
161
|
+
test_files:
|
162
|
+
- spec/executable_spec.rb
|
163
|
+
- spec/recorder_spec.rb
|
164
|
+
- spec/spec_helper.rb
|
165
|
+
- spec/writers_spec.rb
|