ruby-mp3info 0.8.4 → 0.8.5
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/README.md +9 -7
- data/lib/mp3info.rb +1 -1
- data/lib/mp3info/id3v2.rb +18 -18
- data/test/test_ruby-mp3info.rb +44 -66
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 969aa771d7ae3b0b47648d6e21ee285cfe238713
|
4
|
+
data.tar.gz: e51dac8cf99fdbcd015fc497d88d239316d0f5ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac0b6fcbb6acfaed1e5b975f309a26ae0caf8a2179fb5de86268128349216b654535d7e57fb9f93e7af8c32c07d83abb5f2e8b78b4e46395a525d577ee04d495
|
7
|
+
data.tar.gz: f027fa0a62c2ebf1c31120ce827b047133f98595a59f702b5ab1a239ef0ecc2dc9e8163bc7107283a5c9a0c547a72044aab4d7f3a7e1d5c1952f211a41842843
|
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
* http://github.com/moumar/ruby-mp3info
|
4
4
|
|
5
|
+
[](https://travis-ci.org/moumar/ruby-mp3info)
|
6
|
+
|
5
7
|
## Description
|
6
8
|
|
7
9
|
ruby-mp3info read low-level informations and manipulate tags on mp3 files.
|
8
10
|
|
9
11
|
## Features/Problems
|
10
12
|
|
11
|
-
* Written in pure ruby
|
13
|
+
* Written in pure ruby
|
12
14
|
* Read low-level informations like bitrate, length, samplerate, etc...
|
13
15
|
* Read, write, remove id3v1 and id3v2 tags
|
14
16
|
* Correctly read VBR files (with or without Xing header)
|
@@ -31,8 +33,8 @@ end
|
|
31
33
|
# when writing, each tag is written.
|
32
34
|
|
33
35
|
Mp3Info.open("myfile.mp3") do |mp3|
|
34
|
-
puts mp3.tag.title
|
35
|
-
puts mp3.tag.artist
|
36
|
+
puts mp3.tag.title
|
37
|
+
puts mp3.tag.artist
|
36
38
|
puts mp3.tag.album
|
37
39
|
puts mp3.tag.tracknum
|
38
40
|
mp3.tag.title = "track title"
|
@@ -61,18 +63,18 @@ file = File.new('input_img','rb')
|
|
61
63
|
Mp3Info.open '1.mp3' do |m|
|
62
64
|
pictures = m.tag2.pictures # array of images :
|
63
65
|
pictures.each do |description, data|
|
64
|
-
# description ends with (.jpg / .png) for easy writing to file
|
65
|
-
File.binwrite(description, data)
|
66
|
+
# description ends with (.jpg / .png) for easy writing to file
|
67
|
+
File.binwrite(description, data)
|
66
68
|
end
|
67
69
|
m.tag2.remove_pictures # remove all images
|
68
|
-
|
70
|
+
|
69
71
|
m.tag2.add_picture(file.read) # add a single image to APIC tag
|
70
72
|
# **optionally**, you may include options for the image tag to add_picture():
|
71
73
|
# options = { mime: 'jpeg|gif|png', description: "description",
|
72
74
|
# pic_type: 0 }
|
73
75
|
# There is no need to specify mime or options because the mime is guessed based on the input image
|
74
76
|
# Only one image is permitted in the mp3 for compatibility. add_picture() overwrites all previous images.
|
75
|
-
# Please note:
|
77
|
+
# Please note:
|
76
78
|
# If supplying :mime option just supply the mime 'jpeg', 'gif' or 'png', the code adds the "image/.." for you!
|
77
79
|
# e.g. m.tag2.add_picture(file.read, mime: 'jpeg', pic_type: 3) gets a mime "image/jpeg"
|
78
80
|
end
|
data/lib/mp3info.rb
CHANGED
data/lib/mp3info/id3v2.rb
CHANGED
@@ -345,8 +345,8 @@ class ID3v2 < DelegateClass(Hash)
|
|
345
345
|
end
|
346
346
|
|
347
347
|
def remove_pictures
|
348
|
-
self
|
349
|
-
self
|
348
|
+
self["APIC"] = ""
|
349
|
+
self["PIC"] = ""
|
350
350
|
end
|
351
351
|
|
352
352
|
### gets id3v2 tag information from io object (must support #seek() method)
|
@@ -391,13 +391,13 @@ class ID3v2 < DelegateClass(Hash)
|
|
391
391
|
@hash.each do |k, v|
|
392
392
|
next unless v
|
393
393
|
next if v.respond_to?("empty?") and v.empty?
|
394
|
-
|
394
|
+
|
395
395
|
# Automagically translate V2 to V3 tags
|
396
396
|
k = TAG_MAPPING_2_2_to_2_3[k] if TAG_MAPPING_2_2_to_2_3.has_key?(k)
|
397
397
|
|
398
398
|
# doesn't encode id3v2.2 tags, which have 3 characters
|
399
|
-
next if k.size != 4
|
400
|
-
|
399
|
+
next if k.size != 4
|
400
|
+
|
401
401
|
# Output one flag for each array element, or one only if it's not an array
|
402
402
|
[v].flatten.each do |value|
|
403
403
|
data = encode_tag(k, value.to_s)
|
@@ -416,7 +416,7 @@ class ID3v2 < DelegateClass(Hash)
|
|
416
416
|
end
|
417
417
|
|
418
418
|
tag_str = "ID3"
|
419
|
-
#version_maj, version_min, unsync, ext_header, experimental, footer
|
419
|
+
#version_maj, version_min, unsync, ext_header, experimental, footer
|
420
420
|
tag_str << [ 3, 0, "0000" ].pack("CCB4")
|
421
421
|
tag_str << [to_syncsafe(tag.size)].pack("N")
|
422
422
|
tag_str << tag
|
@@ -430,18 +430,18 @@ class ID3v2 < DelegateClass(Hash)
|
|
430
430
|
puts "encode_tag(#{name.inspect}, #{value.inspect})" if $DEBUG
|
431
431
|
name = name.to_s
|
432
432
|
|
433
|
-
if name =~ /^(COM|T)/
|
433
|
+
if name =~ /^(COM|T|USLT)/
|
434
434
|
transcoded_value = Mp3Info::EncodingHelper.convert_to(value, "utf-8", "utf-16")
|
435
435
|
end
|
436
436
|
case name
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
437
|
+
when "COMM", "USLT"
|
438
|
+
puts "encode #{name} lang: #{@options[:lang]}, value #{transcoded_value.inspect}" if $DEBUG
|
439
|
+
s = [ 1, @options[:lang], "\xFE\xFF\x00\x00", transcoded_value].pack("ca3a*a*")
|
440
|
+
return s
|
441
|
+
when /^T/
|
442
|
+
unless RUBY_1_8
|
443
|
+
transcoded_value.force_encoding("BINARY")
|
444
|
+
end
|
445
445
|
return "\x01" + transcoded_value
|
446
446
|
else
|
447
447
|
return value
|
@@ -451,8 +451,8 @@ class ID3v2 < DelegateClass(Hash)
|
|
451
451
|
### Read a tag from file and perform UNICODE translation if needed
|
452
452
|
def decode_tag(name, raw_value)
|
453
453
|
puts("decode_tag(#{name.inspect}, #{raw_value.inspect})") if $DEBUG
|
454
|
-
if name =~ /^(T|COM)/
|
455
|
-
if name =~ /^COM/
|
454
|
+
if name =~ /^(T|COM|USLT)/
|
455
|
+
if name =~ /^(COM|USLT)/
|
456
456
|
#FIXME improve this
|
457
457
|
encoding_index, lang, raw_tag = raw_value.unpack("ca3a*")
|
458
458
|
if encoding_index == 1
|
@@ -470,7 +470,7 @@ class ID3v2 < DelegateClass(Hash)
|
|
470
470
|
end
|
471
471
|
puts "COM tag found. encoding: #{encoding_index} lang: #{lang} str: #{out.inspect}" if $DEBUG
|
472
472
|
else
|
473
|
-
encoding_index = raw_value.getbyte(0) # language encoding (see TEXT_ENCODINGS constant)
|
473
|
+
encoding_index = raw_value.getbyte(0) # language encoding (see TEXT_ENCODINGS constant)
|
474
474
|
out = raw_value[1..-1]
|
475
475
|
end
|
476
476
|
# we need to convert the string in order to match
|
data/test/test_ruby-mp3info.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
|
4
|
+
dir = File.dirname(__FILE__)
|
5
|
+
$:.unshift("#{dir}/../lib/")
|
6
|
+
$:.unshift("#{dir}/../test")
|
5
7
|
|
6
|
-
require "
|
8
|
+
require "helper"
|
7
9
|
require "mp3info"
|
8
10
|
require "fileutils"
|
9
11
|
require "tempfile"
|
@@ -12,23 +14,23 @@ require "yaml"
|
|
12
14
|
|
13
15
|
GOT_ID3V2 = system("which id3v2 > /dev/null")
|
14
16
|
|
15
|
-
class Mp3InfoTest <
|
16
|
-
|
17
|
+
class Mp3InfoTest < TestCase
|
17
18
|
TEMP_FILE = File.join(File.dirname(__FILE__), "test_mp3info.mp3")
|
18
19
|
|
19
20
|
DUMMY_TAG2 = {
|
20
21
|
"COMM" => "comments",
|
21
|
-
#"TCON" => "genre_s"
|
22
|
+
#"TCON" => "genre_s"
|
22
23
|
"TIT2" => "title",
|
23
24
|
"TPE1" => "artist",
|
24
25
|
"TALB" => "album",
|
25
26
|
"TYER" => "year",
|
26
|
-
"TRCK" => "tracknum"
|
27
|
+
"TRCK" => "tracknum",
|
28
|
+
"USLT" => "lyrics test 123456789"
|
27
29
|
}
|
28
30
|
|
29
31
|
DUMMY_TAG1 = {
|
30
32
|
"title" => "toto",
|
31
|
-
"artist" => "artist 123",
|
33
|
+
"artist" => "artist 123",
|
32
34
|
"album" => "ALBUMM",
|
33
35
|
"year" => 1934,
|
34
36
|
"tracknum" => 14,
|
@@ -69,17 +71,15 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
69
71
|
end
|
70
72
|
|
71
73
|
def test_is_an_mp3
|
72
|
-
|
73
|
-
Mp3Info.new(TEMP_FILE).close
|
74
|
-
end
|
74
|
+
Mp3Info.new(TEMP_FILE).close
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
def test_detected_info
|
78
78
|
Mp3Info.open(TEMP_FILE) do |mp3|
|
79
79
|
assert_mp3_info_are_ok(mp3)
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
def test_vbr_mp3_length
|
84
84
|
load_fixture_to_temp_file("vbr")
|
85
85
|
|
@@ -115,7 +115,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
115
115
|
}
|
116
116
|
id3_test(tag, valid_tag)
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
def test_valid_tag1_0
|
120
120
|
tag = [ "title", "artist", "album", "1921", "comments", 0].pack('A30A30A30A4A30C')
|
121
121
|
valid_tag = {
|
@@ -150,7 +150,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
150
150
|
end
|
151
151
|
|
152
152
|
def test_hastags
|
153
|
-
Mp3Info.open(TEMP_FILE) do |info|
|
153
|
+
Mp3Info.open(TEMP_FILE) do |info|
|
154
154
|
info.tag1 = @tag
|
155
155
|
end
|
156
156
|
assert(Mp3Info.hastag1?(TEMP_FILE))
|
@@ -160,10 +160,10 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
160
160
|
end
|
161
161
|
|
162
162
|
def test_universal_tag
|
163
|
-
2.times do
|
163
|
+
2.times do
|
164
164
|
tag = {"title" => "title"}
|
165
165
|
Mp3Info.open(TEMP_FILE) do |mp3|
|
166
|
-
|
166
|
+
tag.each { |k,v| mp3.tag[k] = v }
|
167
167
|
end
|
168
168
|
w = Mp3Info.open(TEMP_FILE) { |m| m.tag }
|
169
169
|
assert_equal(tag, w)
|
@@ -181,7 +181,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
181
181
|
w.delete("genre")
|
182
182
|
w.delete("genre_s")
|
183
183
|
assert_equal(tag, w)
|
184
|
-
# id3v2_prog_test(tag, w)
|
184
|
+
# id3v2_prog_test(tag, w)
|
185
185
|
end
|
186
186
|
|
187
187
|
def test_id3v2_version
|
@@ -198,17 +198,17 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
198
198
|
end
|
199
199
|
end
|
200
200
|
=end
|
201
|
-
|
201
|
+
|
202
202
|
# test for good output of APIC tag inspect (escaped and snipped)
|
203
203
|
def test_id3v2_to_inspect_hash
|
204
204
|
Mp3Info.open(TEMP_FILE) do |mp3|
|
205
|
-
mp3.tag2
|
205
|
+
mp3.tag2["APIC"] = "\x00testing.jpg\x00" * 20
|
206
206
|
assert_match(/^((\\x00|\\u0000)testing.jpg(\\x00|\\u0000))+.*<<<\.\.\.snip\.\.\.>>>$/, mp3.tag2.to_inspect_hash["APIC"])
|
207
207
|
end
|
208
208
|
end
|
209
209
|
|
210
210
|
def test_id3v2_get_pictures
|
211
|
-
img = "\x89PNG".force_encoding('BINARY') +
|
211
|
+
img = "\x89PNG".force_encoding('BINARY') +
|
212
212
|
random_string(120).force_encoding('BINARY')
|
213
213
|
Mp3Info.open(TEMP_FILE) do |mp3|
|
214
214
|
mp3.tag2.add_picture(img, :description => 'example image.png')
|
@@ -217,9 +217,9 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
217
217
|
assert_equal(["01_example image.png", img], mp3.tag2.pictures[0])
|
218
218
|
end
|
219
219
|
end
|
220
|
-
|
220
|
+
|
221
221
|
def test_id3v2_remove_pictures
|
222
|
-
jpg_data = "\xFF".force_encoding('BINARY') +
|
222
|
+
jpg_data = "\xFF".force_encoding('BINARY') +
|
223
223
|
random_string(123).force_encoding('BINARY')
|
224
224
|
Mp3Info.open(TEMP_FILE) do |mp|
|
225
225
|
mp.tag2.add_picture(jpg_data)
|
@@ -234,16 +234,16 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
234
234
|
tag = { "TIT2" => "tit2", "TPE1" => "tpe1" }
|
235
235
|
Mp3Info.open(TEMP_FILE) do |mp3|
|
236
236
|
tag.each do |k, v|
|
237
|
-
mp3.tag2.
|
237
|
+
mp3.tag2.tap { |h| h[k.to_s] = v }
|
238
238
|
end
|
239
|
-
assert_equal
|
239
|
+
assert_equal tag, mp3.tag2.to_hash
|
240
240
|
end
|
241
241
|
end
|
242
242
|
|
243
243
|
def test_id3v2_basic
|
244
244
|
written_tag = write_tag2_to_temp_file(DUMMY_TAG2)
|
245
|
-
assert_equal(DUMMY_TAG2, written_tag)
|
246
|
-
id3v2_prog_test(DUMMY_TAG2, written_tag)
|
245
|
+
assert_equal(DUMMY_TAG2, written_tag.to_hash)
|
246
|
+
id3v2_prog_test(DUMMY_TAG2, written_tag.to_hash)
|
247
247
|
end
|
248
248
|
|
249
249
|
#test the tag with the "id3v2" program
|
@@ -253,44 +253,43 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
253
253
|
id3v2_output = {}
|
254
254
|
=begin
|
255
255
|
id3v2 tag info for test/test_mp3info.mp3:
|
256
|
-
COMM (Comments): (~)[ENG]:
|
256
|
+
COMM (Comments): (~)[ENG]:
|
257
257
|
test/test_mp3info.mp3: No ID3v1 tag
|
258
258
|
=end
|
259
259
|
raw_output = `id3v2 -l #{TEMP_FILE}`
|
260
260
|
raw_output.split(/\n/).each do |line|
|
261
261
|
if line =~ /^id3v2 tag info/
|
262
|
-
start = true
|
263
|
-
|
262
|
+
start = true
|
263
|
+
next
|
264
264
|
end
|
265
265
|
next unless start
|
266
266
|
if match = /^(.{4}) \(.+\): (.+)$/.match(line)
|
267
267
|
k, v = match[1, 2]
|
268
268
|
case k
|
269
|
-
|
270
|
-
|
271
|
-
|
269
|
+
#COMM (Comments): ()[spa]: fmg
|
270
|
+
when "COMM", "USLT"
|
271
|
+
v.sub!(/\(\)\[.{3}\]: (.+)/, '\1')
|
272
272
|
end
|
273
273
|
id3v2_output[k] = v
|
274
274
|
end
|
275
275
|
end
|
276
276
|
|
277
|
-
assert_equal( id3v2_output, written_tag, "id3v2 program output doesn't match")
|
277
|
+
assert_equal( id3v2_output, written_tag.to_hash, "id3v2 program output doesn't match")
|
278
278
|
end
|
279
279
|
|
280
280
|
def test_id3v2_complex
|
281
281
|
tag = {}
|
282
|
-
#ID3v2::TAGS.keys.each do |k|
|
283
282
|
["PRIV", "APIC"].each do |k|
|
284
283
|
tag[k] = random_string(50)
|
285
284
|
end
|
286
285
|
|
287
286
|
got_tag = write_tag2_to_temp_file(tag)
|
288
|
-
assert_equal(tag, got_tag)
|
287
|
+
assert_equal(tag, got_tag.to_hash)
|
289
288
|
end
|
290
289
|
|
291
290
|
def test_id3v2_bigtag
|
292
291
|
tag = {"APIC" => random_string(1024) }
|
293
|
-
assert_equal(tag, write_tag2_to_temp_file(tag))
|
292
|
+
assert_equal(tag, write_tag2_to_temp_file(tag).to_hash)
|
294
293
|
end
|
295
294
|
|
296
295
|
def test_leading_char_gets_chopped
|
@@ -312,7 +311,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
312
311
|
|
313
312
|
Mp3Info.open(TEMP_FILE) do |mp3|
|
314
313
|
assert_equal "2.2.0", mp3.tag2.version
|
315
|
-
expected_tag = {
|
314
|
+
expected_tag = {
|
316
315
|
"TCO" => "Hip Hop/Rap",
|
317
316
|
"TP1" => "Grems Aka Supermicro",
|
318
317
|
"TT2" => "Intro",
|
@@ -324,9 +323,9 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
324
323
|
tag = mp3.tag2.dup
|
325
324
|
assert_equal 4, tag["COM"].size
|
326
325
|
tag.delete("COM")
|
327
|
-
assert_equal expected_tag, tag
|
326
|
+
assert_equal expected_tag, tag.to_hash
|
328
327
|
|
329
|
-
expected_tag = {
|
328
|
+
expected_tag = {
|
330
329
|
"genre_s" => "Hip Hop/Rap",
|
331
330
|
"title" => "Intro",
|
332
331
|
#"comments" => "\000engiTunPGAP\0000\000\000",
|
@@ -336,7 +335,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
336
335
|
"artist" => "Grems Aka Supermicro",
|
337
336
|
"tracknum" => 1 }
|
338
337
|
# test universal tag
|
339
|
-
assert_equal expected_tag, mp3.tag
|
338
|
+
assert_equal expected_tag, mp3.tag.to_hash
|
340
339
|
end
|
341
340
|
end
|
342
341
|
|
@@ -471,7 +470,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
471
470
|
end
|
472
471
|
|
473
472
|
def test_hastag_class_methods_with_a_stringio
|
474
|
-
Mp3Info.open(TEMP_FILE) do |info|
|
473
|
+
Mp3Info.open(TEMP_FILE) do |info|
|
475
474
|
info.tag1 = @tag
|
476
475
|
end
|
477
476
|
io = load_string_io
|
@@ -490,7 +489,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
490
489
|
|
491
490
|
def test_modifying_an_io
|
492
491
|
io = open(TEMP_FILE, "r")
|
493
|
-
Mp3Info.open(io) do |mp3|
|
492
|
+
Mp3Info.open(io) do |mp3|
|
494
493
|
mp3.tag.artist = "test_artist"
|
495
494
|
end
|
496
495
|
end
|
@@ -504,9 +503,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
504
503
|
end
|
505
504
|
|
506
505
|
Mp3Info.open("/tmp/test.mp3") do |info|
|
507
|
-
|
508
|
-
info.each_frame { |frame| frame }
|
509
|
-
end
|
506
|
+
info.each_frame { |frame| frame }
|
510
507
|
assert(info.vbr)
|
511
508
|
assert_in_delta(174.210612, info.length, 0.000001)
|
512
509
|
end
|
@@ -526,7 +523,6 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
526
523
|
mp3.tag2.update(tag)
|
527
524
|
end
|
528
525
|
return Mp3Info.open(TEMP_FILE) { |m| m.tag2 }
|
529
|
-
#system("cp -v #{TEMP_FILE} #{TEMP_FILE}.test")
|
530
526
|
end
|
531
527
|
|
532
528
|
def random_string(size)
|
@@ -558,7 +554,7 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
558
554
|
:emphasis=>0,
|
559
555
|
:channel_num=>1,
|
560
556
|
:channel_mode=>"JStereo"
|
561
|
-
|
557
|
+
}, mp3.header)
|
562
558
|
end
|
563
559
|
|
564
560
|
def load_string_io(filename = TEMP_FILE)
|
@@ -588,26 +584,8 @@ class Mp3InfoTest < Test::Unit::TestCase
|
|
588
584
|
content = Zlib::Inflate.inflate(content)
|
589
585
|
end
|
590
586
|
|
591
|
-
File.open(TEMP_FILE, "w") do |f|
|
587
|
+
File.open(TEMP_FILE, "w") do |f|
|
592
588
|
f.write(content)
|
593
589
|
end
|
594
590
|
end
|
595
|
-
=begin
|
596
|
-
|
597
|
-
def test_encoder
|
598
|
-
write_to_temp
|
599
|
-
info = Mp3Info.new(TEMP_FILE)
|
600
|
-
assert(info.encoder == "Lame 3.93")
|
601
|
-
end
|
602
|
-
|
603
|
-
def test_vbr
|
604
|
-
mp3_vbr = Base64.decode64 <<EOF
|
605
|
-
|
606
|
-
EOF
|
607
|
-
File.open(TEMP_FILE, "w") { |f| f.write(mp3_vbr) }
|
608
|
-
info = Mp3Info.new(TEMP_FILE)
|
609
|
-
assert_equal(info.vbr, true)
|
610
|
-
assert_equal(info.bitrate, 128)
|
611
|
-
end
|
612
|
-
=end
|
613
591
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-mp3info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillaume Pierronnet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: hoe
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '3.
|
33
|
+
version: '3.12'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '3.
|
40
|
+
version: '3.12'
|
41
41
|
description: ruby-mp3info read low-level informations and manipulate tags on mp3 files.
|
42
42
|
email:
|
43
43
|
- guillaume.pierronnet@gmail.com
|
@@ -48,6 +48,7 @@ extra_rdoc_files:
|
|
48
48
|
- Manifest.txt
|
49
49
|
- README.md
|
50
50
|
files:
|
51
|
+
- ".gemtest"
|
51
52
|
- History.txt
|
52
53
|
- Manifest.txt
|
53
54
|
- README.md
|
@@ -55,32 +56,31 @@ files:
|
|
55
56
|
- lib/mp3info.rb
|
56
57
|
- lib/mp3info/extension_modules.rb
|
57
58
|
- lib/mp3info/id3v2.rb
|
58
|
-
- test/test_ruby-mp3info.rb
|
59
59
|
- test/fixtures.yml
|
60
|
-
- .
|
60
|
+
- test/test_ruby-mp3info.rb
|
61
61
|
homepage: http://github.com/moumar/ruby-mp3info
|
62
62
|
licenses:
|
63
63
|
- MIT
|
64
64
|
metadata: {}
|
65
65
|
post_install_message:
|
66
66
|
rdoc_options:
|
67
|
-
- --main
|
67
|
+
- "--main"
|
68
68
|
- README.md
|
69
69
|
require_paths:
|
70
70
|
- lib
|
71
71
|
required_ruby_version: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
|
-
- -
|
78
|
+
- - ">="
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: '0'
|
81
81
|
requirements: []
|
82
|
-
rubyforge_project:
|
83
|
-
rubygems_version: 2.
|
82
|
+
rubyforge_project:
|
83
|
+
rubygems_version: 2.2.2
|
84
84
|
signing_key:
|
85
85
|
specification_version: 4
|
86
86
|
summary: ruby-mp3info read low-level informations and manipulate tags on mp3 files.
|