ruby-ogginfo 0.6.13 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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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
-
AAAAAPoAAAAAAAC4AU9nZ1MAAAAAAAAAAAAA46CKYQEAAACKbpIfEC3/////
|
14
|
-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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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
-
tBJLTbXVWGOtueecaw7SWmmttdZKKaWUUkopCA1ZBQCAAAAQCBlkkEFGIYUU
|
29
|
-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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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
-
VVVVVVVVVVVVVVVVVVU1TdM0TSA0ZCUAEAUAADpLLdbaK4CUglaDaBBkEHPv
|
40
|
-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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
|
-
T2dnUwACAAAAAAAAAACqcIpSAAAAACW1TjsBUFNwZWV4ICAgMS4ycmMxAAAAAAAAAAAAAAAAAAAB
|
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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
-
cHVzHbFu7juLE5SnW6msiMbKC5gRL5VgOWuKE4KQ6h699dPu4GYIbS+kV5OUlu8em7sAq6vJwsIG
|
20
|
-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
-
dXqlViElJDMqtVpm3wYeSn7LN7Hy4v1BCztwq0Lrq6sEKNycInDCPQQOlAzSerScmZNkLOY/IvKD
|
22
|
-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
-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
-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
-
2TvUIQg4Of/CrYK/SkX9mvlyA+SmNCISQR2lTZ/kkq4wKmJNFiBYj4K3PLXGX0PEaq8pdnYO4G+8
|
26
|
-
vjjjmCQdiX6dazlAPdarq6sKtNPcKNDrPcLCsAuKdtPcmbv0rdE/KDqHTDkHSWMp3lwcTGKhkTmM
|
27
|
-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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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
-
SblsW7lAq6urJ6sEmrq1ZCCrDsmrwgwqurwg2TnSmOo8w93dT403yWxyVJ1+waPCCsSF2KtfDsAd
|
35
|
-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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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
-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
-
0vxuTYPzJfs/Ip2iKa8Gv464Z9mEq4IxK40o48uVK7hwVhw4JzgMO9jS34D4bXcJ8wx59j4nGRJW
|
44
|
-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
-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
-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
-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
-
IeWe2rotzxcdeOxQJsUMO7hwsIAO+lQWppkj1OANjbGrjgANkDz5yZNmJcw9yW80knQ7ZshyNd9G
|
49
|
-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
-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
-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
-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
-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
-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
|
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
|