vidibus-recording 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -7
- data/lib/vidibus-recording.rb +1 -2
- data/lib/vidibus/recording/backend/rtmpdump.rb +1 -1
- data/lib/vidibus/recording/job.rb +25 -40
- data/lib/vidibus/recording/mongoid.rb +1 -1
- data/lib/vidibus/recording/version.rb +1 -1
- data/spec/vidibus/recording/backend/rtmpdump_spec.rb +62 -0
- data/vidibus-recording.gemspec +0 -2
- metadata +17 -44
data/Gemfile.lock
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
vidibus-recording (0.0.
|
4
|
+
vidibus-recording (0.0.2)
|
5
5
|
delayed_job_mongoid
|
6
6
|
mongoid (~> 2.0.0.beta.20)
|
7
|
-
open4
|
8
|
-
robustthread
|
9
7
|
vidibus-uuid
|
10
8
|
|
11
9
|
GEM
|
@@ -35,10 +33,8 @@ GEM
|
|
35
33
|
mongo (~> 1.2)
|
36
34
|
tzinfo (~> 0.3.22)
|
37
35
|
will_paginate (~> 3.0.pre)
|
38
|
-
open4 (1.0.1)
|
39
36
|
rake (0.8.7)
|
40
37
|
relevance-rcov (0.9.2.1)
|
41
|
-
robustthread (0.5.2)
|
42
38
|
rr (1.0.2)
|
43
39
|
rspec (2.0.1)
|
44
40
|
rspec-core (~> 2.0.1)
|
@@ -65,10 +61,8 @@ DEPENDENCIES
|
|
65
61
|
bundler (>= 1.0.0)
|
66
62
|
delayed_job_mongoid
|
67
63
|
mongoid (~> 2.0.0.beta.20)
|
68
|
-
open4
|
69
64
|
rake
|
70
65
|
relevance-rcov
|
71
|
-
robustthread
|
72
66
|
rr
|
73
67
|
rspec (~> 2.0.0.beta.20)
|
74
68
|
vidibus-recording!
|
data/lib/vidibus-recording.rb
CHANGED
@@ -58,7 +58,7 @@ module Vidibus::Recording::Backend
|
|
58
58
|
#
|
59
59
|
def extract_metadata(std)
|
60
60
|
if metadata = std.match(/Metadata\:\n\s+(.+)\Z/m)
|
61
|
-
tuples = $1.scan(/([^\n\
|
61
|
+
tuples = $1.scan(/([^\n\ \d]+)\ +([^\ ][^\n]+)\n/mi)
|
62
62
|
self.metadata = Hash[tuples]
|
63
63
|
end
|
64
64
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
module Vidibus::Recording
|
2
2
|
class Job
|
3
|
-
include Open4
|
4
|
-
|
5
3
|
class ProcessError < StandardError; end
|
6
4
|
|
7
5
|
attr_accessor :recording, :pid
|
@@ -12,7 +10,6 @@ module Vidibus::Recording
|
|
12
10
|
end
|
13
11
|
|
14
12
|
def start
|
15
|
-
start_logger
|
16
13
|
self.pid = fork do
|
17
14
|
start_thread
|
18
15
|
end
|
@@ -48,56 +45,44 @@ module Vidibus::Recording
|
|
48
45
|
protected
|
49
46
|
|
50
47
|
def start_thread
|
51
|
-
stdin = ""
|
52
|
-
stdout = ""
|
53
|
-
stderr = ""
|
54
|
-
last_stderr = ""
|
55
|
-
last_stdout = ""
|
56
|
-
task = background(recording.backend.command, 0=>stdin, 1=>stdout, 2=>stderr)
|
57
|
-
|
58
|
-
waiter = Thread.new {y(task.pid => task.exitstatus)} # t.exitstatus is a blocking call!
|
59
48
|
timeout = 5
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
last_stdout = stdout
|
70
|
-
end
|
71
|
-
|
72
|
-
unless metadata
|
73
|
-
timeout -= 1
|
74
|
-
if timeout == 0
|
75
|
-
recording.fail("No Metadata has been received. This stream does not work.")
|
76
|
-
return
|
49
|
+
metadata = nil
|
50
|
+
|
51
|
+
Open3::popen3(recording.backend.command) do |stdin, stdout, stderr, waiter|
|
52
|
+
loop do
|
53
|
+
size = stderr.stat.blocks * stderr.stat.blksize
|
54
|
+
if size > 0
|
55
|
+
std = stderr.readpartial(size) rescue ""
|
56
|
+
log(std)
|
57
|
+
metadata = extract_metadata(std) unless metadata
|
77
58
|
end
|
59
|
+
unless metadata
|
60
|
+
timeout -= 1
|
61
|
+
if timeout == 0
|
62
|
+
recording.fail("No Metadata has been received. This stream does not work.")
|
63
|
+
return
|
64
|
+
end
|
65
|
+
end
|
66
|
+
sleep 2
|
78
67
|
end
|
79
|
-
|
80
|
-
sleep 2
|
81
68
|
end
|
82
|
-
|
83
69
|
waiter.join
|
84
70
|
end
|
85
71
|
|
72
|
+
def log(msg)
|
73
|
+
File.open(recording.log_file, "a") do |f|
|
74
|
+
f.write(msg)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
86
78
|
def extract_metadata(std)
|
87
79
|
metadata = recording.backend.extract_metadata(std)
|
88
80
|
if metadata
|
89
|
-
File.open(recording.yml_file, "w") do |
|
90
|
-
|
81
|
+
File.open(recording.yml_file, "w") do |f|
|
82
|
+
f.write(metadata.to_yaml)
|
91
83
|
end
|
92
84
|
end
|
93
85
|
metadata
|
94
86
|
end
|
95
|
-
|
96
|
-
def start_logger
|
97
|
-
RobustThread.logger = Logger.new(recording.log_file)
|
98
|
-
RobustThread.exception_handler do |exception|
|
99
|
-
RobustThread.log exception
|
100
|
-
end
|
101
|
-
end
|
102
87
|
end
|
103
88
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "recording/backend/rtmpdump"
|
3
|
+
|
4
|
+
describe "Vidibus::Recording::Backend::Rtmpdump" do
|
5
|
+
|
6
|
+
let(:this) {Vidibus::Recording::Backend::Rtmpdump.new(:stream => "rtmp://test", :file => "test.rec")}
|
7
|
+
let(:log) do
|
8
|
+
%(RTMPDump v2.2
|
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
|
39
|
+
|
40
|
+
describe "extract_metadata" do
|
41
|
+
it "should extract relevant metadata" do
|
42
|
+
this.extract_metadata(log).should eql({
|
43
|
+
"presetname" => "Custom",
|
44
|
+
"creationdate" => "Mon Jan 17 15:22:50 2011",
|
45
|
+
"videodevice" => "Osprey-210 Video Device 1",
|
46
|
+
"framerate" => "25.00",
|
47
|
+
"width" => "680.00",
|
48
|
+
"height" => "394.00",
|
49
|
+
"videocodecid" => "avc1",
|
50
|
+
"videodatarate" => "650.00",
|
51
|
+
"avclevel" => "31.00",
|
52
|
+
"avcprofile" => "66.00",
|
53
|
+
"audiodevice" => "Osprey-210 Audio Device 1",
|
54
|
+
"audiosamplerate" => "22050.00",
|
55
|
+
"audiochannels" => "1.00",
|
56
|
+
"audioinputvolume" => "75.00",
|
57
|
+
"audiocodecid" => ".mp3",
|
58
|
+
"audiodatarate" => "48.00"
|
59
|
+
})
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/vidibus-recording.gemspec
CHANGED
@@ -15,8 +15,6 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.required_rubygems_version = ">= 1.3.6"
|
16
16
|
|
17
17
|
s.add_dependency "mongoid", "~> 2.0.0.beta.20"
|
18
|
-
s.add_dependency "open4"
|
19
|
-
s.add_dependency "robustthread"
|
20
18
|
s.add_dependency "delayed_job_mongoid"
|
21
19
|
|
22
20
|
s.add_dependency "vidibus-uuid"
|
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: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andre Pankratz
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-24 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -37,7 +37,7 @@ dependencies:
|
|
37
37
|
type: :runtime
|
38
38
|
version_requirements: *id001
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
|
-
name:
|
40
|
+
name: delayed_job_mongoid
|
41
41
|
prerelease: false
|
42
42
|
requirement: &id002 !ruby/object:Gem::Requirement
|
43
43
|
none: false
|
@@ -51,7 +51,7 @@ dependencies:
|
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
54
|
+
name: vidibus-uuid
|
55
55
|
prerelease: false
|
56
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
@@ -64,38 +64,10 @@ dependencies:
|
|
64
64
|
version: "0"
|
65
65
|
type: :runtime
|
66
66
|
version_requirements: *id003
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
|
-
name: delayed_job_mongoid
|
69
|
-
prerelease: false
|
70
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
-
none: false
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
hash: 3
|
76
|
-
segments:
|
77
|
-
- 0
|
78
|
-
version: "0"
|
79
|
-
type: :runtime
|
80
|
-
version_requirements: *id004
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
name: vidibus-uuid
|
83
|
-
prerelease: false
|
84
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
85
|
-
none: false
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
hash: 3
|
90
|
-
segments:
|
91
|
-
- 0
|
92
|
-
version: "0"
|
93
|
-
type: :runtime
|
94
|
-
version_requirements: *id005
|
95
67
|
- !ruby/object:Gem::Dependency
|
96
68
|
name: bundler
|
97
69
|
prerelease: false
|
98
|
-
requirement: &
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
99
71
|
none: false
|
100
72
|
requirements:
|
101
73
|
- - ">="
|
@@ -107,11 +79,11 @@ dependencies:
|
|
107
79
|
- 0
|
108
80
|
version: 1.0.0
|
109
81
|
type: :development
|
110
|
-
version_requirements: *
|
82
|
+
version_requirements: *id004
|
111
83
|
- !ruby/object:Gem::Dependency
|
112
84
|
name: rake
|
113
85
|
prerelease: false
|
114
|
-
requirement: &
|
86
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
115
87
|
none: false
|
116
88
|
requirements:
|
117
89
|
- - ">="
|
@@ -121,11 +93,11 @@ dependencies:
|
|
121
93
|
- 0
|
122
94
|
version: "0"
|
123
95
|
type: :development
|
124
|
-
version_requirements: *
|
96
|
+
version_requirements: *id005
|
125
97
|
- !ruby/object:Gem::Dependency
|
126
98
|
name: rspec
|
127
99
|
prerelease: false
|
128
|
-
requirement: &
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
129
101
|
none: false
|
130
102
|
requirements:
|
131
103
|
- - ~>
|
@@ -139,11 +111,11 @@ dependencies:
|
|
139
111
|
- 20
|
140
112
|
version: 2.0.0.beta.20
|
141
113
|
type: :development
|
142
|
-
version_requirements: *
|
114
|
+
version_requirements: *id006
|
143
115
|
- !ruby/object:Gem::Dependency
|
144
116
|
name: rr
|
145
117
|
prerelease: false
|
146
|
-
requirement: &
|
118
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
147
119
|
none: false
|
148
120
|
requirements:
|
149
121
|
- - ">="
|
@@ -153,11 +125,11 @@ dependencies:
|
|
153
125
|
- 0
|
154
126
|
version: "0"
|
155
127
|
type: :development
|
156
|
-
version_requirements: *
|
128
|
+
version_requirements: *id007
|
157
129
|
- !ruby/object:Gem::Dependency
|
158
130
|
name: relevance-rcov
|
159
131
|
prerelease: false
|
160
|
-
requirement: &
|
132
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
161
133
|
none: false
|
162
134
|
requirements:
|
163
135
|
- - ">="
|
@@ -167,7 +139,7 @@ dependencies:
|
|
167
139
|
- 0
|
168
140
|
version: "0"
|
169
141
|
type: :development
|
170
|
-
version_requirements: *
|
142
|
+
version_requirements: *id008
|
171
143
|
description: Allows recording of RTMP video streams. Uses RTMPdump.
|
172
144
|
email: andre@vidibus.com
|
173
145
|
executables: []
|
@@ -193,6 +165,7 @@ files:
|
|
193
165
|
- lib/vidibus/recording/mongoid.rb
|
194
166
|
- lib/vidibus/recording/version.rb
|
195
167
|
- spec/spec_helper.rb
|
168
|
+
- spec/vidibus/recording/backend/rtmpdump_spec.rb
|
196
169
|
- spec/vidibus/recording/backend_spec.rb
|
197
170
|
- spec/vidibus/recording/mongoid_spec.rb
|
198
171
|
- vidibus-recording.gemspec
|