ogginfo-rb 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ogginfo-rb.rb +40 -12
- metadata +1 -1
data/lib/ogginfo-rb.rb
CHANGED
@@ -1,19 +1,26 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-600004.2
|
1
|
+
# This code is distributed under the terms of the Ruby license.
|
2
|
+
# See README for information on using ogginfo-rb.
|
4
3
|
|
5
4
|
require 'stringio'
|
6
5
|
|
7
6
|
module Ogg
|
7
|
+
# See README for usage information.
|
8
8
|
class Info
|
9
9
|
attr_reader :comments
|
10
10
|
attr_reader :duration, :sample_rate, :nominal_bitrate, :channels, :bitrate
|
11
11
|
|
12
12
|
def initialize path
|
13
|
+
raise ArgumentError.new "Argument is not a string" unless path.respond_to? :to_str
|
14
|
+
|
15
|
+
raise Ogg::ReadError.new "File does not exist" unless File.exists? path
|
13
16
|
file = File.new(path.to_str, 'rb')
|
17
|
+
raise Ogg::ReadError.new "File is empty" if file.stat.size == 0
|
18
|
+
|
19
|
+
first_page = Page.find_page(file)
|
20
|
+
raise Ogg::ReadError.new "File does not contain valid Ogg data" unless first_page
|
14
21
|
|
15
22
|
# Identification header
|
16
|
-
id_packet = Vorbis::IdentificationHeaderPacket.new(
|
23
|
+
id_packet = Vorbis::IdentificationHeaderPacket.new(first_page)
|
17
24
|
@sample_rate = id_packet.audio_sample_rate
|
18
25
|
@nominal_bitrate = id_packet.bitrate_nominal
|
19
26
|
@channels = id_packet.audio_channels
|
@@ -39,6 +46,8 @@ module Ogg
|
|
39
46
|
file.close
|
40
47
|
end
|
41
48
|
|
49
|
+
# Get information about the Ogg file at the path specified. An Ogg::Info
|
50
|
+
# object is returned and also passed to the block if one is provided.
|
42
51
|
def self.open(path)
|
43
52
|
info = Ogg::Info.new(path)
|
44
53
|
yield info if block_given?
|
@@ -47,19 +56,33 @@ module Ogg
|
|
47
56
|
|
48
57
|
private
|
49
58
|
def calculate_duration file
|
50
|
-
|
51
|
-
|
59
|
+
if file.stat.size > 5000
|
60
|
+
# This seek is a dirty performance hack (saves reading whole file)
|
61
|
+
file.seek(-5000, IO::SEEK_END)
|
62
|
+
else
|
63
|
+
file.rewind
|
64
|
+
end
|
65
|
+
|
52
66
|
# Find last page
|
53
67
|
pg = page = Page.find_page(file)
|
54
68
|
while pg
|
55
69
|
page = pg
|
56
70
|
pg = pg.next_page
|
57
71
|
end
|
58
|
-
|
72
|
+
|
73
|
+
# Duration is last granule position divided by sample rate
|
59
74
|
return page.granule_position.to_f / @sample_rate
|
60
75
|
end
|
61
76
|
end
|
62
77
|
|
78
|
+
# This is a superclass for all custom defined Ogg errors
|
79
|
+
class Error < StandardError
|
80
|
+
end
|
81
|
+
|
82
|
+
# This error is raised when there is a problem reading the file
|
83
|
+
class ReadError < Error
|
84
|
+
end
|
85
|
+
|
63
86
|
class Page
|
64
87
|
CAPTURE = 'OggS'
|
65
88
|
|
@@ -129,11 +152,14 @@ module Ogg
|
|
129
152
|
return @last_page.next_page
|
130
153
|
end
|
131
154
|
end
|
132
|
-
|
155
|
+
|
156
|
+
# This module specifies packets typically found in Vorbis audio files.
|
133
157
|
module Vorbis
|
134
|
-
|
135
|
-
|
158
|
+
# This class forms a basis for other Vorbis header packets.
|
159
|
+
# See http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-610004.2.1
|
136
160
|
class HeaderPacket < Ogg::Packet
|
161
|
+
attr_reader :packet_type
|
162
|
+
|
137
163
|
def initialize page
|
138
164
|
super
|
139
165
|
|
@@ -144,7 +170,8 @@ module Ogg
|
|
144
170
|
end
|
145
171
|
end
|
146
172
|
end
|
147
|
-
|
173
|
+
|
174
|
+
# See http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-620004.2.2
|
148
175
|
class IdentificationHeaderPacket < HeaderPacket
|
149
176
|
attr_reader :vorbis_version, :audio_channels, :audio_sample_rate
|
150
177
|
attr_reader :bitrate_maximum, :bitrate_nominal, :bitrate_minimum
|
@@ -161,7 +188,8 @@ module Ogg
|
|
161
188
|
blocksizes = @data.read(1).unpack('C').first
|
162
189
|
end
|
163
190
|
end
|
164
|
-
|
191
|
+
|
192
|
+
# See http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-630004.2.3
|
165
193
|
class CommentHeaderPacket < HeaderPacket
|
166
194
|
attr_reader :comments, :vendor_string
|
167
195
|
|