vidibus-recording 0.0.2 → 0.0.3
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.
- data/Gemfile.lock +3 -1
- data/lib/vidibus/recording/backend/rtmpdump.rb +19 -12
- data/lib/vidibus/recording/job.rb +18 -17
- data/lib/vidibus/recording/mongoid.rb +0 -1
- data/lib/vidibus/recording/version.rb +1 -1
- data/spec/log/v22.log +29 -0
- data/spec/log/v23.log +30 -0
- data/spec/vidibus/recording/backend/rtmpdump_spec.rb +25 -34
- data/vidibus-recording.gemspec +2 -2
- metadata +37 -19
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
vidibus-recording (0.0.
|
4
|
+
vidibus-recording (0.0.3)
|
5
|
+
activesupport (~> 3.0.0)
|
5
6
|
delayed_job_mongoid
|
6
7
|
mongoid (~> 2.0.0.beta.20)
|
7
8
|
vidibus-uuid
|
@@ -58,6 +59,7 @@ PLATFORMS
|
|
58
59
|
ruby
|
59
60
|
|
60
61
|
DEPENDENCIES
|
62
|
+
activesupport (~> 3.0.0)
|
61
63
|
bundler (>= 1.0.0)
|
62
64
|
delayed_job_mongoid
|
63
65
|
mongoid (~> 2.0.0.beta.20)
|
@@ -5,6 +5,14 @@ module Vidibus::Recording::Backend
|
|
5
5
|
|
6
6
|
attr_accessor :stream, :file, :live, :metadata
|
7
7
|
|
8
|
+
# Sets up a new dumper.
|
9
|
+
#
|
10
|
+
# Required attributes:
|
11
|
+
# :stream, :file
|
12
|
+
#
|
13
|
+
# Optional:
|
14
|
+
# :live
|
15
|
+
#
|
8
16
|
def initialize(attributes)
|
9
17
|
self.stream = attributes[:stream] or raise ConfigurationError.new("No input stream given")
|
10
18
|
self.file = attributes[:file] or raise ConfigurationError.new("No output file defined")
|
@@ -12,15 +20,13 @@ module Vidibus::Recording::Backend
|
|
12
20
|
end
|
13
21
|
|
14
22
|
# Command for starting the recording.
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
c << " --live" if live
|
23
|
-
c
|
23
|
+
def command
|
24
|
+
args = [].tap do |a|
|
25
|
+
a << "-r #{stream}"
|
26
|
+
a << "-o #{file}"
|
27
|
+
a << "--live" if live
|
28
|
+
end
|
29
|
+
%(rtmpdump #{args.join(" ")} 2>&1)
|
24
30
|
end
|
25
31
|
|
26
32
|
# Extract metadata from stdout or stderr.
|
@@ -56,9 +62,10 @@ module Vidibus::Recording::Backend
|
|
56
62
|
# audiocodecid .mp3
|
57
63
|
# audiodatarate 48.00
|
58
64
|
#
|
59
|
-
def extract_metadata(
|
60
|
-
|
61
|
-
|
65
|
+
def extract_metadata(string)
|
66
|
+
prefix = /(?:INFO\:\ *)/ if string.match(/INFO\:/) # INFO: gets prepended since v2.3
|
67
|
+
if metadata = string.match(/#{prefix}Metadata\:\n(.+)\Z/m)
|
68
|
+
tuples = $1.scan(/#{prefix}([^\n\ \d]+)\ +([^\ \n][^\n]+)\n/)
|
62
69
|
self.metadata = Hash[tuples]
|
63
70
|
end
|
64
71
|
end
|
@@ -2,16 +2,17 @@ module Vidibus::Recording
|
|
2
2
|
class Job
|
3
3
|
class ProcessError < StandardError; end
|
4
4
|
|
5
|
-
attr_accessor :recording, :pid
|
5
|
+
attr_accessor :recording, :pid, :metadata
|
6
6
|
|
7
7
|
def initialize(recording)
|
8
8
|
self.recording = recording
|
9
9
|
self.pid = recording.pid
|
10
|
+
self.metadata = nil
|
10
11
|
end
|
11
12
|
|
12
13
|
def start
|
13
14
|
self.pid = fork do
|
14
|
-
|
15
|
+
record!
|
15
16
|
end
|
16
17
|
Process.detach(pid)
|
17
18
|
pid
|
@@ -44,21 +45,21 @@ module Vidibus::Recording
|
|
44
45
|
|
45
46
|
protected
|
46
47
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
Open3::popen3(recording.backend.command) do |stdin, stdout, stderr, waiter|
|
48
|
+
def record!
|
49
|
+
Open3::popen3(recording.backend.command) do |stdin, stdout, stderr, process|
|
50
|
+
maxloops = 5
|
52
51
|
loop do
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
52
|
+
begin
|
53
|
+
string = stdout.read_nonblock(1024)
|
54
|
+
log(string)
|
55
|
+
extract_metadata(string) unless metadata
|
56
|
+
rescue Errno::EAGAIN
|
57
|
+
rescue EOFError
|
58
58
|
end
|
59
|
+
|
59
60
|
unless metadata
|
60
|
-
|
61
|
-
if
|
61
|
+
maxloops -= 1
|
62
|
+
if maxloops == 0
|
62
63
|
recording.fail("No Metadata has been received. This stream does not work.")
|
63
64
|
return
|
64
65
|
end
|
@@ -66,7 +67,7 @@ module Vidibus::Recording
|
|
66
67
|
sleep 2
|
67
68
|
end
|
68
69
|
end
|
69
|
-
|
70
|
+
process.join
|
70
71
|
end
|
71
72
|
|
72
73
|
def log(msg)
|
@@ -75,8 +76,8 @@ module Vidibus::Recording
|
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
78
|
-
def extract_metadata(
|
79
|
-
metadata = recording.backend.extract_metadata(
|
79
|
+
def extract_metadata(string)
|
80
|
+
self.metadata = recording.backend.extract_metadata(string)
|
80
81
|
if metadata
|
81
82
|
File.open(recording.yml_file, "w") do |f|
|
82
83
|
f.write(metadata.to_yaml)
|
data/spec/log/v22.log
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
RTMPDump v2.2
|
2
|
+
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
|
3
|
+
Connecting ...
|
4
|
+
ERROR: rtmp server sent error
|
5
|
+
Starting Live Stream
|
6
|
+
Metadata:
|
7
|
+
author
|
8
|
+
copyright
|
9
|
+
description
|
10
|
+
keywords
|
11
|
+
rating
|
12
|
+
title
|
13
|
+
presetname Custom
|
14
|
+
creationdate Mon Jan 17 15:22:50 2011
|
15
|
+
videodevice Osprey-210 Video Device 1
|
16
|
+
framerate 25.00
|
17
|
+
width 680.00
|
18
|
+
height 394.00
|
19
|
+
videocodecid avc1
|
20
|
+
videodatarate 650.00
|
21
|
+
avclevel 31.00
|
22
|
+
avcprofile 66.00
|
23
|
+
videokeyframe_frequency5.00
|
24
|
+
audiodevice Osprey-210 Audio Device 1
|
25
|
+
audiosamplerate 22050.00
|
26
|
+
audiochannels 1.00
|
27
|
+
audioinputvolume 75.00
|
28
|
+
audiocodecid .mp3
|
29
|
+
audiodatarate 48.00
|
data/spec/log/v23.log
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
RTMPDump v2.3
|
2
|
+
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
|
3
|
+
Connecting ...
|
4
|
+
INFO: Connected...
|
5
|
+
ERROR: rtmp server sent error
|
6
|
+
Starting Live Stream
|
7
|
+
INFO: Metadata:
|
8
|
+
INFO: author
|
9
|
+
INFO: copyright
|
10
|
+
INFO: description
|
11
|
+
INFO: keywords
|
12
|
+
INFO: rating
|
13
|
+
INFO: title
|
14
|
+
INFO: presetname Custom
|
15
|
+
INFO: creationdate Mon Jan 17 15:22:50 2011
|
16
|
+
INFO: videodevice Osprey-210 Video Device 1
|
17
|
+
INFO: framerate 25.00
|
18
|
+
INFO: width 680.00
|
19
|
+
INFO: height 394.00
|
20
|
+
INFO: videocodecid avc1
|
21
|
+
INFO: videodatarate 650.00
|
22
|
+
INFO: avclevel 31.00
|
23
|
+
INFO: avcprofile 66.00
|
24
|
+
INFO: videokeyframe_frequency5.00
|
25
|
+
INFO: audiodevice Osprey-210 Audio Device 1
|
26
|
+
INFO: audiosamplerate 22050.00
|
27
|
+
INFO: audiochannels 1.00
|
28
|
+
INFO: audioinputvolume 75.00
|
29
|
+
INFO: audiocodecid .mp3
|
30
|
+
INFO: audiodatarate 48.00
|
@@ -4,42 +4,33 @@ require "recording/backend/rtmpdump"
|
|
4
4
|
describe "Vidibus::Recording::Backend::Rtmpdump" do
|
5
5
|
|
6
6
|
let(:this) {Vidibus::Recording::Backend::Rtmpdump.new(:stream => "rtmp://test", :file => "test.rec")}
|
7
|
-
let(:log)
|
8
|
-
|
9
|
-
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
|
10
|
-
Connecting ...
|
11
|
-
ERROR: rtmp server sent error
|
12
|
-
Starting Live Stream
|
13
|
-
Metadata:
|
14
|
-
author
|
15
|
-
copyright
|
16
|
-
description
|
17
|
-
keywords
|
18
|
-
rating
|
19
|
-
title
|
20
|
-
presetname Custom
|
21
|
-
creationdate Mon Jan 17 15:22:50 2011
|
22
|
-
videodevice Osprey-210 Video Device 1
|
23
|
-
framerate 25.00
|
24
|
-
width 680.00
|
25
|
-
height 394.00
|
26
|
-
videocodecid avc1
|
27
|
-
videodatarate 650.00
|
28
|
-
avclevel 31.00
|
29
|
-
avcprofile 66.00
|
30
|
-
videokeyframe_frequency5.00
|
31
|
-
audiodevice Osprey-210 Audio Device 1
|
32
|
-
audiosamplerate 22050.00
|
33
|
-
audiochannels 1.00
|
34
|
-
audioinputvolume 75.00
|
35
|
-
audiocodecid .mp3
|
36
|
-
audiodatarate 48.00
|
37
|
-
)
|
38
|
-
end
|
7
|
+
let(:log_v22) {File.read("spec/log/v22.log")}
|
8
|
+
let(:log_v23) {File.read("spec/log/v23.log")}
|
39
9
|
|
40
10
|
describe "extract_metadata" do
|
41
|
-
it "should extract relevant metadata" do
|
42
|
-
this.extract_metadata(
|
11
|
+
it "should extract relevant metadata from RTMPDump v2.2" do
|
12
|
+
this.extract_metadata(log_v22).should eql({
|
13
|
+
"presetname" => "Custom",
|
14
|
+
"creationdate" => "Mon Jan 17 15:22:50 2011",
|
15
|
+
"videodevice" => "Osprey-210 Video Device 1",
|
16
|
+
"framerate" => "25.00",
|
17
|
+
"width" => "680.00",
|
18
|
+
"height" => "394.00",
|
19
|
+
"videocodecid" => "avc1",
|
20
|
+
"videodatarate" => "650.00",
|
21
|
+
"avclevel" => "31.00",
|
22
|
+
"avcprofile" => "66.00",
|
23
|
+
"audiodevice" => "Osprey-210 Audio Device 1",
|
24
|
+
"audiosamplerate" => "22050.00",
|
25
|
+
"audiochannels" => "1.00",
|
26
|
+
"audioinputvolume" => "75.00",
|
27
|
+
"audiocodecid" => ".mp3",
|
28
|
+
"audiodatarate" => "48.00"
|
29
|
+
})
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should extract relevant metadata from RTMPDump v2.3" do
|
33
|
+
this.extract_metadata(log_v23).should eql({
|
43
34
|
"presetname" => "Custom",
|
44
35
|
"creationdate" => "Mon Jan 17 15:22:50 2011",
|
45
36
|
"videodevice" => "Osprey-210 Video Device 1",
|
data/vidibus-recording.gemspec
CHANGED
@@ -13,10 +13,10 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.description = "Allows recording of RTMP video streams. Uses RTMPdump."
|
14
14
|
|
15
15
|
s.required_rubygems_version = ">= 1.3.6"
|
16
|
-
|
16
|
+
|
17
|
+
s.add_dependency "activesupport", "~> 3.0.0"
|
17
18
|
s.add_dependency "mongoid", "~> 2.0.0.beta.20"
|
18
19
|
s.add_dependency "delayed_job_mongoid"
|
19
|
-
|
20
20
|
s.add_dependency "vidibus-uuid"
|
21
21
|
|
22
22
|
s.add_development_dependency "bundler", ">= 1.0.0"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vidibus-recording
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andre Pankratz
|
@@ -19,9 +19,25 @@ date: 2011-01-24 00:00:00 +01:00
|
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: activesupport
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 7
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 3.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: mongoid
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
25
41
|
none: false
|
26
42
|
requirements:
|
27
43
|
- - ~>
|
@@ -35,11 +51,11 @@ dependencies:
|
|
35
51
|
- 20
|
36
52
|
version: 2.0.0.beta.20
|
37
53
|
type: :runtime
|
38
|
-
version_requirements: *
|
54
|
+
version_requirements: *id002
|
39
55
|
- !ruby/object:Gem::Dependency
|
40
56
|
name: delayed_job_mongoid
|
41
57
|
prerelease: false
|
42
|
-
requirement: &
|
58
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
43
59
|
none: false
|
44
60
|
requirements:
|
45
61
|
- - ">="
|
@@ -49,11 +65,11 @@ dependencies:
|
|
49
65
|
- 0
|
50
66
|
version: "0"
|
51
67
|
type: :runtime
|
52
|
-
version_requirements: *
|
68
|
+
version_requirements: *id003
|
53
69
|
- !ruby/object:Gem::Dependency
|
54
70
|
name: vidibus-uuid
|
55
71
|
prerelease: false
|
56
|
-
requirement: &
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
57
73
|
none: false
|
58
74
|
requirements:
|
59
75
|
- - ">="
|
@@ -63,11 +79,11 @@ dependencies:
|
|
63
79
|
- 0
|
64
80
|
version: "0"
|
65
81
|
type: :runtime
|
66
|
-
version_requirements: *
|
82
|
+
version_requirements: *id004
|
67
83
|
- !ruby/object:Gem::Dependency
|
68
84
|
name: bundler
|
69
85
|
prerelease: false
|
70
|
-
requirement: &
|
86
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
71
87
|
none: false
|
72
88
|
requirements:
|
73
89
|
- - ">="
|
@@ -79,11 +95,11 @@ dependencies:
|
|
79
95
|
- 0
|
80
96
|
version: 1.0.0
|
81
97
|
type: :development
|
82
|
-
version_requirements: *
|
98
|
+
version_requirements: *id005
|
83
99
|
- !ruby/object:Gem::Dependency
|
84
100
|
name: rake
|
85
101
|
prerelease: false
|
86
|
-
requirement: &
|
102
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
87
103
|
none: false
|
88
104
|
requirements:
|
89
105
|
- - ">="
|
@@ -93,11 +109,11 @@ dependencies:
|
|
93
109
|
- 0
|
94
110
|
version: "0"
|
95
111
|
type: :development
|
96
|
-
version_requirements: *
|
112
|
+
version_requirements: *id006
|
97
113
|
- !ruby/object:Gem::Dependency
|
98
114
|
name: rspec
|
99
115
|
prerelease: false
|
100
|
-
requirement: &
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
101
117
|
none: false
|
102
118
|
requirements:
|
103
119
|
- - ~>
|
@@ -111,11 +127,11 @@ dependencies:
|
|
111
127
|
- 20
|
112
128
|
version: 2.0.0.beta.20
|
113
129
|
type: :development
|
114
|
-
version_requirements: *
|
130
|
+
version_requirements: *id007
|
115
131
|
- !ruby/object:Gem::Dependency
|
116
132
|
name: rr
|
117
133
|
prerelease: false
|
118
|
-
requirement: &
|
134
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
119
135
|
none: false
|
120
136
|
requirements:
|
121
137
|
- - ">="
|
@@ -125,11 +141,11 @@ dependencies:
|
|
125
141
|
- 0
|
126
142
|
version: "0"
|
127
143
|
type: :development
|
128
|
-
version_requirements: *
|
144
|
+
version_requirements: *id008
|
129
145
|
- !ruby/object:Gem::Dependency
|
130
146
|
name: relevance-rcov
|
131
147
|
prerelease: false
|
132
|
-
requirement: &
|
148
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
133
149
|
none: false
|
134
150
|
requirements:
|
135
151
|
- - ">="
|
@@ -139,7 +155,7 @@ dependencies:
|
|
139
155
|
- 0
|
140
156
|
version: "0"
|
141
157
|
type: :development
|
142
|
-
version_requirements: *
|
158
|
+
version_requirements: *id009
|
143
159
|
description: Allows recording of RTMP video streams. Uses RTMPdump.
|
144
160
|
email: andre@vidibus.com
|
145
161
|
executables: []
|
@@ -164,6 +180,8 @@ files:
|
|
164
180
|
- lib/vidibus/recording/job.rb
|
165
181
|
- lib/vidibus/recording/mongoid.rb
|
166
182
|
- lib/vidibus/recording/version.rb
|
183
|
+
- spec/log/v22.log
|
184
|
+
- spec/log/v23.log
|
167
185
|
- spec/spec_helper.rb
|
168
186
|
- spec/vidibus/recording/backend/rtmpdump_spec.rb
|
169
187
|
- spec/vidibus/recording/backend_spec.rb
|