vidibus-recording 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vidibus-recording (0.0.2)
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
- # Required options:
16
- # :stream, :file
17
- # Optional:
18
- # :live
19
- #
20
- def command(options = {})
21
- c = %(rtmpdump -r "#{stream}" -o #{file})
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(std)
60
- if metadata = std.match(/Metadata\:\n\s+(.+)\Z/m)
61
- tuples = $1.scan(/([^\n\ \d]+)\ +([^\ ][^\n]+)\n/mi)
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
- start_thread
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 start_thread
48
- timeout = 5
49
- metadata = nil
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
- 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
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
- timeout -= 1
61
- if timeout == 0
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
- waiter.join
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(std)
79
- metadata = recording.backend.extract_metadata(std)
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)
@@ -149,7 +149,6 @@ module Vidibus::Recording
149
149
 
150
150
  def process_log_file
151
151
  if str = read_file(log_file)
152
- str.gsub!(/\A[^\n]+\n/, "") # remove first line
153
152
  unless str == ""
154
153
  self.log = str.gsub(/\r\n?/, "\n")
155
154
  end
@@ -1,5 +1,5 @@
1
1
  module Vidibus
2
2
  module Recording
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
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) 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
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(log).should eql({
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",
@@ -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: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
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: mongoid
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: *id001
54
+ version_requirements: *id002
39
55
  - !ruby/object:Gem::Dependency
40
56
  name: delayed_job_mongoid
41
57
  prerelease: false
42
- requirement: &id002 !ruby/object:Gem::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: *id002
68
+ version_requirements: *id003
53
69
  - !ruby/object:Gem::Dependency
54
70
  name: vidibus-uuid
55
71
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::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: *id003
82
+ version_requirements: *id004
67
83
  - !ruby/object:Gem::Dependency
68
84
  name: bundler
69
85
  prerelease: false
70
- requirement: &id004 !ruby/object:Gem::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: *id004
98
+ version_requirements: *id005
83
99
  - !ruby/object:Gem::Dependency
84
100
  name: rake
85
101
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::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: *id005
112
+ version_requirements: *id006
97
113
  - !ruby/object:Gem::Dependency
98
114
  name: rspec
99
115
  prerelease: false
100
- requirement: &id006 !ruby/object:Gem::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: *id006
130
+ version_requirements: *id007
115
131
  - !ruby/object:Gem::Dependency
116
132
  name: rr
117
133
  prerelease: false
118
- requirement: &id007 !ruby/object:Gem::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: *id007
144
+ version_requirements: *id008
129
145
  - !ruby/object:Gem::Dependency
130
146
  name: relevance-rcov
131
147
  prerelease: false
132
- requirement: &id008 !ruby/object:Gem::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: *id008
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