vidibus-recording 0.0.1 → 0.0.2
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 +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
|