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 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