ruby-ogginfo 0.6.13 → 0.7
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/History.txt +5 -0
- data/Manifest.txt +4 -1
- data/README.txt +1 -0
- data/Rakefile +12 -0
- data/lib/ogg.rb +1 -1
- data/lib/ogg/codecs/opus.rb +39 -0
- data/lib/ogg/codecs/speex.rb +2 -2
- data/lib/ogg/codecs/vorbis.rb +1 -1
- data/lib/ogginfo.rb +27 -2
- data/test/fixtures.yml +1139 -0
- data/test/test_helper.rb +11 -0
- data/test/test_ruby-ogginfo.rb +48 -129
- data/test/test_ruby-othercodecs.rb +48 -0
- metadata +9 -4
- data/test/test_ruby-spxinfo.rb +0 -110
data/test/test_helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require "yaml"
|
2
|
+
require "tempfile"
|
3
|
+
|
4
|
+
def load_fixtures
|
5
|
+
fixtures = YAML::load_file(File.join(File.dirname(__FILE__), "fixtures.yml"))
|
6
|
+
fixtures.each_with_object({}) do |(codec, content), hash|
|
7
|
+
f = File.join(Dir.tmpdir, "/test.ruby-ogginfo.#{codec}")
|
8
|
+
File.binwrite(f, content)
|
9
|
+
hash[codec] = f
|
10
|
+
end
|
11
|
+
end
|
data/test/test_ruby-ogginfo.rb
CHANGED
@@ -7,136 +7,38 @@ require "test/unit"
|
|
7
7
|
require "ogginfo"
|
8
8
|
require "fileutils"
|
9
9
|
require "tempfile"
|
10
|
-
|
11
|
-
VALID_OGG = <<EOF
|
12
|
-
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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
|
48
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
49
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
50
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
51
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
52
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
53
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
54
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
55
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
56
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
57
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
58
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
59
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
60
|
-
AAAAAAAAAAAAAAAAgAAAgAAHAIAAC6HQkBUBQJwAgMFxLAsAABxJ0iwAAHAk
|
61
|
-
S9MAAMDSNFEEAABL00QRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
62
|
-
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAMCAAwBAgAll
|
63
|
-
oNCQlQBAFACAQTE8DWBZAMsCaBpA0wCeB/A8gCgCAAEAAAUOAAABNmhKLA5Q
|
64
|
-
aMhKACAKAMCgKJZlWZ4HTdM0UYSmaZooQtM0TxShaZomihBFzzNNeKLnmSZM
|
65
|
-
UxRNE4iiaQoAAChwAAAIsEFTYnGAQkNWAgAhAQAGR7EsT/M8zxNF01RVaJrn
|
66
|
-
iaIoiqZpqio0zfNEURRN0zRVFZrmeaIoiqapqqoKTfM8URRF01RVVYXniaIo
|
67
|
-
mqZpqqrrwvNEURRN0zRV1XUhiqJomqapqqrrukAUTdM0VVVVXReIommapqq6
|
68
|
-
riwDUTRN01RV15VlYJqqqqqq67qyDFBNVVVV15VlgKq6quu6riwDVFV1XdeV
|
69
|
-
ZRnguq7ryrJs2wBc13Vl2bYFAAAcOAAABBhBJxlVFmGjCRcegEJDVgQAUQAA
|
70
|
-
gDFMKaaUYUxCKCE0ikkIKYRMSkqplVRBSCWlUioIqaRUSkalpZRSyiCUUlIq
|
71
|
-
FYRUSiqlAACwAwcAsAMLodCQlQBAHgAAQYhSjDHGnJRSKcacc05KqRRjzjkn
|
72
|
-
pWSMMeeck1IyxphzzkkpHXPOOeeklIw555xzUkrnnHPOOSmllM4555yUUkoI
|
73
|
-
nXNOSimlc845JwAAqMABACDARpHNCUaCCg1ZCQCkAgAYHMeyNE3TPE8UNUnS
|
74
|
-
NM/zPFE0TU2yNM3zPE8UTZPneZ4oiqJpqirP8zxRFEXTVFWuK4qmaZqqqqpk
|
75
|
-
WRRF0TRVVXVhmqapqqrqujBNUVRV1XVdyLJpqqrryjJs2zRV1XVlGaiqqsqu
|
76
|
-
LAPXVVXXlWUBAOAJDgBABTasjnBSNBZYaMhKACADAIAgBCGlFEJKKYSUUggp
|
77
|
-
pRASAAAw4AAAEGBCGSg0ZEUAECcAACAkpYJOSiWhlFJKKaWUUkoppZRSSiml
|
78
|
-
lFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSiml
|
79
|
-
lFJKKaWUUkoppZNSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSiml
|
80
|
-
lFJKKaWUUkoppZSSUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkkp
|
81
|
-
pZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkop
|
82
|
-
pZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkop
|
83
|
-
pZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkop
|
84
|
-
pZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkop
|
85
|
-
pZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkop
|
86
|
-
pZRSSimllAoA0I1wANB9MKEMFBqyEgBIBQAAjFGKMQipxVYhxJhzElprrUKI
|
87
|
-
MecktJRiz5hzEEppLbaeMccglJJai72UzklJrbUYeyodo5JSSzH23kspJaXY
|
88
|
-
Yuy9p5BCji3G2HvPMaUWW6ux915jSrHVGGPvvfcYY6ux1t577zG2VmuOBQBg
|
89
|
-
NjgAQCTYsDrCSdFYYKEhKwGAkAAAwhilGGPMOeecc05KyRhzzkEIIYQQSikZ
|
90
|
-
Y8w5CCGEEEIpJWPOOQchhFBCKKVkzDnoIIRQQiillM45Bx2EEEIJpZSSMecg
|
91
|
-
hBBCCaWUUjrnIIQQQiilhFRKKZ2DEEIoIYRSSkkphBBCCKGEUFIpKYUQQggh
|
92
|
-
hFBCSiWlEEIIIYQQSkilpJRSCCGEEEIIpZSUUgollBBCKKGkkkoppYQQSgih
|
93
|
-
pFRSKqmUEkIIJYSSSkoplVRKKCGEUgAAwIEDAECAEXSSUWURNppw4QEoNGQl
|
94
|
-
ABAFAAAZBx2UlhuAkHLUWocchBRbC5FDDFqMnXKMQUopZJAxxqSVkkLHGKTU
|
95
|
-
YkuhgxR7z7mV1AIAACAIAAgwAQQGCAq+EAJiDABAECIzREJhFSwwKIMGh3kA
|
96
|
-
8AARIREAJCYo0i4uoMsAF3Rx14EQghCEIBYHUEACDk644Yk3POEGJ+gUlToQ
|
97
|
-
AAAAAIAFAHgAAEAogIiIZq7C4gIjQ2ODo8PjA0QAAAAAALAA4AMAAAkBIiKa
|
98
|
-
uQqLC4wMjQ2ODo8PkAAAQAABAAAAABBAAAICAgAAAAAAAQAAAAICT2dnUwAE
|
99
|
-
AAAAAAAAAADjoIphAgAAAIr86XUBAQA=
|
100
|
-
====
|
101
|
-
EOF
|
10
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
102
11
|
|
103
12
|
class OggInfoTest < Test::Unit::TestCase
|
104
|
-
|
105
|
-
TEMP_FILE = File.join(Dir.tmpdir, "test_ogginfo.ogg")
|
106
|
-
|
107
13
|
def setup
|
108
|
-
|
109
|
-
File.open(TEMP_FILE, "w") { |f| f.write(valid_ogg_file) }
|
14
|
+
@tempfile = load_fixtures[:ogg]
|
110
15
|
end
|
111
16
|
|
112
17
|
def teardown
|
113
|
-
FileUtils.rm_f(
|
18
|
+
FileUtils.rm_f(@tempfile)
|
114
19
|
end
|
115
20
|
|
116
21
|
def test_infos
|
117
|
-
OggInfo.open(
|
22
|
+
OggInfo.open(@tempfile) do |ogg|
|
118
23
|
assert_equal 64000, ogg.nominal_bitrate
|
119
24
|
assert_equal 2, ogg.channels
|
120
25
|
assert_equal 44100, ogg.samplerate
|
121
|
-
assert_in_delta(
|
122
|
-
#average_bitrate
|
26
|
+
assert_in_delta(3, ogg.length, 0.5)
|
123
27
|
end
|
124
28
|
end
|
125
29
|
|
126
30
|
def test_length
|
127
|
-
|
128
|
-
|
129
|
-
assert_in_delta(
|
130
|
-
assert_in_delta(67000.0, ogg.bitrate, 2000, "bitrate has not been correctly guessed")
|
31
|
+
OggInfo.open(@tempfile) do |ogg|
|
32
|
+
assert_in_delta(3, ogg.length, 0.3, "length has not been correctly guessed")
|
33
|
+
assert_in_delta(64000.0, ogg.bitrate, 10000, "bitrate has not been correctly guessed")
|
131
34
|
end
|
132
35
|
end
|
133
36
|
|
134
37
|
def test_writing_to_spedial_filenames
|
135
|
-
tf = generate_ogg
|
136
38
|
filename = "fichier éé.ogg"
|
137
|
-
FileUtils.cp(
|
39
|
+
FileUtils.cp(@tempfile, filename)
|
138
40
|
begin
|
139
|
-
OggInfo.open(
|
41
|
+
OggInfo.open(@tempfile) do |ogg|
|
140
42
|
ogg.tag.title = "a"*200
|
141
43
|
end
|
142
44
|
#system("ls", "-l", filename)
|
@@ -162,9 +64,8 @@ class OggInfoTest < Test::Unit::TestCase
|
|
162
64
|
end
|
163
65
|
|
164
66
|
def test_should_not_fail_when_input_is_truncated
|
165
|
-
valid_ogg = generate_ogg
|
166
67
|
ogg_length = nil
|
167
|
-
OggInfo.open(
|
68
|
+
OggInfo.open(@tempfile) do |ogg|
|
168
69
|
ogg_length = ogg.length
|
169
70
|
end
|
170
71
|
|
@@ -191,43 +92,61 @@ class OggInfoTest < Test::Unit::TestCase
|
|
191
92
|
end
|
192
93
|
end
|
193
94
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
unless test(?f, generated_ogg_file_path)
|
199
|
-
system("dd if=/dev/urandom bs=1024 count=3000 | oggenc -q0 --raw -o #{generated_ogg_file_path} -") or
|
200
|
-
flunk("cannot generate \"#{generated_ogg_file_path}\", tests cannot be fully performed")
|
201
|
-
end
|
202
|
-
tf = Tempfile.new("ruby-ogginfo")
|
95
|
+
def test_picture
|
96
|
+
tf = Tempfile.new(["ruby-ogginfo", ".jpg"])
|
97
|
+
jpg_content = (0...1000).collect { rand(256).chr }.join("")
|
98
|
+
tf.write(jpg_content)
|
203
99
|
tf.close
|
204
|
-
|
205
|
-
|
100
|
+
OggInfo.open(@tempfile) do |ogg|
|
101
|
+
ogg.picture = tf.path
|
102
|
+
end
|
103
|
+
OggInfo.open(@tempfile) do |ogg|
|
104
|
+
assert ogg.tag.has_key?("metadata_block_picture")
|
105
|
+
|
106
|
+
type, # picture type
|
107
|
+
_, # mime_type size
|
108
|
+
mime_type,
|
109
|
+
_, # description size
|
110
|
+
description,
|
111
|
+
_, # width
|
112
|
+
_, # height
|
113
|
+
_, # color depth
|
114
|
+
_, # number of color used
|
115
|
+
file_content_size,
|
116
|
+
file_content = ogg.tag["metadata_block_picture"].unpack("m*").first.unpack("NNa10Na10NNNNNa*")
|
117
|
+
assert_equal 3, type
|
118
|
+
assert_equal "image/jpeg", mime_type
|
119
|
+
assert_equal "folder.jpg", description
|
120
|
+
assert_equal jpg_content.size, file_content_size
|
121
|
+
assert_equal jpg_content, file_content
|
122
|
+
|
123
|
+
assert_equal [".jpg", jpg_content], ogg.picture
|
124
|
+
end
|
206
125
|
end
|
207
126
|
|
127
|
+
protected
|
128
|
+
|
208
129
|
def generate_truncated_ogg
|
209
|
-
valid_ogg = generate_ogg
|
210
130
|
tf = Tempfile.new("ruby-ogginfo")
|
211
|
-
|
131
|
+
s = File.size(@tempfile)
|
132
|
+
data = File.read(@tempfile, (s - s*0.75).to_i)
|
212
133
|
tf.write(data)
|
213
134
|
tf.close
|
214
135
|
tf
|
215
136
|
end
|
216
137
|
|
217
138
|
def tag_test(test_name, tag)
|
218
|
-
|
219
|
-
|
220
|
-
OggInfo.open(tf.path) do |ogg|
|
139
|
+
OggInfo.open(@tempfile) do |ogg|
|
221
140
|
tag.each { |k,v| ogg.tag[k] = v }
|
222
141
|
end
|
223
142
|
|
224
|
-
OggInfo.open(
|
143
|
+
OggInfo.open(@tempfile) do |ogg|
|
225
144
|
assert_equal tag, ogg.tag
|
226
145
|
end
|
227
|
-
system("cp #{
|
146
|
+
system("cp #{@tempfile} /tmp/test_#{RUBY_VERSION}_#{test_name}.ogg")
|
228
147
|
test_length
|
229
148
|
assert_nothing_raised do
|
230
|
-
io = open(
|
149
|
+
io = open(@tempfile)
|
231
150
|
reader = Ogg::Reader.new(io)
|
232
151
|
reader.each_pages do |page|
|
233
152
|
page
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
$:.unshift("lib/")
|
4
|
+
|
5
|
+
require "test/unit"
|
6
|
+
require "ogginfo"
|
7
|
+
require "fileutils"
|
8
|
+
require "tempfile"
|
9
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
10
|
+
|
11
|
+
class OtherCodecsInfoTest < Test::Unit::TestCase
|
12
|
+
CODECS = [:speex, :opus]
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@fixtures = load_fixtures
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_generated_info
|
19
|
+
CODECS.each do |codec|
|
20
|
+
OggInfo.open(@fixtures[codec]) do |ogg|
|
21
|
+
assert_equal 2, ogg.channels
|
22
|
+
assert_equal 48000, ogg.samplerate
|
23
|
+
case codec
|
24
|
+
when :speex
|
25
|
+
assert_equal "spxinfotest", ogg.tag.author
|
26
|
+
when :opus
|
27
|
+
assert_in_delta(3, ogg.length, 0.2, "length has not been correctly guessed for codec \"#{codec}\"")
|
28
|
+
assert_in_delta 64000, ogg.bitrate, 2000
|
29
|
+
assert_equal "artist", ogg.tag.artist
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_tag_writing
|
36
|
+
CODECS.each do |codec|
|
37
|
+
tag = {"title" => "mytitle", "test" => "myartist" }
|
38
|
+
OggInfo.open(@fixtures[codec]) do |ogg|
|
39
|
+
ogg.tag.clear
|
40
|
+
tag.each { |k,v| ogg.tag[k] = v }
|
41
|
+
end
|
42
|
+
|
43
|
+
OggInfo.open(@fixtures[codec]) do |ogg|
|
44
|
+
assert_equal tag, ogg.tag
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-ogginfo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillaume Pierronnet
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
12
|
+
date: 2013-10-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdoc
|
@@ -56,6 +56,7 @@ dependencies:
|
|
56
56
|
description: |-
|
57
57
|
ruby-ogginfo gives you access to low level information on ogg files
|
58
58
|
(bitrate, length, samplerate, encoder, etc... ), as well as tag.
|
59
|
+
Supported codecs are: vorbis, speex and opus.
|
59
60
|
It is written in pure ruby.
|
60
61
|
email:
|
61
62
|
- guillaume.pierronnet@gmail.com
|
@@ -74,14 +75,17 @@ files:
|
|
74
75
|
- lib/ogg/codecs/comments.rb
|
75
76
|
- lib/ogg/codecs/speex.rb
|
76
77
|
- lib/ogg/codecs/vorbis.rb
|
78
|
+
- lib/ogg/codecs/opus.rb
|
77
79
|
- lib/ogg/page.rb
|
78
80
|
- lib/ogg/reader.rb
|
79
81
|
- lib/ogg/writer.rb
|
80
82
|
- lib/ogg.rb
|
81
83
|
- lib/ogginfo.rb
|
82
84
|
- setup.rb
|
85
|
+
- test/fixtures.yml
|
86
|
+
- test/test_helper.rb
|
83
87
|
- test/test_ruby-ogginfo.rb
|
84
|
-
- test/test_ruby-
|
88
|
+
- test/test_ruby-othercodecs.rb
|
85
89
|
- .gemtest
|
86
90
|
homepage: http://ruby-ogginfo.rubyforge.org/
|
87
91
|
licenses: []
|
@@ -110,5 +114,6 @@ specification_version: 4
|
|
110
114
|
summary: ruby-ogginfo gives you access to low level information on ogg files (bitrate,
|
111
115
|
length, samplerate, encoder, etc..
|
112
116
|
test_files:
|
117
|
+
- test/test_ruby-othercodecs.rb
|
113
118
|
- test/test_ruby-ogginfo.rb
|
114
|
-
- test/
|
119
|
+
- test/test_helper.rb
|
data/test/test_ruby-spxinfo.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby -w
|
2
|
-
|
3
|
-
$:.unshift("lib/")
|
4
|
-
|
5
|
-
require "test/unit"
|
6
|
-
require "ogginfo"
|
7
|
-
require "fileutils"
|
8
|
-
require "tempfile"
|
9
|
-
|
10
|
-
VALID_SPX = <<EOF
|
11
|
-
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
-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
-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
-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
-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
-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
-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
-
HzbqwWpucYfpo9cdbMMEO7igq6urq6sKurq6urCrq6urqwq0JWwquTvXtgo4N4QmT3p3VizFtbRM
|
19
|
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-
gsIkkJUDtOGTPXVzA3iO5K85YHb22D756xttK7pQq6urqw0Kurq8KrDWq6urqwq0mrvcmTnRCIU8
|
33
|
-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
-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
-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
-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
-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
-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
-
ANDC+sIEtwjQ2OqxyZAjGKs5z0mZd38cTtkZJTyJnd+IKuxX4n3//t3jkcyO+C3c6fi3c23GPBff
|
40
|
-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
-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
-
jatCq6sKtCq464AAsg7rHAjQ4Nq/ORGITQs/Ij33U63zbSfUhr49L4clLH5sLYe9qwfYwOcMBtYU
|
43
|
-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
-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
-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
-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
-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
-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
-
wpeIWpSnZJtIqyLzxGWrhMmPzfCsPbVzRyhF0F8yKure2rj+QLlK8whLdvv/wI08izqgQieK7QQE
|
50
|
-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
-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
-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
-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
-
WkL94EdrPdfVa/z/+dBw1ckmuSfIiSzOJ3NxJmvqrelDG7swgEl06/gJSrjtaUTt1NC9qxvaurq6
|
55
|
-
uTv3X00=
|
56
|
-
EOF
|
57
|
-
|
58
|
-
class SpxInfoTest < Test::Unit::TestCase
|
59
|
-
|
60
|
-
TEMP_FILE = File.join(Dir.tmpdir, "test.spxinfo.spx")
|
61
|
-
GEN_FILE = File.join(Dir.tmpdir,"test.spxgen.spx")
|
62
|
-
|
63
|
-
def setup
|
64
|
-
valid_spx_file = VALID_SPX.unpack("m*").first
|
65
|
-
File.open(TEMP_FILE, "w") { |f| f.write(valid_spx_file) }
|
66
|
-
end
|
67
|
-
|
68
|
-
def teardown
|
69
|
-
FileUtils.rm_f(TEMP_FILE)
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_infos
|
73
|
-
OggInfo.open(TEMP_FILE) do |spx|
|
74
|
-
assert_equal 1, spx.channels
|
75
|
-
assert_equal 32000, spx.samplerate
|
76
|
-
assert_in_delta(0.5, spx.length, 1)
|
77
|
-
assert_equal "cityrail",spx.tag["author"]
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_generated_info
|
82
|
-
generate_spx
|
83
|
-
OggInfo.open("test.spx") do |spx|
|
84
|
-
assert_equal 2, spx.channels
|
85
|
-
assert_equal 44100, spx.samplerate
|
86
|
-
assert_equal "spxinfotest", spx.tag.author
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_tag_writing
|
91
|
-
generate_spx
|
92
|
-
FileUtils.cp("test.spx",GEN_FILE)
|
93
|
-
tag = {"title" => "mytitle", "test" => "myartist" }
|
94
|
-
OggInfo.open(GEN_FILE) do |spx|
|
95
|
-
spx.tag.clear
|
96
|
-
tag.each { |k,v| spx.tag[k] = v }
|
97
|
-
end
|
98
|
-
|
99
|
-
OggInfo.open(GEN_FILE) do |spx|
|
100
|
-
assert_equal tag, spx.tag
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
def generate_spx
|
105
|
-
unless test(?f, "test.spx")
|
106
|
-
system("dd if=/dev/urandom bs=1024 count=3000 | speexenc --rate 44100 --stereo --author spxinfotest --title SpxInfoTest --comment test=\"hello\303\251\" - test.spx") or
|
107
|
-
flunk("cannot generate \"test.spx\", tests cannot be fully performed")
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|