ruby-mp3info 0.8.4 → 0.8.5
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/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
|
+
[![Build Status](https://travis-ci.org/moumar/ruby-mp3info.png?branch=master)](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.
|