def from_io(io)
@io = io
original_pos = @io.pos
@io.extend(Mp3Info::Mp3FileMethods)
version_maj, version_min, flags = @io.read(3).unpack("CCB4")
@unsync, ext_header, experimental, footer = (0..3).collect { |i| flags[i].chr == '1' }
raise(ID3v2Error, "can't find version_maj ('#{version_maj}')") unless [2, 3, 4].include?(version_maj)
@version_maj, @version_min = version_maj, version_min
@tag_length = @io.get_syncsafe
@io_position = original_pos + @tag_length
@parsed = true
begin
case @version_maj
when 2
read_id3v2_2_frames
when 3, 4
@io.seek(@io.get_syncsafe - 4, IO::SEEK_CUR) if ext_header
read_id3v2_3_frames
end
rescue ID3v2Error => e
warn("warning: id3v2 tag not fully parsed: #{e.message}")
end
@hash_orig = @hash.dup
@io = nil
end