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 CHANGED
@@ -1,11 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vidibus-recording (0.0.1)
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!
@@ -1,6 +1,5 @@
1
- require "open4"
1
+ require "open3"
2
2
  require "yaml"
3
- require "robustthread"
4
3
  require "delayed_job_mongoid"
5
4
  require "active_support/core_ext"
6
5
  require "vidibus-uuid"
@@ -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\s\d]+)\s*([^\n]+)\n/m)
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
- while(status = task.status)
62
- unless stderr == last_stderr
63
- metadata = extract_metadata(stderr)
64
- last_stderr = stderr
65
- end
66
-
67
- unless stdout == last_stdout
68
- metadata = extract_metadata(stdout)
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 |file|
90
- file.write(metadata.to_yaml)
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
@@ -151,7 +151,7 @@ module Vidibus::Recording
151
151
  if str = read_file(log_file)
152
152
  str.gsub!(/\A[^\n]+\n/, "") # remove first line
153
153
  unless str == ""
154
- self.log = str
154
+ self.log = str.gsub(/\r\n?/, "\n")
155
155
  end
156
156
  end
157
157
  end
@@ -1,5 +1,5 @@
1
1
  module Vidibus
2
2
  module Recording
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  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
@@ -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: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
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-23 00:00:00 +01:00
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: open4
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: robustthread
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: &id006 !ruby/object:Gem::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: *id006
82
+ version_requirements: *id004
111
83
  - !ruby/object:Gem::Dependency
112
84
  name: rake
113
85
  prerelease: false
114
- requirement: &id007 !ruby/object:Gem::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: *id007
96
+ version_requirements: *id005
125
97
  - !ruby/object:Gem::Dependency
126
98
  name: rspec
127
99
  prerelease: false
128
- requirement: &id008 !ruby/object:Gem::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: *id008
114
+ version_requirements: *id006
143
115
  - !ruby/object:Gem::Dependency
144
116
  name: rr
145
117
  prerelease: false
146
- requirement: &id009 !ruby/object:Gem::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: *id009
128
+ version_requirements: *id007
157
129
  - !ruby/object:Gem::Dependency
158
130
  name: relevance-rcov
159
131
  prerelease: false
160
- requirement: &id010 !ruby/object:Gem::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: *id010
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