mediainfo 1.0.3 → 1.1.0
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 +4 -4
- data/README.md +35 -33
- data/lib/mediainfo/tracks.rb +20 -16
- data/lib/mediainfo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f79256366c735ce9879c75236dfbf2d1c1e8a97ba4fb2e2b0f2b06b260c5392
|
4
|
+
data.tar.gz: 1df3a885f1a7ae5165fb57615c950327fa4847d9b06bdaff072ab97f986632e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 677175108b077cc7f1d421e062cf56498e26d8d48fd1201c5313d76dd2c48ca77b626af1d3a6c7f06ac8a5e37a464d09ee34032409d925b80faff1d0fbd220da
|
7
|
+
data.tar.gz: a582fb423b5585d8611af76742e676d2bfbd214e82559e79bad899b7752cbfec81207137864aca7b8695671e61b6e683090ce6edee912ca7934506ba7ad24954
|
data/README.md
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
MediaInfo is a class wrapping [the mediainfo CLI](http://mediainfo.sourceforge.net).
|
4
4
|
|
5
5
|
## Installation
|
6
|
-
|
6
|
+
|
7
7
|
$ gem install mediainfo
|
8
|
-
|
8
|
+
|
9
9
|
## Usage
|
10
10
|
|
11
11
|
#### Parsing raw XML
|
@@ -16,28 +16,28 @@ MediaInfo is a class wrapping [the mediainfo CLI](http://mediainfo.sourceforge.n
|
|
16
16
|
media_info = MediaInfo.from('http://techslides.com/demos/sample-videos/small.mp4')
|
17
17
|
|
18
18
|
You can specify an alternate path for the MediaInfo Binary:
|
19
|
-
|
19
|
+
|
20
20
|
ENV['MEDIAINFO_PATH'] = "/opt/local/bin/mediainfo"
|
21
|
-
|
21
|
+
|
22
22
|
Once you have an MediaInfo object, you can start inspecting tracks:
|
23
|
-
|
23
|
+
|
24
24
|
media_info.track_types => ['general','video','audio']
|
25
25
|
media_info.track_types.count => 3
|
26
26
|
media_info.video? => true
|
27
27
|
media_info.image? => nil
|
28
28
|
media_info.image.filesize => MethodNotFound exception
|
29
|
-
|
30
|
-
When inspecting specific types of tracks, you have a couple general API options. The
|
31
|
-
first approach assumes one track of a given type, a common scenario in many video files,
|
29
|
+
|
30
|
+
When inspecting specific types of tracks, you have a couple general API options. The
|
31
|
+
first approach assumes one track of a given type, a common scenario in many video files,
|
32
32
|
for example:
|
33
|
-
|
33
|
+
|
34
34
|
media_info.video.count => 1
|
35
35
|
media_info.video.duration => 120 (seconds)
|
36
|
-
|
36
|
+
|
37
37
|
Sometimes you'll have more than one track of a given type:
|
38
38
|
- The first track type name, or any track type with <ID>1</ID> will not contain '1'
|
39
|
-
|
40
|
-
|
39
|
+
|
40
|
+
|
41
41
|
media_info.track_types => ['general','video','video2','audio','other','other2']
|
42
42
|
media_info.track_types.count => 5
|
43
43
|
media_info.video? => true
|
@@ -54,14 +54,14 @@ Sometimes you'll have more than one track of a given type:
|
|
54
54
|
media_info.video.encoded_date.class => Time
|
55
55
|
media_info.video2.duration.class => Integer
|
56
56
|
media_info.video.display_aspect_ratio.class => Float
|
57
|
-
|
57
|
+
|
58
58
|
- Any track attribute name with "date" and matching /\d-/ will be converted using Time.parse:
|
59
59
|
|
60
|
-
|
60
|
+
|
61
61
|
media_info.video.encoded_date => 2018-03-30 12:12:08 -0400
|
62
62
|
media_info.video.customdate => 2016-02-10 01:00:00 -0600
|
63
|
-
|
64
|
-
- .duration and .overall_duration will be returned as milliseconds AS LONG AS the Duration and Overall_Duration match one of the expected units:
|
63
|
+
|
64
|
+
- .duration and .overall_duration will be returned as milliseconds AS LONG AS the Duration and Overall_Duration match one of the expected units (each separated by a space or not):
|
65
65
|
- h (\<Duration>15h\</Duration>) (hour)
|
66
66
|
- hour (\<Duration>15hour\</Duration>)
|
67
67
|
- mn (\<Duration>15hour 6mn\</Duration>) (minute)
|
@@ -70,25 +70,27 @@ Sometimes you'll have more than one track of a given type:
|
|
70
70
|
- s (\<Duration>15hour 6min 59s\</Duration>) (second)
|
71
71
|
- sec (\<Duration>15hour 6min 59sec\</Duration>) (second)
|
72
72
|
- ms (\<Duration>15hour 6min 59sec 301ms\</Duration>) (milliseconds)
|
73
|
+
- in the form of a Float (as for iphone mov files)
|
73
74
|
- [Submit an issue to add more!](https://github.com/greatseth/mediainfo/issues)
|
74
|
-
|
75
|
-
|
76
|
-
media_info.video.duration =>
|
77
|
-
media_info.video.duration =>
|
75
|
+
|
76
|
+
|
77
|
+
media_info.video.duration => 15164 (\<Duration>15s 164ms\</Duration>)
|
78
|
+
media_info.video.duration => 36286 (\<Duration>36s 286ms\</Duration>)
|
79
|
+
media_info.video.duration => 123456 (\<Duration>123.456\</Duration>)
|
78
80
|
|
79
81
|
- We standardize the naming of several Attributes:
|
80
82
|
- You can review lib/attribute_standardization_rules.yml to see them all
|
81
|
-
|
83
|
+
|
82
84
|
|
83
85
|
media_info.video.bit_rate => nil (\<Bit_rate>41.2 Mbps\</Bit_rate>)
|
84
86
|
media_info.video.bitrate => "41.2 Mbps" (\<Bit_rate>41.2 Mbps\</Bit_rate>)
|
85
87
|
media_info.general.filesize => "11.5 MiB" (\<File_size>11.5 MiB\</File_size>
|
86
88
|
|
87
|
-
|
89
|
+
|
88
90
|
In order to support all possible MediaInfo variations, you may see the following situation:
|
89
91
|
|
90
92
|
media_info.track_types => ['general','video','video5','audio','other','other2']
|
91
|
-
|
93
|
+
|
92
94
|
The track type media_info.video5 is available, but no video2, 3, and 4. This is because the MediaInfo from the video has:
|
93
95
|
|
94
96
|
<track type="Video">
|
@@ -99,7 +101,7 @@ The track type media_info.video5 is available, but no video2, 3, and 4. This is
|
|
99
101
|
...
|
100
102
|
|
101
103
|
*The ID will take priority for labeling.* Else if no ID exists, you'll see consecutive numbering for duplicate tracks in the Media.
|
102
|
-
|
104
|
+
|
103
105
|
Any second level attributes are also available:
|
104
106
|
|
105
107
|
MediaInfo.from('~/Desktop/test.mov').general.extra
|
@@ -110,17 +112,17 @@ Any second level attributes are also available:
|
|
110
112
|
@com_apple_quicktime_model=0,
|
111
113
|
@com_apple_quicktime_software=11.2>
|
112
114
|
|
113
|
-
REXML is used as the XML parser by default. If you'd like, you can
|
115
|
+
REXML is used as the XML parser by default. If you'd like, you can
|
114
116
|
configure Mediainfo to use Nokogiri instead:
|
115
117
|
|
116
|
-
* define the `MEDIAINFO_XML_PARSER` environment variable to be the
|
117
|
-
name of the parser as you'd pass to a :gem or :require call.
|
118
|
-
|
118
|
+
* define the `MEDIAINFO_XML_PARSER` environment variable to be the
|
119
|
+
name of the parser as you'd pass to a :gem or :require call.
|
120
|
+
|
119
121
|
e.g. `export MEDIAINFO_XML_PARSER=nokogiri`
|
120
|
-
|
121
|
-
Once you've got an instance setup, you can call numerous methods to get
|
122
|
-
a variety of information about a file. Some attributes may be present
|
123
|
-
for some files where others are not, but any supported attribute
|
122
|
+
|
123
|
+
Once you've got an instance setup, you can call numerous methods to get
|
124
|
+
a variety of information about a file. Some attributes may be present
|
125
|
+
for some files where others are not, but any supported attribute
|
124
126
|
should at least return `nil`.
|
125
127
|
|
126
128
|
## Requirements
|
@@ -136,4 +138,4 @@ should at least return `nil`.
|
|
136
138
|
* Ned Campion - [http://github.com/nedcampion](http://github.com/nedcampion)
|
137
139
|
* Daniel Jagszent - [http://github.com/d--j](http://github.com/d--j)
|
138
140
|
* Robert Mrasek - [http://github.com/derobo](http://github.com/derobo)
|
139
|
-
* Nathan Pierce - [http://github.com/NorseGaud](http://github.com/NorseGaud)
|
141
|
+
* Nathan Pierce - [http://github.com/NorseGaud](http://github.com/NorseGaud)
|
data/lib/mediainfo/tracks.rb
CHANGED
@@ -119,23 +119,27 @@ module MediaInfo
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def self.standardize_to_milliseconds(value)
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
when /\d+\s?
|
131
|
-
when /\d+\s?
|
132
|
-
when /\d+\s?
|
133
|
-
when /\d+\s?
|
134
|
-
|
135
|
-
end
|
122
|
+
return standardize_float_to_milliseconds(value.to_f) if value.to_f.to_s == value.to_s
|
123
|
+
return standardize_string_to_milliseconds(value)
|
124
|
+
value
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.standardize_string_to_milliseconds(v, base_msec = 0)
|
128
|
+
v.scan(/\d+\s?\D+/).each do |chunk|
|
129
|
+
base_msec += case chunk
|
130
|
+
when /\d+\s?ms/ then chunk.to_i
|
131
|
+
when /\d+\s?s(ec)?/ then chunk.to_i * 1000
|
132
|
+
when /\d+\s?m(i?n)?/ then chunk.to_i * 60 * 1000
|
133
|
+
when /\d+\s?h(our)?/ then chunk.to_i * 60 * 60 * 1000
|
134
|
+
end.to_i
|
136
135
|
end
|
137
|
-
|
138
|
-
|
136
|
+
# We don't raise anymore. It's much better for the gem to work,
|
137
|
+
# returning the original MediaInfo attribute, than raise.
|
138
|
+
base_msec == 0 ? v : base_msec
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.standardize_float_to_milliseconds(v)
|
142
|
+
(v*1000).to_i
|
139
143
|
end
|
140
144
|
|
141
145
|
end
|
data/lib/mediainfo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mediainfo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seth Thomas Rasmussen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|