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.
@@ -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
@@ -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
- T2dnUwACAAAAAAAAAADjoIphAAAAAIDpYLkBHgF2b3JiaXMAAAAAAkSsAAAA
13
- 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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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
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
43
- 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
- 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
- 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
- AAAAgCaKgKiagCiqAAAAAAAAAKCJJiCaKiCqJgAAAAAAAAAAAAAAAAAAAAAA
47
- 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
- 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
- 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
- valid_ogg_file = VALID_OGG.unpack("m*").first
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(TEMP_FILE)
18
+ FileUtils.rm_f(@tempfile)
114
19
  end
115
20
 
116
21
  def test_infos
117
- OggInfo.open(TEMP_FILE) do |ogg|
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(0.5, ogg.length, 1)
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
- tf = generate_ogg
128
- OggInfo.open(tf.path) do |ogg|
129
- assert_in_delta(17.0, ogg.length, 1, "length has not been correctly guessed")
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(tf.path, filename)
39
+ FileUtils.cp(@tempfile, filename)
138
40
  begin
139
- OggInfo.open(tf.path) do |ogg|
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(valid_ogg.path) do |ogg|
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
- protected
195
-
196
- def generate_ogg
197
- generated_ogg_file_path = File.join(File.dirname(__FILE__), "test.ogg")
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
- FileUtils.cp(generated_ogg_file_path, tf.path)
205
- tf
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
- data = File.read(valid_ogg.path, File.size(valid_ogg.path) - 10000)
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
- tf = generate_ogg
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(tf.path) do |ogg|
143
+ OggInfo.open(@tempfile) do |ogg|
225
144
  assert_equal tag, ogg.tag
226
145
  end
227
- system("cp #{tf.path} /tmp/test_#{RUBY_VERSION}_#{test_name}.ogg")
146
+ system("cp #{@tempfile} /tmp/test_#{RUBY_VERSION}_#{test_name}.ogg")
228
147
  test_length
229
148
  assert_nothing_raised do
230
- io = open(tf.path)
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.6.13
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-25 00:00:00.000000000 Z
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-spxinfo.rb
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/test_ruby-spxinfo.rb
119
+ - test/test_helper.rb
@@ -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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
- 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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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
- 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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
- 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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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
- 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