ruby-mp3info 0.6.10 → 0.6.11
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/README.txt +1 -0
- data/lib/mp3info.rb +6 -6
- data/lib/mp3info/id3v2.rb +23 -26
- metadata +3 -3
data/History.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
=== 0.6.11 / 2009-01-27
|
2
|
+
|
3
|
+
* the library doesn't raise an ID3v2Error anymore when a id3v2 tag size is incorrect, but just output
|
4
|
+
a warning. (Fixes bug #23619)
|
5
|
+
|
1
6
|
=== 0.6.10 / 2008-11-27
|
2
7
|
|
3
8
|
* processing of tags (read and write) can be disabled with :parse_tags => false
|
data/README.txt
CHANGED
data/lib/mp3info.rb
CHANGED
@@ -18,7 +18,7 @@ end
|
|
18
18
|
|
19
19
|
class Mp3Info
|
20
20
|
|
21
|
-
VERSION = "0.6.
|
21
|
+
VERSION = "0.6.11"
|
22
22
|
|
23
23
|
LAYER = [ nil, 3, 2, 1]
|
24
24
|
BITRATE = {
|
@@ -305,7 +305,7 @@ class Mp3Info
|
|
305
305
|
@vbr = true
|
306
306
|
else
|
307
307
|
# for cbr, calculate duration with the given bitrate
|
308
|
-
stream_size = @file.stat.size - (hastag1? ? TAG1_SIZE : 0) - (@tag2.
|
308
|
+
stream_size = @file.stat.size - (hastag1? ? TAG1_SIZE : 0) - (@tag2.io_position || 0)
|
309
309
|
@length = ((stream_size << 3)/1000.0)/@bitrate
|
310
310
|
# read the first 100 frames and decide if the mp3 is vbr and needs full scan
|
311
311
|
begin
|
@@ -386,7 +386,7 @@ class Mp3Info
|
|
386
386
|
|
387
387
|
# Does the file has an id3v1 or v2 tag?
|
388
388
|
def hastag?
|
389
|
-
hastag1?
|
389
|
+
hastag1? || hastag2?
|
390
390
|
end
|
391
391
|
|
392
392
|
# Does the file has an id3v1 tag?
|
@@ -396,7 +396,7 @@ class Mp3Info
|
|
396
396
|
|
397
397
|
# Does the file has an id3v2 tag?
|
398
398
|
def hastag2?
|
399
|
-
@tag2.
|
399
|
+
@tag2.parsed?
|
400
400
|
end
|
401
401
|
|
402
402
|
# write to another filename at close()
|
@@ -482,7 +482,7 @@ class Mp3Info
|
|
482
482
|
tempfile_name = nil
|
483
483
|
File.open(@filename, 'rb+') do |file|
|
484
484
|
#if tag2 already exists, seek to end of it
|
485
|
-
if @tag2.
|
485
|
+
if @tag2.parsed?
|
486
486
|
file.seek(@tag2.io_position)
|
487
487
|
end
|
488
488
|
# if @file.read(3) == "ID3"
|
@@ -543,7 +543,7 @@ private
|
|
543
543
|
unless @tag1_parsed # v1 tag at end
|
544
544
|
# this preserves the file pos if tag2 found, since gettag2 leaves
|
545
545
|
# the file at the best guess as to the first MPEG frame
|
546
|
-
pos = (@tag2.
|
546
|
+
pos = (@tag2.io_position || 0)
|
547
547
|
# seek to where id3v1 tag should be
|
548
548
|
@file.seek(-TAG1_SIZE, IO::SEEK_END)
|
549
549
|
if @file.read(3) == "TAG"
|
data/lib/mp3info/id3v2.rb
CHANGED
@@ -123,13 +123,13 @@ class ID3v2 < DelegateClass(Hash)
|
|
123
123
|
#TAGS.keys.each { |k| @hash[k] = nil }
|
124
124
|
@hash_orig = {}
|
125
125
|
super(@hash)
|
126
|
-
@
|
126
|
+
@parsed = false
|
127
127
|
@version_maj = @version_min = nil
|
128
128
|
end
|
129
129
|
|
130
130
|
# does this tag has been correctly read ?
|
131
|
-
def
|
132
|
-
@
|
131
|
+
def parsed?
|
132
|
+
@parsed
|
133
133
|
end
|
134
134
|
|
135
135
|
# does this tag has been changed ?
|
@@ -140,7 +140,7 @@ class ID3v2 < DelegateClass(Hash)
|
|
140
140
|
# full version of this tag (like "2.3.0") or nil
|
141
141
|
# if tag was not correctly read
|
142
142
|
def version
|
143
|
-
if
|
143
|
+
if @version_maj && @version_min
|
144
144
|
"2.#{@version_maj}.#{@version_min}"
|
145
145
|
else
|
146
146
|
nil
|
@@ -156,29 +156,26 @@ class ID3v2 < DelegateClass(Hash)
|
|
156
156
|
@unsync, ext_header, experimental, footer = (0..3).collect { |i| flags[i].chr == '1' }
|
157
157
|
raise(ID3v2Error, "can't find version_maj ('#{version_maj}')") unless [2, 3, 4].include?(version_maj)
|
158
158
|
@version_maj, @version_min = version_maj, version_min
|
159
|
-
@valid = true
|
160
159
|
@tag_length = @io.get_syncsafe
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
160
|
+
@io_position = original_pos + @tag_length
|
161
|
+
|
162
|
+
@parsed = true
|
163
|
+
begin
|
164
|
+
case @version_maj
|
165
|
+
when 2
|
166
|
+
read_id3v2_2_frames
|
167
|
+
when 3, 4
|
168
|
+
# seek past extended header if present
|
169
|
+
@io.seek(@io.get_syncsafe - 4, IO::SEEK_CUR) if ext_header
|
170
|
+
read_id3v2_3_frames
|
171
|
+
end
|
172
|
+
rescue ID3v2Error => e
|
173
|
+
warn("warning: id3v2 tag not fully parsed: #{e.message}")
|
168
174
|
end
|
169
175
|
|
170
|
-
@io.seek(original_pos + @tag_length, IO::SEEK_SET)
|
171
|
-
|
172
|
-
# skip padding zeros at the end of the tag
|
173
|
-
while @io.getbyte == 0; end
|
174
|
-
|
175
|
-
@io.seek(-1, IO::SEEK_CUR)
|
176
|
-
@io_position = @io.pos
|
177
|
-
|
178
176
|
@hash_orig = @hash.dup
|
179
177
|
#no more reading
|
180
178
|
@io = nil
|
181
|
-
# we should now have io sitting at the first MPEG frame
|
182
179
|
end
|
183
180
|
|
184
181
|
# dump tag for writing. Version is always 2.#{WRITE_VERSION}.0.
|
@@ -264,13 +261,13 @@ class ID3v2 < DelegateClass(Hash)
|
|
264
261
|
begin
|
265
262
|
Iconv.iconv(@options[:encoding], TEXT_ENCODINGS[encoding], out).first
|
266
263
|
rescue Iconv::Failure
|
267
|
-
out
|
264
|
+
return out
|
268
265
|
end
|
269
266
|
else
|
270
|
-
out
|
267
|
+
return out
|
271
268
|
end
|
272
269
|
else
|
273
|
-
raw_value
|
270
|
+
return raw_value
|
274
271
|
end
|
275
272
|
end
|
276
273
|
|
@@ -321,13 +318,13 @@ class ID3v2 < DelegateClass(Hash)
|
|
321
318
|
puts "add_value_to_tag2" if $DEBUG
|
322
319
|
|
323
320
|
if size > 50_000_000
|
324
|
-
raise ID3v2Error, "tag size
|
321
|
+
raise ID3v2Error, "tag size is > 50_000_000"
|
325
322
|
end
|
326
323
|
|
327
324
|
data_io = @io.read(size)
|
328
325
|
data = decode_tag(name, data_io)
|
329
326
|
# remove padding zeros for textual tags
|
330
|
-
if name =~ /^T/
|
327
|
+
if data && name =~ /^T/
|
331
328
|
data.sub!(/\0*$/, '')
|
332
329
|
end
|
333
330
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-mp3info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillaume Pierronnet
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-01-27 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -65,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements: []
|
66
66
|
|
67
67
|
rubyforge_project: ruby-mp3info
|
68
|
-
rubygems_version: 1.
|
68
|
+
rubygems_version: 1.3.1
|
69
69
|
signing_key:
|
70
70
|
specification_version: 2
|
71
71
|
summary: ruby-mp3info is a pure-ruby library to retrieve low level informations on mp3 files and manipulate id3v1 and id3v2 tags
|