mediainfo 0.7.2 → 1.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/.rspec +3 -0
- data/Changelog +19 -3
- data/GemFile +5 -0
- data/LICENSE +5 -14
- data/README.md +140 -0
- data/Rakefile +4 -61
- data/lib/attribute_standardization_rules.yml +18 -0
- data/lib/mediainfo.rb +85 -497
- data/lib/mediainfo/errors.rb +14 -0
- data/lib/mediainfo/string.rb +0 -10
- data/lib/mediainfo/tracks.rb +172 -0
- data/lib/mediainfo/version.rb +3 -0
- data/mediainfo.gemspec +22 -19
- metadata +96 -69
- data/Manifest +0 -10
- data/README.markdown +0 -84
- data/index.html.template +0 -9
- data/lib/mediainfo/attr_readers.rb +0 -75
- data/test/mediainfo_awaywego_test.rb +0 -284
- data/test/mediainfo_broken_embraces_test.rb +0 -264
- data/test/mediainfo_dinner_test.rb +0 -262
- data/test/mediainfo_hats_test.rb +0 -254
- data/test/mediainfo_multiple_streams_test.rb +0 -526
- data/test/mediainfo_omen_image_test.rb +0 -232
- data/test/mediainfo_string_test.rb +0 -20
- data/test/mediainfo_subtilte_test.rb +0 -44
- data/test/mediainfo_test.rb +0 -152
- data/test/mediainfo_vimeo_test.rb +0 -262
- data/test/test_helper.rb +0 -19
data/Manifest
DELETED
data/README.markdown
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
# Mediainfo
|
2
|
-
|
3
|
-
Mediainfo is a class wrapping [the mediainfo CLI](http://mediainfo.sourceforge.net).
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
$ gem install mediainfo
|
8
|
-
|
9
|
-
## Usage
|
10
|
-
|
11
|
-
info = Mediainfo.new "/path/to/file"
|
12
|
-
|
13
|
-
That will issue the system call to `mediainfo` and parse the output.
|
14
|
-
You can specify an alternate path if necessary:
|
15
|
-
|
16
|
-
Mediainfo.path = "/opt/local/bin/mediainfo"
|
17
|
-
|
18
|
-
Once you have an info object, you can start inspecting streams and general metadata.
|
19
|
-
|
20
|
-
info.streams.count # 2
|
21
|
-
info.audio? # true
|
22
|
-
info.video? # true
|
23
|
-
info.image? # false
|
24
|
-
|
25
|
-
When inspecting specific types of streams, you have a couple general API options. The
|
26
|
-
first approach assumes one stream of a given type, a common scenario in many video files,
|
27
|
-
for example.
|
28
|
-
|
29
|
-
info.video.count # 1
|
30
|
-
info.audio.count # 1
|
31
|
-
info.video.duration # 120 (seconds)
|
32
|
-
|
33
|
-
Sometimes you'll have more than one stream of a given type. Quicktime files can often
|
34
|
-
contain artifacts like this from somebody editing a more 'normal' file.
|
35
|
-
|
36
|
-
info = Mediainfo.new "funky.mov"
|
37
|
-
|
38
|
-
info.video? # true
|
39
|
-
info.video.count # 2
|
40
|
-
info.video.duration # raises SingleStreamAPIError !
|
41
|
-
info.video[0].duration # 120
|
42
|
-
info.video[1].duration # 10
|
43
|
-
|
44
|
-
For some more usage examples, please see the very reasonable test suite accompanying the source code
|
45
|
-
for this library. It contains a bunch of relevant usage examples. More docs in the future.. contributions
|
46
|
-
*very* welcome!
|
47
|
-
|
48
|
-
Moving on, REXML is used as the XML parser by default. If you'd like, you can
|
49
|
-
configure Mediainfo to use Hpricot or Nokogiri instead using one of
|
50
|
-
the following approaches:
|
51
|
-
|
52
|
-
* define the `MEDIAINFO_XML_PARSER` environment variable to be the
|
53
|
-
name of the parser as you'd pass to a :gem or :require call.
|
54
|
-
|
55
|
-
e.g. `export MEDIAINFO_XML_PARSER=nokogiri`
|
56
|
-
|
57
|
-
* assign to Mediainfo.xml_parser after you've loaded the gem,
|
58
|
-
following the same naming conventions mentioned previously.
|
59
|
-
|
60
|
-
e.g. `Mediainfo.xml_parser = "hpricot"`
|
61
|
-
|
62
|
-
|
63
|
-
Once you've got an instance setup, you can call numerous methods to get
|
64
|
-
a variety of information about a file. Some attributes may be present
|
65
|
-
for some files where others are not, but any supported attribute
|
66
|
-
should at least return `nil`.
|
67
|
-
|
68
|
-
## Requirements
|
69
|
-
|
70
|
-
This requires at least the following version of the Mediainfo CLI:
|
71
|
-
|
72
|
-
MediaInfo Command line,
|
73
|
-
MediaInfoLib - v0.7.25
|
74
|
-
|
75
|
-
Previous versions of this gem(<= 0.5.1) worked against v0.7.11, which did not
|
76
|
-
generate XML output, and is no longer supported.
|
77
|
-
|
78
|
-
## Contributors
|
79
|
-
|
80
|
-
* Seth Thomas Rasmussen - [http://greatseth.com](http://greatseth.com)
|
81
|
-
* Peter Vandenberk - [http://github.com/pvdb](http://github.com/pvdb)
|
82
|
-
* Ned Campion - [http://github.com/nedcampion](http://github.com/nedcampion)
|
83
|
-
* Daniel Jagszent - [http://github.com/d--j](http://github.com/d--j)
|
84
|
-
* Robert Mrasek - [http://github.com/derobo](http://github.com/derobo)
|
data/index.html.template
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
-
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
-
<head>
|
5
|
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
6
|
-
<title>mediainfo</title>
|
7
|
-
</head>
|
8
|
-
<body>body</body>
|
9
|
-
</html>
|
@@ -1,75 +0,0 @@
|
|
1
|
-
require "time"
|
2
|
-
require "mediainfo/string"
|
3
|
-
|
4
|
-
class Mediainfo
|
5
|
-
module AttrReaders
|
6
|
-
def mediainfo_attr_reader(method_name, mediainfo_key = nil)
|
7
|
-
# NOTE explicit self necessary here until we rename local var 'name'
|
8
|
-
stream_class_type = name[/::([^:]+)Stream$/, 1]
|
9
|
-
|
10
|
-
before_type_cast_method_name = "#{method_name}_before_type_cast"
|
11
|
-
mediainfo_key = mediainfo_key.gsub(/\W+/, "_").downcase if mediainfo_key
|
12
|
-
|
13
|
-
if m = stream_class_type.match(/^#{Regexp.union *Mediainfo::NON_GENERAL_SECTIONS.map { |x| x.to_s.capitalize }}$/)
|
14
|
-
k1 = stream_class_type.downcase.to_sym
|
15
|
-
else
|
16
|
-
k1 = :general
|
17
|
-
end
|
18
|
-
|
19
|
-
define_method before_type_cast_method_name do
|
20
|
-
if v = instance_variable_get("@#{before_type_cast_method_name}")
|
21
|
-
v
|
22
|
-
else
|
23
|
-
k2 = mediainfo_key ? mediainfo_key : method_name.to_s
|
24
|
-
v = @parsed_response[k1][k2]
|
25
|
-
|
26
|
-
instance_variable_set "@#{before_type_cast_method_name}", v
|
27
|
-
instance_variable_get "@#{before_type_cast_method_name}"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
define_method method_name do
|
32
|
-
if v = instance_variable_get("@#{method_name}")
|
33
|
-
v
|
34
|
-
else
|
35
|
-
v = send(before_type_cast_method_name)
|
36
|
-
v = yield v if v and block_given?
|
37
|
-
|
38
|
-
instance_variable_set "@#{method_name}", v
|
39
|
-
instance_variable_get "@#{method_name}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
supported_attribute = method_name
|
44
|
-
supported_attribute = "#{stream_class_type.downcase}_#{method_name}".to_sym unless k1 == :general
|
45
|
-
Mediainfo.supported_attributes << supported_attribute
|
46
|
-
end
|
47
|
-
|
48
|
-
def mediainfo_duration_reader(*a)
|
49
|
-
mediainfo_attr_reader *a do |v|
|
50
|
-
t = 0
|
51
|
-
v.split(/\s+/).each do |tf|
|
52
|
-
case tf
|
53
|
-
# XXX haven't actually seen hot they represent hours yet
|
54
|
-
# but hopefully this is ok.. :\
|
55
|
-
when /\d+h/ then t += tf.to_i * 60 * 60 * 1000
|
56
|
-
when /\d+mn/ then t += tf.to_i * 60 * 1000
|
57
|
-
when /\d+ms/ then t += tf.to_i
|
58
|
-
when /\d+s/ then t += tf.to_i * 1000
|
59
|
-
else
|
60
|
-
raise "unexpected time fragment! please report bug!"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
t
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def mediainfo_date_reader(*a)
|
68
|
-
mediainfo_attr_reader(*a) { |v| Time.parse v }
|
69
|
-
end
|
70
|
-
|
71
|
-
def mediainfo_int_reader(*a)
|
72
|
-
mediainfo_attr_reader(*a) { |v| v.gsub(/\D+/, "").to_i }
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
@@ -1,284 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
require "mediainfo_test_helper"
|
3
|
-
|
4
|
-
class MediainfoAwaywegoTest < ActiveSupport::TestCase
|
5
|
-
def setup
|
6
|
-
@info = mediainfo_mock "AwayWeGo_24fps.mov"
|
7
|
-
end
|
8
|
-
|
9
|
-
### GENERAL
|
10
|
-
|
11
|
-
test "audio?" do
|
12
|
-
assert @info.audio?
|
13
|
-
end
|
14
|
-
|
15
|
-
test "video?" do
|
16
|
-
assert @info.video?
|
17
|
-
end
|
18
|
-
|
19
|
-
test "format" do
|
20
|
-
assert_equal "MPEG-4", @info.format
|
21
|
-
end
|
22
|
-
|
23
|
-
test "format profile" do
|
24
|
-
assert_equal "QuickTime", @info.format_profile
|
25
|
-
end
|
26
|
-
|
27
|
-
test "codec id" do
|
28
|
-
assert_equal "qt", @info.codec_id
|
29
|
-
end
|
30
|
-
|
31
|
-
mediainfo_test_size
|
32
|
-
|
33
|
-
test "duration" do
|
34
|
-
assert_equal 36286, @info.duration
|
35
|
-
assert_equal "36s 286ms", @info.duration_before_type_cast
|
36
|
-
end
|
37
|
-
|
38
|
-
test "overall bitrate" do
|
39
|
-
assert_equal "42.7 Mbps", @info.overall_bit_rate
|
40
|
-
end
|
41
|
-
|
42
|
-
test "encoded date" do
|
43
|
-
assert_kind_of Time, @info.encoded_date
|
44
|
-
# assert_equal "UTC 2009-03-30 19:49:13", @info.encoded_date
|
45
|
-
end
|
46
|
-
|
47
|
-
test "tagged date" do
|
48
|
-
assert_kind_of Time, @info.tagged_date
|
49
|
-
# assert_equal "UTC 2009-03-30 19:57:57", @info.tagged_date
|
50
|
-
end
|
51
|
-
|
52
|
-
test "writing application" do
|
53
|
-
assert_nil @info.writing_application
|
54
|
-
end
|
55
|
-
|
56
|
-
test "writing library" do
|
57
|
-
assert_equal "Apple QuickTime", @info.writing_library
|
58
|
-
end
|
59
|
-
|
60
|
-
### VIDEO
|
61
|
-
|
62
|
-
test "video stream id" do
|
63
|
-
assert_equal "2", @info.video.stream_id
|
64
|
-
end
|
65
|
-
|
66
|
-
test "video Format" do
|
67
|
-
assert_equal "AVC", @info.video.format
|
68
|
-
end
|
69
|
-
|
70
|
-
test "video format profile" do
|
71
|
-
assert_equal "Main@L4.1", @info.video.format_profile
|
72
|
-
end
|
73
|
-
|
74
|
-
test "video format version" do
|
75
|
-
assert_nil @info.video.format_version
|
76
|
-
end
|
77
|
-
|
78
|
-
test "video format settings Matrix" do
|
79
|
-
assert_nil @info.video.format_settings_matrix
|
80
|
-
end
|
81
|
-
|
82
|
-
test "video format settings CABAC" do
|
83
|
-
assert_equal "No", @info.video.format_settings_cabac
|
84
|
-
end
|
85
|
-
|
86
|
-
test "video format settings ReFrames" do
|
87
|
-
assert_equal "2 frames", @info.video.format_settings_reframes
|
88
|
-
end
|
89
|
-
|
90
|
-
test "video Codec ID" do
|
91
|
-
assert_equal "avc1", @info.video.codec_id
|
92
|
-
end
|
93
|
-
|
94
|
-
test "video codec info" do
|
95
|
-
assert_equal "Advanced Video Coding", @info.video.codec_info
|
96
|
-
end
|
97
|
-
|
98
|
-
test "video Duration" do
|
99
|
-
assert_equal 36286, @info.video.duration
|
100
|
-
assert_equal "36s 286ms", @info.video.duration_before_type_cast
|
101
|
-
end
|
102
|
-
|
103
|
-
test "video bit rate mode" do
|
104
|
-
assert_equal "Variable", @info.video.bit_rate_mode
|
105
|
-
assert @info.video.vbr?
|
106
|
-
assert !@info.video.cbr?
|
107
|
-
end
|
108
|
-
|
109
|
-
test "video Bit rate" do
|
110
|
-
assert_equal "41.2 Mbps", @info.video.bit_rate
|
111
|
-
end
|
112
|
-
|
113
|
-
test "video nominal bit rate" do
|
114
|
-
assert_nil @info.video.nominal_bit_rate
|
115
|
-
end
|
116
|
-
|
117
|
-
test "frame size" do
|
118
|
-
assert_equal "1920x840", @info.video.frame_size
|
119
|
-
end
|
120
|
-
|
121
|
-
test "video Width" do
|
122
|
-
assert_equal 1920, @info.video.width
|
123
|
-
end
|
124
|
-
|
125
|
-
test "video Height" do
|
126
|
-
assert_equal 840, @info.video.height
|
127
|
-
end
|
128
|
-
|
129
|
-
test "video Display aspect ratio" do
|
130
|
-
assert_equal "2.25:1", @info.video.display_aspect_ratio
|
131
|
-
end
|
132
|
-
|
133
|
-
test "video frame rate" do
|
134
|
-
assert_equal "23.976 fps", @info.video.frame_rate
|
135
|
-
assert_equal 23.976, @info.video.fps
|
136
|
-
assert_equal 23.976, @info.video.framerate
|
137
|
-
end
|
138
|
-
|
139
|
-
test "video frame rate mode" do
|
140
|
-
assert_equal "Constant", @info.video.frame_rate_mode
|
141
|
-
end
|
142
|
-
|
143
|
-
test "video Resolution" do
|
144
|
-
assert_equal 24, @info.video.resolution
|
145
|
-
assert_equal "24 bits", @info.video.resolution_before_type_cast
|
146
|
-
end
|
147
|
-
|
148
|
-
test "video colorimetry" do
|
149
|
-
assert_equal "4:2:0", @info.video.colorimetry
|
150
|
-
assert_equal "4:2:0", @info.video.colorspace
|
151
|
-
end
|
152
|
-
|
153
|
-
test "video Scan type" do
|
154
|
-
assert_equal "Progressive", @info.video.scan_type
|
155
|
-
assert !@info.video.interlaced?
|
156
|
-
assert @info.video.progressive?
|
157
|
-
end
|
158
|
-
|
159
|
-
test "video scan order" do
|
160
|
-
assert_nil @info.video.scan_order
|
161
|
-
end
|
162
|
-
|
163
|
-
test "video Bits/(Pixel*Frame)" do
|
164
|
-
assert_equal "1.065", @info.video.bits_pixel_frame
|
165
|
-
end
|
166
|
-
|
167
|
-
test "video Stream size" do
|
168
|
-
assert_equal "178 MiB (96%)", @info.video.stream_size
|
169
|
-
end
|
170
|
-
|
171
|
-
test "video encoded date" do
|
172
|
-
assert_kind_of Time, @info.video.encoded_date
|
173
|
-
end
|
174
|
-
|
175
|
-
test "video tagged date" do
|
176
|
-
assert_kind_of Time, @info.video.tagged_date
|
177
|
-
end
|
178
|
-
|
179
|
-
test "video color primaries" do
|
180
|
-
assert_equal \
|
181
|
-
"BT.709-5, BT.1361, IEC 61966-2-4, SMPTE RP177",
|
182
|
-
@info.video.color_primaries
|
183
|
-
end
|
184
|
-
|
185
|
-
test "video transfer characteristics" do
|
186
|
-
assert_equal "BT.709-5, BT.1361", @info.video.transfer_characteristics
|
187
|
-
end
|
188
|
-
|
189
|
-
test "video matrix coefficients" do
|
190
|
-
assert_equal \
|
191
|
-
"BT.709-5, BT.1361, IEC 61966-2-4 709, SMPTE RP177",
|
192
|
-
@info.video.matrix_coefficients
|
193
|
-
end
|
194
|
-
|
195
|
-
### AUDIO
|
196
|
-
|
197
|
-
test "audio stream id" do
|
198
|
-
assert_equal "1", @info.audio.stream_id
|
199
|
-
end
|
200
|
-
|
201
|
-
test "audio Format" do
|
202
|
-
assert_equal "PCM", @info.audio.format
|
203
|
-
end
|
204
|
-
|
205
|
-
test "audio format info" do
|
206
|
-
assert_nil @info.audio.format_info
|
207
|
-
end
|
208
|
-
|
209
|
-
test "audio Format settings, Endianness" do
|
210
|
-
assert_equal "Little", @info.audio.format_settings_endianness
|
211
|
-
end
|
212
|
-
|
213
|
-
test "audio Format settings, Sign" do
|
214
|
-
assert_equal "Signed", @info.audio.format_settings_sign
|
215
|
-
end
|
216
|
-
|
217
|
-
test "audio Codec ID" do
|
218
|
-
assert_equal "sowt", @info.audio.codec_id
|
219
|
-
end
|
220
|
-
|
221
|
-
test "audio Codec ID/Info" do
|
222
|
-
assert_nil @info.audio.codec_info
|
223
|
-
end
|
224
|
-
|
225
|
-
test "audio Duration" do
|
226
|
-
assert_equal 36286, @info.audio.duration
|
227
|
-
assert_equal "36s 286ms", @info.audio.duration_before_type_cast
|
228
|
-
end
|
229
|
-
|
230
|
-
test "audio Bit rate mode" do
|
231
|
-
assert_equal "Constant", @info.audio.bit_rate_mode
|
232
|
-
end
|
233
|
-
|
234
|
-
test "audio Bit rate" do
|
235
|
-
assert_equal "1 536 Kbps", @info.audio.bit_rate
|
236
|
-
end
|
237
|
-
|
238
|
-
test "audio Channel(s)" do
|
239
|
-
assert_equal 2, @info.audio.channels
|
240
|
-
end
|
241
|
-
|
242
|
-
test "audio channel positions" do
|
243
|
-
assert_nil @info.audio.channel_positions
|
244
|
-
end
|
245
|
-
|
246
|
-
test "stereo?" do
|
247
|
-
assert @info.audio.stereo?
|
248
|
-
end
|
249
|
-
|
250
|
-
test "mono?" do
|
251
|
-
assert !@info.audio.mono?
|
252
|
-
end
|
253
|
-
|
254
|
-
test "audio Sampling rate" do
|
255
|
-
assert_equal 48000, @info.audio.sample_rate
|
256
|
-
assert_equal 48000, @info.audio.sampling_rate
|
257
|
-
assert_equal "48.0 KHz", @info.audio.sampling_rate_before_type_cast
|
258
|
-
end
|
259
|
-
|
260
|
-
test "audio resolution" do
|
261
|
-
assert_equal 16, @info.audio.resolution
|
262
|
-
assert_equal "16 bits", @info.audio.resolution_before_type_cast
|
263
|
-
end
|
264
|
-
|
265
|
-
test "audio Stream size" do
|
266
|
-
assert_equal "6.64 MiB (4%)", @info.audio.stream_size
|
267
|
-
end
|
268
|
-
|
269
|
-
test "audio Interleave, duration" do
|
270
|
-
assert_nil @info.audio.interleave_duration
|
271
|
-
end
|
272
|
-
|
273
|
-
test "audio encoded date" do
|
274
|
-
assert_kind_of Time, @info.audio.encoded_date
|
275
|
-
end
|
276
|
-
|
277
|
-
test "audio tagged date" do
|
278
|
-
assert_kind_of Time, @info.audio.tagged_date
|
279
|
-
end
|
280
|
-
|
281
|
-
### IMAGE
|
282
|
-
|
283
|
-
mediainfo_test_not_an_image
|
284
|
-
end
|