greatseth-mediainfo 0.1 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +13 -0
- data/Manifest +2 -0
- data/README.markdown +10 -6
- data/Rakefile +1 -0
- data/lib/mediainfo/string.rb +9 -0
- data/lib/mediainfo.rb +41 -8
- data/mediainfo.gemspec +6 -9
- data/test/mediainfo_awaywego_encoded_test.rb +3 -1
- data/test/mediainfo_awaywego_test.rb +3 -1
- data/test/mediainfo_dinner_test.rb +3 -1
- data/test/mediainfo_hats_test.rb +3 -1
- data/test/mediainfo_string_test.rb +12 -0
- data/test/mediainfo_test.rb +23 -2
- data/test/mediainfo_vimeo_test.rb +3 -1
- data/test/test_helper.rb +1 -0
- metadata +9 -14
data/Changelog
CHANGED
@@ -1 +1,14 @@
|
|
1
|
+
v0.3 Mediainfo Is High Class
|
2
|
+
- Class instead of instance-level customization of mediainfo binary path.
|
3
|
+
Set Mediainfo.path = /path/to/binary if mediainfo is not in your shell
|
4
|
+
path.
|
5
|
+
- Instances retain the :last_command run. The API to rerun that command is
|
6
|
+
still private.
|
7
|
+
- Started defining custom Mediainfo exception classes and are now raising
|
8
|
+
Mediainfo::ExecutionError instead of RuntimeError if the system command
|
9
|
+
exits with anything other than 0.
|
10
|
+
|
11
|
+
v0.2 Escape from the Shell
|
12
|
+
- Added proper escaping for funky filenames. Thanks to Peter Vandenberk!
|
13
|
+
|
1
14
|
v0.1 Initial Release
|
data/Manifest
CHANGED
data/README.markdown
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
# Mediainfo
|
2
2
|
|
3
|
-
Mediainfo is a class
|
4
|
-
on a file and expose the information it produces in a straightforward
|
5
|
-
manner.
|
6
|
-
|
7
|
-
The mediainfo CLI can be obtained at http://mediainfo.sourceforge.net.
|
3
|
+
Mediainfo is a class wrapping [the mediainfo CLI](http://mediainfo.sourceforge.net).
|
8
4
|
|
9
5
|
## Usage
|
10
6
|
|
@@ -22,6 +18,14 @@ For a list of all possible attributes supported:
|
|
22
18
|
In addition to the stock arguments provided by parsing `mediainfo` output,
|
23
19
|
some convenience methods and added behavior is added.
|
24
20
|
|
21
|
+
Mediainfo is inspired by RVideo::Inspector, part of the rvideo gem.
|
22
|
+
The rvideo inspector is based on output from ffmpeg which is not
|
23
|
+
intended to be machine parseable. I spent a little while chasing
|
24
|
+
the ffmpeg development team, and decided finally that perhaps other
|
25
|
+
tools were better. As such, some of the API for Mediainfo is straight
|
26
|
+
from RVideo::Inspector. Some is not. Just saying.
|
27
|
+
|
25
28
|
## Contributors
|
26
29
|
|
27
|
-
* Seth Thomas Rasmussen - http://greatseth.com
|
30
|
+
* Seth Thomas Rasmussen - [http://greatseth.com](http://greatseth.com)
|
31
|
+
* Peter Vandenberk - [http://github.com/pvdb](http://github.com/pvdb)
|
data/Rakefile
CHANGED
@@ -0,0 +1,9 @@
|
|
1
|
+
class String
|
2
|
+
def shell_escape
|
3
|
+
# The gsub is for ANSI-C style quoting.
|
4
|
+
#
|
5
|
+
# The $'' is for bash, see http://www.faqs.org/docs/bashman/bashref_12.html,
|
6
|
+
# but appears to be working for other shells: sh, zsh, ksh, dash
|
7
|
+
"$'#{gsub(/\\|'/) { |c| "\\#{c}" }}'"
|
8
|
+
end
|
9
|
+
end
|
data/lib/mediainfo.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "mediainfo/string"
|
1
2
|
require "mediainfo/attr_readers"
|
2
3
|
|
3
4
|
# Mediainfo is a class encapsulating the ability to run `mediainfo`
|
@@ -117,6 +118,19 @@ class Mediainfo
|
|
117
118
|
mediainfo_duration_reader :audio_duration
|
118
119
|
|
119
120
|
mediainfo_attr_reader :audio_sampling_rate
|
121
|
+
def audio_sample_rate
|
122
|
+
return unless rate = audio_sampling_rate_before_type_cast
|
123
|
+
number = rate.gsub(/[^\d.]+/, "").to_f
|
124
|
+
number = case rate
|
125
|
+
when /KHz/ then number * 1000
|
126
|
+
when /Hz/ then number
|
127
|
+
else
|
128
|
+
raise "unhandled sample rate! please report bug!"
|
129
|
+
end
|
130
|
+
number.to_i
|
131
|
+
end
|
132
|
+
alias_method :audio_sampling_rate, :audio_sample_rate
|
133
|
+
|
120
134
|
mediainfo_attr_reader :audio_stream_size
|
121
135
|
mediainfo_attr_reader :audio_bit_rate
|
122
136
|
mediainfo_attr_reader :audio_bit_rate_mode
|
@@ -154,38 +168,57 @@ class Mediainfo
|
|
154
168
|
###
|
155
169
|
|
156
170
|
attr_reader :raw_response, :parsed_response,
|
157
|
-
:full_filename, :filename, :path
|
171
|
+
:full_filename, :filename, :path, :escaped_full_filename
|
158
172
|
|
159
173
|
def initialize(full_filename)
|
160
|
-
@
|
161
|
-
|
162
|
-
@full_filename = full_filename
|
174
|
+
@full_filename = File.expand_path full_filename
|
163
175
|
@path = File.dirname @full_filename
|
164
176
|
@filename = File.basename @full_filename
|
165
177
|
|
166
178
|
raise ArgumentError, "need a path to a video file, got nil" unless @full_filename
|
167
179
|
raise ArgumentError, "need a path to a video file, #{@full_filename} does not exist" unless File.exist? @full_filename
|
168
180
|
|
181
|
+
@escaped_full_filename = @full_filename.shell_escape
|
169
182
|
@raw_response = mediainfo!
|
170
183
|
parse!
|
171
184
|
end
|
172
185
|
|
173
|
-
attr_accessor :
|
186
|
+
class << self; attr_accessor :path; end
|
187
|
+
def path; self.class.path; end
|
188
|
+
|
189
|
+
def self.default_mediainfo_path!; self.path = "mediainfo"; end
|
190
|
+
default_mediainfo_path! unless path
|
174
191
|
|
175
192
|
def mediainfo_version
|
176
|
-
`#{
|
193
|
+
`#{path} --Version`[/v([\d.]+)/, 1]
|
177
194
|
end
|
178
195
|
|
196
|
+
attr_reader :last_command
|
197
|
+
|
198
|
+
class Error < StandardError; end
|
199
|
+
class ExecutionError < Error; end
|
200
|
+
|
179
201
|
private
|
180
202
|
def mediainfo!
|
181
|
-
|
203
|
+
# for bash, see: http://www.faqs.org/docs/bashman/bashref_12.html
|
204
|
+
# but appears to be working for other shells: sh, zsh, ksh, dash
|
205
|
+
@last_command = "#{path} #{@escaped_full_filename}"
|
206
|
+
run_last_command!
|
207
|
+
end
|
208
|
+
|
209
|
+
def run_last_command!
|
210
|
+
raw_response = `#{@last_command}`
|
211
|
+
unless $? == 0
|
212
|
+
raise ExecutionError, "Execution of `#{@last_command}` failed: #{raw_response.inspect}"
|
213
|
+
end
|
214
|
+
raw_response
|
182
215
|
end
|
183
216
|
|
184
217
|
def parse!
|
185
218
|
@parsed_response = {}
|
186
219
|
subsection = nil
|
187
220
|
|
188
|
-
@raw_response.split("\n").map { |x| x.strip }.each do |line|
|
221
|
+
@raw_response.to_s.split("\n").map { |x| x.strip }.each do |line|
|
189
222
|
next if line.empty? || line == "General"
|
190
223
|
|
191
224
|
if SECTIONS.include? line
|
data/mediainfo.gemspec
CHANGED
@@ -2,33 +2,30 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{mediainfo}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Seth Thomas Rasmussen"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-07-20}
|
10
10
|
s.description = %q{}
|
11
11
|
s.email = %q{sethrasmussen@gmail.com}
|
12
|
-
s.extra_rdoc_files = ["lib/mediainfo/attr_readers.rb", "lib/mediainfo.rb", "LICENSE", "README.markdown"]
|
13
|
-
s.files = ["Changelog", "lib/mediainfo/attr_readers.rb", "lib/mediainfo.rb", "LICENSE", "Manifest", "
|
12
|
+
s.extra_rdoc_files = ["lib/mediainfo/attr_readers.rb", "lib/mediainfo/string.rb", "lib/mediainfo.rb", "LICENSE", "README.markdown"]
|
13
|
+
s.files = ["Changelog", "lib/mediainfo/attr_readers.rb", "lib/mediainfo/string.rb", "lib/mediainfo.rb", "LICENSE", "Manifest", "mediainfo.gemspec", "Rakefile", "README.markdown", "test/mediainfo_awaywego_encoded_test.rb", "test/mediainfo_awaywego_test.rb", "test/mediainfo_dinner_test.rb", "test/mediainfo_hats_test.rb", "test/mediainfo_string_test.rb", "test/mediainfo_test.rb", "test/mediainfo_vimeo_test.rb", "test/mediainfo_vimeoimage_test.rb", "test/test_helper.rb"]
|
14
14
|
s.homepage = %q{http://greatseth.com}
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Mediainfo", "--main", "README.markdown"]
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
s.rubyforge_project = %q{mediainfo}
|
18
|
-
s.rubygems_version = %q{1.3.
|
18
|
+
s.rubygems_version = %q{1.3.4}
|
19
19
|
s.summary = %q{}
|
20
|
-
s.test_files = ["test/mediainfo_awaywego_encoded_test.rb", "test/mediainfo_awaywego_test.rb", "test/mediainfo_dinner_test.rb", "test/mediainfo_hats_test.rb", "test/mediainfo_test.rb", "test/mediainfo_vimeo_test.rb", "test/mediainfo_vimeoimage_test.rb", "test/test_helper.rb"]
|
20
|
+
s.test_files = ["test/mediainfo_awaywego_encoded_test.rb", "test/mediainfo_awaywego_test.rb", "test/mediainfo_dinner_test.rb", "test/mediainfo_hats_test.rb", "test/mediainfo_string_test.rb", "test/mediainfo_test.rb", "test/mediainfo_vimeo_test.rb", "test/mediainfo_vimeoimage_test.rb", "test/test_helper.rb"]
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
24
|
s.specification_version = 3
|
25
25
|
|
26
26
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
|
-
s.add_development_dependency(%q<echoe>, [">= 0"])
|
28
27
|
else
|
29
|
-
s.add_dependency(%q<echoe>, [">= 0"])
|
30
28
|
end
|
31
29
|
else
|
32
|
-
s.add_dependency(%q<echoe>, [">= 0"])
|
33
30
|
end
|
34
31
|
end
|
@@ -238,7 +238,9 @@ class MediainfoAwaywegoEncodedTest < ActiveSupport::TestCase
|
|
238
238
|
end
|
239
239
|
|
240
240
|
test "audio Sampling rate" do
|
241
|
-
assert_equal
|
241
|
+
assert_equal 48000, @info.audio_sample_rate
|
242
|
+
assert_equal 48000, @info.audio_sampling_rate
|
243
|
+
assert_equal "48.0 KHz", @info.audio_sampling_rate_before_type_cast
|
242
244
|
end
|
243
245
|
|
244
246
|
test "audio Resolution" do
|
@@ -241,7 +241,9 @@ class MediainfoAwaywegoTest < ActiveSupport::TestCase
|
|
241
241
|
end
|
242
242
|
|
243
243
|
test "audio Sampling rate" do
|
244
|
-
assert_equal
|
244
|
+
assert_equal 48000, @info.audio_sample_rate
|
245
|
+
assert_equal 48000, @info.audio_sampling_rate
|
246
|
+
assert_equal "48.0 KHz", @info.audio_sampling_rate_before_type_cast
|
245
247
|
end
|
246
248
|
|
247
249
|
test "audio resolution" do
|
@@ -225,7 +225,9 @@ class MediainfoDinnerTest < ActiveSupport::TestCase
|
|
225
225
|
end
|
226
226
|
|
227
227
|
test "audio Sampling rate" do
|
228
|
-
assert_equal
|
228
|
+
assert_equal 8000, @info.audio_sample_rate
|
229
|
+
assert_equal 8000, @info.audio_sampling_rate
|
230
|
+
assert_equal "8 000 Hz", @info.audio_sampling_rate_before_type_cast
|
229
231
|
end
|
230
232
|
|
231
233
|
test "audio resolution" do
|
data/test/mediainfo_hats_test.rb
CHANGED
@@ -225,7 +225,9 @@ class MediainfoHatsTest < ActiveSupport::TestCase
|
|
225
225
|
end
|
226
226
|
|
227
227
|
test "audio Sampling rate" do
|
228
|
-
assert_equal
|
228
|
+
assert_equal 16000, @info.audio_sample_rate
|
229
|
+
assert_equal 16000, @info.audio_sampling_rate
|
230
|
+
assert_equal "16.0 KHz", @info.audio_sampling_rate_before_type_cast
|
229
231
|
end
|
230
232
|
|
231
233
|
test "audio resolution" do
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "mediainfo_test_helper"
|
3
|
+
|
4
|
+
class MediainfoStringTest < ActiveSupport::TestCase
|
5
|
+
test "escaping slashes" do
|
6
|
+
assert_equal '$\'foo\\\bar\'', 'foo\bar'.shell_escape
|
7
|
+
end
|
8
|
+
|
9
|
+
test "escaping quotes" do
|
10
|
+
assert_equal '$\'foo\\\'bar\'', "foo'bar".shell_escape
|
11
|
+
end
|
12
|
+
end
|
data/test/mediainfo_test.rb
CHANGED
@@ -75,10 +75,31 @@ class MediainfoTest < ActiveSupport::TestCase
|
|
75
75
|
:image_height
|
76
76
|
]
|
77
77
|
|
78
|
-
supported_attributes.each do |attribute|
|
78
|
+
Mediainfo.supported_attributes.each do |attribute|
|
79
79
|
test "supports #{attribute} attribute" do
|
80
|
-
assert
|
80
|
+
assert supported_attributes.include?(attribute),
|
81
81
|
"#{attribute} is not supported"
|
82
82
|
end
|
83
83
|
end
|
84
|
+
|
85
|
+
def setup
|
86
|
+
Mediainfo.default_mediainfo_path!
|
87
|
+
end
|
88
|
+
|
89
|
+
test "retains last system command generated" do
|
90
|
+
m = Mediainfo.new "/dev/null"
|
91
|
+
assert_equal "mediainfo $'/dev/null'", m.last_command
|
92
|
+
end
|
93
|
+
|
94
|
+
test "allows customization of path to mediainfo binary" do
|
95
|
+
Mediainfo.any_instance.stubs(:run_last_command!)
|
96
|
+
|
97
|
+
assert_equal "mediainfo", Mediainfo.path
|
98
|
+
|
99
|
+
Mediainfo.path = "/opt/local/bin/mediainfo"
|
100
|
+
assert_equal "/opt/local/bin/mediainfo", Mediainfo.path
|
101
|
+
|
102
|
+
m = Mediainfo.new "/dev/null"
|
103
|
+
assert_equal "/opt/local/bin/mediainfo $'/dev/null'", m.last_command
|
104
|
+
end
|
84
105
|
end
|
@@ -225,7 +225,9 @@ class MediainfoVimeoTest < ActiveSupport::TestCase
|
|
225
225
|
end
|
226
226
|
|
227
227
|
test "audio Sampling rate" do
|
228
|
-
assert_equal
|
228
|
+
assert_equal 11025, @info.audio_sample_rate
|
229
|
+
assert_equal 11025, @info.audio_sampling_rate
|
230
|
+
assert_equal "11.025 KHz", @info.audio_sampling_rate_before_type_cast
|
229
231
|
end
|
230
232
|
|
231
233
|
test "audio resolution" do
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: greatseth-mediainfo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.3"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seth Thomas Rasmussen
|
@@ -9,19 +9,10 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-20 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: echoe
|
17
|
-
type: :development
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
14
|
+
dependencies: []
|
15
|
+
|
25
16
|
description: ""
|
26
17
|
email: sethrasmussen@gmail.com
|
27
18
|
executables: []
|
@@ -30,22 +21,25 @@ extensions: []
|
|
30
21
|
|
31
22
|
extra_rdoc_files:
|
32
23
|
- lib/mediainfo/attr_readers.rb
|
24
|
+
- lib/mediainfo/string.rb
|
33
25
|
- lib/mediainfo.rb
|
34
26
|
- LICENSE
|
35
27
|
- README.markdown
|
36
28
|
files:
|
37
29
|
- Changelog
|
38
30
|
- lib/mediainfo/attr_readers.rb
|
31
|
+
- lib/mediainfo/string.rb
|
39
32
|
- lib/mediainfo.rb
|
40
33
|
- LICENSE
|
41
34
|
- Manifest
|
35
|
+
- mediainfo.gemspec
|
42
36
|
- Rakefile
|
43
37
|
- README.markdown
|
44
|
-
- mediainfo.gemspec
|
45
38
|
- test/mediainfo_awaywego_encoded_test.rb
|
46
39
|
- test/mediainfo_awaywego_test.rb
|
47
40
|
- test/mediainfo_dinner_test.rb
|
48
41
|
- test/mediainfo_hats_test.rb
|
42
|
+
- test/mediainfo_string_test.rb
|
49
43
|
- test/mediainfo_test.rb
|
50
44
|
- test/mediainfo_vimeo_test.rb
|
51
45
|
- test/mediainfo_vimeoimage_test.rb
|
@@ -86,6 +80,7 @@ test_files:
|
|
86
80
|
- test/mediainfo_awaywego_test.rb
|
87
81
|
- test/mediainfo_dinner_test.rb
|
88
82
|
- test/mediainfo_hats_test.rb
|
83
|
+
- test/mediainfo_string_test.rb
|
89
84
|
- test/mediainfo_test.rb
|
90
85
|
- test/mediainfo_vimeo_test.rb
|
91
86
|
- test/mediainfo_vimeoimage_test.rb
|